blob: 37fbf4e6297bd1962a62564889f0d7fc14095e16 [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 Medhat1154b692020-04-13 13:21:23 -040032 "android/soong/remoteexec"
Colin Cross3f40fa42015-01-30 17:27:36 -080033)
34
35const (
Dan Albertc3144b12015-04-28 18:17:56 -070036 objectExtension = ".o"
Colin Cross3f40fa42015-01-30 17:27:36 -080037 staticLibraryExtension = ".a"
38)
39
40var (
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -070041 abiCheckAllowFlags = []string{
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -070042 "-allow-unreferenced-changes",
43 "-allow-unreferenced-elf-symbol-changes",
44 }
45)
46
47var (
Colin Cross635c3b02016-05-18 15:37:25 -070048 pctx = android.NewPackageContext("android/soong/cc")
Colin Cross3f40fa42015-01-30 17:27:36 -080049
Ramy Medhat8ea054a2020-01-27 14:19:44 -050050 cc = pctx.AndroidRemoteStaticRule("cc", android.RemoteRuleSupports{Goma: true, RBE: true},
Colin Cross3f40fa42015-01-30 17:27:36 -080051 blueprint.RuleParams{
52 Depfile: "${out}.d",
53 Deps: blueprint.DepsGCC,
Alistair Strachan777475c2016-08-26 12:55:49 -070054 Command: "$relPwd ${config.CcWrapper}$ccCmd -c $cFlags -MD -MF ${out}.d -o $out $in",
Dan Willemsenc94a7682015-11-17 15:27:28 -080055 CommandDeps: []string{"$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080056 },
Dan Willemsen322a0a62015-11-17 15:19:46 -080057 "ccCmd", "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080058
Kousik Kumar2976bfd2020-02-17 00:26:55 -080059 ccNoDeps = pctx.AndroidStaticRule("ccNoDeps",
Dan Willemsenfcabb1c2019-01-03 23:25:11 -080060 blueprint.RuleParams{
Kousik Kumar2976bfd2020-02-17 00:26:55 -080061 Command: "$relPwd $ccCmd -c $cFlags -o $out $in",
Dan Willemsenfcabb1c2019-01-03 23:25:11 -080062 CommandDeps: []string{"$ccCmd"},
63 },
64 "ccCmd", "cFlags")
65
Ramy Medhat1154b692020-04-13 13:21:23 -040066 ld, ldRE = remoteexec.StaticRules(pctx, "ld",
Colin Cross3f40fa42015-01-30 17:27:36 -080067 blueprint.RuleParams{
Treehugger Robot35a91832020-04-27 20:37:30 +000068 Command: "$reTemplate$ldCmd ${crtBegin} @${out}.rsp " +
Pete Bentley99f2fc22019-08-02 14:02:20 +010069 "${libFlags} ${crtEnd} -o ${out} ${ldFlags} ${extraLibFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080070 CommandDeps: []string{"$ldCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070071 Rspfile: "${out}.rsp",
72 RspfileContent: "${in}",
Colin Cross36ae1352019-03-29 15:55:30 -070073 // clang -Wl,--out-implib doesn't update its output file if it hasn't changed.
74 Restat: true,
Colin Cross3f40fa42015-01-30 17:27:36 -080075 },
Treehugger Robot35a91832020-04-27 20:37:30 +000076 &remoteexec.REParams{
77 Labels: map[string]string{"type": "link", "tool": "clang"},
Ramy Medhat1154b692020-04-13 13:21:23 -040078 ExecStrategy: "${config.RECXXLinksExecStrategy}",
79 Inputs: []string{"${out}.rsp"},
80 RSPFile: "${out}.rsp",
Kousik Kumar459c6b22020-04-28 09:13:50 +000081 OutputFiles: []string{"${out}", "$implicitOutputs"},
Ramy Medhat1154b692020-04-13 13:21:23 -040082 ToolchainInputs: []string{"$ldCmd"},
83 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXLinksPool}"},
Kousik Kumar459c6b22020-04-28 09:13:50 +000084 }, []string{"ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags", "extraLibFlags"}, []string{"implicitOutputs"})
Colin Cross3f40fa42015-01-30 17:27:36 -080085
Ramy Medhat1154b692020-04-13 13:21:23 -040086 partialLd, partialLdRE = remoteexec.StaticRules(pctx, "partialLd",
Colin Cross3f40fa42015-01-30 17:27:36 -080087 blueprint.RuleParams{
Chih-Hung Hsieh3ede2942018-01-10 14:30:44 -080088 // Without -no-pie, clang 7.0 adds -pie to link Android files,
89 // but -r and -pie cannot be used together.
Treehugger Robot35a91832020-04-27 20:37:30 +000090 Command: "$reTemplate$ldCmd -fuse-ld=lld -nostdlib -no-pie -Wl,-r ${in} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080091 CommandDeps: []string{"$ldCmd"},
Ramy Medhat1154b692020-04-13 13:21:23 -040092 }, &remoteexec.REParams{
Treehugger Robot35a91832020-04-27 20:37:30 +000093 Labels: map[string]string{"type": "link", "tool": "clang"},
94 ExecStrategy: "${config.RECXXLinksExecStrategy}",
95 Inputs: []string{"$inCommaList"},
Kousik Kumar459c6b22020-04-28 09:13:50 +000096 OutputFiles: []string{"${out}", "$implicitOutputs"},
Ramy Medhat1154b692020-04-13 13:21:23 -040097 ToolchainInputs: []string{"$ldCmd"},
98 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXLinksPool}"},
Kousik Kumar459c6b22020-04-28 09:13:50 +000099 }, []string{"ldCmd", "ldFlags"}, []string{"inCommaList", "implicitOutputs"})
Colin Cross3f40fa42015-01-30 17:27:36 -0800100
Colin Cross9d45bb72016-08-29 16:14:13 -0700101 ar = pctx.AndroidStaticRule("ar",
Colin Cross3f40fa42015-01-30 17:27:36 -0800102 blueprint.RuleParams{
Colin Cross7d21c442015-03-30 17:47:53 -0700103 Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800104 CommandDeps: []string{"$arCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -0700105 Rspfile: "${out}.rsp",
106 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -0800107 },
108 "arCmd", "arFlags")
109
Colin Cross9d45bb72016-08-29 16:14:13 -0700110 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700111 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -0700112 Command: "${config.MacStripPath} -u -r -o $out $in",
113 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700114 })
Colin Cross0af4b842015-04-30 16:36:18 -0700115
Colin Cross9d45bb72016-08-29 16:14:13 -0700116 prefixSymbols = pctx.AndroidStaticRule("prefixSymbols",
Colin Crossbfae8852015-03-26 14:44:11 -0700117 blueprint.RuleParams{
118 Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800119 CommandDeps: []string{"$objcopyCmd"},
Colin Crossbfae8852015-03-26 14:44:11 -0700120 },
121 "objcopyCmd", "prefix")
122
Nan Zhang43a485c2017-03-27 14:27:58 -0700123 _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh")
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800124 _ = pctx.SourcePathVariable("xzCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/xz")
Colin Cross665dce92016-04-28 14:50:03 -0700125
Colin Crossee3ea312019-05-17 15:36:46 -0700126 // 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 -0700127 // file descriptors on darwin. Limit concurrent calls to 5 on darwin.
Colin Crossee3ea312019-05-17 15:36:46 -0700128 darwinStripPool = func() blueprint.Pool {
129 if runtime.GOOS == "darwin" {
130 return pctx.StaticPool("darwinStripPool", blueprint.PoolParams{
Colin Crossbadf8d62019-05-22 13:25:50 -0700131 Depth: 5,
Colin Crossee3ea312019-05-17 15:36:46 -0700132 })
133 } else {
134 return nil
135 }
136 }()
137
Colin Cross9d45bb72016-08-29 16:14:13 -0700138 strip = pctx.AndroidStaticRule("strip",
Colin Cross665dce92016-04-28 14:50:03 -0700139 blueprint.RuleParams{
140 Depfile: "${out}.d",
141 Deps: blueprint.DepsGCC,
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700142 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 -0800143 CommandDeps: []string{"$stripPath", "$xzCmd"},
Colin Crossee3ea312019-05-17 15:36:46 -0700144 Pool: darwinStripPool,
Colin Cross665dce92016-04-28 14:50:03 -0700145 },
146 "args", "crossCompile")
147
Yi Kongc49c3932019-10-15 02:01:19 -0700148 _ = pctx.SourcePathVariable("archiveRepackPath", "build/soong/scripts/archive_repack.sh")
149
150 archiveRepack = pctx.AndroidStaticRule("archiveRepack",
151 blueprint.RuleParams{
152 Depfile: "${out}.d",
153 Deps: blueprint.DepsGCC,
154 Command: "CLANG_BIN=${config.ClangBin} $archiveRepackPath -i ${in} -o ${out} -d ${out}.d ${objects}",
155 CommandDeps: []string{"$archiveRepackPath"},
156 },
157 "objects")
158
Colin Cross9d45bb72016-08-29 16:14:13 -0700159 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700160 blueprint.RuleParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700161 Command: "rm -f $out && touch $out",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700162 })
163
Nan Zhang43a485c2017-03-27 14:27:58 -0700164 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700165
166 toc = pctx.AndroidStaticRule("toc",
167 blueprint.RuleParams{
168 Depfile: "${out}.d",
169 Deps: blueprint.DepsGCC,
Colin Crossb496cfd2018-09-10 16:50:05 -0700170 Command: "CROSS_COMPILE=$crossCompile $tocPath $format -i ${in} -o ${out} -d ${out}.d",
Colin Cross26c34ed2016-09-30 17:10:16 -0700171 CommandDeps: []string{"$tocPath"},
172 Restat: true,
173 },
Colin Crossb496cfd2018-09-10 16:50:05 -0700174 "crossCompile", "format")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700175
176 clangTidy = pctx.AndroidStaticRule("clangTidy",
177 blueprint.RuleParams{
George Burgess IVc4624c02019-04-04 16:22:37 -0700178 Command: "rm -f $out && ${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out",
179 CommandDeps: []string{"${config.ClangBin}/clang-tidy"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700180 },
181 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800182
Nan Zhang43a485c2017-03-27 14:27:58 -0700183 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800184
185 yasm = pctx.AndroidStaticRule("yasm",
186 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700187 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800188 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700189 Depfile: "$out.d",
190 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800191 },
192 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800193
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700194 windres = pctx.AndroidStaticRule("windres",
195 blueprint.RuleParams{
Nick Desaulniers18eeffa2020-01-29 16:20:11 -0800196 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 -0700197 CommandDeps: []string{"$windresCmd"},
198 },
199 "windresCmd", "flags")
200
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800201 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800202
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700203 // -w has been added since header-abi-dumper does not need to produce any sort of diagnostic information.
Treehugger Robot35a91832020-04-27 20:37:30 +0000204 sAbiDump, sAbiDumpRE = remoteexec.StaticRules(pctx, "sAbiDump",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800205 blueprint.RuleParams{
Treehugger Robot35a91832020-04-27 20:37:30 +0000206 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 -0800207 CommandDeps: []string{"$sAbiDumper"},
Treehugger Robot35a91832020-04-27 20:37:30 +0000208 }, &remoteexec.REParams{
209 Labels: map[string]string{"type": "abi-dump", "tool": "header-abi-dumper"},
210 ExecStrategy: "${config.REAbiDumperExecStrategy}",
211 Platform: map[string]string{
212 remoteexec.PoolKey: "${config.RECXXPool}",
213 "InputRootAbsolutePath": android.AbsSrcDirForExistingUseCases(),
214 },
215 }, []string{"cFlags", "exportDirs"}, nil)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800216
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800217 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800218
219 sAbiLink = pctx.AndroidStaticRule("sAbiLink",
220 blueprint.RuleParams{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800221 Command: "$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800222 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800223 Rspfile: "${out}.rsp",
224 RspfileContent: "${in}",
225 },
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800226 "symbolFilter", "arch", "exportedHeaderFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800227
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800228 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700229
Colin Cross2e2dbc22019-09-25 13:31:46 -0700230 sAbiDiff = pctx.RuleFunc("sAbiDiff",
Dan Willemsen54daaf02018-03-12 13:24:09 -0700231 func(ctx android.PackageRuleContext) blueprint.RuleParams {
Jayant Chowdhary39d167a2018-05-17 16:45:51 -0700232 // TODO(b/78139997): Add -check-all-apis back
Logan Chien6227fed2019-02-18 13:12:21 +0800233 commandStr := "($sAbiDiffer ${allowFlags} -lib ${libName} -arch ${arch} -o ${out} -new ${in} -old ${referenceDump})"
234 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 +0800235 commandStr += " && (mkdir -p $$DIST_DIR/abidiffs && cp ${out} $$DIST_DIR/abidiffs/)"
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800236 commandStr += " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800237 return blueprint.RuleParams{
238 Command: commandStr,
239 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700240 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800241 },
Logan Chien6227fed2019-02-18 13:12:21 +0800242 "allowFlags", "referenceDump", "libName", "arch", "createReferenceDumpFlags")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700243
244 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
245 blueprint.RuleParams{
246 Command: "gunzip -c $in > $out",
247 })
Oliver Nguyenc7434142019-04-24 14:22:25 -0700248
249 zip = pctx.AndroidStaticRule("zip",
250 blueprint.RuleParams{
251 Command: "cat $out.rsp | tr ' ' '\\n' | tr -d \\' | sort -u > ${out}.tmp && ${SoongZipCmd} -o ${out} -C $$OUT_DIR -l ${out}.tmp",
252 CommandDeps: []string{"${SoongZipCmd}"},
253 Rspfile: "$out.rsp",
254 RspfileContent: "$in",
255 })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800256
257 _ = pctx.SourcePathVariable("cxxExtractor",
258 "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/cxx_extractor")
Sasha Smundak65143642019-09-26 20:14:28 -0700259 _ = pctx.SourcePathVariable("kytheVnames", "build/soong/vnames.json")
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800260 _ = pctx.VariableFunc("kytheCorpus",
261 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCorpusName() })
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800262 _ = pctx.VariableFunc("kytheCuEncoding",
263 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCuEncoding() })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800264 kytheExtract = pctx.StaticRule("kythe",
265 blueprint.RuleParams{
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800266 Command: `rm -f $out && ` +
267 `KYTHE_CORPUS=${kytheCorpus} KYTHE_OUTPUT_FILE=$out KYTHE_VNAMES=$kytheVnames KYTHE_KZIP_ENCODING=${kytheCuEncoding} ` +
268 `$cxxExtractor $cFlags $in `,
Sasha Smundak65143642019-09-26 20:14:28 -0700269 CommandDeps: []string{"$cxxExtractor", "$kytheVnames"},
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800270 },
271 "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -0800272)
273
Dan Willemsen322a0a62015-11-17 15:19:46 -0800274func init() {
275 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
276 // debug output. That way two builds in two different directories will
277 // create the same output.
278 if runtime.GOOS != "darwin" {
279 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
280 } else {
281 // Darwin doesn't have /proc
282 pctx.StaticVariable("relPwd", "")
283 }
Oliver Nguyenc7434142019-04-24 14:22:25 -0700284
285 pctx.HostBinToolVariable("SoongZipCmd", "soong_zip")
Ramy Medhat1154b692020-04-13 13:21:23 -0400286 pctx.Import("android/soong/remoteexec")
Dan Willemsen322a0a62015-11-17 15:19:46 -0800287}
288
Colin Cross3f40fa42015-01-30 17:27:36 -0800289type builderFlags struct {
Colin Cross6d88dba2019-11-06 07:06:58 -0800290 globalCommonFlags string
291 globalAsFlags string
292 globalYasmFlags string
293 globalCFlags string
294 globalToolingCFlags string // A separate set of cFlags for clang LibTooling tools
295 globalToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
296 globalConlyFlags string
297 globalCppFlags string
298 globalLdFlags string
299
300 localCommonFlags string
301 localAsFlags string
302 localYasmFlags string
303 localCFlags string
304 localToolingCFlags string // A separate set of cFlags for clang LibTooling tools
305 localToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
306 localConlyFlags string
307 localCppFlags string
308 localLdFlags string
309
310 libFlags string
311 extraLibFlags string
312 tidyFlags string
313 sAbiFlags string
314 aidlFlags string
315 rsFlags string
316 toolchain config.Toolchain
317 tidy bool
Oliver Nguyen6f641c12020-04-21 12:40:27 -0700318 gcovCoverage bool
Colin Cross6d88dba2019-11-06 07:06:58 -0800319 sAbiDump bool
320 emitXrefs bool
Colin Cross665dce92016-04-28 14:50:03 -0700321
Dan Willemsen98ab3112019-08-27 21:20:40 -0700322 assemblerWithCpp bool
323
Colin Crossc3199482017-03-30 15:03:04 -0700324 systemIncludeFlags string
325
Colin Cross18c0c5a2016-12-01 14:45:23 -0800326 groupStaticLibs bool
327
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700328 stripKeepSymbols bool
329 stripKeepSymbolsList string
330 stripKeepSymbolsAndDebugFrame bool
331 stripKeepMiniDebugInfo bool
332 stripAddGnuDebuglink bool
333 stripUseGnuStrip bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800334
Colin Cross19878da2019-03-28 14:45:07 -0700335 proto android.ProtoFlags
Dan Willemsen60e62f02018-11-16 21:05:32 -0800336 protoC bool
337 protoOptionsFile bool
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700338
339 yacc *YaccProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800340}
341
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700342type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800343 objFiles android.Paths
344 tidyFiles android.Paths
345 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800346 sAbiDumpFiles android.Paths
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800347 kytheFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700348}
349
350func (a Objects) Copy() Objects {
351 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800352 objFiles: append(android.Paths{}, a.objFiles...),
353 tidyFiles: append(android.Paths{}, a.tidyFiles...),
354 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800355 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800356 kytheFiles: append(android.Paths{}, a.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700357 }
358}
359
360func (a Objects) Append(b Objects) Objects {
361 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800362 objFiles: append(a.objFiles, b.objFiles...),
363 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
364 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800365 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800366 kytheFiles: append(a.kytheFiles, b.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700367 }
368}
369
Colin Cross3f40fa42015-01-30 17:27:36 -0800370// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700371func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800372 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700373
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700374 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700375 var tidyFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700376 if flags.tidy {
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700377 tidyFiles = make(android.Paths, 0, len(srcFiles))
378 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800379 var coverageFiles android.Paths
Oliver Nguyen6f641c12020-04-21 12:40:27 -0700380 if flags.gcovCoverage {
Dan Willemsen581341d2017-02-09 16:16:31 -0800381 coverageFiles = make(android.Paths, 0, len(srcFiles))
382 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800383 var kytheFiles android.Paths
384 if flags.emitXrefs {
385 kytheFiles = make(android.Paths, 0, len(srcFiles))
386 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800387
Colin Cross6d88dba2019-11-06 07:06:58 -0800388 // Produce fully expanded flags for use by C tools, C compiles, C++ tools, C++ compiles, and asm compiles
389 // respectively.
390 toolingCflags := flags.globalCommonFlags + " " +
391 flags.globalToolingCFlags + " " +
392 flags.globalConlyFlags + " " +
393 flags.localCommonFlags + " " +
394 flags.localToolingCFlags + " " +
395 flags.localConlyFlags + " " +
396 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700397
Colin Cross6d88dba2019-11-06 07:06:58 -0800398 cflags := flags.globalCommonFlags + " " +
399 flags.globalCFlags + " " +
400 flags.globalConlyFlags + " " +
401 flags.localCommonFlags + " " +
402 flags.localCFlags + " " +
403 flags.localConlyFlags + " " +
404 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700405
Colin Cross6d88dba2019-11-06 07:06:58 -0800406 toolingCppflags := flags.globalCommonFlags + " " +
407 flags.globalToolingCFlags + " " +
408 flags.globalToolingCppFlags + " " +
409 flags.localCommonFlags + " " +
410 flags.localToolingCFlags + " " +
411 flags.localToolingCppFlags + " " +
412 flags.systemIncludeFlags
Colin Crossc3199482017-03-30 15:03:04 -0700413
Colin Cross6d88dba2019-11-06 07:06:58 -0800414 cppflags := flags.globalCommonFlags + " " +
415 flags.globalCFlags + " " +
416 flags.globalCppFlags + " " +
417 flags.localCommonFlags + " " +
418 flags.localCFlags + " " +
419 flags.localCppFlags + " " +
420 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700421
Colin Cross6d88dba2019-11-06 07:06:58 -0800422 asflags := flags.globalCommonFlags + " " +
423 flags.globalAsFlags + " " +
424 flags.localCommonFlags + " " +
425 flags.localAsFlags + " " +
426 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700427
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800428 var sAbiDumpFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700429 if flags.sAbiDump {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800430 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
431 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800432
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700433 cflags += " ${config.NoOverrideClangGlobalCflags}"
434 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
435 cppflags += " ${config.NoOverrideClangGlobalCflags}"
436 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800437
Colin Cross3f40fa42015-01-30 17:27:36 -0800438 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700439 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800440
441 objFiles[i] = objFile
442
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700443 switch srcFile.Ext() {
444 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700445 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700446 Rule: yasm,
447 Description: "yasm " + srcFile.Rel(),
448 Output: objFile,
449 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800450 Implicits: cFlagsDeps,
451 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800452 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800453 "asFlags": flags.globalYasmFlags + " " + flags.localYasmFlags,
Colin Cross91e90042016-12-02 17:13:24 -0800454 },
455 })
456 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700457 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700458 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700459 Rule: windres,
460 Description: "windres " + srcFile.Rel(),
461 Output: objFile,
462 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800463 Implicits: cFlagsDeps,
464 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700465 Args: map[string]string{
466 "windresCmd": gccCmd(flags.toolchain, "windres"),
467 "flags": flags.toolchain.WindresFlags(),
468 },
469 })
470 continue
Pete Bentleyfcf55bf2019-08-16 20:14:32 +0100471 case ".o":
472 objFiles[i] = srcFile
473 continue
Colin Cross91e90042016-12-02 17:13:24 -0800474 }
475
Colin Cross6d88dba2019-11-06 07:06:58 -0800476 var moduleFlags string
477 var moduleToolingFlags string
478
Colin Cross3f40fa42015-01-30 17:27:36 -0800479 var ccCmd string
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700480 tidy := flags.tidy
Oliver Nguyen6f641c12020-04-21 12:40:27 -0700481 coverage := flags.gcovCoverage
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700482 dump := flags.sAbiDump
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800483 rule := cc
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800484 emitXref := flags.emitXrefs
Colin Cross3f40fa42015-01-30 17:27:36 -0800485
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700486 switch srcFile.Ext() {
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800487 case ".s":
Dan Willemsen98ab3112019-08-27 21:20:40 -0700488 if !flags.assemblerWithCpp {
489 rule = ccNoDeps
490 }
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800491 fallthrough
492 case ".S":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700493 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800494 moduleFlags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700495 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800496 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800497 dump = false
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800498 emitXref = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800499 case ".c":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700500 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800501 moduleFlags = cflags
502 moduleToolingFlags = toolingCflags
Colin Crossd34ab7c2019-06-27 14:46:10 -0700503 case ".cpp", ".cc", ".cxx", ".mm":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700504 ccCmd = "clang++"
Colin Cross6d88dba2019-11-06 07:06:58 -0800505 moduleFlags = cppflags
506 moduleToolingFlags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800507 default:
508 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
509 continue
510 }
511
Colin Cross67a5c132017-05-09 13:45:28 -0700512 ccDesc := ccCmd
513
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700514 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800515
Dan Willemsen581341d2017-02-09 16:16:31 -0800516 var implicitOutputs android.WritablePaths
517 if coverage {
518 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
519 implicitOutputs = append(implicitOutputs, gcnoFile)
520 coverageFiles = append(coverageFiles, gcnoFile)
521 }
522
Colin Crossae887032017-10-23 17:16:14 -0700523 ctx.Build(pctx, android.BuildParams{
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800524 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700525 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800526 Output: objFile,
527 ImplicitOutputs: implicitOutputs,
528 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800529 Implicits: cFlagsDeps,
530 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800531 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800532 "cFlags": moduleFlags,
Colin Cross28344522015-04-22 13:07:53 -0700533 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800534 },
535 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700536
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800537 if emitXref {
538 kytheFile := android.ObjPathWithExt(ctx, subdir, srcFile, "kzip")
539 ctx.Build(pctx, android.BuildParams{
540 Rule: kytheExtract,
541 Description: "Xref C++ extractor " + srcFile.Rel(),
542 Output: kytheFile,
543 Input: srcFile,
544 Implicits: cFlagsDeps,
545 OrderOnly: pathDeps,
546 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800547 "cFlags": moduleFlags,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800548 },
549 })
550 kytheFiles = append(kytheFiles, kytheFile)
551 }
552
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700553 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700554 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700555 tidyFiles = append(tidyFiles, tidyFile)
556
Colin Crossae887032017-10-23 17:16:14 -0700557 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700558 Rule: clangTidy,
559 Description: "clang-tidy " + srcFile.Rel(),
560 Output: tidyFile,
561 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700562 // We must depend on objFile, since clang-tidy doesn't
563 // support exporting dependencies.
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700564 Implicit: objFile,
565 Implicits: cFlagsDeps,
566 OrderOnly: pathDeps,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700567 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800568 "cFlags": moduleToolingFlags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700569 "tidyFlags": flags.tidyFlags,
570 },
571 })
572 }
573
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800574 if dump {
575 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
576 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
577
Treehugger Robot35a91832020-04-27 20:37:30 +0000578 dumpRule := sAbiDump
579 if ctx.Config().IsEnvTrue("RBE_ABI_DUMPER") {
580 dumpRule = sAbiDumpRE
581 }
Colin Crossae887032017-10-23 17:16:14 -0700582 ctx.Build(pctx, android.BuildParams{
Treehugger Robot35a91832020-04-27 20:37:30 +0000583 Rule: dumpRule,
Colin Cross67a5c132017-05-09 13:45:28 -0700584 Description: "header-abi-dumper " + srcFile.Rel(),
585 Output: sAbiDumpFile,
586 Input: srcFile,
587 Implicit: objFile,
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700588 Implicits: cFlagsDeps,
589 OrderOnly: pathDeps,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800590 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800591 "cFlags": moduleToolingFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800592 "exportDirs": flags.sAbiFlags,
593 },
594 })
595 }
596
Colin Cross3f40fa42015-01-30 17:27:36 -0800597 }
598
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700599 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800600 objFiles: objFiles,
601 tidyFiles: tidyFiles,
602 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800603 sAbiDumpFiles: sAbiDumpFiles,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800604 kytheFiles: kytheFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700605 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800606}
607
608// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700609func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700610 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800611
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800612 arCmd := "${config.ClangBin}/llvm-ar"
Yi Kongee96a792019-09-06 15:11:57 -0700613 arFlags := "crsPD"
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800614 if !ctx.Darwin() {
615 arFlags += " -format=gnu"
616 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800617
Colin Crossae887032017-10-23 17:16:14 -0700618 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700619 Rule: ar,
620 Description: "static link " + outputFile.Base(),
621 Output: outputFile,
622 Inputs: objFiles,
623 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800624 Args: map[string]string{
625 "arFlags": arFlags,
626 "arCmd": arCmd,
627 },
628 })
629}
630
631// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700632// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700633func TransformObjToDynamicBinary(ctx android.ModuleContext,
634 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
Josh Gao75a50a22019-06-07 17:58:59 -0700635 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath, implicitOutputs android.WritablePaths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800636
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700637 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800638
Colin Cross3f40fa42015-01-30 17:27:36 -0800639 var libFlagsList []string
640
Colin Cross16b23492016-01-06 14:41:07 -0800641 if len(flags.libFlags) > 0 {
642 libFlagsList = append(libFlagsList, flags.libFlags)
643 }
644
Colin Cross3f40fa42015-01-30 17:27:36 -0800645 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800646 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700647 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700648 } else {
649 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700650 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700651 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
652 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800653 }
654
Colin Cross7a7cf972016-12-05 18:47:39 -0800655 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800656 libFlagsList = append(libFlagsList, "-Wl,--start-group")
657 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700658 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800659 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800660 libFlagsList = append(libFlagsList, "-Wl,--end-group")
661 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800662
Stephen Hines10347862016-07-18 15:54:54 -0700663 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700664 libFlagsList = append(libFlagsList, "-Wl,--start-group")
665 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700666 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700667 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700668 libFlagsList = append(libFlagsList, "-Wl,--end-group")
669 }
670
Colin Cross3f40fa42015-01-30 17:27:36 -0800671 for _, lib := range sharedLibs {
Josh Gao75a50a22019-06-07 17:58:59 -0700672 libFile := lib.String()
673 if ctx.Windows() {
674 libFile = pathtools.ReplaceExtension(libFile, "lib")
675 }
676 libFlagsList = append(libFlagsList, libFile)
Colin Cross3f40fa42015-01-30 17:27:36 -0800677 }
678
Colin Cross3f40fa42015-01-30 17:27:36 -0800679 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700680 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800681 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700682 if crtBegin.Valid() {
683 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800684 }
685
Ramy Medhat1154b692020-04-13 13:21:23 -0400686 rule := ld
Kousik Kumar459c6b22020-04-28 09:13:50 +0000687 args := map[string]string{
688 "ldCmd": ldCmd,
689 "crtBegin": crtBegin.String(),
690 "libFlags": strings.Join(libFlagsList, " "),
691 "extraLibFlags": flags.extraLibFlags,
692 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
693 "crtEnd": crtEnd.String(),
694 }
Ramy Medhat1154b692020-04-13 13:21:23 -0400695 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
696 rule = ldRE
Kousik Kumar459c6b22020-04-28 09:13:50 +0000697 args["implicitOutputs"] = strings.Join(implicitOutputs.Strings(), ",")
Ramy Medhat1154b692020-04-13 13:21:23 -0400698 }
699
Colin Crossae887032017-10-23 17:16:14 -0700700 ctx.Build(pctx, android.BuildParams{
Ramy Medhat1154b692020-04-13 13:21:23 -0400701 Rule: rule,
Josh Gao75a50a22019-06-07 17:58:59 -0700702 Description: "link " + outputFile.Base(),
703 Output: outputFile,
704 ImplicitOutputs: implicitOutputs,
705 Inputs: objFiles,
706 Implicits: deps,
Kousik Kumar459c6b22020-04-28 09:13:50 +0000707 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800708 })
709}
710
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800711// Generate a rule to combine .dump sAbi dump files from multiple source files
712// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700713func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800714 baseName, exportedHeaderFlags string, symbolFile android.OptionalPath,
715 excludedSymbolVersions, excludedSymbolTags []string) android.OptionalPath {
716
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800717 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800718
719 implicits := android.Paths{soFile}
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800720 symbolFilterStr := "-so " + soFile.String()
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800721
722 if symbolFile.Valid() {
723 implicits = append(implicits, symbolFile.Path())
724 symbolFilterStr += " -v " + symbolFile.String()
725 }
726 for _, ver := range excludedSymbolVersions {
727 symbolFilterStr += " --exclude-symbol-version " + ver
728 }
729 for _, tag := range excludedSymbolTags {
730 symbolFilterStr += " --exclude-symbol-tag " + tag
731 }
Colin Crossae887032017-10-23 17:16:14 -0700732 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700733 Rule: sAbiLink,
734 Description: "header-abi-linker " + outputFile.Base(),
735 Output: outputFile,
736 Inputs: sAbiDumps,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800737 Implicits: implicits,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800738 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800739 "symbolFilter": symbolFilterStr,
740 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800741 "exportedHeaderFlags": exportedHeaderFlags,
742 },
743 })
744 return android.OptionalPathForPath(outputFile)
745}
746
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700747func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
748 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700749 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700750 Rule: unzipRefSAbiDump,
751 Description: "gunzip" + outputFile.Base(),
752 Output: outputFile,
753 Input: zippedRefDump,
754 })
755 return outputFile
756}
757
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800758func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chien62f1f942019-02-18 15:40:42 +0800759 baseName, exportedHeaderFlags string, isLlndk, isNdk, isVndkExt bool) android.OptionalPath {
Logan Chienf3511742017-10-31 18:04:35 +0800760
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800761 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700762 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Logan Chien6227fed2019-02-18 13:12:21 +0800763 createReferenceDumpFlags := ""
764
Jayant Chowdharye4499502018-01-17 13:13:33 -0800765 localAbiCheckAllowFlags := append([]string(nil), abiCheckAllowFlags...)
766 if exportedHeaderFlags == "" {
767 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-advice-only")
768 }
Logan Chien62f1f942019-02-18 15:40:42 +0800769 if isLlndk || isNdk {
Logan Chien6227fed2019-02-18 13:12:21 +0800770 createReferenceDumpFlags = "--llndk"
Logan Chien62f1f942019-02-18 15:40:42 +0800771 if isLlndk {
772 // TODO(b/130324828): "-consider-opaque-types-different" should apply to
773 // both LLNDK and NDK shared libs. However, a known issue in header-abi-diff
774 // breaks libaaudio. Remove the if-guard after the issue is fixed.
775 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-consider-opaque-types-different")
776 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700777 }
Logan Chienf3511742017-10-31 18:04:35 +0800778 if isVndkExt {
779 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-allow-extensions")
780 }
781
Colin Crossae887032017-10-23 17:16:14 -0700782 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700783 Rule: sAbiDiff,
784 Description: "header-abi-diff " + outputFile.Base(),
785 Output: outputFile,
786 Input: inputDump,
787 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800788 Args: map[string]string{
Logan Chien6227fed2019-02-18 13:12:21 +0800789 "referenceDump": referenceDump.String(),
790 "libName": libName,
791 "arch": ctx.Arch().ArchType.Name,
792 "allowFlags": strings.Join(localAbiCheckAllowFlags, " "),
793 "createReferenceDumpFlags": createReferenceDumpFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800794 },
795 })
796 return android.OptionalPathForPath(outputFile)
797}
798
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700799// Generate a rule for extracting a table of contents from a shared library (.so)
800func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700801 outputFile android.WritablePath, flags builderFlags) {
802
Colin Crossb496cfd2018-09-10 16:50:05 -0700803 var format string
804 var crossCompile string
805 if ctx.Darwin() {
806 format = "--macho"
807 crossCompile = "${config.MacToolPath}"
808 } else if ctx.Windows() {
809 format = "--pe"
810 crossCompile = gccCmd(flags.toolchain, "")
811 } else {
812 format = "--elf"
813 crossCompile = gccCmd(flags.toolchain, "")
814 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700815
Colin Crossae887032017-10-23 17:16:14 -0700816 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700817 Rule: toc,
818 Description: "generate toc " + inputFile.Base(),
819 Output: outputFile,
820 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700821 Args: map[string]string{
822 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700823 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700824 },
825 })
826}
827
Colin Cross3f40fa42015-01-30 17:27:36 -0800828// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700829func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700830 flags builderFlags, outputFile android.WritablePath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800831
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700832 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800833
Ramy Medhat1154b692020-04-13 13:21:23 -0400834 rule := partialLd
835 args := map[string]string{
836 "ldCmd": ldCmd,
837 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
838 }
839 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
840 rule = partialLdRE
841 args["inCommaList"] = strings.Join(objFiles.Strings(), ",")
842 }
Colin Crossae887032017-10-23 17:16:14 -0700843 ctx.Build(pctx, android.BuildParams{
Ramy Medhat1154b692020-04-13 13:21:23 -0400844 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700845 Description: "link " + outputFile.Base(),
846 Output: outputFile,
847 Inputs: objFiles,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700848 Implicits: deps,
Ramy Medhat1154b692020-04-13 13:21:23 -0400849 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800850 })
851}
852
Colin Crossbfae8852015-03-26 14:44:11 -0700853// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700854func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
855 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700856
857 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
858
Colin Crossae887032017-10-23 17:16:14 -0700859 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700860 Rule: prefixSymbols,
861 Description: "prefix symbols " + outputFile.Base(),
862 Output: outputFile,
863 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700864 Args: map[string]string{
865 "objcopyCmd": objcopyCmd,
866 "prefix": prefix,
867 },
868 })
869}
870
Colin Cross635c3b02016-05-18 15:37:25 -0700871func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
872 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700873
874 crossCompile := gccCmd(flags.toolchain, "")
875 args := ""
876 if flags.stripAddGnuDebuglink {
877 args += " --add-gnu-debuglink"
878 }
879 if flags.stripKeepMiniDebugInfo {
880 args += " --keep-mini-debug-info"
881 }
882 if flags.stripKeepSymbols {
883 args += " --keep-symbols"
884 }
Yi Kongacee27c2019-03-29 20:05:14 -0700885 if flags.stripKeepSymbolsList != "" {
886 args += " -k" + flags.stripKeepSymbolsList
887 }
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700888 if flags.stripKeepSymbolsAndDebugFrame {
889 args += " --keep-symbols-and-debug-frame"
890 }
Yi Kongb5c34d72018-11-07 16:28:49 -0800891 if flags.stripUseGnuStrip {
892 args += " --use-gnu-strip"
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700893 }
Colin Cross665dce92016-04-28 14:50:03 -0700894
Colin Crossae887032017-10-23 17:16:14 -0700895 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700896 Rule: strip,
897 Description: "strip " + outputFile.Base(),
898 Output: outputFile,
899 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700900 Args: map[string]string{
901 "crossCompile": crossCompile,
902 "args": args,
903 },
904 })
905}
906
Colin Cross635c3b02016-05-18 15:37:25 -0700907func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
908 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700909
Colin Crossae887032017-10-23 17:16:14 -0700910 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700911 Rule: darwinStrip,
912 Description: "strip " + outputFile.Base(),
913 Output: outputFile,
914 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700915 })
916}
917
Oliver Nguyenc7434142019-04-24 14:22:25 -0700918func TransformCoverageFilesToZip(ctx android.ModuleContext,
919 inputs Objects, baseName string) android.OptionalPath {
Dan Willemsen581341d2017-02-09 16:16:31 -0800920
921 if len(inputs.coverageFiles) > 0 {
Oliver Nguyenc7434142019-04-24 14:22:25 -0700922 outputFile := android.PathForModuleOut(ctx, baseName+".zip")
Dan Willemsen581341d2017-02-09 16:16:31 -0800923
Oliver Nguyenc7434142019-04-24 14:22:25 -0700924 ctx.Build(pctx, android.BuildParams{
925 Rule: zip,
926 Description: "zip " + outputFile.Base(),
927 Inputs: inputs.coverageFiles,
928 Output: outputFile,
929 })
Dan Willemsen581341d2017-02-09 16:16:31 -0800930
931 return android.OptionalPathForPath(outputFile)
932 }
933
934 return android.OptionalPath{}
935}
936
Yi Kongc49c3932019-10-15 02:01:19 -0700937func TransformArchiveRepack(ctx android.ModuleContext, inputFile android.Path,
938 outputFile android.WritablePath, objects []string) {
939
940 ctx.Build(pctx, android.BuildParams{
941 Rule: archiveRepack,
942 Description: "Repack archive " + outputFile.Base(),
943 Output: outputFile,
944 Input: inputFile,
945 Args: map[string]string{
946 "objects": strings.Join(objects, " "),
947 },
948 })
949}
950
Colin Crossb98c8b02016-07-29 13:44:28 -0700951func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800952 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
953}
Colin Cross0af4b842015-04-30 16:36:18 -0700954
Colin Cross5b529592017-05-09 13:34:34 -0700955func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700956 var i int
957
958 start := 0
959 bytes := 0
960 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700961 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700962 if l > limit {
963 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
964 }
965 if bytes+l > limit {
966 lists = append(lists, list[start:i])
967 start = i
968 bytes = 0
969 }
970 bytes += l + 1 // count a space between each list element
971 }
972
973 lists = append(lists, list[start:])
974
975 totalLen := 0
976 for _, l := range lists {
977 totalLen += len(l)
978 }
979 if totalLen != len(list) {
980 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
981 }
982 return lists, nil
983}