blob: 0f57a48cb8c53ee402f24f96903129fb507fec05 [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"
Colin Cross3f40fa42015-01-30 17:27:36 -080032)
33
34const (
Dan Albertc3144b12015-04-28 18:17:56 -070035 objectExtension = ".o"
Colin Cross3f40fa42015-01-30 17:27:36 -080036 staticLibraryExtension = ".a"
37)
38
39var (
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -070040 abiCheckAllowFlags = []string{
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -070041 "-allow-unreferenced-changes",
42 "-allow-unreferenced-elf-symbol-changes",
43 }
44)
45
46var (
Colin Cross635c3b02016-05-18 15:37:25 -070047 pctx = android.NewPackageContext("android/soong/cc")
Colin Cross3f40fa42015-01-30 17:27:36 -080048
Ramy Medhatdd0418a2019-11-04 18:16:11 -050049 cc = pctx.AndroidRemoteStaticRule("cc", android.SUPPORTS_BOTH,
Colin Cross3f40fa42015-01-30 17:27:36 -080050 blueprint.RuleParams{
51 Depfile: "${out}.d",
52 Deps: blueprint.DepsGCC,
Alistair Strachan777475c2016-08-26 12:55:49 -070053 Command: "$relPwd ${config.CcWrapper}$ccCmd -c $cFlags -MD -MF ${out}.d -o $out $in",
Dan Willemsenc94a7682015-11-17 15:27:28 -080054 CommandDeps: []string{"$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080055 },
Dan Willemsen322a0a62015-11-17 15:19:46 -080056 "ccCmd", "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080057
Ramy Medhatdd0418a2019-11-04 18:16:11 -050058 ccNoDeps = pctx.AndroidRemoteStaticRule("ccNoDeps", android.SUPPORTS_GOMA,
Dan Willemsenfcabb1c2019-01-03 23:25:11 -080059 blueprint.RuleParams{
60 Command: "$relPwd ${config.CcWrapper}$ccCmd -c $cFlags -o $out $in",
61 CommandDeps: []string{"$ccCmd"},
62 },
63 "ccCmd", "cFlags")
64
Colin Cross9d45bb72016-08-29 16:14:13 -070065 ld = pctx.AndroidStaticRule("ld",
Colin Cross3f40fa42015-01-30 17:27:36 -080066 blueprint.RuleParams{
Dan Albertce2b8392016-07-21 13:16:49 -070067 Command: "$ldCmd ${crtBegin} @${out}.rsp " +
Pete Bentley99f2fc22019-08-02 14:02:20 +010068 "${libFlags} ${crtEnd} -o ${out} ${ldFlags} ${extraLibFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080069 CommandDeps: []string{"$ldCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070070 Rspfile: "${out}.rsp",
71 RspfileContent: "${in}",
Colin Cross36ae1352019-03-29 15:55:30 -070072 // clang -Wl,--out-implib doesn't update its output file if it hasn't changed.
73 Restat: true,
Colin Cross3f40fa42015-01-30 17:27:36 -080074 },
Pete Bentley99f2fc22019-08-02 14:02:20 +010075 "ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags", "extraLibFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080076
Colin Cross9d45bb72016-08-29 16:14:13 -070077 partialLd = pctx.AndroidStaticRule("partialLd",
Colin Cross3f40fa42015-01-30 17:27:36 -080078 blueprint.RuleParams{
Chih-Hung Hsieh3ede2942018-01-10 14:30:44 -080079 // Without -no-pie, clang 7.0 adds -pie to link Android files,
80 // but -r and -pie cannot be used together.
Peter Collingbourne84d83852019-07-16 14:08:45 -070081 Command: "$ldCmd -fuse-ld=lld -nostdlib -no-pie -Wl,-r ${in} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080082 CommandDeps: []string{"$ldCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080083 },
Colin Cross41280a42015-11-23 14:01:42 -080084 "ldCmd", "ldFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080085
Colin Cross9d45bb72016-08-29 16:14:13 -070086 ar = pctx.AndroidStaticRule("ar",
Colin Cross3f40fa42015-01-30 17:27:36 -080087 blueprint.RuleParams{
Colin Cross7d21c442015-03-30 17:47:53 -070088 Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
Dan Willemsenc94a7682015-11-17 15:27:28 -080089 CommandDeps: []string{"$arCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070090 Rspfile: "${out}.rsp",
91 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080092 },
93 "arCmd", "arFlags")
94
Colin Cross9d45bb72016-08-29 16:14:13 -070095 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -070096 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -070097 Command: "${config.MacStripPath} -u -r -o $out $in",
98 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -070099 })
Colin Cross0af4b842015-04-30 16:36:18 -0700100
Colin Cross9d45bb72016-08-29 16:14:13 -0700101 prefixSymbols = pctx.AndroidStaticRule("prefixSymbols",
Colin Crossbfae8852015-03-26 14:44:11 -0700102 blueprint.RuleParams{
103 Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800104 CommandDeps: []string{"$objcopyCmd"},
Colin Crossbfae8852015-03-26 14:44:11 -0700105 },
106 "objcopyCmd", "prefix")
107
Nan Zhang43a485c2017-03-27 14:27:58 -0700108 _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh")
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800109 _ = pctx.SourcePathVariable("xzCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/xz")
Colin Cross665dce92016-04-28 14:50:03 -0700110
Colin Crossee3ea312019-05-17 15:36:46 -0700111 // 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 -0700112 // file descriptors on darwin. Limit concurrent calls to 5 on darwin.
Colin Crossee3ea312019-05-17 15:36:46 -0700113 darwinStripPool = func() blueprint.Pool {
114 if runtime.GOOS == "darwin" {
115 return pctx.StaticPool("darwinStripPool", blueprint.PoolParams{
Colin Crossbadf8d62019-05-22 13:25:50 -0700116 Depth: 5,
Colin Crossee3ea312019-05-17 15:36:46 -0700117 })
118 } else {
119 return nil
120 }
121 }()
122
Colin Cross9d45bb72016-08-29 16:14:13 -0700123 strip = pctx.AndroidStaticRule("strip",
Colin Cross665dce92016-04-28 14:50:03 -0700124 blueprint.RuleParams{
125 Depfile: "${out}.d",
126 Deps: blueprint.DepsGCC,
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700127 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 -0800128 CommandDeps: []string{"$stripPath", "$xzCmd"},
Colin Crossee3ea312019-05-17 15:36:46 -0700129 Pool: darwinStripPool,
Colin Cross665dce92016-04-28 14:50:03 -0700130 },
131 "args", "crossCompile")
132
Yi Kongc49c3932019-10-15 02:01:19 -0700133 _ = pctx.SourcePathVariable("archiveRepackPath", "build/soong/scripts/archive_repack.sh")
134
135 archiveRepack = pctx.AndroidStaticRule("archiveRepack",
136 blueprint.RuleParams{
137 Depfile: "${out}.d",
138 Deps: blueprint.DepsGCC,
139 Command: "CLANG_BIN=${config.ClangBin} $archiveRepackPath -i ${in} -o ${out} -d ${out}.d ${objects}",
140 CommandDeps: []string{"$archiveRepackPath"},
141 },
142 "objects")
143
Colin Cross9d45bb72016-08-29 16:14:13 -0700144 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700145 blueprint.RuleParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700146 Command: "rm -f $out && touch $out",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700147 })
148
Nan Zhang43a485c2017-03-27 14:27:58 -0700149 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700150
151 toc = pctx.AndroidStaticRule("toc",
152 blueprint.RuleParams{
153 Depfile: "${out}.d",
154 Deps: blueprint.DepsGCC,
Colin Crossb496cfd2018-09-10 16:50:05 -0700155 Command: "CROSS_COMPILE=$crossCompile $tocPath $format -i ${in} -o ${out} -d ${out}.d",
Colin Cross26c34ed2016-09-30 17:10:16 -0700156 CommandDeps: []string{"$tocPath"},
157 Restat: true,
158 },
Colin Crossb496cfd2018-09-10 16:50:05 -0700159 "crossCompile", "format")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700160
161 clangTidy = pctx.AndroidStaticRule("clangTidy",
162 blueprint.RuleParams{
George Burgess IVc4624c02019-04-04 16:22:37 -0700163 Command: "rm -f $out && ${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out",
164 CommandDeps: []string{"${config.ClangBin}/clang-tidy"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700165 },
166 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800167
Nan Zhang43a485c2017-03-27 14:27:58 -0700168 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800169
170 yasm = pctx.AndroidStaticRule("yasm",
171 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700172 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800173 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700174 Depfile: "$out.d",
175 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800176 },
177 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800178
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700179 windres = pctx.AndroidStaticRule("windres",
180 blueprint.RuleParams{
Nick Desaulniers18eeffa2020-01-29 16:20:11 -0800181 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 -0700182 CommandDeps: []string{"$windresCmd"},
183 },
184 "windresCmd", "flags")
185
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800186 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800187
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700188 // -w has been added since header-abi-dumper does not need to produce any sort of diagnostic information.
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800189 sAbiDump = pctx.AndroidStaticRule("sAbiDump",
190 blueprint.RuleParams{
Logan Chien3ff624f2018-10-08 11:49:32 +0800191 Command: "rm -f $out && $sAbiDumper -o ${out} $in $exportDirs -- $cFlags -w -isystem prebuilts/clang-tools/${config.HostPrebuiltTag}/clang-headers",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800192 CommandDeps: []string{"$sAbiDumper"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800193 },
194 "cFlags", "exportDirs")
195
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800196 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800197
198 sAbiLink = pctx.AndroidStaticRule("sAbiLink",
199 blueprint.RuleParams{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800200 Command: "$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800201 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800202 Rspfile: "${out}.rsp",
203 RspfileContent: "${in}",
204 },
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800205 "symbolFilter", "arch", "exportedHeaderFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800206
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800207 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700208
Colin Cross2e2dbc22019-09-25 13:31:46 -0700209 sAbiDiff = pctx.RuleFunc("sAbiDiff",
Dan Willemsen54daaf02018-03-12 13:24:09 -0700210 func(ctx android.PackageRuleContext) blueprint.RuleParams {
Jayant Chowdhary39d167a2018-05-17 16:45:51 -0700211 // TODO(b/78139997): Add -check-all-apis back
Logan Chien6227fed2019-02-18 13:12:21 +0800212 commandStr := "($sAbiDiffer ${allowFlags} -lib ${libName} -arch ${arch} -o ${out} -new ${in} -old ${referenceDump})"
213 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 +0800214 commandStr += " && (mkdir -p $$DIST_DIR/abidiffs && cp ${out} $$DIST_DIR/abidiffs/)"
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800215 commandStr += " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800216 return blueprint.RuleParams{
217 Command: commandStr,
218 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700219 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800220 },
Logan Chien6227fed2019-02-18 13:12:21 +0800221 "allowFlags", "referenceDump", "libName", "arch", "createReferenceDumpFlags")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700222
223 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
224 blueprint.RuleParams{
225 Command: "gunzip -c $in > $out",
226 })
Oliver Nguyenc7434142019-04-24 14:22:25 -0700227
228 zip = pctx.AndroidStaticRule("zip",
229 blueprint.RuleParams{
230 Command: "cat $out.rsp | tr ' ' '\\n' | tr -d \\' | sort -u > ${out}.tmp && ${SoongZipCmd} -o ${out} -C $$OUT_DIR -l ${out}.tmp",
231 CommandDeps: []string{"${SoongZipCmd}"},
232 Rspfile: "$out.rsp",
233 RspfileContent: "$in",
234 })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800235
236 _ = pctx.SourcePathVariable("cxxExtractor",
237 "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/cxx_extractor")
Sasha Smundak65143642019-09-26 20:14:28 -0700238 _ = pctx.SourcePathVariable("kytheVnames", "build/soong/vnames.json")
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800239 _ = pctx.VariableFunc("kytheCorpus",
240 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCorpusName() })
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800241 _ = pctx.VariableFunc("kytheCuEncoding",
242 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCuEncoding() })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800243 kytheExtract = pctx.StaticRule("kythe",
244 blueprint.RuleParams{
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800245 Command: `rm -f $out && ` +
246 `KYTHE_CORPUS=${kytheCorpus} KYTHE_OUTPUT_FILE=$out KYTHE_VNAMES=$kytheVnames KYTHE_KZIP_ENCODING=${kytheCuEncoding} ` +
247 `$cxxExtractor $cFlags $in `,
Sasha Smundak65143642019-09-26 20:14:28 -0700248 CommandDeps: []string{"$cxxExtractor", "$kytheVnames"},
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800249 },
250 "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -0800251)
252
Dan Willemsen322a0a62015-11-17 15:19:46 -0800253func init() {
254 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
255 // debug output. That way two builds in two different directories will
256 // create the same output.
257 if runtime.GOOS != "darwin" {
258 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
259 } else {
260 // Darwin doesn't have /proc
261 pctx.StaticVariable("relPwd", "")
262 }
Oliver Nguyenc7434142019-04-24 14:22:25 -0700263
264 pctx.HostBinToolVariable("SoongZipCmd", "soong_zip")
Dan Willemsen322a0a62015-11-17 15:19:46 -0800265}
266
Colin Cross3f40fa42015-01-30 17:27:36 -0800267type builderFlags struct {
Colin Cross6d88dba2019-11-06 07:06:58 -0800268 globalCommonFlags string
269 globalAsFlags string
270 globalYasmFlags string
271 globalCFlags string
272 globalToolingCFlags string // A separate set of cFlags for clang LibTooling tools
273 globalToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
274 globalConlyFlags string
275 globalCppFlags string
276 globalLdFlags string
277
278 localCommonFlags string
279 localAsFlags string
280 localYasmFlags string
281 localCFlags string
282 localToolingCFlags string // A separate set of cFlags for clang LibTooling tools
283 localToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
284 localConlyFlags string
285 localCppFlags string
286 localLdFlags string
287
288 libFlags string
289 extraLibFlags string
290 tidyFlags string
291 sAbiFlags string
292 aidlFlags string
293 rsFlags string
294 toolchain config.Toolchain
295 tidy bool
296 coverage bool
297 sAbiDump bool
298 emitXrefs bool
Colin Cross665dce92016-04-28 14:50:03 -0700299
Dan Willemsen98ab3112019-08-27 21:20:40 -0700300 assemblerWithCpp bool
301
Colin Crossc3199482017-03-30 15:03:04 -0700302 systemIncludeFlags string
303
Colin Cross18c0c5a2016-12-01 14:45:23 -0800304 groupStaticLibs bool
305
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700306 stripKeepSymbols bool
307 stripKeepSymbolsList string
308 stripKeepSymbolsAndDebugFrame bool
309 stripKeepMiniDebugInfo bool
310 stripAddGnuDebuglink bool
311 stripUseGnuStrip bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800312
Colin Cross19878da2019-03-28 14:45:07 -0700313 proto android.ProtoFlags
Dan Willemsen60e62f02018-11-16 21:05:32 -0800314 protoC bool
315 protoOptionsFile bool
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700316
317 yacc *YaccProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800318}
319
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700320type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800321 objFiles android.Paths
322 tidyFiles android.Paths
323 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800324 sAbiDumpFiles android.Paths
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800325 kytheFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700326}
327
328func (a Objects) Copy() Objects {
329 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800330 objFiles: append(android.Paths{}, a.objFiles...),
331 tidyFiles: append(android.Paths{}, a.tidyFiles...),
332 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800333 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800334 kytheFiles: append(android.Paths{}, a.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700335 }
336}
337
338func (a Objects) Append(b Objects) Objects {
339 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800340 objFiles: append(a.objFiles, b.objFiles...),
341 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
342 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800343 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800344 kytheFiles: append(a.kytheFiles, b.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700345 }
346}
347
Colin Cross3f40fa42015-01-30 17:27:36 -0800348// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700349func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800350 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700351
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700352 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700353 var tidyFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700354 if flags.tidy {
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700355 tidyFiles = make(android.Paths, 0, len(srcFiles))
356 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800357 var coverageFiles android.Paths
358 if flags.coverage {
359 coverageFiles = make(android.Paths, 0, len(srcFiles))
360 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800361 var kytheFiles android.Paths
362 if flags.emitXrefs {
363 kytheFiles = make(android.Paths, 0, len(srcFiles))
364 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800365
Colin Cross6d88dba2019-11-06 07:06:58 -0800366 // Produce fully expanded flags for use by C tools, C compiles, C++ tools, C++ compiles, and asm compiles
367 // respectively.
368 toolingCflags := flags.globalCommonFlags + " " +
369 flags.globalToolingCFlags + " " +
370 flags.globalConlyFlags + " " +
371 flags.localCommonFlags + " " +
372 flags.localToolingCFlags + " " +
373 flags.localConlyFlags + " " +
374 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700375
Colin Cross6d88dba2019-11-06 07:06:58 -0800376 cflags := flags.globalCommonFlags + " " +
377 flags.globalCFlags + " " +
378 flags.globalConlyFlags + " " +
379 flags.localCommonFlags + " " +
380 flags.localCFlags + " " +
381 flags.localConlyFlags + " " +
382 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700383
Colin Cross6d88dba2019-11-06 07:06:58 -0800384 toolingCppflags := flags.globalCommonFlags + " " +
385 flags.globalToolingCFlags + " " +
386 flags.globalToolingCppFlags + " " +
387 flags.localCommonFlags + " " +
388 flags.localToolingCFlags + " " +
389 flags.localToolingCppFlags + " " +
390 flags.systemIncludeFlags
Colin Crossc3199482017-03-30 15:03:04 -0700391
Colin Cross6d88dba2019-11-06 07:06:58 -0800392 cppflags := flags.globalCommonFlags + " " +
393 flags.globalCFlags + " " +
394 flags.globalCppFlags + " " +
395 flags.localCommonFlags + " " +
396 flags.localCFlags + " " +
397 flags.localCppFlags + " " +
398 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700399
Colin Cross6d88dba2019-11-06 07:06:58 -0800400 asflags := flags.globalCommonFlags + " " +
401 flags.globalAsFlags + " " +
402 flags.localCommonFlags + " " +
403 flags.localAsFlags + " " +
404 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700405
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800406 var sAbiDumpFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700407 if flags.sAbiDump {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800408 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
409 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800410
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700411 cflags += " ${config.NoOverrideClangGlobalCflags}"
412 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
413 cppflags += " ${config.NoOverrideClangGlobalCflags}"
414 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800415
Colin Cross3f40fa42015-01-30 17:27:36 -0800416 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700417 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800418
419 objFiles[i] = objFile
420
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700421 switch srcFile.Ext() {
422 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700423 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700424 Rule: yasm,
425 Description: "yasm " + srcFile.Rel(),
426 Output: objFile,
427 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800428 Implicits: cFlagsDeps,
429 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800430 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800431 "asFlags": flags.globalYasmFlags + " " + flags.localYasmFlags,
Colin Cross91e90042016-12-02 17:13:24 -0800432 },
433 })
434 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700435 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700436 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700437 Rule: windres,
438 Description: "windres " + srcFile.Rel(),
439 Output: objFile,
440 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800441 Implicits: cFlagsDeps,
442 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700443 Args: map[string]string{
444 "windresCmd": gccCmd(flags.toolchain, "windres"),
445 "flags": flags.toolchain.WindresFlags(),
446 },
447 })
448 continue
Pete Bentleyfcf55bf2019-08-16 20:14:32 +0100449 case ".o":
450 objFiles[i] = srcFile
451 continue
Colin Cross91e90042016-12-02 17:13:24 -0800452 }
453
Colin Cross6d88dba2019-11-06 07:06:58 -0800454 var moduleFlags string
455 var moduleToolingFlags string
456
Colin Cross3f40fa42015-01-30 17:27:36 -0800457 var ccCmd string
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700458 tidy := flags.tidy
Dan Willemsen581341d2017-02-09 16:16:31 -0800459 coverage := flags.coverage
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700460 dump := flags.sAbiDump
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800461 rule := cc
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800462 emitXref := flags.emitXrefs
Colin Cross3f40fa42015-01-30 17:27:36 -0800463
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700464 switch srcFile.Ext() {
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800465 case ".s":
Dan Willemsen98ab3112019-08-27 21:20:40 -0700466 if !flags.assemblerWithCpp {
467 rule = ccNoDeps
468 }
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800469 fallthrough
470 case ".S":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700471 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800472 moduleFlags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700473 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800474 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800475 dump = false
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800476 emitXref = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800477 case ".c":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700478 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800479 moduleFlags = cflags
480 moduleToolingFlags = toolingCflags
Colin Crossd34ab7c2019-06-27 14:46:10 -0700481 case ".cpp", ".cc", ".cxx", ".mm":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700482 ccCmd = "clang++"
Colin Cross6d88dba2019-11-06 07:06:58 -0800483 moduleFlags = cppflags
484 moduleToolingFlags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800485 default:
486 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
487 continue
488 }
489
Colin Cross67a5c132017-05-09 13:45:28 -0700490 ccDesc := ccCmd
491
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700492 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800493
Dan Willemsen581341d2017-02-09 16:16:31 -0800494 var implicitOutputs android.WritablePaths
495 if coverage {
496 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
497 implicitOutputs = append(implicitOutputs, gcnoFile)
498 coverageFiles = append(coverageFiles, gcnoFile)
499 }
500
Colin Crossae887032017-10-23 17:16:14 -0700501 ctx.Build(pctx, android.BuildParams{
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800502 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700503 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800504 Output: objFile,
505 ImplicitOutputs: implicitOutputs,
506 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800507 Implicits: cFlagsDeps,
508 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800509 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800510 "cFlags": moduleFlags,
Colin Cross28344522015-04-22 13:07:53 -0700511 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800512 },
513 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700514
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800515 if emitXref {
516 kytheFile := android.ObjPathWithExt(ctx, subdir, srcFile, "kzip")
517 ctx.Build(pctx, android.BuildParams{
518 Rule: kytheExtract,
519 Description: "Xref C++ extractor " + srcFile.Rel(),
520 Output: kytheFile,
521 Input: srcFile,
522 Implicits: cFlagsDeps,
523 OrderOnly: pathDeps,
524 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800525 "cFlags": moduleFlags,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800526 },
527 })
528 kytheFiles = append(kytheFiles, kytheFile)
529 }
530
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700531 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700532 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700533 tidyFiles = append(tidyFiles, tidyFile)
534
Colin Crossae887032017-10-23 17:16:14 -0700535 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700536 Rule: clangTidy,
537 Description: "clang-tidy " + srcFile.Rel(),
538 Output: tidyFile,
539 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700540 // We must depend on objFile, since clang-tidy doesn't
541 // support exporting dependencies.
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700542 Implicit: objFile,
543 Implicits: cFlagsDeps,
544 OrderOnly: pathDeps,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700545 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800546 "cFlags": moduleToolingFlags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700547 "tidyFlags": flags.tidyFlags,
548 },
549 })
550 }
551
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800552 if dump {
553 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
554 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
555
Colin Crossae887032017-10-23 17:16:14 -0700556 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700557 Rule: sAbiDump,
558 Description: "header-abi-dumper " + srcFile.Rel(),
559 Output: sAbiDumpFile,
560 Input: srcFile,
561 Implicit: objFile,
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700562 Implicits: cFlagsDeps,
563 OrderOnly: pathDeps,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800564 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800565 "cFlags": moduleToolingFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800566 "exportDirs": flags.sAbiFlags,
567 },
568 })
569 }
570
Colin Cross3f40fa42015-01-30 17:27:36 -0800571 }
572
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700573 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800574 objFiles: objFiles,
575 tidyFiles: tidyFiles,
576 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800577 sAbiDumpFiles: sAbiDumpFiles,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800578 kytheFiles: kytheFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700579 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800580}
581
582// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700583func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700584 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800585
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800586 arCmd := "${config.ClangBin}/llvm-ar"
Yi Kongee96a792019-09-06 15:11:57 -0700587 arFlags := "crsPD"
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800588 if !ctx.Darwin() {
589 arFlags += " -format=gnu"
590 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800591
Colin Crossae887032017-10-23 17:16:14 -0700592 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700593 Rule: ar,
594 Description: "static link " + outputFile.Base(),
595 Output: outputFile,
596 Inputs: objFiles,
597 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800598 Args: map[string]string{
599 "arFlags": arFlags,
600 "arCmd": arCmd,
601 },
602 })
603}
604
605// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700606// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700607func TransformObjToDynamicBinary(ctx android.ModuleContext,
608 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
Josh Gao75a50a22019-06-07 17:58:59 -0700609 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath, implicitOutputs android.WritablePaths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800610
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700611 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800612
Colin Cross3f40fa42015-01-30 17:27:36 -0800613 var libFlagsList []string
614
Colin Cross16b23492016-01-06 14:41:07 -0800615 if len(flags.libFlags) > 0 {
616 libFlagsList = append(libFlagsList, flags.libFlags)
617 }
618
Colin Cross3f40fa42015-01-30 17:27:36 -0800619 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800620 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700621 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700622 } else {
623 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700624 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700625 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
626 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800627 }
628
Colin Cross7a7cf972016-12-05 18:47:39 -0800629 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800630 libFlagsList = append(libFlagsList, "-Wl,--start-group")
631 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700632 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800633 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800634 libFlagsList = append(libFlagsList, "-Wl,--end-group")
635 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800636
Stephen Hines10347862016-07-18 15:54:54 -0700637 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700638 libFlagsList = append(libFlagsList, "-Wl,--start-group")
639 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700640 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700641 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700642 libFlagsList = append(libFlagsList, "-Wl,--end-group")
643 }
644
Colin Cross3f40fa42015-01-30 17:27:36 -0800645 for _, lib := range sharedLibs {
Josh Gao75a50a22019-06-07 17:58:59 -0700646 libFile := lib.String()
647 if ctx.Windows() {
648 libFile = pathtools.ReplaceExtension(libFile, "lib")
649 }
650 libFlagsList = append(libFlagsList, libFile)
Colin Cross3f40fa42015-01-30 17:27:36 -0800651 }
652
Colin Cross3f40fa42015-01-30 17:27:36 -0800653 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700654 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800655 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700656 if crtBegin.Valid() {
657 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800658 }
659
Colin Crossae887032017-10-23 17:16:14 -0700660 ctx.Build(pctx, android.BuildParams{
Josh Gao75a50a22019-06-07 17:58:59 -0700661 Rule: ld,
662 Description: "link " + outputFile.Base(),
663 Output: outputFile,
664 ImplicitOutputs: implicitOutputs,
665 Inputs: objFiles,
666 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800667 Args: map[string]string{
Pete Bentley99f2fc22019-08-02 14:02:20 +0100668 "ldCmd": ldCmd,
669 "crtBegin": crtBegin.String(),
670 "libFlags": strings.Join(libFlagsList, " "),
671 "extraLibFlags": flags.extraLibFlags,
Colin Cross6d88dba2019-11-06 07:06:58 -0800672 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
Pete Bentley99f2fc22019-08-02 14:02:20 +0100673 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800674 },
675 })
676}
677
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800678// Generate a rule to combine .dump sAbi dump files from multiple source files
679// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700680func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800681 baseName, exportedHeaderFlags string, symbolFile android.OptionalPath,
682 excludedSymbolVersions, excludedSymbolTags []string) android.OptionalPath {
683
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800684 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800685
686 implicits := android.Paths{soFile}
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800687 symbolFilterStr := "-so " + soFile.String()
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800688
689 if symbolFile.Valid() {
690 implicits = append(implicits, symbolFile.Path())
691 symbolFilterStr += " -v " + symbolFile.String()
692 }
693 for _, ver := range excludedSymbolVersions {
694 symbolFilterStr += " --exclude-symbol-version " + ver
695 }
696 for _, tag := range excludedSymbolTags {
697 symbolFilterStr += " --exclude-symbol-tag " + tag
698 }
Colin Crossae887032017-10-23 17:16:14 -0700699 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700700 Rule: sAbiLink,
701 Description: "header-abi-linker " + outputFile.Base(),
702 Output: outputFile,
703 Inputs: sAbiDumps,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800704 Implicits: implicits,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800705 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800706 "symbolFilter": symbolFilterStr,
707 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800708 "exportedHeaderFlags": exportedHeaderFlags,
709 },
710 })
711 return android.OptionalPathForPath(outputFile)
712}
713
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700714func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
715 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700716 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700717 Rule: unzipRefSAbiDump,
718 Description: "gunzip" + outputFile.Base(),
719 Output: outputFile,
720 Input: zippedRefDump,
721 })
722 return outputFile
723}
724
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800725func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chien62f1f942019-02-18 15:40:42 +0800726 baseName, exportedHeaderFlags string, isLlndk, isNdk, isVndkExt bool) android.OptionalPath {
Logan Chienf3511742017-10-31 18:04:35 +0800727
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800728 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700729 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Logan Chien6227fed2019-02-18 13:12:21 +0800730 createReferenceDumpFlags := ""
731
Jayant Chowdharye4499502018-01-17 13:13:33 -0800732 localAbiCheckAllowFlags := append([]string(nil), abiCheckAllowFlags...)
733 if exportedHeaderFlags == "" {
734 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-advice-only")
735 }
Logan Chien62f1f942019-02-18 15:40:42 +0800736 if isLlndk || isNdk {
Logan Chien6227fed2019-02-18 13:12:21 +0800737 createReferenceDumpFlags = "--llndk"
Logan Chien62f1f942019-02-18 15:40:42 +0800738 if isLlndk {
739 // TODO(b/130324828): "-consider-opaque-types-different" should apply to
740 // both LLNDK and NDK shared libs. However, a known issue in header-abi-diff
741 // breaks libaaudio. Remove the if-guard after the issue is fixed.
742 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-consider-opaque-types-different")
743 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700744 }
Logan Chienf3511742017-10-31 18:04:35 +0800745 if isVndkExt {
746 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-allow-extensions")
747 }
748
Colin Crossae887032017-10-23 17:16:14 -0700749 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700750 Rule: sAbiDiff,
751 Description: "header-abi-diff " + outputFile.Base(),
752 Output: outputFile,
753 Input: inputDump,
754 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800755 Args: map[string]string{
Logan Chien6227fed2019-02-18 13:12:21 +0800756 "referenceDump": referenceDump.String(),
757 "libName": libName,
758 "arch": ctx.Arch().ArchType.Name,
759 "allowFlags": strings.Join(localAbiCheckAllowFlags, " "),
760 "createReferenceDumpFlags": createReferenceDumpFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800761 },
762 })
763 return android.OptionalPathForPath(outputFile)
764}
765
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700766// Generate a rule for extracting a table of contents from a shared library (.so)
767func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700768 outputFile android.WritablePath, flags builderFlags) {
769
Colin Crossb496cfd2018-09-10 16:50:05 -0700770 var format string
771 var crossCompile string
772 if ctx.Darwin() {
773 format = "--macho"
774 crossCompile = "${config.MacToolPath}"
775 } else if ctx.Windows() {
776 format = "--pe"
777 crossCompile = gccCmd(flags.toolchain, "")
778 } else {
779 format = "--elf"
780 crossCompile = gccCmd(flags.toolchain, "")
781 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700782
Colin Crossae887032017-10-23 17:16:14 -0700783 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700784 Rule: toc,
785 Description: "generate toc " + inputFile.Base(),
786 Output: outputFile,
787 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700788 Args: map[string]string{
789 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700790 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700791 },
792 })
793}
794
Colin Cross3f40fa42015-01-30 17:27:36 -0800795// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700796func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700797 flags builderFlags, outputFile android.WritablePath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800798
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700799 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800800
Colin Crossae887032017-10-23 17:16:14 -0700801 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700802 Rule: partialLd,
803 Description: "link " + outputFile.Base(),
804 Output: outputFile,
805 Inputs: objFiles,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700806 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800807 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700808 "ldCmd": ldCmd,
Colin Cross6d88dba2019-11-06 07:06:58 -0800809 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800810 },
811 })
812}
813
Colin Crossbfae8852015-03-26 14:44:11 -0700814// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700815func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
816 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700817
818 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
819
Colin Crossae887032017-10-23 17:16:14 -0700820 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700821 Rule: prefixSymbols,
822 Description: "prefix symbols " + outputFile.Base(),
823 Output: outputFile,
824 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700825 Args: map[string]string{
826 "objcopyCmd": objcopyCmd,
827 "prefix": prefix,
828 },
829 })
830}
831
Colin Cross635c3b02016-05-18 15:37:25 -0700832func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
833 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700834
835 crossCompile := gccCmd(flags.toolchain, "")
836 args := ""
837 if flags.stripAddGnuDebuglink {
838 args += " --add-gnu-debuglink"
839 }
840 if flags.stripKeepMiniDebugInfo {
841 args += " --keep-mini-debug-info"
842 }
843 if flags.stripKeepSymbols {
844 args += " --keep-symbols"
845 }
Yi Kongacee27c2019-03-29 20:05:14 -0700846 if flags.stripKeepSymbolsList != "" {
847 args += " -k" + flags.stripKeepSymbolsList
848 }
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700849 if flags.stripKeepSymbolsAndDebugFrame {
850 args += " --keep-symbols-and-debug-frame"
851 }
Yi Kongb5c34d72018-11-07 16:28:49 -0800852 if flags.stripUseGnuStrip {
853 args += " --use-gnu-strip"
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700854 }
Colin Cross665dce92016-04-28 14:50:03 -0700855
Colin Crossae887032017-10-23 17:16:14 -0700856 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700857 Rule: strip,
858 Description: "strip " + outputFile.Base(),
859 Output: outputFile,
860 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700861 Args: map[string]string{
862 "crossCompile": crossCompile,
863 "args": args,
864 },
865 })
866}
867
Colin Cross635c3b02016-05-18 15:37:25 -0700868func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
869 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700870
Colin Crossae887032017-10-23 17:16:14 -0700871 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700872 Rule: darwinStrip,
873 Description: "strip " + outputFile.Base(),
874 Output: outputFile,
875 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700876 })
877}
878
Oliver Nguyenc7434142019-04-24 14:22:25 -0700879func TransformCoverageFilesToZip(ctx android.ModuleContext,
880 inputs Objects, baseName string) android.OptionalPath {
Dan Willemsen581341d2017-02-09 16:16:31 -0800881
882 if len(inputs.coverageFiles) > 0 {
Oliver Nguyenc7434142019-04-24 14:22:25 -0700883 outputFile := android.PathForModuleOut(ctx, baseName+".zip")
Dan Willemsen581341d2017-02-09 16:16:31 -0800884
Oliver Nguyenc7434142019-04-24 14:22:25 -0700885 ctx.Build(pctx, android.BuildParams{
886 Rule: zip,
887 Description: "zip " + outputFile.Base(),
888 Inputs: inputs.coverageFiles,
889 Output: outputFile,
890 })
Dan Willemsen581341d2017-02-09 16:16:31 -0800891
892 return android.OptionalPathForPath(outputFile)
893 }
894
895 return android.OptionalPath{}
896}
897
Yi Kongc49c3932019-10-15 02:01:19 -0700898func TransformArchiveRepack(ctx android.ModuleContext, inputFile android.Path,
899 outputFile android.WritablePath, objects []string) {
900
901 ctx.Build(pctx, android.BuildParams{
902 Rule: archiveRepack,
903 Description: "Repack archive " + outputFile.Base(),
904 Output: outputFile,
905 Input: inputFile,
906 Args: map[string]string{
907 "objects": strings.Join(objects, " "),
908 },
909 })
910}
911
Colin Crossb98c8b02016-07-29 13:44:28 -0700912func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800913 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
914}
Colin Cross0af4b842015-04-30 16:36:18 -0700915
Colin Cross5b529592017-05-09 13:34:34 -0700916func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700917 var i int
918
919 start := 0
920 bytes := 0
921 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700922 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700923 if l > limit {
924 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
925 }
926 if bytes+l > limit {
927 lists = append(lists, list[start:i])
928 start = i
929 bytes = 0
930 }
931 bytes += l + 1 // count a space between each list element
932 }
933
934 lists = append(lists, list[start:])
935
936 totalLen := 0
937 for _, l := range lists {
938 totalLen += len(l)
939 }
940 if totalLen != len(list) {
941 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
942 }
943 return lists, nil
944}