blob: 5deb1299e455b09313a72b8b078706b4c2022c8a [file] [log] [blame]
Colin Cross3f40fa42015-01-30 17:27:36 -08001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package cc
16
17// This file generates the final rules for compiling all C/C++. All properties related to
18// compiling should have been translated into builderFlags or another argument to the Transform*
19// functions.
20
21import (
Colin Cross0af4b842015-04-30 16:36:18 -070022 "fmt"
Colin Crossb98c8b02016-07-29 13:44:28 -070023 "path/filepath"
Colin Cross0af4b842015-04-30 16:36:18 -070024 "runtime"
Colin Cross3f40fa42015-01-30 17:27:36 -080025 "strings"
Colin Crossed4cf0b2015-03-26 14:43:45 -070026
27 "github.com/google/blueprint"
Josh Gao75a50a22019-06-07 17:58:59 -070028 "github.com/google/blueprint/pathtools"
Colin Crossb98c8b02016-07-29 13:44:28 -070029
30 "android/soong/android"
31 "android/soong/cc/config"
Ramy Medhat1154b692020-04-13 13:21:23 -040032 "android/soong/remoteexec"
Colin Cross3f40fa42015-01-30 17:27:36 -080033)
34
35const (
Dan Albertc3144b12015-04-28 18:17:56 -070036 objectExtension = ".o"
Colin Cross3f40fa42015-01-30 17:27:36 -080037 staticLibraryExtension = ".a"
38)
39
40var (
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -070041 abiCheckAllowFlags = []string{
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -070042 "-allow-unreferenced-changes",
43 "-allow-unreferenced-elf-symbol-changes",
44 }
45)
46
47var (
Colin Cross635c3b02016-05-18 15:37:25 -070048 pctx = android.NewPackageContext("android/soong/cc")
Colin Cross3f40fa42015-01-30 17:27:36 -080049
Ramy Medhat8ea054a2020-01-27 14:19:44 -050050 cc = pctx.AndroidRemoteStaticRule("cc", android.RemoteRuleSupports{Goma: true, RBE: true},
Colin Cross3f40fa42015-01-30 17:27:36 -080051 blueprint.RuleParams{
52 Depfile: "${out}.d",
53 Deps: blueprint.DepsGCC,
Alistair Strachan777475c2016-08-26 12:55:49 -070054 Command: "$relPwd ${config.CcWrapper}$ccCmd -c $cFlags -MD -MF ${out}.d -o $out $in",
Dan Willemsenc94a7682015-11-17 15:27:28 -080055 CommandDeps: []string{"$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080056 },
Dan Willemsen322a0a62015-11-17 15:19:46 -080057 "ccCmd", "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080058
Kousik Kumar2976bfd2020-02-17 00:26:55 -080059 ccNoDeps = pctx.AndroidStaticRule("ccNoDeps",
Dan Willemsenfcabb1c2019-01-03 23:25:11 -080060 blueprint.RuleParams{
Kousik Kumar2976bfd2020-02-17 00:26:55 -080061 Command: "$relPwd $ccCmd -c $cFlags -o $out $in",
Dan Willemsenfcabb1c2019-01-03 23:25:11 -080062 CommandDeps: []string{"$ccCmd"},
63 },
64 "ccCmd", "cFlags")
65
Ramy Medhat1154b692020-04-13 13:21:23 -040066 ld, ldRE = remoteexec.StaticRules(pctx, "ld",
Colin Cross3f40fa42015-01-30 17:27:36 -080067 blueprint.RuleParams{
Treehugger Robot35a91832020-04-27 20:37:30 +000068 Command: "$reTemplate$ldCmd ${crtBegin} @${out}.rsp " +
Pete Bentley99f2fc22019-08-02 14:02:20 +010069 "${libFlags} ${crtEnd} -o ${out} ${ldFlags} ${extraLibFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080070 CommandDeps: []string{"$ldCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070071 Rspfile: "${out}.rsp",
72 RspfileContent: "${in}",
Colin Cross36ae1352019-03-29 15:55:30 -070073 // clang -Wl,--out-implib doesn't update its output file if it hasn't changed.
74 Restat: true,
Colin Cross3f40fa42015-01-30 17:27:36 -080075 },
Treehugger Robot35a91832020-04-27 20:37:30 +000076 &remoteexec.REParams{
77 Labels: map[string]string{"type": "link", "tool": "clang"},
Ramy Medhat1154b692020-04-13 13:21:23 -040078 ExecStrategy: "${config.RECXXLinksExecStrategy}",
Ramy Medhatc60af152020-08-28 14:21:55 -040079 Inputs: []string{"${out}.rsp", "$implicitInputs"},
Ramy Medhat1154b692020-04-13 13:21:23 -040080 RSPFile: "${out}.rsp",
Kousik Kumar459c6b22020-04-28 09:13:50 +000081 OutputFiles: []string{"${out}", "$implicitOutputs"},
Ramy Medhat1154b692020-04-13 13:21:23 -040082 ToolchainInputs: []string{"$ldCmd"},
83 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXLinksPool}"},
Ramy Medhatc60af152020-08-28 14:21:55 -040084 }, []string{"ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags", "extraLibFlags"}, []string{"implicitInputs", "implicitOutputs"})
Colin Cross3f40fa42015-01-30 17:27:36 -080085
Ramy Medhat1154b692020-04-13 13:21:23 -040086 partialLd, partialLdRE = remoteexec.StaticRules(pctx, "partialLd",
Colin Cross3f40fa42015-01-30 17:27:36 -080087 blueprint.RuleParams{
Chih-Hung Hsieh3ede2942018-01-10 14:30:44 -080088 // Without -no-pie, clang 7.0 adds -pie to link Android files,
89 // but -r and -pie cannot be used together.
Treehugger Robot35a91832020-04-27 20:37:30 +000090 Command: "$reTemplate$ldCmd -fuse-ld=lld -nostdlib -no-pie -Wl,-r ${in} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080091 CommandDeps: []string{"$ldCmd"},
Ramy Medhat1154b692020-04-13 13:21:23 -040092 }, &remoteexec.REParams{
Treehugger Robot35a91832020-04-27 20:37:30 +000093 Labels: map[string]string{"type": "link", "tool": "clang"},
94 ExecStrategy: "${config.RECXXLinksExecStrategy}",
Ramy Medhatc60af152020-08-28 14:21:55 -040095 Inputs: []string{"$inCommaList", "$implicitInputs"},
Kousik Kumar459c6b22020-04-28 09:13:50 +000096 OutputFiles: []string{"${out}", "$implicitOutputs"},
Ramy Medhat1154b692020-04-13 13:21:23 -040097 ToolchainInputs: []string{"$ldCmd"},
98 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXLinksPool}"},
Ramy Medhatc60af152020-08-28 14:21:55 -040099 }, []string{"ldCmd", "ldFlags"}, []string{"implicitInputs", "inCommaList", "implicitOutputs"})
Colin Cross3f40fa42015-01-30 17:27:36 -0800100
Colin Cross9d45bb72016-08-29 16:14:13 -0700101 ar = pctx.AndroidStaticRule("ar",
Colin Cross3f40fa42015-01-30 17:27:36 -0800102 blueprint.RuleParams{
Colin Cross7d21c442015-03-30 17:47:53 -0700103 Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800104 CommandDeps: []string{"$arCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -0700105 Rspfile: "${out}.rsp",
106 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -0800107 },
108 "arCmd", "arFlags")
109
Colin Cross9d45bb72016-08-29 16:14:13 -0700110 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700111 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -0700112 Command: "${config.MacStripPath} -u -r -o $out $in",
113 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700114 })
Colin Cross0af4b842015-04-30 16:36:18 -0700115
Colin Cross9d45bb72016-08-29 16:14:13 -0700116 prefixSymbols = pctx.AndroidStaticRule("prefixSymbols",
Colin Crossbfae8852015-03-26 14:44:11 -0700117 blueprint.RuleParams{
118 Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800119 CommandDeps: []string{"$objcopyCmd"},
Colin Crossbfae8852015-03-26 14:44:11 -0700120 },
121 "objcopyCmd", "prefix")
122
Nan Zhang43a485c2017-03-27 14:27:58 -0700123 _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh")
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800124 _ = pctx.SourcePathVariable("xzCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/xz")
Colin Cross665dce92016-04-28 14:50:03 -0700125
Colin Crossee3ea312019-05-17 15:36:46 -0700126 // b/132822437: objcopy uses a file descriptor per .o file when called on .a files, which runs the system out of
Colin Crossbadf8d62019-05-22 13:25:50 -0700127 // file descriptors on darwin. Limit concurrent calls to 5 on darwin.
Colin Crossee3ea312019-05-17 15:36:46 -0700128 darwinStripPool = func() blueprint.Pool {
129 if runtime.GOOS == "darwin" {
130 return pctx.StaticPool("darwinStripPool", blueprint.PoolParams{
Colin Crossbadf8d62019-05-22 13:25:50 -0700131 Depth: 5,
Colin Crossee3ea312019-05-17 15:36:46 -0700132 })
133 } else {
134 return nil
135 }
136 }()
137
Colin Cross9d45bb72016-08-29 16:14:13 -0700138 strip = pctx.AndroidStaticRule("strip",
Colin Cross665dce92016-04-28 14:50:03 -0700139 blueprint.RuleParams{
140 Depfile: "${out}.d",
141 Deps: blueprint.DepsGCC,
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700142 Command: "CROSS_COMPILE=$crossCompile XZ=$xzCmd CLANG_BIN=${config.ClangBin} $stripPath ${args} -i ${in} -o ${out} -d ${out}.d",
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800143 CommandDeps: []string{"$stripPath", "$xzCmd"},
Colin Crossee3ea312019-05-17 15:36:46 -0700144 Pool: darwinStripPool,
Colin Cross665dce92016-04-28 14:50:03 -0700145 },
146 "args", "crossCompile")
147
Yi Kongc49c3932019-10-15 02:01:19 -0700148 _ = pctx.SourcePathVariable("archiveRepackPath", "build/soong/scripts/archive_repack.sh")
149
150 archiveRepack = pctx.AndroidStaticRule("archiveRepack",
151 blueprint.RuleParams{
152 Depfile: "${out}.d",
153 Deps: blueprint.DepsGCC,
154 Command: "CLANG_BIN=${config.ClangBin} $archiveRepackPath -i ${in} -o ${out} -d ${out}.d ${objects}",
155 CommandDeps: []string{"$archiveRepackPath"},
156 },
157 "objects")
158
Colin Cross9d45bb72016-08-29 16:14:13 -0700159 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700160 blueprint.RuleParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700161 Command: "rm -f $out && touch $out",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700162 })
163
Nan Zhang43a485c2017-03-27 14:27:58 -0700164 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700165
166 toc = pctx.AndroidStaticRule("toc",
167 blueprint.RuleParams{
168 Depfile: "${out}.d",
169 Deps: blueprint.DepsGCC,
Colin Crossb496cfd2018-09-10 16:50:05 -0700170 Command: "CROSS_COMPILE=$crossCompile $tocPath $format -i ${in} -o ${out} -d ${out}.d",
Colin Cross26c34ed2016-09-30 17:10:16 -0700171 CommandDeps: []string{"$tocPath"},
172 Restat: true,
173 },
Colin Crossb496cfd2018-09-10 16:50:05 -0700174 "crossCompile", "format")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700175
176 clangTidy = pctx.AndroidStaticRule("clangTidy",
177 blueprint.RuleParams{
George Burgess IVc4624c02019-04-04 16:22:37 -0700178 Command: "rm -f $out && ${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out",
179 CommandDeps: []string{"${config.ClangBin}/clang-tidy"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700180 },
181 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800182
Nan Zhang43a485c2017-03-27 14:27:58 -0700183 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800184
185 yasm = pctx.AndroidStaticRule("yasm",
186 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700187 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800188 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700189 Depfile: "$out.d",
190 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800191 },
192 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800193
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700194 windres = pctx.AndroidStaticRule("windres",
195 blueprint.RuleParams{
Nick Desaulniers18eeffa2020-01-29 16:20:11 -0800196 Command: "$windresCmd $flags -I$$(dirname $in) -i $in -o $out --preprocessor \"${config.ClangBin}/clang -E -xc-header -DRC_INVOKED\"",
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700197 CommandDeps: []string{"$windresCmd"},
198 },
199 "windresCmd", "flags")
200
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800201 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800202
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700203 // -w has been added since header-abi-dumper does not need to produce any sort of diagnostic information.
Treehugger Robot35a91832020-04-27 20:37:30 +0000204 sAbiDump, sAbiDumpRE = remoteexec.StaticRules(pctx, "sAbiDump",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800205 blueprint.RuleParams{
Treehugger Robot35a91832020-04-27 20:37:30 +0000206 Command: "rm -f $out && $reTemplate$sAbiDumper -o ${out} $in $exportDirs -- $cFlags -w -isystem prebuilts/clang-tools/${config.HostPrebuiltTag}/clang-headers",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800207 CommandDeps: []string{"$sAbiDumper"},
Treehugger Robot35a91832020-04-27 20:37:30 +0000208 }, &remoteexec.REParams{
209 Labels: map[string]string{"type": "abi-dump", "tool": "header-abi-dumper"},
210 ExecStrategy: "${config.REAbiDumperExecStrategy}",
211 Platform: map[string]string{
212 remoteexec.PoolKey: "${config.RECXXPool}",
213 "InputRootAbsolutePath": android.AbsSrcDirForExistingUseCases(),
214 },
215 }, []string{"cFlags", "exportDirs"}, nil)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800216
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800217 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
Ramy Medhatc1be5ca2020-05-07 06:56:47 -0400218 _ = pctx.SourcePathVariable("sAbiLinkerLibs", "prebuilts/clang-tools/${config.HostPrebuiltTag}/lib64")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800219
Ramy Medhatc1be5ca2020-05-07 06:56:47 -0400220 sAbiLink, sAbiLinkRE = remoteexec.StaticRules(pctx, "sAbiLink",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800221 blueprint.RuleParams{
Ramy Medhatc1be5ca2020-05-07 06:56:47 -0400222 Command: "$reTemplate$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800223 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800224 Rspfile: "${out}.rsp",
225 RspfileContent: "${in}",
Ramy Medhatc1be5ca2020-05-07 06:56:47 -0400226 }, &remoteexec.REParams{
227 Labels: map[string]string{"type": "tool", "name": "abi-linker"},
228 ExecStrategy: "${config.REAbiLinkerExecStrategy}",
Ramy Medhatc60af152020-08-28 14:21:55 -0400229 Inputs: []string{"$sAbiLinkerLibs", "${out}.rsp", "$implicitInputs"},
Ramy Medhatc1be5ca2020-05-07 06:56:47 -0400230 RSPFile: "${out}.rsp",
231 OutputFiles: []string{"$out"},
232 ToolchainInputs: []string{"$sAbiLinker"},
233 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXPool}"},
Ramy Medhatc60af152020-08-28 14:21:55 -0400234 }, []string{"symbolFilter", "arch", "exportedHeaderFlags"}, []string{"implicitInputs"})
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800235
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800236 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700237
Colin Cross2e2dbc22019-09-25 13:31:46 -0700238 sAbiDiff = pctx.RuleFunc("sAbiDiff",
Dan Willemsen54daaf02018-03-12 13:24:09 -0700239 func(ctx android.PackageRuleContext) blueprint.RuleParams {
Jayant Chowdhary39d167a2018-05-17 16:45:51 -0700240 // TODO(b/78139997): Add -check-all-apis back
Logan Chien6227fed2019-02-18 13:12:21 +0800241 commandStr := "($sAbiDiffer ${allowFlags} -lib ${libName} -arch ${arch} -o ${out} -new ${in} -old ${referenceDump})"
242 commandStr += "|| (echo 'error: Please update ABI references with: $$ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py ${createReferenceDumpFlags} -l ${libName}'"
Logan Chien8f74fe62019-01-28 12:14:54 +0800243 commandStr += " && (mkdir -p $$DIST_DIR/abidiffs && cp ${out} $$DIST_DIR/abidiffs/)"
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800244 commandStr += " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800245 return blueprint.RuleParams{
246 Command: commandStr,
247 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700248 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800249 },
Logan Chien6227fed2019-02-18 13:12:21 +0800250 "allowFlags", "referenceDump", "libName", "arch", "createReferenceDumpFlags")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700251
252 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
253 blueprint.RuleParams{
254 Command: "gunzip -c $in > $out",
255 })
Oliver Nguyenc7434142019-04-24 14:22:25 -0700256
257 zip = pctx.AndroidStaticRule("zip",
258 blueprint.RuleParams{
259 Command: "cat $out.rsp | tr ' ' '\\n' | tr -d \\' | sort -u > ${out}.tmp && ${SoongZipCmd} -o ${out} -C $$OUT_DIR -l ${out}.tmp",
260 CommandDeps: []string{"${SoongZipCmd}"},
261 Rspfile: "$out.rsp",
262 RspfileContent: "$in",
263 })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800264
265 _ = pctx.SourcePathVariable("cxxExtractor",
266 "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/cxx_extractor")
Sasha Smundak65143642019-09-26 20:14:28 -0700267 _ = pctx.SourcePathVariable("kytheVnames", "build/soong/vnames.json")
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800268 _ = pctx.VariableFunc("kytheCorpus",
269 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCorpusName() })
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800270 _ = pctx.VariableFunc("kytheCuEncoding",
271 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCuEncoding() })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800272 kytheExtract = pctx.StaticRule("kythe",
273 blueprint.RuleParams{
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800274 Command: `rm -f $out && ` +
275 `KYTHE_CORPUS=${kytheCorpus} KYTHE_OUTPUT_FILE=$out KYTHE_VNAMES=$kytheVnames KYTHE_KZIP_ENCODING=${kytheCuEncoding} ` +
276 `$cxxExtractor $cFlags $in `,
Sasha Smundak65143642019-09-26 20:14:28 -0700277 CommandDeps: []string{"$cxxExtractor", "$kytheVnames"},
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800278 },
279 "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -0800280)
281
Dan Willemsen322a0a62015-11-17 15:19:46 -0800282func init() {
283 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
284 // debug output. That way two builds in two different directories will
285 // create the same output.
286 if runtime.GOOS != "darwin" {
287 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
288 } else {
289 // Darwin doesn't have /proc
290 pctx.StaticVariable("relPwd", "")
291 }
Oliver Nguyenc7434142019-04-24 14:22:25 -0700292
293 pctx.HostBinToolVariable("SoongZipCmd", "soong_zip")
Ramy Medhat1154b692020-04-13 13:21:23 -0400294 pctx.Import("android/soong/remoteexec")
Dan Willemsen322a0a62015-11-17 15:19:46 -0800295}
296
Colin Cross3f40fa42015-01-30 17:27:36 -0800297type builderFlags struct {
Colin Cross6d88dba2019-11-06 07:06:58 -0800298 globalCommonFlags string
299 globalAsFlags string
300 globalYasmFlags string
301 globalCFlags string
302 globalToolingCFlags string // A separate set of cFlags for clang LibTooling tools
303 globalToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
304 globalConlyFlags string
305 globalCppFlags string
306 globalLdFlags string
307
308 localCommonFlags string
309 localAsFlags string
310 localYasmFlags string
311 localCFlags string
312 localToolingCFlags string // A separate set of cFlags for clang LibTooling tools
313 localToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
314 localConlyFlags string
315 localCppFlags string
316 localLdFlags string
317
318 libFlags string
319 extraLibFlags string
320 tidyFlags string
321 sAbiFlags string
322 aidlFlags string
323 rsFlags string
324 toolchain config.Toolchain
325 tidy bool
Oliver Nguyen6f641c12020-04-21 12:40:27 -0700326 gcovCoverage bool
Colin Cross6d88dba2019-11-06 07:06:58 -0800327 sAbiDump bool
328 emitXrefs bool
Colin Cross665dce92016-04-28 14:50:03 -0700329
Dan Willemsen98ab3112019-08-27 21:20:40 -0700330 assemblerWithCpp bool
331
Colin Crossc3199482017-03-30 15:03:04 -0700332 systemIncludeFlags string
333
Colin Cross18c0c5a2016-12-01 14:45:23 -0800334 groupStaticLibs bool
335
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700336 stripKeepSymbols bool
337 stripKeepSymbolsList string
338 stripKeepSymbolsAndDebugFrame bool
339 stripKeepMiniDebugInfo bool
340 stripAddGnuDebuglink bool
341 stripUseGnuStrip bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800342
Colin Cross19878da2019-03-28 14:45:07 -0700343 proto android.ProtoFlags
Dan Willemsen60e62f02018-11-16 21:05:32 -0800344 protoC bool
345 protoOptionsFile bool
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700346
347 yacc *YaccProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800348}
349
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700350type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800351 objFiles android.Paths
352 tidyFiles android.Paths
353 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800354 sAbiDumpFiles android.Paths
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800355 kytheFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700356}
357
358func (a Objects) Copy() Objects {
359 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800360 objFiles: append(android.Paths{}, a.objFiles...),
361 tidyFiles: append(android.Paths{}, a.tidyFiles...),
362 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800363 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800364 kytheFiles: append(android.Paths{}, a.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700365 }
366}
367
368func (a Objects) Append(b Objects) Objects {
369 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800370 objFiles: append(a.objFiles, b.objFiles...),
371 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
372 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800373 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800374 kytheFiles: append(a.kytheFiles, b.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700375 }
376}
377
Colin Cross3f40fa42015-01-30 17:27:36 -0800378// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700379func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800380 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700381
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700382 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700383 var tidyFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700384 if flags.tidy {
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700385 tidyFiles = make(android.Paths, 0, len(srcFiles))
386 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800387 var coverageFiles android.Paths
Oliver Nguyen6f641c12020-04-21 12:40:27 -0700388 if flags.gcovCoverage {
Dan Willemsen581341d2017-02-09 16:16:31 -0800389 coverageFiles = make(android.Paths, 0, len(srcFiles))
390 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800391 var kytheFiles android.Paths
392 if flags.emitXrefs {
393 kytheFiles = make(android.Paths, 0, len(srcFiles))
394 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800395
Colin Cross6d88dba2019-11-06 07:06:58 -0800396 // Produce fully expanded flags for use by C tools, C compiles, C++ tools, C++ compiles, and asm compiles
397 // respectively.
398 toolingCflags := flags.globalCommonFlags + " " +
399 flags.globalToolingCFlags + " " +
400 flags.globalConlyFlags + " " +
401 flags.localCommonFlags + " " +
402 flags.localToolingCFlags + " " +
403 flags.localConlyFlags + " " +
404 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700405
Colin Cross6d88dba2019-11-06 07:06:58 -0800406 cflags := flags.globalCommonFlags + " " +
407 flags.globalCFlags + " " +
408 flags.globalConlyFlags + " " +
409 flags.localCommonFlags + " " +
410 flags.localCFlags + " " +
411 flags.localConlyFlags + " " +
412 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700413
Colin Cross6d88dba2019-11-06 07:06:58 -0800414 toolingCppflags := flags.globalCommonFlags + " " +
415 flags.globalToolingCFlags + " " +
416 flags.globalToolingCppFlags + " " +
417 flags.localCommonFlags + " " +
418 flags.localToolingCFlags + " " +
419 flags.localToolingCppFlags + " " +
420 flags.systemIncludeFlags
Colin Crossc3199482017-03-30 15:03:04 -0700421
Colin Cross6d88dba2019-11-06 07:06:58 -0800422 cppflags := flags.globalCommonFlags + " " +
423 flags.globalCFlags + " " +
424 flags.globalCppFlags + " " +
425 flags.localCommonFlags + " " +
426 flags.localCFlags + " " +
427 flags.localCppFlags + " " +
428 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700429
Colin Cross6d88dba2019-11-06 07:06:58 -0800430 asflags := flags.globalCommonFlags + " " +
431 flags.globalAsFlags + " " +
432 flags.localCommonFlags + " " +
433 flags.localAsFlags + " " +
434 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700435
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800436 var sAbiDumpFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700437 if flags.sAbiDump {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800438 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
439 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800440
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700441 cflags += " ${config.NoOverrideClangGlobalCflags}"
442 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
443 cppflags += " ${config.NoOverrideClangGlobalCflags}"
444 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800445
Colin Cross3f40fa42015-01-30 17:27:36 -0800446 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700447 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800448
449 objFiles[i] = objFile
450
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700451 switch srcFile.Ext() {
452 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700453 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700454 Rule: yasm,
455 Description: "yasm " + srcFile.Rel(),
456 Output: objFile,
457 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800458 Implicits: cFlagsDeps,
459 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800460 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800461 "asFlags": flags.globalYasmFlags + " " + flags.localYasmFlags,
Colin Cross91e90042016-12-02 17:13:24 -0800462 },
463 })
464 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700465 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700466 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700467 Rule: windres,
468 Description: "windres " + srcFile.Rel(),
469 Output: objFile,
470 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800471 Implicits: cFlagsDeps,
472 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700473 Args: map[string]string{
474 "windresCmd": gccCmd(flags.toolchain, "windres"),
475 "flags": flags.toolchain.WindresFlags(),
476 },
477 })
478 continue
Pete Bentleyfcf55bf2019-08-16 20:14:32 +0100479 case ".o":
480 objFiles[i] = srcFile
481 continue
Colin Cross91e90042016-12-02 17:13:24 -0800482 }
483
Colin Cross6d88dba2019-11-06 07:06:58 -0800484 var moduleFlags string
485 var moduleToolingFlags string
486
Colin Cross3f40fa42015-01-30 17:27:36 -0800487 var ccCmd string
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700488 tidy := flags.tidy
Oliver Nguyen6f641c12020-04-21 12:40:27 -0700489 coverage := flags.gcovCoverage
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700490 dump := flags.sAbiDump
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800491 rule := cc
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800492 emitXref := flags.emitXrefs
Colin Cross3f40fa42015-01-30 17:27:36 -0800493
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700494 switch srcFile.Ext() {
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800495 case ".s":
Dan Willemsen98ab3112019-08-27 21:20:40 -0700496 if !flags.assemblerWithCpp {
497 rule = ccNoDeps
498 }
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800499 fallthrough
500 case ".S":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700501 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800502 moduleFlags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700503 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800504 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800505 dump = false
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800506 emitXref = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800507 case ".c":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700508 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800509 moduleFlags = cflags
510 moduleToolingFlags = toolingCflags
Colin Crossd34ab7c2019-06-27 14:46:10 -0700511 case ".cpp", ".cc", ".cxx", ".mm":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700512 ccCmd = "clang++"
Colin Cross6d88dba2019-11-06 07:06:58 -0800513 moduleFlags = cppflags
514 moduleToolingFlags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800515 default:
516 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
517 continue
518 }
519
Colin Cross67a5c132017-05-09 13:45:28 -0700520 ccDesc := ccCmd
521
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700522 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800523
Dan Willemsen581341d2017-02-09 16:16:31 -0800524 var implicitOutputs android.WritablePaths
525 if coverage {
526 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
527 implicitOutputs = append(implicitOutputs, gcnoFile)
528 coverageFiles = append(coverageFiles, gcnoFile)
529 }
530
Colin Crossae887032017-10-23 17:16:14 -0700531 ctx.Build(pctx, android.BuildParams{
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800532 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700533 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800534 Output: objFile,
535 ImplicitOutputs: implicitOutputs,
536 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800537 Implicits: cFlagsDeps,
538 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800539 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800540 "cFlags": moduleFlags,
Colin Cross28344522015-04-22 13:07:53 -0700541 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800542 },
543 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700544
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800545 if emitXref {
546 kytheFile := android.ObjPathWithExt(ctx, subdir, srcFile, "kzip")
547 ctx.Build(pctx, android.BuildParams{
548 Rule: kytheExtract,
549 Description: "Xref C++ extractor " + srcFile.Rel(),
550 Output: kytheFile,
551 Input: srcFile,
552 Implicits: cFlagsDeps,
553 OrderOnly: pathDeps,
554 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800555 "cFlags": moduleFlags,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800556 },
557 })
558 kytheFiles = append(kytheFiles, kytheFile)
559 }
560
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700561 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700562 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700563 tidyFiles = append(tidyFiles, tidyFile)
564
Colin Crossae887032017-10-23 17:16:14 -0700565 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700566 Rule: clangTidy,
567 Description: "clang-tidy " + srcFile.Rel(),
568 Output: tidyFile,
569 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700570 // We must depend on objFile, since clang-tidy doesn't
571 // support exporting dependencies.
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700572 Implicit: objFile,
573 Implicits: cFlagsDeps,
574 OrderOnly: pathDeps,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700575 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800576 "cFlags": moduleToolingFlags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700577 "tidyFlags": flags.tidyFlags,
578 },
579 })
580 }
581
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800582 if dump {
583 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
584 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
585
Treehugger Robot35a91832020-04-27 20:37:30 +0000586 dumpRule := sAbiDump
587 if ctx.Config().IsEnvTrue("RBE_ABI_DUMPER") {
588 dumpRule = sAbiDumpRE
589 }
Colin Crossae887032017-10-23 17:16:14 -0700590 ctx.Build(pctx, android.BuildParams{
Treehugger Robot35a91832020-04-27 20:37:30 +0000591 Rule: dumpRule,
Colin Cross67a5c132017-05-09 13:45:28 -0700592 Description: "header-abi-dumper " + srcFile.Rel(),
593 Output: sAbiDumpFile,
594 Input: srcFile,
595 Implicit: objFile,
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700596 Implicits: cFlagsDeps,
597 OrderOnly: pathDeps,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800598 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800599 "cFlags": moduleToolingFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800600 "exportDirs": flags.sAbiFlags,
601 },
602 })
603 }
604
Colin Cross3f40fa42015-01-30 17:27:36 -0800605 }
606
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700607 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800608 objFiles: objFiles,
609 tidyFiles: tidyFiles,
610 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800611 sAbiDumpFiles: sAbiDumpFiles,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800612 kytheFiles: kytheFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700613 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800614}
615
616// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700617func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700618 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800619
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800620 arCmd := "${config.ClangBin}/llvm-ar"
Yi Kongee96a792019-09-06 15:11:57 -0700621 arFlags := "crsPD"
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800622 if !ctx.Darwin() {
623 arFlags += " -format=gnu"
624 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800625
Colin Crossae887032017-10-23 17:16:14 -0700626 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700627 Rule: ar,
628 Description: "static link " + outputFile.Base(),
629 Output: outputFile,
630 Inputs: objFiles,
631 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800632 Args: map[string]string{
633 "arFlags": arFlags,
634 "arCmd": arCmd,
635 },
636 })
637}
638
639// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700640// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700641func TransformObjToDynamicBinary(ctx android.ModuleContext,
642 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
Josh Gao75a50a22019-06-07 17:58:59 -0700643 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath, implicitOutputs android.WritablePaths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800644
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700645 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800646
Colin Cross3f40fa42015-01-30 17:27:36 -0800647 var libFlagsList []string
648
Colin Cross16b23492016-01-06 14:41:07 -0800649 if len(flags.libFlags) > 0 {
650 libFlagsList = append(libFlagsList, flags.libFlags)
651 }
652
Colin Cross3f40fa42015-01-30 17:27:36 -0800653 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800654 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700655 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700656 } else {
657 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700658 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700659 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
660 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800661 }
662
Colin Cross7a7cf972016-12-05 18:47:39 -0800663 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800664 libFlagsList = append(libFlagsList, "-Wl,--start-group")
665 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700666 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800667 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800668 libFlagsList = append(libFlagsList, "-Wl,--end-group")
669 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800670
Stephen Hines10347862016-07-18 15:54:54 -0700671 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700672 libFlagsList = append(libFlagsList, "-Wl,--start-group")
673 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700674 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700675 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700676 libFlagsList = append(libFlagsList, "-Wl,--end-group")
677 }
678
Colin Cross3f40fa42015-01-30 17:27:36 -0800679 for _, lib := range sharedLibs {
Josh Gao75a50a22019-06-07 17:58:59 -0700680 libFile := lib.String()
681 if ctx.Windows() {
682 libFile = pathtools.ReplaceExtension(libFile, "lib")
683 }
684 libFlagsList = append(libFlagsList, libFile)
Colin Cross3f40fa42015-01-30 17:27:36 -0800685 }
686
Colin Cross3f40fa42015-01-30 17:27:36 -0800687 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700688 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800689 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700690 if crtBegin.Valid() {
691 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800692 }
693
Ramy Medhat1154b692020-04-13 13:21:23 -0400694 rule := ld
Kousik Kumar459c6b22020-04-28 09:13:50 +0000695 args := map[string]string{
696 "ldCmd": ldCmd,
697 "crtBegin": crtBegin.String(),
698 "libFlags": strings.Join(libFlagsList, " "),
699 "extraLibFlags": flags.extraLibFlags,
700 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
701 "crtEnd": crtEnd.String(),
702 }
Ramy Medhat1154b692020-04-13 13:21:23 -0400703 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
704 rule = ldRE
Kousik Kumar459c6b22020-04-28 09:13:50 +0000705 args["implicitOutputs"] = strings.Join(implicitOutputs.Strings(), ",")
Ramy Medhatc60af152020-08-28 14:21:55 -0400706 args["implicitInputs"] = strings.Join(deps.Strings(), ",")
Ramy Medhat1154b692020-04-13 13:21:23 -0400707 }
708
Colin Crossae887032017-10-23 17:16:14 -0700709 ctx.Build(pctx, android.BuildParams{
Ramy Medhat1154b692020-04-13 13:21:23 -0400710 Rule: rule,
Josh Gao75a50a22019-06-07 17:58:59 -0700711 Description: "link " + outputFile.Base(),
712 Output: outputFile,
713 ImplicitOutputs: implicitOutputs,
714 Inputs: objFiles,
715 Implicits: deps,
Kousik Kumar459c6b22020-04-28 09:13:50 +0000716 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800717 })
718}
719
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800720// Generate a rule to combine .dump sAbi dump files from multiple source files
721// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700722func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800723 baseName, exportedHeaderFlags string, symbolFile android.OptionalPath,
724 excludedSymbolVersions, excludedSymbolTags []string) android.OptionalPath {
725
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800726 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800727
728 implicits := android.Paths{soFile}
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800729 symbolFilterStr := "-so " + soFile.String()
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800730
731 if symbolFile.Valid() {
732 implicits = append(implicits, symbolFile.Path())
733 symbolFilterStr += " -v " + symbolFile.String()
734 }
735 for _, ver := range excludedSymbolVersions {
736 symbolFilterStr += " --exclude-symbol-version " + ver
737 }
738 for _, tag := range excludedSymbolTags {
739 symbolFilterStr += " --exclude-symbol-tag " + tag
740 }
Ramy Medhatc1be5ca2020-05-07 06:56:47 -0400741 rule := sAbiLink
742 args := map[string]string{
743 "symbolFilter": symbolFilterStr,
744 "arch": ctx.Arch().ArchType.Name,
745 "exportedHeaderFlags": exportedHeaderFlags,
746 }
747 if ctx.Config().IsEnvTrue("RBE_ABI_LINKER") {
748 rule = sAbiLinkRE
749 rbeImplicits := implicits.Strings()
750 for _, p := range strings.Split(exportedHeaderFlags, " ") {
751 if len(p) > 2 {
752 // Exclude the -I prefix.
753 rbeImplicits = append(rbeImplicits, p[2:])
754 }
755 }
Ramy Medhatc60af152020-08-28 14:21:55 -0400756 args["implicitInputs"] = strings.Join(rbeImplicits, ",")
Ramy Medhatc1be5ca2020-05-07 06:56:47 -0400757 }
Colin Crossae887032017-10-23 17:16:14 -0700758 ctx.Build(pctx, android.BuildParams{
Ramy Medhatc1be5ca2020-05-07 06:56:47 -0400759 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700760 Description: "header-abi-linker " + outputFile.Base(),
761 Output: outputFile,
762 Inputs: sAbiDumps,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800763 Implicits: implicits,
Ramy Medhatc1be5ca2020-05-07 06:56:47 -0400764 Args: args,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800765 })
766 return android.OptionalPathForPath(outputFile)
767}
768
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700769func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
770 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700771 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700772 Rule: unzipRefSAbiDump,
773 Description: "gunzip" + outputFile.Base(),
774 Output: outputFile,
775 Input: zippedRefDump,
776 })
777 return outputFile
778}
779
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800780func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chien62f1f942019-02-18 15:40:42 +0800781 baseName, exportedHeaderFlags string, isLlndk, isNdk, isVndkExt bool) android.OptionalPath {
Logan Chienf3511742017-10-31 18:04:35 +0800782
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800783 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700784 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Logan Chien6227fed2019-02-18 13:12:21 +0800785 createReferenceDumpFlags := ""
786
Jayant Chowdharye4499502018-01-17 13:13:33 -0800787 localAbiCheckAllowFlags := append([]string(nil), abiCheckAllowFlags...)
788 if exportedHeaderFlags == "" {
789 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-advice-only")
790 }
Logan Chien62f1f942019-02-18 15:40:42 +0800791 if isLlndk || isNdk {
Logan Chien6227fed2019-02-18 13:12:21 +0800792 createReferenceDumpFlags = "--llndk"
Logan Chien62f1f942019-02-18 15:40:42 +0800793 if isLlndk {
794 // TODO(b/130324828): "-consider-opaque-types-different" should apply to
795 // both LLNDK and NDK shared libs. However, a known issue in header-abi-diff
796 // breaks libaaudio. Remove the if-guard after the issue is fixed.
797 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-consider-opaque-types-different")
798 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700799 }
Logan Chienf3511742017-10-31 18:04:35 +0800800 if isVndkExt {
801 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-allow-extensions")
802 }
803
Colin Crossae887032017-10-23 17:16:14 -0700804 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700805 Rule: sAbiDiff,
806 Description: "header-abi-diff " + outputFile.Base(),
807 Output: outputFile,
808 Input: inputDump,
809 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800810 Args: map[string]string{
Logan Chien6227fed2019-02-18 13:12:21 +0800811 "referenceDump": referenceDump.String(),
812 "libName": libName,
813 "arch": ctx.Arch().ArchType.Name,
814 "allowFlags": strings.Join(localAbiCheckAllowFlags, " "),
815 "createReferenceDumpFlags": createReferenceDumpFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800816 },
817 })
818 return android.OptionalPathForPath(outputFile)
819}
820
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700821// Generate a rule for extracting a table of contents from a shared library (.so)
822func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700823 outputFile android.WritablePath, flags builderFlags) {
824
Colin Crossb496cfd2018-09-10 16:50:05 -0700825 var format string
826 var crossCompile string
827 if ctx.Darwin() {
828 format = "--macho"
829 crossCompile = "${config.MacToolPath}"
830 } else if ctx.Windows() {
831 format = "--pe"
832 crossCompile = gccCmd(flags.toolchain, "")
833 } else {
834 format = "--elf"
835 crossCompile = gccCmd(flags.toolchain, "")
836 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700837
Colin Crossae887032017-10-23 17:16:14 -0700838 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700839 Rule: toc,
840 Description: "generate toc " + inputFile.Base(),
841 Output: outputFile,
842 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700843 Args: map[string]string{
844 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700845 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700846 },
847 })
848}
849
Colin Cross3f40fa42015-01-30 17:27:36 -0800850// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700851func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700852 flags builderFlags, outputFile android.WritablePath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800853
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700854 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800855
Ramy Medhat1154b692020-04-13 13:21:23 -0400856 rule := partialLd
857 args := map[string]string{
858 "ldCmd": ldCmd,
859 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
860 }
861 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
862 rule = partialLdRE
863 args["inCommaList"] = strings.Join(objFiles.Strings(), ",")
Ramy Medhatc60af152020-08-28 14:21:55 -0400864 args["implicitInputs"] = strings.Join(deps.Strings(), ",")
Ramy Medhat1154b692020-04-13 13:21:23 -0400865 }
Colin Crossae887032017-10-23 17:16:14 -0700866 ctx.Build(pctx, android.BuildParams{
Ramy Medhat1154b692020-04-13 13:21:23 -0400867 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700868 Description: "link " + outputFile.Base(),
869 Output: outputFile,
870 Inputs: objFiles,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700871 Implicits: deps,
Ramy Medhat1154b692020-04-13 13:21:23 -0400872 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800873 })
874}
875
Colin Crossbfae8852015-03-26 14:44:11 -0700876// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700877func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
878 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700879
880 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
881
Colin Crossae887032017-10-23 17:16:14 -0700882 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700883 Rule: prefixSymbols,
884 Description: "prefix symbols " + outputFile.Base(),
885 Output: outputFile,
886 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700887 Args: map[string]string{
888 "objcopyCmd": objcopyCmd,
889 "prefix": prefix,
890 },
891 })
892}
893
Colin Cross635c3b02016-05-18 15:37:25 -0700894func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
895 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700896
897 crossCompile := gccCmd(flags.toolchain, "")
898 args := ""
899 if flags.stripAddGnuDebuglink {
900 args += " --add-gnu-debuglink"
901 }
902 if flags.stripKeepMiniDebugInfo {
903 args += " --keep-mini-debug-info"
904 }
905 if flags.stripKeepSymbols {
906 args += " --keep-symbols"
907 }
Yi Kongacee27c2019-03-29 20:05:14 -0700908 if flags.stripKeepSymbolsList != "" {
909 args += " -k" + flags.stripKeepSymbolsList
910 }
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700911 if flags.stripKeepSymbolsAndDebugFrame {
912 args += " --keep-symbols-and-debug-frame"
913 }
Yi Kongb5c34d72018-11-07 16:28:49 -0800914 if flags.stripUseGnuStrip {
915 args += " --use-gnu-strip"
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700916 }
Colin Cross665dce92016-04-28 14:50:03 -0700917
Colin Crossae887032017-10-23 17:16:14 -0700918 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700919 Rule: strip,
920 Description: "strip " + outputFile.Base(),
921 Output: outputFile,
922 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700923 Args: map[string]string{
924 "crossCompile": crossCompile,
925 "args": args,
926 },
927 })
928}
929
Colin Cross635c3b02016-05-18 15:37:25 -0700930func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
931 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700932
Colin Crossae887032017-10-23 17:16:14 -0700933 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700934 Rule: darwinStrip,
935 Description: "strip " + outputFile.Base(),
936 Output: outputFile,
937 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700938 })
939}
940
Oliver Nguyenc7434142019-04-24 14:22:25 -0700941func TransformCoverageFilesToZip(ctx android.ModuleContext,
942 inputs Objects, baseName string) android.OptionalPath {
Dan Willemsen581341d2017-02-09 16:16:31 -0800943
944 if len(inputs.coverageFiles) > 0 {
Oliver Nguyenc7434142019-04-24 14:22:25 -0700945 outputFile := android.PathForModuleOut(ctx, baseName+".zip")
Dan Willemsen581341d2017-02-09 16:16:31 -0800946
Oliver Nguyenc7434142019-04-24 14:22:25 -0700947 ctx.Build(pctx, android.BuildParams{
948 Rule: zip,
949 Description: "zip " + outputFile.Base(),
950 Inputs: inputs.coverageFiles,
951 Output: outputFile,
952 })
Dan Willemsen581341d2017-02-09 16:16:31 -0800953
954 return android.OptionalPathForPath(outputFile)
955 }
956
957 return android.OptionalPath{}
958}
959
Yi Kongc49c3932019-10-15 02:01:19 -0700960func TransformArchiveRepack(ctx android.ModuleContext, inputFile android.Path,
961 outputFile android.WritablePath, objects []string) {
962
963 ctx.Build(pctx, android.BuildParams{
964 Rule: archiveRepack,
965 Description: "Repack archive " + outputFile.Base(),
966 Output: outputFile,
967 Input: inputFile,
968 Args: map[string]string{
969 "objects": strings.Join(objects, " "),
970 },
971 })
972}
973
Colin Crossb98c8b02016-07-29 13:44:28 -0700974func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800975 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
976}
Colin Cross0af4b842015-04-30 16:36:18 -0700977
Colin Cross5b529592017-05-09 13:34:34 -0700978func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700979 var i int
980
981 start := 0
982 bytes := 0
983 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700984 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700985 if l > limit {
986 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
987 }
988 if bytes+l > limit {
989 lists = append(lists, list[start:i])
990 start = i
991 bytes = 0
992 }
993 bytes += l + 1 // count a space between each list element
994 }
995
996 lists = append(lists, list[start:])
997
998 totalLen := 0
999 for _, l := range lists {
1000 totalLen += len(l)
1001 }
1002 if totalLen != len(list) {
1003 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
1004 }
1005 return lists, nil
1006}