Loading Android.bp +21 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,7 @@ bootstrap_go_package { "android/proto.go", "android/register.go", "android/rule_builder.go", "android/sdk.go", "android/sh_binary.go", "android/singleton.go", "android/testing.go", Loading Loading @@ -475,6 +476,26 @@ bootstrap_go_package { pluginFor: ["soong_build"], } bootstrap_go_package { name: "soong-sdk", pkgPath: "android/soong/sdk", deps: [ "blueprint", "soong", "soong-android", "soong-apex", "soong-cc", "soong-java", ], srcs: [ "sdk/sdk.go", ], testSrcs: [ "sdk/sdk_test.go", ], pluginFor: ["soong_build"], } // // Defaults to enable various configurations of host bionic // Loading android/sdk.go 0 → 100644 +146 −0 Original line number Diff line number Diff line // Copyright (C) 2019 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package android import ( "strings" "github.com/google/blueprint/proptools" ) // SdkAware is the interface that must be supported by any module to become a member of SDK or to be // built with SDK type SdkAware interface { Module sdkBase() *SdkBase MakeMemberOf(sdk SdkRef) IsInAnySdk() bool ContainingSdk() SdkRef MemberName() string BuildWithSdks(sdks SdkRefs) RequiredSdks() SdkRefs } // SdkRef refers to a version of an SDK type SdkRef struct { Name string Version string } const ( // currentVersion refers to the in-development version of an SDK currentVersion = "current" ) // IsCurrentVersion determines if the SdkRef is referencing to an in-development version of an SDK func (s SdkRef) IsCurrentVersion() bool { return s.Version == currentVersion } // IsCurrentVersionOf determines if the SdkRef is referencing to an in-development version of the // specified SDK func (s SdkRef) IsCurrentVersionOf(name string) bool { return s.Name == name && s.IsCurrentVersion() } // ParseSdkRef parses a `name#version` style string into a corresponding SdkRef struct func ParseSdkRef(ctx BaseModuleContext, str string, property string) SdkRef { tokens := strings.Split(str, "#") if len(tokens) < 1 || len(tokens) > 2 { ctx.PropertyErrorf(property, "%q does not follow name#version syntax", str) return SdkRef{Name: "invalid sdk name", Version: "invalid sdk version"} } name := tokens[0] version := currentVersion // If version is omitted, defaults to "current" if len(tokens) == 2 { version = tokens[1] } return SdkRef{Name: name, Version: version} } type SdkRefs []SdkRef func (refs SdkRefs) Contains(s SdkRef) bool { for _, r := range refs { if r == s { return true } } return false } type sdkProperties struct { // The SDK that this module is a member of. nil if it is not a member of any SDK 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 Sdk_member_name *string } // SdkBase is a struct that is expected to be included in module types to implement the SdkAware // interface. InitSdkAwareModule should be called to initialize this struct. type SdkBase struct { properties sdkProperties } func (s *SdkBase) sdkBase() *SdkBase { return s } // MakeMemberof sets this module to be a member of a specific SDK func (s *SdkBase) MakeMemberOf(sdk SdkRef) { s.properties.ContainingSdk = &sdk } // IsInAnySdk returns true if this module is a member of any SDK func (s *SdkBase) IsInAnySdk() bool { return s.properties.ContainingSdk != nil } // ContainingSdk returns the SDK that this module is a member of func (s *SdkBase) ContainingSdk() SdkRef { if s.properties.ContainingSdk != nil { return *s.properties.ContainingSdk } return SdkRef{Name: "", Version: currentVersion} } // Membername returns the name of the module that this SDK member is overriding func (s *SdkBase) MemberName() string { 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 // SdkBase. func InitSdkAwareModule(m SdkAware) { base := m.sdkBase() m.AddProperties(&base.properties) } apex/apex.go +28 −8 Original line number Diff line number Diff line Loading @@ -185,7 +185,7 @@ func init() { pctx.HostBinToolVariable("zipalign", "zipalign") pctx.HostBinToolVariable("jsonmodify", "jsonmodify") android.RegisterModuleType("apex", apexBundleFactory) android.RegisterModuleType("apex", BundleFactory) android.RegisterModuleType("apex_test", testApexBundleFactory) android.RegisterModuleType("apex_vndk", vndkApexBundleFactory) android.RegisterModuleType("apex_defaults", defaultsFactory) Loading @@ -195,12 +195,14 @@ func init() { ctx.TopDown("apex_vndk_gather", apexVndkGatherMutator).Parallel() ctx.BottomUp("apex_vndk_add_deps", apexVndkAddDepsMutator).Parallel() }) android.PostDepsMutators(func(ctx android.RegisterMutatorsContext) { android.PostDepsMutators(RegisterPostDepsMutators) } func RegisterPostDepsMutators(ctx android.RegisterMutatorsContext) { ctx.TopDown("apex_deps", apexDepsMutator) ctx.BottomUp("apex", apexMutator).Parallel() ctx.BottomUp("apex_flattened", apexFlattenedMutator).Parallel() ctx.BottomUp("apex_uses", apexUsesMutator).Parallel() }) } var ( Loading Loading @@ -410,6 +412,12 @@ type apexBundleProperties struct { // To distinguish between flattened and non-flattened variants. // if set true, then this variant is flattened variant. Flattened bool `blueprint:"mutated"` // 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 } type apexTargetBundleProperties struct { Loading Loading @@ -536,6 +544,7 @@ type apexFile struct { type apexBundle struct { android.ModuleBase android.DefaultableModuleBase android.SdkBase properties apexBundleProperties targetProperties apexTargetBundleProperties Loading Loading @@ -738,6 +747,16 @@ func (a *apexBundle) DepsMutator(ctx android.BottomUpMutatorContext) { if cert != "" { ctx.AddDependency(ctx.Module(), certificateTag, cert) } // 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) } } func (a *apexBundle) getCertString(ctx android.BaseModuleContext) string { Loading Loading @@ -1707,6 +1726,7 @@ func newApexBundle() *apexBundle { }) android.InitAndroidMultiTargetsArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon) android.InitDefaultableModule(module) android.InitSdkAwareModule(module) return module } Loading @@ -1722,7 +1742,7 @@ func testApexBundleFactory() android.Module { return bundle } func apexBundleFactory() android.Module { func BundleFactory() android.Module { return newApexBundle() } Loading apex/apex_test.go +2 −2 Original line number Diff line number Diff line Loading @@ -95,10 +95,10 @@ func testApexContext(t *testing.T, bp string, handlers ...testCustomizer) (*andr config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER") ctx := android.NewTestArchContext() ctx.RegisterModuleType("apex", android.ModuleFactoryAdaptor(apexBundleFactory)) ctx.RegisterModuleType("apex", android.ModuleFactoryAdaptor(BundleFactory)) ctx.RegisterModuleType("apex_test", android.ModuleFactoryAdaptor(testApexBundleFactory)) ctx.RegisterModuleType("apex_vndk", android.ModuleFactoryAdaptor(vndkApexBundleFactory)) ctx.RegisterModuleType("apex_key", android.ModuleFactoryAdaptor(apexKeyFactory)) ctx.RegisterModuleType("apex_key", android.ModuleFactoryAdaptor(ApexKeyFactory)) ctx.RegisterModuleType("apex_defaults", android.ModuleFactoryAdaptor(defaultsFactory)) ctx.RegisterModuleType("prebuilt_apex", android.ModuleFactoryAdaptor(PrebuiltFactory)) Loading apex/key.go +2 −2 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ import ( var String = proptools.String func init() { android.RegisterModuleType("apex_key", apexKeyFactory) android.RegisterModuleType("apex_key", ApexKeyFactory) android.RegisterSingletonType("apex_keys_text", apexKeysTextFactory) } Loading @@ -53,7 +53,7 @@ type apexKeyProperties struct { Installable *bool } func apexKeyFactory() android.Module { func ApexKeyFactory() android.Module { module := &apexKey{} module.AddProperties(&module.properties) android.InitAndroidArchModule(module, android.HostAndDeviceDefault, android.MultilibCommon) Loading Loading
Android.bp +21 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,7 @@ bootstrap_go_package { "android/proto.go", "android/register.go", "android/rule_builder.go", "android/sdk.go", "android/sh_binary.go", "android/singleton.go", "android/testing.go", Loading Loading @@ -475,6 +476,26 @@ bootstrap_go_package { pluginFor: ["soong_build"], } bootstrap_go_package { name: "soong-sdk", pkgPath: "android/soong/sdk", deps: [ "blueprint", "soong", "soong-android", "soong-apex", "soong-cc", "soong-java", ], srcs: [ "sdk/sdk.go", ], testSrcs: [ "sdk/sdk_test.go", ], pluginFor: ["soong_build"], } // // Defaults to enable various configurations of host bionic // Loading
android/sdk.go 0 → 100644 +146 −0 Original line number Diff line number Diff line // Copyright (C) 2019 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package android import ( "strings" "github.com/google/blueprint/proptools" ) // SdkAware is the interface that must be supported by any module to become a member of SDK or to be // built with SDK type SdkAware interface { Module sdkBase() *SdkBase MakeMemberOf(sdk SdkRef) IsInAnySdk() bool ContainingSdk() SdkRef MemberName() string BuildWithSdks(sdks SdkRefs) RequiredSdks() SdkRefs } // SdkRef refers to a version of an SDK type SdkRef struct { Name string Version string } const ( // currentVersion refers to the in-development version of an SDK currentVersion = "current" ) // IsCurrentVersion determines if the SdkRef is referencing to an in-development version of an SDK func (s SdkRef) IsCurrentVersion() bool { return s.Version == currentVersion } // IsCurrentVersionOf determines if the SdkRef is referencing to an in-development version of the // specified SDK func (s SdkRef) IsCurrentVersionOf(name string) bool { return s.Name == name && s.IsCurrentVersion() } // ParseSdkRef parses a `name#version` style string into a corresponding SdkRef struct func ParseSdkRef(ctx BaseModuleContext, str string, property string) SdkRef { tokens := strings.Split(str, "#") if len(tokens) < 1 || len(tokens) > 2 { ctx.PropertyErrorf(property, "%q does not follow name#version syntax", str) return SdkRef{Name: "invalid sdk name", Version: "invalid sdk version"} } name := tokens[0] version := currentVersion // If version is omitted, defaults to "current" if len(tokens) == 2 { version = tokens[1] } return SdkRef{Name: name, Version: version} } type SdkRefs []SdkRef func (refs SdkRefs) Contains(s SdkRef) bool { for _, r := range refs { if r == s { return true } } return false } type sdkProperties struct { // The SDK that this module is a member of. nil if it is not a member of any SDK 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 Sdk_member_name *string } // SdkBase is a struct that is expected to be included in module types to implement the SdkAware // interface. InitSdkAwareModule should be called to initialize this struct. type SdkBase struct { properties sdkProperties } func (s *SdkBase) sdkBase() *SdkBase { return s } // MakeMemberof sets this module to be a member of a specific SDK func (s *SdkBase) MakeMemberOf(sdk SdkRef) { s.properties.ContainingSdk = &sdk } // IsInAnySdk returns true if this module is a member of any SDK func (s *SdkBase) IsInAnySdk() bool { return s.properties.ContainingSdk != nil } // ContainingSdk returns the SDK that this module is a member of func (s *SdkBase) ContainingSdk() SdkRef { if s.properties.ContainingSdk != nil { return *s.properties.ContainingSdk } return SdkRef{Name: "", Version: currentVersion} } // Membername returns the name of the module that this SDK member is overriding func (s *SdkBase) MemberName() string { 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 // SdkBase. func InitSdkAwareModule(m SdkAware) { base := m.sdkBase() m.AddProperties(&base.properties) }
apex/apex.go +28 −8 Original line number Diff line number Diff line Loading @@ -185,7 +185,7 @@ func init() { pctx.HostBinToolVariable("zipalign", "zipalign") pctx.HostBinToolVariable("jsonmodify", "jsonmodify") android.RegisterModuleType("apex", apexBundleFactory) android.RegisterModuleType("apex", BundleFactory) android.RegisterModuleType("apex_test", testApexBundleFactory) android.RegisterModuleType("apex_vndk", vndkApexBundleFactory) android.RegisterModuleType("apex_defaults", defaultsFactory) Loading @@ -195,12 +195,14 @@ func init() { ctx.TopDown("apex_vndk_gather", apexVndkGatherMutator).Parallel() ctx.BottomUp("apex_vndk_add_deps", apexVndkAddDepsMutator).Parallel() }) android.PostDepsMutators(func(ctx android.RegisterMutatorsContext) { android.PostDepsMutators(RegisterPostDepsMutators) } func RegisterPostDepsMutators(ctx android.RegisterMutatorsContext) { ctx.TopDown("apex_deps", apexDepsMutator) ctx.BottomUp("apex", apexMutator).Parallel() ctx.BottomUp("apex_flattened", apexFlattenedMutator).Parallel() ctx.BottomUp("apex_uses", apexUsesMutator).Parallel() }) } var ( Loading Loading @@ -410,6 +412,12 @@ type apexBundleProperties struct { // To distinguish between flattened and non-flattened variants. // if set true, then this variant is flattened variant. Flattened bool `blueprint:"mutated"` // 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 } type apexTargetBundleProperties struct { Loading Loading @@ -536,6 +544,7 @@ type apexFile struct { type apexBundle struct { android.ModuleBase android.DefaultableModuleBase android.SdkBase properties apexBundleProperties targetProperties apexTargetBundleProperties Loading Loading @@ -738,6 +747,16 @@ func (a *apexBundle) DepsMutator(ctx android.BottomUpMutatorContext) { if cert != "" { ctx.AddDependency(ctx.Module(), certificateTag, cert) } // 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) } } func (a *apexBundle) getCertString(ctx android.BaseModuleContext) string { Loading Loading @@ -1707,6 +1726,7 @@ func newApexBundle() *apexBundle { }) android.InitAndroidMultiTargetsArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon) android.InitDefaultableModule(module) android.InitSdkAwareModule(module) return module } Loading @@ -1722,7 +1742,7 @@ func testApexBundleFactory() android.Module { return bundle } func apexBundleFactory() android.Module { func BundleFactory() android.Module { return newApexBundle() } Loading
apex/apex_test.go +2 −2 Original line number Diff line number Diff line Loading @@ -95,10 +95,10 @@ func testApexContext(t *testing.T, bp string, handlers ...testCustomizer) (*andr config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER") ctx := android.NewTestArchContext() ctx.RegisterModuleType("apex", android.ModuleFactoryAdaptor(apexBundleFactory)) ctx.RegisterModuleType("apex", android.ModuleFactoryAdaptor(BundleFactory)) ctx.RegisterModuleType("apex_test", android.ModuleFactoryAdaptor(testApexBundleFactory)) ctx.RegisterModuleType("apex_vndk", android.ModuleFactoryAdaptor(vndkApexBundleFactory)) ctx.RegisterModuleType("apex_key", android.ModuleFactoryAdaptor(apexKeyFactory)) ctx.RegisterModuleType("apex_key", android.ModuleFactoryAdaptor(ApexKeyFactory)) ctx.RegisterModuleType("apex_defaults", android.ModuleFactoryAdaptor(defaultsFactory)) ctx.RegisterModuleType("prebuilt_apex", android.ModuleFactoryAdaptor(PrebuiltFactory)) Loading
apex/key.go +2 −2 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ import ( var String = proptools.String func init() { android.RegisterModuleType("apex_key", apexKeyFactory) android.RegisterModuleType("apex_key", ApexKeyFactory) android.RegisterSingletonType("apex_keys_text", apexKeysTextFactory) } Loading @@ -53,7 +53,7 @@ type apexKeyProperties struct { Installable *bool } func apexKeyFactory() android.Module { func ApexKeyFactory() android.Module { module := &apexKey{} module.AddProperties(&module.properties) android.InitAndroidArchModule(module, android.HostAndDeviceDefault, android.MultilibCommon) Loading