diff options
Diffstat (limited to 'cc/builder.go')
| -rw-r--r-- | cc/builder.go | 475 |
1 files changed, 252 insertions, 223 deletions
diff --git a/cc/builder.go b/cc/builder.go index 98c58dd84..5deb1299e 100644 --- a/cc/builder.go +++ b/cc/builder.go @@ -20,13 +20,12 @@ package cc import ( "fmt" - "os" "path/filepath" "runtime" - "strconv" "strings" "github.com/google/blueprint" + "github.com/google/blueprint/pathtools" "android/soong/android" "android/soong/cc/config" @@ -45,14 +44,6 @@ var ( } ) -func absSrcDir() string { - dir, err := os.Getwd() - if err != nil { - panic(fmt.Errorf("failed to get working directory: %s", err)) - } - return dir -} - var ( pctx = android.NewPackageContext("android/soong/cc") @@ -75,7 +66,7 @@ var ( ld, ldRE = remoteexec.StaticRules(pctx, "ld", blueprint.RuleParams{ Command: "$reTemplate$ldCmd ${crtBegin} @${out}.rsp " + - "${libFlags} ${crtEnd} -o ${out} ${ldFlags}", + "${libFlags} ${crtEnd} -o ${out} ${ldFlags} ${extraLibFlags}", CommandDeps: []string{"$ldCmd"}, Rspfile: "${out}.rsp", RspfileContent: "${in}", @@ -85,27 +76,27 @@ var ( &remoteexec.REParams{ Labels: map[string]string{"type": "link", "tool": "clang"}, ExecStrategy: "${config.RECXXLinksExecStrategy}", - Inputs: []string{"${out}.rsp"}, + Inputs: []string{"${out}.rsp", "$implicitInputs"}, RSPFile: "${out}.rsp", - OutputFiles: []string{"${out}"}, + OutputFiles: []string{"${out}", "$implicitOutputs"}, ToolchainInputs: []string{"$ldCmd"}, Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXLinksPool}"}, - }, []string{"ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags"}, nil) + }, []string{"ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags", "extraLibFlags"}, []string{"implicitInputs", "implicitOutputs"}) partialLd, partialLdRE = remoteexec.StaticRules(pctx, "partialLd", blueprint.RuleParams{ // Without -no-pie, clang 7.0 adds -pie to link Android files, // but -r and -pie cannot be used together. - Command: "$reTemplate$ldCmd -nostdlib -no-pie -Wl,-r ${in} -o ${out} ${ldFlags}", + Command: "$reTemplate$ldCmd -fuse-ld=lld -nostdlib -no-pie -Wl,-r ${in} -o ${out} ${ldFlags}", CommandDeps: []string{"$ldCmd"}, }, &remoteexec.REParams{ Labels: map[string]string{"type": "link", "tool": "clang"}, ExecStrategy: "${config.RECXXLinksExecStrategy}", - Inputs: []string{"$inCommaList"}, - OutputFiles: []string{"${out}"}, + Inputs: []string{"$inCommaList", "$implicitInputs"}, + OutputFiles: []string{"${out}", "$implicitOutputs"}, ToolchainInputs: []string{"$ldCmd"}, Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXLinksPool}"}, - }, []string{"ldCmd", "ldFlags"}, []string{"inCommaList"}) + }, []string{"ldCmd", "ldFlags"}, []string{"implicitInputs", "inCommaList", "implicitOutputs"}) ar = pctx.AndroidStaticRule("ar", blueprint.RuleParams{ @@ -116,20 +107,6 @@ var ( }, "arCmd", "arFlags") - darwinAr = pctx.AndroidStaticRule("darwinAr", - blueprint.RuleParams{ - Command: "rm -f ${out} && ${config.MacArPath} $arFlags $out $in", - CommandDeps: []string{"${config.MacArPath}"}, - }, - "arFlags") - - darwinAppendAr = pctx.AndroidStaticRule("darwinAppendAr", - blueprint.RuleParams{ - Command: "cp -f ${inAr} ${out}.tmp && ${config.MacArPath} $arFlags ${out}.tmp $in && mv ${out}.tmp ${out}", - CommandDeps: []string{"${config.MacArPath}", "${inAr}"}, - }, - "arFlags", "inAr") - darwinStrip = pctx.AndroidStaticRule("darwinStrip", blueprint.RuleParams{ Command: "${config.MacStripPath} -u -r -o $out $in", @@ -168,6 +145,17 @@ var ( }, "args", "crossCompile") + _ = pctx.SourcePathVariable("archiveRepackPath", "build/soong/scripts/archive_repack.sh") + + archiveRepack = pctx.AndroidStaticRule("archiveRepack", + blueprint.RuleParams{ + Depfile: "${out}.d", + Deps: blueprint.DepsGCC, + Command: "CLANG_BIN=${config.ClangBin} $archiveRepackPath -i ${in} -o ${out} -d ${out}.d ${objects}", + CommandDeps: []string{"$archiveRepackPath"}, + }, + "objects") + emptyFile = pctx.AndroidStaticRule("emptyFile", blueprint.RuleParams{ Command: "rm -f $out && touch $out", @@ -187,8 +175,8 @@ var ( clangTidy = pctx.AndroidStaticRule("clangTidy", blueprint.RuleParams{ - Command: "rm -f $out && CLANG_TIDY=${config.ClangBin}/clang-tidy ${config.ClangTidyShellPath} $tidyFlags $in -- $cFlags && touch $out", - CommandDeps: []string{"${config.ClangBin}/clang-tidy", "${config.ClangTidyShellPath}"}, + Command: "rm -f $out && ${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out", + CommandDeps: []string{"${config.ClangBin}/clang-tidy"}, }, "cFlags", "tidyFlags") @@ -205,7 +193,7 @@ var ( windres = pctx.AndroidStaticRule("windres", blueprint.RuleParams{ - Command: "$windresCmd $flags -I$$(dirname $in) -i $in -o $out", + Command: "$windresCmd $flags -I$$(dirname $in) -i $in -o $out --preprocessor \"${config.ClangBin}/clang -E -xc-header -DRC_INVOKED\"", CommandDeps: []string{"$windresCmd"}, }, "windresCmd", "flags") @@ -222,20 +210,28 @@ var ( ExecStrategy: "${config.REAbiDumperExecStrategy}", Platform: map[string]string{ remoteexec.PoolKey: "${config.RECXXPool}", - "InputRootAbsolutePath": absSrcDir(), + "InputRootAbsolutePath": android.AbsSrcDirForExistingUseCases(), }, }, []string{"cFlags", "exportDirs"}, nil) _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker") + _ = pctx.SourcePathVariable("sAbiLinkerLibs", "prebuilts/clang-tools/${config.HostPrebuiltTag}/lib64") - sAbiLink = pctx.AndroidStaticRule("sAbiLink", + sAbiLink, sAbiLinkRE = remoteexec.StaticRules(pctx, "sAbiLink", blueprint.RuleParams{ - Command: "$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ", + Command: "$reTemplate$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ", CommandDeps: []string{"$sAbiLinker"}, Rspfile: "${out}.rsp", RspfileContent: "${in}", - }, - "symbolFilter", "arch", "exportedHeaderFlags") + }, &remoteexec.REParams{ + Labels: map[string]string{"type": "tool", "name": "abi-linker"}, + ExecStrategy: "${config.REAbiLinkerExecStrategy}", + Inputs: []string{"$sAbiLinkerLibs", "${out}.rsp", "$implicitInputs"}, + RSPFile: "${out}.rsp", + OutputFiles: []string{"$out"}, + ToolchainInputs: []string{"$sAbiLinker"}, + Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXPool}"}, + }, []string{"symbolFilter", "arch", "exportedHeaderFlags"}, []string{"implicitInputs"}) _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff") @@ -265,6 +261,22 @@ var ( Rspfile: "$out.rsp", RspfileContent: "$in", }) + + _ = pctx.SourcePathVariable("cxxExtractor", + "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/cxx_extractor") + _ = pctx.SourcePathVariable("kytheVnames", "build/soong/vnames.json") + _ = pctx.VariableFunc("kytheCorpus", + func(ctx android.PackageVarContext) string { return ctx.Config().XrefCorpusName() }) + _ = pctx.VariableFunc("kytheCuEncoding", + func(ctx android.PackageVarContext) string { return ctx.Config().XrefCuEncoding() }) + kytheExtract = pctx.StaticRule("kythe", + blueprint.RuleParams{ + Command: `rm -f $out && ` + + `KYTHE_CORPUS=${kytheCorpus} KYTHE_OUTPUT_FILE=$out KYTHE_VNAMES=$kytheVnames KYTHE_KZIP_ENCODING=${kytheCuEncoding} ` + + `$cxxExtractor $cFlags $in `, + CommandDeps: []string{"$cxxExtractor", "$kytheVnames"}, + }, + "cFlags") ) func init() { @@ -283,40 +295,56 @@ func init() { } type builderFlags struct { - globalFlags string - arFlags string - asFlags string - cFlags string - toolingCFlags string // A separate set of cFlags for clang LibTooling tools - toolingCppFlags string // A separate set of cppFlags for clang LibTooling tools - conlyFlags string - cppFlags string - ldFlags string - libFlags string - yaccFlags string - tidyFlags string - sAbiFlags string - yasmFlags string - aidlFlags string - rsFlags string - toolchain config.Toolchain - tidy bool - coverage bool - sAbiDump bool + globalCommonFlags string + globalAsFlags string + globalYasmFlags string + globalCFlags string + globalToolingCFlags string // A separate set of cFlags for clang LibTooling tools + globalToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools + globalConlyFlags string + globalCppFlags string + globalLdFlags string + + localCommonFlags string + localAsFlags string + localYasmFlags string + localCFlags string + localToolingCFlags string // A separate set of cFlags for clang LibTooling tools + localToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools + localConlyFlags string + localCppFlags string + localLdFlags string + + libFlags string + extraLibFlags string + tidyFlags string + sAbiFlags string + aidlFlags string + rsFlags string + toolchain config.Toolchain + tidy bool + gcovCoverage bool + sAbiDump bool + emitXrefs bool + + assemblerWithCpp bool systemIncludeFlags string groupStaticLibs bool - stripKeepSymbols bool - stripKeepSymbolsList string - stripKeepMiniDebugInfo bool - stripAddGnuDebuglink bool - stripUseGnuStrip bool + stripKeepSymbols bool + stripKeepSymbolsList string + stripKeepSymbolsAndDebugFrame bool + stripKeepMiniDebugInfo bool + stripAddGnuDebuglink bool + stripUseGnuStrip bool proto android.ProtoFlags protoC bool protoOptionsFile bool + + yacc *YaccProperties } type Objects struct { @@ -324,6 +352,7 @@ type Objects struct { tidyFiles android.Paths coverageFiles android.Paths sAbiDumpFiles android.Paths + kytheFiles android.Paths } func (a Objects) Copy() Objects { @@ -332,6 +361,7 @@ func (a Objects) Copy() Objects { tidyFiles: append(android.Paths{}, a.tidyFiles...), coverageFiles: append(android.Paths{}, a.coverageFiles...), sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...), + kytheFiles: append(android.Paths{}, a.kytheFiles...), } } @@ -341,6 +371,7 @@ func (a Objects) Append(b Objects) Objects { tidyFiles: append(a.tidyFiles, b.tidyFiles...), coverageFiles: append(a.coverageFiles, b.coverageFiles...), sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...), + kytheFiles: append(a.kytheFiles, b.kytheFiles...), } } @@ -354,43 +385,53 @@ func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles and tidyFiles = make(android.Paths, 0, len(srcFiles)) } var coverageFiles android.Paths - if flags.coverage { + if flags.gcovCoverage { coverageFiles = make(android.Paths, 0, len(srcFiles)) } - - commonFlags := strings.Join([]string{ - flags.globalFlags, - flags.systemIncludeFlags, - }, " ") - - toolingCflags := strings.Join([]string{ - commonFlags, - flags.toolingCFlags, - flags.conlyFlags, - }, " ") - - cflags := strings.Join([]string{ - commonFlags, - flags.cFlags, - flags.conlyFlags, - }, " ") - - toolingCppflags := strings.Join([]string{ - commonFlags, - flags.toolingCFlags, - flags.toolingCppFlags, - }, " ") - - cppflags := strings.Join([]string{ - commonFlags, - flags.cFlags, - flags.cppFlags, - }, " ") - - asflags := strings.Join([]string{ - commonFlags, - flags.asFlags, - }, " ") + var kytheFiles android.Paths + if flags.emitXrefs { + kytheFiles = make(android.Paths, 0, len(srcFiles)) + } + + // Produce fully expanded flags for use by C tools, C compiles, C++ tools, C++ compiles, and asm compiles + // respectively. + toolingCflags := flags.globalCommonFlags + " " + + flags.globalToolingCFlags + " " + + flags.globalConlyFlags + " " + + flags.localCommonFlags + " " + + flags.localToolingCFlags + " " + + flags.localConlyFlags + " " + + flags.systemIncludeFlags + + cflags := flags.globalCommonFlags + " " + + flags.globalCFlags + " " + + flags.globalConlyFlags + " " + + flags.localCommonFlags + " " + + flags.localCFlags + " " + + flags.localConlyFlags + " " + + flags.systemIncludeFlags + + toolingCppflags := flags.globalCommonFlags + " " + + flags.globalToolingCFlags + " " + + flags.globalToolingCppFlags + " " + + flags.localCommonFlags + " " + + flags.localToolingCFlags + " " + + flags.localToolingCppFlags + " " + + flags.systemIncludeFlags + + cppflags := flags.globalCommonFlags + " " + + flags.globalCFlags + " " + + flags.globalCppFlags + " " + + flags.localCommonFlags + " " + + flags.localCFlags + " " + + flags.localCppFlags + " " + + flags.systemIncludeFlags + + asflags := flags.globalCommonFlags + " " + + flags.globalAsFlags + " " + + flags.localCommonFlags + " " + + flags.localAsFlags + " " + + flags.systemIncludeFlags var sAbiDumpFiles android.Paths if flags.sAbiDump { @@ -417,7 +458,7 @@ func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles and Implicits: cFlagsDeps, OrderOnly: pathDeps, Args: map[string]string{ - "asFlags": flags.yasmFlags, + "asFlags": flags.globalYasmFlags + " " + flags.localYasmFlags, }, }) continue @@ -435,34 +476,42 @@ func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles and }, }) continue + case ".o": + objFiles[i] = srcFile + continue } - var moduleCflags string - var moduleToolingCflags string + var moduleFlags string + var moduleToolingFlags string + var ccCmd string tidy := flags.tidy - coverage := flags.coverage + coverage := flags.gcovCoverage dump := flags.sAbiDump rule := cc + emitXref := flags.emitXrefs switch srcFile.Ext() { case ".s": - rule = ccNoDeps + if !flags.assemblerWithCpp { + rule = ccNoDeps + } fallthrough case ".S": ccCmd = "clang" - moduleCflags = asflags + moduleFlags = asflags tidy = false coverage = false dump = false + emitXref = false case ".c": ccCmd = "clang" - moduleCflags = cflags - moduleToolingCflags = toolingCflags - case ".cpp", ".cc", ".mm": + moduleFlags = cflags + moduleToolingFlags = toolingCflags + case ".cpp", ".cc", ".cxx", ".mm": ccCmd = "clang++" - moduleCflags = cppflags - moduleToolingCflags = toolingCppflags + moduleFlags = cppflags + moduleToolingFlags = toolingCppflags default: ctx.ModuleErrorf("File %s has unknown extension", srcFile) continue @@ -488,11 +537,27 @@ func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles and Implicits: cFlagsDeps, OrderOnly: pathDeps, Args: map[string]string{ - "cFlags": moduleCflags, + "cFlags": moduleFlags, "ccCmd": ccCmd, }, }) + if emitXref { + kytheFile := android.ObjPathWithExt(ctx, subdir, srcFile, "kzip") + ctx.Build(pctx, android.BuildParams{ + Rule: kytheExtract, + Description: "Xref C++ extractor " + srcFile.Rel(), + Output: kytheFile, + Input: srcFile, + Implicits: cFlagsDeps, + OrderOnly: pathDeps, + Args: map[string]string{ + "cFlags": moduleFlags, + }, + }) + kytheFiles = append(kytheFiles, kytheFile) + } + if tidy { tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy") tidyFiles = append(tidyFiles, tidyFile) @@ -504,9 +569,11 @@ func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles and Input: srcFile, // We must depend on objFile, since clang-tidy doesn't // support exporting dependencies. - Implicit: objFile, + Implicit: objFile, + Implicits: cFlagsDeps, + OrderOnly: pathDeps, Args: map[string]string{ - "cFlags": moduleToolingCflags, + "cFlags": moduleToolingFlags, "tidyFlags": flags.tidyFlags, }, }) @@ -526,8 +593,10 @@ func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles and Output: sAbiDumpFile, Input: srcFile, Implicit: objFile, + Implicits: cFlagsDeps, + OrderOnly: pathDeps, Args: map[string]string{ - "cFlags": moduleToolingCflags, + "cFlags": moduleToolingFlags, "exportDirs": flags.sAbiFlags, }, }) @@ -540,6 +609,7 @@ func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles and tidyFiles: tidyFiles, coverageFiles: coverageFiles, sAbiDumpFiles: sAbiDumpFiles, + kytheFiles: kytheFiles, } } @@ -547,19 +617,11 @@ func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles and func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths, flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) { - if ctx.Darwin() { - transformDarwinObjToStaticLib(ctx, objFiles, flags, outputFile, deps) - return - } - arCmd := "${config.ClangBin}/llvm-ar" - arFlags := "crsD" + arFlags := "crsPD" if !ctx.Darwin() { arFlags += " -format=gnu" } - if flags.arFlags != "" { - arFlags += " " + flags.arFlags - } ctx.Build(pctx, android.BuildParams{ Rule: ar, @@ -574,87 +636,11 @@ func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths, }) } -// Generate a rule for compiling multiple .o files to a static library (.a) on -// darwin. The darwin ar tool doesn't support @file for list files, and has a -// very small command line length limit, so we have to split the ar into multiple -// steps, each appending to the previous one. -func transformDarwinObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths, - flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) { - - arFlags := "cqs" - - if len(objFiles) == 0 { - dummy := android.PathForModuleOut(ctx, "dummy"+objectExtension) - dummyAr := android.PathForModuleOut(ctx, "dummy"+staticLibraryExtension) - - ctx.Build(pctx, android.BuildParams{ - Rule: emptyFile, - Description: "empty object file", - Output: dummy, - Implicits: deps, - }) - - ctx.Build(pctx, android.BuildParams{ - Rule: darwinAr, - Description: "empty static archive", - Output: dummyAr, - Input: dummy, - Args: map[string]string{ - "arFlags": arFlags, - }, - }) - - ctx.Build(pctx, android.BuildParams{ - Rule: darwinAppendAr, - Description: "static link " + outputFile.Base(), - Output: outputFile, - Input: dummy, - Args: map[string]string{ - "arFlags": "d", - "inAr": dummyAr.String(), - }, - }) - - return - } - - // ARG_MAX on darwin is 262144, use half that to be safe - objFilesLists, err := splitListForSize(objFiles, 131072) - if err != nil { - ctx.ModuleErrorf("%s", err.Error()) - } - - var in, out android.WritablePath - for i, l := range objFilesLists { - in = out - out = outputFile - if i != len(objFilesLists)-1 { - out = android.PathForModuleOut(ctx, outputFile.Base()+strconv.Itoa(i)) - } - - build := android.BuildParams{ - Rule: darwinAr, - Description: "static link " + out.Base(), - Output: out, - Inputs: l, - Implicits: deps, - Args: map[string]string{ - "arFlags": arFlags, - }, - } - if i != 0 { - build.Rule = darwinAppendAr - build.Args["inAr"] = in.String() - } - ctx.Build(pctx, build) - } -} - // Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries, // and shared libraries, to a shared library (.so) or dynamic executable func TransformObjToDynamicBinary(ctx android.ModuleContext, objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths, - crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath) { + crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath, implicitOutputs android.WritablePaths) { ldCmd := "${config.ClangBin}/clang++" @@ -691,7 +677,11 @@ func TransformObjToDynamicBinary(ctx android.ModuleContext, } for _, lib := range sharedLibs { - libFlagsList = append(libFlagsList, lib.String()) + libFile := lib.String() + if ctx.Windows() { + libFile = pathtools.ReplaceExtension(libFile, "lib") + } + libFlagsList = append(libFlagsList, libFile) } deps = append(deps, staticLibs...) @@ -702,23 +692,28 @@ func TransformObjToDynamicBinary(ctx android.ModuleContext, } rule := ld + args := map[string]string{ + "ldCmd": ldCmd, + "crtBegin": crtBegin.String(), + "libFlags": strings.Join(libFlagsList, " "), + "extraLibFlags": flags.extraLibFlags, + "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags, + "crtEnd": crtEnd.String(), + } if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") { rule = ldRE + args["implicitOutputs"] = strings.Join(implicitOutputs.Strings(), ",") + args["implicitInputs"] = strings.Join(deps.Strings(), ",") } ctx.Build(pctx, android.BuildParams{ Rule: rule, Description: "link " + outputFile.Base(), Output: outputFile, + ImplicitOutputs: implicitOutputs, Inputs: objFiles, Implicits: deps, - Args: map[string]string{ - "ldCmd": ldCmd, - "crtBegin": crtBegin.String(), - "libFlags": strings.Join(libFlagsList, " "), - "ldFlags": flags.ldFlags, - "crtEnd": crtEnd.String(), - }, + Args: args, }) } @@ -729,9 +724,6 @@ func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Path excludedSymbolVersions, excludedSymbolTags []string) android.OptionalPath { outputFile := android.PathForModuleOut(ctx, baseName+".lsdump") - sabiLock.Lock() - lsdumpPaths = append(lsdumpPaths, outputFile.String()) - sabiLock.Unlock() implicits := android.Paths{soFile} symbolFilterStr := "-so " + soFile.String() @@ -746,17 +738,30 @@ func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Path for _, tag := range excludedSymbolTags { symbolFilterStr += " --exclude-symbol-tag " + tag } + rule := sAbiLink + args := map[string]string{ + "symbolFilter": symbolFilterStr, + "arch": ctx.Arch().ArchType.Name, + "exportedHeaderFlags": exportedHeaderFlags, + } + if ctx.Config().IsEnvTrue("RBE_ABI_LINKER") { + rule = sAbiLinkRE + rbeImplicits := implicits.Strings() + for _, p := range strings.Split(exportedHeaderFlags, " ") { + if len(p) > 2 { + // Exclude the -I prefix. + rbeImplicits = append(rbeImplicits, p[2:]) + } + } + args["implicitInputs"] = strings.Join(rbeImplicits, ",") + } ctx.Build(pctx, android.BuildParams{ - Rule: sAbiLink, + Rule: rule, Description: "header-abi-linker " + outputFile.Base(), Output: outputFile, Inputs: sAbiDumps, Implicits: implicits, - Args: map[string]string{ - "symbolFilter": symbolFilterStr, - "arch": ctx.Arch().ArchType.Name, - "exportedHeaderFlags": exportedHeaderFlags, - }, + Args: args, }) return android.OptionalPathForPath(outputFile) } @@ -773,7 +778,7 @@ func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseNam } func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path, - baseName, exportedHeaderFlags string, isLlndk, isVndkExt bool) android.OptionalPath { + baseName, exportedHeaderFlags string, isLlndk, isNdk, isVndkExt bool) android.OptionalPath { outputFile := android.PathForModuleOut(ctx, baseName+".abidiff") libName := strings.TrimSuffix(baseName, filepath.Ext(baseName)) @@ -783,9 +788,14 @@ func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceD if exportedHeaderFlags == "" { localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-advice-only") } - if isLlndk { - localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-consider-opaque-types-different") + if isLlndk || isNdk { createReferenceDumpFlags = "--llndk" + if isLlndk { + // TODO(b/130324828): "-consider-opaque-types-different" should apply to + // both LLNDK and NDK shared libs. However, a known issue in header-abi-diff + // breaks libaaudio. Remove the if-guard after the issue is fixed. + localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-consider-opaque-types-different") + } } if isVndkExt { localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-allow-extensions") @@ -839,24 +849,26 @@ func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Pat // Generate a rule for compiling multiple .o files to a .o using ld partial linking func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths, - flags builderFlags, outputFile android.WritablePath) { + flags builderFlags, outputFile android.WritablePath, deps android.Paths) { ldCmd := "${config.ClangBin}/clang++" rule := partialLd args := map[string]string{ "ldCmd": ldCmd, - "ldFlags": flags.ldFlags, + "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags, } if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") { rule = partialLdRE args["inCommaList"] = strings.Join(objFiles.Strings(), ",") + args["implicitInputs"] = strings.Join(deps.Strings(), ",") } ctx.Build(pctx, android.BuildParams{ Rule: rule, Description: "link " + outputFile.Base(), Output: outputFile, Inputs: objFiles, + Implicits: deps, Args: args, }) } @@ -896,6 +908,9 @@ func TransformStrip(ctx android.ModuleContext, inputFile android.Path, if flags.stripKeepSymbolsList != "" { args += " -k" + flags.stripKeepSymbolsList } + if flags.stripKeepSymbolsAndDebugFrame { + args += " --keep-symbols-and-debug-frame" + } if flags.stripUseGnuStrip { args += " --use-gnu-strip" } @@ -942,6 +957,20 @@ func TransformCoverageFilesToZip(ctx android.ModuleContext, return android.OptionalPath{} } +func TransformArchiveRepack(ctx android.ModuleContext, inputFile android.Path, + outputFile android.WritablePath, objects []string) { + + ctx.Build(pctx, android.BuildParams{ + Rule: archiveRepack, + Description: "Repack archive " + outputFile.Base(), + Output: outputFile, + Input: inputFile, + Args: map[string]string{ + "objects": strings.Join(objects, " "), + }, + }) +} + func gccCmd(toolchain config.Toolchain, cmd string) string { return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd) } |