blob: 4e8f1fa59ee64a310b7e3e7dfdaafa45988fa146 [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",
Kousik Kumar3fb61262020-04-22 13:31:09 -070074 OutputFiles: []string{"${out}", "$implicitOutputs"},
Ramy Medhat9a90fe52020-04-13 13:21:23 -040075 ToolchainInputs: []string{"$ldCmd"},
76 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXLinksPool}"},
Kousik Kumar3fb61262020-04-22 13:31:09 -070077 }, []string{"ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags", "extraLibFlags"}, []string{"implicitOutputs"})
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{
Kousik Kumar3fb61262020-04-22 13:31:09 -070086 Labels: map[string]string{"type": "link", "tool": "clang"},
87 ExecStrategy: "${config.RECXXLinksExecStrategy}", Inputs: []string{"$inCommaList"},
88 OutputFiles: []string{"${out}", "$implicitOutputs"},
Ramy Medhat9a90fe52020-04-13 13:21:23 -040089 ToolchainInputs: []string{"$ldCmd"},
90 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXLinksPool}"},
Kousik Kumar3fb61262020-04-22 13:31:09 -070091 }, []string{"ldCmd", "ldFlags"}, []string{"inCommaList", "implicitOutputs"})
Colin Cross3f40fa42015-01-30 17:27:36 -080092
Colin Cross9d45bb72016-08-29 16:14:13 -070093 ar = pctx.AndroidStaticRule("ar",
Colin Cross3f40fa42015-01-30 17:27:36 -080094 blueprint.RuleParams{
Colin Cross7d21c442015-03-30 17:47:53 -070095 Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
Dan Willemsenc94a7682015-11-17 15:27:28 -080096 CommandDeps: []string{"$arCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070097 Rspfile: "${out}.rsp",
98 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080099 },
100 "arCmd", "arFlags")
101
Colin Cross9d45bb72016-08-29 16:14:13 -0700102 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700103 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -0700104 Command: "${config.MacStripPath} -u -r -o $out $in",
105 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700106 })
Colin Cross0af4b842015-04-30 16:36:18 -0700107
Colin Cross9d45bb72016-08-29 16:14:13 -0700108 prefixSymbols = pctx.AndroidStaticRule("prefixSymbols",
Colin Crossbfae8852015-03-26 14:44:11 -0700109 blueprint.RuleParams{
110 Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800111 CommandDeps: []string{"$objcopyCmd"},
Colin Crossbfae8852015-03-26 14:44:11 -0700112 },
113 "objcopyCmd", "prefix")
114
Nan Zhang43a485c2017-03-27 14:27:58 -0700115 _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh")
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800116 _ = pctx.SourcePathVariable("xzCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/xz")
Colin Cross665dce92016-04-28 14:50:03 -0700117
Colin Crossee3ea312019-05-17 15:36:46 -0700118 // 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 -0700119 // file descriptors on darwin. Limit concurrent calls to 5 on darwin.
Colin Crossee3ea312019-05-17 15:36:46 -0700120 darwinStripPool = func() blueprint.Pool {
121 if runtime.GOOS == "darwin" {
122 return pctx.StaticPool("darwinStripPool", blueprint.PoolParams{
Colin Crossbadf8d62019-05-22 13:25:50 -0700123 Depth: 5,
Colin Crossee3ea312019-05-17 15:36:46 -0700124 })
125 } else {
126 return nil
127 }
128 }()
129
Colin Cross9d45bb72016-08-29 16:14:13 -0700130 strip = pctx.AndroidStaticRule("strip",
Colin Cross665dce92016-04-28 14:50:03 -0700131 blueprint.RuleParams{
132 Depfile: "${out}.d",
133 Deps: blueprint.DepsGCC,
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700134 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 -0800135 CommandDeps: []string{"$stripPath", "$xzCmd"},
Colin Crossee3ea312019-05-17 15:36:46 -0700136 Pool: darwinStripPool,
Colin Cross665dce92016-04-28 14:50:03 -0700137 },
138 "args", "crossCompile")
139
Yi Kongc49c3932019-10-15 02:01:19 -0700140 _ = pctx.SourcePathVariable("archiveRepackPath", "build/soong/scripts/archive_repack.sh")
141
142 archiveRepack = pctx.AndroidStaticRule("archiveRepack",
143 blueprint.RuleParams{
144 Depfile: "${out}.d",
145 Deps: blueprint.DepsGCC,
146 Command: "CLANG_BIN=${config.ClangBin} $archiveRepackPath -i ${in} -o ${out} -d ${out}.d ${objects}",
147 CommandDeps: []string{"$archiveRepackPath"},
148 },
149 "objects")
150
Colin Cross9d45bb72016-08-29 16:14:13 -0700151 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700152 blueprint.RuleParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700153 Command: "rm -f $out && touch $out",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700154 })
155
Nan Zhang43a485c2017-03-27 14:27:58 -0700156 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700157
158 toc = pctx.AndroidStaticRule("toc",
159 blueprint.RuleParams{
160 Depfile: "${out}.d",
161 Deps: blueprint.DepsGCC,
Colin Crossb496cfd2018-09-10 16:50:05 -0700162 Command: "CROSS_COMPILE=$crossCompile $tocPath $format -i ${in} -o ${out} -d ${out}.d",
Colin Cross26c34ed2016-09-30 17:10:16 -0700163 CommandDeps: []string{"$tocPath"},
164 Restat: true,
165 },
Colin Crossb496cfd2018-09-10 16:50:05 -0700166 "crossCompile", "format")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700167
168 clangTidy = pctx.AndroidStaticRule("clangTidy",
169 blueprint.RuleParams{
George Burgess IVc4624c02019-04-04 16:22:37 -0700170 Command: "rm -f $out && ${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out",
171 CommandDeps: []string{"${config.ClangBin}/clang-tidy"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700172 },
173 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800174
Nan Zhang43a485c2017-03-27 14:27:58 -0700175 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800176
177 yasm = pctx.AndroidStaticRule("yasm",
178 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700179 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800180 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700181 Depfile: "$out.d",
182 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800183 },
184 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800185
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700186 windres = pctx.AndroidStaticRule("windres",
187 blueprint.RuleParams{
Nick Desaulniers18eeffa2020-01-29 16:20:11 -0800188 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 -0700189 CommandDeps: []string{"$windresCmd"},
190 },
191 "windresCmd", "flags")
192
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800193 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800194
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700195 // -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 -0400196 sAbiDump, sAbiDumpRE = remoteexec.StaticRules(pctx, "sAbiDump",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800197 blueprint.RuleParams{
Ramy Medhat31ec9422020-04-17 15:03:58 -0400198 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 -0800199 CommandDeps: []string{"$sAbiDumper"},
Ramy Medhat31ec9422020-04-17 15:03:58 -0400200 }, &remoteexec.REParams{
201 Labels: map[string]string{"type": "abi-dump", "tool": "header-abi-dumper"},
202 ExecStrategy: "${config.REAbiDumperExecStrategy}",
203 Platform: map[string]string{
204 remoteexec.PoolKey: "${config.RECXXPool}",
205 "InputRootAbsolutePath": android.AbsSrcDirForExistingUseCases(),
206 },
207 }, []string{"cFlags", "exportDirs"}, nil)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800208
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 {
Logan Chien2a65dda2019-10-01 15:58:07 -0700224 commandStr := "($sAbiDiffer ${extraFlags} -lib ${libName} -arch ${arch} -o ${out} -new ${in} -old ${referenceDump})"
Logan Chien6227fed2019-02-18 13:12:21 +0800225 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 +0800226 commandStr += " && (mkdir -p $$DIST_DIR/abidiffs && cp ${out} $$DIST_DIR/abidiffs/)"
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800227 commandStr += " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800228 return blueprint.RuleParams{
229 Command: commandStr,
230 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700231 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800232 },
Logan Chien2a65dda2019-10-01 15:58:07 -0700233 "extraFlags", "referenceDump", "libName", "arch", "createReferenceDumpFlags")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700234
235 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
236 blueprint.RuleParams{
237 Command: "gunzip -c $in > $out",
238 })
Oliver Nguyenc7434142019-04-24 14:22:25 -0700239
240 zip = pctx.AndroidStaticRule("zip",
241 blueprint.RuleParams{
242 Command: "cat $out.rsp | tr ' ' '\\n' | tr -d \\' | sort -u > ${out}.tmp && ${SoongZipCmd} -o ${out} -C $$OUT_DIR -l ${out}.tmp",
243 CommandDeps: []string{"${SoongZipCmd}"},
244 Rspfile: "$out.rsp",
245 RspfileContent: "$in",
246 })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800247
248 _ = pctx.SourcePathVariable("cxxExtractor",
249 "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/cxx_extractor")
Sasha Smundak65143642019-09-26 20:14:28 -0700250 _ = pctx.SourcePathVariable("kytheVnames", "build/soong/vnames.json")
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800251 _ = pctx.VariableFunc("kytheCorpus",
252 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCorpusName() })
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800253 _ = pctx.VariableFunc("kytheCuEncoding",
254 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCuEncoding() })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800255 kytheExtract = pctx.StaticRule("kythe",
256 blueprint.RuleParams{
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800257 Command: `rm -f $out && ` +
Sasha Smundaka4ef83b2020-04-21 17:08:35 -0700258 `KYTHE_CORPUS=${kytheCorpus} ` +
259 `KYTHE_OUTPUT_FILE=$out ` +
260 `KYTHE_VNAMES=$kytheVnames ` +
261 `KYTHE_KZIP_ENCODING=${kytheCuEncoding} ` +
262 `KYTHE_CANONICALIZE_VNAME_PATHS=prefer-relative ` +
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800263 `$cxxExtractor $cFlags $in `,
Sasha Smundak65143642019-09-26 20:14:28 -0700264 CommandDeps: []string{"$cxxExtractor", "$kytheVnames"},
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800265 },
266 "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -0800267)
268
Dan Willemsen322a0a62015-11-17 15:19:46 -0800269func init() {
270 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
271 // debug output. That way two builds in two different directories will
272 // create the same output.
273 if runtime.GOOS != "darwin" {
274 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
275 } else {
276 // Darwin doesn't have /proc
277 pctx.StaticVariable("relPwd", "")
278 }
Oliver Nguyenc7434142019-04-24 14:22:25 -0700279
280 pctx.HostBinToolVariable("SoongZipCmd", "soong_zip")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400281 pctx.Import("android/soong/remoteexec")
Dan Willemsen322a0a62015-11-17 15:19:46 -0800282}
283
Colin Cross3f40fa42015-01-30 17:27:36 -0800284type builderFlags struct {
Colin Cross6d88dba2019-11-06 07:06:58 -0800285 globalCommonFlags string
286 globalAsFlags string
287 globalYasmFlags string
288 globalCFlags string
289 globalToolingCFlags string // A separate set of cFlags for clang LibTooling tools
290 globalToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
291 globalConlyFlags string
292 globalCppFlags string
293 globalLdFlags string
294
295 localCommonFlags string
296 localAsFlags string
297 localYasmFlags string
298 localCFlags string
299 localToolingCFlags string // A separate set of cFlags for clang LibTooling tools
300 localToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
301 localConlyFlags string
302 localCppFlags string
303 localLdFlags string
304
305 libFlags string
306 extraLibFlags string
307 tidyFlags string
308 sAbiFlags string
309 aidlFlags string
310 rsFlags string
311 toolchain config.Toolchain
312 tidy bool
Oliver Nguyen04526782020-04-21 12:40:27 -0700313 gcovCoverage bool
Colin Cross6d88dba2019-11-06 07:06:58 -0800314 sAbiDump bool
315 emitXrefs bool
Colin Cross665dce92016-04-28 14:50:03 -0700316
Dan Willemsen98ab3112019-08-27 21:20:40 -0700317 assemblerWithCpp bool
318
Colin Crossc3199482017-03-30 15:03:04 -0700319 systemIncludeFlags string
320
Colin Cross18c0c5a2016-12-01 14:45:23 -0800321 groupStaticLibs bool
322
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700323 stripKeepSymbols bool
324 stripKeepSymbolsList string
325 stripKeepSymbolsAndDebugFrame bool
326 stripKeepMiniDebugInfo bool
327 stripAddGnuDebuglink bool
328 stripUseGnuStrip bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800329
Colin Cross19878da2019-03-28 14:45:07 -0700330 proto android.ProtoFlags
Dan Willemsen60e62f02018-11-16 21:05:32 -0800331 protoC bool
332 protoOptionsFile bool
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700333
334 yacc *YaccProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800335}
336
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700337type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800338 objFiles android.Paths
339 tidyFiles android.Paths
340 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800341 sAbiDumpFiles android.Paths
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800342 kytheFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700343}
344
345func (a Objects) Copy() Objects {
346 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800347 objFiles: append(android.Paths{}, a.objFiles...),
348 tidyFiles: append(android.Paths{}, a.tidyFiles...),
349 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800350 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800351 kytheFiles: append(android.Paths{}, a.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700352 }
353}
354
355func (a Objects) Append(b Objects) Objects {
356 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800357 objFiles: append(a.objFiles, b.objFiles...),
358 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
359 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800360 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800361 kytheFiles: append(a.kytheFiles, b.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700362 }
363}
364
Colin Cross3f40fa42015-01-30 17:27:36 -0800365// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700366func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800367 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700368
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700369 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700370 var tidyFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700371 if flags.tidy {
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700372 tidyFiles = make(android.Paths, 0, len(srcFiles))
373 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800374 var coverageFiles android.Paths
Oliver Nguyen04526782020-04-21 12:40:27 -0700375 if flags.gcovCoverage {
Dan Willemsen581341d2017-02-09 16:16:31 -0800376 coverageFiles = make(android.Paths, 0, len(srcFiles))
377 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800378 var kytheFiles android.Paths
379 if flags.emitXrefs {
380 kytheFiles = make(android.Paths, 0, len(srcFiles))
381 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800382
Colin Cross6d88dba2019-11-06 07:06:58 -0800383 // Produce fully expanded flags for use by C tools, C compiles, C++ tools, C++ compiles, and asm compiles
384 // respectively.
385 toolingCflags := flags.globalCommonFlags + " " +
386 flags.globalToolingCFlags + " " +
387 flags.globalConlyFlags + " " +
388 flags.localCommonFlags + " " +
389 flags.localToolingCFlags + " " +
390 flags.localConlyFlags + " " +
391 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700392
Colin Cross6d88dba2019-11-06 07:06:58 -0800393 cflags := flags.globalCommonFlags + " " +
394 flags.globalCFlags + " " +
395 flags.globalConlyFlags + " " +
396 flags.localCommonFlags + " " +
397 flags.localCFlags + " " +
398 flags.localConlyFlags + " " +
399 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700400
Colin Cross6d88dba2019-11-06 07:06:58 -0800401 toolingCppflags := flags.globalCommonFlags + " " +
402 flags.globalToolingCFlags + " " +
403 flags.globalToolingCppFlags + " " +
404 flags.localCommonFlags + " " +
405 flags.localToolingCFlags + " " +
406 flags.localToolingCppFlags + " " +
407 flags.systemIncludeFlags
Colin Crossc3199482017-03-30 15:03:04 -0700408
Colin Cross6d88dba2019-11-06 07:06:58 -0800409 cppflags := flags.globalCommonFlags + " " +
410 flags.globalCFlags + " " +
411 flags.globalCppFlags + " " +
412 flags.localCommonFlags + " " +
413 flags.localCFlags + " " +
414 flags.localCppFlags + " " +
415 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700416
Colin Cross6d88dba2019-11-06 07:06:58 -0800417 asflags := flags.globalCommonFlags + " " +
418 flags.globalAsFlags + " " +
419 flags.localCommonFlags + " " +
420 flags.localAsFlags + " " +
421 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700422
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800423 var sAbiDumpFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700424 if flags.sAbiDump {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800425 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
426 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800427
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700428 cflags += " ${config.NoOverrideClangGlobalCflags}"
429 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
430 cppflags += " ${config.NoOverrideClangGlobalCflags}"
431 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800432
Colin Cross3f40fa42015-01-30 17:27:36 -0800433 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700434 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800435
436 objFiles[i] = objFile
437
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700438 switch srcFile.Ext() {
439 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700440 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700441 Rule: yasm,
442 Description: "yasm " + srcFile.Rel(),
443 Output: objFile,
444 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800445 Implicits: cFlagsDeps,
446 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800447 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800448 "asFlags": flags.globalYasmFlags + " " + flags.localYasmFlags,
Colin Cross91e90042016-12-02 17:13:24 -0800449 },
450 })
451 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700452 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700453 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700454 Rule: windres,
455 Description: "windres " + srcFile.Rel(),
456 Output: objFile,
457 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800458 Implicits: cFlagsDeps,
459 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700460 Args: map[string]string{
461 "windresCmd": gccCmd(flags.toolchain, "windres"),
462 "flags": flags.toolchain.WindresFlags(),
463 },
464 })
465 continue
Pete Bentleyfcf55bf2019-08-16 20:14:32 +0100466 case ".o":
467 objFiles[i] = srcFile
468 continue
Colin Cross91e90042016-12-02 17:13:24 -0800469 }
470
Colin Cross6d88dba2019-11-06 07:06:58 -0800471 var moduleFlags string
472 var moduleToolingFlags string
473
Colin Cross3f40fa42015-01-30 17:27:36 -0800474 var ccCmd string
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700475 tidy := flags.tidy
Oliver Nguyen04526782020-04-21 12:40:27 -0700476 coverage := flags.gcovCoverage
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700477 dump := flags.sAbiDump
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800478 rule := cc
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800479 emitXref := flags.emitXrefs
Colin Cross3f40fa42015-01-30 17:27:36 -0800480
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700481 switch srcFile.Ext() {
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800482 case ".s":
Dan Willemsen98ab3112019-08-27 21:20:40 -0700483 if !flags.assemblerWithCpp {
484 rule = ccNoDeps
485 }
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800486 fallthrough
487 case ".S":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700488 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800489 moduleFlags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700490 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800491 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800492 dump = false
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800493 emitXref = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800494 case ".c":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700495 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800496 moduleFlags = cflags
497 moduleToolingFlags = toolingCflags
Colin Crossd34ab7c2019-06-27 14:46:10 -0700498 case ".cpp", ".cc", ".cxx", ".mm":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700499 ccCmd = "clang++"
Colin Cross6d88dba2019-11-06 07:06:58 -0800500 moduleFlags = cppflags
501 moduleToolingFlags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800502 default:
503 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
504 continue
505 }
506
Colin Cross67a5c132017-05-09 13:45:28 -0700507 ccDesc := ccCmd
508
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700509 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800510
Dan Willemsen581341d2017-02-09 16:16:31 -0800511 var implicitOutputs android.WritablePaths
512 if coverage {
513 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
514 implicitOutputs = append(implicitOutputs, gcnoFile)
515 coverageFiles = append(coverageFiles, gcnoFile)
516 }
517
Colin Crossae887032017-10-23 17:16:14 -0700518 ctx.Build(pctx, android.BuildParams{
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800519 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700520 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800521 Output: objFile,
522 ImplicitOutputs: implicitOutputs,
523 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800524 Implicits: cFlagsDeps,
525 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800526 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800527 "cFlags": moduleFlags,
Colin Cross28344522015-04-22 13:07:53 -0700528 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800529 },
530 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700531
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800532 if emitXref {
533 kytheFile := android.ObjPathWithExt(ctx, subdir, srcFile, "kzip")
534 ctx.Build(pctx, android.BuildParams{
535 Rule: kytheExtract,
536 Description: "Xref C++ extractor " + srcFile.Rel(),
537 Output: kytheFile,
538 Input: srcFile,
539 Implicits: cFlagsDeps,
540 OrderOnly: pathDeps,
541 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800542 "cFlags": moduleFlags,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800543 },
544 })
545 kytheFiles = append(kytheFiles, kytheFile)
546 }
547
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700548 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700549 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700550 tidyFiles = append(tidyFiles, tidyFile)
551
Colin Crossae887032017-10-23 17:16:14 -0700552 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700553 Rule: clangTidy,
554 Description: "clang-tidy " + srcFile.Rel(),
555 Output: tidyFile,
556 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700557 // We must depend on objFile, since clang-tidy doesn't
558 // support exporting dependencies.
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700559 Implicit: objFile,
560 Implicits: cFlagsDeps,
561 OrderOnly: pathDeps,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700562 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800563 "cFlags": moduleToolingFlags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700564 "tidyFlags": flags.tidyFlags,
565 },
566 })
567 }
568
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800569 if dump {
570 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
571 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
572
Ramy Medhat31ec9422020-04-17 15:03:58 -0400573 dumpRule := sAbiDump
574 if ctx.Config().IsEnvTrue("RBE_ABI_DUMPER") {
575 dumpRule = sAbiDumpRE
576 }
Colin Crossae887032017-10-23 17:16:14 -0700577 ctx.Build(pctx, android.BuildParams{
Ramy Medhat31ec9422020-04-17 15:03:58 -0400578 Rule: dumpRule,
Colin Cross67a5c132017-05-09 13:45:28 -0700579 Description: "header-abi-dumper " + srcFile.Rel(),
580 Output: sAbiDumpFile,
581 Input: srcFile,
582 Implicit: objFile,
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700583 Implicits: cFlagsDeps,
584 OrderOnly: pathDeps,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800585 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800586 "cFlags": moduleToolingFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800587 "exportDirs": flags.sAbiFlags,
588 },
589 })
590 }
591
Colin Cross3f40fa42015-01-30 17:27:36 -0800592 }
593
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700594 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800595 objFiles: objFiles,
596 tidyFiles: tidyFiles,
597 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800598 sAbiDumpFiles: sAbiDumpFiles,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800599 kytheFiles: kytheFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700600 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800601}
602
603// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700604func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700605 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800606
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800607 arCmd := "${config.ClangBin}/llvm-ar"
Yi Kongee96a792019-09-06 15:11:57 -0700608 arFlags := "crsPD"
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800609 if !ctx.Darwin() {
610 arFlags += " -format=gnu"
611 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800612
Colin Crossae887032017-10-23 17:16:14 -0700613 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700614 Rule: ar,
615 Description: "static link " + outputFile.Base(),
616 Output: outputFile,
617 Inputs: objFiles,
618 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800619 Args: map[string]string{
620 "arFlags": arFlags,
621 "arCmd": arCmd,
622 },
623 })
624}
625
626// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700627// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700628func TransformObjToDynamicBinary(ctx android.ModuleContext,
629 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
Josh Gao75a50a22019-06-07 17:58:59 -0700630 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath, implicitOutputs android.WritablePaths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800631
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700632 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800633
Colin Cross3f40fa42015-01-30 17:27:36 -0800634 var libFlagsList []string
635
Colin Cross16b23492016-01-06 14:41:07 -0800636 if len(flags.libFlags) > 0 {
637 libFlagsList = append(libFlagsList, flags.libFlags)
638 }
639
Colin Cross3f40fa42015-01-30 17:27:36 -0800640 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800641 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700642 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700643 } else {
644 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700645 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700646 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
647 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800648 }
649
Colin Cross7a7cf972016-12-05 18:47:39 -0800650 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800651 libFlagsList = append(libFlagsList, "-Wl,--start-group")
652 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700653 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800654 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800655 libFlagsList = append(libFlagsList, "-Wl,--end-group")
656 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800657
Stephen Hines10347862016-07-18 15:54:54 -0700658 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700659 libFlagsList = append(libFlagsList, "-Wl,--start-group")
660 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700661 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700662 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700663 libFlagsList = append(libFlagsList, "-Wl,--end-group")
664 }
665
Colin Cross3f40fa42015-01-30 17:27:36 -0800666 for _, lib := range sharedLibs {
Josh Gao75a50a22019-06-07 17:58:59 -0700667 libFile := lib.String()
668 if ctx.Windows() {
669 libFile = pathtools.ReplaceExtension(libFile, "lib")
670 }
671 libFlagsList = append(libFlagsList, libFile)
Colin Cross3f40fa42015-01-30 17:27:36 -0800672 }
673
Colin Cross3f40fa42015-01-30 17:27:36 -0800674 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700675 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800676 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700677 if crtBegin.Valid() {
678 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800679 }
680
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400681 rule := ld
Kousik Kumar3fb61262020-04-22 13:31:09 -0700682 args := map[string]string{
683 "ldCmd": ldCmd,
684 "crtBegin": crtBegin.String(),
685 "libFlags": strings.Join(libFlagsList, " "),
686 "extraLibFlags": flags.extraLibFlags,
687 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
688 "crtEnd": crtEnd.String(),
689 }
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400690 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
691 rule = ldRE
Kousik Kumar3fb61262020-04-22 13:31:09 -0700692 args["implicitOutputs"] = strings.Join(implicitOutputs.Strings(), ",")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400693 }
694
Colin Crossae887032017-10-23 17:16:14 -0700695 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400696 Rule: rule,
Josh Gao75a50a22019-06-07 17:58:59 -0700697 Description: "link " + outputFile.Base(),
698 Output: outputFile,
699 ImplicitOutputs: implicitOutputs,
700 Inputs: objFiles,
701 Implicits: deps,
Kousik Kumar3fb61262020-04-22 13:31:09 -0700702 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800703 })
704}
705
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800706// Generate a rule to combine .dump sAbi dump files from multiple source files
707// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700708func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800709 baseName, exportedHeaderFlags string, symbolFile android.OptionalPath,
710 excludedSymbolVersions, excludedSymbolTags []string) android.OptionalPath {
711
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800712 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800713
714 implicits := android.Paths{soFile}
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800715 symbolFilterStr := "-so " + soFile.String()
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800716
717 if symbolFile.Valid() {
718 implicits = append(implicits, symbolFile.Path())
719 symbolFilterStr += " -v " + symbolFile.String()
720 }
721 for _, ver := range excludedSymbolVersions {
722 symbolFilterStr += " --exclude-symbol-version " + ver
723 }
724 for _, tag := range excludedSymbolTags {
725 symbolFilterStr += " --exclude-symbol-tag " + tag
726 }
Colin Crossae887032017-10-23 17:16:14 -0700727 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700728 Rule: sAbiLink,
729 Description: "header-abi-linker " + outputFile.Base(),
730 Output: outputFile,
731 Inputs: sAbiDumps,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800732 Implicits: implicits,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800733 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800734 "symbolFilter": symbolFilterStr,
735 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800736 "exportedHeaderFlags": exportedHeaderFlags,
737 },
738 })
739 return android.OptionalPathForPath(outputFile)
740}
741
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700742func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
743 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700744 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700745 Rule: unzipRefSAbiDump,
746 Description: "gunzip" + outputFile.Base(),
747 Output: outputFile,
748 Input: zippedRefDump,
749 })
750 return outputFile
751}
752
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800753func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chien2a65dda2019-10-01 15:58:07 -0700754 baseName, exportedHeaderFlags string, checkAllApis, isLlndk, isNdk, isVndkExt bool) android.OptionalPath {
Logan Chienf3511742017-10-31 18:04:35 +0800755
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800756 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700757 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Logan Chien6227fed2019-02-18 13:12:21 +0800758 createReferenceDumpFlags := ""
759
Logan Chien2a65dda2019-10-01 15:58:07 -0700760 var extraFlags []string
761 if checkAllApis {
762 extraFlags = append(extraFlags, "-check-all-apis")
763 } else {
764 extraFlags = append(extraFlags,
765 "-allow-unreferenced-changes",
766 "-allow-unreferenced-elf-symbol-changes")
Jayant Chowdharye4499502018-01-17 13:13:33 -0800767 }
Logan Chien2a65dda2019-10-01 15:58:07 -0700768
769 if exportedHeaderFlags == "" {
770 extraFlags = append(extraFlags, "-advice-only")
771 }
772
Logan Chien62f1f942019-02-18 15:40:42 +0800773 if isLlndk || isNdk {
Logan Chien6227fed2019-02-18 13:12:21 +0800774 createReferenceDumpFlags = "--llndk"
Logan Chien62f1f942019-02-18 15:40:42 +0800775 if isLlndk {
776 // TODO(b/130324828): "-consider-opaque-types-different" should apply to
777 // both LLNDK and NDK shared libs. However, a known issue in header-abi-diff
778 // breaks libaaudio. Remove the if-guard after the issue is fixed.
Logan Chien2a65dda2019-10-01 15:58:07 -0700779 extraFlags = append(extraFlags, "-consider-opaque-types-different")
Logan Chien62f1f942019-02-18 15:40:42 +0800780 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700781 }
Logan Chienf3511742017-10-31 18:04:35 +0800782 if isVndkExt {
Logan Chien2a65dda2019-10-01 15:58:07 -0700783 extraFlags = append(extraFlags, "-allow-extensions")
Logan Chienf3511742017-10-31 18:04:35 +0800784 }
785
Colin Crossae887032017-10-23 17:16:14 -0700786 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700787 Rule: sAbiDiff,
788 Description: "header-abi-diff " + outputFile.Base(),
789 Output: outputFile,
790 Input: inputDump,
791 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800792 Args: map[string]string{
Logan Chien6227fed2019-02-18 13:12:21 +0800793 "referenceDump": referenceDump.String(),
794 "libName": libName,
795 "arch": ctx.Arch().ArchType.Name,
Logan Chien2a65dda2019-10-01 15:58:07 -0700796 "extraFlags": strings.Join(extraFlags, " "),
Logan Chien6227fed2019-02-18 13:12:21 +0800797 "createReferenceDumpFlags": createReferenceDumpFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800798 },
799 })
800 return android.OptionalPathForPath(outputFile)
801}
802
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700803// Generate a rule for extracting a table of contents from a shared library (.so)
804func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700805 outputFile android.WritablePath, flags builderFlags) {
806
Colin Crossb496cfd2018-09-10 16:50:05 -0700807 var format string
808 var crossCompile string
809 if ctx.Darwin() {
810 format = "--macho"
811 crossCompile = "${config.MacToolPath}"
812 } else if ctx.Windows() {
813 format = "--pe"
814 crossCompile = gccCmd(flags.toolchain, "")
815 } else {
816 format = "--elf"
817 crossCompile = gccCmd(flags.toolchain, "")
818 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700819
Colin Crossae887032017-10-23 17:16:14 -0700820 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700821 Rule: toc,
822 Description: "generate toc " + inputFile.Base(),
823 Output: outputFile,
824 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700825 Args: map[string]string{
826 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700827 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700828 },
829 })
830}
831
Colin Cross3f40fa42015-01-30 17:27:36 -0800832// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700833func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700834 flags builderFlags, outputFile android.WritablePath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800835
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700836 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800837
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400838 rule := partialLd
839 args := map[string]string{
840 "ldCmd": ldCmd,
841 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
842 }
843 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
844 rule = partialLdRE
845 args["inCommaList"] = strings.Join(objFiles.Strings(), ",")
846 }
Colin Crossae887032017-10-23 17:16:14 -0700847 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400848 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700849 Description: "link " + outputFile.Base(),
850 Output: outputFile,
851 Inputs: objFiles,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700852 Implicits: deps,
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400853 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800854 })
855}
856
Colin Crossbfae8852015-03-26 14:44:11 -0700857// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700858func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
859 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700860
861 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
862
Colin Crossae887032017-10-23 17:16:14 -0700863 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700864 Rule: prefixSymbols,
865 Description: "prefix symbols " + outputFile.Base(),
866 Output: outputFile,
867 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700868 Args: map[string]string{
869 "objcopyCmd": objcopyCmd,
870 "prefix": prefix,
871 },
872 })
873}
874
Colin Cross635c3b02016-05-18 15:37:25 -0700875func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
876 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700877
878 crossCompile := gccCmd(flags.toolchain, "")
879 args := ""
880 if flags.stripAddGnuDebuglink {
881 args += " --add-gnu-debuglink"
882 }
883 if flags.stripKeepMiniDebugInfo {
884 args += " --keep-mini-debug-info"
885 }
886 if flags.stripKeepSymbols {
887 args += " --keep-symbols"
888 }
Yi Kongacee27c2019-03-29 20:05:14 -0700889 if flags.stripKeepSymbolsList != "" {
890 args += " -k" + flags.stripKeepSymbolsList
891 }
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700892 if flags.stripKeepSymbolsAndDebugFrame {
893 args += " --keep-symbols-and-debug-frame"
894 }
Yi Kongb5c34d72018-11-07 16:28:49 -0800895 if flags.stripUseGnuStrip {
896 args += " --use-gnu-strip"
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700897 }
Colin Cross665dce92016-04-28 14:50:03 -0700898
Colin Crossae887032017-10-23 17:16:14 -0700899 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700900 Rule: strip,
901 Description: "strip " + outputFile.Base(),
902 Output: outputFile,
903 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700904 Args: map[string]string{
905 "crossCompile": crossCompile,
906 "args": args,
907 },
908 })
909}
910
Colin Cross635c3b02016-05-18 15:37:25 -0700911func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
912 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700913
Colin Crossae887032017-10-23 17:16:14 -0700914 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700915 Rule: darwinStrip,
916 Description: "strip " + outputFile.Base(),
917 Output: outputFile,
918 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700919 })
920}
921
Oliver Nguyenc7434142019-04-24 14:22:25 -0700922func TransformCoverageFilesToZip(ctx android.ModuleContext,
923 inputs Objects, baseName string) android.OptionalPath {
Dan Willemsen581341d2017-02-09 16:16:31 -0800924
925 if len(inputs.coverageFiles) > 0 {
Oliver Nguyenc7434142019-04-24 14:22:25 -0700926 outputFile := android.PathForModuleOut(ctx, baseName+".zip")
Dan Willemsen581341d2017-02-09 16:16:31 -0800927
Oliver Nguyenc7434142019-04-24 14:22:25 -0700928 ctx.Build(pctx, android.BuildParams{
929 Rule: zip,
930 Description: "zip " + outputFile.Base(),
931 Inputs: inputs.coverageFiles,
932 Output: outputFile,
933 })
Dan Willemsen581341d2017-02-09 16:16:31 -0800934
935 return android.OptionalPathForPath(outputFile)
936 }
937
938 return android.OptionalPath{}
939}
940
Yi Kongc49c3932019-10-15 02:01:19 -0700941func TransformArchiveRepack(ctx android.ModuleContext, inputFile android.Path,
942 outputFile android.WritablePath, objects []string) {
943
944 ctx.Build(pctx, android.BuildParams{
945 Rule: archiveRepack,
946 Description: "Repack archive " + outputFile.Base(),
947 Output: outputFile,
948 Input: inputFile,
949 Args: map[string]string{
950 "objects": strings.Join(objects, " "),
951 },
952 })
953}
954
Colin Crossb98c8b02016-07-29 13:44:28 -0700955func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800956 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
957}
Colin Cross0af4b842015-04-30 16:36:18 -0700958
Colin Cross5b529592017-05-09 13:34:34 -0700959func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700960 var i int
961
962 start := 0
963 bytes := 0
964 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700965 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700966 if l > limit {
967 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
968 }
969 if bytes+l > limit {
970 lists = append(lists, list[start:i])
971 start = i
972 bytes = 0
973 }
974 bytes += l + 1 // count a space between each list element
975 }
976
977 lists = append(lists, list[start:])
978
979 totalLen := 0
980 for _, l := range lists {
981 totalLen += len(l)
982 }
983 if totalLen != len(list) {
984 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
985 }
986 return lists, nil
987}