diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2021-03-18 20:16:52 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2021-03-18 20:16:52 +0000 |
commit | 6a273de06a22f79d980e0a34bea92857f16fd2c1 (patch) | |
tree | d797e874486c1d1424b60879dc5090a3db88aea0 | |
parent | d7a98e55ea39295be709a9340198bd30edaf0406 (diff) | |
parent | 8f0436697cdc04147cd215ee545a85ecd9049d41 (diff) | |
download | soong-android11-mainline-cellbroadcast-release.tar.gz |
Snap for 7218917 from 8f0436697cdc04147cd215ee545a85ecd9049d41 to mainline-cellbroadcast-releaseandroid-mainline-11.0.0_r37android-mainline-11.0.0_r26android11-mainline-cellbroadcast-release
Change-Id: I93301940f181008534baaa52d47599d789d104ec
33 files changed, 2365 insertions, 669 deletions
@@ -4,6 +4,7 @@ per-file * = dwillemsen@google.com per-file * = eakammer@google.com per-file * = jungjw@google.com per-file * = patricearruda@google.com +per-file * = hansson@google.com per-file * = paulduffin@google.com per-file ndk_*.go, *gen_stub_libs.py = danalbert@google.com diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg index 928ca03c8..7c4d3e0b9 100644 --- a/PREUPLOAD.cfg +++ b/PREUPLOAD.cfg @@ -1,2 +1,5 @@ [Builtin Hooks] gofmt = true + +[Hook Scripts] +do_not_use_DO_NOT_MERGE = ${REPO_ROOT}/build/soong/scripts/check_do_not_merge.sh ${PREUPLOAD_COMMIT} diff --git a/android/Android.bp b/android/Android.bp index 9712c46e3..593399ebc 100644 --- a/android/Android.bp +++ b/android/Android.bp @@ -23,6 +23,9 @@ bootstrap_go_package { "filegroup.go", "hooks.go", "image.go", + "license.go", + "license_kind.go", + "licenses.go", "makevars.go", "module.go", "mutator.go", diff --git a/android/androidmk.go b/android/androidmk.go index ab193724f..5bcf1fe9e 100644 --- a/android/androidmk.go +++ b/android/androidmk.go @@ -21,6 +21,7 @@ import ( "io/ioutil" "os" "path/filepath" + "reflect" "sort" "strings" @@ -281,6 +282,17 @@ func (a *AndroidMkEntries) GetDistForGoals(mod blueprint.Module) []string { return ret } +// Write the license variables to Make for AndroidMkData.Custom(..) methods that do not call WriteAndroidMkData(..) +// It's required to propagate the license metadata even for module types that have non-standard interfaces to Make. +func (a *AndroidMkEntries) WriteLicenseVariables(w io.Writer) { + fmt.Fprintln(w, "LOCAL_LICENSE_KINDS :=", strings.Join(a.EntryMap["LOCAL_LICENSE_KINDS"], " ")) + fmt.Fprintln(w, "LOCAL_LICENSE_CONDITIONS :=", strings.Join(a.EntryMap["LOCAL_LICENSE_CONDITIONS"], " ")) + fmt.Fprintln(w, "LOCAL_NOTICE_FILE :=", strings.Join(a.EntryMap["LOCAL_NOTICE_FILE"], " ")) + if pn, ok := a.EntryMap["LOCAL_LICENSE_PACKAGE_NAME"]; ok { + fmt.Fprintln(w, "LOCAL_LICENSE_PACKAGE_NAME :=", strings.Join(pn, " ")) + } +} + func (a *AndroidMkEntries) fillInEntries(config Config, bpPath string, mod blueprint.Module) { a.EntryMap = make(map[string][]string) amod := mod.(Module).base() @@ -302,6 +314,13 @@ func (a *AndroidMkEntries) fillInEntries(config Config, bpPath string, mod bluep // Collect make variable assignment entries. a.SetString("LOCAL_PATH", filepath.Dir(bpPath)) a.SetString("LOCAL_MODULE", name+a.SubName) + a.AddStrings("LOCAL_LICENSE_KINDS", amod.commonProperties.Effective_license_kinds...) + a.AddStrings("LOCAL_LICENSE_CONDITIONS", amod.commonProperties.Effective_license_conditions...) + a.AddStrings("LOCAL_NOTICE_FILE", amod.commonProperties.Effective_license_text...) + // TODO(b/151177513): Does this code need to set LOCAL_MODULE_IS_CONTAINER ? + if amod.commonProperties.Effective_package_name != nil { + a.SetString("LOCAL_LICENSE_PACKAGE_NAME", *amod.commonProperties.Effective_package_name) + } a.SetString("LOCAL_MODULE_CLASS", a.Class) a.SetString("LOCAL_PREBUILT_MODULE_FILE", a.OutputFile.String()) a.AddStrings("LOCAL_REQUIRED_MODULES", a.Required...) @@ -512,6 +531,7 @@ func translateAndroidMkModule(ctx SingletonContext, w io.Writer, mod blueprint.M } }() + // Additional cases here require review for correct license propagation to make. switch x := mod.(type) { case AndroidMkDataProvider: return translateAndroidModule(ctx, w, mod, x) @@ -520,6 +540,7 @@ func translateAndroidMkModule(ctx SingletonContext, w io.Writer, mod blueprint.M case AndroidMkEntriesProvider: return translateAndroidMkEntriesModule(ctx, w, mod, x) default: + // Not exported to make so no make variables to set. return nil } } @@ -531,6 +552,10 @@ func translateGoBinaryModule(ctx SingletonContext, w io.Writer, mod blueprint.Mo fmt.Fprintln(w, ".PHONY:", name) fmt.Fprintln(w, name+":", goBinary.InstallPath()) fmt.Fprintln(w, "") + // Assuming no rules in make include go binaries in distributables. + // If the assumption is wrong, make will fail to build without the necessary .meta_lic and .meta_module files. + // In that case, add the targets and rules here to build a .meta_lic file for `name` and a .meta_module for + // `goBinary.InstallPath()` pointing to the `name`.meta_lic file. return nil } @@ -596,6 +621,25 @@ func translateAndroidModule(ctx SingletonContext, w io.Writer, mod blueprint.Mod blueprintDir := filepath.Dir(ctx.BlueprintFile(mod)) if data.Custom != nil { + // List of module types allowed to use .Custom(...) + // Additions to the list require careful review for proper license handling. + switch reflect.TypeOf(mod).String() { // ctx.ModuleType(mod) doesn't work: aidl_interface creates phony without type + case "*aidl.aidlApi": // writes non-custom before adding .phony + case "*aidl.aidlMapping": // writes non-custom before adding .phony + case "*android.customModule": // appears in tests only + case "*apex.apexBundle": // license properties written + case "*bpf.bpf": // license properties written (both for module and objs) + case "*genrule.Module": // writes non-custom before adding .phony + case "*java.SystemModules": // doesn't go through base_rules + case "*java.systemModulesImport": // doesn't go through base_rules + case "*phony.phony": // license properties written + case "*selinux.selinuxContextsModule": // license properties written + case "*sysprop.syspropLibrary": // license properties written + default: + if ctx.Config().IsEnvTrue("ANDROID_REQUIRE_LICENSES") { + return fmt.Errorf("custom make rules not allowed for %q (%q) module %q", ctx.ModuleType(mod), reflect.TypeOf(mod), ctx.ModuleName(mod)) + } + } data.Custom(w, name, prefix, blueprintDir, data) } else { WriteAndroidMkData(w, data) @@ -628,6 +672,7 @@ func translateAndroidMkEntriesModule(ctx SingletonContext, w io.Writer, mod blue return nil } + // Any new or special cases here need review to verify correct propagation of license information. for _, entries := range provider.AndroidMkEntries() { entries.fillInEntries(ctx.Config(), ctx.BlueprintFile(mod), mod) entries.write(w) diff --git a/android/apex.go b/android/apex.go index 8ec79ef7c..4c914ee65 100644 --- a/android/apex.go +++ b/android/apex.go @@ -442,6 +442,8 @@ func (d *ApexBundleDepsInfo) FullListPath() Path { // Generate two module out files: // 1. FullList with transitive deps and their parents in the dep graph // 2. FlatList with a flat list of transitive deps +// In both cases transitive deps of external deps are not included. Neither are deps that are only +// available to APEXes; they are developed with updatability in mind and don't need manual approval. func (d *ApexBundleDepsInfo) BuildDepsInfoLists(ctx ModuleContext, minSdkVersion string, depInfos DepNameToDepInfoMap) { var fullContent strings.Builder var flatContent strings.Builder diff --git a/android/defaults.go b/android/defaults.go index 8607c9707..880c68927 100644 --- a/android/defaults.go +++ b/android/defaults.go @@ -223,6 +223,9 @@ func InitDefaultsModule(module DefaultsModule) { // its checking phase and parsing phase so add it to the list as a normal property. AddVisibilityProperty(module, "visibility", &commonProperties.Visibility) + // The applicable licenses property for defaults is 'licenses'. + setPrimaryLicensesProperty(module, "licenses", &commonProperties.Licenses) + base.module = module } diff --git a/android/license.go b/android/license.go new file mode 100644 index 000000000..3bc6199b2 --- /dev/null +++ b/android/license.go @@ -0,0 +1,82 @@ +// Copyright 2020 Google Inc. All rights reserved. +// +// 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 ( + "github.com/google/blueprint" +) + +type licenseKindDependencyTag struct { + blueprint.BaseDependencyTag +} + +var ( + licenseKindTag = licenseKindDependencyTag{} +) + +func init() { + RegisterLicenseBuildComponents(InitRegistrationContext) +} + +// Register the license module type. +func RegisterLicenseBuildComponents(ctx RegistrationContext) { + ctx.RegisterModuleType("license", LicenseFactory) +} + +type licenseProperties struct { + // Specifies the kinds of license that apply. + License_kinds []string + // Specifies a short copyright notice to use for the license. + Copyright_notice *string + // Specifies the path or label for the text of the license. + License_text []string `android:"path"` + // Specifies the package name to which the license applies. + Package_name *string + // Specifies where this license can be used + Visibility []string +} + +type licenseModule struct { + ModuleBase + DefaultableModuleBase + + properties licenseProperties +} + +func (m *licenseModule) DepsMutator(ctx BottomUpMutatorContext) { + ctx.AddVariationDependencies(nil, licenseKindTag, m.properties.License_kinds...) +} + +func (m *licenseModule) GenerateAndroidBuildActions(ctx ModuleContext) { + // Nothing to do. +} + +func LicenseFactory() Module { + module := &licenseModule{} + + base := module.base() + module.AddProperties(&base.nameProperties, &module.properties) + + base.generalProperties = module.GetProperties() + base.customizableProperties = module.GetProperties() + + // The visibility property needs to be checked and parsed by the visibility module. + setPrimaryVisibilityProperty(module, "visibility", &module.properties.Visibility) + + initAndroidModuleBase(module) + InitDefaultableModule(module) + + return module +} diff --git a/android/license_kind.go b/android/license_kind.go new file mode 100644 index 000000000..ddecd775f --- /dev/null +++ b/android/license_kind.go @@ -0,0 +1,66 @@ +// Copyright 2020 Google Inc. All rights reserved. +// +// 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 + +func init() { + RegisterLicenseKindBuildComponents(InitRegistrationContext) +} + +// Register the license_kind module type. +func RegisterLicenseKindBuildComponents(ctx RegistrationContext) { + ctx.RegisterModuleType("license_kind", LicenseKindFactory) +} + +type licenseKindProperties struct { + // Specifies the conditions for all licenses of the kind. + Conditions []string + // Specifies the url to the canonical license definition. + Url string + // Specifies where this license can be used + Visibility []string +} + +type licenseKindModule struct { + ModuleBase + DefaultableModuleBase + + properties licenseKindProperties +} + +func (m *licenseKindModule) DepsMutator(ctx BottomUpMutatorContext) { + // Nothing to do. +} + +func (m *licenseKindModule) GenerateAndroidBuildActions(ModuleContext) { + // Nothing to do. +} + +func LicenseKindFactory() Module { + module := &licenseKindModule{} + + base := module.base() + module.AddProperties(&base.nameProperties, &module.properties) + + base.generalProperties = module.GetProperties() + base.customizableProperties = module.GetProperties() + + // The visibility property needs to be checked and parsed by the visibility module. + setPrimaryVisibilityProperty(module, "visibility", &module.properties.Visibility) + + initAndroidModuleBase(module) + InitDefaultableModule(module) + + return module +} diff --git a/android/licenses.go b/android/licenses.go new file mode 100644 index 000000000..2838f5d28 --- /dev/null +++ b/android/licenses.go @@ -0,0 +1,295 @@ +// Copyright 2020 Google Inc. All rights reserved. +// +// 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 ( + "reflect" + "sync" + + "github.com/google/blueprint" +) + +// Adds cross-cutting licenses dependency to propagate license metadata through the build system. +// +// Stage 1 - bottom-up records package-level default_applicable_licenses property mapped by package name. +// Stage 2 - bottom-up converts licenses property or package default_applicable_licenses to dependencies. +// Stage 3 - bottom-up type-checks every added applicable license dependency and license_kind dependency. +// Stage 4 - GenerateBuildActions calculates properties for the union of license kinds, conditions and texts. + +type licensesDependencyTag struct { + blueprint.BaseDependencyTag +} + +var ( + licensesTag = licensesDependencyTag{} +) + +// Describes the property provided by a module to reference applicable licenses. +type applicableLicensesProperty interface { + // The name of the property. e.g. default_applicable_licenses or licenses + getName() string + // The values assigned to the property. (Must reference license modules.) + getStrings() []string +} + +type applicableLicensesPropertyImpl struct { + name string + licensesProperty *[]string +} + +func newApplicableLicensesProperty(name string, licensesProperty *[]string) applicableLicensesProperty { + return applicableLicensesPropertyImpl{ + name: name, + licensesProperty: licensesProperty, + } +} + +func (p applicableLicensesPropertyImpl) getName() string { + return p.name +} + +func (p applicableLicensesPropertyImpl) getStrings() []string { + return *p.licensesProperty +} + +// Set the primary applicable licenses property for a module. +func setPrimaryLicensesProperty(module Module, name string, licensesProperty *[]string) { + module.base().primaryLicensesProperty = newApplicableLicensesProperty(name, licensesProperty) +} + +// Storage blob for a package's default_applicable_licenses mapped by package directory. +type licensesContainer struct { + licenses []string +} + +func (r licensesContainer) getLicenses() []string { + return r.licenses +} + +var packageDefaultLicensesMap = NewOnceKey("packageDefaultLicensesMap") + +// The map from package dir name to default applicable licenses as a licensesContainer. +func moduleToPackageDefaultLicensesMap(config Config) *sync.Map { + return config.Once(packageDefaultLicensesMap, func() interface{} { + return &sync.Map{} + }).(*sync.Map) +} + +// Registers the function that maps each package to its default_applicable_licenses. +// +// This goes before defaults expansion so the defaults can pick up the package default. +func RegisterLicensesPackageMapper(ctx RegisterMutatorsContext) { + ctx.BottomUp("licensesPackageMapper", licensesPackageMapper).Parallel() +} + +// Registers the function that gathers the license dependencies for each module. +// +// This goes after defaults expansion so that it can pick up default licenses and before visibility enforcement. +func RegisterLicensesPropertyGatherer(ctx RegisterMutatorsContext) { + ctx.BottomUp("licensesPropertyGatherer", licensesPropertyGatherer).Parallel() +} + +// Registers the function that verifies the licenses and license_kinds dependency types for each module. +func RegisterLicensesDependencyChecker(ctx RegisterMutatorsContext) { + ctx.BottomUp("licensesPropertyChecker", licensesDependencyChecker).Parallel() +} + +// Maps each package to its default applicable licenses. +func licensesPackageMapper(ctx BottomUpMutatorContext) { + p, ok := ctx.Module().(*packageModule) + if !ok { + return + } + + licenses := getLicenses(ctx, p) + + dir := ctx.ModuleDir() + c := makeLicensesContainer(licenses) + moduleToPackageDefaultLicensesMap(ctx.Config()).Store(dir, c) +} + +// Copies the default_applicable_licenses property values for mapping by package directory. +func makeLicensesContainer(propVals []string) licensesContainer { + licenses := make([]string, 0, len(propVals)) + licenses = append(licenses, propVals...) + + return licensesContainer{licenses} +} + +// Gathers the applicable licenses into dependency references after defaults expansion. +func licensesPropertyGatherer(ctx BottomUpMutatorContext) { + m, ok := ctx.Module().(Module) + if !ok { + return + } + + if exemptFromRequiredApplicableLicensesProperty(m) { + return + } + + licenses := getLicenses(ctx, m) + + ctx.AddVariationDependencies(nil, licensesTag, licenses...) +} + +// Verifies the license and license_kind dependencies are each the correct kind of module. +func licensesDependencyChecker(ctx BottomUpMutatorContext) { + m, ok := ctx.Module().(Module) + if !ok { + return + } + + // license modules have no licenses, but license_kinds must refer to license_kind modules + if _, ok := m.(*licenseModule); ok { + for _, module := range ctx.GetDirectDepsWithTag(licenseKindTag) { + if _, ok := module.(*licenseKindModule); !ok { + ctx.ModuleErrorf("license_kinds property %q is not a license_kind module", ctx.OtherModuleName(module)) + } + } + return + } + + if exemptFromRequiredApplicableLicensesProperty(m) { + return + } + + for _, module := range ctx.GetDirectDepsWithTag(licensesTag) { + if _, ok := module.(*licenseModule); !ok { + propertyName := "licenses" + primaryProperty := m.base().primaryLicensesProperty + if primaryProperty != nil { + propertyName = primaryProperty.getName() + } + ctx.ModuleErrorf("%s property %q is not a license module", propertyName, ctx.OtherModuleName(module)) + } + } +} + +// Flattens license and license_kind dependencies into calculated properties. +// +// Re-validates applicable licenses properties refer only to license modules and license_kinds properties refer +// only to license_kind modules. +func licensesPropertyFlattener(ctx ModuleContext) { + m, ok := ctx.Module().(Module) + if !ok { + return + } + + // license modules have no licenses, but license_kinds must refer to license_kind modules + if l, ok := m.(*licenseModule); ok { + mergeProps(&m.base().commonProperties.Effective_licenses, ctx.ModuleName()) + mergeProps(&m.base().commonProperties.Effective_license_text, PathsForModuleSrc(ctx, l.properties.License_text).Strings()...) + for _, module := range ctx.GetDirectDepsWithTag(licenseKindTag) { + if lk, ok := module.(*licenseKindModule); ok { + mergeProps(&m.base().commonProperties.Effective_license_conditions, lk.properties.Conditions...) + mergeProps(&m.base().commonProperties.Effective_license_kinds, ctx.OtherModuleName(module)) + } else { + ctx.ModuleErrorf("license_kinds property %q is not a license_kind module", ctx.OtherModuleName(module)) + } + } + return + } + + if exemptFromRequiredApplicableLicensesProperty(m) { + return + } + + for _, module := range ctx.GetDirectDepsWithTag(licensesTag) { + if l, ok := module.(*licenseModule); ok { + if m.base().commonProperties.Effective_package_name == nil && l.properties.Package_name != nil { + m.base().commonProperties.Effective_package_name = l.properties.Package_name + } + mergeProps(&m.base().commonProperties.Effective_licenses, module.base().commonProperties.Effective_licenses...) + mergeProps(&m.base().commonProperties.Effective_license_text, module.base().commonProperties.Effective_license_text...) + mergeProps(&m.base().commonProperties.Effective_license_kinds, module.base().commonProperties.Effective_license_kinds...) + mergeProps(&m.base().commonProperties.Effective_license_conditions, module.base().commonProperties.Effective_license_conditions...) + } else { + propertyName := "licenses" + primaryProperty := m.base().primaryLicensesProperty + if primaryProperty != nil { + propertyName = primaryProperty.getName() + } + ctx.ModuleErrorf("%s property %q is not a license module", propertyName, ctx.OtherModuleName(module)) + } + } +} + +// Update a property string array with a distinct union of its values and a list of new values. +func mergeProps(prop *[]string, values ...string) { + s := make(map[string]bool) + for _, v := range *prop { + s[v] = true + } + for _, v := range values { + s[v] = true + } + *prop = []string{} + *prop = append(*prop, SortedStringKeys(s)...) +} + +// Get the licenses property falling back to the package default. +func getLicenses(ctx BaseModuleContext, module Module) []string { + if exemptFromRequiredApplicableLicensesProperty(module) { + return nil + } + + primaryProperty := module.base().primaryLicensesProperty + if primaryProperty == nil { + if ctx.Config().IsEnvTrue("ANDROID_REQUIRE_LICENSES") { + ctx.ModuleErrorf("module type %q must have an applicable licenses property", ctx.OtherModuleType(module)) + } + return nil + } + + licenses := primaryProperty.getStrings() + if len(licenses) > 0 { + s := make(map[string]bool) + for _, l := range licenses { + if _, ok := s[l]; ok { + ctx.ModuleErrorf("duplicate %q %s", l, primaryProperty.getName()) + } + s[l] = true + } + return licenses + } + + dir := ctx.OtherModuleDir(module) + + moduleToApplicableLicenses := moduleToPackageDefaultLicensesMap(ctx.Config()) + value, ok := moduleToApplicableLicenses.Load(dir) + var c licensesContainer + if ok { + c = value.(licensesContainer) + } else { + c = licensesContainer{} + } + return c.getLicenses() +} + +// Returns whether a module is an allowed list of modules that do not have or need applicable licenses. +func exemptFromRequiredApplicableLicensesProperty(module Module) bool { + switch reflect.TypeOf(module).String() { + case "*android.licenseModule": // is a license, doesn't need one + case "*android.licenseKindModule": // is a license, doesn't need one + case "*android.NamespaceModule": // just partitions things, doesn't add anything + case "*android.soongConfigModuleTypeModule": // creates aliases for modules with licenses + case "*android.soongConfigModuleTypeImport": // creates aliases for modules with licenses + case "*android.soongConfigStringVariableDummyModule": // used for creating aliases + case "*android.SoongConfigBoolVariableDummyModule": // used for creating aliases + default: + return false + } + return true +} diff --git a/android/module.go b/android/module.go index 4a11e5221..6b00d7982 100644 --- a/android/module.go +++ b/android/module.go @@ -385,6 +385,20 @@ type commonProperties struct { // more details. Visibility []string + // Describes the licenses applicable to this module. Must reference license modules. + Licenses []string + + // Flattened from direct license dependencies. Equal to Licenses unless particular module adds more. + Effective_licenses []string `blueprint:"mutated"` + // Override of module name when reporting licenses + Effective_package_name *string `blueprint:"mutated"` + // Notice files + Effective_license_text []string `blueprint:"mutated"` + // License names + Effective_license_kinds []string `blueprint:"mutated"` + // License conditions + Effective_license_conditions []string `blueprint:"mutated"` + // control whether this module compiles for 32-bit, 64-bit, or both. Possible values // are "32" (compile for 32-bit only), "64" (compile for 64-bit only), "both" (compile for both // architectures), or "first" (compile for 64-bit on a 64-bit platform, and 32-bit on a 32-bit @@ -648,6 +662,10 @@ func InitAndroidModule(m Module) { // The default_visibility property needs to be checked and parsed by the visibility module during // its checking and parsing phases so make it the primary visibility property. setPrimaryVisibilityProperty(m, "visibility", &base.commonProperties.Visibility) + + // The default_applicable_licenses property needs to be checked and parsed by the licenses module during + // its checking and parsing phases so make it the primary licenses property. + setPrimaryLicensesProperty(m, "licenses", &base.commonProperties.Licenses) } func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) { @@ -743,6 +761,9 @@ type ModuleBase struct { // The primary visibility property, may be nil, that controls access to the module. primaryVisibilityProperty visibilityProperty + // The primary licenses property, may be nil, records license metadata for the module. + primaryLicensesProperty applicableLicensesProperty + noAddressSanitizer bool installFiles Paths checkbuildFiles Paths @@ -1344,11 +1365,16 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) notice := proptools.StringDefault(m.commonProperties.Notice, "NOTICE") if module := SrcIsModule(notice); module != "" { m.noticeFile = ctx.ExpandOptionalSource(¬ice, "notice") - } else { + } else if notice != "" { noticePath := filepath.Join(ctx.ModuleDir(), notice) m.noticeFile = ExistentPathForSource(ctx, noticePath) } + licensesPropertyFlattener(ctx) + if ctx.Failed() { + return + } + m.module.GenerateAndroidBuildActions(ctx) if ctx.Failed() { return @@ -1815,6 +1841,16 @@ func (m *moduleContext) FinalModule() Module { return m.bp.FinalModule().(Module) } +// IsMetaDependencyTag returns true for cross-cutting metadata dependencies. +func IsMetaDependencyTag(tag blueprint.DependencyTag) bool { + if tag == licenseKindTag { + return true + } else if tag == licensesTag { + return true + } + return false +} + func (m *moduleContext) ModuleSubDir() string { return m.bp.ModuleSubDir() } diff --git a/android/mutator.go b/android/mutator.go index 77d5f433e..49c6322fe 100644 --- a/android/mutator.go +++ b/android/mutator.go @@ -109,6 +109,11 @@ var preArch = []RegisterMutatorFunc{ // RegisterVisibilityRuleChecker, + // Record the default_applicable_licenses for each package. + // + // This must run before the defaults so that defaults modules can pick up the package default. + RegisterLicensesPackageMapper, + // Apply properties from defaults modules to the referencing modules. // // Any mutators that are added before this will not see any modules created by @@ -123,6 +128,12 @@ var preArch = []RegisterMutatorFunc{ // prebuilt. RegisterPrebuiltsPreArchMutators, + // Gather the licenses properties for all modules for use during expansion and enforcement. + // + // This must come after the defaults mutators to ensure that any licenses supplied + // in a defaults module has been successfully applied before the rules are gathered. + RegisterLicensesPropertyGatherer, + // Gather the visibility rules for all modules for us during visibility enforcement. // // This must come after the defaults mutators to ensure that any visibility supplied @@ -144,6 +155,7 @@ var postDeps = []RegisterMutatorFunc{ registerPathDepsMutator, RegisterPrebuiltsPostDepsMutators, RegisterVisibilityRuleEnforcer, + RegisterLicensesDependencyChecker, RegisterNeverallowMutator, RegisterOverridePostDepsMutators, } diff --git a/android/package.go b/android/package.go index 182b3ed6e..7012fc7d8 100644 --- a/android/package.go +++ b/android/package.go @@ -31,6 +31,8 @@ func RegisterPackageBuildComponents(ctx RegistrationContext) { type packageProperties struct { // Specifies the default visibility for all modules defined in this package. Default_visibility []string + // Specifies the default license terms for all modules defined in this package. + Default_applicable_licenses []string } type packageModule struct { @@ -68,5 +70,9 @@ func PackageFactory() Module { // its checking and parsing phases so make it the primary visibility property. setPrimaryVisibilityProperty(module, "default_visibility", &module.properties.Default_visibility) + // The default_applicable_licenses property needs to be checked and parsed by the licenses module during + // its checking and parsing phases so make it the primary licenses property. + setPrimaryLicensesProperty(module, "default_applicable_licenses", &module.properties.Default_applicable_licenses) + return module } diff --git a/android/package_test.go b/android/package_test.go index 04dfc08a9..9321ba826 100644 --- a/android/package_test.go +++ b/android/package_test.go @@ -17,9 +17,11 @@ var packageTests = []struct { package { name: "package", visibility: ["//visibility:private"], + licenses: ["license"], }`), }, expectedErrors: []string{ + `top/Blueprints:5:14: unrecognized property "licenses"`, `top/Blueprints:3:10: unrecognized property "name"`, `top/Blueprints:4:16: unrecognized property "visibility"`, }, @@ -44,9 +46,10 @@ var packageTests = []struct { "top/Blueprints": []byte(` package { default_visibility: ["//visibility:private"], + default_applicable_licenses: ["license"], } - package { + package { }`), }, expectedErrors: []string{ diff --git a/apex/OWNERS b/apex/OWNERS index 793f3ed19..8e4ba5cd5 100644 --- a/apex/OWNERS +++ b/apex/OWNERS @@ -1,4 +1 @@ per-file * = jiyong@google.com - -per-file allowed_deps.txt = set noparent -per-file allowed_deps.txt = dariofreni@google.com,hansson@google.com,harpin@google.com,jiyong@google.com,narayan@google.com,omakoto@google.com,jham@google.com diff --git a/apex/allowed_deps.txt b/apex/allowed_deps.txt deleted file mode 100644 index 5934bb0a2..000000000 --- a/apex/allowed_deps.txt +++ /dev/null @@ -1,598 +0,0 @@ -# A list of allowed dependencies for all updatable modules. -# -# The list tracks all direct and transitive dependencies that end up within any -# of the updatable binaries; specifically excluding external dependencies -# required to compile those binaries. This prevents potential regressions in -# case a new dependency is not aware of the different functional and -# non-functional requirements being part of an updatable module, for example -# setting correct min_sdk_version. -# -# To update the list, run: -# repo-root$ build/soong/scripts/update-apex-allowed-deps.sh -# -# See go/apex-allowed-deps-error for more details. -# TODO(b/157465465): introduce automated quality signals and remove this list. - -adbd(minSdkVersion:(no version)) -android.hardware.cas.native@1.0(minSdkVersion:29) -android.hardware.cas@1.0(minSdkVersion:29) -android.hardware.common-ndk_platform(minSdkVersion:29) -android.hardware.graphics.allocator@2.0(minSdkVersion:29) -android.hardware.graphics.allocator@3.0(minSdkVersion:29) -android.hardware.graphics.allocator@4.0(minSdkVersion:29) -android.hardware.graphics.bufferqueue@1.0(minSdkVersion:29) -android.hardware.graphics.bufferqueue@2.0(minSdkVersion:29) -android.hardware.graphics.common-ndk_platform(minSdkVersion:29) -android.hardware.graphics.common@1.0(minSdkVersion:29) -android.hardware.graphics.common@1.1(minSdkVersion:29) -android.hardware.graphics.common@1.2(minSdkVersion:29) -android.hardware.graphics.mapper@2.0(minSdkVersion:29) -android.hardware.graphics.mapper@2.1(minSdkVersion:29) -android.hardware.graphics.mapper@3.0(minSdkVersion:29) -android.hardware.graphics.mapper@4.0(minSdkVersion:29) -android.hardware.media.bufferpool@2.0(minSdkVersion:29) -android.hardware.media.c2@1.0(minSdkVersion:29) -android.hardware.media.c2@1.1(minSdkVersion:29) -android.hardware.media.omx@1.0(minSdkVersion:29) -android.hardware.media@1.0(minSdkVersion:29) -android.hardware.neuralnetworks@1.0(minSdkVersion:30) -android.hardware.neuralnetworks@1.1(minSdkVersion:30) -android.hardware.neuralnetworks@1.2(minSdkVersion:30) -android.hardware.neuralnetworks@1.3(minSdkVersion:30) -android.hardware.tetheroffload.config-V1.0-java(minSdkVersion:current) -android.hardware.tetheroffload.control-V1.0-java(minSdkVersion:current) -android.hardware.wifi-V1.0-java(minSdkVersion:30) -android.hardware.wifi-V1.0-java-constants(minSdkVersion:30) -android.hardware.wifi-V1.1-java(minSdkVersion:30) -android.hardware.wifi-V1.2-java(minSdkVersion:30) -android.hardware.wifi-V1.3-java(minSdkVersion:30) -android.hardware.wifi-V1.4-java(minSdkVersion:30) -android.hardware.wifi.hostapd-V1.0-java(minSdkVersion:30) -android.hardware.wifi.hostapd-V1.1-java(minSdkVersion:30) -android.hardware.wifi.hostapd-V1.2-java(minSdkVersion:30) -android.hardware.wifi.supplicant-V1.0-java(minSdkVersion:30) -android.hardware.wifi.supplicant-V1.1-java(minSdkVersion:30) -android.hardware.wifi.supplicant-V1.2-java(minSdkVersion:30) -android.hardware.wifi.supplicant-V1.3-java(minSdkVersion:30) -android.hidl.allocator@1.0(minSdkVersion:29) -android.hidl.base-V1.0-java(minSdkVersion:current) -android.hidl.manager-V1.0-java(minSdkVersion:30) -android.hidl.manager-V1.1-java(minSdkVersion:30) -android.hidl.manager-V1.2-java(minSdkVersion:30) -android.hidl.memory.token@1.0(minSdkVersion:29) -android.hidl.memory@1.0(minSdkVersion:29) -android.hidl.safe_union@1.0(minSdkVersion:29) -android.hidl.token@1.0(minSdkVersion:29) -android.hidl.token@1.0-utils(minSdkVersion:29) -android.net.ipsec.ike(minSdkVersion:current) -android.net.ipsec.ike.xml(minSdkVersion:(no version)) -androidx-constraintlayout_constraintlayout(minSdkVersion:14) -androidx-constraintlayout_constraintlayout-solver(minSdkVersion:24) -androidx.activity_activity(minSdkVersion:14) -androidx.activity_activity-ktx(minSdkVersion:14) -androidx.annotation_annotation(minSdkVersion:24) -androidx.annotation_annotation-experimental(minSdkVersion:14) -androidx.appcompat_appcompat(minSdkVersion:14) -androidx.appcompat_appcompat-resources(minSdkVersion:14) -androidx.arch.core_core-common(minSdkVersion:24) -androidx.arch.core_core-runtime(minSdkVersion:14) -androidx.asynclayoutinflater_asynclayoutinflater(minSdkVersion:14) -androidx.autofill_autofill(minSdkVersion:14) -androidx.cardview_cardview(minSdkVersion:14) -androidx.collection_collection(minSdkVersion:24) -androidx.collection_collection-ktx(minSdkVersion:24) -androidx.coordinatorlayout_coordinatorlayout(minSdkVersion:14) -androidx.core_core(minSdkVersion:14) -androidx.core_core-ktx(minSdkVersion:14) -androidx.cursoradapter_cursoradapter(minSdkVersion:14) -androidx.customview_customview(minSdkVersion:14) -androidx.documentfile_documentfile(minSdkVersion:14) -androidx.drawerlayout_drawerlayout(minSdkVersion:14) -androidx.fragment_fragment(minSdkVersion:14) -androidx.fragment_fragment-ktx(minSdkVersion:14) -androidx.interpolator_interpolator(minSdkVersion:14) -androidx.leanback_leanback(minSdkVersion:17) -androidx.leanback_leanback-preference(minSdkVersion:21) -androidx.legacy_legacy-preference-v14(minSdkVersion:14) -androidx.legacy_legacy-support-core-ui(minSdkVersion:14) -androidx.legacy_legacy-support-core-utils(minSdkVersion:14) -androidx.legacy_legacy-support-v13(minSdkVersion:14) -androidx.legacy_legacy-support-v4(minSdkVersion:14) -androidx.lifecycle_lifecycle-common(minSdkVersion:24) -androidx.lifecycle_lifecycle-common-java8(minSdkVersion:24) -androidx.lifecycle_lifecycle-extensions(minSdkVersion:14) -androidx.lifecycle_lifecycle-livedata(minSdkVersion:14) -androidx.lifecycle_lifecycle-livedata-core(minSdkVersion:14) -androidx.lifecycle_lifecycle-livedata-core-ktx(minSdkVersion:14) -androidx.lifecycle_lifecycle-process(minSdkVersion:14) -androidx.lifecycle_lifecycle-runtime(minSdkVersion:14) -androidx.lifecycle_lifecycle-runtime-ktx(minSdkVersion:14) -androidx.lifecycle_lifecycle-service(minSdkVersion:14) -androidx.lifecycle_lifecycle-viewmodel(minSdkVersion:14) -androidx.lifecycle_lifecycle-viewmodel-ktx(minSdkVersion:14) -androidx.lifecycle_lifecycle-viewmodel-savedstate(minSdkVersion:14) -androidx.loader_loader(minSdkVersion:14) -androidx.localbroadcastmanager_localbroadcastmanager(minSdkVersion:14) -androidx.media_media(minSdkVersion:14) -androidx.navigation_navigation-common(minSdkVersion:14) -androidx.navigation_navigation-common-ktx(minSdkVersion:14) -androidx.navigation_navigation-fragment(minSdkVersion:14) -androidx.navigation_navigation-fragment-ktx(minSdkVersion:14) -androidx.navigation_navigation-runtime(minSdkVersion:14) -androidx.navigation_navigation-runtime-ktx(minSdkVersion:14) -androidx.navigation_navigation-ui(minSdkVersion:14) -androidx.navigation_navigation-ui-ktx(minSdkVersion:14) -androidx.preference_preference(minSdkVersion:14) -androidx.print_print(minSdkVersion:14) -androidx.recyclerview_recyclerview(minSdkVersion:14) -androidx.recyclerview_recyclerview-selection(minSdkVersion:14) -androidx.savedstate_savedstate(minSdkVersion:14) -androidx.savedstate_savedstate-ktx(minSdkVersion:14) -androidx.slidingpanelayout_slidingpanelayout(minSdkVersion:14) -androidx.swiperefreshlayout_swiperefreshlayout(minSdkVersion:14) -androidx.transition_transition(minSdkVersion:14) -androidx.vectordrawable_vectordrawable(minSdkVersion:14) -androidx.vectordrawable_vectordrawable-animated(minSdkVersion:14) -androidx.versionedparcelable_versionedparcelable(minSdkVersion:14) -androidx.viewpager_viewpager(minSdkVersion:14) -apache-commons-compress(minSdkVersion:current) -art.module.public.api.stubs(minSdkVersion:(no version)) -bcm_object(minSdkVersion:29) -boringssl_self_test(minSdkVersion:29) -bouncycastle-unbundled(minSdkVersion:30) -bouncycastle_ike_digests(minSdkVersion:current) -brotli-java(minSdkVersion:current) -captiveportal-lib(minSdkVersion:29) -captiveportal-lib(minSdkVersion:current) -car-ui-lib(minSdkVersion:28) -CellBroadcastApp(minSdkVersion:29) -CellBroadcastServiceModule(minSdkVersion:29) -codecs_g711dec(minSdkVersion:29) -com.google.android.material_material(minSdkVersion:14) -conscrypt(minSdkVersion:29) -conscrypt.module.platform.api.stubs(minSdkVersion:(no version)) -conscrypt.module.public.api.stubs(minSdkVersion:(no version)) -core-lambda-stubs(minSdkVersion:(no version)) -core.current.stubs(minSdkVersion:(no version)) -crtbegin_dynamic(minSdkVersion:apex_inherit) -crtbegin_dynamic1(minSdkVersion:apex_inherit) -crtbegin_so(minSdkVersion:apex_inherit) -crtbegin_so1(minSdkVersion:apex_inherit) -crtbrand(minSdkVersion:apex_inherit) -crtend_android(minSdkVersion:apex_inherit) -crtend_so(minSdkVersion:apex_inherit) -datastallprotosnano(minSdkVersion:29) -datastallprotosnano(minSdkVersion:current) -derive_sdk(minSdkVersion:30) -derive_sdk(minSdkVersion:current) -derive_sdk_prefer32(minSdkVersion:30) -derive_sdk_prefer32(minSdkVersion:current) -dnsresolver_aidl_interface-ndk_platform(minSdkVersion:29) -dnsresolver_aidl_interface-unstable-ndk_platform(minSdkVersion:29) -DocumentsUI-res-lib(minSdkVersion:29) -exoplayer2-extractor(minSdkVersion:16) -exoplayer2-extractor-annotation-stubs(minSdkVersion:16) -ExtServices(minSdkVersion:30) -ExtServices(minSdkVersion:current) -ExtServices-core(minSdkVersion:30) -ExtServices-core(minSdkVersion:current) -flatbuffer_headers(minSdkVersion:(no version)) -fmtlib(minSdkVersion:29) -framework-permission(minSdkVersion:current) -framework-sdkextensions(minSdkVersion:30) -framework-sdkextensions(minSdkVersion:current) -framework-statsd(minSdkVersion:current) -framework-tethering(minSdkVersion:30) -framework-wifi(minSdkVersion:30) -framework-wifi-util-lib(minSdkVersion:30) -gemmlowp_headers(minSdkVersion:(no version)) -GoogleCellBroadcastApp(minSdkVersion:29) -GoogleCellBroadcastServiceModule(minSdkVersion:29) -GoogleExtServices(minSdkVersion:30) -GoogleExtServices(minSdkVersion:current) -GooglePermissionController(minSdkVersion:28) -guava(minSdkVersion:current) -gwp_asan_headers(minSdkVersion:(no version)) -i18n.module.public.api.stubs(minSdkVersion:(no version)) -iconloader(minSdkVersion:21) -ike-internals(minSdkVersion:current) -InProcessTethering(minSdkVersion:30) -ipmemorystore-aidl-interfaces-java(minSdkVersion:29) -ipmemorystore-aidl-interfaces-java(minSdkVersion:current) -ipmemorystore-aidl-interfaces-unstable-java(minSdkVersion:29) -jni_headers(minSdkVersion:29) -jsr305(minSdkVersion:14) -kotlinx-coroutines-android(minSdkVersion:current) -kotlinx-coroutines-core(minSdkVersion:current) -ksoap2(minSdkVersion:30) -legacy.art.module.platform.api.stubs(minSdkVersion:(no version)) -legacy.core.platform.api.stubs(minSdkVersion:(no version)) -legacy.i18n.module.platform.api.stubs(minSdkVersion:(no version)) -libaacextractor(minSdkVersion:29) -libadb_crypto(minSdkVersion:(no version)) -libadb_pairing_auth(minSdkVersion:(no version)) -libadb_pairing_connection(minSdkVersion:(no version)) -libadb_pairing_server(minSdkVersion:(no version)) -libadb_protos(minSdkVersion:(no version)) -libadb_sysdeps(minSdkVersion:apex_inherit) -libadb_tls_connection(minSdkVersion:(no version)) -libadbconnection_client(minSdkVersion:(no version)) -libadbconnection_server(minSdkVersion:(no version)) -libadbd(minSdkVersion:(no version)) -libadbd_core(minSdkVersion:(no version)) -libadbd_services(minSdkVersion:(no version)) -libamrextractor(minSdkVersion:29) -libapp_processes_protos_lite(minSdkVersion:(no version)) -libarect(minSdkVersion:29) -libasyncio(minSdkVersion:(no version)) -libatomic(minSdkVersion:(no version)) -libaudio_system_headers(minSdkVersion:29) -libaudioclient_headers(minSdkVersion:29) -libaudiofoundation_headers(minSdkVersion:29) -libaudioutils(minSdkVersion:29) -libaudioutils_fixedfft(minSdkVersion:29) -libavcdec(minSdkVersion:29) -libavcenc(minSdkVersion:29) -libavservices_minijail(minSdkVersion:29) -libbacktrace_headers(minSdkVersion:apex_inherit) -libbase(minSdkVersion:29) -libbase_headers(minSdkVersion:29) -libbinder(minSdkVersion:29) -libbinder_headers(minSdkVersion:29) -libbinderthreadstateutils(minSdkVersion:29) -libbluetooth-types-header(minSdkVersion:29) -libbrotli(minSdkVersion:(no version)) -libbuildversion(minSdkVersion:(no version)) -libc(minSdkVersion:(no version)) -libc++(minSdkVersion:apex_inherit) -libc++_static(minSdkVersion:apex_inherit) -libc++abi(minSdkVersion:apex_inherit) -libc++demangle(minSdkVersion:apex_inherit) -libc_headers(minSdkVersion:apex_inherit) -libc_headers_arch(minSdkVersion:apex_inherit) -libc_scudo(minSdkVersion:apex_inherit) -libcap(minSdkVersion:29) -libclang_rt.hwasan-aarch64-android.llndk(minSdkVersion:(no version)) -libcodec2(minSdkVersion:29) -libcodec2_headers(minSdkVersion:29) -libcodec2_hidl@1.0(minSdkVersion:29) -libcodec2_hidl@1.1(minSdkVersion:29) -libcodec2_internal(minSdkVersion:29) -libcodec2_soft_aacdec(minSdkVersion:29) -libcodec2_soft_aacenc(minSdkVersion:29) -libcodec2_soft_amrnbdec(minSdkVersion:29) -libcodec2_soft_amrnbenc(minSdkVersion:29) -libcodec2_soft_amrwbdec(minSdkVersion:29) -libcodec2_soft_amrwbenc(minSdkVersion:29) -libcodec2_soft_av1dec_gav1(minSdkVersion:29) -libcodec2_soft_avcdec(minSdkVersion:29) -libcodec2_soft_avcenc(minSdkVersion:29) -libcodec2_soft_common(minSdkVersion:29) -libcodec2_soft_flacdec(minSdkVersion:29) -libcodec2_soft_flacenc(minSdkVersion:29) -libcodec2_soft_g711alawdec(minSdkVersion:29) -libcodec2_soft_g711mlawdec(minSdkVersion:29) -libcodec2_soft_gsmdec(minSdkVersion:29) -libcodec2_soft_h263dec(minSdkVersion:29) -libcodec2_soft_h263enc(minSdkVersion:29) -libcodec2_soft_hevcdec(minSdkVersion:29) -libcodec2_soft_hevcenc(minSdkVersion:29) -libcodec2_soft_mp3dec(minSdkVersion:29) -libcodec2_soft_mpeg2dec(minSdkVersion:29) -libcodec2_soft_mpeg4dec(minSdkVersion:29) -libcodec2_soft_mpeg4enc(minSdkVersion:29) -libcodec2_soft_opusdec(minSdkVersion:29) -libcodec2_soft_opusenc(minSdkVersion:29) -libcodec2_soft_rawdec(minSdkVersion:29) -libcodec2_soft_vorbisdec(minSdkVersion:29) -libcodec2_soft_vp8dec(minSdkVersion:29) -libcodec2_soft_vp8enc(minSdkVersion:29) -libcodec2_soft_vp9dec(minSdkVersion:29) -libcodec2_soft_vp9enc(minSdkVersion:29) -libcodec2_vndk(minSdkVersion:29) -libcrypto(minSdkVersion:29) -libcrypto_static(minSdkVersion:(no version)) -libcrypto_utils(minSdkVersion:(no version)) -libcutils(minSdkVersion:29) -libcutils_headers(minSdkVersion:29) -libcutils_sockets(minSdkVersion:29) -libderive_sdk(minSdkVersion:30) -libdiagnose_usb(minSdkVersion:(no version)) -libdl(minSdkVersion:(no version)) -libeigen(minSdkVersion:(no version)) -libfifo(minSdkVersion:29) -libFLAC(minSdkVersion:29) -libFLAC-config(minSdkVersion:29) -libFLAC-headers(minSdkVersion:29) -libflacextractor(minSdkVersion:29) -libfmq(minSdkVersion:29) -libFraunhoferAAC(minSdkVersion:29) -libgav1(minSdkVersion:29) -libgcc_stripped(minSdkVersion:(no version)) -libgralloctypes(minSdkVersion:29) -libgrallocusage(minSdkVersion:29) -libgsm(minSdkVersion:apex_inherit) -libgtest_prod(minSdkVersion:apex_inherit) -libgui_bufferqueue_static(minSdkVersion:29) -libgui_headers(minSdkVersion:29) -libhardware(minSdkVersion:29) -libhardware_headers(minSdkVersion:29) -libhevcdec(minSdkVersion:29) -libhevcenc(minSdkVersion:29) -libhidlbase(minSdkVersion:29) -libhidlmemory(minSdkVersion:29) -libhwbinder-impl-internal(minSdkVersion:29) -libhwbinder_headers(minSdkVersion:29) -libion(minSdkVersion:29) -libjavacrypto(minSdkVersion:29) -libjsoncpp(minSdkVersion:29) -libLibGuiProperties(minSdkVersion:29) -liblog(minSdkVersion:(no version)) -liblog_headers(minSdkVersion:29) -liblua(minSdkVersion:(no version)) -liblua(minSdkVersion:30) -liblz4(minSdkVersion:(no version)) -libm(minSdkVersion:(no version)) -libmath(minSdkVersion:29) -libmdnssd(minSdkVersion:(no version)) -libmedia_codecserviceregistrant(minSdkVersion:29) -libmedia_datasource_headers(minSdkVersion:29) -libmedia_headers(minSdkVersion:29) -libmedia_helper_headers(minSdkVersion:29) -libmedia_midiiowrapper(minSdkVersion:29) -libmediaparser-jni(minSdkVersion:29) -libmidiextractor(minSdkVersion:29) -libminijail(minSdkVersion:29) -libminijail_gen_constants(minSdkVersion:(no version)) -libminijail_gen_constants_obj(minSdkVersion:29) -libminijail_gen_syscall(minSdkVersion:(no version)) -libminijail_gen_syscall_obj(minSdkVersion:29) -libminijail_generated(minSdkVersion:29) -libmkvextractor(minSdkVersion:29) -libmodules-utils-build(minSdkVersion:29) -libmp3extractor(minSdkVersion:29) -libmp4extractor(minSdkVersion:29) -libmpeg2dec(minSdkVersion:29) -libmpeg2extractor(minSdkVersion:29) -libnanohttpd(minSdkVersion:30) -libnativebase_headers(minSdkVersion:29) -libnativehelper_compat_libc++(minSdkVersion:(no version)) -libnativehelper_header_only(minSdkVersion:29) -libnativewindow_headers(minSdkVersion:29) -libnetd_resolv(minSdkVersion:29) -libnetdbinder_utils_headers(minSdkVersion:29) -libnetdutils(minSdkVersion:29) -libnetjniutils(minSdkVersion:29) -libnetworkstackutilsjni(minSdkVersion:29) -libneuralnetworks(minSdkVersion:(no version)) -libneuralnetworks_common(minSdkVersion:(no version)) -libneuralnetworks_headers(minSdkVersion:(no version)) -liboggextractor(minSdkVersion:29) -libopus(minSdkVersion:29) -libprocessgroup(minSdkVersion:29) -libprocessgroup_headers(minSdkVersion:29) -libprocpartition(minSdkVersion:(no version)) -libprotobuf-cpp-lite(minSdkVersion:29) -libprotobuf-java-lite(minSdkVersion:current) -libprotobuf-java-nano(minSdkVersion:9) -libprotoutil(minSdkVersion:(no version)) -libqemu_pipe(minSdkVersion:(no version)) -libsdk_proto(minSdkVersion:30) -libsfplugin_ccodec_utils(minSdkVersion:29) -libsonivoxwithoutjet(minSdkVersion:29) -libspeexresampler(minSdkVersion:29) -libssl(minSdkVersion:29) -libstagefright_amrnb_common(minSdkVersion:29) -libstagefright_amrnbdec(minSdkVersion:29) -libstagefright_amrnbenc(minSdkVersion:29) -libstagefright_amrwbdec(minSdkVersion:29) -libstagefright_amrwbenc(minSdkVersion:29) -libstagefright_bufferpool@2.0.1(minSdkVersion:29) -libstagefright_bufferqueue_helper(minSdkVersion:29) -libstagefright_bufferqueue_helper_novndk(minSdkVersion:(no version)) -libstagefright_enc_common(minSdkVersion:29) -libstagefright_esds(minSdkVersion:29) -libstagefright_flacdec(minSdkVersion:29) -libstagefright_foundation(minSdkVersion:29) -libstagefright_foundation_headers(minSdkVersion:29) -libstagefright_foundation_without_imemory(minSdkVersion:29) -libstagefright_headers(minSdkVersion:29) -libstagefright_id3(minSdkVersion:29) -libstagefright_m4vh263dec(minSdkVersion:29) -libstagefright_m4vh263enc(minSdkVersion:29) -libstagefright_metadatautils(minSdkVersion:29) -libstagefright_mp3dec(minSdkVersion:29) -libstagefright_mpeg2extractor(minSdkVersion:29) -libstagefright_mpeg2support(minSdkVersion:29) -libstagefright_mpeg2support_nocrypto(minSdkVersion:29) -libstats_jni(minSdkVersion:(no version)) -libstatslog_resolv(minSdkVersion:29) -libstatslog_statsd(minSdkVersion:(no version)) -libstatspull(minSdkVersion:(no version)) -libstatspush_compat(minSdkVersion:29) -libstatssocket(minSdkVersion:(no version)) -libstatssocket_headers(minSdkVersion:29) -libsync(minSdkVersion:(no version)) -libsystem_headers(minSdkVersion:apex_inherit) -libsysutils(minSdkVersion:apex_inherit) -libtetherutilsjni(minSdkVersion:30) -libtextclassifier(minSdkVersion:(no version)) -libtextclassifier(minSdkVersion:30) -libtextclassifier-java(minSdkVersion:28) -libtextclassifier-java(minSdkVersion:current) -libtextclassifier_abseil(minSdkVersion:30) -libtextclassifier_flatbuffer_headers(minSdkVersion:(no version)) -libtextclassifier_flatbuffer_headers(minSdkVersion:30) -libtextclassifier_hash_headers(minSdkVersion:(no version)) -libtextclassifier_hash_static(minSdkVersion:(no version)) -libtflite_kernel_utils(minSdkVersion:(no version)) -libtflite_static(minSdkVersion:(no version)) -libtflite_static(minSdkVersion:30) -libui(minSdkVersion:29) -libui-types(minSdkVersion:apex_inherit) -libui_headers(minSdkVersion:29) -libunwind_llvm(minSdkVersion:apex_inherit) -libutf(minSdkVersion:(no version)) -libutils(minSdkVersion:apex_inherit) -libutils_headers(minSdkVersion:apex_inherit) -libvorbisidec(minSdkVersion:29) -libvpx(minSdkVersion:29) -libwatchdog(minSdkVersion:29) -libwavextractor(minSdkVersion:29) -libwebm(minSdkVersion:29) -libyuv(minSdkVersion:29) -libyuv_static(minSdkVersion:29) -libz_current(minSdkVersion:(no version)) -libzstd(minSdkVersion:(no version)) -marisa-trie(minSdkVersion:(no version)) -marisa-trie(minSdkVersion:30) -media_ndk_headers(minSdkVersion:29) -media_plugin_headers(minSdkVersion:29) -mediaswcodec(minSdkVersion:29) -metrics-constants-protos(minSdkVersion:29) -metrics-constants-protos(minSdkVersion:current) -ndk_crtbegin_so.19(minSdkVersion:(no version)) -ndk_crtbegin_so.21(minSdkVersion:(no version)) -ndk_crtbegin_so.27(minSdkVersion:(no version)) -ndk_crtend_so.19(minSdkVersion:(no version)) -ndk_crtend_so.21(minSdkVersion:(no version)) -ndk_crtend_so.27(minSdkVersion:(no version)) -ndk_libandroid_support(minSdkVersion:(no version)) -ndk_libc++_static(minSdkVersion:(no version)) -ndk_libc++abi(minSdkVersion:(no version)) -ndk_libunwind(minSdkVersion:(no version)) -net-utils-device-common(minSdkVersion:29) -net-utils-framework-common(minSdkVersion:current) -net-utils-services-common(minSdkVersion:30) -netd_aidl_interface-java(minSdkVersion:29) -netd_aidl_interface-unstable-java(minSdkVersion:29) -netd_aidl_interface-V3-java(minSdkVersion:29) -netd_event_listener_interface-ndk_platform(minSdkVersion:29) -netlink-client(minSdkVersion:29) -netlink-client(minSdkVersion:current) -networkstack-aidl-interfaces-java(minSdkVersion:29) -networkstack-aidl-interfaces-java(minSdkVersion:current) -networkstack-aidl-interfaces-unstable-java(minSdkVersion:29) -networkstack-client(minSdkVersion:29) -networkstack-client(minSdkVersion:current) -NetworkStackApiStableDependencies(minSdkVersion:29) -NetworkStackApiStableLib(minSdkVersion:29) -networkstackprotos(minSdkVersion:29) -OsuLogin(minSdkVersion:30) -OsuLoginGoogle(minSdkVersion:30) -PermissionController(minSdkVersion:28) -permissioncontroller-statsd(minSdkVersion:current) -philox_random(minSdkVersion:(no version)) -philox_random_headers(minSdkVersion:(no version)) -prebuilt_androidx-constraintlayout_constraintlayout-nodeps(minSdkVersion:(no version)) -prebuilt_androidx-constraintlayout_constraintlayout-solver-nodeps(minSdkVersion:current) -prebuilt_androidx.activity_activity-ktx-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.activity_activity-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.annotation_annotation-experimental-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.annotation_annotation-nodeps(minSdkVersion:current) -prebuilt_androidx.appcompat_appcompat-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.appcompat_appcompat-resources-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.arch.core_core-common-nodeps(minSdkVersion:current) -prebuilt_androidx.arch.core_core-runtime-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.asynclayoutinflater_asynclayoutinflater-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.autofill_autofill-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.cardview_cardview-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.collection_collection-ktx-nodeps(minSdkVersion:current) -prebuilt_androidx.collection_collection-nodeps(minSdkVersion:current) -prebuilt_androidx.coordinatorlayout_coordinatorlayout-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.core_core-ktx-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.core_core-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.cursoradapter_cursoradapter-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.customview_customview-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.documentfile_documentfile-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.drawerlayout_drawerlayout-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.fragment_fragment-ktx-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.fragment_fragment-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.interpolator_interpolator-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.leanback_leanback-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.leanback_leanback-preference-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.legacy_legacy-support-core-ui-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.legacy_legacy-support-core-utils-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.legacy_legacy-support-v13-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.lifecycle_lifecycle-common-java8-nodeps(minSdkVersion:current) -prebuilt_androidx.lifecycle_lifecycle-common-nodeps(minSdkVersion:current) -prebuilt_androidx.lifecycle_lifecycle-extensions-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.lifecycle_lifecycle-livedata-core-ktx-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.lifecycle_lifecycle-livedata-core-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.lifecycle_lifecycle-livedata-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.lifecycle_lifecycle-process-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.lifecycle_lifecycle-runtime-ktx-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.lifecycle_lifecycle-runtime-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.lifecycle_lifecycle-service-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.lifecycle_lifecycle-viewmodel-ktx-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.lifecycle_lifecycle-viewmodel-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.lifecycle_lifecycle-viewmodel-savedstate-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.loader_loader-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.localbroadcastmanager_localbroadcastmanager-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.media_media-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.navigation_navigation-common-ktx-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.navigation_navigation-common-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.navigation_navigation-fragment-ktx-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.navigation_navigation-fragment-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.navigation_navigation-runtime-ktx-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.navigation_navigation-runtime-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.navigation_navigation-ui-ktx-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.navigation_navigation-ui-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.preference_preference-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.print_print-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.recyclerview_recyclerview-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.recyclerview_recyclerview-selection-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.savedstate_savedstate-ktx-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.savedstate_savedstate-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.slidingpanelayout_slidingpanelayout-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.swiperefreshlayout_swiperefreshlayout-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.transition_transition-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.vectordrawable_vectordrawable-animated-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.vectordrawable_vectordrawable-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.versionedparcelable_versionedparcelable-nodeps(minSdkVersion:(no version)) -prebuilt_androidx.viewpager_viewpager-nodeps(minSdkVersion:(no version)) -prebuilt_com.google.android.material_material-nodeps(minSdkVersion:(no version)) -prebuilt_error_prone_annotations(minSdkVersion:(no version)) -prebuilt_kotlin-stdlib(minSdkVersion:current) -prebuilt_kotlinx-coroutines-android-nodeps(minSdkVersion:(no version)) -prebuilt_kotlinx-coroutines-core-nodeps(minSdkVersion:(no version)) -prebuilt_libclang_rt.builtins-aarch64-android(minSdkVersion:(no version)) -prebuilt_libclang_rt.builtins-arm-android(minSdkVersion:(no version)) -prebuilt_libclang_rt.builtins-i686-android(minSdkVersion:(no version)) -prebuilt_libclang_rt.builtins-x86_64-android(minSdkVersion:(no version)) -prebuilt_test_framework-sdkextensions(minSdkVersion:(no version)) -server_configurable_flags(minSdkVersion:29) -service-permission(minSdkVersion:current) -service-statsd(minSdkVersion:current) -service-wifi(minSdkVersion:30) -services.net-module-wifi(minSdkVersion:30) -ServiceWifiResources(minSdkVersion:30) -ServiceWifiResourcesGoogle(minSdkVersion:30) -SettingsLibActionBarShadow(minSdkVersion:21) -SettingsLibAppPreference(minSdkVersion:21) -SettingsLibBarChartPreference(minSdkVersion:21) -SettingsLibHelpUtils(minSdkVersion:21) -SettingsLibLayoutPreference(minSdkVersion:21) -SettingsLibProgressBar(minSdkVersion:21) -SettingsLibRestrictedLockUtils(minSdkVersion:21) -SettingsLibSearchWidget(minSdkVersion:21) -SettingsLibSettingsTheme(minSdkVersion:21) -SettingsLibUtils(minSdkVersion:21) -stats_proto(minSdkVersion:29) -statsd(minSdkVersion:(no version)) -statsd-aidl-ndk_platform(minSdkVersion:(no version)) -statsprotos(minSdkVersion:29) -tensorflow_headers(minSdkVersion:(no version)) -Tethering(minSdkVersion:30) -TetheringApiCurrentLib(minSdkVersion:30) -TetheringGoogle(minSdkVersion:30) -textclassifier-statsd(minSdkVersion:30) -textclassifier-statsd(minSdkVersion:current) -TextClassifierNotificationLibNoManifest(minSdkVersion:29) -TextClassifierServiceLibNoManifest(minSdkVersion:28) -TextClassifierServiceLibNoManifest(minSdkVersion:30) -updatable-media(minSdkVersion:29) -wifi-lite-protos(minSdkVersion:30) -wifi-nano-protos(minSdkVersion:30) -wifi-service-pre-jarjar(minSdkVersion:30) -xz-java(minSdkVersion:current) diff --git a/apex/androidmk.go b/apex/androidmk.go index def1e2f16..9f78857d0 100644 --- a/apex/androidmk.go +++ b/apex/androidmk.go @@ -254,7 +254,7 @@ func (a *apexBundle) androidMkForFiles(w io.Writer, apexBundleName, apexName, mo return moduleNames } -func (a *apexBundle) writeRequiredModules(w io.Writer) { +func (a *apexBundle) writeRequiredModules(w io.Writer, apexBundleName string) { var required []string var targetRequired []string var hostRequired []string @@ -293,7 +293,7 @@ func (a *apexBundle) androidMkForType() android.AndroidMkData { if len(moduleNames) > 0 { fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES :=", strings.Join(moduleNames, " ")) } - a.writeRequiredModules(w) + a.writeRequiredModules(w, name) fmt.Fprintln(w, "include $(BUILD_PHONY_PACKAGE)") } else { @@ -312,7 +312,7 @@ func (a *apexBundle) androidMkForType() android.AndroidMkData { if len(a.requiredDeps) > 0 { fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES +=", strings.Join(a.requiredDeps, " ")) } - a.writeRequiredModules(w) + a.writeRequiredModules(w, name) var postInstallCommands []string if a.prebuiltFileToDelete != "" { postInstallCommands = append(postInstallCommands, "rm -rf "+ diff --git a/apex/apex_singleton.go b/apex/apex_singleton.go index 314ec8b37..1ac2e5c3e 100644 --- a/apex/apex_singleton.go +++ b/apex/apex_singleton.go @@ -58,8 +58,8 @@ var ( echo "ERROR: go/apex-allowed-deps-error"; echo "******************************"; echo "Detected changes to allowed dependencies in updatable modules."; - echo "To fix and update build/soong/apex/allowed_deps.txt, please run:"; - echo "$$ (croot && build/soong/scripts/update-apex-allowed-deps.sh)"; + echo "To fix and update packages/modules/common/build/allowed_deps.txt, please run:"; + echo "$$ (croot && packages/modules/common/build/update-apex-allowed-deps.sh)"; echo "Members of mainline-modularization@google.com will review the changes."; echo -e "******************************\n"; exit 1; @@ -78,7 +78,7 @@ func (s *apexDepsInfoSingleton) GenerateBuildActions(ctx android.SingletonContex } }) - allowedDeps := android.ExistentPathForSource(ctx, "build/soong/apex/allowed_deps.txt").Path() + allowedDeps := android.ExistentPathForSource(ctx, "packages/modules/common/build/allowed_deps.txt").Path() newAllowedDeps := android.PathForOutput(ctx, "apex", "depsinfo", "new-allowed-deps.txt") ctx.Build(pctx, android.BuildParams{ diff --git a/apex/apex_test.go b/apex/apex_test.go index ecdb88e08..3442b6d08 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -536,14 +536,12 @@ func TestBasicApex(t *testing.T) { fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n") ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex") - ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex") ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib") ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar") ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar") flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n") ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))") - ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))") ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))") ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))") ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)") @@ -857,13 +855,9 @@ func TestApexWithExplicitStubsDependency(t *testing.T) { ensureNotContains(t, libFooStubsLdFlags, "libbar.so") fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n") - ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex2") - ensureListContains(t, fullDepsInfo, " libbaz(minSdkVersion:(no version)) <- mylib") ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib") flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n") - ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))") - ensureListContains(t, flatDepsInfo, "libbaz(minSdkVersion:(no version))") ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)") } diff --git a/apex/builder.go b/apex/builder.go index 75cae986c..47ced77da 100644 --- a/apex/builder.go +++ b/apex/builder.go @@ -574,15 +574,20 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) { }) a.apisUsedByModuleFile = apisUsedbyOutputFile + var libNames []string + for _, f := range a.filesInfo { + if f.class == nativeSharedLib { + libNames = append(libNames, f.Stem()) + } + } apisBackedbyOutputFile := android.PathForModuleOut(ctx, a.Name()+"_backing.txt") ndkLibraryList := android.PathForSource(ctx, "system/core/rootdir/etc/public.libraries.android.txt") rule := android.NewRuleBuilder() rule.Command(). Tool(android.PathForSource(ctx, "build/soong/scripts/gen_ndk_backedby_apex.sh")). - Text(imageDir.String()). - Implicits(implicitInputs). Output(apisBackedbyOutputFile). - Input(ndkLibraryList) + Input(ndkLibraryList). + Flags(libNames) rule.Build(pctx, ctx, "ndk_backedby_list", "Generate API libraries backed by Apex") a.apisBackedByModuleFile = apisBackedbyOutputFile @@ -754,6 +759,12 @@ func (a *apexBundle) buildApexDependencyInfo(ctx android.ModuleContext) { return !externalDep } + // Skip dependencies that are only available to APEXes; they are developed with updatability + // in mind and don't need manual approval. + if to.(android.ApexModule).NotAvailableForPlatform() { + return !externalDep + } + if info, exists := depInfos[to.Name()]; exists { if !android.InList(from.Name(), info.From) { info.From = append(info.From, from.Name()) diff --git a/java/app.go b/java/app.go index 5faea0148..ff3b8a45f 100755 --- a/java/app.go +++ b/java/app.go @@ -938,6 +938,13 @@ func (a *AndroidApp) buildAppDependencyInfo(ctx android.ModuleContext) { depsInfo := android.DepNameToDepInfoMap{} a.walkPayloadDeps(ctx, func(ctx android.ModuleContext, from blueprint.Module, to android.ApexModule, externalDep bool) { depName := to.Name() + + // Skip dependencies that are only available to APEXes; they are developed with updatability + // in mind and don't need manual approval. + if to.(android.ApexModule).NotAvailableForPlatform() { + return + } + if info, exist := depsInfo[depName]; exist { info.From = append(info.From, from.Name()) info.IsExternal = info.IsExternal && externalDep diff --git a/java/java_test.go b/java/java_test.go index fc8dd7ecb..c93dddee2 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -1303,6 +1303,12 @@ func TestJavaSdkLibrary(t *testing.T) { libs: ["foo"], sdk_version: "system_29", } + java_library { + name: "baz-module-30", + srcs: ["c.java"], + libs: ["foo"], + sdk_version: "module_30", + } `) // check the existence of the internal modules @@ -1349,6 +1355,13 @@ func TestJavaSdkLibrary(t *testing.T) { "prebuilts/sdk/29/system/foo.jar") } + bazModule30Javac := ctx.ModuleForTests("baz-module-30", "android_common").Rule("javac") + // tests if "baz-module-30" is actually linked to the module 30 stubs lib + if !strings.Contains(bazModule30Javac.Args["classpath"], "prebuilts/sdk/30/module-lib/foo.jar") { + t.Errorf("baz-module-30 javac classpath %v does not contain %q", bazModule30Javac.Args["classpath"], + "prebuilts/sdk/30/module-lib/foo.jar") + } + // test if baz has exported SDK lib names foo and bar to qux qux := ctx.ModuleForTests("qux", "android_common") if quxLib, ok := qux.Module().(*Library); ok { diff --git a/java/sdk.go b/java/sdk.go index 6c1665180..5a6c53050 100644 --- a/java/sdk.go +++ b/java/sdk.go @@ -215,7 +215,7 @@ func (s sdkSpec) usePrebuilt(ctx android.EarlyModuleContext) bool { return ctx.Config().UnbundledBuildUsePrebuiltSdks() } else if s.version.isNumbered() { // sanity check - if s.kind != sdkPublic && s.kind != sdkSystem && s.kind != sdkTest { + if s.kind != sdkPublic && s.kind != sdkSystem && s.kind != sdkTest && s.kind != sdkModule { panic(fmt.Errorf("prebuilt SDK is not not available for sdkKind=%q", s.kind)) return false } diff --git a/java/system_modules.go b/java/system_modules.go index 7394fd547..5cc546d2e 100644 --- a/java/system_modules.go +++ b/java/system_modules.go @@ -192,6 +192,7 @@ func (system *SystemModules) AndroidMk() android.AndroidMkData { fmt.Fprintln(w, name+":", "$("+makevar+")") fmt.Fprintln(w, ".PHONY:", name) + // TODO(b/151177513): Licenses: Doesn't go through base_rules. May have to generate meta_lic and meta_module here. }, } } diff --git a/java/testing.go b/java/testing.go index 6b105bdaa..f373d7718 100644 --- a/java/testing.go +++ b/java/testing.go @@ -46,6 +46,8 @@ func TestConfig(buildDir string, env map[string]string, bp string, fs map[string "prebuilts/sdk/30/public/framework.aidl": nil, "prebuilts/sdk/30/system/android.jar": nil, "prebuilts/sdk/30/system/foo.jar": nil, + "prebuilts/sdk/30/module-lib/android.jar": nil, + "prebuilts/sdk/30/module-lib/foo.jar": nil, "prebuilts/sdk/30/public/core-for-system-modules.jar": nil, "prebuilts/sdk/current/core/android.jar": nil, "prebuilts/sdk/current/public/android.jar": nil, diff --git a/licenses/Android.bp b/licenses/Android.bp new file mode 100644 index 000000000..c70d6bd55 --- /dev/null +++ b/licenses/Android.bp @@ -0,0 +1,1256 @@ +// +// Copyright (C) 2020 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 { + default_visibility: ["//visibility:public"], + default_applicable_licenses: ["Android-Apache-2.0"], +} + +license { + name: "Android-Apache-2.0", + license_kinds: ["SPDX-license-identifier-Apache-2.0"], + copyright_notice: "Copyright (C) The Android Open Source Project", + license_text: ["LICENSE"], +} + +license_kind { + name: "SPDX-license-identifier-0BSD", + conditions: ["unencumbered"], + url: "https://spdx.org/licenses/0BSD", +} + +license_kind { + name: "SPDX-license-identifier-AFL-1.1", + conditions: ["by_exception_only"], + url: "https://spdx.org/licenses/AFL-1.1.html", +} + +license_kind { + name: "SPDX-license-identifier-AFL-1.2", + conditions: ["by_exception_only"], + url: "https://spdx.org/licenses/AFL-1.2.html", +} + +license_kind { + name: "SPDX-license-identifier-AFL-2.0", + conditions: ["by_exception_only"], + url: "https://spdx.org/licenses/AFL-2.0.html", +} + +license_kind { + name: "SPDX-license-identifier-AFL-2.1", + conditions: ["notice"], + url: "https://spdx.org/licenses/AFL-2.1.html", +} + +license_kind { + name: "SPDX-license-identifier-AFL-3.0", + conditions: ["notice"], + url: "https://spdx.org/licenses/AFL-3.0.html", +} + +license_kind { + name: "SPDX-license-identifier-AGPL", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/AGPL.html", +} + +license_kind { + name: "SPDX-license-identifier-AGPL-1.0", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/AGPL-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-AGPL-1.0-only", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/AGPL-1.0-only.html", +} + +license_kind { + name: "SPDX-license-identifier-AGPL-1.0-or-later", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/AGPL-1.0-or-later.html", +} + +license_kind { + name: "SPDX-license-identifier-AGPL-3.0", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/AGPL-3.0.html", +} + +license_kind { + name: "SPDX-license-identifier-AGPL-3.0-only", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/AGPL-3.0-only.html", +} + +license_kind { + name: "SPDX-license-identifier-AGPL-3.0-or-later", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/AGPL-3.0-or-later.html", +} + +license_kind { + name: "SPDX-license-identifier-APSL-1.1", + conditions: [ + "reciprocal", + ], + url: "https://spdx.org/licenses/APSL-1.1.html", +} + +license_kind { + name: "SPDX-license-identifier-APSL-2.0", + conditions: [ + "reciprocal", + ], + url: "https://spdx.org/licenses/APSL-2.0.html", +} + +license_kind { + name: "SPDX-license-identifier-Apache", + conditions: ["notice"], +} + +license_kind { + name: "SPDX-license-identifier-Apache-1.0", + conditions: ["notice"], + url: "https://spdx.org/licenses/Apache-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-Apache-1.1", + conditions: ["notice"], + url: "https://spdx.org/licenses/Apache-1.1.html", +} + +license_kind { + name: "SPDX-license-identifier-Apache-2.0", + conditions: ["notice"], + url: "https://spdx.org/licenses/Apache-2.0.html", +} + +license_kind { + name: "SPDX-license-identifier-Artistic", + conditions: ["notice"], +} + +license_kind { + name: "SPDX-license-identifier-Artistic-1.0", + conditions: ["notice"], + url: "https://spdx.org/licenses/Artistic-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-Artistic-1.0-Perl", + conditions: ["notice"], + url: "https://spdx.org/licenses/Artistic-1.0-Perl.html", +} + +license_kind { + name: "SPDX-license-identifier-Artistic-1.0-cl8", + conditions: ["notice"], + url: "https://spdx.org/licenses/Artistic-1.0-cl8.html", +} + +license_kind { + name: "SPDX-license-identifier-Artistic-2.0", + conditions: ["notice"], + url: "https://spdx.org/licenses/Artistic-2.0.html", +} + +license_kind { + name: "SPDX-license-identifier-BSD", + conditions: ["notice"], +} + +license_kind { + name: "SPDX-license-identifier-BSD-1-Clause", + conditions: ["notice"], + url: "https://spdx.org/licenses/BSD-1-Clause.html", +} + +license_kind { + name: "SPDX-license-identifier-BSD-2-Clause", + conditions: ["notice"], + url: "https://spdx.org/licenses/BSD-2-Clause.html", +} + +license_kind { + name: "SPDX-license-identifier-BSD-2-Clause-FreeBSD", + conditions: ["notice"], + url: "https://spdx.org/licenses/BSD-2-Clause-FreeBSD.html", +} + +license_kind { + name: "SPDX-license-identifier-BSD-2-Clause-NetBSD", + conditions: ["notice"], + url: "https://spdx.org/licenses/BSD-2-Clause-NetBSD.html", +} + +license_kind { + name: "SPDX-license-identifier-BSD-2-Clause-Patent", + conditions: ["notice"], + url: "https://spdx.org/licenses/BSD-2-Clause-Patent.html", +} + +license_kind { + name: "SPDX-license-identifier-BSD-3-Clause", + conditions: ["notice"], + url: "https://spdx.org/licenses/BSD-3-Clause.html", +} + +license_kind { + name: "SPDX-license-identifier-BSD-3-Clause-Attribution", + conditions: ["notice"], + url: "https://spdx.org/licenses/BSD-3-Clause-Attribution.html", +} + +license_kind { + name: "SPDX-license-identifier-BSD-3-Clause-Clear", + conditions: ["notice"], + url: "https://spdx.org/licenses/BSD-3-Clause-Clear.html", +} + +license_kind { + name: "SPDX-license-identifier-BSD-3-Clause-LBNL", + conditions: ["notice"], + url: "https://spdx.org/licenses/BSD-3-Clause-LBNL.html", +} + +license_kind { + name: "SPDX-license-identifier-BSD-3-Clause-No-Nuclear-License", + conditions: ["notice"], + url: "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License.html", +} + +license_kind { + name: "SPDX-license-identifier-BSD-3-Clause-No-Nuclear-License-2014", + conditions: ["notice"], + url: "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License-2014.html", +} + +license_kind { + name: "SPDX-license-identifier-BSD-3-Clause-No-Nuclear-Warranty", + conditions: ["notice"], + url: "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-Warranty.html", +} + +license_kind { + name: "SPDX-license-identifier-BSD-3-Clause-Open-MPI", + conditions: ["notice"], + url: "https://spdx.org/licenses/BSD-3-Clause-Open-MPI.html", +} + +license_kind { + name: "SPDX-license-identifier-BSD-4-Clause", + conditions: ["notice"], + url: "https://spdx.org/licenses/BSD-4-Clause.html", +} + +license_kind { + name: "SPDX-license-identifier-BSD-4-Clause-UC", + conditions: ["notice"], + url: "https://spdx.org/licenses/BSD-4-Clause-UC.html", +} + +license_kind { + name: "SPDX-license-identifier-BSD-Protection", + conditions: ["notice"], + url: "https://spdx.org/licenses/BSD-Protection.html", +} + +license_kind { + name: "SPDX-license-identifier-BSD-Source-Code", + conditions: ["notice"], + url: "https://spdx.org/licenses/BSD-Source-Code.html", +} + +license_kind { + name: "SPDX-license-identifier-BSL-1.0", + conditions: ["notice"], + url: "https://spdx.org/licenses/BSL-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-Beerware", + conditions: ["notice"], + url: "https://spdx.org/licenses/Beerware.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY", + conditions: ["notice"], +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-1.0", + conditions: ["notice"], + url: "https://spdx.org/licenses/CC-BY-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-2.0", + conditions: ["notice"], + url: "https://spdx.org/licenses/CC-BY-2.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-2.5", + conditions: ["notice"], + url: "https://spdx.org/licenses/CC-BY-2.5.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-3.0", + conditions: ["notice"], + url: "https://spdx.org/licenses/CC-BY-3.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-4.0", + conditions: ["notice"], + url: "https://spdx.org/licenses/CC-BY-4.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-NC", + conditions: [ + "by_exception_only", + "not_allowed", + ], +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-NC-1.0", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/CC-BY-NC-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-NC-2.0", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/CC-BY-NC-2.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-NC-2.5", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/CC-BY-NC-2.5.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-NC-3.0", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/CC-BY-NC-3.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-NC-4.0", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/CC-BY-NC-4.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-NC-ND-1.0", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/CC-BY-NC-ND-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-NC-ND-2.0", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/CC-BY-NC-ND-2.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-NC-ND-2.5", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/CC-BY-NC-ND-2.5.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-NC-ND-3.0", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/CC-BY-NC-ND-3.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-NC-ND-4.0", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/CC-BY-NC-ND-4.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-NC-SA-1.0", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/CC-BY-NC-SA-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-NC-SA-2.0", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/CC-BY-NC-SA-2.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-NC-SA-2.5", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/CC-BY-NC-SA-2.5.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-NC-SA-3.0", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/CC-BY-NC-SA-3.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-NC-SA-4.0", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/CC-BY-NC-SA-4.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-ND", + conditions: ["restricted"], +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-ND-1.0", + conditions: ["restricted"], + url: "https://spdx.org/licenses/CC-BY-ND-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-ND-2.0", + conditions: ["restricted"], + url: "https://spdx.org/licenses/CC-BY-ND-2.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-ND-2.5", + conditions: ["restricted"], + url: "https://spdx.org/licenses/CC-BY-ND-2.5.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-ND-3.0", + conditions: ["restricted"], + url: "https://spdx.org/licenses/CC-BY-ND-3.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-ND-4.0", + conditions: ["restricted"], + url: "https://spdx.org/licenses/CC-BY-ND-4.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-SA", + conditions: ["restricted"], +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-SA-1.0", + conditions: ["restricted"], + url: "https://spdx.org/licenses/CC-BY-SA-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-SA-2.0", + conditions: ["restricted"], + url: "https://spdx.org/licenses/CC-BY-SA-2.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-SA-2.5", + conditions: ["restricted"], + url: "https://spdx.org/licenses/CC-BY-SA-2.5.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-SA-3.0", + conditions: ["restricted"], + url: "https://spdx.org/licenses/CC-BY-SA-3.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-SA-4.0", + conditions: ["restricted"], + url: "https://spdx.org/licenses/CC-BY-SA-4.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CC-BY-SA-ND", + conditions: ["restricted"], +} + +license_kind { + name: "SPDX-license-identifier-CC0-1.0", + conditions: ["unencumbered"], + url: "https://spdx.org/licenses/CC0-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CDDL", + conditions: ["reciprocal"], +} + +license_kind { + name: "SPDX-license-identifier-CDDL-1.0", + conditions: ["reciprocal"], + url: "https://spdx.org/licenses/CDLL-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CDDL-1.1", + conditions: ["reciprocal"], + url: "https://spdx.org/licenses/CDLL-1.1.html", +} + +license_kind { + name: "SPDX-license-identifier-CPAL-1.0", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/CPAL-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-CPL-1.0", + conditions: ["reciprocal"], + url: "https://spdx.org/licenses/CPL-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-EPL", + conditions: ["reciprocal"], +} + +license_kind { + name: "SPDX-license-identifier-EPL-1.0", + conditions: ["reciprocal"], + url: "https://spdx.org/licenses/EPL-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-EPL-2.0", + conditions: ["reciprocal"], + url: "https://spdx.org/licenses/EPL-2.0.html", +} + +license_kind { + name: "SPDX-license-identifier-EUPL", + conditions: [ + "by_exception_only", + "not_allowed", + ], +} + +license_kind { + name: "SPDX-license-identifier-EUPL-1.0", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/EUPL-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-EUPL-1.1", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/EUPL-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-EUPL-1.2", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/EUPL-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-FSFAP", + conditions: ["notice"], + url: "https://spdx.org/licenses/FSFAP", +} + +license_kind { + name: "SPDX-license-identifier-FTL", + conditions: ["notice"], + url: "https://spdx.org/licenses/FTL.html", +} + +license_kind { + name: "SPDX-license-identifier-GFDL", + conditions: ["by_exception_only"], +} + +license_kind { + name: "SPDX-license-identifier-GPL", + conditions: ["restricted"], +} + +license_kind { + name: "SPDX-license-identifier-GPL-1.0", + conditions: ["restricted"], + url: "https://spdx.org/licenses/GPL-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-GPL-1.0+", + conditions: ["restricted"], + url: "https://spdx.org/licenses/GPL-1.0+.html", +} + +license_kind { + name: "SPDX-license-identifier-GPL-1.0-only", + conditions: ["restricted"], + url: "https://spdx.org/licenses/GPL-1.0-only.html", +} + +license_kind { + name: "SPDX-license-identifier-GPL-1.0-or-later", + conditions: ["restricted"], + url: "https://spdx.org/licenses/GPL-1.0-or-later.html", +} + +license_kind { + name: "SPDX-license-identifier-GPL-2.0", + conditions: ["restricted"], + url: "https://spdx.org/licenses/GPL-2.0.html", +} + +license_kind { + name: "SPDX-license-identifier-GPL-2.0+", + conditions: ["restricted"], + url: "https://spdx.org/licenses/GPL-2.0+.html", +} + +license_kind { + name: "SPDX-license-identifier-GPL-2.0-only", + conditions: ["restricted"], + url: "https://spdx.org/licenses/GPL-2.0-only.html", +} + +license_kind { + name: "SPDX-license-identifier-GPL-2.0-or-later", + conditions: ["restricted"], + url: "https://spdx.org/licenses/GPL-2.0-or-later.html", +} + +license_kind { + name: "SPDX-license-identifier-GPL-2.0-with-GCC-exception", + conditions: ["restricted"], + url: "https://spdx.org/licenses/GPL-2.0-with-GCC-exception.html", +} + +license_kind { + name: "SPDX-license-identifier-GPL-2.0-with-autoconf-exception", + conditions: ["restricted"], + url: "https://spdx.org/licenses/GPL-2.0-with-autoconf-exception.html", +} + +license_kind { + name: "SPDX-license-identifier-GPL-2.0-with-bison-exception", + conditions: ["restricted"], + url: "https://spdx.org/licenses/GPL-2.0-with-bison-exception.html", +} + +license_kind { + name: "SPDX-license-identifier-GPL-2.0-with-classpath-exception", + conditions: ["restricted"], + url: "https://spdx.org/licenses/GPL-2.0-with-classpath-exception.html", +} + +license_kind { + name: "SPDX-license-identifier-GPL-2.0-with-font-exception", + conditions: ["restricted"], + url: "https://spdx.org/licenses/GPL-2.0-with-font-exception.html", +} + +license_kind { + name: "SPDX-license-identifier-GPL-3.0", + conditions: ["restricted"], + url: "https://spdx.org/licenses/GPL-3.0.html", +} + +license_kind { + name: "SPDX-license-identifier-GPL-3.0+", + conditions: ["restricted"], + url: "https://spdx.org/licenses/GPL-3.0+.html", +} + +license_kind { + name: "SPDX-license-identifier-GPL-3.0-only", + conditions: ["restricted"], + url: "https://spdx.org/licenses/GPL-3.0-only.html", +} + +license_kind { + name: "SPDX-license-identifier-GPL-3.0-or-later", + conditions: ["restricted"], + url: "https://spdx.org/licenses/GPL-3.0-or-later.html", +} + +license_kind { + name: "SPDX-license-identifier-GPL-3.0-with-GCC-exception", + conditions: ["restricted"], + url: "https://spdx.org/licenses/GPL-3.0-with-GCC-exception.html", +} + +license_kind { + name: "SPDX-license-identifier-GPL-3.0-with-autoconf-exception", + conditions: ["restricted"], + url: "https://spdx.org/licenses/GPL-3.0-with-autoconf-exception.html", +} + +license_kind { + name: "SPDX-license-identifier-GPL-with-classpath-exception", + conditions: ["restricted"], +} + +license_kind { + name: "SPDX-license-identifier-HPND", + conditions: ["notice"], + url: "https://spdx.org/licenses/HPND.html", +} + +license_kind { + name: "SPDX-license-identifier-ICU", + conditions: ["notice"], + url: "https://spdx.org/licenses/ICU.html", +} + +license_kind { + name: "SPDX-license-identifier-ISC", + conditions: ["notice"], + url: "https://spdx.org/licenses/ISC.html", +} + +license_kind { + name: "SPDX-license-identifier-JSON", + conditions: ["notice"], + url: "https://spdx.org/licenses/JSON.html", +} + +license_kind { + name: "SPDX-license-identifier-LGPL", + conditions: ["restricted"], +} + +license_kind { + name: "SPDX-license-identifier-LGPL-2.0", + conditions: ["restricted"], + url: "https://spdx.org/licenses/LGPL-2.0.html", +} + +license_kind { + name: "SPDX-license-identifier-LGPL-2.0+", + conditions: ["restricted"], + url: "https://spdx.org/licenses/LGPL-2.0+.html", +} + +license_kind { + name: "SPDX-license-identifier-LGPL-2.0-only", + conditions: ["restricted"], + url: "https://spdx.org/licenses/LGPL-2.0-only.html", +} + +license_kind { + name: "SPDX-license-identifier-LGPL-2.0-or-later", + conditions: ["restricted"], + url: "https://spdx.org/licenses/LGPL-2.0-or-later.html", +} + +license_kind { + name: "SPDX-license-identifier-LGPL-2.1", + conditions: ["restricted"], + url: "https://spdx.org/licenses/LGPL-2.1.html", +} + +license_kind { + name: "SPDX-license-identifier-LGPL-2.1+", + conditions: ["restricted"], + url: "https://spdx.org/licenses/LGPL-2.1+.html", +} + +license_kind { + name: "SPDX-license-identifier-LGPL-2.1-only", + conditions: ["restricted"], + url: "https://spdx.org/licenses/LGPL-2.1-only.html", +} + +license_kind { + name: "SPDX-license-identifier-LGPL-2.1-or-later", + conditions: ["restricted"], + url: "https://spdx.org/licenses/LGPL-2.1-or-later.html", +} + +license_kind { + name: "SPDX-license-identifier-LGPL-3.0", + conditions: ["restricted"], + url: "https://spdx.org/licenses/LGPL-3.0.html", +} + +license_kind { + name: "SPDX-license-identifier-LGPL-3.0+", + conditions: ["restricted"], + url: "https://spdx.org/licenses/LGPL-3.0+.html", +} + +license_kind { + name: "SPDX-license-identifier-LGPL-3.0-only", + conditions: ["restricted"], + url: "https://spdx.org/licenses/LGPL-3.0-only.html", +} + +license_kind { + name: "SPDX-license-identifier-LGPL-3.0-or-later", + conditions: ["restricted"], + url: "https://spdx.org/licenses/LGPL-3.0-or-later.html", +} + +license_kind { + name: "SPDX-license-identifier-LGPLLR", + conditions: ["restricted"], + url: "https://spdx.org/licenses/LGPLLR.html", +} + +license_kind { + name: "SPDX-license-identifier-LPL-1.02", + conditions: ["notice"], + url: "https://spdx.org/licenses/LPL-1.02.html", +} + +license_kind { + name: "SPDX-license-identifier-MIT", + conditions: ["notice"], +} + +license_kind { + name: "SPDX-license-identifier-MIT-0", + conditions: ["notice"], + url: "https://spdx.org/licenses/MIT-0.html", +} + +license_kind { + name: "SPDX-license-identifier-MIT-CMU", + conditions: ["notice"], + url: "https://spdx.org/licenses/MIT-CMU.html", +} + +license_kind { + name: "SPDX-license-identifier-MIT-advertising", + conditions: ["notice"], + url: "https://spdx.org/licenses/MIT-advertising.html", +} + +license_kind { + name: "SPDX-license-identifier-MIT-enna", + conditions: ["notice"], + url: "https://spdx.org/licenses/MIT-enna.html", +} + +license_kind { + name: "SPDX-license-identifier-MIT-feh", + conditions: ["notice"], + url: "https://spdx.org/licenses/MIT-feh.html", +} + +license_kind { + name: "SPDX-license-identifier-MITNFA", + conditions: ["notice"], + url: "https://spdx.org/licenses/MITNFA.html", +} + +license_kind { + name: "SPDX-license-identifier-MPL", + conditions: ["reciprocal"], +} + +license_kind { + name: "SPDX-license-identifier-MPL-1.0", + conditions: ["reciprocal"], + url: "https://spdx.org/licenses/MPL-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-MPL-1.1", + conditions: ["reciprocal"], + url: "https://spdx.org/licenses/MPL-1.1.html", +} + +license_kind { + name: "SPDX-license-identifier-MPL-2.0", + conditions: ["reciprocal"], + url: "https://spdx.org/licenses/MPL-2.0.html", +} + +license_kind { + name: "SPDX-license-identifier-MPL-2.0-no-copyleft-exception", + conditions: ["reciprocal"], + url: "https://spdx.org/licenses/MPL-2.0-no-copyleft-exception.html", +} + +license_kind { + name: "SPDX-license-identifier-MS-PL", + conditions: ["notice"], + url: "https://spdx.org/licenses/MS-PL.html", +} + +license_kind { + name: "SPDX-license-identifier-MS-RL", + conditions: ["by_exception_only"], + url: "https://spdx.org/licenses/MS-RL.html", +} + +license_kind { + name: "SPDX-license-identifier-NCSA", + conditions: ["notice"], + url: "https://spdx.org/licenses/NCSA.html", +} + +license_kind { + name: "SPDX-license-identifier-OFL", + conditions: ["by_exception_only"], +} + +license_kind { + name: "SPDX-license-identifier-OFL-1.0", + conditions: ["by_exception_only"], + url: "https://spdx.org/licenses/OFL-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-OFL-1.0-RFN", + conditions: ["by_exception_only"], + url: "https://spdx.org/licenses/OFL-1.0-RFN.html", +} + +license_kind { + name: "SPDX-license-identifier-OFL-1.0-no-RFN", + conditions: ["by_exception_only"], + url: "https://spdx.org/licenses/OFL-1.0-no-RFN.html", +} + +license_kind { + name: "SPDX-license-identifier-OFL-1.1", + conditions: ["by_exception_only"], + url: "https://spdx.org/licenses/OFL-1.1.html", +} + +license_kind { + name: "SPDX-license-identifier-OFL-1.1-RFN", + conditions: ["by_exception_only"], + url: "https://spdx.org/licenses/OFL-1.1-RFN.html", +} + +license_kind { + name: "SPDX-license-identifier-OFL-1.1-no-RFN", + conditions: ["by_exception_only"], + url: "https://spdx.org/licenses/OFL-1.1-no-RFN.html", +} + +license_kind { + name: "SPDX-license-identifier-OpenSSL", + conditions: ["notice"], + url: "https://spdx.org/licenses/OpenSSL.html", +} + +license_kind { + name: "SPDX-license-identifier-PSF-2.0", + conditions: ["notice"], + url: "https://spdx.org/licenses/PSF-2.0.html", +} + +license_kind { + name: "SPDX-license-identifier-SISSL", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/SISSL.html", +} + +license_kind { + name: "SPDX-license-identifier-SISSL-1.2", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/SISSL-1.2.html", +} + +license_kind { + name: "SPDX-license-identifier-SPL-1.0", + conditions: [ + "by_exception_only", + "reciprocal", + ], + url: "https://spdx.org/licenses/SPL-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-SSPL", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/SSPL.html", +} + +license_kind { + name: "SPDX-license-identifier-UPL-1.0", + conditions: ["notice"], + url: "https://spdx.org/licenses/UPL-1.-.html", +} + +license_kind { + name: "SPDX-license-identifier-Unicode-DFS", + conditions: ["notice"], +} + +license_kind { + name: "SPDX-license-identifier-Unicode-DFS-2015", + conditions: ["notice"], + url: "https://spdx.org/licenses/Unicode-DFS-2015.html", +} + +license_kind { + name: "SPDX-license-identifier-Unicode-DFS-2016", + conditions: ["notice"], + url: "https://spdx.org/licenses/Unicode-DFS-2016.html", +} + +license_kind { + name: "SPDX-license-identifier-Unlicense", + conditions: ["unencumbered"], + url: "https://spdx.org/licenses/Unlicense.html", +} + +license_kind { + name: "SPDX-license-identifier-W3C", + conditions: ["notice"], + url: "https://spdx.org/licenses/W3C.html", +} + +license_kind { + name: "SPDX-license-identifier-W3C-19980720", + conditions: ["notice"], + url: "https://spdx.org/licenses/W3C-19980720.html", +} + +license_kind { + name: "SPDX-license-identifier-W3C-20150513", + conditions: ["notice"], + url: "https://spdx.org/licenses/W3C-20150513.html", +} + +license_kind { + name: "SPDX-license-identifier-WTFPL", + conditions: ["notice"], + url: "https://spdx.org/licenses/WTFPL.html", +} + +license_kind { + name: "SPDX-license-identifier-Watcom-1.0", + conditions: [ + "by_exception_only", + "not_allowed", + ], + url: "https://spdx.org/licenses/Watcom-1.0.html", +} + +license_kind { + name: "SPDX-license-identifier-Xnet", + conditions: ["notice"], + url: "https://spdx.org/licenses/Xnet.html", +} + +license_kind { + name: "SPDX-license-identifier-ZPL", + conditions: ["notice"], +} + +license_kind { + name: "SPDX-license-identifier-ZPL-1.1", + conditions: ["notice"], + url: "https://spdx.org/licenses/ZPL-1.1.html", +} + +license_kind { + name: "SPDX-license-identifier-ZPL-2.0", + conditions: ["notice"], + url: "https://spdx.org/licenses/ZPL-2.0.html", +} + +license_kind { + name: "SPDX-license-identifier-ZPL-2.1", + conditions: ["notice"], + url: "https://spdx.org/licenses/ZPL-2.1.html", +} + +license_kind { + name: "SPDX-license-identifier-Zend-2.0", + conditions: ["notice"], + url: "https://spdx.org/licenses/Zend-2.0.html", +} + +license_kind { + name: "SPDX-license-identifier-Zlib", + conditions: ["notice"], + url: "https://spdx.org/licenses/Zlib.html", +} + +license_kind { + name: "SPDX-license-identifier-libtiff", + conditions: ["notice"], + url: "https://spdx.org/licenses/libtiff.html", +} + +// Legacy license kinds -- do not add new references -- use an spdx kind instead. +license_kind { + name: "legacy_unknown", + conditions: ["by_exception_only"], +} + +license_kind { + name: "legacy_unencumbered", + conditions: ["unencumbered"], +} + +license_kind { + name: "legacy_permissive", + conditions: ["permissive"], +} + +license_kind { + name: "legacy_notice", + conditions: ["notice"], +} + +license_kind { + name: "legacy_reciprocal", + conditions: ["reciprocal"], +} + +license_kind { + name: "legacy_restricted", + conditions: ["restricted"], +} + +license_kind { + name: "legacy_by_exception_only", + conditions: ["by_exception_only"], +} + +license_kind { + name: "legacy_not_a_contribution", + conditions: [ + "by_exception_only", + "not_allowed", + ], +} + +license_kind { + name: "legacy_not_allowed", + conditions: [ + "by_exception_only", + "not_allowed", + ], +} + +license_kind { + name: "legacy_proprietary", + conditions: [ + "by_exception_only", + "not_allowed", + "proprietary", + ], +} diff --git a/licenses/LICENSE b/licenses/LICENSE new file mode 100644 index 000000000..dae04065f --- /dev/null +++ b/licenses/LICENSE @@ -0,0 +1,214 @@ + + Copyright (c) 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. + + 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. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/python/python.go b/python/python.go index 4e15d3a07..83ce42d02 100644 --- a/python/python.go +++ b/python/python.go @@ -251,6 +251,18 @@ func (p *Module) HostToolPath() android.OptionalPath { return android.OptionalPathForPath(p.installer.(*binaryDecorator).path) } +func (p *Module) OutputFiles(tag string) (android.Paths, error) { + switch tag { + case "": + if outputFile := p.installSource; outputFile.Valid() { + return android.Paths{outputFile.Path()}, nil + } + return android.Paths{}, nil + default: + return nil, fmt.Errorf("unsupported module reference tag %q", tag) + } +} + func (p *Module) isEmbeddedLauncherEnabled(actual_version string) bool { switch actual_version { case pyVersion2: diff --git a/scripts/check_do_not_merge.sh b/scripts/check_do_not_merge.sh new file mode 100755 index 000000000..ad6a0a969 --- /dev/null +++ b/scripts/check_do_not_merge.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# Copyright (C) 2021 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. + +if git show -s --format=%s $1 | grep -qE '(DO NOT MERGE)|(RESTRICT AUTOMERGE)'; then + cat >&2 <<EOF +DO NOT MERGE and RESTRICT AUTOMERGE very often lead to unintended results +and are not allowed to be used in this project. +Please use the Merged-In tag to be more explicit about where this change +should merge to. Google-internal documentation exists at go/merged-in + +If this check is mis-triggering or you know Merged-In is incorrect in this +situation you can bypass this check with \`repo upload --no-verify\`. +EOF + exit 1 +fi diff --git a/scripts/gen_ndk_backedby_apex.sh b/scripts/gen_ndk_backedby_apex.sh index e0da60236..4abaaba41 100755 --- a/scripts/gen_ndk_backedby_apex.sh +++ b/scripts/gen_ndk_backedby_apex.sh @@ -23,33 +23,50 @@ printHelp() { echo "**************************** Usage Instructions ****************************" echo "This script is used to generate the Mainline modules backed-by NDK symbols." echo "" - echo "To run this script use: ./ndk_backedby_module.sh \$BINARY_IMAGE_DIRECTORY \$OUTPUT_FILE_PATH \$NDK_LIB_NAME_LIST" - echo "For example: If all the module image files that you would like to run is under directory '/myModule' and output write to /backedby.txt then the command would be:" - echo "./ndk_usedby_module.sh /myModule /backedby.txt /ndkLibList.txt" + echo "To run this script use: ./gen_ndk_backed_by_apex.sh \$OUTPUT_FILE_PATH \$NDK_LIB_NAME_LIST \$MODULE_LIB1 \$MODULE_LIB2..." + echo "For example: If output write to /backedby.txt then the command would be:" + echo "./gen_ndk_backed_by_apex.sh /backedby.txt /ndkLibList.txt lib1.so lib2.so" echo "If the module1 is backing lib1 then the backedby.txt would contains: " echo "lib1" } +contains() { + val="$1" + shift + for x in "$@"; do + if [ "$x" = "$val" ]; then + return 0 + fi + done + return 1 +} + + genBackedByList() { - dir="$1" - [[ ! -e "$2" ]] && echo "" >> "$2" + out="$1" + shift + ndk_list="$1" + shift + rm -f "$out" + touch "$out" while IFS= read -r line do soFileName=$(echo "$line" | sed 's/\(.*so\).*/\1/') if [[ ! -z "$soFileName" && "$soFileName" != *"#"* ]] then - find "$dir" -type f -name "$soFileName" -exec echo "$soFileName" >> "$2" \; + if contains "$soFileName" "$@"; then + echo "$soFileName" >> "$out" + fi fi - done < "$3" + done < "$ndk_list" } if [[ "$1" == "help" ]] then printHelp -elif [[ "$#" -ne 3 ]] +elif [[ "$#" -lt 2 ]] then - echo "Wrong argument length. Expecting 3 argument representing image file directory, output path, path to ndk library list." + echo "Wrong argument length. Expecting at least 2 argument representing output path, path to ndk library list, followed by a list of libraries in the Mainline module." else - [[ -e "$2" ]] && rm "$2" - genBackedByList "$1" "$2" "$3" + genBackedByList "$@" fi diff --git a/scripts/update-apex-allowed-deps.sh b/scripts/update-apex-allowed-deps.sh deleted file mode 100755 index 872d74670..000000000 --- a/scripts/update-apex-allowed-deps.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash -e -# -# The script to run locally to re-generate global allowed list of dependencies -# for updatable modules. - -if [ ! -e "build/envsetup.sh" ]; then - echo "ERROR: $0 must be run from the top of the tree" - exit 1 -fi - -source build/envsetup.sh > /dev/null || exit 1 - -readonly OUT_DIR=$(get_build_var OUT_DIR) - -readonly ALLOWED_DEPS_FILE="build/soong/apex/allowed_deps.txt" -readonly NEW_ALLOWED_DEPS_FILE="${OUT_DIR}/soong/apex/depsinfo/new-allowed-deps.txt" - -# If the script is run after droidcore failure, ${NEW_ALLOWED_DEPS_FILE} -# should already be built. If running the script manually, make sure it exists. -m "${NEW_ALLOWED_DEPS_FILE}" -j - -cat > "${ALLOWED_DEPS_FILE}" << EndOfFileComment -# A list of allowed dependencies for all updatable modules. -# -# The list tracks all direct and transitive dependencies that end up within any -# of the updatable binaries; specifically excluding external dependencies -# required to compile those binaries. This prevents potential regressions in -# case a new dependency is not aware of the different functional and -# non-functional requirements being part of an updatable module, for example -# setting correct min_sdk_version. -# -# To update the list, run: -# repo-root$ build/soong/scripts/update-apex-allowed-deps.sh -# -# See go/apex-allowed-deps-error for more details. -# TODO(b/157465465): introduce automated quality signals and remove this list. -EndOfFileComment - -cat "${NEW_ALLOWED_DEPS_FILE}" >> "${ALLOWED_DEPS_FILE}" diff --git a/sh/Android.bp b/sh/Android.bp index 0f40c5f68..e5ffeefb4 100644 --- a/sh/Android.bp +++ b/sh/Android.bp @@ -5,6 +5,7 @@ bootstrap_go_package { "blueprint", "soong", "soong-android", + "soong-cc", "soong-tradefed", ], srcs: [ diff --git a/sh/sh_binary.go b/sh/sh_binary.go index d8e324409..5272d41a7 100644 --- a/sh/sh_binary.go +++ b/sh/sh_binary.go @@ -17,11 +17,14 @@ package sh import ( "fmt" "path/filepath" + "sort" "strings" + "github.com/google/blueprint" "github.com/google/blueprint/proptools" "android/soong/android" + "android/soong/cc" "android/soong/tradefed" ) @@ -88,6 +91,20 @@ type TestProperties struct { // doesn't exist next to the Android.bp, this attribute doesn't need to be set to true // explicitly. Auto_gen_config *bool + + // list of binary modules that should be installed alongside the test + Data_bins []string `android:"path,arch_variant"` + + // list of library modules that should be installed alongside the test + Data_libs []string `android:"path,arch_variant"` + + // list of device binary modules that should be installed alongside the test. + // Only available for host sh_test modules. + Data_device_bins []string `android:"path,arch_variant"` + + // list of device library modules that should be installed alongside the test. + // Only available for host sh_test modules. + Data_device_libs []string `android:"path,arch_variant"` } type ShBinary struct { @@ -109,6 +126,8 @@ type ShTest struct { data android.Paths testConfig android.Path + + dataModules map[string]android.Path } func (s *ShBinary) HostToolPath() android.OptionalPath { @@ -190,6 +209,50 @@ func (s *ShBinary) customAndroidMkEntries(entries *android.AndroidMkEntries) { } } +type dependencyTag struct { + blueprint.BaseDependencyTag + name string +} + +var ( + shTestDataBinsTag = dependencyTag{name: "dataBins"} + shTestDataLibsTag = dependencyTag{name: "dataLibs"} + shTestDataDeviceBinsTag = dependencyTag{name: "dataDeviceBins"} + shTestDataDeviceLibsTag = dependencyTag{name: "dataDeviceLibs"} +) + +var sharedLibVariations = []blueprint.Variation{{Mutator: "link", Variation: "shared"}} + +func (s *ShTest) DepsMutator(ctx android.BottomUpMutatorContext) { + s.ShBinary.DepsMutator(ctx) + + ctx.AddFarVariationDependencies(ctx.Target().Variations(), shTestDataBinsTag, s.testProperties.Data_bins...) + ctx.AddFarVariationDependencies(append(ctx.Target().Variations(), sharedLibVariations...), + shTestDataLibsTag, s.testProperties.Data_libs...) + if ctx.Target().Os.Class == android.Host && len(ctx.Config().Targets[android.Android]) > 0 { + deviceVariations := ctx.Config().Targets[android.Android][0].Variations() + ctx.AddFarVariationDependencies(deviceVariations, shTestDataDeviceBinsTag, s.testProperties.Data_device_bins...) + ctx.AddFarVariationDependencies(append(deviceVariations, sharedLibVariations...), + shTestDataDeviceLibsTag, s.testProperties.Data_device_libs...) + } else if ctx.Target().Os.Class != android.Host { + if len(s.testProperties.Data_device_bins) > 0 { + ctx.PropertyErrorf("data_device_bins", "only available for host modules") + } + if len(s.testProperties.Data_device_libs) > 0 { + ctx.PropertyErrorf("data_device_libs", "only available for host modules") + } + } +} + +func (s *ShTest) addToDataModules(ctx android.ModuleContext, relPath string, path android.Path) { + if _, exists := s.dataModules[relPath]; exists { + ctx.ModuleErrorf("data modules have a conflicting installation path, %v - %s, %s", + relPath, s.dataModules[relPath].String(), path.String()) + return + } + s.dataModules[relPath] = path +} + func (s *ShTest) GenerateAndroidBuildActions(ctx android.ModuleContext) { s.ShBinary.generateAndroidBuildActions(ctx) testDir := "nativetest" @@ -215,6 +278,43 @@ func (s *ShTest) GenerateAndroidBuildActions(ctx android.ModuleContext) { } s.testConfig = tradefed.AutoGenShellTestConfig(ctx, s.testProperties.Test_config, s.testProperties.Test_config_template, s.testProperties.Test_suites, configs, s.testProperties.Auto_gen_config, s.outputFilePath.Base()) + + s.dataModules = make(map[string]android.Path) + ctx.VisitDirectDeps(func(dep android.Module) { + depTag := ctx.OtherModuleDependencyTag(dep) + switch depTag { + case shTestDataBinsTag, shTestDataDeviceBinsTag: + path := android.OutputFileForModule(ctx, dep, "") + s.addToDataModules(ctx, path.Base(), path) + case shTestDataLibsTag, shTestDataDeviceLibsTag: + if cc, isCc := dep.(*cc.Module); isCc { + // Copy to an intermediate output directory to append "lib[64]" to the path, + // so that it's compatible with the default rpath values. + var relPath string + if cc.Arch().ArchType.Multilib == "lib64" { + relPath = filepath.Join("lib64", cc.OutputFile().Path().Base()) + } else { + relPath = filepath.Join("lib", cc.OutputFile().Path().Base()) + } + if _, exist := s.dataModules[relPath]; exist { + return + } + relocatedLib := android.PathForModuleOut(ctx, "relocated", relPath) + ctx.Build(pctx, android.BuildParams{ + Rule: android.Cp, + Input: cc.OutputFile().Path(), + Output: relocatedLib, + }) + s.addToDataModules(ctx, relPath, relocatedLib) + return + } + property := "data_libs" + if depTag == shTestDataDeviceBinsTag { + property = "data_device_libs" + } + ctx.PropertyErrorf(property, "%q of type %q is not supported", dep.Name(), ctx.OtherModuleType(dep)) + } + }) } func (s *ShTest) InstallInData() bool { @@ -242,6 +342,15 @@ func (s *ShTest) AndroidMkEntries() []android.AndroidMkEntries { path = strings.TrimSuffix(path, rel) entries.AddStrings("LOCAL_TEST_DATA", path+":"+rel) } + relPaths := make([]string, 0) + for relPath, _ := range s.dataModules { + relPaths = append(relPaths, relPath) + } + sort.Strings(relPaths) + for _, relPath := range relPaths { + dir := strings.TrimSuffix(s.dataModules[relPath].String(), relPath) + entries.AddStrings("LOCAL_TEST_DATA", dir+":"+relPath) + } }, }, }} diff --git a/sh/sh_binary_test.go b/sh/sh_binary_test.go index 6c0d96abe..232a28133 100644 --- a/sh/sh_binary_test.go +++ b/sh/sh_binary_test.go @@ -3,10 +3,12 @@ package sh import ( "io/ioutil" "os" + "path/filepath" "reflect" "testing" "android/soong/android" + "android/soong/cc" ) var buildDir string @@ -46,6 +48,9 @@ func testShBinary(t *testing.T, bp string) (*android.TestContext, android.Config ctx := android.NewTestArchContext() ctx.RegisterModuleType("sh_test", ShTestFactory) ctx.RegisterModuleType("sh_test_host", ShTestHostFactory) + + cc.RegisterRequiredBuildComponentsForTest(ctx) + ctx.Register(config) _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) android.FailIfErrored(t, errs) @@ -78,6 +83,65 @@ func TestShTestTestData(t *testing.T) { } } +func TestShTest_dataModules(t *testing.T) { + ctx, config := testShBinary(t, ` + sh_test { + name: "foo", + src: "test.sh", + host_supported: true, + data_bins: ["bar"], + data_libs: ["libbar"], + } + + cc_binary { + name: "bar", + host_supported: true, + shared_libs: ["libbar"], + no_libcrt: true, + nocrt: true, + system_shared_libs: [], + stl: "none", + } + + cc_library { + name: "libbar", + host_supported: true, + no_libcrt: true, + nocrt: true, + system_shared_libs: [], + stl: "none", + } + `) + + buildOS := android.BuildOs.String() + arches := []string{"android_arm64_armv8-a", buildOS + "_x86_64"} + for _, arch := range arches { + variant := ctx.ModuleForTests("foo", arch) + + libExt := ".so" + if arch == "darwin_x86_64" { + libExt = ".dylib" + } + relocated := variant.Output("relocated/lib64/libbar" + libExt) + expectedInput := filepath.Join(buildDir, ".intermediates/libbar/"+arch+"_shared/libbar"+libExt) + if relocated.Input.String() != expectedInput { + t.Errorf("Unexpected relocation input, expected: %q, actual: %q", + expectedInput, relocated.Input.String()) + } + + mod := variant.Module().(*ShTest) + entries := android.AndroidMkEntriesForTest(t, config, "", mod)[0] + expectedData := []string{ + filepath.Join(buildDir, ".intermediates/bar", arch, ":bar"), + filepath.Join(buildDir, ".intermediates/foo", arch, "relocated/:lib64/libbar"+libExt), + } + actualData := entries.EntryMap["LOCAL_TEST_DATA"] + if !reflect.DeepEqual(expectedData, actualData) { + t.Errorf("Unexpected test data, expected: %q, actual: %q", expectedData, actualData) + } + } +} + func TestShTestHost(t *testing.T) { ctx, _ := testShBinary(t, ` sh_test_host { @@ -97,3 +161,53 @@ func TestShTestHost(t *testing.T) { t.Errorf("host bit is not set for a sh_test_host module.") } } + +func TestShTestHost_dataDeviceModules(t *testing.T) { + ctx, config := testShBinary(t, ` + sh_test_host { + name: "foo", + src: "test.sh", + data_device_bins: ["bar"], + data_device_libs: ["libbar"], + } + + cc_binary { + name: "bar", + shared_libs: ["libbar"], + no_libcrt: true, + nocrt: true, + system_shared_libs: [], + stl: "none", + } + + cc_library { + name: "libbar", + no_libcrt: true, + nocrt: true, + system_shared_libs: [], + stl: "none", + } + `) + + buildOS := android.BuildOs.String() + variant := ctx.ModuleForTests("foo", buildOS+"_x86_64") + + relocated := variant.Output("relocated/lib64/libbar.so") + expectedInput := filepath.Join(buildDir, ".intermediates/libbar/android_arm64_armv8-a_shared/libbar.so") + if relocated.Input.String() != expectedInput { + t.Errorf("Unexpected relocation input, expected: %q, actual: %q", + expectedInput, relocated.Input.String()) + } + + mod := variant.Module().(*ShTest) + entries := android.AndroidMkEntriesForTest(t, config, "", mod)[0] + expectedData := []string{ + filepath.Join(buildDir, ".intermediates/bar/android_arm64_armv8-a/:bar"), + // libbar has been relocated, and so has a variant that matches the host arch. + filepath.Join(buildDir, ".intermediates/foo/"+buildOS+"_x86_64/relocated/:lib64/libbar.so"), + } + actualData := entries.EntryMap["LOCAL_TEST_DATA"] + if !reflect.DeepEqual(expectedData, actualData) { + t.Errorf("Unexpected test data, expected: %q, actual: %q", expectedData, actualData) + } +} |