blob: efdbbb2d23a55c642b0b70b04b31778dd99f26aa [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 (
Colin Cross635c3b02016-05-18 15:37:25 -070040 pctx = android.NewPackageContext("android/soong/cc")
Colin Cross3f40fa42015-01-30 17:27:36 -080041
Ramy Medhat8ea054a2020-01-27 14:19:44 -050042 cc = pctx.AndroidRemoteStaticRule("cc", android.RemoteRuleSupports{Goma: true, RBE: true},
Colin Cross3f40fa42015-01-30 17:27:36 -080043 blueprint.RuleParams{
44 Depfile: "${out}.d",
45 Deps: blueprint.DepsGCC,
Alistair Strachan777475c2016-08-26 12:55:49 -070046 Command: "$relPwd ${config.CcWrapper}$ccCmd -c $cFlags -MD -MF ${out}.d -o $out $in",
Dan Willemsenc94a7682015-11-17 15:27:28 -080047 CommandDeps: []string{"$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080048 },
Dan Willemsen322a0a62015-11-17 15:19:46 -080049 "ccCmd", "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080050
Kousik Kumar2976bfd2020-02-17 00:26:55 -080051 ccNoDeps = pctx.AndroidStaticRule("ccNoDeps",
Dan Willemsenfcabb1c2019-01-03 23:25:11 -080052 blueprint.RuleParams{
Kousik Kumar2976bfd2020-02-17 00:26:55 -080053 Command: "$relPwd $ccCmd -c $cFlags -o $out $in",
Dan Willemsenfcabb1c2019-01-03 23:25:11 -080054 CommandDeps: []string{"$ccCmd"},
55 },
56 "ccCmd", "cFlags")
57
Colin Cross9d45bb72016-08-29 16:14:13 -070058 ld = pctx.AndroidStaticRule("ld",
Colin Cross3f40fa42015-01-30 17:27:36 -080059 blueprint.RuleParams{
Dan Albertce2b8392016-07-21 13:16:49 -070060 Command: "$ldCmd ${crtBegin} @${out}.rsp " +
Pete Bentley99f2fc22019-08-02 14:02:20 +010061 "${libFlags} ${crtEnd} -o ${out} ${ldFlags} ${extraLibFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080062 CommandDeps: []string{"$ldCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070063 Rspfile: "${out}.rsp",
64 RspfileContent: "${in}",
Colin Cross36ae1352019-03-29 15:55:30 -070065 // clang -Wl,--out-implib doesn't update its output file if it hasn't changed.
66 Restat: true,
Colin Cross3f40fa42015-01-30 17:27:36 -080067 },
Pete Bentley99f2fc22019-08-02 14:02:20 +010068 "ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags", "extraLibFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080069
Colin Cross9d45bb72016-08-29 16:14:13 -070070 partialLd = pctx.AndroidStaticRule("partialLd",
Colin Cross3f40fa42015-01-30 17:27:36 -080071 blueprint.RuleParams{
Chih-Hung Hsieh3ede2942018-01-10 14:30:44 -080072 // Without -no-pie, clang 7.0 adds -pie to link Android files,
73 // but -r and -pie cannot be used together.
Peter Collingbourne84d83852019-07-16 14:08:45 -070074 Command: "$ldCmd -fuse-ld=lld -nostdlib -no-pie -Wl,-r ${in} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080075 CommandDeps: []string{"$ldCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080076 },
Colin Cross41280a42015-11-23 14:01:42 -080077 "ldCmd", "ldFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080078
Colin Cross9d45bb72016-08-29 16:14:13 -070079 ar = pctx.AndroidStaticRule("ar",
Colin Cross3f40fa42015-01-30 17:27:36 -080080 blueprint.RuleParams{
Colin Cross7d21c442015-03-30 17:47:53 -070081 Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
Dan Willemsenc94a7682015-11-17 15:27:28 -080082 CommandDeps: []string{"$arCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070083 Rspfile: "${out}.rsp",
84 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080085 },
86 "arCmd", "arFlags")
87
Colin Cross9d45bb72016-08-29 16:14:13 -070088 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -070089 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -070090 Command: "${config.MacStripPath} -u -r -o $out $in",
91 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -070092 })
Colin Cross0af4b842015-04-30 16:36:18 -070093
Colin Cross9d45bb72016-08-29 16:14:13 -070094 prefixSymbols = pctx.AndroidStaticRule("prefixSymbols",
Colin Crossbfae8852015-03-26 14:44:11 -070095 blueprint.RuleParams{
96 Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080097 CommandDeps: []string{"$objcopyCmd"},
Colin Crossbfae8852015-03-26 14:44:11 -070098 },
99 "objcopyCmd", "prefix")
100
Nan Zhang43a485c2017-03-27 14:27:58 -0700101 _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh")
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800102 _ = pctx.SourcePathVariable("xzCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/xz")
Colin Cross665dce92016-04-28 14:50:03 -0700103
Colin Crossee3ea312019-05-17 15:36:46 -0700104 // 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 -0700105 // file descriptors on darwin. Limit concurrent calls to 5 on darwin.
Colin Crossee3ea312019-05-17 15:36:46 -0700106 darwinStripPool = func() blueprint.Pool {
107 if runtime.GOOS == "darwin" {
108 return pctx.StaticPool("darwinStripPool", blueprint.PoolParams{
Colin Crossbadf8d62019-05-22 13:25:50 -0700109 Depth: 5,
Colin Crossee3ea312019-05-17 15:36:46 -0700110 })
111 } else {
112 return nil
113 }
114 }()
115
Colin Cross9d45bb72016-08-29 16:14:13 -0700116 strip = pctx.AndroidStaticRule("strip",
Colin Cross665dce92016-04-28 14:50:03 -0700117 blueprint.RuleParams{
118 Depfile: "${out}.d",
119 Deps: blueprint.DepsGCC,
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700120 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 -0800121 CommandDeps: []string{"$stripPath", "$xzCmd"},
Colin Crossee3ea312019-05-17 15:36:46 -0700122 Pool: darwinStripPool,
Colin Cross665dce92016-04-28 14:50:03 -0700123 },
124 "args", "crossCompile")
125
Yi Kongc49c3932019-10-15 02:01:19 -0700126 _ = pctx.SourcePathVariable("archiveRepackPath", "build/soong/scripts/archive_repack.sh")
127
128 archiveRepack = pctx.AndroidStaticRule("archiveRepack",
129 blueprint.RuleParams{
130 Depfile: "${out}.d",
131 Deps: blueprint.DepsGCC,
132 Command: "CLANG_BIN=${config.ClangBin} $archiveRepackPath -i ${in} -o ${out} -d ${out}.d ${objects}",
133 CommandDeps: []string{"$archiveRepackPath"},
134 },
135 "objects")
136
Colin Cross9d45bb72016-08-29 16:14:13 -0700137 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700138 blueprint.RuleParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700139 Command: "rm -f $out && touch $out",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700140 })
141
Nan Zhang43a485c2017-03-27 14:27:58 -0700142 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700143
144 toc = pctx.AndroidStaticRule("toc",
145 blueprint.RuleParams{
146 Depfile: "${out}.d",
147 Deps: blueprint.DepsGCC,
Colin Crossb496cfd2018-09-10 16:50:05 -0700148 Command: "CROSS_COMPILE=$crossCompile $tocPath $format -i ${in} -o ${out} -d ${out}.d",
Colin Cross26c34ed2016-09-30 17:10:16 -0700149 CommandDeps: []string{"$tocPath"},
150 Restat: true,
151 },
Colin Crossb496cfd2018-09-10 16:50:05 -0700152 "crossCompile", "format")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700153
154 clangTidy = pctx.AndroidStaticRule("clangTidy",
155 blueprint.RuleParams{
George Burgess IVc4624c02019-04-04 16:22:37 -0700156 Command: "rm -f $out && ${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out",
157 CommandDeps: []string{"${config.ClangBin}/clang-tidy"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700158 },
159 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800160
Nan Zhang43a485c2017-03-27 14:27:58 -0700161 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800162
163 yasm = pctx.AndroidStaticRule("yasm",
164 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700165 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800166 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700167 Depfile: "$out.d",
168 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800169 },
170 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800171
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700172 windres = pctx.AndroidStaticRule("windres",
173 blueprint.RuleParams{
Nick Desaulniers18eeffa2020-01-29 16:20:11 -0800174 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 -0700175 CommandDeps: []string{"$windresCmd"},
176 },
177 "windresCmd", "flags")
178
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800179 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800180
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700181 // -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 -0800182 sAbiDump = pctx.AndroidStaticRule("sAbiDump",
183 blueprint.RuleParams{
Logan Chien3ff624f2018-10-08 11:49:32 +0800184 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 -0800185 CommandDeps: []string{"$sAbiDumper"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800186 },
187 "cFlags", "exportDirs")
188
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800189 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800190
191 sAbiLink = pctx.AndroidStaticRule("sAbiLink",
192 blueprint.RuleParams{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800193 Command: "$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800194 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800195 Rspfile: "${out}.rsp",
196 RspfileContent: "${in}",
197 },
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800198 "symbolFilter", "arch", "exportedHeaderFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800199
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800200 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700201
Colin Cross2e2dbc22019-09-25 13:31:46 -0700202 sAbiDiff = pctx.RuleFunc("sAbiDiff",
Dan Willemsen54daaf02018-03-12 13:24:09 -0700203 func(ctx android.PackageRuleContext) blueprint.RuleParams {
Logan Chien2a65dda2019-10-01 15:58:07 -0700204 commandStr := "($sAbiDiffer ${extraFlags} -lib ${libName} -arch ${arch} -o ${out} -new ${in} -old ${referenceDump})"
Logan Chien6227fed2019-02-18 13:12:21 +0800205 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 +0800206 commandStr += " && (mkdir -p $$DIST_DIR/abidiffs && cp ${out} $$DIST_DIR/abidiffs/)"
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800207 commandStr += " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800208 return blueprint.RuleParams{
209 Command: commandStr,
210 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700211 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800212 },
Logan Chien2a65dda2019-10-01 15:58:07 -0700213 "extraFlags", "referenceDump", "libName", "arch", "createReferenceDumpFlags")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700214
215 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
216 blueprint.RuleParams{
217 Command: "gunzip -c $in > $out",
218 })
Oliver Nguyenc7434142019-04-24 14:22:25 -0700219
220 zip = pctx.AndroidStaticRule("zip",
221 blueprint.RuleParams{
222 Command: "cat $out.rsp | tr ' ' '\\n' | tr -d \\' | sort -u > ${out}.tmp && ${SoongZipCmd} -o ${out} -C $$OUT_DIR -l ${out}.tmp",
223 CommandDeps: []string{"${SoongZipCmd}"},
224 Rspfile: "$out.rsp",
225 RspfileContent: "$in",
226 })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800227
228 _ = pctx.SourcePathVariable("cxxExtractor",
229 "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/cxx_extractor")
Sasha Smundak65143642019-09-26 20:14:28 -0700230 _ = pctx.SourcePathVariable("kytheVnames", "build/soong/vnames.json")
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800231 _ = pctx.VariableFunc("kytheCorpus",
232 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCorpusName() })
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800233 _ = pctx.VariableFunc("kytheCuEncoding",
234 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCuEncoding() })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800235 kytheExtract = pctx.StaticRule("kythe",
236 blueprint.RuleParams{
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800237 Command: `rm -f $out && ` +
238 `KYTHE_CORPUS=${kytheCorpus} KYTHE_OUTPUT_FILE=$out KYTHE_VNAMES=$kytheVnames KYTHE_KZIP_ENCODING=${kytheCuEncoding} ` +
239 `$cxxExtractor $cFlags $in `,
Sasha Smundak65143642019-09-26 20:14:28 -0700240 CommandDeps: []string{"$cxxExtractor", "$kytheVnames"},
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800241 },
242 "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -0800243)
244
Dan Willemsen322a0a62015-11-17 15:19:46 -0800245func init() {
246 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
247 // debug output. That way two builds in two different directories will
248 // create the same output.
249 if runtime.GOOS != "darwin" {
250 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
251 } else {
252 // Darwin doesn't have /proc
253 pctx.StaticVariable("relPwd", "")
254 }
Oliver Nguyenc7434142019-04-24 14:22:25 -0700255
256 pctx.HostBinToolVariable("SoongZipCmd", "soong_zip")
Dan Willemsen322a0a62015-11-17 15:19:46 -0800257}
258
Colin Cross3f40fa42015-01-30 17:27:36 -0800259type builderFlags struct {
Colin Cross6d88dba2019-11-06 07:06:58 -0800260 globalCommonFlags string
261 globalAsFlags string
262 globalYasmFlags string
263 globalCFlags string
264 globalToolingCFlags string // A separate set of cFlags for clang LibTooling tools
265 globalToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
266 globalConlyFlags string
267 globalCppFlags string
268 globalLdFlags string
269
270 localCommonFlags string
271 localAsFlags string
272 localYasmFlags string
273 localCFlags string
274 localToolingCFlags string // A separate set of cFlags for clang LibTooling tools
275 localToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
276 localConlyFlags string
277 localCppFlags string
278 localLdFlags string
279
280 libFlags string
281 extraLibFlags string
282 tidyFlags string
283 sAbiFlags string
284 aidlFlags string
285 rsFlags string
286 toolchain config.Toolchain
287 tidy bool
288 coverage bool
289 sAbiDump bool
290 emitXrefs bool
Colin Cross665dce92016-04-28 14:50:03 -0700291
Dan Willemsen98ab3112019-08-27 21:20:40 -0700292 assemblerWithCpp bool
293
Colin Crossc3199482017-03-30 15:03:04 -0700294 systemIncludeFlags string
295
Colin Cross18c0c5a2016-12-01 14:45:23 -0800296 groupStaticLibs bool
297
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700298 stripKeepSymbols bool
299 stripKeepSymbolsList string
300 stripKeepSymbolsAndDebugFrame bool
301 stripKeepMiniDebugInfo bool
302 stripAddGnuDebuglink bool
303 stripUseGnuStrip bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800304
Colin Cross19878da2019-03-28 14:45:07 -0700305 proto android.ProtoFlags
Dan Willemsen60e62f02018-11-16 21:05:32 -0800306 protoC bool
307 protoOptionsFile bool
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700308
309 yacc *YaccProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800310}
311
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700312type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800313 objFiles android.Paths
314 tidyFiles android.Paths
315 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800316 sAbiDumpFiles android.Paths
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800317 kytheFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700318}
319
320func (a Objects) Copy() Objects {
321 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800322 objFiles: append(android.Paths{}, a.objFiles...),
323 tidyFiles: append(android.Paths{}, a.tidyFiles...),
324 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800325 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800326 kytheFiles: append(android.Paths{}, a.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700327 }
328}
329
330func (a Objects) Append(b Objects) Objects {
331 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800332 objFiles: append(a.objFiles, b.objFiles...),
333 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
334 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800335 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800336 kytheFiles: append(a.kytheFiles, b.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700337 }
338}
339
Colin Cross3f40fa42015-01-30 17:27:36 -0800340// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700341func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800342 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700343
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700344 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700345 var tidyFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700346 if flags.tidy {
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700347 tidyFiles = make(android.Paths, 0, len(srcFiles))
348 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800349 var coverageFiles android.Paths
350 if flags.coverage {
351 coverageFiles = make(android.Paths, 0, len(srcFiles))
352 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800353 var kytheFiles android.Paths
354 if flags.emitXrefs {
355 kytheFiles = make(android.Paths, 0, len(srcFiles))
356 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800357
Colin Cross6d88dba2019-11-06 07:06:58 -0800358 // Produce fully expanded flags for use by C tools, C compiles, C++ tools, C++ compiles, and asm compiles
359 // respectively.
360 toolingCflags := flags.globalCommonFlags + " " +
361 flags.globalToolingCFlags + " " +
362 flags.globalConlyFlags + " " +
363 flags.localCommonFlags + " " +
364 flags.localToolingCFlags + " " +
365 flags.localConlyFlags + " " +
366 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700367
Colin Cross6d88dba2019-11-06 07:06:58 -0800368 cflags := flags.globalCommonFlags + " " +
369 flags.globalCFlags + " " +
370 flags.globalConlyFlags + " " +
371 flags.localCommonFlags + " " +
372 flags.localCFlags + " " +
373 flags.localConlyFlags + " " +
374 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700375
Colin Cross6d88dba2019-11-06 07:06:58 -0800376 toolingCppflags := flags.globalCommonFlags + " " +
377 flags.globalToolingCFlags + " " +
378 flags.globalToolingCppFlags + " " +
379 flags.localCommonFlags + " " +
380 flags.localToolingCFlags + " " +
381 flags.localToolingCppFlags + " " +
382 flags.systemIncludeFlags
Colin Crossc3199482017-03-30 15:03:04 -0700383
Colin Cross6d88dba2019-11-06 07:06:58 -0800384 cppflags := flags.globalCommonFlags + " " +
385 flags.globalCFlags + " " +
386 flags.globalCppFlags + " " +
387 flags.localCommonFlags + " " +
388 flags.localCFlags + " " +
389 flags.localCppFlags + " " +
390 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700391
Colin Cross6d88dba2019-11-06 07:06:58 -0800392 asflags := flags.globalCommonFlags + " " +
393 flags.globalAsFlags + " " +
394 flags.localCommonFlags + " " +
395 flags.localAsFlags + " " +
396 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700397
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800398 var sAbiDumpFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700399 if flags.sAbiDump {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800400 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
401 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800402
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700403 cflags += " ${config.NoOverrideClangGlobalCflags}"
404 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
405 cppflags += " ${config.NoOverrideClangGlobalCflags}"
406 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800407
Colin Cross3f40fa42015-01-30 17:27:36 -0800408 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700409 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800410
411 objFiles[i] = objFile
412
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700413 switch srcFile.Ext() {
414 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700415 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700416 Rule: yasm,
417 Description: "yasm " + srcFile.Rel(),
418 Output: objFile,
419 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800420 Implicits: cFlagsDeps,
421 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800422 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800423 "asFlags": flags.globalYasmFlags + " " + flags.localYasmFlags,
Colin Cross91e90042016-12-02 17:13:24 -0800424 },
425 })
426 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700427 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700428 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700429 Rule: windres,
430 Description: "windres " + srcFile.Rel(),
431 Output: objFile,
432 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800433 Implicits: cFlagsDeps,
434 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700435 Args: map[string]string{
436 "windresCmd": gccCmd(flags.toolchain, "windres"),
437 "flags": flags.toolchain.WindresFlags(),
438 },
439 })
440 continue
Pete Bentleyfcf55bf2019-08-16 20:14:32 +0100441 case ".o":
442 objFiles[i] = srcFile
443 continue
Colin Cross91e90042016-12-02 17:13:24 -0800444 }
445
Colin Cross6d88dba2019-11-06 07:06:58 -0800446 var moduleFlags string
447 var moduleToolingFlags string
448
Colin Cross3f40fa42015-01-30 17:27:36 -0800449 var ccCmd string
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700450 tidy := flags.tidy
Dan Willemsen581341d2017-02-09 16:16:31 -0800451 coverage := flags.coverage
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700452 dump := flags.sAbiDump
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800453 rule := cc
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800454 emitXref := flags.emitXrefs
Colin Cross3f40fa42015-01-30 17:27:36 -0800455
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700456 switch srcFile.Ext() {
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800457 case ".s":
Dan Willemsen98ab3112019-08-27 21:20:40 -0700458 if !flags.assemblerWithCpp {
459 rule = ccNoDeps
460 }
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800461 fallthrough
462 case ".S":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700463 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800464 moduleFlags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700465 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800466 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800467 dump = false
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800468 emitXref = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800469 case ".c":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700470 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800471 moduleFlags = cflags
472 moduleToolingFlags = toolingCflags
Colin Crossd34ab7c2019-06-27 14:46:10 -0700473 case ".cpp", ".cc", ".cxx", ".mm":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700474 ccCmd = "clang++"
Colin Cross6d88dba2019-11-06 07:06:58 -0800475 moduleFlags = cppflags
476 moduleToolingFlags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800477 default:
478 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
479 continue
480 }
481
Colin Cross67a5c132017-05-09 13:45:28 -0700482 ccDesc := ccCmd
483
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700484 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800485
Dan Willemsen581341d2017-02-09 16:16:31 -0800486 var implicitOutputs android.WritablePaths
487 if coverage {
488 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
489 implicitOutputs = append(implicitOutputs, gcnoFile)
490 coverageFiles = append(coverageFiles, gcnoFile)
491 }
492
Colin Crossae887032017-10-23 17:16:14 -0700493 ctx.Build(pctx, android.BuildParams{
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800494 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700495 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800496 Output: objFile,
497 ImplicitOutputs: implicitOutputs,
498 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800499 Implicits: cFlagsDeps,
500 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800501 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800502 "cFlags": moduleFlags,
Colin Cross28344522015-04-22 13:07:53 -0700503 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800504 },
505 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700506
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800507 if emitXref {
508 kytheFile := android.ObjPathWithExt(ctx, subdir, srcFile, "kzip")
509 ctx.Build(pctx, android.BuildParams{
510 Rule: kytheExtract,
511 Description: "Xref C++ extractor " + srcFile.Rel(),
512 Output: kytheFile,
513 Input: srcFile,
514 Implicits: cFlagsDeps,
515 OrderOnly: pathDeps,
516 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800517 "cFlags": moduleFlags,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800518 },
519 })
520 kytheFiles = append(kytheFiles, kytheFile)
521 }
522
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700523 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700524 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700525 tidyFiles = append(tidyFiles, tidyFile)
526
Colin Crossae887032017-10-23 17:16:14 -0700527 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700528 Rule: clangTidy,
529 Description: "clang-tidy " + srcFile.Rel(),
530 Output: tidyFile,
531 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700532 // We must depend on objFile, since clang-tidy doesn't
533 // support exporting dependencies.
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700534 Implicit: objFile,
535 Implicits: cFlagsDeps,
536 OrderOnly: pathDeps,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700537 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800538 "cFlags": moduleToolingFlags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700539 "tidyFlags": flags.tidyFlags,
540 },
541 })
542 }
543
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800544 if dump {
545 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
546 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
547
Colin Crossae887032017-10-23 17:16:14 -0700548 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700549 Rule: sAbiDump,
550 Description: "header-abi-dumper " + srcFile.Rel(),
551 Output: sAbiDumpFile,
552 Input: srcFile,
553 Implicit: objFile,
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700554 Implicits: cFlagsDeps,
555 OrderOnly: pathDeps,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800556 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800557 "cFlags": moduleToolingFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800558 "exportDirs": flags.sAbiFlags,
559 },
560 })
561 }
562
Colin Cross3f40fa42015-01-30 17:27:36 -0800563 }
564
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700565 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800566 objFiles: objFiles,
567 tidyFiles: tidyFiles,
568 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800569 sAbiDumpFiles: sAbiDumpFiles,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800570 kytheFiles: kytheFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700571 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800572}
573
574// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700575func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700576 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800577
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800578 arCmd := "${config.ClangBin}/llvm-ar"
Yi Kongee96a792019-09-06 15:11:57 -0700579 arFlags := "crsPD"
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800580 if !ctx.Darwin() {
581 arFlags += " -format=gnu"
582 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800583
Colin Crossae887032017-10-23 17:16:14 -0700584 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700585 Rule: ar,
586 Description: "static link " + outputFile.Base(),
587 Output: outputFile,
588 Inputs: objFiles,
589 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800590 Args: map[string]string{
591 "arFlags": arFlags,
592 "arCmd": arCmd,
593 },
594 })
595}
596
597// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700598// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700599func TransformObjToDynamicBinary(ctx android.ModuleContext,
600 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
Josh Gao75a50a22019-06-07 17:58:59 -0700601 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath, implicitOutputs android.WritablePaths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800602
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700603 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800604
Colin Cross3f40fa42015-01-30 17:27:36 -0800605 var libFlagsList []string
606
Colin Cross16b23492016-01-06 14:41:07 -0800607 if len(flags.libFlags) > 0 {
608 libFlagsList = append(libFlagsList, flags.libFlags)
609 }
610
Colin Cross3f40fa42015-01-30 17:27:36 -0800611 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800612 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700613 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700614 } else {
615 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700616 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700617 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
618 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800619 }
620
Colin Cross7a7cf972016-12-05 18:47:39 -0800621 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800622 libFlagsList = append(libFlagsList, "-Wl,--start-group")
623 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700624 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
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,--end-group")
627 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800628
Stephen Hines10347862016-07-18 15:54:54 -0700629 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700630 libFlagsList = append(libFlagsList, "-Wl,--start-group")
631 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700632 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
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,--end-group")
635 }
636
Colin Cross3f40fa42015-01-30 17:27:36 -0800637 for _, lib := range sharedLibs {
Josh Gao75a50a22019-06-07 17:58:59 -0700638 libFile := lib.String()
639 if ctx.Windows() {
640 libFile = pathtools.ReplaceExtension(libFile, "lib")
641 }
642 libFlagsList = append(libFlagsList, libFile)
Colin Cross3f40fa42015-01-30 17:27:36 -0800643 }
644
Colin Cross3f40fa42015-01-30 17:27:36 -0800645 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700646 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800647 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700648 if crtBegin.Valid() {
649 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800650 }
651
Colin Crossae887032017-10-23 17:16:14 -0700652 ctx.Build(pctx, android.BuildParams{
Josh Gao75a50a22019-06-07 17:58:59 -0700653 Rule: ld,
654 Description: "link " + outputFile.Base(),
655 Output: outputFile,
656 ImplicitOutputs: implicitOutputs,
657 Inputs: objFiles,
658 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800659 Args: map[string]string{
Pete Bentley99f2fc22019-08-02 14:02:20 +0100660 "ldCmd": ldCmd,
661 "crtBegin": crtBegin.String(),
662 "libFlags": strings.Join(libFlagsList, " "),
663 "extraLibFlags": flags.extraLibFlags,
Colin Cross6d88dba2019-11-06 07:06:58 -0800664 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
Pete Bentley99f2fc22019-08-02 14:02:20 +0100665 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800666 },
667 })
668}
669
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800670// Generate a rule to combine .dump sAbi dump files from multiple source files
671// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700672func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800673 baseName, exportedHeaderFlags string, symbolFile android.OptionalPath,
674 excludedSymbolVersions, excludedSymbolTags []string) android.OptionalPath {
675
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800676 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800677
678 implicits := android.Paths{soFile}
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800679 symbolFilterStr := "-so " + soFile.String()
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800680
681 if symbolFile.Valid() {
682 implicits = append(implicits, symbolFile.Path())
683 symbolFilterStr += " -v " + symbolFile.String()
684 }
685 for _, ver := range excludedSymbolVersions {
686 symbolFilterStr += " --exclude-symbol-version " + ver
687 }
688 for _, tag := range excludedSymbolTags {
689 symbolFilterStr += " --exclude-symbol-tag " + tag
690 }
Colin Crossae887032017-10-23 17:16:14 -0700691 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700692 Rule: sAbiLink,
693 Description: "header-abi-linker " + outputFile.Base(),
694 Output: outputFile,
695 Inputs: sAbiDumps,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800696 Implicits: implicits,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800697 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800698 "symbolFilter": symbolFilterStr,
699 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800700 "exportedHeaderFlags": exportedHeaderFlags,
701 },
702 })
703 return android.OptionalPathForPath(outputFile)
704}
705
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700706func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
707 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700708 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700709 Rule: unzipRefSAbiDump,
710 Description: "gunzip" + outputFile.Base(),
711 Output: outputFile,
712 Input: zippedRefDump,
713 })
714 return outputFile
715}
716
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800717func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chien2a65dda2019-10-01 15:58:07 -0700718 baseName, exportedHeaderFlags string, checkAllApis, isLlndk, isNdk, isVndkExt bool) android.OptionalPath {
Logan Chienf3511742017-10-31 18:04:35 +0800719
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800720 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700721 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Logan Chien6227fed2019-02-18 13:12:21 +0800722 createReferenceDumpFlags := ""
723
Logan Chien2a65dda2019-10-01 15:58:07 -0700724 var extraFlags []string
725 if checkAllApis {
726 extraFlags = append(extraFlags, "-check-all-apis")
727 } else {
728 extraFlags = append(extraFlags,
729 "-allow-unreferenced-changes",
730 "-allow-unreferenced-elf-symbol-changes")
Jayant Chowdharye4499502018-01-17 13:13:33 -0800731 }
Logan Chien2a65dda2019-10-01 15:58:07 -0700732
733 if exportedHeaderFlags == "" {
734 extraFlags = append(extraFlags, "-advice-only")
735 }
736
Logan Chien62f1f942019-02-18 15:40:42 +0800737 if isLlndk || isNdk {
Logan Chien6227fed2019-02-18 13:12:21 +0800738 createReferenceDumpFlags = "--llndk"
Logan Chien62f1f942019-02-18 15:40:42 +0800739 if isLlndk {
740 // TODO(b/130324828): "-consider-opaque-types-different" should apply to
741 // both LLNDK and NDK shared libs. However, a known issue in header-abi-diff
742 // breaks libaaudio. Remove the if-guard after the issue is fixed.
Logan Chien2a65dda2019-10-01 15:58:07 -0700743 extraFlags = append(extraFlags, "-consider-opaque-types-different")
Logan Chien62f1f942019-02-18 15:40:42 +0800744 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700745 }
Logan Chienf3511742017-10-31 18:04:35 +0800746 if isVndkExt {
Logan Chien2a65dda2019-10-01 15:58:07 -0700747 extraFlags = append(extraFlags, "-allow-extensions")
Logan Chienf3511742017-10-31 18:04:35 +0800748 }
749
Colin Crossae887032017-10-23 17:16:14 -0700750 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700751 Rule: sAbiDiff,
752 Description: "header-abi-diff " + outputFile.Base(),
753 Output: outputFile,
754 Input: inputDump,
755 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800756 Args: map[string]string{
Logan Chien6227fed2019-02-18 13:12:21 +0800757 "referenceDump": referenceDump.String(),
758 "libName": libName,
759 "arch": ctx.Arch().ArchType.Name,
Logan Chien2a65dda2019-10-01 15:58:07 -0700760 "extraFlags": strings.Join(extraFlags, " "),
Logan Chien6227fed2019-02-18 13:12:21 +0800761 "createReferenceDumpFlags": createReferenceDumpFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800762 },
763 })
764 return android.OptionalPathForPath(outputFile)
765}
766
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700767// Generate a rule for extracting a table of contents from a shared library (.so)
768func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700769 outputFile android.WritablePath, flags builderFlags) {
770
Colin Crossb496cfd2018-09-10 16:50:05 -0700771 var format string
772 var crossCompile string
773 if ctx.Darwin() {
774 format = "--macho"
775 crossCompile = "${config.MacToolPath}"
776 } else if ctx.Windows() {
777 format = "--pe"
778 crossCompile = gccCmd(flags.toolchain, "")
779 } else {
780 format = "--elf"
781 crossCompile = gccCmd(flags.toolchain, "")
782 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700783
Colin Crossae887032017-10-23 17:16:14 -0700784 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700785 Rule: toc,
786 Description: "generate toc " + inputFile.Base(),
787 Output: outputFile,
788 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700789 Args: map[string]string{
790 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700791 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700792 },
793 })
794}
795
Colin Cross3f40fa42015-01-30 17:27:36 -0800796// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700797func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700798 flags builderFlags, outputFile android.WritablePath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800799
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700800 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800801
Colin Crossae887032017-10-23 17:16:14 -0700802 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700803 Rule: partialLd,
804 Description: "link " + outputFile.Base(),
805 Output: outputFile,
806 Inputs: objFiles,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700807 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800808 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700809 "ldCmd": ldCmd,
Colin Cross6d88dba2019-11-06 07:06:58 -0800810 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800811 },
812 })
813}
814
Colin Crossbfae8852015-03-26 14:44:11 -0700815// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700816func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
817 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700818
819 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
820
Colin Crossae887032017-10-23 17:16:14 -0700821 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700822 Rule: prefixSymbols,
823 Description: "prefix symbols " + outputFile.Base(),
824 Output: outputFile,
825 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700826 Args: map[string]string{
827 "objcopyCmd": objcopyCmd,
828 "prefix": prefix,
829 },
830 })
831}
832
Colin Cross635c3b02016-05-18 15:37:25 -0700833func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
834 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700835
836 crossCompile := gccCmd(flags.toolchain, "")
837 args := ""
838 if flags.stripAddGnuDebuglink {
839 args += " --add-gnu-debuglink"
840 }
841 if flags.stripKeepMiniDebugInfo {
842 args += " --keep-mini-debug-info"
843 }
844 if flags.stripKeepSymbols {
845 args += " --keep-symbols"
846 }
Yi Kongacee27c2019-03-29 20:05:14 -0700847 if flags.stripKeepSymbolsList != "" {
848 args += " -k" + flags.stripKeepSymbolsList
849 }
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700850 if flags.stripKeepSymbolsAndDebugFrame {
851 args += " --keep-symbols-and-debug-frame"
852 }
Yi Kongb5c34d72018-11-07 16:28:49 -0800853 if flags.stripUseGnuStrip {
854 args += " --use-gnu-strip"
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700855 }
Colin Cross665dce92016-04-28 14:50:03 -0700856
Colin Crossae887032017-10-23 17:16:14 -0700857 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700858 Rule: strip,
859 Description: "strip " + outputFile.Base(),
860 Output: outputFile,
861 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700862 Args: map[string]string{
863 "crossCompile": crossCompile,
864 "args": args,
865 },
866 })
867}
868
Colin Cross635c3b02016-05-18 15:37:25 -0700869func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
870 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700871
Colin Crossae887032017-10-23 17:16:14 -0700872 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700873 Rule: darwinStrip,
874 Description: "strip " + outputFile.Base(),
875 Output: outputFile,
876 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700877 })
878}
879
Oliver Nguyenc7434142019-04-24 14:22:25 -0700880func TransformCoverageFilesToZip(ctx android.ModuleContext,
881 inputs Objects, baseName string) android.OptionalPath {
Dan Willemsen581341d2017-02-09 16:16:31 -0800882
883 if len(inputs.coverageFiles) > 0 {
Oliver Nguyenc7434142019-04-24 14:22:25 -0700884 outputFile := android.PathForModuleOut(ctx, baseName+".zip")
Dan Willemsen581341d2017-02-09 16:16:31 -0800885
Oliver Nguyenc7434142019-04-24 14:22:25 -0700886 ctx.Build(pctx, android.BuildParams{
887 Rule: zip,
888 Description: "zip " + outputFile.Base(),
889 Inputs: inputs.coverageFiles,
890 Output: outputFile,
891 })
Dan Willemsen581341d2017-02-09 16:16:31 -0800892
893 return android.OptionalPathForPath(outputFile)
894 }
895
896 return android.OptionalPath{}
897}
898
Yi Kongc49c3932019-10-15 02:01:19 -0700899func TransformArchiveRepack(ctx android.ModuleContext, inputFile android.Path,
900 outputFile android.WritablePath, objects []string) {
901
902 ctx.Build(pctx, android.BuildParams{
903 Rule: archiveRepack,
904 Description: "Repack archive " + outputFile.Base(),
905 Output: outputFile,
906 Input: inputFile,
907 Args: map[string]string{
908 "objects": strings.Join(objects, " "),
909 },
910 })
911}
912
Colin Crossb98c8b02016-07-29 13:44:28 -0700913func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800914 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
915}
Colin Cross0af4b842015-04-30 16:36:18 -0700916
Colin Cross5b529592017-05-09 13:34:34 -0700917func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700918 var i int
919
920 start := 0
921 bytes := 0
922 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700923 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700924 if l > limit {
925 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
926 }
927 if bytes+l > limit {
928 lists = append(lists, list[start:i])
929 start = i
930 bytes = 0
931 }
932 bytes += l + 1 // count a space between each list element
933 }
934
935 lists = append(lists, list[start:])
936
937 totalLen := 0
938 for _, l := range lists {
939 totalLen += len(l)
940 }
941 if totalLen != len(list) {
942 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
943 }
944 return lists, nil
945}