blob: a16d51f83f434965d990a925bae9aa032aa873c4 [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{
Ramy Medhat31ec9422020-04-17 15:03:58 -040061 Command: "$reTemplate$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 Medhat31ec9422020-04-17 15:03:58 -040069 &remoteexec.REParams{
70 Labels: map[string]string{"type": "link", "tool": "clang"},
Ramy Medhat9a90fe52020-04-13 13:21:23 -040071 ExecStrategy: "${config.RECXXLinksExecStrategy}",
72 Inputs: []string{"${out}.rsp"},
73 RSPFile: "${out}.rsp",
74 OutputFiles: []string{"${out}"},
75 ToolchainInputs: []string{"$ldCmd"},
76 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXLinksPool}"},
77 }, []string{"ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags", "extraLibFlags"}, nil)
Colin Cross3f40fa42015-01-30 17:27:36 -080078
Ramy Medhat9a90fe52020-04-13 13:21:23 -040079 partialLd, partialLdRE = remoteexec.StaticRules(pctx, "partialLd",
Colin Cross3f40fa42015-01-30 17:27:36 -080080 blueprint.RuleParams{
Chih-Hung Hsieh3ede2942018-01-10 14:30:44 -080081 // Without -no-pie, clang 7.0 adds -pie to link Android files,
82 // but -r and -pie cannot be used together.
Ramy Medhat31ec9422020-04-17 15:03:58 -040083 Command: "$reTemplate$ldCmd -fuse-ld=lld -nostdlib -no-pie -Wl,-r ${in} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080084 CommandDeps: []string{"$ldCmd"},
Ramy Medhat9a90fe52020-04-13 13:21:23 -040085 }, &remoteexec.REParams{
Ramy Medhat31ec9422020-04-17 15:03:58 -040086 Labels: map[string]string{"type": "link", "tool": "clang"},
87 ExecStrategy: "${config.RECXXLinksExecStrategy}",
88 Inputs: []string{"$inCommaList"},
Ramy Medhat9a90fe52020-04-13 13:21:23 -040089 OutputFiles: []string{"${out}"},
90 ToolchainInputs: []string{"$ldCmd"},
91 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXLinksPool}"},
92 }, []string{"ldCmd", "ldFlags"}, []string{"inCommaList"})
Colin Cross3f40fa42015-01-30 17:27:36 -080093
Colin Cross9d45bb72016-08-29 16:14:13 -070094 ar = pctx.AndroidStaticRule("ar",
Colin Cross3f40fa42015-01-30 17:27:36 -080095 blueprint.RuleParams{
Colin Cross7d21c442015-03-30 17:47:53 -070096 Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
Dan Willemsenc94a7682015-11-17 15:27:28 -080097 CommandDeps: []string{"$arCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070098 Rspfile: "${out}.rsp",
99 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -0800100 },
101 "arCmd", "arFlags")
102
Colin Cross9d45bb72016-08-29 16:14:13 -0700103 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700104 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -0700105 Command: "${config.MacStripPath} -u -r -o $out $in",
106 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700107 })
Colin Cross0af4b842015-04-30 16:36:18 -0700108
Colin Cross9d45bb72016-08-29 16:14:13 -0700109 prefixSymbols = pctx.AndroidStaticRule("prefixSymbols",
Colin Crossbfae8852015-03-26 14:44:11 -0700110 blueprint.RuleParams{
111 Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800112 CommandDeps: []string{"$objcopyCmd"},
Colin Crossbfae8852015-03-26 14:44:11 -0700113 },
114 "objcopyCmd", "prefix")
115
Nan Zhang43a485c2017-03-27 14:27:58 -0700116 _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh")
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800117 _ = pctx.SourcePathVariable("xzCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/xz")
Colin Cross665dce92016-04-28 14:50:03 -0700118
Colin Crossee3ea312019-05-17 15:36:46 -0700119 // 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 -0700120 // file descriptors on darwin. Limit concurrent calls to 5 on darwin.
Colin Crossee3ea312019-05-17 15:36:46 -0700121 darwinStripPool = func() blueprint.Pool {
122 if runtime.GOOS == "darwin" {
123 return pctx.StaticPool("darwinStripPool", blueprint.PoolParams{
Colin Crossbadf8d62019-05-22 13:25:50 -0700124 Depth: 5,
Colin Crossee3ea312019-05-17 15:36:46 -0700125 })
126 } else {
127 return nil
128 }
129 }()
130
Colin Cross9d45bb72016-08-29 16:14:13 -0700131 strip = pctx.AndroidStaticRule("strip",
Colin Cross665dce92016-04-28 14:50:03 -0700132 blueprint.RuleParams{
133 Depfile: "${out}.d",
134 Deps: blueprint.DepsGCC,
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700135 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 -0800136 CommandDeps: []string{"$stripPath", "$xzCmd"},
Colin Crossee3ea312019-05-17 15:36:46 -0700137 Pool: darwinStripPool,
Colin Cross665dce92016-04-28 14:50:03 -0700138 },
139 "args", "crossCompile")
140
Yi Kongc49c3932019-10-15 02:01:19 -0700141 _ = pctx.SourcePathVariable("archiveRepackPath", "build/soong/scripts/archive_repack.sh")
142
143 archiveRepack = pctx.AndroidStaticRule("archiveRepack",
144 blueprint.RuleParams{
145 Depfile: "${out}.d",
146 Deps: blueprint.DepsGCC,
147 Command: "CLANG_BIN=${config.ClangBin} $archiveRepackPath -i ${in} -o ${out} -d ${out}.d ${objects}",
148 CommandDeps: []string{"$archiveRepackPath"},
149 },
150 "objects")
151
Colin Cross9d45bb72016-08-29 16:14:13 -0700152 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700153 blueprint.RuleParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700154 Command: "rm -f $out && touch $out",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700155 })
156
Nan Zhang43a485c2017-03-27 14:27:58 -0700157 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700158
159 toc = pctx.AndroidStaticRule("toc",
160 blueprint.RuleParams{
161 Depfile: "${out}.d",
162 Deps: blueprint.DepsGCC,
Colin Crossb496cfd2018-09-10 16:50:05 -0700163 Command: "CROSS_COMPILE=$crossCompile $tocPath $format -i ${in} -o ${out} -d ${out}.d",
Colin Cross26c34ed2016-09-30 17:10:16 -0700164 CommandDeps: []string{"$tocPath"},
165 Restat: true,
166 },
Colin Crossb496cfd2018-09-10 16:50:05 -0700167 "crossCompile", "format")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700168
169 clangTidy = pctx.AndroidStaticRule("clangTidy",
170 blueprint.RuleParams{
George Burgess IVc4624c02019-04-04 16:22:37 -0700171 Command: "rm -f $out && ${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out",
172 CommandDeps: []string{"${config.ClangBin}/clang-tidy"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700173 },
174 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800175
Nan Zhang43a485c2017-03-27 14:27:58 -0700176 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800177
178 yasm = pctx.AndroidStaticRule("yasm",
179 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700180 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800181 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700182 Depfile: "$out.d",
183 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800184 },
185 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800186
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700187 windres = pctx.AndroidStaticRule("windres",
188 blueprint.RuleParams{
Nick Desaulniers18eeffa2020-01-29 16:20:11 -0800189 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 -0700190 CommandDeps: []string{"$windresCmd"},
191 },
192 "windresCmd", "flags")
193
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800194 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800195
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700196 // -w has been added since header-abi-dumper does not need to produce any sort of diagnostic information.
Ramy Medhat31ec9422020-04-17 15:03:58 -0400197 sAbiDump, sAbiDumpRE = remoteexec.StaticRules(pctx, "sAbiDump",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800198 blueprint.RuleParams{
Ramy Medhat31ec9422020-04-17 15:03:58 -0400199 Command: "rm -f $out && $reTemplate$sAbiDumper -o ${out} $in $exportDirs -- $cFlags -w -isystem prebuilts/clang-tools/${config.HostPrebuiltTag}/clang-headers",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800200 CommandDeps: []string{"$sAbiDumper"},
Ramy Medhat31ec9422020-04-17 15:03:58 -0400201 }, &remoteexec.REParams{
202 Labels: map[string]string{"type": "abi-dump", "tool": "header-abi-dumper"},
203 ExecStrategy: "${config.REAbiDumperExecStrategy}",
204 Platform: map[string]string{
205 remoteexec.PoolKey: "${config.RECXXPool}",
206 "InputRootAbsolutePath": android.AbsSrcDirForExistingUseCases(),
207 },
208 }, []string{"cFlags", "exportDirs"}, nil)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800209
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800210 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800211
212 sAbiLink = pctx.AndroidStaticRule("sAbiLink",
213 blueprint.RuleParams{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800214 Command: "$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800215 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800216 Rspfile: "${out}.rsp",
217 RspfileContent: "${in}",
218 },
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800219 "symbolFilter", "arch", "exportedHeaderFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800220
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800221 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700222
Colin Cross2e2dbc22019-09-25 13:31:46 -0700223 sAbiDiff = pctx.RuleFunc("sAbiDiff",
Dan Willemsen54daaf02018-03-12 13:24:09 -0700224 func(ctx android.PackageRuleContext) blueprint.RuleParams {
Logan Chien2a65dda2019-10-01 15:58:07 -0700225 commandStr := "($sAbiDiffer ${extraFlags} -lib ${libName} -arch ${arch} -o ${out} -new ${in} -old ${referenceDump})"
Logan Chien6227fed2019-02-18 13:12:21 +0800226 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 Chien2a65dda2019-10-01 15:58:07 -0700234 "extraFlags", "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
Ramy Medhat31ec9422020-04-17 15:03:58 -0400570 dumpRule := sAbiDump
571 if ctx.Config().IsEnvTrue("RBE_ABI_DUMPER") {
572 dumpRule = sAbiDumpRE
573 }
Colin Crossae887032017-10-23 17:16:14 -0700574 ctx.Build(pctx, android.BuildParams{
Ramy Medhat31ec9422020-04-17 15:03:58 -0400575 Rule: dumpRule,
Colin Cross67a5c132017-05-09 13:45:28 -0700576 Description: "header-abi-dumper " + srcFile.Rel(),
577 Output: sAbiDumpFile,
578 Input: srcFile,
579 Implicit: objFile,
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700580 Implicits: cFlagsDeps,
581 OrderOnly: pathDeps,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800582 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800583 "cFlags": moduleToolingFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800584 "exportDirs": flags.sAbiFlags,
585 },
586 })
587 }
588
Colin Cross3f40fa42015-01-30 17:27:36 -0800589 }
590
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700591 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800592 objFiles: objFiles,
593 tidyFiles: tidyFiles,
594 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800595 sAbiDumpFiles: sAbiDumpFiles,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800596 kytheFiles: kytheFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700597 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800598}
599
600// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700601func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700602 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800603
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800604 arCmd := "${config.ClangBin}/llvm-ar"
Yi Kongee96a792019-09-06 15:11:57 -0700605 arFlags := "crsPD"
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800606 if !ctx.Darwin() {
607 arFlags += " -format=gnu"
608 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800609
Colin Crossae887032017-10-23 17:16:14 -0700610 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700611 Rule: ar,
612 Description: "static link " + outputFile.Base(),
613 Output: outputFile,
614 Inputs: objFiles,
615 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800616 Args: map[string]string{
617 "arFlags": arFlags,
618 "arCmd": arCmd,
619 },
620 })
621}
622
623// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700624// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700625func TransformObjToDynamicBinary(ctx android.ModuleContext,
626 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
Josh Gao75a50a22019-06-07 17:58:59 -0700627 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath, implicitOutputs android.WritablePaths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800628
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700629 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800630
Colin Cross3f40fa42015-01-30 17:27:36 -0800631 var libFlagsList []string
632
Colin Cross16b23492016-01-06 14:41:07 -0800633 if len(flags.libFlags) > 0 {
634 libFlagsList = append(libFlagsList, flags.libFlags)
635 }
636
Colin Cross3f40fa42015-01-30 17:27:36 -0800637 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800638 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700639 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700640 } else {
641 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700642 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700643 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
644 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800645 }
646
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,--start-group")
649 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700650 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800651 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800652 libFlagsList = append(libFlagsList, "-Wl,--end-group")
653 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800654
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,--start-group")
657 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700658 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700659 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700660 libFlagsList = append(libFlagsList, "-Wl,--end-group")
661 }
662
Colin Cross3f40fa42015-01-30 17:27:36 -0800663 for _, lib := range sharedLibs {
Josh Gao75a50a22019-06-07 17:58:59 -0700664 libFile := lib.String()
665 if ctx.Windows() {
666 libFile = pathtools.ReplaceExtension(libFile, "lib")
667 }
668 libFlagsList = append(libFlagsList, libFile)
Colin Cross3f40fa42015-01-30 17:27:36 -0800669 }
670
Colin Cross3f40fa42015-01-30 17:27:36 -0800671 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700672 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800673 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700674 if crtBegin.Valid() {
675 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800676 }
677
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400678 rule := ld
679 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
680 rule = ldRE
681 }
682
Colin Crossae887032017-10-23 17:16:14 -0700683 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400684 Rule: rule,
Josh Gao75a50a22019-06-07 17:58:59 -0700685 Description: "link " + outputFile.Base(),
686 Output: outputFile,
687 ImplicitOutputs: implicitOutputs,
688 Inputs: objFiles,
689 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800690 Args: map[string]string{
Pete Bentley99f2fc22019-08-02 14:02:20 +0100691 "ldCmd": ldCmd,
692 "crtBegin": crtBegin.String(),
693 "libFlags": strings.Join(libFlagsList, " "),
694 "extraLibFlags": flags.extraLibFlags,
Colin Cross6d88dba2019-11-06 07:06:58 -0800695 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
Pete Bentley99f2fc22019-08-02 14:02:20 +0100696 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800697 },
698 })
699}
700
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800701// Generate a rule to combine .dump sAbi dump files from multiple source files
702// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700703func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800704 baseName, exportedHeaderFlags string, symbolFile android.OptionalPath,
705 excludedSymbolVersions, excludedSymbolTags []string) android.OptionalPath {
706
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800707 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800708
709 implicits := android.Paths{soFile}
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800710 symbolFilterStr := "-so " + soFile.String()
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800711
712 if symbolFile.Valid() {
713 implicits = append(implicits, symbolFile.Path())
714 symbolFilterStr += " -v " + symbolFile.String()
715 }
716 for _, ver := range excludedSymbolVersions {
717 symbolFilterStr += " --exclude-symbol-version " + ver
718 }
719 for _, tag := range excludedSymbolTags {
720 symbolFilterStr += " --exclude-symbol-tag " + tag
721 }
Colin Crossae887032017-10-23 17:16:14 -0700722 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700723 Rule: sAbiLink,
724 Description: "header-abi-linker " + outputFile.Base(),
725 Output: outputFile,
726 Inputs: sAbiDumps,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800727 Implicits: implicits,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800728 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800729 "symbolFilter": symbolFilterStr,
730 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800731 "exportedHeaderFlags": exportedHeaderFlags,
732 },
733 })
734 return android.OptionalPathForPath(outputFile)
735}
736
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700737func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
738 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700739 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700740 Rule: unzipRefSAbiDump,
741 Description: "gunzip" + outputFile.Base(),
742 Output: outputFile,
743 Input: zippedRefDump,
744 })
745 return outputFile
746}
747
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800748func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chien2a65dda2019-10-01 15:58:07 -0700749 baseName, exportedHeaderFlags string, checkAllApis, isLlndk, isNdk, isVndkExt bool) android.OptionalPath {
Logan Chienf3511742017-10-31 18:04:35 +0800750
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800751 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700752 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Logan Chien6227fed2019-02-18 13:12:21 +0800753 createReferenceDumpFlags := ""
754
Logan Chien2a65dda2019-10-01 15:58:07 -0700755 var extraFlags []string
756 if checkAllApis {
757 extraFlags = append(extraFlags, "-check-all-apis")
758 } else {
759 extraFlags = append(extraFlags,
760 "-allow-unreferenced-changes",
761 "-allow-unreferenced-elf-symbol-changes")
Jayant Chowdharye4499502018-01-17 13:13:33 -0800762 }
Logan Chien2a65dda2019-10-01 15:58:07 -0700763
764 if exportedHeaderFlags == "" {
765 extraFlags = append(extraFlags, "-advice-only")
766 }
767
Logan Chien62f1f942019-02-18 15:40:42 +0800768 if isLlndk || isNdk {
Logan Chien6227fed2019-02-18 13:12:21 +0800769 createReferenceDumpFlags = "--llndk"
Logan Chien62f1f942019-02-18 15:40:42 +0800770 if isLlndk {
771 // TODO(b/130324828): "-consider-opaque-types-different" should apply to
772 // both LLNDK and NDK shared libs. However, a known issue in header-abi-diff
773 // breaks libaaudio. Remove the if-guard after the issue is fixed.
Logan Chien2a65dda2019-10-01 15:58:07 -0700774 extraFlags = append(extraFlags, "-consider-opaque-types-different")
Logan Chien62f1f942019-02-18 15:40:42 +0800775 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700776 }
Logan Chienf3511742017-10-31 18:04:35 +0800777 if isVndkExt {
Logan Chien2a65dda2019-10-01 15:58:07 -0700778 extraFlags = append(extraFlags, "-allow-extensions")
Logan Chienf3511742017-10-31 18:04:35 +0800779 }
780
Colin Crossae887032017-10-23 17:16:14 -0700781 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700782 Rule: sAbiDiff,
783 Description: "header-abi-diff " + outputFile.Base(),
784 Output: outputFile,
785 Input: inputDump,
786 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800787 Args: map[string]string{
Logan Chien6227fed2019-02-18 13:12:21 +0800788 "referenceDump": referenceDump.String(),
789 "libName": libName,
790 "arch": ctx.Arch().ArchType.Name,
Logan Chien2a65dda2019-10-01 15:58:07 -0700791 "extraFlags": strings.Join(extraFlags, " "),
Logan Chien6227fed2019-02-18 13:12:21 +0800792 "createReferenceDumpFlags": createReferenceDumpFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800793 },
794 })
795 return android.OptionalPathForPath(outputFile)
796}
797
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700798// Generate a rule for extracting a table of contents from a shared library (.so)
799func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700800 outputFile android.WritablePath, flags builderFlags) {
801
Colin Crossb496cfd2018-09-10 16:50:05 -0700802 var format string
803 var crossCompile string
804 if ctx.Darwin() {
805 format = "--macho"
806 crossCompile = "${config.MacToolPath}"
807 } else if ctx.Windows() {
808 format = "--pe"
809 crossCompile = gccCmd(flags.toolchain, "")
810 } else {
811 format = "--elf"
812 crossCompile = gccCmd(flags.toolchain, "")
813 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700814
Colin Crossae887032017-10-23 17:16:14 -0700815 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700816 Rule: toc,
817 Description: "generate toc " + inputFile.Base(),
818 Output: outputFile,
819 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700820 Args: map[string]string{
821 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700822 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700823 },
824 })
825}
826
Colin Cross3f40fa42015-01-30 17:27:36 -0800827// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700828func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700829 flags builderFlags, outputFile android.WritablePath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800830
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700831 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800832
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400833 rule := partialLd
834 args := map[string]string{
835 "ldCmd": ldCmd,
836 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
837 }
838 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
839 rule = partialLdRE
840 args["inCommaList"] = strings.Join(objFiles.Strings(), ",")
841 }
Colin Crossae887032017-10-23 17:16:14 -0700842 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400843 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700844 Description: "link " + outputFile.Base(),
845 Output: outputFile,
846 Inputs: objFiles,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700847 Implicits: deps,
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400848 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800849 })
850}
851
Colin Crossbfae8852015-03-26 14:44:11 -0700852// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700853func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
854 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700855
856 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
857
Colin Crossae887032017-10-23 17:16:14 -0700858 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700859 Rule: prefixSymbols,
860 Description: "prefix symbols " + outputFile.Base(),
861 Output: outputFile,
862 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700863 Args: map[string]string{
864 "objcopyCmd": objcopyCmd,
865 "prefix": prefix,
866 },
867 })
868}
869
Colin Cross635c3b02016-05-18 15:37:25 -0700870func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
871 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700872
873 crossCompile := gccCmd(flags.toolchain, "")
874 args := ""
875 if flags.stripAddGnuDebuglink {
876 args += " --add-gnu-debuglink"
877 }
878 if flags.stripKeepMiniDebugInfo {
879 args += " --keep-mini-debug-info"
880 }
881 if flags.stripKeepSymbols {
882 args += " --keep-symbols"
883 }
Yi Kongacee27c2019-03-29 20:05:14 -0700884 if flags.stripKeepSymbolsList != "" {
885 args += " -k" + flags.stripKeepSymbolsList
886 }
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700887 if flags.stripKeepSymbolsAndDebugFrame {
888 args += " --keep-symbols-and-debug-frame"
889 }
Yi Kongb5c34d72018-11-07 16:28:49 -0800890 if flags.stripUseGnuStrip {
891 args += " --use-gnu-strip"
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700892 }
Colin Cross665dce92016-04-28 14:50:03 -0700893
Colin Crossae887032017-10-23 17:16:14 -0700894 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700895 Rule: strip,
896 Description: "strip " + outputFile.Base(),
897 Output: outputFile,
898 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700899 Args: map[string]string{
900 "crossCompile": crossCompile,
901 "args": args,
902 },
903 })
904}
905
Colin Cross635c3b02016-05-18 15:37:25 -0700906func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
907 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700908
Colin Crossae887032017-10-23 17:16:14 -0700909 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700910 Rule: darwinStrip,
911 Description: "strip " + outputFile.Base(),
912 Output: outputFile,
913 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700914 })
915}
916
Oliver Nguyenc7434142019-04-24 14:22:25 -0700917func TransformCoverageFilesToZip(ctx android.ModuleContext,
918 inputs Objects, baseName string) android.OptionalPath {
Dan Willemsen581341d2017-02-09 16:16:31 -0800919
920 if len(inputs.coverageFiles) > 0 {
Oliver Nguyenc7434142019-04-24 14:22:25 -0700921 outputFile := android.PathForModuleOut(ctx, baseName+".zip")
Dan Willemsen581341d2017-02-09 16:16:31 -0800922
Oliver Nguyenc7434142019-04-24 14:22:25 -0700923 ctx.Build(pctx, android.BuildParams{
924 Rule: zip,
925 Description: "zip " + outputFile.Base(),
926 Inputs: inputs.coverageFiles,
927 Output: outputFile,
928 })
Dan Willemsen581341d2017-02-09 16:16:31 -0800929
930 return android.OptionalPathForPath(outputFile)
931 }
932
933 return android.OptionalPath{}
934}
935
Yi Kongc49c3932019-10-15 02:01:19 -0700936func TransformArchiveRepack(ctx android.ModuleContext, inputFile android.Path,
937 outputFile android.WritablePath, objects []string) {
938
939 ctx.Build(pctx, android.BuildParams{
940 Rule: archiveRepack,
941 Description: "Repack archive " + outputFile.Base(),
942 Output: outputFile,
943 Input: inputFile,
944 Args: map[string]string{
945 "objects": strings.Join(objects, " "),
946 },
947 })
948}
949
Colin Crossb98c8b02016-07-29 13:44:28 -0700950func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800951 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
952}
Colin Cross0af4b842015-04-30 16:36:18 -0700953
Colin Cross5b529592017-05-09 13:34:34 -0700954func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700955 var i int
956
957 start := 0
958 bytes := 0
959 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700960 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700961 if l > limit {
962 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
963 }
964 if bytes+l > limit {
965 lists = append(lists, list[start:i])
966 start = i
967 bytes = 0
968 }
969 bytes += l + 1 // count a space between each list element
970 }
971
972 lists = append(lists, list[start:])
973
974 totalLen := 0
975 for _, l := range lists {
976 totalLen += len(l)
977 }
978 if totalLen != len(list) {
979 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
980 }
981 return lists, nil
982}