blob: c1fdc58b186ce0da336bca9b19930c132d56dac3 [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
Colin Cross9d45bb72016-08-29 16:14:13 -070049 cc = pctx.AndroidGomaStaticRule("cc",
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
Dan Willemsenfcabb1c2019-01-03 23:25:11 -080058 ccNoDeps = pctx.AndroidGomaStaticRule("ccNoDeps",
59 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{
181 Command: "$windresCmd $flags -I$$(dirname $in) -i $in -o $out",
182 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() })
241 kytheExtract = pctx.StaticRule("kythe",
242 blueprint.RuleParams{
Sasha Smundak65143642019-09-26 20:14:28 -0700243 Command: "rm -f $out && KYTHE_CORPUS=${kytheCorpus} KYTHE_OUTPUT_FILE=$out KYTHE_VNAMES=$kytheVnames $cxxExtractor $cFlags $in ",
244 CommandDeps: []string{"$cxxExtractor", "$kytheVnames"},
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800245 },
246 "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -0800247)
248
Dan Willemsen322a0a62015-11-17 15:19:46 -0800249func init() {
250 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
251 // debug output. That way two builds in two different directories will
252 // create the same output.
253 if runtime.GOOS != "darwin" {
254 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
255 } else {
256 // Darwin doesn't have /proc
257 pctx.StaticVariable("relPwd", "")
258 }
Oliver Nguyenc7434142019-04-24 14:22:25 -0700259
260 pctx.HostBinToolVariable("SoongZipCmd", "soong_zip")
Dan Willemsen322a0a62015-11-17 15:19:46 -0800261}
262
Colin Cross3f40fa42015-01-30 17:27:36 -0800263type builderFlags struct {
Colin Cross6d88dba2019-11-06 07:06:58 -0800264 globalCommonFlags string
265 globalAsFlags string
266 globalYasmFlags string
267 globalCFlags string
268 globalToolingCFlags string // A separate set of cFlags for clang LibTooling tools
269 globalToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
270 globalConlyFlags string
271 globalCppFlags string
272 globalLdFlags string
273
274 localCommonFlags string
275 localAsFlags string
276 localYasmFlags string
277 localCFlags string
278 localToolingCFlags string // A separate set of cFlags for clang LibTooling tools
279 localToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
280 localConlyFlags string
281 localCppFlags string
282 localLdFlags string
283
284 libFlags string
285 extraLibFlags string
286 tidyFlags string
287 sAbiFlags string
288 aidlFlags string
289 rsFlags string
290 toolchain config.Toolchain
291 tidy bool
292 coverage bool
293 sAbiDump bool
294 emitXrefs bool
Colin Cross665dce92016-04-28 14:50:03 -0700295
Dan Willemsen98ab3112019-08-27 21:20:40 -0700296 assemblerWithCpp bool
297
Colin Crossc3199482017-03-30 15:03:04 -0700298 systemIncludeFlags string
299
Colin Cross18c0c5a2016-12-01 14:45:23 -0800300 groupStaticLibs bool
301
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700302 stripKeepSymbols bool
303 stripKeepSymbolsList string
304 stripKeepSymbolsAndDebugFrame bool
305 stripKeepMiniDebugInfo bool
306 stripAddGnuDebuglink bool
307 stripUseGnuStrip bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800308
Colin Cross19878da2019-03-28 14:45:07 -0700309 proto android.ProtoFlags
Dan Willemsen60e62f02018-11-16 21:05:32 -0800310 protoC bool
311 protoOptionsFile bool
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700312
313 yacc *YaccProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800314}
315
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700316type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800317 objFiles android.Paths
318 tidyFiles android.Paths
319 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800320 sAbiDumpFiles android.Paths
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800321 kytheFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700322}
323
324func (a Objects) Copy() Objects {
325 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800326 objFiles: append(android.Paths{}, a.objFiles...),
327 tidyFiles: append(android.Paths{}, a.tidyFiles...),
328 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800329 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800330 kytheFiles: append(android.Paths{}, a.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700331 }
332}
333
334func (a Objects) Append(b Objects) Objects {
335 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800336 objFiles: append(a.objFiles, b.objFiles...),
337 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
338 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800339 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800340 kytheFiles: append(a.kytheFiles, b.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700341 }
342}
343
Colin Cross3f40fa42015-01-30 17:27:36 -0800344// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700345func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800346 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700347
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700348 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700349 var tidyFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700350 if flags.tidy {
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700351 tidyFiles = make(android.Paths, 0, len(srcFiles))
352 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800353 var coverageFiles android.Paths
354 if flags.coverage {
355 coverageFiles = make(android.Paths, 0, len(srcFiles))
356 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800357 var kytheFiles android.Paths
358 if flags.emitXrefs {
359 kytheFiles = make(android.Paths, 0, len(srcFiles))
360 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800361
Colin Cross6d88dba2019-11-06 07:06:58 -0800362 // Produce fully expanded flags for use by C tools, C compiles, C++ tools, C++ compiles, and asm compiles
363 // respectively.
364 toolingCflags := flags.globalCommonFlags + " " +
365 flags.globalToolingCFlags + " " +
366 flags.globalConlyFlags + " " +
367 flags.localCommonFlags + " " +
368 flags.localToolingCFlags + " " +
369 flags.localConlyFlags + " " +
370 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700371
Colin Cross6d88dba2019-11-06 07:06:58 -0800372 cflags := flags.globalCommonFlags + " " +
373 flags.globalCFlags + " " +
374 flags.globalConlyFlags + " " +
375 flags.localCommonFlags + " " +
376 flags.localCFlags + " " +
377 flags.localConlyFlags + " " +
378 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700379
Colin Cross6d88dba2019-11-06 07:06:58 -0800380 toolingCppflags := flags.globalCommonFlags + " " +
381 flags.globalToolingCFlags + " " +
382 flags.globalToolingCppFlags + " " +
383 flags.localCommonFlags + " " +
384 flags.localToolingCFlags + " " +
385 flags.localToolingCppFlags + " " +
386 flags.systemIncludeFlags
Colin Crossc3199482017-03-30 15:03:04 -0700387
Colin Cross6d88dba2019-11-06 07:06:58 -0800388 cppflags := flags.globalCommonFlags + " " +
389 flags.globalCFlags + " " +
390 flags.globalCppFlags + " " +
391 flags.localCommonFlags + " " +
392 flags.localCFlags + " " +
393 flags.localCppFlags + " " +
394 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700395
Colin Cross6d88dba2019-11-06 07:06:58 -0800396 asflags := flags.globalCommonFlags + " " +
397 flags.globalAsFlags + " " +
398 flags.localCommonFlags + " " +
399 flags.localAsFlags + " " +
400 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700401
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800402 var sAbiDumpFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700403 if flags.sAbiDump {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800404 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
405 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800406
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700407 cflags += " ${config.NoOverrideClangGlobalCflags}"
408 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
409 cppflags += " ${config.NoOverrideClangGlobalCflags}"
410 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800411
Colin Cross3f40fa42015-01-30 17:27:36 -0800412 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700413 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800414
415 objFiles[i] = objFile
416
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700417 switch srcFile.Ext() {
418 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700419 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700420 Rule: yasm,
421 Description: "yasm " + srcFile.Rel(),
422 Output: objFile,
423 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800424 Implicits: cFlagsDeps,
425 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800426 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800427 "asFlags": flags.globalYasmFlags + " " + flags.localYasmFlags,
Colin Cross91e90042016-12-02 17:13:24 -0800428 },
429 })
430 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700431 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700432 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700433 Rule: windres,
434 Description: "windres " + srcFile.Rel(),
435 Output: objFile,
436 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800437 Implicits: cFlagsDeps,
438 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700439 Args: map[string]string{
440 "windresCmd": gccCmd(flags.toolchain, "windres"),
441 "flags": flags.toolchain.WindresFlags(),
442 },
443 })
444 continue
Pete Bentleyfcf55bf2019-08-16 20:14:32 +0100445 case ".o":
446 objFiles[i] = srcFile
447 continue
Colin Cross91e90042016-12-02 17:13:24 -0800448 }
449
Colin Cross6d88dba2019-11-06 07:06:58 -0800450 var moduleFlags string
451 var moduleToolingFlags string
452
Colin Cross3f40fa42015-01-30 17:27:36 -0800453 var ccCmd string
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700454 tidy := flags.tidy
Dan Willemsen581341d2017-02-09 16:16:31 -0800455 coverage := flags.coverage
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700456 dump := flags.sAbiDump
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800457 rule := cc
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800458 emitXref := flags.emitXrefs
Colin Cross3f40fa42015-01-30 17:27:36 -0800459
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700460 switch srcFile.Ext() {
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800461 case ".s":
Dan Willemsen98ab3112019-08-27 21:20:40 -0700462 if !flags.assemblerWithCpp {
463 rule = ccNoDeps
464 }
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800465 fallthrough
466 case ".S":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700467 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800468 moduleFlags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700469 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800470 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800471 dump = false
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800472 emitXref = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800473 case ".c":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700474 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800475 moduleFlags = cflags
476 moduleToolingFlags = toolingCflags
Colin Crossd34ab7c2019-06-27 14:46:10 -0700477 case ".cpp", ".cc", ".cxx", ".mm":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700478 ccCmd = "clang++"
Colin Cross6d88dba2019-11-06 07:06:58 -0800479 moduleFlags = cppflags
480 moduleToolingFlags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800481 default:
482 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
483 continue
484 }
485
Colin Cross67a5c132017-05-09 13:45:28 -0700486 ccDesc := ccCmd
487
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700488 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800489
Dan Willemsen581341d2017-02-09 16:16:31 -0800490 var implicitOutputs android.WritablePaths
491 if coverage {
492 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
493 implicitOutputs = append(implicitOutputs, gcnoFile)
494 coverageFiles = append(coverageFiles, gcnoFile)
495 }
496
Colin Crossae887032017-10-23 17:16:14 -0700497 ctx.Build(pctx, android.BuildParams{
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800498 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700499 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800500 Output: objFile,
501 ImplicitOutputs: implicitOutputs,
502 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800503 Implicits: cFlagsDeps,
504 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800505 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800506 "cFlags": moduleFlags,
Colin Cross28344522015-04-22 13:07:53 -0700507 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800508 },
509 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700510
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800511 if emitXref {
512 kytheFile := android.ObjPathWithExt(ctx, subdir, srcFile, "kzip")
513 ctx.Build(pctx, android.BuildParams{
514 Rule: kytheExtract,
515 Description: "Xref C++ extractor " + srcFile.Rel(),
516 Output: kytheFile,
517 Input: srcFile,
518 Implicits: cFlagsDeps,
519 OrderOnly: pathDeps,
520 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800521 "cFlags": moduleFlags,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800522 },
523 })
524 kytheFiles = append(kytheFiles, kytheFile)
525 }
526
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700527 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700528 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700529 tidyFiles = append(tidyFiles, tidyFile)
530
Colin Crossae887032017-10-23 17:16:14 -0700531 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700532 Rule: clangTidy,
533 Description: "clang-tidy " + srcFile.Rel(),
534 Output: tidyFile,
535 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700536 // We must depend on objFile, since clang-tidy doesn't
537 // support exporting dependencies.
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700538 Implicit: objFile,
539 Implicits: cFlagsDeps,
540 OrderOnly: pathDeps,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700541 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800542 "cFlags": moduleToolingFlags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700543 "tidyFlags": flags.tidyFlags,
544 },
545 })
546 }
547
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800548 if dump {
549 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
550 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
551
Colin Crossae887032017-10-23 17:16:14 -0700552 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700553 Rule: sAbiDump,
554 Description: "header-abi-dumper " + srcFile.Rel(),
555 Output: sAbiDumpFile,
556 Input: srcFile,
557 Implicit: objFile,
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700558 Implicits: cFlagsDeps,
559 OrderOnly: pathDeps,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800560 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800561 "cFlags": moduleToolingFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800562 "exportDirs": flags.sAbiFlags,
563 },
564 })
565 }
566
Colin Cross3f40fa42015-01-30 17:27:36 -0800567 }
568
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700569 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800570 objFiles: objFiles,
571 tidyFiles: tidyFiles,
572 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800573 sAbiDumpFiles: sAbiDumpFiles,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800574 kytheFiles: kytheFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700575 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800576}
577
578// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700579func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700580 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800581
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800582 arCmd := "${config.ClangBin}/llvm-ar"
Yi Kongee96a792019-09-06 15:11:57 -0700583 arFlags := "crsPD"
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800584 if !ctx.Darwin() {
585 arFlags += " -format=gnu"
586 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800587
Colin Crossae887032017-10-23 17:16:14 -0700588 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700589 Rule: ar,
590 Description: "static link " + outputFile.Base(),
591 Output: outputFile,
592 Inputs: objFiles,
593 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800594 Args: map[string]string{
595 "arFlags": arFlags,
596 "arCmd": arCmd,
597 },
598 })
599}
600
601// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700602// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700603func TransformObjToDynamicBinary(ctx android.ModuleContext,
604 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
Josh Gao75a50a22019-06-07 17:58:59 -0700605 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath, implicitOutputs android.WritablePaths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800606
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700607 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800608
Colin Cross3f40fa42015-01-30 17:27:36 -0800609 var libFlagsList []string
610
Colin Cross16b23492016-01-06 14:41:07 -0800611 if len(flags.libFlags) > 0 {
612 libFlagsList = append(libFlagsList, flags.libFlags)
613 }
614
Colin Cross3f40fa42015-01-30 17:27:36 -0800615 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800616 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700617 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700618 } else {
619 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700620 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700621 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
622 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800623 }
624
Colin Cross7a7cf972016-12-05 18:47:39 -0800625 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800626 libFlagsList = append(libFlagsList, "-Wl,--start-group")
627 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700628 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
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,--end-group")
631 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800632
Stephen Hines10347862016-07-18 15:54:54 -0700633 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700634 libFlagsList = append(libFlagsList, "-Wl,--start-group")
635 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700636 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
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,--end-group")
639 }
640
Colin Cross3f40fa42015-01-30 17:27:36 -0800641 for _, lib := range sharedLibs {
Josh Gao75a50a22019-06-07 17:58:59 -0700642 libFile := lib.String()
643 if ctx.Windows() {
644 libFile = pathtools.ReplaceExtension(libFile, "lib")
645 }
646 libFlagsList = append(libFlagsList, libFile)
Colin Cross3f40fa42015-01-30 17:27:36 -0800647 }
648
Colin Cross3f40fa42015-01-30 17:27:36 -0800649 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700650 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800651 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700652 if crtBegin.Valid() {
653 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800654 }
655
Colin Crossae887032017-10-23 17:16:14 -0700656 ctx.Build(pctx, android.BuildParams{
Josh Gao75a50a22019-06-07 17:58:59 -0700657 Rule: ld,
658 Description: "link " + outputFile.Base(),
659 Output: outputFile,
660 ImplicitOutputs: implicitOutputs,
661 Inputs: objFiles,
662 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800663 Args: map[string]string{
Pete Bentley99f2fc22019-08-02 14:02:20 +0100664 "ldCmd": ldCmd,
665 "crtBegin": crtBegin.String(),
666 "libFlags": strings.Join(libFlagsList, " "),
667 "extraLibFlags": flags.extraLibFlags,
Colin Cross6d88dba2019-11-06 07:06:58 -0800668 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
Pete Bentley99f2fc22019-08-02 14:02:20 +0100669 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800670 },
671 })
672}
673
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800674// Generate a rule to combine .dump sAbi dump files from multiple source files
675// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700676func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800677 baseName, exportedHeaderFlags string, symbolFile android.OptionalPath,
678 excludedSymbolVersions, excludedSymbolTags []string) android.OptionalPath {
679
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800680 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800681
682 implicits := android.Paths{soFile}
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800683 symbolFilterStr := "-so " + soFile.String()
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800684
685 if symbolFile.Valid() {
686 implicits = append(implicits, symbolFile.Path())
687 symbolFilterStr += " -v " + symbolFile.String()
688 }
689 for _, ver := range excludedSymbolVersions {
690 symbolFilterStr += " --exclude-symbol-version " + ver
691 }
692 for _, tag := range excludedSymbolTags {
693 symbolFilterStr += " --exclude-symbol-tag " + tag
694 }
Colin Crossae887032017-10-23 17:16:14 -0700695 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700696 Rule: sAbiLink,
697 Description: "header-abi-linker " + outputFile.Base(),
698 Output: outputFile,
699 Inputs: sAbiDumps,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800700 Implicits: implicits,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800701 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800702 "symbolFilter": symbolFilterStr,
703 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800704 "exportedHeaderFlags": exportedHeaderFlags,
705 },
706 })
707 return android.OptionalPathForPath(outputFile)
708}
709
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700710func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
711 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700712 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700713 Rule: unzipRefSAbiDump,
714 Description: "gunzip" + outputFile.Base(),
715 Output: outputFile,
716 Input: zippedRefDump,
717 })
718 return outputFile
719}
720
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800721func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chien62f1f942019-02-18 15:40:42 +0800722 baseName, exportedHeaderFlags string, isLlndk, isNdk, isVndkExt bool) android.OptionalPath {
Logan Chienf3511742017-10-31 18:04:35 +0800723
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800724 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700725 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Logan Chien6227fed2019-02-18 13:12:21 +0800726 createReferenceDumpFlags := ""
727
Jayant Chowdharye4499502018-01-17 13:13:33 -0800728 localAbiCheckAllowFlags := append([]string(nil), abiCheckAllowFlags...)
729 if exportedHeaderFlags == "" {
730 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-advice-only")
731 }
Logan Chien62f1f942019-02-18 15:40:42 +0800732 if isLlndk || isNdk {
Logan Chien6227fed2019-02-18 13:12:21 +0800733 createReferenceDumpFlags = "--llndk"
Logan Chien62f1f942019-02-18 15:40:42 +0800734 if isLlndk {
735 // TODO(b/130324828): "-consider-opaque-types-different" should apply to
736 // both LLNDK and NDK shared libs. However, a known issue in header-abi-diff
737 // breaks libaaudio. Remove the if-guard after the issue is fixed.
738 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-consider-opaque-types-different")
739 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700740 }
Logan Chienf3511742017-10-31 18:04:35 +0800741 if isVndkExt {
742 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-allow-extensions")
743 }
744
Colin Crossae887032017-10-23 17:16:14 -0700745 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700746 Rule: sAbiDiff,
747 Description: "header-abi-diff " + outputFile.Base(),
748 Output: outputFile,
749 Input: inputDump,
750 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800751 Args: map[string]string{
Logan Chien6227fed2019-02-18 13:12:21 +0800752 "referenceDump": referenceDump.String(),
753 "libName": libName,
754 "arch": ctx.Arch().ArchType.Name,
755 "allowFlags": strings.Join(localAbiCheckAllowFlags, " "),
756 "createReferenceDumpFlags": createReferenceDumpFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800757 },
758 })
759 return android.OptionalPathForPath(outputFile)
760}
761
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700762// Generate a rule for extracting a table of contents from a shared library (.so)
763func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700764 outputFile android.WritablePath, flags builderFlags) {
765
Colin Crossb496cfd2018-09-10 16:50:05 -0700766 var format string
767 var crossCompile string
768 if ctx.Darwin() {
769 format = "--macho"
770 crossCompile = "${config.MacToolPath}"
771 } else if ctx.Windows() {
772 format = "--pe"
773 crossCompile = gccCmd(flags.toolchain, "")
774 } else {
775 format = "--elf"
776 crossCompile = gccCmd(flags.toolchain, "")
777 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700778
Colin Crossae887032017-10-23 17:16:14 -0700779 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700780 Rule: toc,
781 Description: "generate toc " + inputFile.Base(),
782 Output: outputFile,
783 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700784 Args: map[string]string{
785 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700786 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700787 },
788 })
789}
790
Colin Cross3f40fa42015-01-30 17:27:36 -0800791// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700792func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700793 flags builderFlags, outputFile android.WritablePath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800794
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700795 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800796
Colin Crossae887032017-10-23 17:16:14 -0700797 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700798 Rule: partialLd,
799 Description: "link " + outputFile.Base(),
800 Output: outputFile,
801 Inputs: objFiles,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700802 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800803 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700804 "ldCmd": ldCmd,
Colin Cross6d88dba2019-11-06 07:06:58 -0800805 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800806 },
807 })
808}
809
Colin Crossbfae8852015-03-26 14:44:11 -0700810// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700811func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
812 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700813
814 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
815
Colin Crossae887032017-10-23 17:16:14 -0700816 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700817 Rule: prefixSymbols,
818 Description: "prefix symbols " + outputFile.Base(),
819 Output: outputFile,
820 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700821 Args: map[string]string{
822 "objcopyCmd": objcopyCmd,
823 "prefix": prefix,
824 },
825 })
826}
827
Colin Cross635c3b02016-05-18 15:37:25 -0700828func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
829 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700830
831 crossCompile := gccCmd(flags.toolchain, "")
832 args := ""
833 if flags.stripAddGnuDebuglink {
834 args += " --add-gnu-debuglink"
835 }
836 if flags.stripKeepMiniDebugInfo {
837 args += " --keep-mini-debug-info"
838 }
839 if flags.stripKeepSymbols {
840 args += " --keep-symbols"
841 }
Yi Kongacee27c2019-03-29 20:05:14 -0700842 if flags.stripKeepSymbolsList != "" {
843 args += " -k" + flags.stripKeepSymbolsList
844 }
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700845 if flags.stripKeepSymbolsAndDebugFrame {
846 args += " --keep-symbols-and-debug-frame"
847 }
Yi Kongb5c34d72018-11-07 16:28:49 -0800848 if flags.stripUseGnuStrip {
849 args += " --use-gnu-strip"
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700850 }
Colin Cross665dce92016-04-28 14:50:03 -0700851
Colin Crossae887032017-10-23 17:16:14 -0700852 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700853 Rule: strip,
854 Description: "strip " + outputFile.Base(),
855 Output: outputFile,
856 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700857 Args: map[string]string{
858 "crossCompile": crossCompile,
859 "args": args,
860 },
861 })
862}
863
Colin Cross635c3b02016-05-18 15:37:25 -0700864func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
865 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700866
Colin Crossae887032017-10-23 17:16:14 -0700867 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700868 Rule: darwinStrip,
869 Description: "strip " + outputFile.Base(),
870 Output: outputFile,
871 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700872 })
873}
874
Oliver Nguyenc7434142019-04-24 14:22:25 -0700875func TransformCoverageFilesToZip(ctx android.ModuleContext,
876 inputs Objects, baseName string) android.OptionalPath {
Dan Willemsen581341d2017-02-09 16:16:31 -0800877
878 if len(inputs.coverageFiles) > 0 {
Oliver Nguyenc7434142019-04-24 14:22:25 -0700879 outputFile := android.PathForModuleOut(ctx, baseName+".zip")
Dan Willemsen581341d2017-02-09 16:16:31 -0800880
Oliver Nguyenc7434142019-04-24 14:22:25 -0700881 ctx.Build(pctx, android.BuildParams{
882 Rule: zip,
883 Description: "zip " + outputFile.Base(),
884 Inputs: inputs.coverageFiles,
885 Output: outputFile,
886 })
Dan Willemsen581341d2017-02-09 16:16:31 -0800887
888 return android.OptionalPathForPath(outputFile)
889 }
890
891 return android.OptionalPath{}
892}
893
Yi Kongc49c3932019-10-15 02:01:19 -0700894func TransformArchiveRepack(ctx android.ModuleContext, inputFile android.Path,
895 outputFile android.WritablePath, objects []string) {
896
897 ctx.Build(pctx, android.BuildParams{
898 Rule: archiveRepack,
899 Description: "Repack archive " + outputFile.Base(),
900 Output: outputFile,
901 Input: inputFile,
902 Args: map[string]string{
903 "objects": strings.Join(objects, " "),
904 },
905 })
906}
907
Colin Crossb98c8b02016-07-29 13:44:28 -0700908func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800909 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
910}
Colin Cross0af4b842015-04-30 16:36:18 -0700911
Colin Cross5b529592017-05-09 13:34:34 -0700912func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700913 var i int
914
915 start := 0
916 bytes := 0
917 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700918 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700919 if l > limit {
920 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
921 }
922 if bytes+l > limit {
923 lists = append(lists, list[start:i])
924 start = i
925 bytes = 0
926 }
927 bytes += l + 1 // count a space between each list element
928 }
929
930 lists = append(lists, list[start:])
931
932 totalLen := 0
933 for _, l := range lists {
934 totalLen += len(l)
935 }
936 if totalLen != len(list) {
937 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
938 }
939 return lists, nil
940}