Remove unused uses_sdks property for apexes
(cherry picked from commit 7eed538208
)
Bug: 232546567
Test: m nothing & compare build.ninja before/after
Merged-In: I3f1199af338e1d2e48ec29cf9f59b6b36236c4cc
Change-Id: I3f1199af338e1d2e48ec29cf9f59b6b36236c4cc
This commit is contained in:
@@ -58,9 +58,6 @@ type ApexInfo struct {
|
|||||||
// to true.
|
// to true.
|
||||||
UsePlatformApis bool
|
UsePlatformApis bool
|
||||||
|
|
||||||
// The list of SDK modules that the containing apexBundle depends on.
|
|
||||||
RequiredSdks SdkRefs
|
|
||||||
|
|
||||||
// List of Apex variant names that this module is associated with. This initially is the
|
// List of Apex variant names that this module is associated with. This initially is the
|
||||||
// same as the `ApexVariationName` field. Then when multiple apex variants are merged in
|
// same as the `ApexVariationName` field. Then when multiple apex variants are merged in
|
||||||
// mergeApexVariations, ApexInfo struct of the merged variant holds the list of apexBundles
|
// mergeApexVariations, ApexInfo struct of the merged variant holds the list of apexBundles
|
||||||
@@ -110,9 +107,6 @@ func (i ApexInfo) AddJSONData(d *map[string]interface{}) {
|
|||||||
// thus wouldn't be merged.
|
// thus wouldn't be merged.
|
||||||
func (i ApexInfo) mergedName(ctx PathContext) string {
|
func (i ApexInfo) mergedName(ctx PathContext) string {
|
||||||
name := "apex" + strconv.Itoa(i.MinSdkVersion.FinalOrFutureInt())
|
name := "apex" + strconv.Itoa(i.MinSdkVersion.FinalOrFutureInt())
|
||||||
for _, sdk := range i.RequiredSdks {
|
|
||||||
name += "_" + sdk.Name + "_" + sdk.Version
|
|
||||||
}
|
|
||||||
return name
|
return name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -33,10 +33,10 @@ func Test_mergeApexVariations(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "single",
|
name: "single",
|
||||||
in: []ApexInfo{
|
in: []ApexInfo{
|
||||||
{"foo", FutureApiLevel, false, false, nil, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
{"foo", FutureApiLevel, false, false, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
||||||
},
|
},
|
||||||
wantMerged: []ApexInfo{
|
wantMerged: []ApexInfo{
|
||||||
{"apex10000", FutureApiLevel, false, false, nil, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
{"apex10000", FutureApiLevel, false, false, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
||||||
},
|
},
|
||||||
wantAliases: [][2]string{
|
wantAliases: [][2]string{
|
||||||
{"foo", "apex10000"},
|
{"foo", "apex10000"},
|
||||||
@@ -45,25 +45,25 @@ func Test_mergeApexVariations(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "merge",
|
name: "merge",
|
||||||
in: []ApexInfo{
|
in: []ApexInfo{
|
||||||
{"foo", FutureApiLevel, false, false, SdkRefs{{"baz", "1"}}, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
{"foo", FutureApiLevel, false, false, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
||||||
{"bar", FutureApiLevel, false, false, SdkRefs{{"baz", "1"}}, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex},
|
{"bar", FutureApiLevel, false, false, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex},
|
||||||
},
|
},
|
||||||
wantMerged: []ApexInfo{
|
wantMerged: []ApexInfo{
|
||||||
{"apex10000_baz_1", FutureApiLevel, false, false, SdkRefs{{"baz", "1"}}, []string{"bar", "foo"}, []string{"bar", "foo"}, nil, false}},
|
{"apex10000", FutureApiLevel, false, false, []string{"bar", "foo"}, []string{"bar", "foo"}, nil, false}},
|
||||||
wantAliases: [][2]string{
|
wantAliases: [][2]string{
|
||||||
{"bar", "apex10000_baz_1"},
|
{"bar", "apex10000"},
|
||||||
{"foo", "apex10000_baz_1"},
|
{"foo", "apex10000"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "don't merge version",
|
name: "don't merge version",
|
||||||
in: []ApexInfo{
|
in: []ApexInfo{
|
||||||
{"foo", FutureApiLevel, false, false, nil, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
{"foo", FutureApiLevel, false, false, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
||||||
{"bar", uncheckedFinalApiLevel(30), false, false, nil, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex},
|
{"bar", uncheckedFinalApiLevel(30), false, false, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex},
|
||||||
},
|
},
|
||||||
wantMerged: []ApexInfo{
|
wantMerged: []ApexInfo{
|
||||||
{"apex30", uncheckedFinalApiLevel(30), false, false, nil, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex},
|
{"apex30", uncheckedFinalApiLevel(30), false, false, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex},
|
||||||
{"apex10000", FutureApiLevel, false, false, nil, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
{"apex10000", FutureApiLevel, false, false, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
||||||
},
|
},
|
||||||
wantAliases: [][2]string{
|
wantAliases: [][2]string{
|
||||||
{"bar", "apex30"},
|
{"bar", "apex30"},
|
||||||
@@ -73,44 +73,29 @@ func Test_mergeApexVariations(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "merge updatable",
|
name: "merge updatable",
|
||||||
in: []ApexInfo{
|
in: []ApexInfo{
|
||||||
{"foo", FutureApiLevel, false, false, nil, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
{"foo", FutureApiLevel, false, false, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
||||||
{"bar", FutureApiLevel, true, false, nil, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex},
|
{"bar", FutureApiLevel, true, false, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex},
|
||||||
},
|
},
|
||||||
wantMerged: []ApexInfo{
|
wantMerged: []ApexInfo{
|
||||||
{"apex10000", FutureApiLevel, true, false, nil, []string{"bar", "foo"}, []string{"bar", "foo"}, nil, NotForPrebuiltApex},
|
{"apex10000", FutureApiLevel, true, false, []string{"bar", "foo"}, []string{"bar", "foo"}, nil, NotForPrebuiltApex},
|
||||||
},
|
},
|
||||||
wantAliases: [][2]string{
|
wantAliases: [][2]string{
|
||||||
{"bar", "apex10000"},
|
{"bar", "apex10000"},
|
||||||
{"foo", "apex10000"},
|
{"foo", "apex10000"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: "don't merge sdks",
|
|
||||||
in: []ApexInfo{
|
|
||||||
{"foo", FutureApiLevel, false, false, SdkRefs{{"baz", "1"}}, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
|
||||||
{"bar", FutureApiLevel, false, false, SdkRefs{{"baz", "2"}}, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex},
|
|
||||||
},
|
|
||||||
wantMerged: []ApexInfo{
|
|
||||||
{"apex10000_baz_2", FutureApiLevel, false, false, SdkRefs{{"baz", "2"}}, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex},
|
|
||||||
{"apex10000_baz_1", FutureApiLevel, false, false, SdkRefs{{"baz", "1"}}, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
|
||||||
},
|
|
||||||
wantAliases: [][2]string{
|
|
||||||
{"bar", "apex10000_baz_2"},
|
|
||||||
{"foo", "apex10000_baz_1"},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name: "don't merge when for prebuilt_apex",
|
name: "don't merge when for prebuilt_apex",
|
||||||
in: []ApexInfo{
|
in: []ApexInfo{
|
||||||
{"foo", FutureApiLevel, false, false, nil, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
{"foo", FutureApiLevel, false, false, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
||||||
{"bar", FutureApiLevel, true, false, nil, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex},
|
{"bar", FutureApiLevel, true, false, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex},
|
||||||
// This one should not be merged in with the others because it is for
|
// This one should not be merged in with the others because it is for
|
||||||
// a prebuilt_apex.
|
// a prebuilt_apex.
|
||||||
{"baz", FutureApiLevel, true, false, nil, []string{"baz"}, []string{"baz"}, nil, ForPrebuiltApex},
|
{"baz", FutureApiLevel, true, false, []string{"baz"}, []string{"baz"}, nil, ForPrebuiltApex},
|
||||||
},
|
},
|
||||||
wantMerged: []ApexInfo{
|
wantMerged: []ApexInfo{
|
||||||
{"apex10000", FutureApiLevel, true, false, nil, []string{"bar", "foo"}, []string{"bar", "foo"}, nil, NotForPrebuiltApex},
|
{"apex10000", FutureApiLevel, true, false, []string{"bar", "foo"}, []string{"bar", "foo"}, nil, NotForPrebuiltApex},
|
||||||
{"baz", FutureApiLevel, true, false, nil, []string{"baz"}, []string{"baz"}, nil, ForPrebuiltApex},
|
{"baz", FutureApiLevel, true, false, []string{"baz"}, []string{"baz"}, nil, ForPrebuiltApex},
|
||||||
},
|
},
|
||||||
wantAliases: [][2]string{
|
wantAliases: [][2]string{
|
||||||
{"bar", "apex10000"},
|
{"bar", "apex10000"},
|
||||||
@@ -120,11 +105,11 @@ func Test_mergeApexVariations(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "merge different UsePlatformApis but don't allow using platform api",
|
name: "merge different UsePlatformApis but don't allow using platform api",
|
||||||
in: []ApexInfo{
|
in: []ApexInfo{
|
||||||
{"foo", FutureApiLevel, false, false, nil, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
{"foo", FutureApiLevel, false, false, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
||||||
{"bar", FutureApiLevel, false, true, nil, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex},
|
{"bar", FutureApiLevel, false, true, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex},
|
||||||
},
|
},
|
||||||
wantMerged: []ApexInfo{
|
wantMerged: []ApexInfo{
|
||||||
{"apex10000", FutureApiLevel, false, false, nil, []string{"bar", "foo"}, []string{"bar", "foo"}, nil, NotForPrebuiltApex},
|
{"apex10000", FutureApiLevel, false, false, []string{"bar", "foo"}, []string{"bar", "foo"}, nil, NotForPrebuiltApex},
|
||||||
},
|
},
|
||||||
wantAliases: [][2]string{
|
wantAliases: [][2]string{
|
||||||
{"bar", "apex10000"},
|
{"bar", "apex10000"},
|
||||||
@@ -134,11 +119,11 @@ func Test_mergeApexVariations(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "merge same UsePlatformApis and allow using platform api",
|
name: "merge same UsePlatformApis and allow using platform api",
|
||||||
in: []ApexInfo{
|
in: []ApexInfo{
|
||||||
{"foo", FutureApiLevel, false, true, nil, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
{"foo", FutureApiLevel, false, true, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex},
|
||||||
{"bar", FutureApiLevel, false, true, nil, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex},
|
{"bar", FutureApiLevel, false, true, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex},
|
||||||
},
|
},
|
||||||
wantMerged: []ApexInfo{
|
wantMerged: []ApexInfo{
|
||||||
{"apex10000", FutureApiLevel, false, true, nil, []string{"bar", "foo"}, []string{"bar", "foo"}, nil, NotForPrebuiltApex},
|
{"apex10000", FutureApiLevel, false, true, []string{"bar", "foo"}, []string{"bar", "foo"}, nil, NotForPrebuiltApex},
|
||||||
},
|
},
|
||||||
wantAliases: [][2]string{
|
wantAliases: [][2]string{
|
||||||
{"bar", "apex10000"},
|
{"bar", "apex10000"},
|
||||||
|
@@ -23,24 +23,8 @@ import (
|
|||||||
"github.com/google/blueprint/proptools"
|
"github.com/google/blueprint/proptools"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RequiredSdks provides access to the set of SDKs required by an APEX and its contents.
|
|
||||||
//
|
|
||||||
// Extracted from SdkAware to make it easier to define custom subsets of the
|
|
||||||
// SdkAware interface and improve code navigation within the IDE.
|
|
||||||
//
|
|
||||||
// In addition to its use in SdkAware this interface must also be implemented by
|
|
||||||
// APEX to specify the SDKs required by that module and its contents. e.g. APEX
|
|
||||||
// is expected to implement RequiredSdks() by reading its own properties like
|
|
||||||
// `uses_sdks`.
|
|
||||||
type RequiredSdks interface {
|
|
||||||
// RequiredSdks returns the set of SDKs required by an APEX and its contents.
|
|
||||||
RequiredSdks() SdkRefs
|
|
||||||
}
|
|
||||||
|
|
||||||
// sdkAwareWithoutModule is provided simply to improve code navigation with the IDE.
|
// sdkAwareWithoutModule is provided simply to improve code navigation with the IDE.
|
||||||
type sdkAwareWithoutModule interface {
|
type sdkAwareWithoutModule interface {
|
||||||
RequiredSdks
|
|
||||||
|
|
||||||
// SdkMemberComponentName will return the name to use for a component of this module based on the
|
// SdkMemberComponentName will return the name to use for a component of this module based on the
|
||||||
// base name of this module.
|
// base name of this module.
|
||||||
//
|
//
|
||||||
@@ -81,7 +65,6 @@ type sdkAwareWithoutModule interface {
|
|||||||
|
|
||||||
ContainingSdk() SdkRef
|
ContainingSdk() SdkRef
|
||||||
MemberName() string
|
MemberName() string
|
||||||
BuildWithSdks(sdks SdkRefs)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SdkAware is the interface that must be supported by any module to become a member of SDK or to be
|
// SdkAware is the interface that must be supported by any module to become a member of SDK or to be
|
||||||
@@ -150,9 +133,6 @@ type sdkProperties struct {
|
|||||||
// The SDK that this module is a member of. nil if it is not a member of any SDK
|
// The SDK that this module is a member of. nil if it is not a member of any SDK
|
||||||
ContainingSdk *SdkRef `blueprint:"mutated"`
|
ContainingSdk *SdkRef `blueprint:"mutated"`
|
||||||
|
|
||||||
// The list of SDK names and versions that are used to build this module
|
|
||||||
RequiredSdks SdkRefs `blueprint:"mutated"`
|
|
||||||
|
|
||||||
// Name of the module that this sdk member is representing
|
// Name of the module that this sdk member is representing
|
||||||
Sdk_member_name *string
|
Sdk_member_name *string
|
||||||
}
|
}
|
||||||
@@ -208,16 +188,6 @@ func (s *SdkBase) MemberName() string {
|
|||||||
return proptools.String(s.properties.Sdk_member_name)
|
return proptools.String(s.properties.Sdk_member_name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// BuildWithSdks is used to mark that this module has to be built with the given SDK(s).
|
|
||||||
func (s *SdkBase) BuildWithSdks(sdks SdkRefs) {
|
|
||||||
s.properties.RequiredSdks = sdks
|
|
||||||
}
|
|
||||||
|
|
||||||
// RequiredSdks returns the SDK(s) that this module has to be built with
|
|
||||||
func (s *SdkBase) RequiredSdks() SdkRefs {
|
|
||||||
return s.properties.RequiredSdks
|
|
||||||
}
|
|
||||||
|
|
||||||
// InitSdkAwareModule initializes the SdkBase struct. This must be called by all modules including
|
// InitSdkAwareModule initializes the SdkBase struct. This must be called by all modules including
|
||||||
// SdkBase.
|
// SdkBase.
|
||||||
func InitSdkAwareModule(m SdkAware) {
|
func InitSdkAwareModule(m SdkAware) {
|
||||||
|
20
apex/apex.go
20
apex/apex.go
@@ -158,12 +158,6 @@ type apexBundleProperties struct {
|
|||||||
// or else conflicting build rules may be created.
|
// or else conflicting build rules may be created.
|
||||||
Multi_install_skip_symbol_files *bool
|
Multi_install_skip_symbol_files *bool
|
||||||
|
|
||||||
// List of SDKs that are used to build this APEX. A reference to an SDK should be either
|
|
||||||
// `name#version` or `name` which is an alias for `name#current`. If left empty,
|
|
||||||
// `platform#current` is implied. This value affects all modules included in this APEX. In
|
|
||||||
// other words, they are also built with the SDKs specified here.
|
|
||||||
Uses_sdks []string
|
|
||||||
|
|
||||||
// The type of APEX to build. Controls what the APEX payload is. Either 'image', 'zip' or
|
// The type of APEX to build. Controls what the APEX payload is. Either 'image', 'zip' or
|
||||||
// 'both'. When set to image, contents are stored in a filesystem image inside a zip
|
// 'both'. When set to image, contents are stored in a filesystem image inside a zip
|
||||||
// container. When set to zip, contents are stored in a zip container directly. This type is
|
// container. When set to zip, contents are stored in a zip container directly. This type is
|
||||||
@@ -789,19 +783,6 @@ func (a *apexBundle) DepsMutator(ctx android.BottomUpMutatorContext) {
|
|||||||
commonVariation := ctx.Config().AndroidCommonTarget.Variations()
|
commonVariation := ctx.Config().AndroidCommonTarget.Variations()
|
||||||
ctx.AddFarVariationDependencies(commonVariation, fsTag, a.properties.Filesystems...)
|
ctx.AddFarVariationDependencies(commonVariation, fsTag, a.properties.Filesystems...)
|
||||||
ctx.AddFarVariationDependencies(commonVariation, compatConfigTag, a.properties.Compat_configs...)
|
ctx.AddFarVariationDependencies(commonVariation, compatConfigTag, a.properties.Compat_configs...)
|
||||||
|
|
||||||
// Marks that this APEX (in fact all the modules in it) has to be built with the given SDKs.
|
|
||||||
// This field currently isn't used.
|
|
||||||
// TODO(jiyong): consider dropping this feature
|
|
||||||
// TODO(jiyong): ensure that all apexes are with non-empty uses_sdks
|
|
||||||
if len(a.properties.Uses_sdks) > 0 {
|
|
||||||
sdkRefs := []android.SdkRef{}
|
|
||||||
for _, str := range a.properties.Uses_sdks {
|
|
||||||
parsed := android.ParseSdkRef(ctx, str, "uses_sdks")
|
|
||||||
sdkRefs = append(sdkRefs, parsed)
|
|
||||||
}
|
|
||||||
a.BuildWithSdks(sdkRefs)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// DepsMutator for the overridden properties.
|
// DepsMutator for the overridden properties.
|
||||||
@@ -966,7 +947,6 @@ func (a *apexBundle) ApexInfoMutator(mctx android.TopDownMutatorContext) {
|
|||||||
apexInfo := android.ApexInfo{
|
apexInfo := android.ApexInfo{
|
||||||
ApexVariationName: apexVariationName,
|
ApexVariationName: apexVariationName,
|
||||||
MinSdkVersion: minSdkVersion,
|
MinSdkVersion: minSdkVersion,
|
||||||
RequiredSdks: a.RequiredSdks(),
|
|
||||||
Updatable: a.Updatable(),
|
Updatable: a.Updatable(),
|
||||||
UsePlatformApis: a.UsePlatformApis(),
|
UsePlatformApis: a.UsePlatformApis(),
|
||||||
InApexVariants: []string{apexVariationName},
|
InApexVariants: []string{apexVariationName},
|
||||||
|
@@ -193,114 +193,6 @@ sdk_snapshot {
|
|||||||
`))
|
`))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBasicSdkWithCc(t *testing.T) {
|
|
||||||
result := testSdkWithCc(t, `
|
|
||||||
sdk {
|
|
||||||
name: "mysdk",
|
|
||||||
native_shared_libs: ["sdkmember"],
|
|
||||||
}
|
|
||||||
|
|
||||||
cc_library_shared {
|
|
||||||
name: "sdkmember",
|
|
||||||
system_shared_libs: [],
|
|
||||||
stl: "none",
|
|
||||||
apex_available: ["mysdkapex"],
|
|
||||||
}
|
|
||||||
|
|
||||||
sdk_snapshot {
|
|
||||||
name: "mysdk@1",
|
|
||||||
native_shared_libs: ["sdkmember_mysdk@1"],
|
|
||||||
}
|
|
||||||
|
|
||||||
sdk_snapshot {
|
|
||||||
name: "mysdk@2",
|
|
||||||
native_shared_libs: ["sdkmember_mysdk@2"],
|
|
||||||
}
|
|
||||||
|
|
||||||
cc_prebuilt_library_shared {
|
|
||||||
name: "sdkmember",
|
|
||||||
srcs: ["libfoo.so"],
|
|
||||||
prefer: false,
|
|
||||||
system_shared_libs: [],
|
|
||||||
stl: "none",
|
|
||||||
}
|
|
||||||
|
|
||||||
cc_prebuilt_library_shared {
|
|
||||||
name: "sdkmember_mysdk@1",
|
|
||||||
sdk_member_name: "sdkmember",
|
|
||||||
srcs: ["libfoo.so"],
|
|
||||||
system_shared_libs: [],
|
|
||||||
stl: "none",
|
|
||||||
// TODO: remove //apex_available:platform
|
|
||||||
apex_available: [
|
|
||||||
"//apex_available:platform",
|
|
||||||
"myapex",
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
cc_prebuilt_library_shared {
|
|
||||||
name: "sdkmember_mysdk@2",
|
|
||||||
sdk_member_name: "sdkmember",
|
|
||||||
srcs: ["libfoo.so"],
|
|
||||||
system_shared_libs: [],
|
|
||||||
stl: "none",
|
|
||||||
// TODO: remove //apex_available:platform
|
|
||||||
apex_available: [
|
|
||||||
"//apex_available:platform",
|
|
||||||
"myapex2",
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
cc_library_shared {
|
|
||||||
name: "mycpplib",
|
|
||||||
srcs: ["Test.cpp"],
|
|
||||||
shared_libs: ["sdkmember"],
|
|
||||||
system_shared_libs: [],
|
|
||||||
stl: "none",
|
|
||||||
apex_available: [
|
|
||||||
"myapex",
|
|
||||||
"myapex2",
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
apex {
|
|
||||||
name: "myapex",
|
|
||||||
native_shared_libs: ["mycpplib"],
|
|
||||||
uses_sdks: ["mysdk@1"],
|
|
||||||
key: "myapex.key",
|
|
||||||
certificate: ":myapex.cert",
|
|
||||||
updatable: false,
|
|
||||||
}
|
|
||||||
|
|
||||||
apex {
|
|
||||||
name: "myapex2",
|
|
||||||
native_shared_libs: ["mycpplib"],
|
|
||||||
uses_sdks: ["mysdk@2"],
|
|
||||||
key: "myapex.key",
|
|
||||||
certificate: ":myapex.cert",
|
|
||||||
updatable: false,
|
|
||||||
}
|
|
||||||
|
|
||||||
apex {
|
|
||||||
name: "mysdkapex",
|
|
||||||
native_shared_libs: ["sdkmember"],
|
|
||||||
key: "myapex.key",
|
|
||||||
certificate: ":myapex.cert",
|
|
||||||
updatable: false,
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
sdkMemberV1 := result.ModuleForTests("sdkmember_mysdk@1", "android_arm64_armv8-a_shared_apex10000_mysdk_1").Rule("toc").Output
|
|
||||||
sdkMemberV2 := result.ModuleForTests("sdkmember_mysdk@2", "android_arm64_armv8-a_shared_apex10000_mysdk_2").Rule("toc").Output
|
|
||||||
|
|
||||||
cpplibForMyApex := result.ModuleForTests("mycpplib", "android_arm64_armv8-a_shared_apex10000_mysdk_1")
|
|
||||||
cpplibForMyApex2 := result.ModuleForTests("mycpplib", "android_arm64_armv8-a_shared_apex10000_mysdk_2")
|
|
||||||
|
|
||||||
// Depending on the uses_sdks value, different libs are linked
|
|
||||||
ensureListContains(t, pathsToStrings(cpplibForMyApex.Rule("ld").Implicits), sdkMemberV1.String())
|
|
||||||
ensureListContains(t, pathsToStrings(cpplibForMyApex2.Rule("ld").Implicits), sdkMemberV2.String())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure the sdk can use host specific cc libraries static/shared and both.
|
// Make sure the sdk can use host specific cc libraries static/shared and both.
|
||||||
func TestHostSdkWithCc(t *testing.T) {
|
func TestHostSdkWithCc(t *testing.T) {
|
||||||
testSdkWithCc(t, `
|
testSdkWithCc(t, `
|
||||||
@@ -2835,11 +2727,6 @@ func TestNoSanitizerMembers(t *testing.T) {
|
|||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
|
|
||||||
// Mixing the snapshot with the source (irrespective of which one is preferred) causes a problem
|
|
||||||
// due to missing variants.
|
|
||||||
// TODO(b/183204176): Remove this and fix the cause.
|
|
||||||
snapshotWithSourceErrorHandler := android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QReplaceDependencies could not find identical variant {os:android,image:,arch:arm64_armv8-a,sdk:,link:shared,version:} for module mynativelib\E`)
|
|
||||||
|
|
||||||
CheckSnapshot(t, result, "mysdk", "",
|
CheckSnapshot(t, result, "mysdk", "",
|
||||||
checkUnversionedAndroidBpContents(`
|
checkUnversionedAndroidBpContents(`
|
||||||
// This is auto-generated. DO NOT EDIT.
|
// This is auto-generated. DO NOT EDIT.
|
||||||
@@ -2866,7 +2753,5 @@ myinclude/Test.h -> include/myinclude/Test.h
|
|||||||
arm64/include/Arm64Test.h -> arm64/include/arm64/include/Arm64Test.h
|
arm64/include/Arm64Test.h -> arm64/include/arm64/include/Arm64Test.h
|
||||||
.intermediates/mynativelib/android_arm_armv7-a-neon_shared/mynativelib.so -> arm/lib/mynativelib.so
|
.intermediates/mynativelib/android_arm_armv7-a-neon_shared/mynativelib.so -> arm/lib/mynativelib.so
|
||||||
`),
|
`),
|
||||||
snapshotTestErrorHandler(checkSnapshotWithSourcePreferred, snapshotWithSourceErrorHandler),
|
|
||||||
snapshotTestErrorHandler(checkSnapshotPreferredWithSource, snapshotWithSourceErrorHandler),
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@@ -71,90 +71,6 @@ func TestSdkDependsOnSourceEvenWhenPrebuiltPreferred(t *testing.T) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBasicSdkWithJavaLibrary(t *testing.T) {
|
|
||||||
result := android.GroupFixturePreparers(
|
|
||||||
prepareForSdkTestWithJava,
|
|
||||||
prepareForSdkTestWithApex,
|
|
||||||
).RunTestWithBp(t, `
|
|
||||||
sdk {
|
|
||||||
name: "mysdk",
|
|
||||||
java_header_libs: ["sdkmember"],
|
|
||||||
}
|
|
||||||
|
|
||||||
sdk_snapshot {
|
|
||||||
name: "mysdk@1",
|
|
||||||
java_header_libs: ["sdkmember_mysdk@1"],
|
|
||||||
}
|
|
||||||
|
|
||||||
sdk_snapshot {
|
|
||||||
name: "mysdk@2",
|
|
||||||
java_header_libs: ["sdkmember_mysdk@2"],
|
|
||||||
}
|
|
||||||
|
|
||||||
java_library {
|
|
||||||
name: "sdkmember",
|
|
||||||
srcs: ["Test.java"],
|
|
||||||
system_modules: "none",
|
|
||||||
sdk_version: "none",
|
|
||||||
host_supported: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
java_import {
|
|
||||||
name: "sdkmember_mysdk@1",
|
|
||||||
sdk_member_name: "sdkmember",
|
|
||||||
host_supported: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
java_import {
|
|
||||||
name: "sdkmember_mysdk@2",
|
|
||||||
sdk_member_name: "sdkmember",
|
|
||||||
host_supported: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
java_library {
|
|
||||||
name: "myjavalib",
|
|
||||||
srcs: ["Test.java"],
|
|
||||||
libs: ["sdkmember"],
|
|
||||||
system_modules: "none",
|
|
||||||
sdk_version: "none",
|
|
||||||
compile_dex: true,
|
|
||||||
host_supported: true,
|
|
||||||
apex_available: [
|
|
||||||
"myapex",
|
|
||||||
"myapex2",
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
apex {
|
|
||||||
name: "myapex",
|
|
||||||
java_libs: ["myjavalib"],
|
|
||||||
uses_sdks: ["mysdk@1"],
|
|
||||||
key: "myapex.key",
|
|
||||||
certificate: ":myapex.cert",
|
|
||||||
updatable: false,
|
|
||||||
}
|
|
||||||
|
|
||||||
apex {
|
|
||||||
name: "myapex2",
|
|
||||||
java_libs: ["myjavalib"],
|
|
||||||
uses_sdks: ["mysdk@2"],
|
|
||||||
key: "myapex.key",
|
|
||||||
certificate: ":myapex.cert",
|
|
||||||
updatable: false,
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
sdkMemberV1 := result.ModuleForTests("sdkmember_mysdk@1", "android_common").Rule("combineJar").Output
|
|
||||||
sdkMemberV2 := result.ModuleForTests("sdkmember_mysdk@2", "android_common").Rule("combineJar").Output
|
|
||||||
|
|
||||||
javalibForMyApex := result.ModuleForTests("myjavalib", "android_common_apex10000_mysdk_1")
|
|
||||||
javalibForMyApex2 := result.ModuleForTests("myjavalib", "android_common_apex10000_mysdk_2")
|
|
||||||
|
|
||||||
// Depending on the uses_sdks value, different libs are linked
|
|
||||||
ensureListContains(t, pathsToStrings(javalibForMyApex.Rule("javac").Implicits), sdkMemberV1.String())
|
|
||||||
ensureListContains(t, pathsToStrings(javalibForMyApex2.Rule("javac").Implicits), sdkMemberV2.String())
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSnapshotWithJavaHeaderLibrary(t *testing.T) {
|
func TestSnapshotWithJavaHeaderLibrary(t *testing.T) {
|
||||||
result := android.GroupFixturePreparers(
|
result := android.GroupFixturePreparers(
|
||||||
prepareForSdkTestWithJava,
|
prepareForSdkTestWithJava,
|
||||||
|
114
sdk/sdk.go
114
sdk/sdk.go
@@ -39,7 +39,6 @@ func registerSdkBuildComponents(ctx android.RegistrationContext) {
|
|||||||
ctx.RegisterModuleType("sdk", SdkModuleFactory)
|
ctx.RegisterModuleType("sdk", SdkModuleFactory)
|
||||||
ctx.RegisterModuleType("sdk_snapshot", SnapshotModuleFactory)
|
ctx.RegisterModuleType("sdk_snapshot", SnapshotModuleFactory)
|
||||||
ctx.PreDepsMutators(RegisterPreDepsMutators)
|
ctx.PreDepsMutators(RegisterPreDepsMutators)
|
||||||
ctx.PostDepsMutators(RegisterPostDepsMutators)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type sdk struct {
|
type sdk struct {
|
||||||
@@ -278,20 +277,6 @@ func RegisterPreDepsMutators(ctx android.RegisterMutatorsContext) {
|
|||||||
ctx.BottomUp("SdkMemberInterVersion", memberInterVersionMutator).Parallel()
|
ctx.BottomUp("SdkMemberInterVersion", memberInterVersionMutator).Parallel()
|
||||||
}
|
}
|
||||||
|
|
||||||
// RegisterPostDepsMutators registers post-deps mutators to support modules implementing SdkAware
|
|
||||||
// interface and the sdk module type. This function has been made public to be called by tests
|
|
||||||
// outside of the sdk package
|
|
||||||
func RegisterPostDepsMutators(ctx android.RegisterMutatorsContext) {
|
|
||||||
// These must run AFTER apexMutator. Note that the apex package is imported even though there is
|
|
||||||
// no direct dependency to the package here. sdkDepsMutator sets the SDK requirements from an
|
|
||||||
// APEX to its dependents. Since different versions of the same SDK can be used by different
|
|
||||||
// APEXes, the apex and its dependents (which includes the dependencies to the sdk members)
|
|
||||||
// should have been mutated for the apex before the SDK requirements are set.
|
|
||||||
ctx.TopDown("SdkDepsMutator", sdkDepsMutator).Parallel()
|
|
||||||
ctx.BottomUp("SdkDepsReplaceMutator", sdkDepsReplaceMutator).Parallel()
|
|
||||||
ctx.TopDown("SdkRequirementCheck", sdkRequirementsMutator).Parallel()
|
|
||||||
}
|
|
||||||
|
|
||||||
type dependencyTag struct {
|
type dependencyTag struct {
|
||||||
blueprint.BaseDependencyTag
|
blueprint.BaseDependencyTag
|
||||||
}
|
}
|
||||||
@@ -413,103 +398,4 @@ func memberInterVersionMutator(mctx android.BottomUpMutatorContext) {
|
|||||||
type sdkAndApexModule interface {
|
type sdkAndApexModule interface {
|
||||||
android.Module
|
android.Module
|
||||||
android.DepIsInSameApex
|
android.DepIsInSameApex
|
||||||
android.RequiredSdks
|
|
||||||
}
|
|
||||||
|
|
||||||
// Step 4: transitively ripple down the SDK requirements from the root modules like APEX to its
|
|
||||||
// descendants
|
|
||||||
func sdkDepsMutator(mctx android.TopDownMutatorContext) {
|
|
||||||
if parent, ok := mctx.Module().(sdkAndApexModule); ok {
|
|
||||||
// Module types for Mainline modules (e.g. APEX) are expected to implement RequiredSdks()
|
|
||||||
// by reading its own properties like `uses_sdks`.
|
|
||||||
requiredSdks := parent.RequiredSdks()
|
|
||||||
if len(requiredSdks) > 0 {
|
|
||||||
mctx.VisitDirectDeps(func(m android.Module) {
|
|
||||||
// Only propagate required sdks from the apex onto its contents.
|
|
||||||
if dep, ok := m.(android.SdkAware); ok && android.IsDepInSameApex(mctx, parent, dep) {
|
|
||||||
dep.BuildWithSdks(requiredSdks)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Step 5: if libfoo.mysdk.11 is in the context where version 11 of mysdk is requested, the
|
|
||||||
// versioned module is used instead of the un-versioned (in-development) module libfoo
|
|
||||||
func sdkDepsReplaceMutator(mctx android.BottomUpMutatorContext) {
|
|
||||||
if versionedSdkMember, ok := mctx.Module().(android.SdkAware); ok && versionedSdkMember.IsInAnySdk() && versionedSdkMember.IsVersioned() {
|
|
||||||
if sdk := versionedSdkMember.ContainingSdk(); !sdk.Unversioned() {
|
|
||||||
// Only replace dependencies to <sdkmember> with <sdkmember@required-version>
|
|
||||||
// if the depending module requires it. e.g.
|
|
||||||
// foo -> sdkmember
|
|
||||||
// will be transformed to:
|
|
||||||
// foo -> sdkmember@1
|
|
||||||
// if and only if foo is a member of an APEX that requires version 1 of the
|
|
||||||
// sdk containing sdkmember.
|
|
||||||
memberName := versionedSdkMember.MemberName()
|
|
||||||
|
|
||||||
// Convert a panic into a normal error to allow it to be more easily tested for. This is a
|
|
||||||
// temporary workaround, once http://b/183204176 has been fixed this can be removed.
|
|
||||||
// TODO(b/183204176): Remove this after fixing.
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
mctx.ModuleErrorf("sdkDepsReplaceMutator %s", r)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Replace dependencies on sdkmember with a dependency on the current module which
|
|
||||||
// is a versioned prebuilt of the sdkmember if required.
|
|
||||||
mctx.ReplaceDependenciesIf(memberName, func(from blueprint.Module, tag blueprint.DependencyTag, to blueprint.Module) bool {
|
|
||||||
// from - foo
|
|
||||||
// to - sdkmember
|
|
||||||
replace := false
|
|
||||||
if parent, ok := from.(android.RequiredSdks); ok {
|
|
||||||
replace = parent.RequiredSdks().Contains(sdk)
|
|
||||||
}
|
|
||||||
return replace
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Step 6: ensure that the dependencies outside of the APEX are all from the required SDKs
|
|
||||||
func sdkRequirementsMutator(mctx android.TopDownMutatorContext) {
|
|
||||||
if m, ok := mctx.Module().(sdkAndApexModule); ok {
|
|
||||||
requiredSdks := m.RequiredSdks()
|
|
||||||
if len(requiredSdks) == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
mctx.VisitDirectDeps(func(dep android.Module) {
|
|
||||||
tag := mctx.OtherModuleDependencyTag(dep)
|
|
||||||
if tag == android.DefaultsDepTag {
|
|
||||||
// dependency to defaults is always okay
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ignore the dependency from the unversioned member to any versioned members as an
|
|
||||||
// apex that depends on the unversioned member will not also be depending on a versioned
|
|
||||||
// member.
|
|
||||||
if _, ok := tag.(sdkMemberVersionedDepTag); ok {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the dep is outside of the APEX, but is not in any of the required SDKs, we know that the
|
|
||||||
// dep is a violation.
|
|
||||||
if sa, ok := dep.(android.SdkAware); ok {
|
|
||||||
// It is not an error if a dependency that is excluded from the apex due to the tag is not
|
|
||||||
// in one of the required SDKs. That is because all of the existing tags that implement it
|
|
||||||
// do not depend on modules which can or should belong to an sdk_snapshot.
|
|
||||||
if _, ok := tag.(android.ExcludeFromApexContentsTag); ok {
|
|
||||||
// The tag defines a dependency that never requires the child module to be part of the
|
|
||||||
// same apex.
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if !m.DepIsInSameApex(mctx, dep) && !requiredSdks.Contains(sa.ContainingSdk()) {
|
|
||||||
mctx.ModuleErrorf("depends on %q (in SDK %q) that isn't part of the required SDKs: %v",
|
|
||||||
sa.Name(), sa.ContainingSdk(), requiredSdks)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -37,64 +37,6 @@ func TestMain(m *testing.M) {
|
|||||||
os.Exit(m.Run())
|
os.Exit(m.Run())
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDepNotInRequiredSdks(t *testing.T) {
|
|
||||||
testSdkError(t, `module "myjavalib".*depends on "otherlib".*that isn't part of the required SDKs:.*`, `
|
|
||||||
sdk {
|
|
||||||
name: "mysdk",
|
|
||||||
java_header_libs: ["sdkmember"],
|
|
||||||
}
|
|
||||||
|
|
||||||
sdk_snapshot {
|
|
||||||
name: "mysdk@1",
|
|
||||||
java_header_libs: ["sdkmember_mysdk_1"],
|
|
||||||
}
|
|
||||||
|
|
||||||
java_import {
|
|
||||||
name: "sdkmember",
|
|
||||||
prefer: false,
|
|
||||||
host_supported: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
java_import {
|
|
||||||
name: "sdkmember_mysdk_1",
|
|
||||||
sdk_member_name: "sdkmember",
|
|
||||||
host_supported: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
java_library {
|
|
||||||
name: "myjavalib",
|
|
||||||
srcs: ["Test.java"],
|
|
||||||
libs: [
|
|
||||||
"sdkmember",
|
|
||||||
"otherlib",
|
|
||||||
],
|
|
||||||
system_modules: "none",
|
|
||||||
sdk_version: "none",
|
|
||||||
compile_dex: true,
|
|
||||||
host_supported: true,
|
|
||||||
apex_available: ["myapex"],
|
|
||||||
}
|
|
||||||
|
|
||||||
// this lib is no in mysdk
|
|
||||||
java_library {
|
|
||||||
name: "otherlib",
|
|
||||||
srcs: ["Test.java"],
|
|
||||||
system_modules: "none",
|
|
||||||
sdk_version: "none",
|
|
||||||
compile_dex: true,
|
|
||||||
host_supported: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
apex {
|
|
||||||
name: "myapex",
|
|
||||||
java_libs: ["myjavalib"],
|
|
||||||
uses_sdks: ["mysdk@1"],
|
|
||||||
key: "myapex.key",
|
|
||||||
certificate: ":myapex.cert",
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure that prebuilt modules have the same effective visibility as the source
|
// Ensure that prebuilt modules have the same effective visibility as the source
|
||||||
// modules.
|
// modules.
|
||||||
func TestSnapshotVisibility(t *testing.T) {
|
func TestSnapshotVisibility(t *testing.T) {
|
||||||
|
Reference in New Issue
Block a user