diff options
Diffstat (limited to 'cc')
| -rw-r--r-- | cc/cc.go | 40 | ||||
| -rw-r--r-- | cc/cc_test.go | 28 | ||||
| -rw-r--r-- | cc/compiler.go | 15 | ||||
| -rw-r--r-- | cc/library.go | 43 | ||||
| -rw-r--r-- | cc/llndk_library.go | 13 | ||||
| -rw-r--r-- | cc/vndk.go | 3 |
6 files changed, 116 insertions, 26 deletions
@@ -622,6 +622,10 @@ func (c *Module) SetBuildStubs() { c.Properties.PreventInstall = true return } + if _, ok := c.linker.(*llndkStubDecorator); ok { + c.Properties.HideFromMake = true + return + } } panic(fmt.Errorf("SetBuildStubs called on non-library module: %q", c.BaseModuleName())) } @@ -641,6 +645,10 @@ func (c *Module) SetStubsVersions(version string) { library.MutatedProperties.StubsVersion = version return } + if llndk, ok := c.linker.(*llndkStubDecorator); ok { + llndk.libraryDecorator.MutatedProperties.StubsVersion = version + return + } } panic(fmt.Errorf("SetStubsVersions called on non-library module: %q", c.BaseModuleName())) } @@ -650,6 +658,9 @@ func (c *Module) StubsVersion() string { if library, ok := c.linker.(*libraryDecorator); ok { return library.MutatedProperties.StubsVersion } + if llndk, ok := c.linker.(*llndkStubDecorator); ok { + return llndk.libraryDecorator.MutatedProperties.StubsVersion + } } panic(fmt.Errorf("StubsVersion called on non-library module: %q", c.BaseModuleName())) } @@ -1851,7 +1862,7 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) { addSharedLibDependencies := func(depTag DependencyTag, name string, version string) { var variations []blueprint.Variation variations = append(variations, blueprint.Variation{Mutator: "link", Variation: "shared"}) - versionVariantAvail := !ctx.useVndk() && !c.InRecovery() && !c.InRamdisk() + versionVariantAvail := !c.InRecovery() && !c.InRamdisk() if version != "" && versionVariantAvail { // Version is explicitly specified. i.e. libFoo#30 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version}) @@ -2186,13 +2197,17 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { if depTag == android.ProtoPluginDepTag { return } + if depTag == llndkImplDep { + return + } if dep.Target().Os != ctx.Os() { ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName) return } if dep.Target().Arch.ArchType != ctx.Arch().ArchType { - ctx.ModuleErrorf("Arch mismatch between %q and %q", ctx.ModuleName(), depName) + ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)", + ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType) return } @@ -2287,6 +2302,27 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { return // stop processing this dep } } + if c.UseVndk() { + if m, ok := ccDep.(*Module); ok && m.IsStubs() { // LLNDK + // by default, use current version of LLNDK + versionToUse := "" + versions := stubsVersionsFor(ctx.Config())[depName] + if c.ApexName() != "" && len(versions) > 0 { + // if this is for use_vendor apex && dep has stubsVersions + // apply the same rule of apex sdk enforcement to choose right version + var err error + useLatest := c.ShouldSupportAndroid10() && !ctx.Config().UnbundledBuild() + versionToUse, err = c.ChooseSdkVersion(versions, useLatest) + if err != nil { + ctx.OtherModuleErrorf(dep, err.Error()) + return + } + } + if versionToUse != ccDep.StubsVersion() { + return + } + } + } depPaths.IncludeDirs = append(depPaths.IncludeDirs, ccDep.IncludeDirs()...) diff --git a/cc/cc_test.go b/cc/cc_test.go index 9a9678f1d..67eb248d2 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -2398,6 +2398,34 @@ func checkEquals(t *testing.T, message string, expected, actual interface{}) { } } +func TestLlndkLibrary(t *testing.T) { + ctx := testCc(t, ` + cc_library { + name: "libllndk", + stubs: { versions: ["1", "2"] }, + } + llndk_library { + name: "libllndk", + } + `) + actual := ctx.ModuleVariantsForTests("libllndk.llndk") + expected := []string{ + "android_vendor.VER_arm64_armv8-a_shared", + "android_vendor.VER_arm64_armv8-a_shared_1", + "android_vendor.VER_arm64_armv8-a_shared_2", + "android_vendor.VER_arm_armv7-a-neon_shared", + "android_vendor.VER_arm_armv7-a-neon_shared_1", + "android_vendor.VER_arm_armv7-a-neon_shared_2", + } + checkEquals(t, "variants for llndk stubs", expected, actual) + + params := ctx.ModuleForTests("libllndk.llndk", "android_vendor.VER_arm_armv7-a-neon_shared").Description("generate stub") + checkEquals(t, "use VNDK version for default stubs", "current", params.Args["apiLevel"]) + + params = ctx.ModuleForTests("libllndk.llndk", "android_vendor.VER_arm_armv7-a-neon_shared_1").Description("generate stub") + checkEquals(t, "override apiLevel for versioned stubs", "1", params.Args["apiLevel"]) +} + func TestLlndkHeaders(t *testing.T) { ctx := testCc(t, ` llndk_headers { diff --git a/cc/compiler.go b/cc/compiler.go index fe81bd0a4..681b1ab90 100644 --- a/cc/compiler.go +++ b/cc/compiler.go @@ -315,18 +315,6 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags, deps "-isystem "+getCurrentIncludePath(ctx).Join(ctx, config.NDKTriple(tc)).String()) } - if ctx.canUseSdk() { - sdkVersion := ctx.sdkVersion() - if sdkVersion == "" || sdkVersion == "current" { - if ctx.isForPlatform() { - sdkVersion = strconv.Itoa(android.FutureApiLevel) - } else { - sdkVersion = strconv.Itoa(ctx.apexSdkVersion()) - } - } - flags.Global.CommonFlags = append(flags.Global.CommonFlags, "-D__ANDROID_SDK_VERSION__="+sdkVersion) - } - if ctx.useVndk() { flags.Global.CommonFlags = append(flags.Global.CommonFlags, "-D__ANDROID_VNDK__") } @@ -340,6 +328,9 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags, deps if Bool(compiler.Properties.Use_apex_name_macro) { flags.Global.CommonFlags = append(flags.Global.CommonFlags, "-D__ANDROID_APEX_"+makeDefineString(ctx.apexName())+"__") } + if ctx.Device() { + flags.Global.CommonFlags = append(flags.Global.CommonFlags, "-D__ANDROID_SDK_VERSION__="+strconv.Itoa(ctx.apexSdkVersion())) + } } instructionSet := String(compiler.Properties.Instruction_set) diff --git a/cc/library.go b/cc/library.go index 2ced2c5dc..cd64fd1b5 100644 --- a/cc/library.go +++ b/cc/library.go @@ -1502,6 +1502,19 @@ func checkVersions(ctx android.BaseModuleContext, versions []string) { } } +func createVersionVariations(mctx android.BottomUpMutatorContext, versions []string) { + // "" is for the non-stubs variant + versions = append([]string{""}, versions...) + + modules := mctx.CreateVariations(versions...) + for i, m := range modules { + if versions[i] != "" { + m.(LinkableInterface).SetBuildStubs() + m.(LinkableInterface).SetStubsVersions(versions[i]) + } + } +} + // Version mutator splits a module into the mandatory non-stubs variant // (which is unnamed) and zero or more stubs variants. func VersionMutator(mctx android.BottomUpMutatorContext) { @@ -1513,24 +1526,30 @@ func VersionMutator(mctx android.BottomUpMutatorContext) { return } - // save the list of versions for later use stubsVersionsLock.Lock() defer stubsVersionsLock.Unlock() + // save the list of versions for later use stubsVersionsFor(mctx.Config())[mctx.ModuleName()] = versions - // "" is for the non-stubs variant - versions = append([]string{""}, versions...) + createVersionVariations(mctx, versions) + return + } - modules := mctx.CreateVariations(versions...) - for i, m := range modules { - if versions[i] != "" { - m.(LinkableInterface).SetBuildStubs() - m.(LinkableInterface).SetStubsVersions(versions[i]) - } - } - } else { - mctx.CreateVariations("") + if c, ok := library.(*Module); ok && c.IsStubs() { + stubsVersionsLock.Lock() + defer stubsVersionsLock.Unlock() + // For LLNDK llndk_library, we borrow vstubs.ersions from its implementation library. + // Since llndk_library has dependency to its implementation library, + // we can safely access stubsVersionsFor() with its baseModuleName. + versions := stubsVersionsFor(mctx.Config())[c.BaseModuleName()] + // save the list of versions for later use + stubsVersionsFor(mctx.Config())[mctx.ModuleName()] = versions + + createVersionVariations(mctx, versions) + return } + + mctx.CreateVariations("") return } if genrule, ok := mctx.Module().(*genrule.Module); ok { diff --git a/cc/llndk_library.go b/cc/llndk_library.go index 3dee6920a..09050aa34 100644 --- a/cc/llndk_library.go +++ b/cc/llndk_library.go @@ -19,8 +19,14 @@ import ( "strings" "android/soong/android" + + "github.com/google/blueprint" ) +var llndkImplDep = struct { + blueprint.DependencyTag +}{} + var ( llndkLibrarySuffix = ".llndk" llndkHeadersSuffix = ".llndk" @@ -81,6 +87,9 @@ func (stub *llndkStubDecorator) compile(ctx ModuleContext, flags Flags, deps Pat // For non-enforcing devices, vndkVer is empty. Use "current" in that case, too. vndkVer = "current" } + if stub.stubsVersion() != "" { + vndkVer = stub.stubsVersion() + } objs, versionScript := compileStubLibrary(ctx, flags, String(stub.Properties.Symbol_file), vndkVer, "--llndk") stub.versionScriptPath = versionScript return objs @@ -154,6 +163,10 @@ func (stub *llndkStubDecorator) link(ctx ModuleContext, flags Flags, deps PathDe stub.libraryDecorator.flagExporter.Properties.Export_include_dirs = []string{} } + if stub.stubsVersion() != "" { + stub.reexportFlags("-D" + versioningMacroName(ctx.baseModuleName()) + "=" + stub.stubsVersion()) + } + return stub.libraryDecorator.link(ctx, flags, deps, objs) } diff --git a/cc/vndk.go b/cc/vndk.go index e02e7b534..4888dcf07 100644 --- a/cc/vndk.go +++ b/cc/vndk.go @@ -297,6 +297,9 @@ func processLlndkLibrary(mctx android.BottomUpMutatorContext, m *Module) { if !Bool(lib.Properties.Vendor_available) { vndkPrivateLibraries(mctx.Config())[name] = filename } + if mctx.OtherModuleExists(name) { + mctx.AddFarVariationDependencies(m.Target().Variations(), llndkImplDep, name) + } } func processVndkLibrary(mctx android.BottomUpMutatorContext, m *Module) { |