blob: 990069d8ae1a77549985a4be38f56948c8d35fdd [file] [log] [blame]
Colin Cross3f40fa42015-01-30 17:27:36 -08001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package cc
16
17// This file generates the final rules for compiling all C/C++. All properties related to
18// compiling should have been translated into builderFlags or another argument to the Transform*
19// functions.
20
21import (
Colin Cross0af4b842015-04-30 16:36:18 -070022 "fmt"
Colin Crossb98c8b02016-07-29 13:44:28 -070023 "path/filepath"
Colin Cross0af4b842015-04-30 16:36:18 -070024 "runtime"
Colin Cross3f40fa42015-01-30 17:27:36 -080025 "strings"
Colin Crossed4cf0b2015-03-26 14:43:45 -070026
27 "github.com/google/blueprint"
Josh Gao75a50a22019-06-07 17:58:59 -070028 "github.com/google/blueprint/pathtools"
Colin Crossb98c8b02016-07-29 13:44:28 -070029
30 "android/soong/android"
31 "android/soong/cc/config"
Ramy Medhat9a90fe52020-04-13 13:21:23 -040032 "android/soong/remoteexec"
Colin Cross3f40fa42015-01-30 17:27:36 -080033)
34
35const (
Dan Albertc3144b12015-04-28 18:17:56 -070036 objectExtension = ".o"
Colin Cross3f40fa42015-01-30 17:27:36 -080037 staticLibraryExtension = ".a"
38)
39
40var (
Colin Cross635c3b02016-05-18 15:37:25 -070041 pctx = android.NewPackageContext("android/soong/cc")
Colin Cross3f40fa42015-01-30 17:27:36 -080042
Ramy Medhat8ea054a2020-01-27 14:19:44 -050043 cc = pctx.AndroidRemoteStaticRule("cc", android.RemoteRuleSupports{Goma: true, RBE: true},
Colin Cross3f40fa42015-01-30 17:27:36 -080044 blueprint.RuleParams{
45 Depfile: "${out}.d",
46 Deps: blueprint.DepsGCC,
Alistair Strachan777475c2016-08-26 12:55:49 -070047 Command: "$relPwd ${config.CcWrapper}$ccCmd -c $cFlags -MD -MF ${out}.d -o $out $in",
Dan Willemsenc94a7682015-11-17 15:27:28 -080048 CommandDeps: []string{"$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080049 },
Dan Willemsen322a0a62015-11-17 15:19:46 -080050 "ccCmd", "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080051
Kousik Kumar2976bfd2020-02-17 00:26:55 -080052 ccNoDeps = pctx.AndroidStaticRule("ccNoDeps",
Dan Willemsenfcabb1c2019-01-03 23:25:11 -080053 blueprint.RuleParams{
Kousik Kumar2976bfd2020-02-17 00:26:55 -080054 Command: "$relPwd $ccCmd -c $cFlags -o $out $in",
Dan Willemsenfcabb1c2019-01-03 23:25:11 -080055 CommandDeps: []string{"$ccCmd"},
56 },
57 "ccCmd", "cFlags")
58
Ramy Medhat9a90fe52020-04-13 13:21:23 -040059 ld, ldRE = remoteexec.StaticRules(pctx, "ld",
Colin Cross3f40fa42015-01-30 17:27:36 -080060 blueprint.RuleParams{
Dan Albertce2b8392016-07-21 13:16:49 -070061 Command: "$ldCmd ${crtBegin} @${out}.rsp " +
Pete Bentley99f2fc22019-08-02 14:02:20 +010062 "${libFlags} ${crtEnd} -o ${out} ${ldFlags} ${extraLibFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080063 CommandDeps: []string{"$ldCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070064 Rspfile: "${out}.rsp",
65 RspfileContent: "${in}",
Colin Cross36ae1352019-03-29 15:55:30 -070066 // clang -Wl,--out-implib doesn't update its output file if it hasn't changed.
67 Restat: true,
Colin Cross3f40fa42015-01-30 17:27:36 -080068 },
Ramy Medhat9a90fe52020-04-13 13:21:23 -040069 &remoteexec.REParams{Labels: map[string]string{"type": "link", "tool": "clang"},
70 ExecStrategy: "${config.RECXXLinksExecStrategy}",
71 Inputs: []string{"${out}.rsp"},
72 RSPFile: "${out}.rsp",
73 OutputFiles: []string{"${out}"},
74 ToolchainInputs: []string{"$ldCmd"},
75 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXLinksPool}"},
76 }, []string{"ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags", "extraLibFlags"}, nil)
Colin Cross3f40fa42015-01-30 17:27:36 -080077
Ramy Medhat9a90fe52020-04-13 13:21:23 -040078 partialLd, partialLdRE = remoteexec.StaticRules(pctx, "partialLd",
Colin Cross3f40fa42015-01-30 17:27:36 -080079 blueprint.RuleParams{
Chih-Hung Hsieh3ede2942018-01-10 14:30:44 -080080 // Without -no-pie, clang 7.0 adds -pie to link Android files,
81 // but -r and -pie cannot be used together.
Peter Collingbourne84d83852019-07-16 14:08:45 -070082 Command: "$ldCmd -fuse-ld=lld -nostdlib -no-pie -Wl,-r ${in} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080083 CommandDeps: []string{"$ldCmd"},
Ramy Medhat9a90fe52020-04-13 13:21:23 -040084 }, &remoteexec.REParams{
85 Labels: map[string]string{"type": "link", "tool": "clang"},
86 ExecStrategy: "${config.RECXXLinksExecStrategy}", Inputs: []string{"$inCommaList"},
87 OutputFiles: []string{"${out}"},
88 ToolchainInputs: []string{"$ldCmd"},
89 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXLinksPool}"},
90 }, []string{"ldCmd", "ldFlags"}, []string{"inCommaList"})
Colin Cross3f40fa42015-01-30 17:27:36 -080091
Colin Cross9d45bb72016-08-29 16:14:13 -070092 ar = pctx.AndroidStaticRule("ar",
Colin Cross3f40fa42015-01-30 17:27:36 -080093 blueprint.RuleParams{
Colin Cross7d21c442015-03-30 17:47:53 -070094 Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
Dan Willemsenc94a7682015-11-17 15:27:28 -080095 CommandDeps: []string{"$arCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070096 Rspfile: "${out}.rsp",
97 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080098 },
99 "arCmd", "arFlags")
100
Colin Cross9d45bb72016-08-29 16:14:13 -0700101 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700102 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -0700103 Command: "${config.MacStripPath} -u -r -o $out $in",
104 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700105 })
Colin Cross0af4b842015-04-30 16:36:18 -0700106
Colin Cross9d45bb72016-08-29 16:14:13 -0700107 prefixSymbols = pctx.AndroidStaticRule("prefixSymbols",
Colin Crossbfae8852015-03-26 14:44:11 -0700108 blueprint.RuleParams{
109 Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800110 CommandDeps: []string{"$objcopyCmd"},
Colin Crossbfae8852015-03-26 14:44:11 -0700111 },
112 "objcopyCmd", "prefix")
113
Nan Zhang43a485c2017-03-27 14:27:58 -0700114 _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh")
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800115 _ = pctx.SourcePathVariable("xzCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/xz")
Colin Cross665dce92016-04-28 14:50:03 -0700116
Colin Crossee3ea312019-05-17 15:36:46 -0700117 // 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 -0700118 // file descriptors on darwin. Limit concurrent calls to 5 on darwin.
Colin Crossee3ea312019-05-17 15:36:46 -0700119 darwinStripPool = func() blueprint.Pool {
120 if runtime.GOOS == "darwin" {
121 return pctx.StaticPool("darwinStripPool", blueprint.PoolParams{
Colin Crossbadf8d62019-05-22 13:25:50 -0700122 Depth: 5,
Colin Crossee3ea312019-05-17 15:36:46 -0700123 })
124 } else {
125 return nil
126 }
127 }()
128
Colin Cross9d45bb72016-08-29 16:14:13 -0700129 strip = pctx.AndroidStaticRule("strip",
Colin Cross665dce92016-04-28 14:50:03 -0700130 blueprint.RuleParams{
131 Depfile: "${out}.d",
132 Deps: blueprint.DepsGCC,
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700133 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 -0800134 CommandDeps: []string{"$stripPath", "$xzCmd"},
Colin Crossee3ea312019-05-17 15:36:46 -0700135 Pool: darwinStripPool,
Colin Cross665dce92016-04-28 14:50:03 -0700136 },
137 "args", "crossCompile")
138
Yi Kongc49c3932019-10-15 02:01:19 -0700139 _ = pctx.SourcePathVariable("archiveRepackPath", "build/soong/scripts/archive_repack.sh")
140
141 archiveRepack = pctx.AndroidStaticRule("archiveRepack",
142 blueprint.RuleParams{
143 Depfile: "${out}.d",
144 Deps: blueprint.DepsGCC,
145 Command: "CLANG_BIN=${config.ClangBin} $archiveRepackPath -i ${in} -o ${out} -d ${out}.d ${objects}",
146 CommandDeps: []string{"$archiveRepackPath"},
147 },
148 "objects")
149
Colin Cross9d45bb72016-08-29 16:14:13 -0700150 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700151 blueprint.RuleParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700152 Command: "rm -f $out && touch $out",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700153 })
154
Nan Zhang43a485c2017-03-27 14:27:58 -0700155 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700156
157 toc = pctx.AndroidStaticRule("toc",
158 blueprint.RuleParams{
159 Depfile: "${out}.d",
160 Deps: blueprint.DepsGCC,
Colin Crossb496cfd2018-09-10 16:50:05 -0700161 Command: "CROSS_COMPILE=$crossCompile $tocPath $format -i ${in} -o ${out} -d ${out}.d",
Colin Cross26c34ed2016-09-30 17:10:16 -0700162 CommandDeps: []string{"$tocPath"},
163 Restat: true,
164 },
Colin Crossb496cfd2018-09-10 16:50:05 -0700165 "crossCompile", "format")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700166
167 clangTidy = pctx.AndroidStaticRule("clangTidy",
168 blueprint.RuleParams{
George Burgess IVc4624c02019-04-04 16:22:37 -0700169 Command: "rm -f $out && ${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out",
170 CommandDeps: []string{"${config.ClangBin}/clang-tidy"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700171 },
172 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800173
Nan Zhang43a485c2017-03-27 14:27:58 -0700174 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800175
176 yasm = pctx.AndroidStaticRule("yasm",
177 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700178 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800179 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700180 Depfile: "$out.d",
181 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800182 },
183 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800184
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700185 windres = pctx.AndroidStaticRule("windres",
186 blueprint.RuleParams{
Nick Desaulniers18eeffa2020-01-29 16:20:11 -0800187 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 -0700188 CommandDeps: []string{"$windresCmd"},
189 },
190 "windresCmd", "flags")
191
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800192 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800193
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700194 // -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 -0800195 sAbiDump = pctx.AndroidStaticRule("sAbiDump",
196 blueprint.RuleParams{
Logan Chien3ff624f2018-10-08 11:49:32 +0800197 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 -0800198 CommandDeps: []string{"$sAbiDumper"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800199 },
200 "cFlags", "exportDirs")
201
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800202 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800203
204 sAbiLink = pctx.AndroidStaticRule("sAbiLink",
205 blueprint.RuleParams{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800206 Command: "$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800207 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800208 Rspfile: "${out}.rsp",
209 RspfileContent: "${in}",
210 },
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800211 "symbolFilter", "arch", "exportedHeaderFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800212
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800213 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700214
Colin Cross2e2dbc22019-09-25 13:31:46 -0700215 sAbiDiff = pctx.RuleFunc("sAbiDiff",
Dan Willemsen54daaf02018-03-12 13:24:09 -0700216 func(ctx android.PackageRuleContext) blueprint.RuleParams {
Logan Chien2a65dda2019-10-01 15:58:07 -0700217 commandStr := "($sAbiDiffer ${extraFlags} -lib ${libName} -arch ${arch} -o ${out} -new ${in} -old ${referenceDump})"
Logan Chien6227fed2019-02-18 13:12:21 +0800218 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 +0800219 commandStr += " && (mkdir -p $$DIST_DIR/abidiffs && cp ${out} $$DIST_DIR/abidiffs/)"
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800220 commandStr += " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800221 return blueprint.RuleParams{
222 Command: commandStr,
223 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700224 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800225 },
Logan Chien2a65dda2019-10-01 15:58:07 -0700226 "extraFlags", "referenceDump", "libName", "arch", "createReferenceDumpFlags")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700227
228 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
229 blueprint.RuleParams{
230 Command: "gunzip -c $in > $out",
231 })
Oliver Nguyenc7434142019-04-24 14:22:25 -0700232
233 zip = pctx.AndroidStaticRule("zip",
234 blueprint.RuleParams{
235 Command: "cat $out.rsp | tr ' ' '\\n' | tr -d \\' | sort -u > ${out}.tmp && ${SoongZipCmd} -o ${out} -C $$OUT_DIR -l ${out}.tmp",
236 CommandDeps: []string{"${SoongZipCmd}"},
237 Rspfile: "$out.rsp",
238 RspfileContent: "$in",
239 })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800240
241 _ = pctx.SourcePathVariable("cxxExtractor",
242 "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/cxx_extractor")
Sasha Smundak65143642019-09-26 20:14:28 -0700243 _ = pctx.SourcePathVariable("kytheVnames", "build/soong/vnames.json")
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800244 _ = pctx.VariableFunc("kytheCorpus",
245 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCorpusName() })
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800246 _ = pctx.VariableFunc("kytheCuEncoding",
247 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCuEncoding() })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800248 kytheExtract = pctx.StaticRule("kythe",
249 blueprint.RuleParams{
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800250 Command: `rm -f $out && ` +
251 `KYTHE_CORPUS=${kytheCorpus} KYTHE_OUTPUT_FILE=$out KYTHE_VNAMES=$kytheVnames KYTHE_KZIP_ENCODING=${kytheCuEncoding} ` +
252 `$cxxExtractor $cFlags $in `,
Sasha Smundak65143642019-09-26 20:14:28 -0700253 CommandDeps: []string{"$cxxExtractor", "$kytheVnames"},
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800254 },
255 "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -0800256)
257
Dan Willemsen322a0a62015-11-17 15:19:46 -0800258func init() {
259 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
260 // debug output. That way two builds in two different directories will
261 // create the same output.
262 if runtime.GOOS != "darwin" {
263 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
264 } else {
265 // Darwin doesn't have /proc
266 pctx.StaticVariable("relPwd", "")
267 }
Oliver Nguyenc7434142019-04-24 14:22:25 -0700268
269 pctx.HostBinToolVariable("SoongZipCmd", "soong_zip")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400270 pctx.Import("android/soong/remoteexec")
Dan Willemsen322a0a62015-11-17 15:19:46 -0800271}
272
Colin Cross3f40fa42015-01-30 17:27:36 -0800273type builderFlags struct {
Colin Cross6d88dba2019-11-06 07:06:58 -0800274 globalCommonFlags string
275 globalAsFlags string
276 globalYasmFlags string
277 globalCFlags string
278 globalToolingCFlags string // A separate set of cFlags for clang LibTooling tools
279 globalToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
280 globalConlyFlags string
281 globalCppFlags string
282 globalLdFlags string
283
284 localCommonFlags string
285 localAsFlags string
286 localYasmFlags string
287 localCFlags string
288 localToolingCFlags string // A separate set of cFlags for clang LibTooling tools
289 localToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
290 localConlyFlags string
291 localCppFlags string
292 localLdFlags string
293
294 libFlags string
295 extraLibFlags string
296 tidyFlags string
297 sAbiFlags string
298 aidlFlags string
299 rsFlags string
300 toolchain config.Toolchain
301 tidy bool
Oliver Nguyen04526782020-04-21 12:40:27 -0700302 gcovCoverage bool
Colin Cross6d88dba2019-11-06 07:06:58 -0800303 sAbiDump bool
304 emitXrefs bool
Colin Cross665dce92016-04-28 14:50:03 -0700305
Dan Willemsen98ab3112019-08-27 21:20:40 -0700306 assemblerWithCpp bool
307
Colin Crossc3199482017-03-30 15:03:04 -0700308 systemIncludeFlags string
309
Colin Cross18c0c5a2016-12-01 14:45:23 -0800310 groupStaticLibs bool
311
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700312 stripKeepSymbols bool
313 stripKeepSymbolsList string
314 stripKeepSymbolsAndDebugFrame bool
315 stripKeepMiniDebugInfo bool
316 stripAddGnuDebuglink bool
317 stripUseGnuStrip bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800318
Colin Cross19878da2019-03-28 14:45:07 -0700319 proto android.ProtoFlags
Dan Willemsen60e62f02018-11-16 21:05:32 -0800320 protoC bool
321 protoOptionsFile bool
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700322
323 yacc *YaccProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800324}
325
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700326type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800327 objFiles android.Paths
328 tidyFiles android.Paths
329 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800330 sAbiDumpFiles android.Paths
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800331 kytheFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700332}
333
334func (a Objects) Copy() Objects {
335 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800336 objFiles: append(android.Paths{}, a.objFiles...),
337 tidyFiles: append(android.Paths{}, a.tidyFiles...),
338 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800339 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800340 kytheFiles: append(android.Paths{}, a.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700341 }
342}
343
344func (a Objects) Append(b Objects) Objects {
345 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800346 objFiles: append(a.objFiles, b.objFiles...),
347 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
348 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800349 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800350 kytheFiles: append(a.kytheFiles, b.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700351 }
352}
353
Colin Cross3f40fa42015-01-30 17:27:36 -0800354// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700355func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800356 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700357
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700358 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700359 var tidyFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700360 if flags.tidy {
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700361 tidyFiles = make(android.Paths, 0, len(srcFiles))
362 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800363 var coverageFiles android.Paths
Oliver Nguyen04526782020-04-21 12:40:27 -0700364 if flags.gcovCoverage {
Dan Willemsen581341d2017-02-09 16:16:31 -0800365 coverageFiles = make(android.Paths, 0, len(srcFiles))
366 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800367 var kytheFiles android.Paths
368 if flags.emitXrefs {
369 kytheFiles = make(android.Paths, 0, len(srcFiles))
370 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800371
Colin Cross6d88dba2019-11-06 07:06:58 -0800372 // Produce fully expanded flags for use by C tools, C compiles, C++ tools, C++ compiles, and asm compiles
373 // respectively.
374 toolingCflags := flags.globalCommonFlags + " " +
375 flags.globalToolingCFlags + " " +
376 flags.globalConlyFlags + " " +
377 flags.localCommonFlags + " " +
378 flags.localToolingCFlags + " " +
379 flags.localConlyFlags + " " +
380 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700381
Colin Cross6d88dba2019-11-06 07:06:58 -0800382 cflags := flags.globalCommonFlags + " " +
383 flags.globalCFlags + " " +
384 flags.globalConlyFlags + " " +
385 flags.localCommonFlags + " " +
386 flags.localCFlags + " " +
387 flags.localConlyFlags + " " +
388 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700389
Colin Cross6d88dba2019-11-06 07:06:58 -0800390 toolingCppflags := flags.globalCommonFlags + " " +
391 flags.globalToolingCFlags + " " +
392 flags.globalToolingCppFlags + " " +
393 flags.localCommonFlags + " " +
394 flags.localToolingCFlags + " " +
395 flags.localToolingCppFlags + " " +
396 flags.systemIncludeFlags
Colin Crossc3199482017-03-30 15:03:04 -0700397
Colin Cross6d88dba2019-11-06 07:06:58 -0800398 cppflags := flags.globalCommonFlags + " " +
399 flags.globalCFlags + " " +
400 flags.globalCppFlags + " " +
401 flags.localCommonFlags + " " +
402 flags.localCFlags + " " +
403 flags.localCppFlags + " " +
404 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700405
Colin Cross6d88dba2019-11-06 07:06:58 -0800406 asflags := flags.globalCommonFlags + " " +
407 flags.globalAsFlags + " " +
408 flags.localCommonFlags + " " +
409 flags.localAsFlags + " " +
410 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700411
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800412 var sAbiDumpFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700413 if flags.sAbiDump {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800414 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
415 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800416
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700417 cflags += " ${config.NoOverrideClangGlobalCflags}"
418 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
419 cppflags += " ${config.NoOverrideClangGlobalCflags}"
420 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800421
Colin Cross3f40fa42015-01-30 17:27:36 -0800422 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700423 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800424
425 objFiles[i] = objFile
426
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700427 switch srcFile.Ext() {
428 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700429 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700430 Rule: yasm,
431 Description: "yasm " + srcFile.Rel(),
432 Output: objFile,
433 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800434 Implicits: cFlagsDeps,
435 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800436 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800437 "asFlags": flags.globalYasmFlags + " " + flags.localYasmFlags,
Colin Cross91e90042016-12-02 17:13:24 -0800438 },
439 })
440 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700441 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700442 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700443 Rule: windres,
444 Description: "windres " + srcFile.Rel(),
445 Output: objFile,
446 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800447 Implicits: cFlagsDeps,
448 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700449 Args: map[string]string{
450 "windresCmd": gccCmd(flags.toolchain, "windres"),
451 "flags": flags.toolchain.WindresFlags(),
452 },
453 })
454 continue
Pete Bentleyfcf55bf2019-08-16 20:14:32 +0100455 case ".o":
456 objFiles[i] = srcFile
457 continue
Colin Cross91e90042016-12-02 17:13:24 -0800458 }
459
Colin Cross6d88dba2019-11-06 07:06:58 -0800460 var moduleFlags string
461 var moduleToolingFlags string
462
Colin Cross3f40fa42015-01-30 17:27:36 -0800463 var ccCmd string
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700464 tidy := flags.tidy
Oliver Nguyen04526782020-04-21 12:40:27 -0700465 coverage := flags.gcovCoverage
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700466 dump := flags.sAbiDump
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800467 rule := cc
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800468 emitXref := flags.emitXrefs
Colin Cross3f40fa42015-01-30 17:27:36 -0800469
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700470 switch srcFile.Ext() {
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800471 case ".s":
Dan Willemsen98ab3112019-08-27 21:20:40 -0700472 if !flags.assemblerWithCpp {
473 rule = ccNoDeps
474 }
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800475 fallthrough
476 case ".S":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700477 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800478 moduleFlags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700479 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800480 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800481 dump = false
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800482 emitXref = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800483 case ".c":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700484 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800485 moduleFlags = cflags
486 moduleToolingFlags = toolingCflags
Colin Crossd34ab7c2019-06-27 14:46:10 -0700487 case ".cpp", ".cc", ".cxx", ".mm":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700488 ccCmd = "clang++"
Colin Cross6d88dba2019-11-06 07:06:58 -0800489 moduleFlags = cppflags
490 moduleToolingFlags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800491 default:
492 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
493 continue
494 }
495
Colin Cross67a5c132017-05-09 13:45:28 -0700496 ccDesc := ccCmd
497
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700498 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800499
Dan Willemsen581341d2017-02-09 16:16:31 -0800500 var implicitOutputs android.WritablePaths
501 if coverage {
502 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
503 implicitOutputs = append(implicitOutputs, gcnoFile)
504 coverageFiles = append(coverageFiles, gcnoFile)
505 }
506
Colin Crossae887032017-10-23 17:16:14 -0700507 ctx.Build(pctx, android.BuildParams{
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800508 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700509 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800510 Output: objFile,
511 ImplicitOutputs: implicitOutputs,
512 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800513 Implicits: cFlagsDeps,
514 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800515 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800516 "cFlags": moduleFlags,
Colin Cross28344522015-04-22 13:07:53 -0700517 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800518 },
519 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700520
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800521 if emitXref {
522 kytheFile := android.ObjPathWithExt(ctx, subdir, srcFile, "kzip")
523 ctx.Build(pctx, android.BuildParams{
524 Rule: kytheExtract,
525 Description: "Xref C++ extractor " + srcFile.Rel(),
526 Output: kytheFile,
527 Input: srcFile,
528 Implicits: cFlagsDeps,
529 OrderOnly: pathDeps,
530 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800531 "cFlags": moduleFlags,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800532 },
533 })
534 kytheFiles = append(kytheFiles, kytheFile)
535 }
536
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700537 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700538 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700539 tidyFiles = append(tidyFiles, tidyFile)
540
Colin Crossae887032017-10-23 17:16:14 -0700541 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700542 Rule: clangTidy,
543 Description: "clang-tidy " + srcFile.Rel(),
544 Output: tidyFile,
545 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700546 // We must depend on objFile, since clang-tidy doesn't
547 // support exporting dependencies.
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700548 Implicit: objFile,
549 Implicits: cFlagsDeps,
550 OrderOnly: pathDeps,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700551 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800552 "cFlags": moduleToolingFlags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700553 "tidyFlags": flags.tidyFlags,
554 },
555 })
556 }
557
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800558 if dump {
559 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
560 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
561
Colin Crossae887032017-10-23 17:16:14 -0700562 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700563 Rule: sAbiDump,
564 Description: "header-abi-dumper " + srcFile.Rel(),
565 Output: sAbiDumpFile,
566 Input: srcFile,
567 Implicit: objFile,
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700568 Implicits: cFlagsDeps,
569 OrderOnly: pathDeps,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800570 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800571 "cFlags": moduleToolingFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800572 "exportDirs": flags.sAbiFlags,
573 },
574 })
575 }
576
Colin Cross3f40fa42015-01-30 17:27:36 -0800577 }
578
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700579 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800580 objFiles: objFiles,
581 tidyFiles: tidyFiles,
582 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800583 sAbiDumpFiles: sAbiDumpFiles,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800584 kytheFiles: kytheFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700585 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800586}
587
588// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700589func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700590 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800591
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800592 arCmd := "${config.ClangBin}/llvm-ar"
Yi Kongee96a792019-09-06 15:11:57 -0700593 arFlags := "crsPD"
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800594 if !ctx.Darwin() {
595 arFlags += " -format=gnu"
596 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800597
Colin Crossae887032017-10-23 17:16:14 -0700598 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700599 Rule: ar,
600 Description: "static link " + outputFile.Base(),
601 Output: outputFile,
602 Inputs: objFiles,
603 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800604 Args: map[string]string{
605 "arFlags": arFlags,
606 "arCmd": arCmd,
607 },
608 })
609}
610
611// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700612// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700613func TransformObjToDynamicBinary(ctx android.ModuleContext,
614 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
Josh Gao75a50a22019-06-07 17:58:59 -0700615 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath, implicitOutputs android.WritablePaths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800616
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700617 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800618
Colin Cross3f40fa42015-01-30 17:27:36 -0800619 var libFlagsList []string
620
Colin Cross16b23492016-01-06 14:41:07 -0800621 if len(flags.libFlags) > 0 {
622 libFlagsList = append(libFlagsList, flags.libFlags)
623 }
624
Colin Cross3f40fa42015-01-30 17:27:36 -0800625 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800626 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700627 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700628 } else {
629 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700630 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700631 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
632 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800633 }
634
Colin Cross7a7cf972016-12-05 18:47:39 -0800635 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800636 libFlagsList = append(libFlagsList, "-Wl,--start-group")
637 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700638 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800639 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800640 libFlagsList = append(libFlagsList, "-Wl,--end-group")
641 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800642
Stephen Hines10347862016-07-18 15:54:54 -0700643 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700644 libFlagsList = append(libFlagsList, "-Wl,--start-group")
645 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700646 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700647 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700648 libFlagsList = append(libFlagsList, "-Wl,--end-group")
649 }
650
Colin Cross3f40fa42015-01-30 17:27:36 -0800651 for _, lib := range sharedLibs {
Josh Gao75a50a22019-06-07 17:58:59 -0700652 libFile := lib.String()
653 if ctx.Windows() {
654 libFile = pathtools.ReplaceExtension(libFile, "lib")
655 }
656 libFlagsList = append(libFlagsList, libFile)
Colin Cross3f40fa42015-01-30 17:27:36 -0800657 }
658
Colin Cross3f40fa42015-01-30 17:27:36 -0800659 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700660 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800661 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700662 if crtBegin.Valid() {
663 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800664 }
665
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400666 rule := ld
667 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
668 rule = ldRE
669 }
670
Colin Crossae887032017-10-23 17:16:14 -0700671 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400672 Rule: rule,
Josh Gao75a50a22019-06-07 17:58:59 -0700673 Description: "link " + outputFile.Base(),
674 Output: outputFile,
675 ImplicitOutputs: implicitOutputs,
676 Inputs: objFiles,
677 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800678 Args: map[string]string{
Pete Bentley99f2fc22019-08-02 14:02:20 +0100679 "ldCmd": ldCmd,
680 "crtBegin": crtBegin.String(),
681 "libFlags": strings.Join(libFlagsList, " "),
682 "extraLibFlags": flags.extraLibFlags,
Colin Cross6d88dba2019-11-06 07:06:58 -0800683 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
Pete Bentley99f2fc22019-08-02 14:02:20 +0100684 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800685 },
686 })
687}
688
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800689// Generate a rule to combine .dump sAbi dump files from multiple source files
690// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700691func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800692 baseName, exportedHeaderFlags string, symbolFile android.OptionalPath,
693 excludedSymbolVersions, excludedSymbolTags []string) android.OptionalPath {
694
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800695 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800696
697 implicits := android.Paths{soFile}
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800698 symbolFilterStr := "-so " + soFile.String()
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800699
700 if symbolFile.Valid() {
701 implicits = append(implicits, symbolFile.Path())
702 symbolFilterStr += " -v " + symbolFile.String()
703 }
704 for _, ver := range excludedSymbolVersions {
705 symbolFilterStr += " --exclude-symbol-version " + ver
706 }
707 for _, tag := range excludedSymbolTags {
708 symbolFilterStr += " --exclude-symbol-tag " + tag
709 }
Colin Crossae887032017-10-23 17:16:14 -0700710 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700711 Rule: sAbiLink,
712 Description: "header-abi-linker " + outputFile.Base(),
713 Output: outputFile,
714 Inputs: sAbiDumps,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800715 Implicits: implicits,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800716 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800717 "symbolFilter": symbolFilterStr,
718 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800719 "exportedHeaderFlags": exportedHeaderFlags,
720 },
721 })
722 return android.OptionalPathForPath(outputFile)
723}
724
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700725func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
726 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700727 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700728 Rule: unzipRefSAbiDump,
729 Description: "gunzip" + outputFile.Base(),
730 Output: outputFile,
731 Input: zippedRefDump,
732 })
733 return outputFile
734}
735
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800736func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chien2a65dda2019-10-01 15:58:07 -0700737 baseName, exportedHeaderFlags string, checkAllApis, isLlndk, isNdk, isVndkExt bool) android.OptionalPath {
Logan Chienf3511742017-10-31 18:04:35 +0800738
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800739 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700740 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Logan Chien6227fed2019-02-18 13:12:21 +0800741 createReferenceDumpFlags := ""
742
Logan Chien2a65dda2019-10-01 15:58:07 -0700743 var extraFlags []string
744 if checkAllApis {
745 extraFlags = append(extraFlags, "-check-all-apis")
746 } else {
747 extraFlags = append(extraFlags,
748 "-allow-unreferenced-changes",
749 "-allow-unreferenced-elf-symbol-changes")
Jayant Chowdharye4499502018-01-17 13:13:33 -0800750 }
Logan Chien2a65dda2019-10-01 15:58:07 -0700751
752 if exportedHeaderFlags == "" {
753 extraFlags = append(extraFlags, "-advice-only")
754 }
755
Logan Chien62f1f942019-02-18 15:40:42 +0800756 if isLlndk || isNdk {
Logan Chien6227fed2019-02-18 13:12:21 +0800757 createReferenceDumpFlags = "--llndk"
Logan Chien62f1f942019-02-18 15:40:42 +0800758 if isLlndk {
759 // TODO(b/130324828): "-consider-opaque-types-different" should apply to
760 // both LLNDK and NDK shared libs. However, a known issue in header-abi-diff
761 // breaks libaaudio. Remove the if-guard after the issue is fixed.
Logan Chien2a65dda2019-10-01 15:58:07 -0700762 extraFlags = append(extraFlags, "-consider-opaque-types-different")
Logan Chien62f1f942019-02-18 15:40:42 +0800763 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700764 }
Logan Chienf3511742017-10-31 18:04:35 +0800765 if isVndkExt {
Logan Chien2a65dda2019-10-01 15:58:07 -0700766 extraFlags = append(extraFlags, "-allow-extensions")
Logan Chienf3511742017-10-31 18:04:35 +0800767 }
768
Colin Crossae887032017-10-23 17:16:14 -0700769 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700770 Rule: sAbiDiff,
771 Description: "header-abi-diff " + outputFile.Base(),
772 Output: outputFile,
773 Input: inputDump,
774 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800775 Args: map[string]string{
Logan Chien6227fed2019-02-18 13:12:21 +0800776 "referenceDump": referenceDump.String(),
777 "libName": libName,
778 "arch": ctx.Arch().ArchType.Name,
Logan Chien2a65dda2019-10-01 15:58:07 -0700779 "extraFlags": strings.Join(extraFlags, " "),
Logan Chien6227fed2019-02-18 13:12:21 +0800780 "createReferenceDumpFlags": createReferenceDumpFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800781 },
782 })
783 return android.OptionalPathForPath(outputFile)
784}
785
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700786// Generate a rule for extracting a table of contents from a shared library (.so)
787func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700788 outputFile android.WritablePath, flags builderFlags) {
789
Colin Crossb496cfd2018-09-10 16:50:05 -0700790 var format string
791 var crossCompile string
792 if ctx.Darwin() {
793 format = "--macho"
794 crossCompile = "${config.MacToolPath}"
795 } else if ctx.Windows() {
796 format = "--pe"
797 crossCompile = gccCmd(flags.toolchain, "")
798 } else {
799 format = "--elf"
800 crossCompile = gccCmd(flags.toolchain, "")
801 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700802
Colin Crossae887032017-10-23 17:16:14 -0700803 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700804 Rule: toc,
805 Description: "generate toc " + inputFile.Base(),
806 Output: outputFile,
807 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700808 Args: map[string]string{
809 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700810 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700811 },
812 })
813}
814
Colin Cross3f40fa42015-01-30 17:27:36 -0800815// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700816func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700817 flags builderFlags, outputFile android.WritablePath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800818
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700819 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800820
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400821 rule := partialLd
822 args := map[string]string{
823 "ldCmd": ldCmd,
824 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
825 }
826 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
827 rule = partialLdRE
828 args["inCommaList"] = strings.Join(objFiles.Strings(), ",")
829 }
Colin Crossae887032017-10-23 17:16:14 -0700830 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400831 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700832 Description: "link " + outputFile.Base(),
833 Output: outputFile,
834 Inputs: objFiles,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700835 Implicits: deps,
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400836 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800837 })
838}
839
Colin Crossbfae8852015-03-26 14:44:11 -0700840// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700841func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
842 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700843
844 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
845
Colin Crossae887032017-10-23 17:16:14 -0700846 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700847 Rule: prefixSymbols,
848 Description: "prefix symbols " + outputFile.Base(),
849 Output: outputFile,
850 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700851 Args: map[string]string{
852 "objcopyCmd": objcopyCmd,
853 "prefix": prefix,
854 },
855 })
856}
857
Colin Cross635c3b02016-05-18 15:37:25 -0700858func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
859 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700860
861 crossCompile := gccCmd(flags.toolchain, "")
862 args := ""
863 if flags.stripAddGnuDebuglink {
864 args += " --add-gnu-debuglink"
865 }
866 if flags.stripKeepMiniDebugInfo {
867 args += " --keep-mini-debug-info"
868 }
869 if flags.stripKeepSymbols {
870 args += " --keep-symbols"
871 }
Yi Kongacee27c2019-03-29 20:05:14 -0700872 if flags.stripKeepSymbolsList != "" {
873 args += " -k" + flags.stripKeepSymbolsList
874 }
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700875 if flags.stripKeepSymbolsAndDebugFrame {
876 args += " --keep-symbols-and-debug-frame"
877 }
Yi Kongb5c34d72018-11-07 16:28:49 -0800878 if flags.stripUseGnuStrip {
879 args += " --use-gnu-strip"
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700880 }
Colin Cross665dce92016-04-28 14:50:03 -0700881
Colin Crossae887032017-10-23 17:16:14 -0700882 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700883 Rule: strip,
884 Description: "strip " + outputFile.Base(),
885 Output: outputFile,
886 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700887 Args: map[string]string{
888 "crossCompile": crossCompile,
889 "args": args,
890 },
891 })
892}
893
Colin Cross635c3b02016-05-18 15:37:25 -0700894func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
895 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700896
Colin Crossae887032017-10-23 17:16:14 -0700897 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700898 Rule: darwinStrip,
899 Description: "strip " + outputFile.Base(),
900 Output: outputFile,
901 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700902 })
903}
904
Oliver Nguyenc7434142019-04-24 14:22:25 -0700905func TransformCoverageFilesToZip(ctx android.ModuleContext,
906 inputs Objects, baseName string) android.OptionalPath {
Dan Willemsen581341d2017-02-09 16:16:31 -0800907
908 if len(inputs.coverageFiles) > 0 {
Oliver Nguyenc7434142019-04-24 14:22:25 -0700909 outputFile := android.PathForModuleOut(ctx, baseName+".zip")
Dan Willemsen581341d2017-02-09 16:16:31 -0800910
Oliver Nguyenc7434142019-04-24 14:22:25 -0700911 ctx.Build(pctx, android.BuildParams{
912 Rule: zip,
913 Description: "zip " + outputFile.Base(),
914 Inputs: inputs.coverageFiles,
915 Output: outputFile,
916 })
Dan Willemsen581341d2017-02-09 16:16:31 -0800917
918 return android.OptionalPathForPath(outputFile)
919 }
920
921 return android.OptionalPath{}
922}
923
Yi Kongc49c3932019-10-15 02:01:19 -0700924func TransformArchiveRepack(ctx android.ModuleContext, inputFile android.Path,
925 outputFile android.WritablePath, objects []string) {
926
927 ctx.Build(pctx, android.BuildParams{
928 Rule: archiveRepack,
929 Description: "Repack archive " + outputFile.Base(),
930 Output: outputFile,
931 Input: inputFile,
932 Args: map[string]string{
933 "objects": strings.Join(objects, " "),
934 },
935 })
936}
937
Colin Crossb98c8b02016-07-29 13:44:28 -0700938func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800939 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
940}
Colin Cross0af4b842015-04-30 16:36:18 -0700941
Colin Cross5b529592017-05-09 13:34:34 -0700942func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700943 var i int
944
945 start := 0
946 bytes := 0
947 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700948 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700949 if l > limit {
950 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
951 }
952 if bytes+l > limit {
953 lists = append(lists, list[start:i])
954 start = i
955 bytes = 0
956 }
957 bytes += l + 1 // count a space between each list element
958 }
959
960 lists = append(lists, list[start:])
961
962 totalLen := 0
963 for _, l := range lists {
964 totalLen += len(l)
965 }
966 if totalLen != len(list) {
967 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
968 }
969 return lists, nil
970}