blob: 2bedd9c6edcc22d5a94dbb36f227849c347ac93c [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 Medhat9a90fe52020-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 (
Colin Cross635c3b02016-05-18 15:37:25 -070041 pctx = android.NewPackageContext("android/soong/cc")
Colin Cross3f40fa42015-01-30 17:27:36 -080042
Ramy Medhat8ea054a2020-01-27 14:19:44 -050043 cc = pctx.AndroidRemoteStaticRule("cc", android.RemoteRuleSupports{Goma: true, RBE: true},
Colin Cross3f40fa42015-01-30 17:27:36 -080044 blueprint.RuleParams{
45 Depfile: "${out}.d",
46 Deps: blueprint.DepsGCC,
Alistair Strachan777475c2016-08-26 12:55:49 -070047 Command: "$relPwd ${config.CcWrapper}$ccCmd -c $cFlags -MD -MF ${out}.d -o $out $in",
Dan Willemsenc94a7682015-11-17 15:27:28 -080048 CommandDeps: []string{"$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080049 },
Dan Willemsen322a0a62015-11-17 15:19:46 -080050 "ccCmd", "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080051
Kousik Kumar2976bfd2020-02-17 00:26:55 -080052 ccNoDeps = pctx.AndroidStaticRule("ccNoDeps",
Dan Willemsenfcabb1c2019-01-03 23:25:11 -080053 blueprint.RuleParams{
Kousik Kumar2976bfd2020-02-17 00:26:55 -080054 Command: "$relPwd $ccCmd -c $cFlags -o $out $in",
Dan Willemsenfcabb1c2019-01-03 23:25:11 -080055 CommandDeps: []string{"$ccCmd"},
56 },
57 "ccCmd", "cFlags")
58
Ramy Medhat9a90fe52020-04-13 13:21:23 -040059 ld, ldRE = remoteexec.StaticRules(pctx, "ld",
Colin Cross3f40fa42015-01-30 17:27:36 -080060 blueprint.RuleParams{
Ramy Medhat31ec9422020-04-17 15:03:58 -040061 Command: "$reTemplate$ldCmd ${crtBegin} @${out}.rsp " +
Pete Bentley99f2fc22019-08-02 14:02:20 +010062 "${libFlags} ${crtEnd} -o ${out} ${ldFlags} ${extraLibFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080063 CommandDeps: []string{"$ldCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070064 Rspfile: "${out}.rsp",
65 RspfileContent: "${in}",
Colin Cross36ae1352019-03-29 15:55:30 -070066 // clang -Wl,--out-implib doesn't update its output file if it hasn't changed.
67 Restat: true,
Colin Cross3f40fa42015-01-30 17:27:36 -080068 },
Ramy Medhat31ec9422020-04-17 15:03:58 -040069 &remoteexec.REParams{
70 Labels: map[string]string{"type": "link", "tool": "clang"},
Ramy Medhat9a90fe52020-04-13 13:21:23 -040071 ExecStrategy: "${config.RECXXLinksExecStrategy}",
72 Inputs: []string{"${out}.rsp"},
73 RSPFile: "${out}.rsp",
Kousik Kumar3fb61262020-04-22 13:31:09 -070074 OutputFiles: []string{"${out}", "$implicitOutputs"},
Ramy Medhat9a90fe52020-04-13 13:21:23 -040075 ToolchainInputs: []string{"$ldCmd"},
76 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXLinksPool}"},
Kousik Kumar3fb61262020-04-22 13:31:09 -070077 }, []string{"ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags", "extraLibFlags"}, []string{"implicitOutputs"})
Colin Cross3f40fa42015-01-30 17:27:36 -080078
Ramy Medhat9a90fe52020-04-13 13:21:23 -040079 partialLd, partialLdRE = remoteexec.StaticRules(pctx, "partialLd",
Colin Cross3f40fa42015-01-30 17:27:36 -080080 blueprint.RuleParams{
Chih-Hung Hsieh3ede2942018-01-10 14:30:44 -080081 // Without -no-pie, clang 7.0 adds -pie to link Android files,
82 // but -r and -pie cannot be used together.
Ramy Medhat31ec9422020-04-17 15:03:58 -040083 Command: "$reTemplate$ldCmd -fuse-ld=lld -nostdlib -no-pie -Wl,-r ${in} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080084 CommandDeps: []string{"$ldCmd"},
Ramy Medhat9a90fe52020-04-13 13:21:23 -040085 }, &remoteexec.REParams{
Kousik Kumar3fb61262020-04-22 13:31:09 -070086 Labels: map[string]string{"type": "link", "tool": "clang"},
87 ExecStrategy: "${config.RECXXLinksExecStrategy}", Inputs: []string{"$inCommaList"},
88 OutputFiles: []string{"${out}", "$implicitOutputs"},
Ramy Medhat9a90fe52020-04-13 13:21:23 -040089 ToolchainInputs: []string{"$ldCmd"},
90 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXLinksPool}"},
Kousik Kumar3fb61262020-04-22 13:31:09 -070091 }, []string{"ldCmd", "ldFlags"}, []string{"inCommaList", "implicitOutputs"})
Colin Cross3f40fa42015-01-30 17:27:36 -080092
Colin Cross9d45bb72016-08-29 16:14:13 -070093 ar = pctx.AndroidStaticRule("ar",
Colin Cross3f40fa42015-01-30 17:27:36 -080094 blueprint.RuleParams{
Colin Cross7d21c442015-03-30 17:47:53 -070095 Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
Dan Willemsenc94a7682015-11-17 15:27:28 -080096 CommandDeps: []string{"$arCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070097 Rspfile: "${out}.rsp",
98 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080099 },
100 "arCmd", "arFlags")
101
Colin Cross9d45bb72016-08-29 16:14:13 -0700102 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700103 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -0700104 Command: "${config.MacStripPath} -u -r -o $out $in",
105 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700106 })
Colin Cross0af4b842015-04-30 16:36:18 -0700107
Colin Cross9d45bb72016-08-29 16:14:13 -0700108 prefixSymbols = pctx.AndroidStaticRule("prefixSymbols",
Colin Crossbfae8852015-03-26 14:44:11 -0700109 blueprint.RuleParams{
110 Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800111 CommandDeps: []string{"$objcopyCmd"},
Colin Crossbfae8852015-03-26 14:44:11 -0700112 },
113 "objcopyCmd", "prefix")
114
Nan Zhang43a485c2017-03-27 14:27:58 -0700115 _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh")
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800116 _ = pctx.SourcePathVariable("xzCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/xz")
Colin Cross665dce92016-04-28 14:50:03 -0700117
Colin Crossee3ea312019-05-17 15:36:46 -0700118 // 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 -0700119 // file descriptors on darwin. Limit concurrent calls to 5 on darwin.
Colin Crossee3ea312019-05-17 15:36:46 -0700120 darwinStripPool = func() blueprint.Pool {
121 if runtime.GOOS == "darwin" {
122 return pctx.StaticPool("darwinStripPool", blueprint.PoolParams{
Colin Crossbadf8d62019-05-22 13:25:50 -0700123 Depth: 5,
Colin Crossee3ea312019-05-17 15:36:46 -0700124 })
125 } else {
126 return nil
127 }
128 }()
129
Colin Cross9d45bb72016-08-29 16:14:13 -0700130 strip = pctx.AndroidStaticRule("strip",
Colin Cross665dce92016-04-28 14:50:03 -0700131 blueprint.RuleParams{
132 Depfile: "${out}.d",
133 Deps: blueprint.DepsGCC,
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700134 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 -0800135 CommandDeps: []string{"$stripPath", "$xzCmd"},
Colin Crossee3ea312019-05-17 15:36:46 -0700136 Pool: darwinStripPool,
Colin Cross665dce92016-04-28 14:50:03 -0700137 },
138 "args", "crossCompile")
139
Yi Kongc49c3932019-10-15 02:01:19 -0700140 _ = pctx.SourcePathVariable("archiveRepackPath", "build/soong/scripts/archive_repack.sh")
141
142 archiveRepack = pctx.AndroidStaticRule("archiveRepack",
143 blueprint.RuleParams{
144 Depfile: "${out}.d",
145 Deps: blueprint.DepsGCC,
146 Command: "CLANG_BIN=${config.ClangBin} $archiveRepackPath -i ${in} -o ${out} -d ${out}.d ${objects}",
147 CommandDeps: []string{"$archiveRepackPath"},
148 },
149 "objects")
150
Colin Cross9d45bb72016-08-29 16:14:13 -0700151 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700152 blueprint.RuleParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700153 Command: "rm -f $out && touch $out",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700154 })
155
Nan Zhang43a485c2017-03-27 14:27:58 -0700156 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700157
158 toc = pctx.AndroidStaticRule("toc",
159 blueprint.RuleParams{
160 Depfile: "${out}.d",
161 Deps: blueprint.DepsGCC,
Colin Crossb496cfd2018-09-10 16:50:05 -0700162 Command: "CROSS_COMPILE=$crossCompile $tocPath $format -i ${in} -o ${out} -d ${out}.d",
Colin Cross26c34ed2016-09-30 17:10:16 -0700163 CommandDeps: []string{"$tocPath"},
164 Restat: true,
165 },
Colin Crossb496cfd2018-09-10 16:50:05 -0700166 "crossCompile", "format")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700167
168 clangTidy = pctx.AndroidStaticRule("clangTidy",
169 blueprint.RuleParams{
George Burgess IVc4624c02019-04-04 16:22:37 -0700170 Command: "rm -f $out && ${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out",
171 CommandDeps: []string{"${config.ClangBin}/clang-tidy"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700172 },
173 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800174
Nan Zhang43a485c2017-03-27 14:27:58 -0700175 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800176
177 yasm = pctx.AndroidStaticRule("yasm",
178 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700179 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800180 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700181 Depfile: "$out.d",
182 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800183 },
184 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800185
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700186 windres = pctx.AndroidStaticRule("windres",
187 blueprint.RuleParams{
Nick Desaulniers18eeffa2020-01-29 16:20:11 -0800188 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 -0700189 CommandDeps: []string{"$windresCmd"},
190 },
191 "windresCmd", "flags")
192
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800193 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800194
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700195 // -w has been added since header-abi-dumper does not need to produce any sort of diagnostic information.
Ramy Medhat31ec9422020-04-17 15:03:58 -0400196 sAbiDump, sAbiDumpRE = remoteexec.StaticRules(pctx, "sAbiDump",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800197 blueprint.RuleParams{
Ramy Medhat31ec9422020-04-17 15:03:58 -0400198 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 -0800199 CommandDeps: []string{"$sAbiDumper"},
Ramy Medhat31ec9422020-04-17 15:03:58 -0400200 }, &remoteexec.REParams{
201 Labels: map[string]string{"type": "abi-dump", "tool": "header-abi-dumper"},
202 ExecStrategy: "${config.REAbiDumperExecStrategy}",
203 Platform: map[string]string{
204 remoteexec.PoolKey: "${config.RECXXPool}",
205 "InputRootAbsolutePath": android.AbsSrcDirForExistingUseCases(),
206 },
207 }, []string{"cFlags", "exportDirs"}, nil)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800208
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800209 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800210
211 sAbiLink = pctx.AndroidStaticRule("sAbiLink",
212 blueprint.RuleParams{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800213 Command: "$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800214 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800215 Rspfile: "${out}.rsp",
216 RspfileContent: "${in}",
217 },
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800218 "symbolFilter", "arch", "exportedHeaderFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800219
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800220 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700221
Colin Cross2e2dbc22019-09-25 13:31:46 -0700222 sAbiDiff = pctx.RuleFunc("sAbiDiff",
Dan Willemsen54daaf02018-03-12 13:24:09 -0700223 func(ctx android.PackageRuleContext) blueprint.RuleParams {
Logan Chien2a65dda2019-10-01 15:58:07 -0700224 commandStr := "($sAbiDiffer ${extraFlags} -lib ${libName} -arch ${arch} -o ${out} -new ${in} -old ${referenceDump})"
Logan Chien6227fed2019-02-18 13:12:21 +0800225 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 +0800226 commandStr += " && (mkdir -p $$DIST_DIR/abidiffs && cp ${out} $$DIST_DIR/abidiffs/)"
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800227 commandStr += " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800228 return blueprint.RuleParams{
229 Command: commandStr,
230 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700231 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800232 },
Logan Chien2a65dda2019-10-01 15:58:07 -0700233 "extraFlags", "referenceDump", "libName", "arch", "createReferenceDumpFlags")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700234
235 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
236 blueprint.RuleParams{
237 Command: "gunzip -c $in > $out",
238 })
Oliver Nguyenc7434142019-04-24 14:22:25 -0700239
240 zip = pctx.AndroidStaticRule("zip",
241 blueprint.RuleParams{
242 Command: "cat $out.rsp | tr ' ' '\\n' | tr -d \\' | sort -u > ${out}.tmp && ${SoongZipCmd} -o ${out} -C $$OUT_DIR -l ${out}.tmp",
243 CommandDeps: []string{"${SoongZipCmd}"},
244 Rspfile: "$out.rsp",
245 RspfileContent: "$in",
246 })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800247
248 _ = pctx.SourcePathVariable("cxxExtractor",
249 "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/cxx_extractor")
Sasha Smundak65143642019-09-26 20:14:28 -0700250 _ = pctx.SourcePathVariable("kytheVnames", "build/soong/vnames.json")
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800251 _ = pctx.VariableFunc("kytheCorpus",
252 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCorpusName() })
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800253 _ = pctx.VariableFunc("kytheCuEncoding",
254 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCuEncoding() })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800255 kytheExtract = pctx.StaticRule("kythe",
256 blueprint.RuleParams{
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800257 Command: `rm -f $out && ` +
258 `KYTHE_CORPUS=${kytheCorpus} KYTHE_OUTPUT_FILE=$out KYTHE_VNAMES=$kytheVnames KYTHE_KZIP_ENCODING=${kytheCuEncoding} ` +
259 `$cxxExtractor $cFlags $in `,
Sasha Smundak65143642019-09-26 20:14:28 -0700260 CommandDeps: []string{"$cxxExtractor", "$kytheVnames"},
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800261 },
262 "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -0800263)
264
Dan Willemsen322a0a62015-11-17 15:19:46 -0800265func init() {
266 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
267 // debug output. That way two builds in two different directories will
268 // create the same output.
269 if runtime.GOOS != "darwin" {
270 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
271 } else {
272 // Darwin doesn't have /proc
273 pctx.StaticVariable("relPwd", "")
274 }
Oliver Nguyenc7434142019-04-24 14:22:25 -0700275
276 pctx.HostBinToolVariable("SoongZipCmd", "soong_zip")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400277 pctx.Import("android/soong/remoteexec")
Dan Willemsen322a0a62015-11-17 15:19:46 -0800278}
279
Colin Cross3f40fa42015-01-30 17:27:36 -0800280type builderFlags struct {
Colin Cross6d88dba2019-11-06 07:06:58 -0800281 globalCommonFlags string
282 globalAsFlags string
283 globalYasmFlags string
284 globalCFlags string
285 globalToolingCFlags string // A separate set of cFlags for clang LibTooling tools
286 globalToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
287 globalConlyFlags string
288 globalCppFlags string
289 globalLdFlags string
290
291 localCommonFlags string
292 localAsFlags string
293 localYasmFlags string
294 localCFlags string
295 localToolingCFlags string // A separate set of cFlags for clang LibTooling tools
296 localToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
297 localConlyFlags string
298 localCppFlags string
299 localLdFlags string
300
301 libFlags string
302 extraLibFlags string
303 tidyFlags string
304 sAbiFlags string
305 aidlFlags string
306 rsFlags string
307 toolchain config.Toolchain
308 tidy bool
Oliver Nguyen04526782020-04-21 12:40:27 -0700309 gcovCoverage bool
Colin Cross6d88dba2019-11-06 07:06:58 -0800310 sAbiDump bool
311 emitXrefs bool
Colin Cross665dce92016-04-28 14:50:03 -0700312
Dan Willemsen98ab3112019-08-27 21:20:40 -0700313 assemblerWithCpp bool
314
Colin Crossc3199482017-03-30 15:03:04 -0700315 systemIncludeFlags string
316
Colin Cross18c0c5a2016-12-01 14:45:23 -0800317 groupStaticLibs bool
318
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700319 stripKeepSymbols bool
320 stripKeepSymbolsList string
321 stripKeepSymbolsAndDebugFrame bool
322 stripKeepMiniDebugInfo bool
323 stripAddGnuDebuglink bool
324 stripUseGnuStrip bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800325
Colin Cross19878da2019-03-28 14:45:07 -0700326 proto android.ProtoFlags
Dan Willemsen60e62f02018-11-16 21:05:32 -0800327 protoC bool
328 protoOptionsFile bool
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700329
330 yacc *YaccProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800331}
332
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700333type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800334 objFiles android.Paths
335 tidyFiles android.Paths
336 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800337 sAbiDumpFiles android.Paths
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800338 kytheFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700339}
340
341func (a Objects) Copy() Objects {
342 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800343 objFiles: append(android.Paths{}, a.objFiles...),
344 tidyFiles: append(android.Paths{}, a.tidyFiles...),
345 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800346 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800347 kytheFiles: append(android.Paths{}, a.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700348 }
349}
350
351func (a Objects) Append(b Objects) Objects {
352 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800353 objFiles: append(a.objFiles, b.objFiles...),
354 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
355 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800356 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800357 kytheFiles: append(a.kytheFiles, b.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700358 }
359}
360
Colin Cross3f40fa42015-01-30 17:27:36 -0800361// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700362func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800363 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700364
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700365 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700366 var tidyFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700367 if flags.tidy {
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700368 tidyFiles = make(android.Paths, 0, len(srcFiles))
369 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800370 var coverageFiles android.Paths
Oliver Nguyen04526782020-04-21 12:40:27 -0700371 if flags.gcovCoverage {
Dan Willemsen581341d2017-02-09 16:16:31 -0800372 coverageFiles = make(android.Paths, 0, len(srcFiles))
373 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800374 var kytheFiles android.Paths
375 if flags.emitXrefs {
376 kytheFiles = make(android.Paths, 0, len(srcFiles))
377 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800378
Colin Cross6d88dba2019-11-06 07:06:58 -0800379 // Produce fully expanded flags for use by C tools, C compiles, C++ tools, C++ compiles, and asm compiles
380 // respectively.
381 toolingCflags := flags.globalCommonFlags + " " +
382 flags.globalToolingCFlags + " " +
383 flags.globalConlyFlags + " " +
384 flags.localCommonFlags + " " +
385 flags.localToolingCFlags + " " +
386 flags.localConlyFlags + " " +
387 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700388
Colin Cross6d88dba2019-11-06 07:06:58 -0800389 cflags := flags.globalCommonFlags + " " +
390 flags.globalCFlags + " " +
391 flags.globalConlyFlags + " " +
392 flags.localCommonFlags + " " +
393 flags.localCFlags + " " +
394 flags.localConlyFlags + " " +
395 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700396
Colin Cross6d88dba2019-11-06 07:06:58 -0800397 toolingCppflags := flags.globalCommonFlags + " " +
398 flags.globalToolingCFlags + " " +
399 flags.globalToolingCppFlags + " " +
400 flags.localCommonFlags + " " +
401 flags.localToolingCFlags + " " +
402 flags.localToolingCppFlags + " " +
403 flags.systemIncludeFlags
Colin Crossc3199482017-03-30 15:03:04 -0700404
Colin Cross6d88dba2019-11-06 07:06:58 -0800405 cppflags := flags.globalCommonFlags + " " +
406 flags.globalCFlags + " " +
407 flags.globalCppFlags + " " +
408 flags.localCommonFlags + " " +
409 flags.localCFlags + " " +
410 flags.localCppFlags + " " +
411 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700412
Colin Cross6d88dba2019-11-06 07:06:58 -0800413 asflags := flags.globalCommonFlags + " " +
414 flags.globalAsFlags + " " +
415 flags.localCommonFlags + " " +
416 flags.localAsFlags + " " +
417 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700418
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800419 var sAbiDumpFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700420 if flags.sAbiDump {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800421 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
422 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800423
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700424 cflags += " ${config.NoOverrideClangGlobalCflags}"
425 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
426 cppflags += " ${config.NoOverrideClangGlobalCflags}"
427 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800428
Colin Cross3f40fa42015-01-30 17:27:36 -0800429 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700430 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800431
432 objFiles[i] = objFile
433
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700434 switch srcFile.Ext() {
435 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700436 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700437 Rule: yasm,
438 Description: "yasm " + srcFile.Rel(),
439 Output: objFile,
440 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800441 Implicits: cFlagsDeps,
442 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800443 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800444 "asFlags": flags.globalYasmFlags + " " + flags.localYasmFlags,
Colin Cross91e90042016-12-02 17:13:24 -0800445 },
446 })
447 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700448 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700449 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700450 Rule: windres,
451 Description: "windres " + srcFile.Rel(),
452 Output: objFile,
453 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800454 Implicits: cFlagsDeps,
455 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700456 Args: map[string]string{
457 "windresCmd": gccCmd(flags.toolchain, "windres"),
458 "flags": flags.toolchain.WindresFlags(),
459 },
460 })
461 continue
Pete Bentleyfcf55bf2019-08-16 20:14:32 +0100462 case ".o":
463 objFiles[i] = srcFile
464 continue
Colin Cross91e90042016-12-02 17:13:24 -0800465 }
466
Colin Cross6d88dba2019-11-06 07:06:58 -0800467 var moduleFlags string
468 var moduleToolingFlags string
469
Colin Cross3f40fa42015-01-30 17:27:36 -0800470 var ccCmd string
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700471 tidy := flags.tidy
Oliver Nguyen04526782020-04-21 12:40:27 -0700472 coverage := flags.gcovCoverage
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700473 dump := flags.sAbiDump
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800474 rule := cc
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800475 emitXref := flags.emitXrefs
Colin Cross3f40fa42015-01-30 17:27:36 -0800476
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700477 switch srcFile.Ext() {
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800478 case ".s":
Dan Willemsen98ab3112019-08-27 21:20:40 -0700479 if !flags.assemblerWithCpp {
480 rule = ccNoDeps
481 }
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800482 fallthrough
483 case ".S":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700484 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800485 moduleFlags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700486 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800487 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800488 dump = false
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800489 emitXref = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800490 case ".c":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700491 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800492 moduleFlags = cflags
493 moduleToolingFlags = toolingCflags
Colin Crossd34ab7c2019-06-27 14:46:10 -0700494 case ".cpp", ".cc", ".cxx", ".mm":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700495 ccCmd = "clang++"
Colin Cross6d88dba2019-11-06 07:06:58 -0800496 moduleFlags = cppflags
497 moduleToolingFlags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800498 default:
499 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
500 continue
501 }
502
Colin Cross67a5c132017-05-09 13:45:28 -0700503 ccDesc := ccCmd
504
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700505 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800506
Dan Willemsen581341d2017-02-09 16:16:31 -0800507 var implicitOutputs android.WritablePaths
508 if coverage {
509 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
510 implicitOutputs = append(implicitOutputs, gcnoFile)
511 coverageFiles = append(coverageFiles, gcnoFile)
512 }
513
Colin Crossae887032017-10-23 17:16:14 -0700514 ctx.Build(pctx, android.BuildParams{
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800515 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700516 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800517 Output: objFile,
518 ImplicitOutputs: implicitOutputs,
519 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800520 Implicits: cFlagsDeps,
521 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800522 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800523 "cFlags": moduleFlags,
Colin Cross28344522015-04-22 13:07:53 -0700524 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800525 },
526 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700527
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800528 if emitXref {
529 kytheFile := android.ObjPathWithExt(ctx, subdir, srcFile, "kzip")
530 ctx.Build(pctx, android.BuildParams{
531 Rule: kytheExtract,
532 Description: "Xref C++ extractor " + srcFile.Rel(),
533 Output: kytheFile,
534 Input: srcFile,
535 Implicits: cFlagsDeps,
536 OrderOnly: pathDeps,
537 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800538 "cFlags": moduleFlags,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800539 },
540 })
541 kytheFiles = append(kytheFiles, kytheFile)
542 }
543
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700544 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700545 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700546 tidyFiles = append(tidyFiles, tidyFile)
547
Colin Crossae887032017-10-23 17:16:14 -0700548 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700549 Rule: clangTidy,
550 Description: "clang-tidy " + srcFile.Rel(),
551 Output: tidyFile,
552 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700553 // We must depend on objFile, since clang-tidy doesn't
554 // support exporting dependencies.
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700555 Implicit: objFile,
556 Implicits: cFlagsDeps,
557 OrderOnly: pathDeps,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700558 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800559 "cFlags": moduleToolingFlags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700560 "tidyFlags": flags.tidyFlags,
561 },
562 })
563 }
564
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800565 if dump {
566 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
567 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
568
Ramy Medhat31ec9422020-04-17 15:03:58 -0400569 dumpRule := sAbiDump
570 if ctx.Config().IsEnvTrue("RBE_ABI_DUMPER") {
571 dumpRule = sAbiDumpRE
572 }
Colin Crossae887032017-10-23 17:16:14 -0700573 ctx.Build(pctx, android.BuildParams{
Ramy Medhat31ec9422020-04-17 15:03:58 -0400574 Rule: dumpRule,
Colin Cross67a5c132017-05-09 13:45:28 -0700575 Description: "header-abi-dumper " + srcFile.Rel(),
576 Output: sAbiDumpFile,
577 Input: srcFile,
578 Implicit: objFile,
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700579 Implicits: cFlagsDeps,
580 OrderOnly: pathDeps,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800581 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800582 "cFlags": moduleToolingFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800583 "exportDirs": flags.sAbiFlags,
584 },
585 })
586 }
587
Colin Cross3f40fa42015-01-30 17:27:36 -0800588 }
589
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700590 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800591 objFiles: objFiles,
592 tidyFiles: tidyFiles,
593 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800594 sAbiDumpFiles: sAbiDumpFiles,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800595 kytheFiles: kytheFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700596 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800597}
598
599// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700600func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700601 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800602
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800603 arCmd := "${config.ClangBin}/llvm-ar"
Yi Kongee96a792019-09-06 15:11:57 -0700604 arFlags := "crsPD"
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800605 if !ctx.Darwin() {
606 arFlags += " -format=gnu"
607 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800608
Colin Crossae887032017-10-23 17:16:14 -0700609 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700610 Rule: ar,
611 Description: "static link " + outputFile.Base(),
612 Output: outputFile,
613 Inputs: objFiles,
614 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800615 Args: map[string]string{
616 "arFlags": arFlags,
617 "arCmd": arCmd,
618 },
619 })
620}
621
622// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700623// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700624func TransformObjToDynamicBinary(ctx android.ModuleContext,
625 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
Josh Gao75a50a22019-06-07 17:58:59 -0700626 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath, implicitOutputs android.WritablePaths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800627
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700628 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800629
Colin Cross3f40fa42015-01-30 17:27:36 -0800630 var libFlagsList []string
631
Colin Cross16b23492016-01-06 14:41:07 -0800632 if len(flags.libFlags) > 0 {
633 libFlagsList = append(libFlagsList, flags.libFlags)
634 }
635
Colin Cross3f40fa42015-01-30 17:27:36 -0800636 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800637 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700638 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700639 } else {
640 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700641 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700642 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
643 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800644 }
645
Colin Cross7a7cf972016-12-05 18:47:39 -0800646 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800647 libFlagsList = append(libFlagsList, "-Wl,--start-group")
648 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700649 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800650 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800651 libFlagsList = append(libFlagsList, "-Wl,--end-group")
652 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800653
Stephen Hines10347862016-07-18 15:54:54 -0700654 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700655 libFlagsList = append(libFlagsList, "-Wl,--start-group")
656 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700657 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700658 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700659 libFlagsList = append(libFlagsList, "-Wl,--end-group")
660 }
661
Colin Cross3f40fa42015-01-30 17:27:36 -0800662 for _, lib := range sharedLibs {
Josh Gao75a50a22019-06-07 17:58:59 -0700663 libFile := lib.String()
664 if ctx.Windows() {
665 libFile = pathtools.ReplaceExtension(libFile, "lib")
666 }
667 libFlagsList = append(libFlagsList, libFile)
Colin Cross3f40fa42015-01-30 17:27:36 -0800668 }
669
Colin Cross3f40fa42015-01-30 17:27:36 -0800670 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700671 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800672 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700673 if crtBegin.Valid() {
674 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800675 }
676
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400677 rule := ld
Kousik Kumar3fb61262020-04-22 13:31:09 -0700678 args := map[string]string{
679 "ldCmd": ldCmd,
680 "crtBegin": crtBegin.String(),
681 "libFlags": strings.Join(libFlagsList, " "),
682 "extraLibFlags": flags.extraLibFlags,
683 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
684 "crtEnd": crtEnd.String(),
685 }
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400686 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
687 rule = ldRE
Kousik Kumar3fb61262020-04-22 13:31:09 -0700688 args["implicitOutputs"] = strings.Join(implicitOutputs.Strings(), ",")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400689 }
690
Colin Crossae887032017-10-23 17:16:14 -0700691 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400692 Rule: rule,
Josh Gao75a50a22019-06-07 17:58:59 -0700693 Description: "link " + outputFile.Base(),
694 Output: outputFile,
695 ImplicitOutputs: implicitOutputs,
696 Inputs: objFiles,
697 Implicits: deps,
Kousik Kumar3fb61262020-04-22 13:31:09 -0700698 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800699 })
700}
701
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800702// Generate a rule to combine .dump sAbi dump files from multiple source files
703// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700704func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800705 baseName, exportedHeaderFlags string, symbolFile android.OptionalPath,
706 excludedSymbolVersions, excludedSymbolTags []string) android.OptionalPath {
707
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800708 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800709
710 implicits := android.Paths{soFile}
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800711 symbolFilterStr := "-so " + soFile.String()
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800712
713 if symbolFile.Valid() {
714 implicits = append(implicits, symbolFile.Path())
715 symbolFilterStr += " -v " + symbolFile.String()
716 }
717 for _, ver := range excludedSymbolVersions {
718 symbolFilterStr += " --exclude-symbol-version " + ver
719 }
720 for _, tag := range excludedSymbolTags {
721 symbolFilterStr += " --exclude-symbol-tag " + tag
722 }
Colin Crossae887032017-10-23 17:16:14 -0700723 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700724 Rule: sAbiLink,
725 Description: "header-abi-linker " + outputFile.Base(),
726 Output: outputFile,
727 Inputs: sAbiDumps,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800728 Implicits: implicits,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800729 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800730 "symbolFilter": symbolFilterStr,
731 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800732 "exportedHeaderFlags": exportedHeaderFlags,
733 },
734 })
735 return android.OptionalPathForPath(outputFile)
736}
737
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700738func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
739 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700740 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700741 Rule: unzipRefSAbiDump,
742 Description: "gunzip" + outputFile.Base(),
743 Output: outputFile,
744 Input: zippedRefDump,
745 })
746 return outputFile
747}
748
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800749func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chien2a65dda2019-10-01 15:58:07 -0700750 baseName, exportedHeaderFlags string, checkAllApis, isLlndk, isNdk, isVndkExt bool) android.OptionalPath {
Logan Chienf3511742017-10-31 18:04:35 +0800751
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800752 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700753 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Logan Chien6227fed2019-02-18 13:12:21 +0800754 createReferenceDumpFlags := ""
755
Logan Chien2a65dda2019-10-01 15:58:07 -0700756 var extraFlags []string
757 if checkAllApis {
758 extraFlags = append(extraFlags, "-check-all-apis")
759 } else {
760 extraFlags = append(extraFlags,
761 "-allow-unreferenced-changes",
762 "-allow-unreferenced-elf-symbol-changes")
Jayant Chowdharye4499502018-01-17 13:13:33 -0800763 }
Logan Chien2a65dda2019-10-01 15:58:07 -0700764
765 if exportedHeaderFlags == "" {
766 extraFlags = append(extraFlags, "-advice-only")
767 }
768
Logan Chien62f1f942019-02-18 15:40:42 +0800769 if isLlndk || isNdk {
Logan Chien6227fed2019-02-18 13:12:21 +0800770 createReferenceDumpFlags = "--llndk"
Logan Chien62f1f942019-02-18 15:40:42 +0800771 if isLlndk {
772 // TODO(b/130324828): "-consider-opaque-types-different" should apply to
773 // both LLNDK and NDK shared libs. However, a known issue in header-abi-diff
774 // breaks libaaudio. Remove the if-guard after the issue is fixed.
Logan Chien2a65dda2019-10-01 15:58:07 -0700775 extraFlags = append(extraFlags, "-consider-opaque-types-different")
Logan Chien62f1f942019-02-18 15:40:42 +0800776 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700777 }
Logan Chienf3511742017-10-31 18:04:35 +0800778 if isVndkExt {
Logan Chien2a65dda2019-10-01 15:58:07 -0700779 extraFlags = append(extraFlags, "-allow-extensions")
Logan Chienf3511742017-10-31 18:04:35 +0800780 }
781
Colin Crossae887032017-10-23 17:16:14 -0700782 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700783 Rule: sAbiDiff,
784 Description: "header-abi-diff " + outputFile.Base(),
785 Output: outputFile,
786 Input: inputDump,
787 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800788 Args: map[string]string{
Logan Chien6227fed2019-02-18 13:12:21 +0800789 "referenceDump": referenceDump.String(),
790 "libName": libName,
791 "arch": ctx.Arch().ArchType.Name,
Logan Chien2a65dda2019-10-01 15:58:07 -0700792 "extraFlags": strings.Join(extraFlags, " "),
Logan Chien6227fed2019-02-18 13:12:21 +0800793 "createReferenceDumpFlags": createReferenceDumpFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800794 },
795 })
796 return android.OptionalPathForPath(outputFile)
797}
798
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700799// Generate a rule for extracting a table of contents from a shared library (.so)
800func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700801 outputFile android.WritablePath, flags builderFlags) {
802
Colin Crossb496cfd2018-09-10 16:50:05 -0700803 var format string
804 var crossCompile string
805 if ctx.Darwin() {
806 format = "--macho"
807 crossCompile = "${config.MacToolPath}"
808 } else if ctx.Windows() {
809 format = "--pe"
810 crossCompile = gccCmd(flags.toolchain, "")
811 } else {
812 format = "--elf"
813 crossCompile = gccCmd(flags.toolchain, "")
814 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700815
Colin Crossae887032017-10-23 17:16:14 -0700816 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700817 Rule: toc,
818 Description: "generate toc " + inputFile.Base(),
819 Output: outputFile,
820 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700821 Args: map[string]string{
822 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700823 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700824 },
825 })
826}
827
Colin Cross3f40fa42015-01-30 17:27:36 -0800828// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700829func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700830 flags builderFlags, outputFile android.WritablePath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800831
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700832 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800833
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400834 rule := partialLd
835 args := map[string]string{
836 "ldCmd": ldCmd,
837 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
838 }
839 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
840 rule = partialLdRE
841 args["inCommaList"] = strings.Join(objFiles.Strings(), ",")
842 }
Colin Crossae887032017-10-23 17:16:14 -0700843 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400844 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700845 Description: "link " + outputFile.Base(),
846 Output: outputFile,
847 Inputs: objFiles,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700848 Implicits: deps,
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400849 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800850 })
851}
852
Colin Crossbfae8852015-03-26 14:44:11 -0700853// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700854func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
855 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700856
857 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
858
Colin Crossae887032017-10-23 17:16:14 -0700859 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700860 Rule: prefixSymbols,
861 Description: "prefix symbols " + outputFile.Base(),
862 Output: outputFile,
863 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700864 Args: map[string]string{
865 "objcopyCmd": objcopyCmd,
866 "prefix": prefix,
867 },
868 })
869}
870
Colin Cross635c3b02016-05-18 15:37:25 -0700871func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
872 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700873
874 crossCompile := gccCmd(flags.toolchain, "")
875 args := ""
876 if flags.stripAddGnuDebuglink {
877 args += " --add-gnu-debuglink"
878 }
879 if flags.stripKeepMiniDebugInfo {
880 args += " --keep-mini-debug-info"
881 }
882 if flags.stripKeepSymbols {
883 args += " --keep-symbols"
884 }
Yi Kongacee27c2019-03-29 20:05:14 -0700885 if flags.stripKeepSymbolsList != "" {
886 args += " -k" + flags.stripKeepSymbolsList
887 }
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700888 if flags.stripKeepSymbolsAndDebugFrame {
889 args += " --keep-symbols-and-debug-frame"
890 }
Yi Kongb5c34d72018-11-07 16:28:49 -0800891 if flags.stripUseGnuStrip {
892 args += " --use-gnu-strip"
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700893 }
Colin Cross665dce92016-04-28 14:50:03 -0700894
Colin Crossae887032017-10-23 17:16:14 -0700895 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700896 Rule: strip,
897 Description: "strip " + outputFile.Base(),
898 Output: outputFile,
899 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700900 Args: map[string]string{
901 "crossCompile": crossCompile,
902 "args": args,
903 },
904 })
905}
906
Colin Cross635c3b02016-05-18 15:37:25 -0700907func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
908 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700909
Colin Crossae887032017-10-23 17:16:14 -0700910 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700911 Rule: darwinStrip,
912 Description: "strip " + outputFile.Base(),
913 Output: outputFile,
914 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700915 })
916}
917
Oliver Nguyenc7434142019-04-24 14:22:25 -0700918func TransformCoverageFilesToZip(ctx android.ModuleContext,
919 inputs Objects, baseName string) android.OptionalPath {
Dan Willemsen581341d2017-02-09 16:16:31 -0800920
921 if len(inputs.coverageFiles) > 0 {
Oliver Nguyenc7434142019-04-24 14:22:25 -0700922 outputFile := android.PathForModuleOut(ctx, baseName+".zip")
Dan Willemsen581341d2017-02-09 16:16:31 -0800923
Oliver Nguyenc7434142019-04-24 14:22:25 -0700924 ctx.Build(pctx, android.BuildParams{
925 Rule: zip,
926 Description: "zip " + outputFile.Base(),
927 Inputs: inputs.coverageFiles,
928 Output: outputFile,
929 })
Dan Willemsen581341d2017-02-09 16:16:31 -0800930
931 return android.OptionalPathForPath(outputFile)
932 }
933
934 return android.OptionalPath{}
935}
936
Yi Kongc49c3932019-10-15 02:01:19 -0700937func TransformArchiveRepack(ctx android.ModuleContext, inputFile android.Path,
938 outputFile android.WritablePath, objects []string) {
939
940 ctx.Build(pctx, android.BuildParams{
941 Rule: archiveRepack,
942 Description: "Repack archive " + outputFile.Base(),
943 Output: outputFile,
944 Input: inputFile,
945 Args: map[string]string{
946 "objects": strings.Join(objects, " "),
947 },
948 })
949}
950
Colin Crossb98c8b02016-07-29 13:44:28 -0700951func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800952 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
953}
Colin Cross0af4b842015-04-30 16:36:18 -0700954
Colin Cross5b529592017-05-09 13:34:34 -0700955func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700956 var i int
957
958 start := 0
959 bytes := 0
960 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700961 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700962 if l > limit {
963 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
964 }
965 if bytes+l > limit {
966 lists = append(lists, list[start:i])
967 start = i
968 bytes = 0
969 }
970 bytes += l + 1 // count a space between each list element
971 }
972
973 lists = append(lists, list[start:])
974
975 totalLen := 0
976 for _, l := range lists {
977 totalLen += len(l)
978 }
979 if totalLen != len(list) {
980 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
981 }
982 return lists, nil
983}