blob: d8e90b6175dec66b001f756e997659da07fdbc3d [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 (
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -070041 abiCheckAllowFlags = []string{
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -070042 "-allow-unreferenced-changes",
43 "-allow-unreferenced-elf-symbol-changes",
44 }
45)
46
47var (
Colin Cross635c3b02016-05-18 15:37:25 -070048 pctx = android.NewPackageContext("android/soong/cc")
Colin Cross3f40fa42015-01-30 17:27:36 -080049
Ramy Medhat8ea054a2020-01-27 14:19:44 -050050 cc = pctx.AndroidRemoteStaticRule("cc", android.RemoteRuleSupports{Goma: true, RBE: true},
Colin Cross3f40fa42015-01-30 17:27:36 -080051 blueprint.RuleParams{
52 Depfile: "${out}.d",
53 Deps: blueprint.DepsGCC,
Alistair Strachan777475c2016-08-26 12:55:49 -070054 Command: "$relPwd ${config.CcWrapper}$ccCmd -c $cFlags -MD -MF ${out}.d -o $out $in",
Dan Willemsenc94a7682015-11-17 15:27:28 -080055 CommandDeps: []string{"$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080056 },
Dan Willemsen322a0a62015-11-17 15:19:46 -080057 "ccCmd", "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080058
Kousik Kumar2976bfd2020-02-17 00:26:55 -080059 ccNoDeps = pctx.AndroidStaticRule("ccNoDeps",
Dan Willemsenfcabb1c2019-01-03 23:25:11 -080060 blueprint.RuleParams{
Kousik Kumar2976bfd2020-02-17 00:26:55 -080061 Command: "$relPwd $ccCmd -c $cFlags -o $out $in",
Dan Willemsenfcabb1c2019-01-03 23:25:11 -080062 CommandDeps: []string{"$ccCmd"},
63 },
64 "ccCmd", "cFlags")
65
Ramy Medhat9a90fe52020-04-13 13:21:23 -040066 ld, ldRE = remoteexec.StaticRules(pctx, "ld",
Colin Cross3f40fa42015-01-30 17:27:36 -080067 blueprint.RuleParams{
Dan Albertce2b8392016-07-21 13:16:49 -070068 Command: "$ldCmd ${crtBegin} @${out}.rsp " +
Pete Bentley99f2fc22019-08-02 14:02:20 +010069 "${libFlags} ${crtEnd} -o ${out} ${ldFlags} ${extraLibFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080070 CommandDeps: []string{"$ldCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070071 Rspfile: "${out}.rsp",
72 RspfileContent: "${in}",
Colin Cross36ae1352019-03-29 15:55:30 -070073 // clang -Wl,--out-implib doesn't update its output file if it hasn't changed.
74 Restat: true,
Colin Cross3f40fa42015-01-30 17:27:36 -080075 },
Ramy Medhat9a90fe52020-04-13 13:21:23 -040076 &remoteexec.REParams{Labels: map[string]string{"type": "link", "tool": "clang"},
77 ExecStrategy: "${config.RECXXLinksExecStrategy}",
78 Inputs: []string{"${out}.rsp"},
79 RSPFile: "${out}.rsp",
80 OutputFiles: []string{"${out}"},
81 ToolchainInputs: []string{"$ldCmd"},
82 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXLinksPool}"},
83 }, []string{"ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags", "extraLibFlags"}, nil)
Colin Cross3f40fa42015-01-30 17:27:36 -080084
Ramy Medhat9a90fe52020-04-13 13:21:23 -040085 partialLd, partialLdRE = remoteexec.StaticRules(pctx, "partialLd",
Colin Cross3f40fa42015-01-30 17:27:36 -080086 blueprint.RuleParams{
Chih-Hung Hsieh3ede2942018-01-10 14:30:44 -080087 // Without -no-pie, clang 7.0 adds -pie to link Android files,
88 // but -r and -pie cannot be used together.
Peter Collingbourne84d83852019-07-16 14:08:45 -070089 Command: "$ldCmd -fuse-ld=lld -nostdlib -no-pie -Wl,-r ${in} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080090 CommandDeps: []string{"$ldCmd"},
Ramy Medhat9a90fe52020-04-13 13:21:23 -040091 }, &remoteexec.REParams{
92 Labels: map[string]string{"type": "link", "tool": "clang"},
93 ExecStrategy: "${config.RECXXLinksExecStrategy}", Inputs: []string{"$inCommaList"},
94 OutputFiles: []string{"${out}"},
95 ToolchainInputs: []string{"$ldCmd"},
96 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXLinksPool}"},
97 }, []string{"ldCmd", "ldFlags"}, []string{"inCommaList"})
Colin Cross3f40fa42015-01-30 17:27:36 -080098
Colin Cross9d45bb72016-08-29 16:14:13 -070099 ar = pctx.AndroidStaticRule("ar",
Colin Cross3f40fa42015-01-30 17:27:36 -0800100 blueprint.RuleParams{
Colin Cross7d21c442015-03-30 17:47:53 -0700101 Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800102 CommandDeps: []string{"$arCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -0700103 Rspfile: "${out}.rsp",
104 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -0800105 },
106 "arCmd", "arFlags")
107
Colin Cross9d45bb72016-08-29 16:14:13 -0700108 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700109 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -0700110 Command: "${config.MacStripPath} -u -r -o $out $in",
111 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700112 })
Colin Cross0af4b842015-04-30 16:36:18 -0700113
Colin Cross9d45bb72016-08-29 16:14:13 -0700114 prefixSymbols = pctx.AndroidStaticRule("prefixSymbols",
Colin Crossbfae8852015-03-26 14:44:11 -0700115 blueprint.RuleParams{
116 Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800117 CommandDeps: []string{"$objcopyCmd"},
Colin Crossbfae8852015-03-26 14:44:11 -0700118 },
119 "objcopyCmd", "prefix")
120
Nan Zhang43a485c2017-03-27 14:27:58 -0700121 _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh")
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800122 _ = pctx.SourcePathVariable("xzCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/xz")
Colin Cross665dce92016-04-28 14:50:03 -0700123
Colin Crossee3ea312019-05-17 15:36:46 -0700124 // 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 -0700125 // file descriptors on darwin. Limit concurrent calls to 5 on darwin.
Colin Crossee3ea312019-05-17 15:36:46 -0700126 darwinStripPool = func() blueprint.Pool {
127 if runtime.GOOS == "darwin" {
128 return pctx.StaticPool("darwinStripPool", blueprint.PoolParams{
Colin Crossbadf8d62019-05-22 13:25:50 -0700129 Depth: 5,
Colin Crossee3ea312019-05-17 15:36:46 -0700130 })
131 } else {
132 return nil
133 }
134 }()
135
Colin Cross9d45bb72016-08-29 16:14:13 -0700136 strip = pctx.AndroidStaticRule("strip",
Colin Cross665dce92016-04-28 14:50:03 -0700137 blueprint.RuleParams{
138 Depfile: "${out}.d",
139 Deps: blueprint.DepsGCC,
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700140 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 -0800141 CommandDeps: []string{"$stripPath", "$xzCmd"},
Colin Crossee3ea312019-05-17 15:36:46 -0700142 Pool: darwinStripPool,
Colin Cross665dce92016-04-28 14:50:03 -0700143 },
144 "args", "crossCompile")
145
Yi Kongc49c3932019-10-15 02:01:19 -0700146 _ = pctx.SourcePathVariable("archiveRepackPath", "build/soong/scripts/archive_repack.sh")
147
148 archiveRepack = pctx.AndroidStaticRule("archiveRepack",
149 blueprint.RuleParams{
150 Depfile: "${out}.d",
151 Deps: blueprint.DepsGCC,
152 Command: "CLANG_BIN=${config.ClangBin} $archiveRepackPath -i ${in} -o ${out} -d ${out}.d ${objects}",
153 CommandDeps: []string{"$archiveRepackPath"},
154 },
155 "objects")
156
Colin Cross9d45bb72016-08-29 16:14:13 -0700157 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700158 blueprint.RuleParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700159 Command: "rm -f $out && touch $out",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700160 })
161
Nan Zhang43a485c2017-03-27 14:27:58 -0700162 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700163
164 toc = pctx.AndroidStaticRule("toc",
165 blueprint.RuleParams{
166 Depfile: "${out}.d",
167 Deps: blueprint.DepsGCC,
Colin Crossb496cfd2018-09-10 16:50:05 -0700168 Command: "CROSS_COMPILE=$crossCompile $tocPath $format -i ${in} -o ${out} -d ${out}.d",
Colin Cross26c34ed2016-09-30 17:10:16 -0700169 CommandDeps: []string{"$tocPath"},
170 Restat: true,
171 },
Colin Crossb496cfd2018-09-10 16:50:05 -0700172 "crossCompile", "format")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700173
174 clangTidy = pctx.AndroidStaticRule("clangTidy",
175 blueprint.RuleParams{
George Burgess IVc4624c02019-04-04 16:22:37 -0700176 Command: "rm -f $out && ${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out",
177 CommandDeps: []string{"${config.ClangBin}/clang-tidy"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700178 },
179 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800180
Nan Zhang43a485c2017-03-27 14:27:58 -0700181 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800182
183 yasm = pctx.AndroidStaticRule("yasm",
184 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700185 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800186 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700187 Depfile: "$out.d",
188 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800189 },
190 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800191
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700192 windres = pctx.AndroidStaticRule("windres",
193 blueprint.RuleParams{
Nick Desaulniers18eeffa2020-01-29 16:20:11 -0800194 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 -0700195 CommandDeps: []string{"$windresCmd"},
196 },
197 "windresCmd", "flags")
198
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800199 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800200
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700201 // -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 -0800202 sAbiDump = pctx.AndroidStaticRule("sAbiDump",
203 blueprint.RuleParams{
Logan Chien3ff624f2018-10-08 11:49:32 +0800204 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 -0800205 CommandDeps: []string{"$sAbiDumper"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800206 },
207 "cFlags", "exportDirs")
208
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800209 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800210
211 sAbiLink = pctx.AndroidStaticRule("sAbiLink",
212 blueprint.RuleParams{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800213 Command: "$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800214 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800215 Rspfile: "${out}.rsp",
216 RspfileContent: "${in}",
217 },
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800218 "symbolFilter", "arch", "exportedHeaderFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800219
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800220 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700221
Colin Cross2e2dbc22019-09-25 13:31:46 -0700222 sAbiDiff = pctx.RuleFunc("sAbiDiff",
Dan Willemsen54daaf02018-03-12 13:24:09 -0700223 func(ctx android.PackageRuleContext) blueprint.RuleParams {
Jayant Chowdhary39d167a2018-05-17 16:45:51 -0700224 // TODO(b/78139997): Add -check-all-apis back
Logan Chien6227fed2019-02-18 13:12:21 +0800225 commandStr := "($sAbiDiffer ${allowFlags} -lib ${libName} -arch ${arch} -o ${out} -new ${in} -old ${referenceDump})"
226 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 +0800227 commandStr += " && (mkdir -p $$DIST_DIR/abidiffs && cp ${out} $$DIST_DIR/abidiffs/)"
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800228 commandStr += " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800229 return blueprint.RuleParams{
230 Command: commandStr,
231 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700232 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800233 },
Logan Chien6227fed2019-02-18 13:12:21 +0800234 "allowFlags", "referenceDump", "libName", "arch", "createReferenceDumpFlags")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700235
236 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
237 blueprint.RuleParams{
238 Command: "gunzip -c $in > $out",
239 })
Oliver Nguyenc7434142019-04-24 14:22:25 -0700240
241 zip = pctx.AndroidStaticRule("zip",
242 blueprint.RuleParams{
243 Command: "cat $out.rsp | tr ' ' '\\n' | tr -d \\' | sort -u > ${out}.tmp && ${SoongZipCmd} -o ${out} -C $$OUT_DIR -l ${out}.tmp",
244 CommandDeps: []string{"${SoongZipCmd}"},
245 Rspfile: "$out.rsp",
246 RspfileContent: "$in",
247 })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800248
249 _ = pctx.SourcePathVariable("cxxExtractor",
250 "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/cxx_extractor")
Sasha Smundak65143642019-09-26 20:14:28 -0700251 _ = pctx.SourcePathVariable("kytheVnames", "build/soong/vnames.json")
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800252 _ = pctx.VariableFunc("kytheCorpus",
253 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCorpusName() })
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800254 _ = pctx.VariableFunc("kytheCuEncoding",
255 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCuEncoding() })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800256 kytheExtract = pctx.StaticRule("kythe",
257 blueprint.RuleParams{
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800258 Command: `rm -f $out && ` +
259 `KYTHE_CORPUS=${kytheCorpus} KYTHE_OUTPUT_FILE=$out KYTHE_VNAMES=$kytheVnames KYTHE_KZIP_ENCODING=${kytheCuEncoding} ` +
260 `$cxxExtractor $cFlags $in `,
Sasha Smundak65143642019-09-26 20:14:28 -0700261 CommandDeps: []string{"$cxxExtractor", "$kytheVnames"},
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800262 },
263 "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -0800264)
265
Dan Willemsen322a0a62015-11-17 15:19:46 -0800266func init() {
267 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
268 // debug output. That way two builds in two different directories will
269 // create the same output.
270 if runtime.GOOS != "darwin" {
271 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
272 } else {
273 // Darwin doesn't have /proc
274 pctx.StaticVariable("relPwd", "")
275 }
Oliver Nguyenc7434142019-04-24 14:22:25 -0700276
277 pctx.HostBinToolVariable("SoongZipCmd", "soong_zip")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400278 pctx.Import("android/soong/remoteexec")
Dan Willemsen322a0a62015-11-17 15:19:46 -0800279}
280
Colin Cross3f40fa42015-01-30 17:27:36 -0800281type builderFlags struct {
Colin Cross6d88dba2019-11-06 07:06:58 -0800282 globalCommonFlags string
283 globalAsFlags string
284 globalYasmFlags string
285 globalCFlags string
286 globalToolingCFlags string // A separate set of cFlags for clang LibTooling tools
287 globalToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
288 globalConlyFlags string
289 globalCppFlags string
290 globalLdFlags string
291
292 localCommonFlags string
293 localAsFlags string
294 localYasmFlags string
295 localCFlags string
296 localToolingCFlags string // A separate set of cFlags for clang LibTooling tools
297 localToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
298 localConlyFlags string
299 localCppFlags string
300 localLdFlags string
301
302 libFlags string
303 extraLibFlags string
304 tidyFlags string
305 sAbiFlags string
306 aidlFlags string
307 rsFlags string
308 toolchain config.Toolchain
309 tidy bool
Oliver Nguyen04526782020-04-21 12:40:27 -0700310 gcovCoverage bool
Colin Cross6d88dba2019-11-06 07:06:58 -0800311 sAbiDump bool
312 emitXrefs bool
Colin Cross665dce92016-04-28 14:50:03 -0700313
Dan Willemsen98ab3112019-08-27 21:20:40 -0700314 assemblerWithCpp bool
315
Colin Crossc3199482017-03-30 15:03:04 -0700316 systemIncludeFlags string
317
Colin Cross18c0c5a2016-12-01 14:45:23 -0800318 groupStaticLibs bool
319
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700320 stripKeepSymbols bool
321 stripKeepSymbolsList string
322 stripKeepSymbolsAndDebugFrame bool
323 stripKeepMiniDebugInfo bool
324 stripAddGnuDebuglink bool
325 stripUseGnuStrip bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800326
Colin Cross19878da2019-03-28 14:45:07 -0700327 proto android.ProtoFlags
Dan Willemsen60e62f02018-11-16 21:05:32 -0800328 protoC bool
329 protoOptionsFile bool
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700330
331 yacc *YaccProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800332}
333
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700334type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800335 objFiles android.Paths
336 tidyFiles android.Paths
337 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800338 sAbiDumpFiles android.Paths
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800339 kytheFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700340}
341
342func (a Objects) Copy() Objects {
343 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800344 objFiles: append(android.Paths{}, a.objFiles...),
345 tidyFiles: append(android.Paths{}, a.tidyFiles...),
346 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800347 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800348 kytheFiles: append(android.Paths{}, a.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700349 }
350}
351
352func (a Objects) Append(b Objects) Objects {
353 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800354 objFiles: append(a.objFiles, b.objFiles...),
355 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
356 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800357 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800358 kytheFiles: append(a.kytheFiles, b.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700359 }
360}
361
Colin Cross3f40fa42015-01-30 17:27:36 -0800362// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700363func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800364 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700365
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700366 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700367 var tidyFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700368 if flags.tidy {
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700369 tidyFiles = make(android.Paths, 0, len(srcFiles))
370 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800371 var coverageFiles android.Paths
Oliver Nguyen04526782020-04-21 12:40:27 -0700372 if flags.gcovCoverage {
Dan Willemsen581341d2017-02-09 16:16:31 -0800373 coverageFiles = make(android.Paths, 0, len(srcFiles))
374 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800375 var kytheFiles android.Paths
376 if flags.emitXrefs {
377 kytheFiles = make(android.Paths, 0, len(srcFiles))
378 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800379
Colin Cross6d88dba2019-11-06 07:06:58 -0800380 // Produce fully expanded flags for use by C tools, C compiles, C++ tools, C++ compiles, and asm compiles
381 // respectively.
382 toolingCflags := flags.globalCommonFlags + " " +
383 flags.globalToolingCFlags + " " +
384 flags.globalConlyFlags + " " +
385 flags.localCommonFlags + " " +
386 flags.localToolingCFlags + " " +
387 flags.localConlyFlags + " " +
388 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700389
Colin Cross6d88dba2019-11-06 07:06:58 -0800390 cflags := flags.globalCommonFlags + " " +
391 flags.globalCFlags + " " +
392 flags.globalConlyFlags + " " +
393 flags.localCommonFlags + " " +
394 flags.localCFlags + " " +
395 flags.localConlyFlags + " " +
396 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700397
Colin Cross6d88dba2019-11-06 07:06:58 -0800398 toolingCppflags := flags.globalCommonFlags + " " +
399 flags.globalToolingCFlags + " " +
400 flags.globalToolingCppFlags + " " +
401 flags.localCommonFlags + " " +
402 flags.localToolingCFlags + " " +
403 flags.localToolingCppFlags + " " +
404 flags.systemIncludeFlags
Colin Crossc3199482017-03-30 15:03:04 -0700405
Colin Cross6d88dba2019-11-06 07:06:58 -0800406 cppflags := flags.globalCommonFlags + " " +
407 flags.globalCFlags + " " +
408 flags.globalCppFlags + " " +
409 flags.localCommonFlags + " " +
410 flags.localCFlags + " " +
411 flags.localCppFlags + " " +
412 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700413
Colin Cross6d88dba2019-11-06 07:06:58 -0800414 asflags := flags.globalCommonFlags + " " +
415 flags.globalAsFlags + " " +
416 flags.localCommonFlags + " " +
417 flags.localAsFlags + " " +
418 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700419
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800420 var sAbiDumpFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700421 if flags.sAbiDump {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800422 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
423 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800424
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700425 cflags += " ${config.NoOverrideClangGlobalCflags}"
426 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
427 cppflags += " ${config.NoOverrideClangGlobalCflags}"
428 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800429
Colin Cross3f40fa42015-01-30 17:27:36 -0800430 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700431 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800432
433 objFiles[i] = objFile
434
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700435 switch srcFile.Ext() {
436 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700437 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700438 Rule: yasm,
439 Description: "yasm " + srcFile.Rel(),
440 Output: objFile,
441 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800442 Implicits: cFlagsDeps,
443 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800444 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800445 "asFlags": flags.globalYasmFlags + " " + flags.localYasmFlags,
Colin Cross91e90042016-12-02 17:13:24 -0800446 },
447 })
448 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700449 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700450 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700451 Rule: windres,
452 Description: "windres " + srcFile.Rel(),
453 Output: objFile,
454 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800455 Implicits: cFlagsDeps,
456 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700457 Args: map[string]string{
458 "windresCmd": gccCmd(flags.toolchain, "windres"),
459 "flags": flags.toolchain.WindresFlags(),
460 },
461 })
462 continue
Pete Bentleyfcf55bf2019-08-16 20:14:32 +0100463 case ".o":
464 objFiles[i] = srcFile
465 continue
Colin Cross91e90042016-12-02 17:13:24 -0800466 }
467
Colin Cross6d88dba2019-11-06 07:06:58 -0800468 var moduleFlags string
469 var moduleToolingFlags string
470
Colin Cross3f40fa42015-01-30 17:27:36 -0800471 var ccCmd string
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700472 tidy := flags.tidy
Oliver Nguyen04526782020-04-21 12:40:27 -0700473 coverage := flags.gcovCoverage
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700474 dump := flags.sAbiDump
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800475 rule := cc
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800476 emitXref := flags.emitXrefs
Colin Cross3f40fa42015-01-30 17:27:36 -0800477
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700478 switch srcFile.Ext() {
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800479 case ".s":
Dan Willemsen98ab3112019-08-27 21:20:40 -0700480 if !flags.assemblerWithCpp {
481 rule = ccNoDeps
482 }
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800483 fallthrough
484 case ".S":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700485 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800486 moduleFlags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700487 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800488 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800489 dump = false
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800490 emitXref = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800491 case ".c":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700492 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800493 moduleFlags = cflags
494 moduleToolingFlags = toolingCflags
Colin Crossd34ab7c2019-06-27 14:46:10 -0700495 case ".cpp", ".cc", ".cxx", ".mm":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700496 ccCmd = "clang++"
Colin Cross6d88dba2019-11-06 07:06:58 -0800497 moduleFlags = cppflags
498 moduleToolingFlags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800499 default:
500 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
501 continue
502 }
503
Colin Cross67a5c132017-05-09 13:45:28 -0700504 ccDesc := ccCmd
505
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700506 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800507
Dan Willemsen581341d2017-02-09 16:16:31 -0800508 var implicitOutputs android.WritablePaths
509 if coverage {
510 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
511 implicitOutputs = append(implicitOutputs, gcnoFile)
512 coverageFiles = append(coverageFiles, gcnoFile)
513 }
514
Colin Crossae887032017-10-23 17:16:14 -0700515 ctx.Build(pctx, android.BuildParams{
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800516 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700517 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800518 Output: objFile,
519 ImplicitOutputs: implicitOutputs,
520 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800521 Implicits: cFlagsDeps,
522 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800523 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800524 "cFlags": moduleFlags,
Colin Cross28344522015-04-22 13:07:53 -0700525 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800526 },
527 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700528
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800529 if emitXref {
530 kytheFile := android.ObjPathWithExt(ctx, subdir, srcFile, "kzip")
531 ctx.Build(pctx, android.BuildParams{
532 Rule: kytheExtract,
533 Description: "Xref C++ extractor " + srcFile.Rel(),
534 Output: kytheFile,
535 Input: srcFile,
536 Implicits: cFlagsDeps,
537 OrderOnly: pathDeps,
538 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800539 "cFlags": moduleFlags,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800540 },
541 })
542 kytheFiles = append(kytheFiles, kytheFile)
543 }
544
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700545 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700546 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700547 tidyFiles = append(tidyFiles, tidyFile)
548
Colin Crossae887032017-10-23 17:16:14 -0700549 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700550 Rule: clangTidy,
551 Description: "clang-tidy " + srcFile.Rel(),
552 Output: tidyFile,
553 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700554 // We must depend on objFile, since clang-tidy doesn't
555 // support exporting dependencies.
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700556 Implicit: objFile,
557 Implicits: cFlagsDeps,
558 OrderOnly: pathDeps,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700559 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800560 "cFlags": moduleToolingFlags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700561 "tidyFlags": flags.tidyFlags,
562 },
563 })
564 }
565
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800566 if dump {
567 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
568 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
569
Colin Crossae887032017-10-23 17:16:14 -0700570 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700571 Rule: sAbiDump,
572 Description: "header-abi-dumper " + srcFile.Rel(),
573 Output: sAbiDumpFile,
574 Input: srcFile,
575 Implicit: objFile,
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700576 Implicits: cFlagsDeps,
577 OrderOnly: pathDeps,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800578 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800579 "cFlags": moduleToolingFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800580 "exportDirs": flags.sAbiFlags,
581 },
582 })
583 }
584
Colin Cross3f40fa42015-01-30 17:27:36 -0800585 }
586
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700587 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800588 objFiles: objFiles,
589 tidyFiles: tidyFiles,
590 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800591 sAbiDumpFiles: sAbiDumpFiles,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800592 kytheFiles: kytheFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700593 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800594}
595
596// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700597func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700598 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800599
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800600 arCmd := "${config.ClangBin}/llvm-ar"
Yi Kongee96a792019-09-06 15:11:57 -0700601 arFlags := "crsPD"
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800602 if !ctx.Darwin() {
603 arFlags += " -format=gnu"
604 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800605
Colin Crossae887032017-10-23 17:16:14 -0700606 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700607 Rule: ar,
608 Description: "static link " + outputFile.Base(),
609 Output: outputFile,
610 Inputs: objFiles,
611 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800612 Args: map[string]string{
613 "arFlags": arFlags,
614 "arCmd": arCmd,
615 },
616 })
617}
618
619// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700620// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700621func TransformObjToDynamicBinary(ctx android.ModuleContext,
622 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
Josh Gao75a50a22019-06-07 17:58:59 -0700623 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath, implicitOutputs android.WritablePaths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800624
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700625 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800626
Colin Cross3f40fa42015-01-30 17:27:36 -0800627 var libFlagsList []string
628
Colin Cross16b23492016-01-06 14:41:07 -0800629 if len(flags.libFlags) > 0 {
630 libFlagsList = append(libFlagsList, flags.libFlags)
631 }
632
Colin Cross3f40fa42015-01-30 17:27:36 -0800633 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800634 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700635 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700636 } else {
637 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700638 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700639 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
640 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800641 }
642
Colin Cross7a7cf972016-12-05 18:47:39 -0800643 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800644 libFlagsList = append(libFlagsList, "-Wl,--start-group")
645 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700646 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800647 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800648 libFlagsList = append(libFlagsList, "-Wl,--end-group")
649 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800650
Stephen Hines10347862016-07-18 15:54:54 -0700651 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700652 libFlagsList = append(libFlagsList, "-Wl,--start-group")
653 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700654 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700655 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700656 libFlagsList = append(libFlagsList, "-Wl,--end-group")
657 }
658
Colin Cross3f40fa42015-01-30 17:27:36 -0800659 for _, lib := range sharedLibs {
Josh Gao75a50a22019-06-07 17:58:59 -0700660 libFile := lib.String()
661 if ctx.Windows() {
662 libFile = pathtools.ReplaceExtension(libFile, "lib")
663 }
664 libFlagsList = append(libFlagsList, libFile)
Colin Cross3f40fa42015-01-30 17:27:36 -0800665 }
666
Colin Cross3f40fa42015-01-30 17:27:36 -0800667 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700668 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800669 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700670 if crtBegin.Valid() {
671 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800672 }
673
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400674 rule := ld
675 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
676 rule = ldRE
677 }
678
Colin Crossae887032017-10-23 17:16:14 -0700679 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400680 Rule: rule,
Josh Gao75a50a22019-06-07 17:58:59 -0700681 Description: "link " + outputFile.Base(),
682 Output: outputFile,
683 ImplicitOutputs: implicitOutputs,
684 Inputs: objFiles,
685 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800686 Args: map[string]string{
Pete Bentley99f2fc22019-08-02 14:02:20 +0100687 "ldCmd": ldCmd,
688 "crtBegin": crtBegin.String(),
689 "libFlags": strings.Join(libFlagsList, " "),
690 "extraLibFlags": flags.extraLibFlags,
Colin Cross6d88dba2019-11-06 07:06:58 -0800691 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
Pete Bentley99f2fc22019-08-02 14:02:20 +0100692 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800693 },
694 })
695}
696
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800697// Generate a rule to combine .dump sAbi dump files from multiple source files
698// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700699func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800700 baseName, exportedHeaderFlags string, symbolFile android.OptionalPath,
701 excludedSymbolVersions, excludedSymbolTags []string) android.OptionalPath {
702
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800703 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800704
705 implicits := android.Paths{soFile}
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800706 symbolFilterStr := "-so " + soFile.String()
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800707
708 if symbolFile.Valid() {
709 implicits = append(implicits, symbolFile.Path())
710 symbolFilterStr += " -v " + symbolFile.String()
711 }
712 for _, ver := range excludedSymbolVersions {
713 symbolFilterStr += " --exclude-symbol-version " + ver
714 }
715 for _, tag := range excludedSymbolTags {
716 symbolFilterStr += " --exclude-symbol-tag " + tag
717 }
Colin Crossae887032017-10-23 17:16:14 -0700718 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700719 Rule: sAbiLink,
720 Description: "header-abi-linker " + outputFile.Base(),
721 Output: outputFile,
722 Inputs: sAbiDumps,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800723 Implicits: implicits,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800724 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800725 "symbolFilter": symbolFilterStr,
726 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800727 "exportedHeaderFlags": exportedHeaderFlags,
728 },
729 })
730 return android.OptionalPathForPath(outputFile)
731}
732
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700733func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
734 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700735 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700736 Rule: unzipRefSAbiDump,
737 Description: "gunzip" + outputFile.Base(),
738 Output: outputFile,
739 Input: zippedRefDump,
740 })
741 return outputFile
742}
743
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800744func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chien62f1f942019-02-18 15:40:42 +0800745 baseName, exportedHeaderFlags string, isLlndk, isNdk, isVndkExt bool) android.OptionalPath {
Logan Chienf3511742017-10-31 18:04:35 +0800746
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800747 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700748 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Logan Chien6227fed2019-02-18 13:12:21 +0800749 createReferenceDumpFlags := ""
750
Jayant Chowdharye4499502018-01-17 13:13:33 -0800751 localAbiCheckAllowFlags := append([]string(nil), abiCheckAllowFlags...)
752 if exportedHeaderFlags == "" {
753 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-advice-only")
754 }
Logan Chien62f1f942019-02-18 15:40:42 +0800755 if isLlndk || isNdk {
Logan Chien6227fed2019-02-18 13:12:21 +0800756 createReferenceDumpFlags = "--llndk"
Logan Chien62f1f942019-02-18 15:40:42 +0800757 if isLlndk {
758 // TODO(b/130324828): "-consider-opaque-types-different" should apply to
759 // both LLNDK and NDK shared libs. However, a known issue in header-abi-diff
760 // breaks libaaudio. Remove the if-guard after the issue is fixed.
761 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-consider-opaque-types-different")
762 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700763 }
Logan Chienf3511742017-10-31 18:04:35 +0800764 if isVndkExt {
765 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-allow-extensions")
766 }
767
Colin Crossae887032017-10-23 17:16:14 -0700768 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700769 Rule: sAbiDiff,
770 Description: "header-abi-diff " + outputFile.Base(),
771 Output: outputFile,
772 Input: inputDump,
773 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800774 Args: map[string]string{
Logan Chien6227fed2019-02-18 13:12:21 +0800775 "referenceDump": referenceDump.String(),
776 "libName": libName,
777 "arch": ctx.Arch().ArchType.Name,
778 "allowFlags": strings.Join(localAbiCheckAllowFlags, " "),
779 "createReferenceDumpFlags": createReferenceDumpFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800780 },
781 })
782 return android.OptionalPathForPath(outputFile)
783}
784
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700785// Generate a rule for extracting a table of contents from a shared library (.so)
786func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700787 outputFile android.WritablePath, flags builderFlags) {
788
Colin Crossb496cfd2018-09-10 16:50:05 -0700789 var format string
790 var crossCompile string
791 if ctx.Darwin() {
792 format = "--macho"
793 crossCompile = "${config.MacToolPath}"
794 } else if ctx.Windows() {
795 format = "--pe"
796 crossCompile = gccCmd(flags.toolchain, "")
797 } else {
798 format = "--elf"
799 crossCompile = gccCmd(flags.toolchain, "")
800 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700801
Colin Crossae887032017-10-23 17:16:14 -0700802 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700803 Rule: toc,
804 Description: "generate toc " + inputFile.Base(),
805 Output: outputFile,
806 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700807 Args: map[string]string{
808 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700809 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700810 },
811 })
812}
813
Colin Cross3f40fa42015-01-30 17:27:36 -0800814// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700815func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700816 flags builderFlags, outputFile android.WritablePath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800817
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700818 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800819
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400820 rule := partialLd
821 args := map[string]string{
822 "ldCmd": ldCmd,
823 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
824 }
825 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
826 rule = partialLdRE
827 args["inCommaList"] = strings.Join(objFiles.Strings(), ",")
828 }
Colin Crossae887032017-10-23 17:16:14 -0700829 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400830 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700831 Description: "link " + outputFile.Base(),
832 Output: outputFile,
833 Inputs: objFiles,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700834 Implicits: deps,
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400835 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800836 })
837}
838
Colin Crossbfae8852015-03-26 14:44:11 -0700839// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700840func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
841 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700842
843 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
844
Colin Crossae887032017-10-23 17:16:14 -0700845 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700846 Rule: prefixSymbols,
847 Description: "prefix symbols " + outputFile.Base(),
848 Output: outputFile,
849 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700850 Args: map[string]string{
851 "objcopyCmd": objcopyCmd,
852 "prefix": prefix,
853 },
854 })
855}
856
Colin Cross635c3b02016-05-18 15:37:25 -0700857func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
858 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700859
860 crossCompile := gccCmd(flags.toolchain, "")
861 args := ""
862 if flags.stripAddGnuDebuglink {
863 args += " --add-gnu-debuglink"
864 }
865 if flags.stripKeepMiniDebugInfo {
866 args += " --keep-mini-debug-info"
867 }
868 if flags.stripKeepSymbols {
869 args += " --keep-symbols"
870 }
Yi Kongacee27c2019-03-29 20:05:14 -0700871 if flags.stripKeepSymbolsList != "" {
872 args += " -k" + flags.stripKeepSymbolsList
873 }
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700874 if flags.stripKeepSymbolsAndDebugFrame {
875 args += " --keep-symbols-and-debug-frame"
876 }
Yi Kongb5c34d72018-11-07 16:28:49 -0800877 if flags.stripUseGnuStrip {
878 args += " --use-gnu-strip"
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700879 }
Colin Cross665dce92016-04-28 14:50:03 -0700880
Colin Crossae887032017-10-23 17:16:14 -0700881 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700882 Rule: strip,
883 Description: "strip " + outputFile.Base(),
884 Output: outputFile,
885 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700886 Args: map[string]string{
887 "crossCompile": crossCompile,
888 "args": args,
889 },
890 })
891}
892
Colin Cross635c3b02016-05-18 15:37:25 -0700893func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
894 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700895
Colin Crossae887032017-10-23 17:16:14 -0700896 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700897 Rule: darwinStrip,
898 Description: "strip " + outputFile.Base(),
899 Output: outputFile,
900 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700901 })
902}
903
Oliver Nguyenc7434142019-04-24 14:22:25 -0700904func TransformCoverageFilesToZip(ctx android.ModuleContext,
905 inputs Objects, baseName string) android.OptionalPath {
Dan Willemsen581341d2017-02-09 16:16:31 -0800906
907 if len(inputs.coverageFiles) > 0 {
Oliver Nguyenc7434142019-04-24 14:22:25 -0700908 outputFile := android.PathForModuleOut(ctx, baseName+".zip")
Dan Willemsen581341d2017-02-09 16:16:31 -0800909
Oliver Nguyenc7434142019-04-24 14:22:25 -0700910 ctx.Build(pctx, android.BuildParams{
911 Rule: zip,
912 Description: "zip " + outputFile.Base(),
913 Inputs: inputs.coverageFiles,
914 Output: outputFile,
915 })
Dan Willemsen581341d2017-02-09 16:16:31 -0800916
917 return android.OptionalPathForPath(outputFile)
918 }
919
920 return android.OptionalPath{}
921}
922
Yi Kongc49c3932019-10-15 02:01:19 -0700923func TransformArchiveRepack(ctx android.ModuleContext, inputFile android.Path,
924 outputFile android.WritablePath, objects []string) {
925
926 ctx.Build(pctx, android.BuildParams{
927 Rule: archiveRepack,
928 Description: "Repack archive " + outputFile.Base(),
929 Output: outputFile,
930 Input: inputFile,
931 Args: map[string]string{
932 "objects": strings.Join(objects, " "),
933 },
934 })
935}
936
Colin Crossb98c8b02016-07-29 13:44:28 -0700937func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800938 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
939}
Colin Cross0af4b842015-04-30 16:36:18 -0700940
Colin Cross5b529592017-05-09 13:34:34 -0700941func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700942 var i int
943
944 start := 0
945 bytes := 0
946 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700947 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700948 if l > limit {
949 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
950 }
951 if bytes+l > limit {
952 lists = append(lists, list[start:i])
953 start = i
954 bytes = 0
955 }
956 bytes += l + 1 // count a space between each list element
957 }
958
959 lists = append(lists, list[start:])
960
961 totalLen := 0
962 for _, l := range lists {
963 totalLen += len(l)
964 }
965 if totalLen != len(list) {
966 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
967 }
968 return lists, nil
969}