1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage cc 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Worker// This file generates the final rules for compiling all C/C++. All properties related to 18*333d2b36SAndroid Build Coastguard Worker// compiling should have been translated into builderFlags or another argument to the Transform* 19*333d2b36SAndroid Build Coastguard Worker// functions. 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Workerimport ( 22*333d2b36SAndroid Build Coastguard Worker "fmt" 23*333d2b36SAndroid Build Coastguard Worker "path/filepath" 24*333d2b36SAndroid Build Coastguard Worker "runtime" 25*333d2b36SAndroid Build Coastguard Worker "slices" 26*333d2b36SAndroid Build Coastguard Worker "strconv" 27*333d2b36SAndroid Build Coastguard Worker "strings" 28*333d2b36SAndroid Build Coastguard Worker 29*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 30*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/pathtools" 31*333d2b36SAndroid Build Coastguard Worker 32*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 33*333d2b36SAndroid Build Coastguard Worker "android/soong/cc/config" 34*333d2b36SAndroid Build Coastguard Worker "android/soong/remoteexec" 35*333d2b36SAndroid Build Coastguard Worker) 36*333d2b36SAndroid Build Coastguard Worker 37*333d2b36SAndroid Build Coastguard Workerconst ( 38*333d2b36SAndroid Build Coastguard Worker objectExtension = ".o" 39*333d2b36SAndroid Build Coastguard Worker staticLibraryExtension = ".a" 40*333d2b36SAndroid Build Coastguard Worker) 41*333d2b36SAndroid Build Coastguard Worker 42*333d2b36SAndroid Build Coastguard Workervar ( 43*333d2b36SAndroid Build Coastguard Worker pctx = android.NewPackageContext("android/soong/cc") 44*333d2b36SAndroid Build Coastguard Worker 45*333d2b36SAndroid Build Coastguard Worker // Rule to invoke gcc with given command, flags, and dependencies. Outputs a .d depfile. 46*333d2b36SAndroid Build Coastguard Worker cc = pctx.AndroidRemoteStaticRule("cc", android.RemoteRuleSupports{Goma: true, RBE: true}, 47*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 48*333d2b36SAndroid Build Coastguard Worker Depfile: "${out}.d", 49*333d2b36SAndroid Build Coastguard Worker Deps: blueprint.DepsGCC, 50*333d2b36SAndroid Build Coastguard Worker Command: "$relPwd ${config.CcWrapper}$ccCmd -c $cFlags -MD -MF ${out}.d -o $out $in$postCmd", 51*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$ccCmd"}, 52*333d2b36SAndroid Build Coastguard Worker }, 53*333d2b36SAndroid Build Coastguard Worker "ccCmd", "cFlags", "postCmd") 54*333d2b36SAndroid Build Coastguard Worker 55*333d2b36SAndroid Build Coastguard Worker // Rule to invoke gcc with given command and flags, but no dependencies. 56*333d2b36SAndroid Build Coastguard Worker ccNoDeps = pctx.AndroidStaticRule("ccNoDeps", 57*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 58*333d2b36SAndroid Build Coastguard Worker Command: "$relPwd $ccCmd -c $cFlags -o $out $in$postCmd", 59*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$ccCmd"}, 60*333d2b36SAndroid Build Coastguard Worker }, 61*333d2b36SAndroid Build Coastguard Worker "ccCmd", "cFlags", "postCmd") 62*333d2b36SAndroid Build Coastguard Worker 63*333d2b36SAndroid Build Coastguard Worker // Rules to invoke ld to link binaries. Uses a .rsp file to list dependencies, as there may 64*333d2b36SAndroid Build Coastguard Worker // be many. 65*333d2b36SAndroid Build Coastguard Worker ld, ldRE = pctx.RemoteStaticRules("ld", 66*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 67*333d2b36SAndroid Build Coastguard Worker Command: "$reTemplate$ldCmd ${crtBegin} @${out}.rsp " + 68*333d2b36SAndroid Build Coastguard Worker "${crtEnd} -o ${out} ${ldFlags} ${extraLibFlags}", 69*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$ldCmd"}, 70*333d2b36SAndroid Build Coastguard Worker Rspfile: "${out}.rsp", 71*333d2b36SAndroid Build Coastguard Worker RspfileContent: "${in} ${libFlags}", 72*333d2b36SAndroid Build Coastguard Worker // clang -Wl,--out-implib doesn't update its output file if it hasn't changed. 73*333d2b36SAndroid Build Coastguard Worker Restat: true, 74*333d2b36SAndroid Build Coastguard Worker }, 75*333d2b36SAndroid Build Coastguard Worker &remoteexec.REParams{ 76*333d2b36SAndroid Build Coastguard Worker Labels: map[string]string{"type": "link", "tool": "clang"}, 77*333d2b36SAndroid Build Coastguard Worker ExecStrategy: "${config.RECXXLinksExecStrategy}", 78*333d2b36SAndroid Build Coastguard Worker Inputs: []string{"${out}.rsp", "$implicitInputs"}, 79*333d2b36SAndroid Build Coastguard Worker RSPFiles: []string{"${out}.rsp"}, 80*333d2b36SAndroid Build Coastguard Worker OutputFiles: []string{"${out}", "$implicitOutputs"}, 81*333d2b36SAndroid Build Coastguard Worker ToolchainInputs: []string{"$ldCmd"}, 82*333d2b36SAndroid Build Coastguard Worker Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXLinksPool}"}, 83*333d2b36SAndroid Build Coastguard Worker }, []string{"ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags", "extraLibFlags"}, []string{"implicitInputs", "implicitOutputs"}) 84*333d2b36SAndroid Build Coastguard Worker 85*333d2b36SAndroid Build Coastguard Worker // Rules for .o files to combine to other .o files, using ld partial linking. 86*333d2b36SAndroid Build Coastguard Worker partialLd, partialLdRE = pctx.RemoteStaticRules("partialLd", 87*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 88*333d2b36SAndroid Build Coastguard Worker // Without -no-pie, clang 7.0 adds -pie to link Android files, 89*333d2b36SAndroid Build Coastguard Worker // but -r and -pie cannot be used together. 90*333d2b36SAndroid Build Coastguard Worker Command: "$reTemplate$ldCmd -fuse-ld=lld -nostdlib -no-pie -Wl,-r ${in} -o ${out} ${ldFlags}", 91*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$ldCmd"}, 92*333d2b36SAndroid Build Coastguard Worker }, &remoteexec.REParams{ 93*333d2b36SAndroid Build Coastguard Worker Labels: map[string]string{"type": "link", "tool": "clang"}, 94*333d2b36SAndroid Build Coastguard Worker ExecStrategy: "${config.RECXXLinksExecStrategy}", 95*333d2b36SAndroid Build Coastguard Worker Inputs: []string{"$inCommaList", "$implicitInputs"}, 96*333d2b36SAndroid Build Coastguard Worker OutputFiles: []string{"${out}", "$implicitOutputs"}, 97*333d2b36SAndroid Build Coastguard Worker ToolchainInputs: []string{"$ldCmd"}, 98*333d2b36SAndroid Build Coastguard Worker Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXLinksPool}"}, 99*333d2b36SAndroid Build Coastguard Worker }, []string{"ldCmd", "ldFlags"}, []string{"implicitInputs", "inCommaList", "implicitOutputs"}) 100*333d2b36SAndroid Build Coastguard Worker 101*333d2b36SAndroid Build Coastguard Worker // Rule to invoke `ar` with given cmd and flags, but no static library depenencies. 102*333d2b36SAndroid Build Coastguard Worker ar = pctx.AndroidStaticRule("ar", 103*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 104*333d2b36SAndroid Build Coastguard Worker Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp", 105*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$arCmd"}, 106*333d2b36SAndroid Build Coastguard Worker Rspfile: "${out}.rsp", 107*333d2b36SAndroid Build Coastguard Worker RspfileContent: "${in}", 108*333d2b36SAndroid Build Coastguard Worker }, 109*333d2b36SAndroid Build Coastguard Worker "arCmd", "arFlags") 110*333d2b36SAndroid Build Coastguard Worker 111*333d2b36SAndroid Build Coastguard Worker // Rule to invoke `ar` with given cmd, flags, and library dependencies. Generates a .a 112*333d2b36SAndroid Build Coastguard Worker // (archive) file from .o files. 113*333d2b36SAndroid Build Coastguard Worker arWithLibs = pctx.AndroidStaticRule("arWithLibs", 114*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 115*333d2b36SAndroid Build Coastguard Worker Command: "rm -f ${out} && $arCmd $arObjFlags $out @${out}.rsp && $arCmd $arLibFlags $out $arLibs", 116*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$arCmd"}, 117*333d2b36SAndroid Build Coastguard Worker Rspfile: "${out}.rsp", 118*333d2b36SAndroid Build Coastguard Worker RspfileContent: "${arObjs}", 119*333d2b36SAndroid Build Coastguard Worker }, 120*333d2b36SAndroid Build Coastguard Worker "arCmd", "arObjFlags", "arObjs", "arLibFlags", "arLibs") 121*333d2b36SAndroid Build Coastguard Worker 122*333d2b36SAndroid Build Coastguard Worker // Rule to run objcopy --prefix-symbols (to prefix all symbols in a file with a given string). 123*333d2b36SAndroid Build Coastguard Worker prefixSymbols = pctx.AndroidStaticRule("prefixSymbols", 124*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 125*333d2b36SAndroid Build Coastguard Worker Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}", 126*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$objcopyCmd"}, 127*333d2b36SAndroid Build Coastguard Worker }, 128*333d2b36SAndroid Build Coastguard Worker "objcopyCmd", "prefix") 129*333d2b36SAndroid Build Coastguard Worker 130*333d2b36SAndroid Build Coastguard Worker // Rule to run objcopy --remove-section=.llvm_addrsig on a partially linked object 131*333d2b36SAndroid Build Coastguard Worker noAddrSig = pctx.AndroidStaticRule("noAddrSig", 132*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 133*333d2b36SAndroid Build Coastguard Worker Command: "rm -f ${out} && $objcopyCmd --remove-section=.llvm_addrsig ${in} ${out}", 134*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$objcopyCmd"}, 135*333d2b36SAndroid Build Coastguard Worker }, 136*333d2b36SAndroid Build Coastguard Worker "objcopyCmd") 137*333d2b36SAndroid Build Coastguard Worker 138*333d2b36SAndroid Build Coastguard Worker _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh") 139*333d2b36SAndroid Build Coastguard Worker _ = pctx.SourcePathVariable("xzCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/xz") 140*333d2b36SAndroid Build Coastguard Worker _ = pctx.SourcePathVariable("createMiniDebugInfo", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/create_minidebuginfo") 141*333d2b36SAndroid Build Coastguard Worker 142*333d2b36SAndroid Build Coastguard Worker // Rule to invoke `strip` (to discard symbols and data from object files). 143*333d2b36SAndroid Build Coastguard Worker strip = pctx.AndroidStaticRule("strip", 144*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 145*333d2b36SAndroid Build Coastguard Worker Depfile: "${out}.d", 146*333d2b36SAndroid Build Coastguard Worker Deps: blueprint.DepsGCC, 147*333d2b36SAndroid Build Coastguard Worker Command: "XZ=$xzCmd CREATE_MINIDEBUGINFO=$createMiniDebugInfo CLANG_BIN=${config.ClangBin} $stripPath ${args} -i ${in} -o ${out} -d ${out}.d", 148*333d2b36SAndroid Build Coastguard Worker CommandDeps: func() []string { 149*333d2b36SAndroid Build Coastguard Worker if runtime.GOOS != "darwin" { 150*333d2b36SAndroid Build Coastguard Worker return []string{"$stripPath", "$xzCmd", "$createMiniDebugInfo"} 151*333d2b36SAndroid Build Coastguard Worker } else { 152*333d2b36SAndroid Build Coastguard Worker return []string{"$stripPath", "$xzCmd"} 153*333d2b36SAndroid Build Coastguard Worker } 154*333d2b36SAndroid Build Coastguard Worker }(), 155*333d2b36SAndroid Build Coastguard Worker Pool: darwinStripPool, 156*333d2b36SAndroid Build Coastguard Worker }, 157*333d2b36SAndroid Build Coastguard Worker "args") 158*333d2b36SAndroid Build Coastguard Worker 159*333d2b36SAndroid Build Coastguard Worker // Rule to invoke `strip` (to discard symbols and data from object files) on darwin architecture. 160*333d2b36SAndroid Build Coastguard Worker darwinStrip = func() blueprint.Rule { 161*333d2b36SAndroid Build Coastguard Worker if runtime.GOOS == "darwin" { 162*333d2b36SAndroid Build Coastguard Worker return pctx.AndroidStaticRule("darwinStrip", 163*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 164*333d2b36SAndroid Build Coastguard Worker Command: "${config.MacStripPath} -u -r -o $out $in", 165*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${config.MacStripPath}"}, 166*333d2b36SAndroid Build Coastguard Worker }) 167*333d2b36SAndroid Build Coastguard Worker } else { 168*333d2b36SAndroid Build Coastguard Worker return nil 169*333d2b36SAndroid Build Coastguard Worker } 170*333d2b36SAndroid Build Coastguard Worker }() 171*333d2b36SAndroid Build Coastguard Worker 172*333d2b36SAndroid Build Coastguard Worker // b/132822437: objcopy uses a file descriptor per .o file when called on .a files, which runs the system out of 173*333d2b36SAndroid Build Coastguard Worker // file descriptors on darwin. Limit concurrent calls to 5 on darwin. 174*333d2b36SAndroid Build Coastguard Worker darwinStripPool = func() blueprint.Pool { 175*333d2b36SAndroid Build Coastguard Worker if runtime.GOOS == "darwin" { 176*333d2b36SAndroid Build Coastguard Worker return pctx.StaticPool("darwinStripPool", blueprint.PoolParams{ 177*333d2b36SAndroid Build Coastguard Worker Depth: 5, 178*333d2b36SAndroid Build Coastguard Worker }) 179*333d2b36SAndroid Build Coastguard Worker } else { 180*333d2b36SAndroid Build Coastguard Worker return nil 181*333d2b36SAndroid Build Coastguard Worker } 182*333d2b36SAndroid Build Coastguard Worker }() 183*333d2b36SAndroid Build Coastguard Worker 184*333d2b36SAndroid Build Coastguard Worker darwinLipo = func() blueprint.Rule { 185*333d2b36SAndroid Build Coastguard Worker if runtime.GOOS == "darwin" { 186*333d2b36SAndroid Build Coastguard Worker return pctx.AndroidStaticRule("darwinLipo", 187*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 188*333d2b36SAndroid Build Coastguard Worker Command: "${config.MacLipoPath} -create -output $out $in", 189*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${config.MacLipoPath}"}, 190*333d2b36SAndroid Build Coastguard Worker }) 191*333d2b36SAndroid Build Coastguard Worker } else { 192*333d2b36SAndroid Build Coastguard Worker return nil 193*333d2b36SAndroid Build Coastguard Worker } 194*333d2b36SAndroid Build Coastguard Worker }() 195*333d2b36SAndroid Build Coastguard Worker 196*333d2b36SAndroid Build Coastguard Worker _ = pctx.SourcePathVariable("archiveRepackPath", "build/soong/scripts/archive_repack.sh") 197*333d2b36SAndroid Build Coastguard Worker 198*333d2b36SAndroid Build Coastguard Worker // Rule to repack an archive (.a) file with a subset of object files. 199*333d2b36SAndroid Build Coastguard Worker archiveRepack = pctx.AndroidStaticRule("archiveRepack", 200*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 201*333d2b36SAndroid Build Coastguard Worker Depfile: "${out}.d", 202*333d2b36SAndroid Build Coastguard Worker Deps: blueprint.DepsGCC, 203*333d2b36SAndroid Build Coastguard Worker Command: "CLANG_BIN=${config.ClangBin} $archiveRepackPath -i ${in} -o ${out} -d ${out}.d ${objects}", 204*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$archiveRepackPath"}, 205*333d2b36SAndroid Build Coastguard Worker }, 206*333d2b36SAndroid Build Coastguard Worker "objects") 207*333d2b36SAndroid Build Coastguard Worker 208*333d2b36SAndroid Build Coastguard Worker // Rule to create an empty file at a given path. 209*333d2b36SAndroid Build Coastguard Worker emptyFile = pctx.AndroidStaticRule("emptyFile", 210*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 211*333d2b36SAndroid Build Coastguard Worker Command: "rm -f $out && touch $out", 212*333d2b36SAndroid Build Coastguard Worker }) 213*333d2b36SAndroid Build Coastguard Worker 214*333d2b36SAndroid Build Coastguard Worker _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh") 215*333d2b36SAndroid Build Coastguard Worker 216*333d2b36SAndroid Build Coastguard Worker // A rule for extracting a table of contents from a shared library (.so). 217*333d2b36SAndroid Build Coastguard Worker toc = pctx.AndroidStaticRule("toc", 218*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 219*333d2b36SAndroid Build Coastguard Worker Depfile: "${out}.d", 220*333d2b36SAndroid Build Coastguard Worker Deps: blueprint.DepsGCC, 221*333d2b36SAndroid Build Coastguard Worker Command: "CLANG_BIN=$clangBin $tocPath $format -i ${in} -o ${out} -d ${out}.d", 222*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$tocPath"}, 223*333d2b36SAndroid Build Coastguard Worker Restat: true, 224*333d2b36SAndroid Build Coastguard Worker }, 225*333d2b36SAndroid Build Coastguard Worker "clangBin", "format") 226*333d2b36SAndroid Build Coastguard Worker 227*333d2b36SAndroid Build Coastguard Worker // Rules for invoking clang-tidy (a clang-based linter). 228*333d2b36SAndroid Build Coastguard Worker clangTidy, clangTidyRE = pctx.RemoteStaticRules("clangTidy", 229*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 230*333d2b36SAndroid Build Coastguard Worker Depfile: "${out}.d", 231*333d2b36SAndroid Build Coastguard Worker Deps: blueprint.DepsGCC, 232*333d2b36SAndroid Build Coastguard Worker Command: "CLANG_CMD=$clangCmd TIDY_FILE=$out " + 233*333d2b36SAndroid Build Coastguard Worker "$tidyVars$reTemplate${config.ClangBin}/clang-tidy.sh $in $tidyFlags -- $cFlags", 234*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${config.ClangBin}/clang-tidy.sh", "$ccCmd", "$tidyCmd"}, 235*333d2b36SAndroid Build Coastguard Worker }, 236*333d2b36SAndroid Build Coastguard Worker &remoteexec.REParams{ 237*333d2b36SAndroid Build Coastguard Worker Labels: map[string]string{"type": "lint", "tool": "clang-tidy", "lang": "cpp"}, 238*333d2b36SAndroid Build Coastguard Worker ExecStrategy: "${config.REClangTidyExecStrategy}", 239*333d2b36SAndroid Build Coastguard Worker Inputs: []string{"$in"}, 240*333d2b36SAndroid Build Coastguard Worker OutputFiles: []string{"${out}", "${out}.d"}, 241*333d2b36SAndroid Build Coastguard Worker ToolchainInputs: []string{"$ccCmd", "$tidyCmd"}, 242*333d2b36SAndroid Build Coastguard Worker EnvironmentVariables: []string{"CLANG_CMD", "TIDY_FILE", "TIDY_TIMEOUT"}, 243*333d2b36SAndroid Build Coastguard Worker // Although clang-tidy has an option to "fix" source files, that feature is hardly useable 244*333d2b36SAndroid Build Coastguard Worker // under parallel compilation and RBE. So we assume no OutputFiles here. 245*333d2b36SAndroid Build Coastguard Worker // The clang-tidy fix option is best run locally in single thread. 246*333d2b36SAndroid Build Coastguard Worker // Copying source file back to local caused two problems: 247*333d2b36SAndroid Build Coastguard Worker // (1) New timestamps trigger clang and clang-tidy compilations again. 248*333d2b36SAndroid Build Coastguard Worker // (2) Changing source files caused concurrent clang or clang-tidy jobs to crash. 249*333d2b36SAndroid Build Coastguard Worker Platform: map[string]string{remoteexec.PoolKey: "${config.REClangTidyPool}"}, 250*333d2b36SAndroid Build Coastguard Worker }, []string{"cFlags", "ccCmd", "clangCmd", "tidyCmd", "tidyFlags", "tidyVars"}, []string{}) 251*333d2b36SAndroid Build Coastguard Worker 252*333d2b36SAndroid Build Coastguard Worker _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm") 253*333d2b36SAndroid Build Coastguard Worker 254*333d2b36SAndroid Build Coastguard Worker // Rule for invoking yasm to compile .asm assembly files. 255*333d2b36SAndroid Build Coastguard Worker yasm = pctx.AndroidStaticRule("yasm", 256*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 257*333d2b36SAndroid Build Coastguard Worker Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d", 258*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$yasmCmd"}, 259*333d2b36SAndroid Build Coastguard Worker Depfile: "$out.d", 260*333d2b36SAndroid Build Coastguard Worker Deps: blueprint.DepsGCC, 261*333d2b36SAndroid Build Coastguard Worker }, 262*333d2b36SAndroid Build Coastguard Worker "asFlags") 263*333d2b36SAndroid Build Coastguard Worker 264*333d2b36SAndroid Build Coastguard Worker _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper") 265*333d2b36SAndroid Build Coastguard Worker 266*333d2b36SAndroid Build Coastguard Worker // -w has been added since header-abi-dumper does not need to produce any sort of diagnostic information. 267*333d2b36SAndroid Build Coastguard Worker sAbiDump, sAbiDumpRE = pctx.RemoteStaticRules("sAbiDump", 268*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 269*333d2b36SAndroid Build Coastguard Worker Command: "rm -f $out && $reTemplate$sAbiDumper --root-dir . --root-dir $$OUT_DIR:out -o ${out} $in $exportDirs -- $cFlags -w -isystem prebuilts/clang-tools/${config.HostPrebuiltTag}/clang-headers", 270*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$sAbiDumper"}, 271*333d2b36SAndroid Build Coastguard Worker }, &remoteexec.REParams{ 272*333d2b36SAndroid Build Coastguard Worker Labels: map[string]string{"type": "abi-dump", "tool": "header-abi-dumper"}, 273*333d2b36SAndroid Build Coastguard Worker ExecStrategy: "${config.REAbiDumperExecStrategy}", 274*333d2b36SAndroid Build Coastguard Worker Inputs: []string{"$sAbiLinkerLibs"}, 275*333d2b36SAndroid Build Coastguard Worker Platform: map[string]string{ 276*333d2b36SAndroid Build Coastguard Worker remoteexec.PoolKey: "${config.RECXXPool}", 277*333d2b36SAndroid Build Coastguard Worker }, 278*333d2b36SAndroid Build Coastguard Worker }, []string{"cFlags", "exportDirs"}, nil) 279*333d2b36SAndroid Build Coastguard Worker 280*333d2b36SAndroid Build Coastguard Worker _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker") 281*333d2b36SAndroid Build Coastguard Worker _ = pctx.SourcePathVariable("sAbiLinkerLibs", "prebuilts/clang-tools/${config.HostPrebuiltTag}/lib64") 282*333d2b36SAndroid Build Coastguard Worker 283*333d2b36SAndroid Build Coastguard Worker // Rule to combine .dump sAbi dump files from multiple source files into a single .ldump 284*333d2b36SAndroid Build Coastguard Worker // sAbi dump file. 285*333d2b36SAndroid Build Coastguard Worker sAbiLink, sAbiLinkRE = pctx.RemoteStaticRules("sAbiLink", 286*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 287*333d2b36SAndroid Build Coastguard Worker Command: "$reTemplate$sAbiLinker --root-dir . --root-dir $$OUT_DIR:out -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp", 288*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$sAbiLinker"}, 289*333d2b36SAndroid Build Coastguard Worker Rspfile: "${out}.rsp", 290*333d2b36SAndroid Build Coastguard Worker RspfileContent: "${in}", 291*333d2b36SAndroid Build Coastguard Worker }, &remoteexec.REParams{ 292*333d2b36SAndroid Build Coastguard Worker Labels: map[string]string{"type": "tool", "name": "abi-linker"}, 293*333d2b36SAndroid Build Coastguard Worker ExecStrategy: "${config.REAbiLinkerExecStrategy}", 294*333d2b36SAndroid Build Coastguard Worker Inputs: []string{"$sAbiLinkerLibs", "${out}.rsp", "$implicitInputs"}, 295*333d2b36SAndroid Build Coastguard Worker RSPFiles: []string{"${out}.rsp"}, 296*333d2b36SAndroid Build Coastguard Worker OutputFiles: []string{"$out"}, 297*333d2b36SAndroid Build Coastguard Worker ToolchainInputs: []string{"$sAbiLinker"}, 298*333d2b36SAndroid Build Coastguard Worker Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXPool}"}, 299*333d2b36SAndroid Build Coastguard Worker }, []string{"symbolFilter", "arch", "exportedHeaderFlags"}, []string{"implicitInputs"}) 300*333d2b36SAndroid Build Coastguard Worker 301*333d2b36SAndroid Build Coastguard Worker _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff") 302*333d2b36SAndroid Build Coastguard Worker 303*333d2b36SAndroid Build Coastguard Worker // Rule to compare linked sAbi dump files (.ldump). 304*333d2b36SAndroid Build Coastguard Worker sAbiDiff = pctx.RuleFunc("sAbiDiff", 305*333d2b36SAndroid Build Coastguard Worker func(ctx android.PackageRuleContext) blueprint.RuleParams { 306*333d2b36SAndroid Build Coastguard Worker commandStr := "($sAbiDiffer ${extraFlags} -lib ${libName} -arch ${arch} -o ${out} -new ${in} -old ${referenceDump})" 307*333d2b36SAndroid Build Coastguard Worker commandStr += "|| (echo '${errorMessage}'" 308*333d2b36SAndroid Build Coastguard Worker commandStr += " && (mkdir -p $$DIST_DIR/abidiffs && cp ${out} $$DIST_DIR/abidiffs/)" 309*333d2b36SAndroid Build Coastguard Worker commandStr += " && exit 1)" 310*333d2b36SAndroid Build Coastguard Worker return blueprint.RuleParams{ 311*333d2b36SAndroid Build Coastguard Worker Command: commandStr, 312*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$sAbiDiffer"}, 313*333d2b36SAndroid Build Coastguard Worker } 314*333d2b36SAndroid Build Coastguard Worker }, 315*333d2b36SAndroid Build Coastguard Worker "extraFlags", "referenceDump", "libName", "arch", "errorMessage") 316*333d2b36SAndroid Build Coastguard Worker 317*333d2b36SAndroid Build Coastguard Worker // Rule to zip files. 318*333d2b36SAndroid Build Coastguard Worker zip = pctx.AndroidStaticRule("zip", 319*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 320*333d2b36SAndroid Build Coastguard Worker Command: "${SoongZipCmd} -o ${out} -C $$OUT_DIR -r ${out}.rsp", 321*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"${SoongZipCmd}"}, 322*333d2b36SAndroid Build Coastguard Worker Rspfile: "${out}.rsp", 323*333d2b36SAndroid Build Coastguard Worker RspfileContent: "$in", 324*333d2b36SAndroid Build Coastguard Worker }) 325*333d2b36SAndroid Build Coastguard Worker 326*333d2b36SAndroid Build Coastguard Worker _ = pctx.SourcePathVariable("cxxExtractor", 327*333d2b36SAndroid Build Coastguard Worker "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/cxx_extractor") 328*333d2b36SAndroid Build Coastguard Worker _ = pctx.SourcePathVariable("kytheVnames", "build/soong/vnames.json") 329*333d2b36SAndroid Build Coastguard Worker _ = pctx.VariableFunc("kytheCorpus", 330*333d2b36SAndroid Build Coastguard Worker func(ctx android.PackageVarContext) string { return ctx.Config().XrefCorpusName() }) 331*333d2b36SAndroid Build Coastguard Worker _ = pctx.VariableFunc("kytheCuEncoding", 332*333d2b36SAndroid Build Coastguard Worker func(ctx android.PackageVarContext) string { return ctx.Config().XrefCuEncoding() }) 333*333d2b36SAndroid Build Coastguard Worker 334*333d2b36SAndroid Build Coastguard Worker // Rule to use kythe extractors to generate .kzip files, used to build code cross references. 335*333d2b36SAndroid Build Coastguard Worker kytheExtract = pctx.StaticRule("kythe", 336*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 337*333d2b36SAndroid Build Coastguard Worker Command: `rm -f $out && ` + 338*333d2b36SAndroid Build Coastguard Worker `KYTHE_CORPUS=${kytheCorpus} ` + 339*333d2b36SAndroid Build Coastguard Worker `KYTHE_OUTPUT_FILE=$out ` + 340*333d2b36SAndroid Build Coastguard Worker `KYTHE_VNAMES=$kytheVnames ` + 341*333d2b36SAndroid Build Coastguard Worker `KYTHE_KZIP_ENCODING=${kytheCuEncoding} ` + 342*333d2b36SAndroid Build Coastguard Worker `KYTHE_CANONICALIZE_VNAME_PATHS=prefer-relative ` + 343*333d2b36SAndroid Build Coastguard Worker `$cxxExtractor $cFlags $in `, 344*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$cxxExtractor", "$kytheVnames"}, 345*333d2b36SAndroid Build Coastguard Worker }, 346*333d2b36SAndroid Build Coastguard Worker "cFlags") 347*333d2b36SAndroid Build Coastguard Worker 348*333d2b36SAndroid Build Coastguard Worker // Function pointer for producting staticlibs from rlibs. Corresponds to 349*333d2b36SAndroid Build Coastguard Worker // rust.TransformRlibstoStaticlib(), initialized in soong-rust (rust/builder.go init()) 350*333d2b36SAndroid Build Coastguard Worker // 351*333d2b36SAndroid Build Coastguard Worker // This is required since soong-rust depends on soong-cc, so soong-cc cannot depend on soong-rust 352*333d2b36SAndroid Build Coastguard Worker // without resulting in a circular dependency. Setting this function pointer in soong-rust allows 353*333d2b36SAndroid Build Coastguard Worker // soong-cc to call into this particular function. 354*333d2b36SAndroid Build Coastguard Worker TransformRlibstoStaticlib (func(ctx android.ModuleContext, mainSrc android.Path, deps []RustRlibDep, 355*333d2b36SAndroid Build Coastguard Worker outputFile android.WritablePath) android.Path) = nil 356*333d2b36SAndroid Build Coastguard Worker) 357*333d2b36SAndroid Build Coastguard Worker 358*333d2b36SAndroid Build Coastguard Workerfunc PwdPrefix() string { 359*333d2b36SAndroid Build Coastguard Worker // Darwin doesn't have /proc 360*333d2b36SAndroid Build Coastguard Worker if runtime.GOOS != "darwin" { 361*333d2b36SAndroid Build Coastguard Worker return "PWD=/proc/self/cwd" 362*333d2b36SAndroid Build Coastguard Worker } 363*333d2b36SAndroid Build Coastguard Worker return "" 364*333d2b36SAndroid Build Coastguard Worker} 365*333d2b36SAndroid Build Coastguard Worker 366*333d2b36SAndroid Build Coastguard Workerfunc init() { 367*333d2b36SAndroid Build Coastguard Worker // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the 368*333d2b36SAndroid Build Coastguard Worker // debug output. That way two builds in two different directories will 369*333d2b36SAndroid Build Coastguard Worker // create the same output. 370*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("relPwd", PwdPrefix()) 371*333d2b36SAndroid Build Coastguard Worker 372*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("SoongZipCmd", "soong_zip") 373*333d2b36SAndroid Build Coastguard Worker} 374*333d2b36SAndroid Build Coastguard Worker 375*333d2b36SAndroid Build Coastguard Worker// builderFlags contains various types of command line flags (and settings) for use in building 376*333d2b36SAndroid Build Coastguard Worker// build statements related to C++. 377*333d2b36SAndroid Build Coastguard Workertype builderFlags struct { 378*333d2b36SAndroid Build Coastguard Worker // Global flags (which build system or toolchain is responsible for). These are separate from 379*333d2b36SAndroid Build Coastguard Worker // local flags because they should appear first (so that they may be overridden by local flags). 380*333d2b36SAndroid Build Coastguard Worker globalCommonFlags string 381*333d2b36SAndroid Build Coastguard Worker globalAsFlags string 382*333d2b36SAndroid Build Coastguard Worker globalYasmFlags string 383*333d2b36SAndroid Build Coastguard Worker globalCFlags string 384*333d2b36SAndroid Build Coastguard Worker globalToolingCFlags string // A separate set of cFlags for clang LibTooling tools 385*333d2b36SAndroid Build Coastguard Worker globalToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools 386*333d2b36SAndroid Build Coastguard Worker globalConlyFlags string 387*333d2b36SAndroid Build Coastguard Worker globalCppFlags string 388*333d2b36SAndroid Build Coastguard Worker globalLdFlags string 389*333d2b36SAndroid Build Coastguard Worker 390*333d2b36SAndroid Build Coastguard Worker // Local flags (which individual modules are responsible for). These may override global flags. 391*333d2b36SAndroid Build Coastguard Worker localCommonFlags string 392*333d2b36SAndroid Build Coastguard Worker localAsFlags string 393*333d2b36SAndroid Build Coastguard Worker localYasmFlags string 394*333d2b36SAndroid Build Coastguard Worker localCFlags string 395*333d2b36SAndroid Build Coastguard Worker localToolingCFlags string // A separate set of cFlags for clang LibTooling tools 396*333d2b36SAndroid Build Coastguard Worker localToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools 397*333d2b36SAndroid Build Coastguard Worker localConlyFlags string 398*333d2b36SAndroid Build Coastguard Worker localCppFlags string 399*333d2b36SAndroid Build Coastguard Worker localLdFlags string 400*333d2b36SAndroid Build Coastguard Worker 401*333d2b36SAndroid Build Coastguard Worker noOverrideFlags string // Flags appended at the end so they are not overridden. 402*333d2b36SAndroid Build Coastguard Worker libFlags string // Flags to add to the linker directly after specifying libraries to link. 403*333d2b36SAndroid Build Coastguard Worker extraLibFlags string // Flags to add to the linker last. 404*333d2b36SAndroid Build Coastguard Worker tidyFlags string // Flags that apply to clang-tidy 405*333d2b36SAndroid Build Coastguard Worker sAbiFlags string // Flags that apply to header-abi-dumps 406*333d2b36SAndroid Build Coastguard Worker aidlFlags string // Flags that apply to aidl source files 407*333d2b36SAndroid Build Coastguard Worker rsFlags string // Flags that apply to renderscript source files 408*333d2b36SAndroid Build Coastguard Worker toolchain config.Toolchain 409*333d2b36SAndroid Build Coastguard Worker 410*333d2b36SAndroid Build Coastguard Worker // True if these extra features are enabled. 411*333d2b36SAndroid Build Coastguard Worker tidy bool 412*333d2b36SAndroid Build Coastguard Worker needTidyFiles bool 413*333d2b36SAndroid Build Coastguard Worker gcovCoverage bool 414*333d2b36SAndroid Build Coastguard Worker sAbiDump bool 415*333d2b36SAndroid Build Coastguard Worker emitXrefs bool 416*333d2b36SAndroid Build Coastguard Worker clangVerify bool 417*333d2b36SAndroid Build Coastguard Worker 418*333d2b36SAndroid Build Coastguard Worker assemblerWithCpp bool // True if .s files should be processed with the c preprocessor. 419*333d2b36SAndroid Build Coastguard Worker 420*333d2b36SAndroid Build Coastguard Worker systemIncludeFlags string 421*333d2b36SAndroid Build Coastguard Worker 422*333d2b36SAndroid Build Coastguard Worker proto android.ProtoFlags 423*333d2b36SAndroid Build Coastguard Worker protoC bool // If true, compile protos as `.c` files. Otherwise, output as `.cc`. 424*333d2b36SAndroid Build Coastguard Worker protoOptionsFile bool // If true, output a proto options file. 425*333d2b36SAndroid Build Coastguard Worker 426*333d2b36SAndroid Build Coastguard Worker yacc *YaccProperties 427*333d2b36SAndroid Build Coastguard Worker lex *LexProperties 428*333d2b36SAndroid Build Coastguard Worker} 429*333d2b36SAndroid Build Coastguard Worker 430*333d2b36SAndroid Build Coastguard Worker// StripFlags represents flags related to stripping. This is separate from builderFlags, as these 431*333d2b36SAndroid Build Coastguard Worker// flags are useful outside of this package (such as for Rust). 432*333d2b36SAndroid Build Coastguard Workertype StripFlags struct { 433*333d2b36SAndroid Build Coastguard Worker Toolchain config.Toolchain 434*333d2b36SAndroid Build Coastguard Worker StripKeepSymbols bool 435*333d2b36SAndroid Build Coastguard Worker StripKeepSymbolsList string 436*333d2b36SAndroid Build Coastguard Worker StripKeepSymbolsAndDebugFrame bool 437*333d2b36SAndroid Build Coastguard Worker StripKeepMiniDebugInfo bool 438*333d2b36SAndroid Build Coastguard Worker StripAddGnuDebuglink bool 439*333d2b36SAndroid Build Coastguard Worker StripUseGnuStrip bool 440*333d2b36SAndroid Build Coastguard Worker} 441*333d2b36SAndroid Build Coastguard Worker 442*333d2b36SAndroid Build Coastguard Worker// Objects is a collection of file paths corresponding to outputs for C++ related build statements. 443*333d2b36SAndroid Build Coastguard Workertype Objects struct { 444*333d2b36SAndroid Build Coastguard Worker objFiles android.Paths 445*333d2b36SAndroid Build Coastguard Worker tidyFiles android.Paths 446*333d2b36SAndroid Build Coastguard Worker tidyDepFiles android.Paths // link dependent .tidy files 447*333d2b36SAndroid Build Coastguard Worker coverageFiles android.Paths 448*333d2b36SAndroid Build Coastguard Worker sAbiDumpFiles android.Paths 449*333d2b36SAndroid Build Coastguard Worker kytheFiles android.Paths 450*333d2b36SAndroid Build Coastguard Worker} 451*333d2b36SAndroid Build Coastguard Worker 452*333d2b36SAndroid Build Coastguard Workerfunc (a Objects) Copy() Objects { 453*333d2b36SAndroid Build Coastguard Worker return Objects{ 454*333d2b36SAndroid Build Coastguard Worker objFiles: append(android.Paths{}, a.objFiles...), 455*333d2b36SAndroid Build Coastguard Worker tidyFiles: append(android.Paths{}, a.tidyFiles...), 456*333d2b36SAndroid Build Coastguard Worker tidyDepFiles: append(android.Paths{}, a.tidyDepFiles...), 457*333d2b36SAndroid Build Coastguard Worker coverageFiles: append(android.Paths{}, a.coverageFiles...), 458*333d2b36SAndroid Build Coastguard Worker sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...), 459*333d2b36SAndroid Build Coastguard Worker kytheFiles: append(android.Paths{}, a.kytheFiles...), 460*333d2b36SAndroid Build Coastguard Worker } 461*333d2b36SAndroid Build Coastguard Worker} 462*333d2b36SAndroid Build Coastguard Worker 463*333d2b36SAndroid Build Coastguard Workerfunc (a Objects) Append(b Objects) Objects { 464*333d2b36SAndroid Build Coastguard Worker return Objects{ 465*333d2b36SAndroid Build Coastguard Worker objFiles: append(a.objFiles, b.objFiles...), 466*333d2b36SAndroid Build Coastguard Worker tidyFiles: append(a.tidyFiles, b.tidyFiles...), 467*333d2b36SAndroid Build Coastguard Worker tidyDepFiles: append(a.tidyDepFiles, b.tidyDepFiles...), 468*333d2b36SAndroid Build Coastguard Worker coverageFiles: append(a.coverageFiles, b.coverageFiles...), 469*333d2b36SAndroid Build Coastguard Worker sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...), 470*333d2b36SAndroid Build Coastguard Worker kytheFiles: append(a.kytheFiles, b.kytheFiles...), 471*333d2b36SAndroid Build Coastguard Worker } 472*333d2b36SAndroid Build Coastguard Worker} 473*333d2b36SAndroid Build Coastguard Worker 474*333d2b36SAndroid Build Coastguard Worker// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files 475*333d2b36SAndroid Build Coastguard Workerfunc transformSourceToObj(ctx ModuleContext, subdir string, srcFiles, noTidySrcs, timeoutTidySrcs android.Paths, 476*333d2b36SAndroid Build Coastguard Worker flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects { 477*333d2b36SAndroid Build Coastguard Worker // Source files are one-to-one with tidy, coverage, or kythe files, if enabled. 478*333d2b36SAndroid Build Coastguard Worker objFiles := make(android.Paths, len(srcFiles)) 479*333d2b36SAndroid Build Coastguard Worker var tidyFiles android.Paths 480*333d2b36SAndroid Build Coastguard Worker noTidySrcsMap := make(map[string]bool) 481*333d2b36SAndroid Build Coastguard Worker var tidyVars string 482*333d2b36SAndroid Build Coastguard Worker if flags.tidy { 483*333d2b36SAndroid Build Coastguard Worker tidyFiles = make(android.Paths, 0, len(srcFiles)) 484*333d2b36SAndroid Build Coastguard Worker for _, path := range noTidySrcs { 485*333d2b36SAndroid Build Coastguard Worker noTidySrcsMap[path.String()] = true 486*333d2b36SAndroid Build Coastguard Worker } 487*333d2b36SAndroid Build Coastguard Worker tidyTimeout := ctx.Config().Getenv("TIDY_TIMEOUT") 488*333d2b36SAndroid Build Coastguard Worker if len(tidyTimeout) > 0 { 489*333d2b36SAndroid Build Coastguard Worker tidyVars += "TIDY_TIMEOUT=" + tidyTimeout + " " 490*333d2b36SAndroid Build Coastguard Worker // add timeoutTidySrcs into noTidySrcsMap if TIDY_TIMEOUT is set 491*333d2b36SAndroid Build Coastguard Worker for _, path := range timeoutTidySrcs { 492*333d2b36SAndroid Build Coastguard Worker noTidySrcsMap[path.String()] = true 493*333d2b36SAndroid Build Coastguard Worker } 494*333d2b36SAndroid Build Coastguard Worker } 495*333d2b36SAndroid Build Coastguard Worker } 496*333d2b36SAndroid Build Coastguard Worker var coverageFiles android.Paths 497*333d2b36SAndroid Build Coastguard Worker if flags.gcovCoverage { 498*333d2b36SAndroid Build Coastguard Worker coverageFiles = make(android.Paths, 0, len(srcFiles)) 499*333d2b36SAndroid Build Coastguard Worker } 500*333d2b36SAndroid Build Coastguard Worker var kytheFiles android.Paths 501*333d2b36SAndroid Build Coastguard Worker if flags.emitXrefs && ctx.Module() == ctx.PrimaryModule() { 502*333d2b36SAndroid Build Coastguard Worker kytheFiles = make(android.Paths, 0, len(srcFiles)) 503*333d2b36SAndroid Build Coastguard Worker } 504*333d2b36SAndroid Build Coastguard Worker 505*333d2b36SAndroid Build Coastguard Worker // Produce fully expanded flags for use by C tools, C compiles, C++ tools, C++ compiles, and asm compiles 506*333d2b36SAndroid Build Coastguard Worker // respectively. 507*333d2b36SAndroid Build Coastguard Worker toolingCflags := flags.globalCommonFlags + " " + 508*333d2b36SAndroid Build Coastguard Worker flags.globalToolingCFlags + " " + 509*333d2b36SAndroid Build Coastguard Worker flags.globalConlyFlags + " " + 510*333d2b36SAndroid Build Coastguard Worker flags.localCommonFlags + " " + 511*333d2b36SAndroid Build Coastguard Worker flags.localToolingCFlags + " " + 512*333d2b36SAndroid Build Coastguard Worker flags.localConlyFlags + " " + 513*333d2b36SAndroid Build Coastguard Worker flags.systemIncludeFlags + " " + 514*333d2b36SAndroid Build Coastguard Worker flags.noOverrideFlags 515*333d2b36SAndroid Build Coastguard Worker 516*333d2b36SAndroid Build Coastguard Worker cflags := flags.globalCommonFlags + " " + 517*333d2b36SAndroid Build Coastguard Worker flags.globalCFlags + " " + 518*333d2b36SAndroid Build Coastguard Worker flags.globalConlyFlags + " " + 519*333d2b36SAndroid Build Coastguard Worker flags.localCommonFlags + " " + 520*333d2b36SAndroid Build Coastguard Worker flags.localCFlags + " " + 521*333d2b36SAndroid Build Coastguard Worker flags.localConlyFlags + " " + 522*333d2b36SAndroid Build Coastguard Worker flags.systemIncludeFlags + " " + 523*333d2b36SAndroid Build Coastguard Worker flags.noOverrideFlags 524*333d2b36SAndroid Build Coastguard Worker 525*333d2b36SAndroid Build Coastguard Worker toolingCppflags := flags.globalCommonFlags + " " + 526*333d2b36SAndroid Build Coastguard Worker flags.globalToolingCFlags + " " + 527*333d2b36SAndroid Build Coastguard Worker flags.globalToolingCppFlags + " " + 528*333d2b36SAndroid Build Coastguard Worker flags.localCommonFlags + " " + 529*333d2b36SAndroid Build Coastguard Worker flags.localToolingCFlags + " " + 530*333d2b36SAndroid Build Coastguard Worker flags.localToolingCppFlags + " " + 531*333d2b36SAndroid Build Coastguard Worker flags.systemIncludeFlags + " " + 532*333d2b36SAndroid Build Coastguard Worker flags.noOverrideFlags 533*333d2b36SAndroid Build Coastguard Worker 534*333d2b36SAndroid Build Coastguard Worker cppflags := flags.globalCommonFlags + " " + 535*333d2b36SAndroid Build Coastguard Worker flags.globalCFlags + " " + 536*333d2b36SAndroid Build Coastguard Worker flags.globalCppFlags + " " + 537*333d2b36SAndroid Build Coastguard Worker flags.localCommonFlags + " " + 538*333d2b36SAndroid Build Coastguard Worker flags.localCFlags + " " + 539*333d2b36SAndroid Build Coastguard Worker flags.localCppFlags + " " + 540*333d2b36SAndroid Build Coastguard Worker flags.systemIncludeFlags + " " + 541*333d2b36SAndroid Build Coastguard Worker flags.noOverrideFlags 542*333d2b36SAndroid Build Coastguard Worker 543*333d2b36SAndroid Build Coastguard Worker asflags := flags.globalCommonFlags + " " + 544*333d2b36SAndroid Build Coastguard Worker flags.globalAsFlags + " " + 545*333d2b36SAndroid Build Coastguard Worker flags.localCommonFlags + " " + 546*333d2b36SAndroid Build Coastguard Worker flags.localAsFlags + " " + 547*333d2b36SAndroid Build Coastguard Worker flags.systemIncludeFlags 548*333d2b36SAndroid Build Coastguard Worker 549*333d2b36SAndroid Build Coastguard Worker var sAbiDumpFiles android.Paths 550*333d2b36SAndroid Build Coastguard Worker if flags.sAbiDump { 551*333d2b36SAndroid Build Coastguard Worker sAbiDumpFiles = make(android.Paths, 0, len(srcFiles)) 552*333d2b36SAndroid Build Coastguard Worker } 553*333d2b36SAndroid Build Coastguard Worker 554*333d2b36SAndroid Build Coastguard Worker // Multiple source files have build rules usually share the same cFlags or tidyFlags. 555*333d2b36SAndroid Build Coastguard Worker // Define only one version in this module and share it in multiple build rules. 556*333d2b36SAndroid Build Coastguard Worker // To simplify the code, the shared variables are all named as $flags<nnn>. 557*333d2b36SAndroid Build Coastguard Worker shared := ctx.getSharedFlags() 558*333d2b36SAndroid Build Coastguard Worker 559*333d2b36SAndroid Build Coastguard Worker // Share flags only when there are multiple files or tidy rules. 560*333d2b36SAndroid Build Coastguard Worker var hasMultipleRules = len(srcFiles) > 1 || flags.tidy 561*333d2b36SAndroid Build Coastguard Worker 562*333d2b36SAndroid Build Coastguard Worker var shareFlags = func(kind string, flags string) string { 563*333d2b36SAndroid Build Coastguard Worker if !hasMultipleRules || len(flags) < 60 { 564*333d2b36SAndroid Build Coastguard Worker // Modules have long names and so do the module variables. 565*333d2b36SAndroid Build Coastguard Worker // It does not save space by replacing a short name with a long one. 566*333d2b36SAndroid Build Coastguard Worker return flags 567*333d2b36SAndroid Build Coastguard Worker } 568*333d2b36SAndroid Build Coastguard Worker mapKey := kind + flags 569*333d2b36SAndroid Build Coastguard Worker n, ok := shared.flagsMap[mapKey] 570*333d2b36SAndroid Build Coastguard Worker if !ok { 571*333d2b36SAndroid Build Coastguard Worker shared.numSharedFlags += 1 572*333d2b36SAndroid Build Coastguard Worker n = strconv.Itoa(shared.numSharedFlags) 573*333d2b36SAndroid Build Coastguard Worker shared.flagsMap[mapKey] = n 574*333d2b36SAndroid Build Coastguard Worker ctx.Variable(pctx, kind+n, flags) 575*333d2b36SAndroid Build Coastguard Worker } 576*333d2b36SAndroid Build Coastguard Worker return "$" + kind + n 577*333d2b36SAndroid Build Coastguard Worker } 578*333d2b36SAndroid Build Coastguard Worker 579*333d2b36SAndroid Build Coastguard Worker for i, srcFile := range srcFiles { 580*333d2b36SAndroid Build Coastguard Worker objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o") 581*333d2b36SAndroid Build Coastguard Worker 582*333d2b36SAndroid Build Coastguard Worker objFiles[i] = objFile 583*333d2b36SAndroid Build Coastguard Worker 584*333d2b36SAndroid Build Coastguard Worker // Register compilation build statements. The actual rule used depends on the source file type. 585*333d2b36SAndroid Build Coastguard Worker switch srcFile.Ext() { 586*333d2b36SAndroid Build Coastguard Worker case ".asm": 587*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 588*333d2b36SAndroid Build Coastguard Worker Rule: yasm, 589*333d2b36SAndroid Build Coastguard Worker Description: "yasm " + srcFile.Rel(), 590*333d2b36SAndroid Build Coastguard Worker Output: objFile, 591*333d2b36SAndroid Build Coastguard Worker Input: srcFile, 592*333d2b36SAndroid Build Coastguard Worker Implicits: cFlagsDeps, 593*333d2b36SAndroid Build Coastguard Worker OrderOnly: pathDeps, 594*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 595*333d2b36SAndroid Build Coastguard Worker "asFlags": shareFlags("asFlags", flags.globalYasmFlags+" "+flags.localYasmFlags), 596*333d2b36SAndroid Build Coastguard Worker }, 597*333d2b36SAndroid Build Coastguard Worker }) 598*333d2b36SAndroid Build Coastguard Worker continue 599*333d2b36SAndroid Build Coastguard Worker case ".o": 600*333d2b36SAndroid Build Coastguard Worker objFiles[i] = srcFile 601*333d2b36SAndroid Build Coastguard Worker continue 602*333d2b36SAndroid Build Coastguard Worker } 603*333d2b36SAndroid Build Coastguard Worker 604*333d2b36SAndroid Build Coastguard Worker var moduleFlags string 605*333d2b36SAndroid Build Coastguard Worker var moduleToolingFlags string 606*333d2b36SAndroid Build Coastguard Worker 607*333d2b36SAndroid Build Coastguard Worker var ccCmd string 608*333d2b36SAndroid Build Coastguard Worker var postCmd string 609*333d2b36SAndroid Build Coastguard Worker tidy := flags.tidy 610*333d2b36SAndroid Build Coastguard Worker coverage := flags.gcovCoverage 611*333d2b36SAndroid Build Coastguard Worker dump := flags.sAbiDump 612*333d2b36SAndroid Build Coastguard Worker rule := cc 613*333d2b36SAndroid Build Coastguard Worker emitXref := flags.emitXrefs 614*333d2b36SAndroid Build Coastguard Worker 615*333d2b36SAndroid Build Coastguard Worker switch srcFile.Ext() { 616*333d2b36SAndroid Build Coastguard Worker case ".s": 617*333d2b36SAndroid Build Coastguard Worker if !flags.assemblerWithCpp { 618*333d2b36SAndroid Build Coastguard Worker rule = ccNoDeps 619*333d2b36SAndroid Build Coastguard Worker } 620*333d2b36SAndroid Build Coastguard Worker fallthrough 621*333d2b36SAndroid Build Coastguard Worker case ".S": 622*333d2b36SAndroid Build Coastguard Worker ccCmd = "clang" 623*333d2b36SAndroid Build Coastguard Worker moduleFlags = asflags 624*333d2b36SAndroid Build Coastguard Worker tidy = false 625*333d2b36SAndroid Build Coastguard Worker coverage = false 626*333d2b36SAndroid Build Coastguard Worker dump = false 627*333d2b36SAndroid Build Coastguard Worker emitXref = false 628*333d2b36SAndroid Build Coastguard Worker case ".c": 629*333d2b36SAndroid Build Coastguard Worker ccCmd = "clang" 630*333d2b36SAndroid Build Coastguard Worker moduleFlags = cflags 631*333d2b36SAndroid Build Coastguard Worker moduleToolingFlags = toolingCflags 632*333d2b36SAndroid Build Coastguard Worker case ".cpp", ".cc", ".cxx", ".mm": 633*333d2b36SAndroid Build Coastguard Worker ccCmd = "clang++" 634*333d2b36SAndroid Build Coastguard Worker moduleFlags = cppflags 635*333d2b36SAndroid Build Coastguard Worker moduleToolingFlags = toolingCppflags 636*333d2b36SAndroid Build Coastguard Worker case ".rs": 637*333d2b36SAndroid Build Coastguard Worker // A source provider (e.g. rust_bindgen) may provide both rs and c files. 638*333d2b36SAndroid Build Coastguard Worker // Ignore the rs files. 639*333d2b36SAndroid Build Coastguard Worker continue 640*333d2b36SAndroid Build Coastguard Worker case ".h", ".hpp": 641*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("srcs", "Header file %s is not supported, instead use export_include_dirs or local_include_dirs.", srcFile) 642*333d2b36SAndroid Build Coastguard Worker continue 643*333d2b36SAndroid Build Coastguard Worker default: 644*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("srcs", "File %s has unknown extension. Supported extensions: .s, .S, .c, .cpp, .cc, .cxx, .mm", srcFile) 645*333d2b36SAndroid Build Coastguard Worker continue 646*333d2b36SAndroid Build Coastguard Worker } 647*333d2b36SAndroid Build Coastguard Worker 648*333d2b36SAndroid Build Coastguard Worker // ccCmd is "clang" or "clang++" 649*333d2b36SAndroid Build Coastguard Worker ccDesc := ccCmd 650*333d2b36SAndroid Build Coastguard Worker 651*333d2b36SAndroid Build Coastguard Worker ccCmd = "${config.ClangBin}/" + ccCmd 652*333d2b36SAndroid Build Coastguard Worker 653*333d2b36SAndroid Build Coastguard Worker if flags.clangVerify { 654*333d2b36SAndroid Build Coastguard Worker postCmd = " && touch " + objFile.String() 655*333d2b36SAndroid Build Coastguard Worker } 656*333d2b36SAndroid Build Coastguard Worker 657*333d2b36SAndroid Build Coastguard Worker var implicitOutputs android.WritablePaths 658*333d2b36SAndroid Build Coastguard Worker if coverage { 659*333d2b36SAndroid Build Coastguard Worker gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno") 660*333d2b36SAndroid Build Coastguard Worker implicitOutputs = append(implicitOutputs, gcnoFile) 661*333d2b36SAndroid Build Coastguard Worker coverageFiles = append(coverageFiles, gcnoFile) 662*333d2b36SAndroid Build Coastguard Worker } 663*333d2b36SAndroid Build Coastguard Worker 664*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 665*333d2b36SAndroid Build Coastguard Worker Rule: rule, 666*333d2b36SAndroid Build Coastguard Worker Description: ccDesc + " " + srcFile.Rel(), 667*333d2b36SAndroid Build Coastguard Worker Output: objFile, 668*333d2b36SAndroid Build Coastguard Worker ImplicitOutputs: implicitOutputs, 669*333d2b36SAndroid Build Coastguard Worker Input: srcFile, 670*333d2b36SAndroid Build Coastguard Worker Implicits: cFlagsDeps, 671*333d2b36SAndroid Build Coastguard Worker OrderOnly: pathDeps, 672*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 673*333d2b36SAndroid Build Coastguard Worker "cFlags": shareFlags("cFlags", moduleFlags), 674*333d2b36SAndroid Build Coastguard Worker "ccCmd": ccCmd, // short and not shared 675*333d2b36SAndroid Build Coastguard Worker "postCmd": postCmd, 676*333d2b36SAndroid Build Coastguard Worker }, 677*333d2b36SAndroid Build Coastguard Worker }) 678*333d2b36SAndroid Build Coastguard Worker 679*333d2b36SAndroid Build Coastguard Worker // Register post-process build statements (such as for tidy or kythe). 680*333d2b36SAndroid Build Coastguard Worker if emitXref && ctx.Module() == ctx.PrimaryModule() { 681*333d2b36SAndroid Build Coastguard Worker kytheFile := android.ObjPathWithExt(ctx, subdir, srcFile, "kzip") 682*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 683*333d2b36SAndroid Build Coastguard Worker Rule: kytheExtract, 684*333d2b36SAndroid Build Coastguard Worker Description: "Xref C++ extractor " + srcFile.Rel(), 685*333d2b36SAndroid Build Coastguard Worker Output: kytheFile, 686*333d2b36SAndroid Build Coastguard Worker Input: srcFile, 687*333d2b36SAndroid Build Coastguard Worker Implicits: cFlagsDeps, 688*333d2b36SAndroid Build Coastguard Worker OrderOnly: pathDeps, 689*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 690*333d2b36SAndroid Build Coastguard Worker "cFlags": shareFlags("cFlags", moduleFlags), 691*333d2b36SAndroid Build Coastguard Worker }, 692*333d2b36SAndroid Build Coastguard Worker }) 693*333d2b36SAndroid Build Coastguard Worker kytheFiles = append(kytheFiles, kytheFile) 694*333d2b36SAndroid Build Coastguard Worker } 695*333d2b36SAndroid Build Coastguard Worker 696*333d2b36SAndroid Build Coastguard Worker // Even with tidy, some src file could be skipped by noTidySrcsMap. 697*333d2b36SAndroid Build Coastguard Worker if tidy && !noTidySrcsMap[srcFile.String()] { 698*333d2b36SAndroid Build Coastguard Worker tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy") 699*333d2b36SAndroid Build Coastguard Worker tidyFiles = append(tidyFiles, tidyFile) 700*333d2b36SAndroid Build Coastguard Worker tidyCmd := "${config.ClangBin}/clang-tidy" 701*333d2b36SAndroid Build Coastguard Worker 702*333d2b36SAndroid Build Coastguard Worker rule := clangTidy 703*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_CLANG_TIDY") { 704*333d2b36SAndroid Build Coastguard Worker rule = clangTidyRE 705*333d2b36SAndroid Build Coastguard Worker } 706*333d2b36SAndroid Build Coastguard Worker 707*333d2b36SAndroid Build Coastguard Worker sharedCFlags := shareFlags("cFlags", moduleFlags) 708*333d2b36SAndroid Build Coastguard Worker srcRelPath := srcFile.Rel() 709*333d2b36SAndroid Build Coastguard Worker 710*333d2b36SAndroid Build Coastguard Worker // Add the .tidy rule 711*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 712*333d2b36SAndroid Build Coastguard Worker Rule: rule, 713*333d2b36SAndroid Build Coastguard Worker Description: "clang-tidy " + srcRelPath, 714*333d2b36SAndroid Build Coastguard Worker Output: tidyFile, 715*333d2b36SAndroid Build Coastguard Worker Input: srcFile, 716*333d2b36SAndroid Build Coastguard Worker Implicits: cFlagsDeps, 717*333d2b36SAndroid Build Coastguard Worker OrderOnly: pathDeps, 718*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 719*333d2b36SAndroid Build Coastguard Worker "cFlags": sharedCFlags, 720*333d2b36SAndroid Build Coastguard Worker "ccCmd": ccCmd, 721*333d2b36SAndroid Build Coastguard Worker "clangCmd": ccDesc, 722*333d2b36SAndroid Build Coastguard Worker "tidyCmd": tidyCmd, 723*333d2b36SAndroid Build Coastguard Worker "tidyFlags": shareFlags("tidyFlags", config.TidyFlagsForSrcFile(srcFile, flags.tidyFlags)), 724*333d2b36SAndroid Build Coastguard Worker "tidyVars": tidyVars, // short and not shared 725*333d2b36SAndroid Build Coastguard Worker }, 726*333d2b36SAndroid Build Coastguard Worker }) 727*333d2b36SAndroid Build Coastguard Worker } 728*333d2b36SAndroid Build Coastguard Worker 729*333d2b36SAndroid Build Coastguard Worker if dump { 730*333d2b36SAndroid Build Coastguard Worker sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump") 731*333d2b36SAndroid Build Coastguard Worker sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile) 732*333d2b36SAndroid Build Coastguard Worker 733*333d2b36SAndroid Build Coastguard Worker dumpRule := sAbiDump 734*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_ABI_DUMPER") { 735*333d2b36SAndroid Build Coastguard Worker dumpRule = sAbiDumpRE 736*333d2b36SAndroid Build Coastguard Worker } 737*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 738*333d2b36SAndroid Build Coastguard Worker Rule: dumpRule, 739*333d2b36SAndroid Build Coastguard Worker Description: "header-abi-dumper " + srcFile.Rel(), 740*333d2b36SAndroid Build Coastguard Worker Output: sAbiDumpFile, 741*333d2b36SAndroid Build Coastguard Worker Input: srcFile, 742*333d2b36SAndroid Build Coastguard Worker Implicit: objFile, 743*333d2b36SAndroid Build Coastguard Worker Implicits: cFlagsDeps, 744*333d2b36SAndroid Build Coastguard Worker OrderOnly: pathDeps, 745*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 746*333d2b36SAndroid Build Coastguard Worker "cFlags": shareFlags("cFlags", moduleToolingFlags), 747*333d2b36SAndroid Build Coastguard Worker "exportDirs": shareFlags("exportDirs", flags.sAbiFlags), 748*333d2b36SAndroid Build Coastguard Worker }, 749*333d2b36SAndroid Build Coastguard Worker }) 750*333d2b36SAndroid Build Coastguard Worker } 751*333d2b36SAndroid Build Coastguard Worker 752*333d2b36SAndroid Build Coastguard Worker } 753*333d2b36SAndroid Build Coastguard Worker 754*333d2b36SAndroid Build Coastguard Worker var tidyDepFiles android.Paths 755*333d2b36SAndroid Build Coastguard Worker if flags.needTidyFiles { 756*333d2b36SAndroid Build Coastguard Worker tidyDepFiles = tidyFiles 757*333d2b36SAndroid Build Coastguard Worker } 758*333d2b36SAndroid Build Coastguard Worker return Objects{ 759*333d2b36SAndroid Build Coastguard Worker objFiles: objFiles, 760*333d2b36SAndroid Build Coastguard Worker tidyFiles: tidyFiles, 761*333d2b36SAndroid Build Coastguard Worker tidyDepFiles: tidyDepFiles, 762*333d2b36SAndroid Build Coastguard Worker coverageFiles: coverageFiles, 763*333d2b36SAndroid Build Coastguard Worker sAbiDumpFiles: sAbiDumpFiles, 764*333d2b36SAndroid Build Coastguard Worker kytheFiles: kytheFiles, 765*333d2b36SAndroid Build Coastguard Worker } 766*333d2b36SAndroid Build Coastguard Worker} 767*333d2b36SAndroid Build Coastguard Worker 768*333d2b36SAndroid Build Coastguard Worker// Generate a rule for compiling multiple .o files to a static library (.a) 769*333d2b36SAndroid Build Coastguard Workerfunc transformObjToStaticLib(ctx android.ModuleContext, 770*333d2b36SAndroid Build Coastguard Worker objFiles android.Paths, wholeStaticLibs android.Paths, 771*333d2b36SAndroid Build Coastguard Worker flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths, validations android.Paths) { 772*333d2b36SAndroid Build Coastguard Worker 773*333d2b36SAndroid Build Coastguard Worker arCmd := "${config.ClangBin}/llvm-ar" 774*333d2b36SAndroid Build Coastguard Worker arFlags := "" 775*333d2b36SAndroid Build Coastguard Worker if !ctx.Darwin() { 776*333d2b36SAndroid Build Coastguard Worker arFlags += " --format=gnu" 777*333d2b36SAndroid Build Coastguard Worker } 778*333d2b36SAndroid Build Coastguard Worker 779*333d2b36SAndroid Build Coastguard Worker if len(wholeStaticLibs) == 0 { 780*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 781*333d2b36SAndroid Build Coastguard Worker Rule: ar, 782*333d2b36SAndroid Build Coastguard Worker Description: "static link " + outputFile.Base(), 783*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 784*333d2b36SAndroid Build Coastguard Worker Inputs: objFiles, 785*333d2b36SAndroid Build Coastguard Worker Implicits: deps, 786*333d2b36SAndroid Build Coastguard Worker Validations: validations, 787*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 788*333d2b36SAndroid Build Coastguard Worker "arFlags": "crsPD" + arFlags, 789*333d2b36SAndroid Build Coastguard Worker "arCmd": arCmd, 790*333d2b36SAndroid Build Coastguard Worker }, 791*333d2b36SAndroid Build Coastguard Worker }) 792*333d2b36SAndroid Build Coastguard Worker 793*333d2b36SAndroid Build Coastguard Worker } else { 794*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 795*333d2b36SAndroid Build Coastguard Worker Rule: arWithLibs, 796*333d2b36SAndroid Build Coastguard Worker Description: "static link " + outputFile.Base(), 797*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 798*333d2b36SAndroid Build Coastguard Worker Inputs: append(objFiles, wholeStaticLibs...), 799*333d2b36SAndroid Build Coastguard Worker Implicits: deps, 800*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 801*333d2b36SAndroid Build Coastguard Worker "arCmd": arCmd, 802*333d2b36SAndroid Build Coastguard Worker "arObjFlags": "crsPD" + arFlags, 803*333d2b36SAndroid Build Coastguard Worker "arObjs": strings.Join(objFiles.Strings(), " "), 804*333d2b36SAndroid Build Coastguard Worker "arLibFlags": "cqsL" + arFlags, 805*333d2b36SAndroid Build Coastguard Worker "arLibs": strings.Join(wholeStaticLibs.Strings(), " "), 806*333d2b36SAndroid Build Coastguard Worker }, 807*333d2b36SAndroid Build Coastguard Worker }) 808*333d2b36SAndroid Build Coastguard Worker } 809*333d2b36SAndroid Build Coastguard Worker} 810*333d2b36SAndroid Build Coastguard Worker 811*333d2b36SAndroid Build Coastguard Worker// Generate a Rust staticlib from a list of rlibDeps. Returns nil if TransformRlibstoStaticlib is nil or rlibDeps is empty. 812*333d2b36SAndroid Build Coastguard Workerfunc generateRustStaticlib(ctx android.ModuleContext, rlibDeps []RustRlibDep) android.Path { 813*333d2b36SAndroid Build Coastguard Worker if TransformRlibstoStaticlib == nil && len(rlibDeps) > 0 { 814*333d2b36SAndroid Build Coastguard Worker // This should only be reachable if a module defines Rust deps in static_libs and 815*333d2b36SAndroid Build Coastguard Worker // soong-rust hasn't been loaded alongside soong-cc (e.g. in soong-cc tests). 816*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf( 817*333d2b36SAndroid Build Coastguard Worker "TransformRlibstoStaticlib is not set and rust deps are defined in static_libs for %s", 818*333d2b36SAndroid Build Coastguard Worker ctx.ModuleName())) 819*333d2b36SAndroid Build Coastguard Worker 820*333d2b36SAndroid Build Coastguard Worker } else if len(rlibDeps) == 0 { 821*333d2b36SAndroid Build Coastguard Worker return nil 822*333d2b36SAndroid Build Coastguard Worker } 823*333d2b36SAndroid Build Coastguard Worker 824*333d2b36SAndroid Build Coastguard Worker output := android.PathForModuleOut(ctx, "generated_rust_staticlib", "librustlibs.a") 825*333d2b36SAndroid Build Coastguard Worker stemFile := output.ReplaceExtension(ctx, "rs") 826*333d2b36SAndroid Build Coastguard Worker crateNames := []string{} 827*333d2b36SAndroid Build Coastguard Worker 828*333d2b36SAndroid Build Coastguard Worker // Collect crate names 829*333d2b36SAndroid Build Coastguard Worker for _, lib := range rlibDeps { 830*333d2b36SAndroid Build Coastguard Worker // Exclude libstd so this can support no_std builds. 831*333d2b36SAndroid Build Coastguard Worker if lib.CrateName != "libstd" { 832*333d2b36SAndroid Build Coastguard Worker crateNames = append(crateNames, lib.CrateName) 833*333d2b36SAndroid Build Coastguard Worker } 834*333d2b36SAndroid Build Coastguard Worker } 835*333d2b36SAndroid Build Coastguard Worker 836*333d2b36SAndroid Build Coastguard Worker // Deduplicate any crateNames just to be safe 837*333d2b36SAndroid Build Coastguard Worker crateNames = android.FirstUniqueStrings(crateNames) 838*333d2b36SAndroid Build Coastguard Worker 839*333d2b36SAndroid Build Coastguard Worker // Write the source file 840*333d2b36SAndroid Build Coastguard Worker android.WriteFileRule(ctx, stemFile, genRustStaticlibSrcFile(crateNames)) 841*333d2b36SAndroid Build Coastguard Worker 842*333d2b36SAndroid Build Coastguard Worker return TransformRlibstoStaticlib(ctx, stemFile, rlibDeps, output) 843*333d2b36SAndroid Build Coastguard Worker} 844*333d2b36SAndroid Build Coastguard Worker 845*333d2b36SAndroid Build Coastguard Workerfunc genRustStaticlibSrcFile(crateNames []string) string { 846*333d2b36SAndroid Build Coastguard Worker lines := []string{ 847*333d2b36SAndroid Build Coastguard Worker "// @Soong generated Source", 848*333d2b36SAndroid Build Coastguard Worker "#![no_std]", // pre-emptively set no_std to support both std and no_std. 849*333d2b36SAndroid Build Coastguard Worker } 850*333d2b36SAndroid Build Coastguard Worker for _, crate := range crateNames { 851*333d2b36SAndroid Build Coastguard Worker lines = append(lines, fmt.Sprintf("extern crate %s;", crate)) 852*333d2b36SAndroid Build Coastguard Worker } 853*333d2b36SAndroid Build Coastguard Worker return strings.Join(lines, "\n") 854*333d2b36SAndroid Build Coastguard Worker} 855*333d2b36SAndroid Build Coastguard Worker 856*333d2b36SAndroid Build Coastguard Worker// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries, 857*333d2b36SAndroid Build Coastguard Worker// and shared libraries, to a shared library (.so) or dynamic executable 858*333d2b36SAndroid Build Coastguard Workerfunc transformObjToDynamicBinary(ctx android.ModuleContext, 859*333d2b36SAndroid Build Coastguard Worker objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps, crtBegin, crtEnd android.Paths, 860*333d2b36SAndroid Build Coastguard Worker groupLate bool, flags builderFlags, outputFile android.WritablePath, 861*333d2b36SAndroid Build Coastguard Worker implicitOutputs android.WritablePaths, validations android.Paths) { 862*333d2b36SAndroid Build Coastguard Worker 863*333d2b36SAndroid Build Coastguard Worker ldCmd := "${config.ClangBin}/clang++" 864*333d2b36SAndroid Build Coastguard Worker 865*333d2b36SAndroid Build Coastguard Worker var libFlagsList []string 866*333d2b36SAndroid Build Coastguard Worker 867*333d2b36SAndroid Build Coastguard Worker if len(flags.libFlags) > 0 { 868*333d2b36SAndroid Build Coastguard Worker libFlagsList = append(libFlagsList, flags.libFlags) 869*333d2b36SAndroid Build Coastguard Worker } 870*333d2b36SAndroid Build Coastguard Worker 871*333d2b36SAndroid Build Coastguard Worker if len(wholeStaticLibs) > 0 { 872*333d2b36SAndroid Build Coastguard Worker if ctx.Host() && ctx.Darwin() { 873*333d2b36SAndroid Build Coastguard Worker libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load ")) 874*333d2b36SAndroid Build Coastguard Worker } else { 875*333d2b36SAndroid Build Coastguard Worker libFlagsList = append(libFlagsList, "-Wl,--whole-archive ") 876*333d2b36SAndroid Build Coastguard Worker libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...) 877*333d2b36SAndroid Build Coastguard Worker libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ") 878*333d2b36SAndroid Build Coastguard Worker } 879*333d2b36SAndroid Build Coastguard Worker } 880*333d2b36SAndroid Build Coastguard Worker 881*333d2b36SAndroid Build Coastguard Worker libFlagsList = append(libFlagsList, staticLibs.Strings()...) 882*333d2b36SAndroid Build Coastguard Worker 883*333d2b36SAndroid Build Coastguard Worker if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 { 884*333d2b36SAndroid Build Coastguard Worker libFlagsList = append(libFlagsList, "-Wl,--start-group") 885*333d2b36SAndroid Build Coastguard Worker } 886*333d2b36SAndroid Build Coastguard Worker libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...) 887*333d2b36SAndroid Build Coastguard Worker if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 { 888*333d2b36SAndroid Build Coastguard Worker libFlagsList = append(libFlagsList, "-Wl,--end-group") 889*333d2b36SAndroid Build Coastguard Worker } 890*333d2b36SAndroid Build Coastguard Worker 891*333d2b36SAndroid Build Coastguard Worker for _, lib := range sharedLibs { 892*333d2b36SAndroid Build Coastguard Worker libFile := lib.String() 893*333d2b36SAndroid Build Coastguard Worker if ctx.Windows() { 894*333d2b36SAndroid Build Coastguard Worker libFile = pathtools.ReplaceExtension(libFile, "lib") 895*333d2b36SAndroid Build Coastguard Worker } 896*333d2b36SAndroid Build Coastguard Worker libFlagsList = append(libFlagsList, libFile) 897*333d2b36SAndroid Build Coastguard Worker } 898*333d2b36SAndroid Build Coastguard Worker 899*333d2b36SAndroid Build Coastguard Worker deps = append(deps, staticLibs...) 900*333d2b36SAndroid Build Coastguard Worker deps = append(deps, lateStaticLibs...) 901*333d2b36SAndroid Build Coastguard Worker deps = append(deps, wholeStaticLibs...) 902*333d2b36SAndroid Build Coastguard Worker deps = append(deps, crtBegin...) 903*333d2b36SAndroid Build Coastguard Worker deps = append(deps, crtEnd...) 904*333d2b36SAndroid Build Coastguard Worker 905*333d2b36SAndroid Build Coastguard Worker rule := ld 906*333d2b36SAndroid Build Coastguard Worker args := map[string]string{ 907*333d2b36SAndroid Build Coastguard Worker "ldCmd": ldCmd, 908*333d2b36SAndroid Build Coastguard Worker "crtBegin": strings.Join(crtBegin.Strings(), " "), 909*333d2b36SAndroid Build Coastguard Worker "libFlags": strings.Join(libFlagsList, " "), 910*333d2b36SAndroid Build Coastguard Worker "extraLibFlags": flags.extraLibFlags, 911*333d2b36SAndroid Build Coastguard Worker "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags, 912*333d2b36SAndroid Build Coastguard Worker "crtEnd": strings.Join(crtEnd.Strings(), " "), 913*333d2b36SAndroid Build Coastguard Worker } 914*333d2b36SAndroid Build Coastguard Worker 915*333d2b36SAndroid Build Coastguard Worker // On Windows, we always generate a PDB file 916*333d2b36SAndroid Build Coastguard Worker // --strip-debug is needed to also keep COFF symbols which are needed when 917*333d2b36SAndroid Build Coastguard Worker // we patch binaries with symbol_inject. 918*333d2b36SAndroid Build Coastguard Worker if ctx.Windows() { 919*333d2b36SAndroid Build Coastguard Worker pdb := outputFile.ReplaceExtension(ctx, "pdb") 920*333d2b36SAndroid Build Coastguard Worker args["ldFlags"] = args["ldFlags"] + " -Wl,--strip-debug -Wl,--pdb=" + pdb.String() + " " 921*333d2b36SAndroid Build Coastguard Worker implicitOutputs = append(slices.Clone(implicitOutputs), pdb) 922*333d2b36SAndroid Build Coastguard Worker } 923*333d2b36SAndroid Build Coastguard Worker 924*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_CXX_LINKS") { 925*333d2b36SAndroid Build Coastguard Worker rule = ldRE 926*333d2b36SAndroid Build Coastguard Worker args["implicitOutputs"] = strings.Join(implicitOutputs.Strings(), ",") 927*333d2b36SAndroid Build Coastguard Worker args["implicitInputs"] = strings.Join(deps.Strings(), ",") 928*333d2b36SAndroid Build Coastguard Worker } 929*333d2b36SAndroid Build Coastguard Worker 930*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 931*333d2b36SAndroid Build Coastguard Worker Rule: rule, 932*333d2b36SAndroid Build Coastguard Worker Description: "link " + outputFile.Base(), 933*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 934*333d2b36SAndroid Build Coastguard Worker ImplicitOutputs: implicitOutputs, 935*333d2b36SAndroid Build Coastguard Worker Inputs: objFiles, 936*333d2b36SAndroid Build Coastguard Worker Implicits: deps, 937*333d2b36SAndroid Build Coastguard Worker OrderOnly: sharedLibs, 938*333d2b36SAndroid Build Coastguard Worker Validations: validations, 939*333d2b36SAndroid Build Coastguard Worker Args: args, 940*333d2b36SAndroid Build Coastguard Worker }) 941*333d2b36SAndroid Build Coastguard Worker} 942*333d2b36SAndroid Build Coastguard Worker 943*333d2b36SAndroid Build Coastguard Worker// Generate a rule to combine .dump sAbi dump files from multiple source files 944*333d2b36SAndroid Build Coastguard Worker// into a single .ldump sAbi dump file 945*333d2b36SAndroid Build Coastguard Workerfunc transformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path, 946*333d2b36SAndroid Build Coastguard Worker baseName string, exportedIncludeDirs []string, symbolFile android.OptionalPath, 947*333d2b36SAndroid Build Coastguard Worker excludedSymbolVersions, excludedSymbolTags, includedSymbolTags []string, 948*333d2b36SAndroid Build Coastguard Worker api string) android.Path { 949*333d2b36SAndroid Build Coastguard Worker 950*333d2b36SAndroid Build Coastguard Worker outputFile := android.PathForModuleOut(ctx, baseName+".lsdump") 951*333d2b36SAndroid Build Coastguard Worker 952*333d2b36SAndroid Build Coastguard Worker implicits := android.Paths{soFile} 953*333d2b36SAndroid Build Coastguard Worker symbolFilterStr := "-so " + soFile.String() 954*333d2b36SAndroid Build Coastguard Worker exportedHeaderFlags := android.JoinWithPrefix(exportedIncludeDirs, "-I") 955*333d2b36SAndroid Build Coastguard Worker 956*333d2b36SAndroid Build Coastguard Worker if symbolFile.Valid() { 957*333d2b36SAndroid Build Coastguard Worker implicits = append(implicits, symbolFile.Path()) 958*333d2b36SAndroid Build Coastguard Worker symbolFilterStr += " -v " + symbolFile.String() 959*333d2b36SAndroid Build Coastguard Worker } 960*333d2b36SAndroid Build Coastguard Worker for _, ver := range excludedSymbolVersions { 961*333d2b36SAndroid Build Coastguard Worker symbolFilterStr += " --exclude-symbol-version " + ver 962*333d2b36SAndroid Build Coastguard Worker } 963*333d2b36SAndroid Build Coastguard Worker for _, tag := range excludedSymbolTags { 964*333d2b36SAndroid Build Coastguard Worker symbolFilterStr += " --exclude-symbol-tag " + tag 965*333d2b36SAndroid Build Coastguard Worker } 966*333d2b36SAndroid Build Coastguard Worker for _, tag := range includedSymbolTags { 967*333d2b36SAndroid Build Coastguard Worker symbolFilterStr += " --include-symbol-tag " + tag 968*333d2b36SAndroid Build Coastguard Worker } 969*333d2b36SAndroid Build Coastguard Worker apiLevelsJson := android.GetApiLevelsJson(ctx) 970*333d2b36SAndroid Build Coastguard Worker implicits = append(implicits, apiLevelsJson) 971*333d2b36SAndroid Build Coastguard Worker symbolFilterStr += " --api-map " + apiLevelsJson.String() 972*333d2b36SAndroid Build Coastguard Worker symbolFilterStr += " --api " + api 973*333d2b36SAndroid Build Coastguard Worker 974*333d2b36SAndroid Build Coastguard Worker rule := sAbiLink 975*333d2b36SAndroid Build Coastguard Worker args := map[string]string{ 976*333d2b36SAndroid Build Coastguard Worker "symbolFilter": symbolFilterStr, 977*333d2b36SAndroid Build Coastguard Worker "arch": ctx.Arch().ArchType.Name, 978*333d2b36SAndroid Build Coastguard Worker "exportedHeaderFlags": exportedHeaderFlags, 979*333d2b36SAndroid Build Coastguard Worker } 980*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_ABI_LINKER") { 981*333d2b36SAndroid Build Coastguard Worker rule = sAbiLinkRE 982*333d2b36SAndroid Build Coastguard Worker rbeImplicits := append(implicits.Strings(), exportedIncludeDirs...) 983*333d2b36SAndroid Build Coastguard Worker args["implicitInputs"] = strings.Join(rbeImplicits, ",") 984*333d2b36SAndroid Build Coastguard Worker } 985*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 986*333d2b36SAndroid Build Coastguard Worker Rule: rule, 987*333d2b36SAndroid Build Coastguard Worker Description: "header-abi-linker " + outputFile.Base(), 988*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 989*333d2b36SAndroid Build Coastguard Worker Inputs: sAbiDumps, 990*333d2b36SAndroid Build Coastguard Worker Implicits: implicits, 991*333d2b36SAndroid Build Coastguard Worker Args: args, 992*333d2b36SAndroid Build Coastguard Worker }) 993*333d2b36SAndroid Build Coastguard Worker return outputFile 994*333d2b36SAndroid Build Coastguard Worker} 995*333d2b36SAndroid Build Coastguard Worker 996*333d2b36SAndroid Build Coastguard Workerfunc transformAbiDumpToAbiDiff(ctx android.ModuleContext, inputDump, referenceDump android.Path, 997*333d2b36SAndroid Build Coastguard Worker baseName, nameExt string, extraFlags []string, errorMessage string) android.Path { 998*333d2b36SAndroid Build Coastguard Worker 999*333d2b36SAndroid Build Coastguard Worker var outputFile android.ModuleOutPath 1000*333d2b36SAndroid Build Coastguard Worker if nameExt != "" { 1001*333d2b36SAndroid Build Coastguard Worker outputFile = android.PathForModuleOut(ctx, baseName+"."+nameExt+".abidiff") 1002*333d2b36SAndroid Build Coastguard Worker } else { 1003*333d2b36SAndroid Build Coastguard Worker outputFile = android.PathForModuleOut(ctx, baseName+".abidiff") 1004*333d2b36SAndroid Build Coastguard Worker } 1005*333d2b36SAndroid Build Coastguard Worker libName := strings.TrimSuffix(baseName, filepath.Ext(baseName)) 1006*333d2b36SAndroid Build Coastguard Worker 1007*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1008*333d2b36SAndroid Build Coastguard Worker Rule: sAbiDiff, 1009*333d2b36SAndroid Build Coastguard Worker Description: "header-abi-diff " + outputFile.Base(), 1010*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 1011*333d2b36SAndroid Build Coastguard Worker Input: inputDump, 1012*333d2b36SAndroid Build Coastguard Worker Implicit: referenceDump, 1013*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 1014*333d2b36SAndroid Build Coastguard Worker "referenceDump": referenceDump.String(), 1015*333d2b36SAndroid Build Coastguard Worker "libName": libName, 1016*333d2b36SAndroid Build Coastguard Worker "arch": ctx.Arch().ArchType.Name, 1017*333d2b36SAndroid Build Coastguard Worker "extraFlags": strings.Join(extraFlags, " "), 1018*333d2b36SAndroid Build Coastguard Worker "errorMessage": errorMessage, 1019*333d2b36SAndroid Build Coastguard Worker }, 1020*333d2b36SAndroid Build Coastguard Worker }) 1021*333d2b36SAndroid Build Coastguard Worker return outputFile 1022*333d2b36SAndroid Build Coastguard Worker} 1023*333d2b36SAndroid Build Coastguard Worker 1024*333d2b36SAndroid Build Coastguard Worker// Generate a rule for extracting a table of contents from a shared library (.so) 1025*333d2b36SAndroid Build Coastguard Workerfunc TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path, outputFile android.WritablePath) { 1026*333d2b36SAndroid Build Coastguard Worker 1027*333d2b36SAndroid Build Coastguard Worker var format string 1028*333d2b36SAndroid Build Coastguard Worker if ctx.Darwin() { 1029*333d2b36SAndroid Build Coastguard Worker format = "--macho" 1030*333d2b36SAndroid Build Coastguard Worker } else if ctx.Windows() { 1031*333d2b36SAndroid Build Coastguard Worker format = "--pe" 1032*333d2b36SAndroid Build Coastguard Worker } else { 1033*333d2b36SAndroid Build Coastguard Worker format = "--elf" 1034*333d2b36SAndroid Build Coastguard Worker } 1035*333d2b36SAndroid Build Coastguard Worker 1036*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1037*333d2b36SAndroid Build Coastguard Worker Rule: toc, 1038*333d2b36SAndroid Build Coastguard Worker Description: "generate toc " + inputFile.Base(), 1039*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 1040*333d2b36SAndroid Build Coastguard Worker Input: inputFile, 1041*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 1042*333d2b36SAndroid Build Coastguard Worker "clangBin": "${config.ClangBin}", 1043*333d2b36SAndroid Build Coastguard Worker "format": format, 1044*333d2b36SAndroid Build Coastguard Worker }, 1045*333d2b36SAndroid Build Coastguard Worker }) 1046*333d2b36SAndroid Build Coastguard Worker} 1047*333d2b36SAndroid Build Coastguard Worker 1048*333d2b36SAndroid Build Coastguard Worker// Generate a rule for compiling multiple .o files to a .o using ld partial linking 1049*333d2b36SAndroid Build Coastguard Workerfunc transformObjsToObj(ctx android.ModuleContext, objFiles android.Paths, 1050*333d2b36SAndroid Build Coastguard Worker flags builderFlags, outputFile android.WritablePath, deps android.Paths) { 1051*333d2b36SAndroid Build Coastguard Worker 1052*333d2b36SAndroid Build Coastguard Worker ldCmd := "${config.ClangBin}/clang++" 1053*333d2b36SAndroid Build Coastguard Worker 1054*333d2b36SAndroid Build Coastguard Worker rule := partialLd 1055*333d2b36SAndroid Build Coastguard Worker args := map[string]string{ 1056*333d2b36SAndroid Build Coastguard Worker "ldCmd": ldCmd, 1057*333d2b36SAndroid Build Coastguard Worker "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags, 1058*333d2b36SAndroid Build Coastguard Worker } 1059*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_CXX_LINKS") { 1060*333d2b36SAndroid Build Coastguard Worker rule = partialLdRE 1061*333d2b36SAndroid Build Coastguard Worker args["inCommaList"] = strings.Join(objFiles.Strings(), ",") 1062*333d2b36SAndroid Build Coastguard Worker args["implicitInputs"] = strings.Join(deps.Strings(), ",") 1063*333d2b36SAndroid Build Coastguard Worker } 1064*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1065*333d2b36SAndroid Build Coastguard Worker Rule: rule, 1066*333d2b36SAndroid Build Coastguard Worker Description: "link " + outputFile.Base(), 1067*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 1068*333d2b36SAndroid Build Coastguard Worker Inputs: objFiles, 1069*333d2b36SAndroid Build Coastguard Worker Implicits: deps, 1070*333d2b36SAndroid Build Coastguard Worker Args: args, 1071*333d2b36SAndroid Build Coastguard Worker }) 1072*333d2b36SAndroid Build Coastguard Worker} 1073*333d2b36SAndroid Build Coastguard Worker 1074*333d2b36SAndroid Build Coastguard Worker// Generate a rule for running objcopy --prefix-symbols on a binary 1075*333d2b36SAndroid Build Coastguard Workerfunc transformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path, 1076*333d2b36SAndroid Build Coastguard Worker flags builderFlags, outputFile android.WritablePath) { 1077*333d2b36SAndroid Build Coastguard Worker 1078*333d2b36SAndroid Build Coastguard Worker objcopyCmd := "${config.ClangBin}/llvm-objcopy" 1079*333d2b36SAndroid Build Coastguard Worker 1080*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1081*333d2b36SAndroid Build Coastguard Worker Rule: prefixSymbols, 1082*333d2b36SAndroid Build Coastguard Worker Description: "prefix symbols " + outputFile.Base(), 1083*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 1084*333d2b36SAndroid Build Coastguard Worker Input: inputFile, 1085*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 1086*333d2b36SAndroid Build Coastguard Worker "objcopyCmd": objcopyCmd, 1087*333d2b36SAndroid Build Coastguard Worker "prefix": prefix, 1088*333d2b36SAndroid Build Coastguard Worker }, 1089*333d2b36SAndroid Build Coastguard Worker }) 1090*333d2b36SAndroid Build Coastguard Worker} 1091*333d2b36SAndroid Build Coastguard Worker 1092*333d2b36SAndroid Build Coastguard Worker// Generate a rule for running objcopy --remove-section=.llvm_addrsig on a partially linked object 1093*333d2b36SAndroid Build Coastguard Workerfunc transformObjectNoAddrSig(ctx android.ModuleContext, inputFile android.Path, outputFile android.WritablePath) { 1094*333d2b36SAndroid Build Coastguard Worker objcopyCmd := "${config.ClangBin}/llvm-objcopy" 1095*333d2b36SAndroid Build Coastguard Worker 1096*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1097*333d2b36SAndroid Build Coastguard Worker Rule: noAddrSig, 1098*333d2b36SAndroid Build Coastguard Worker Description: "remove addrsig " + outputFile.Base(), 1099*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 1100*333d2b36SAndroid Build Coastguard Worker Input: inputFile, 1101*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 1102*333d2b36SAndroid Build Coastguard Worker "objcopyCmd": objcopyCmd, 1103*333d2b36SAndroid Build Coastguard Worker }, 1104*333d2b36SAndroid Build Coastguard Worker }) 1105*333d2b36SAndroid Build Coastguard Worker} 1106*333d2b36SAndroid Build Coastguard Worker 1107*333d2b36SAndroid Build Coastguard Worker// Registers a build statement to invoke `strip` (to discard symbols and data from object files). 1108*333d2b36SAndroid Build Coastguard Workerfunc transformStrip(ctx android.ModuleContext, inputFile android.Path, 1109*333d2b36SAndroid Build Coastguard Worker outputFile android.WritablePath, flags StripFlags) { 1110*333d2b36SAndroid Build Coastguard Worker 1111*333d2b36SAndroid Build Coastguard Worker args := "" 1112*333d2b36SAndroid Build Coastguard Worker if flags.StripAddGnuDebuglink { 1113*333d2b36SAndroid Build Coastguard Worker args += " --add-gnu-debuglink" 1114*333d2b36SAndroid Build Coastguard Worker } 1115*333d2b36SAndroid Build Coastguard Worker if flags.StripKeepMiniDebugInfo { 1116*333d2b36SAndroid Build Coastguard Worker args += " --keep-mini-debug-info" 1117*333d2b36SAndroid Build Coastguard Worker } 1118*333d2b36SAndroid Build Coastguard Worker if flags.StripKeepSymbols { 1119*333d2b36SAndroid Build Coastguard Worker args += " --keep-symbols" 1120*333d2b36SAndroid Build Coastguard Worker } 1121*333d2b36SAndroid Build Coastguard Worker if flags.StripKeepSymbolsList != "" { 1122*333d2b36SAndroid Build Coastguard Worker args += " -k" + flags.StripKeepSymbolsList 1123*333d2b36SAndroid Build Coastguard Worker } 1124*333d2b36SAndroid Build Coastguard Worker if flags.StripKeepSymbolsAndDebugFrame { 1125*333d2b36SAndroid Build Coastguard Worker args += " --keep-symbols-and-debug-frame" 1126*333d2b36SAndroid Build Coastguard Worker } 1127*333d2b36SAndroid Build Coastguard Worker if ctx.Windows() { 1128*333d2b36SAndroid Build Coastguard Worker args += " --windows" 1129*333d2b36SAndroid Build Coastguard Worker } 1130*333d2b36SAndroid Build Coastguard Worker 1131*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1132*333d2b36SAndroid Build Coastguard Worker Rule: strip, 1133*333d2b36SAndroid Build Coastguard Worker Description: "strip " + outputFile.Base(), 1134*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 1135*333d2b36SAndroid Build Coastguard Worker Input: inputFile, 1136*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 1137*333d2b36SAndroid Build Coastguard Worker "args": args, 1138*333d2b36SAndroid Build Coastguard Worker }, 1139*333d2b36SAndroid Build Coastguard Worker }) 1140*333d2b36SAndroid Build Coastguard Worker} 1141*333d2b36SAndroid Build Coastguard Worker 1142*333d2b36SAndroid Build Coastguard Worker// Registers build statement to invoke `strip` on darwin architecture. 1143*333d2b36SAndroid Build Coastguard Workerfunc transformDarwinStrip(ctx android.ModuleContext, inputFile android.Path, 1144*333d2b36SAndroid Build Coastguard Worker outputFile android.WritablePath) { 1145*333d2b36SAndroid Build Coastguard Worker 1146*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1147*333d2b36SAndroid Build Coastguard Worker Rule: darwinStrip, 1148*333d2b36SAndroid Build Coastguard Worker Description: "strip " + outputFile.Base(), 1149*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 1150*333d2b36SAndroid Build Coastguard Worker Input: inputFile, 1151*333d2b36SAndroid Build Coastguard Worker }) 1152*333d2b36SAndroid Build Coastguard Worker} 1153*333d2b36SAndroid Build Coastguard Worker 1154*333d2b36SAndroid Build Coastguard Workerfunc transformDarwinUniversalBinary(ctx android.ModuleContext, outputFile android.WritablePath, inputFiles ...android.Path) { 1155*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1156*333d2b36SAndroid Build Coastguard Worker Rule: darwinLipo, 1157*333d2b36SAndroid Build Coastguard Worker Description: "lipo " + outputFile.Base(), 1158*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 1159*333d2b36SAndroid Build Coastguard Worker Inputs: inputFiles, 1160*333d2b36SAndroid Build Coastguard Worker }) 1161*333d2b36SAndroid Build Coastguard Worker} 1162*333d2b36SAndroid Build Coastguard Worker 1163*333d2b36SAndroid Build Coastguard Worker// Registers build statement to zip one or more coverage files. 1164*333d2b36SAndroid Build Coastguard Workerfunc transformCoverageFilesToZip(ctx android.ModuleContext, 1165*333d2b36SAndroid Build Coastguard Worker inputs Objects, baseName string) android.OptionalPath { 1166*333d2b36SAndroid Build Coastguard Worker 1167*333d2b36SAndroid Build Coastguard Worker if len(inputs.coverageFiles) > 0 { 1168*333d2b36SAndroid Build Coastguard Worker outputFile := android.PathForModuleOut(ctx, baseName+".zip") 1169*333d2b36SAndroid Build Coastguard Worker 1170*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1171*333d2b36SAndroid Build Coastguard Worker Rule: zip, 1172*333d2b36SAndroid Build Coastguard Worker Description: "zip " + outputFile.Base(), 1173*333d2b36SAndroid Build Coastguard Worker Inputs: inputs.coverageFiles, 1174*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 1175*333d2b36SAndroid Build Coastguard Worker }) 1176*333d2b36SAndroid Build Coastguard Worker 1177*333d2b36SAndroid Build Coastguard Worker return android.OptionalPathForPath(outputFile) 1178*333d2b36SAndroid Build Coastguard Worker } 1179*333d2b36SAndroid Build Coastguard Worker 1180*333d2b36SAndroid Build Coastguard Worker return android.OptionalPath{} 1181*333d2b36SAndroid Build Coastguard Worker} 1182*333d2b36SAndroid Build Coastguard Worker 1183*333d2b36SAndroid Build Coastguard Worker// Rule to repack an archive (.a) file with a subset of object files. 1184*333d2b36SAndroid Build Coastguard Workerfunc transformArchiveRepack(ctx android.ModuleContext, inputFile android.Path, 1185*333d2b36SAndroid Build Coastguard Worker outputFile android.WritablePath, objects []string) { 1186*333d2b36SAndroid Build Coastguard Worker 1187*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1188*333d2b36SAndroid Build Coastguard Worker Rule: archiveRepack, 1189*333d2b36SAndroid Build Coastguard Worker Description: "Repack archive " + outputFile.Base(), 1190*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 1191*333d2b36SAndroid Build Coastguard Worker Input: inputFile, 1192*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 1193*333d2b36SAndroid Build Coastguard Worker "objects": strings.Join(objects, " "), 1194*333d2b36SAndroid Build Coastguard Worker }, 1195*333d2b36SAndroid Build Coastguard Worker }) 1196*333d2b36SAndroid Build Coastguard Worker} 1197