blob: b4f9947d75d1aa7facd9c5e4e8b076ded8e0cdbe [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
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100102 arWithLibs = pctx.AndroidStaticRule("arWithLibs",
103 blueprint.RuleParams{
104 Command: "rm -f ${out} && $arCmd $arObjFlags $out @${out}.rsp && $arCmd $arLibFlags $out $arLibs",
105 CommandDeps: []string{"$arCmd"},
106 Rspfile: "${out}.rsp",
107 RspfileContent: "${arObjs}",
108 },
109 "arCmd", "arObjFlags", "arObjs", "arLibFlags", "arLibs")
110
Colin Cross9d45bb72016-08-29 16:14:13 -0700111 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700112 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -0700113 Command: "${config.MacStripPath} -u -r -o $out $in",
114 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700115 })
Colin Cross0af4b842015-04-30 16:36:18 -0700116
Colin Cross9d45bb72016-08-29 16:14:13 -0700117 prefixSymbols = pctx.AndroidStaticRule("prefixSymbols",
Colin Crossbfae8852015-03-26 14:44:11 -0700118 blueprint.RuleParams{
119 Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800120 CommandDeps: []string{"$objcopyCmd"},
Colin Crossbfae8852015-03-26 14:44:11 -0700121 },
122 "objcopyCmd", "prefix")
123
Nan Zhang43a485c2017-03-27 14:27:58 -0700124 _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh")
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800125 _ = pctx.SourcePathVariable("xzCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/xz")
Colin Cross665dce92016-04-28 14:50:03 -0700126
Colin Crossee3ea312019-05-17 15:36:46 -0700127 // 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 -0700128 // file descriptors on darwin. Limit concurrent calls to 5 on darwin.
Colin Crossee3ea312019-05-17 15:36:46 -0700129 darwinStripPool = func() blueprint.Pool {
130 if runtime.GOOS == "darwin" {
131 return pctx.StaticPool("darwinStripPool", blueprint.PoolParams{
Colin Crossbadf8d62019-05-22 13:25:50 -0700132 Depth: 5,
Colin Crossee3ea312019-05-17 15:36:46 -0700133 })
134 } else {
135 return nil
136 }
137 }()
138
Colin Cross9d45bb72016-08-29 16:14:13 -0700139 strip = pctx.AndroidStaticRule("strip",
Colin Cross665dce92016-04-28 14:50:03 -0700140 blueprint.RuleParams{
141 Depfile: "${out}.d",
142 Deps: blueprint.DepsGCC,
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700143 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 -0800144 CommandDeps: []string{"$stripPath", "$xzCmd"},
Colin Crossee3ea312019-05-17 15:36:46 -0700145 Pool: darwinStripPool,
Colin Cross665dce92016-04-28 14:50:03 -0700146 },
147 "args", "crossCompile")
148
Yi Kongc49c3932019-10-15 02:01:19 -0700149 _ = pctx.SourcePathVariable("archiveRepackPath", "build/soong/scripts/archive_repack.sh")
150
151 archiveRepack = pctx.AndroidStaticRule("archiveRepack",
152 blueprint.RuleParams{
153 Depfile: "${out}.d",
154 Deps: blueprint.DepsGCC,
155 Command: "CLANG_BIN=${config.ClangBin} $archiveRepackPath -i ${in} -o ${out} -d ${out}.d ${objects}",
156 CommandDeps: []string{"$archiveRepackPath"},
157 },
158 "objects")
159
Colin Cross9d45bb72016-08-29 16:14:13 -0700160 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700161 blueprint.RuleParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700162 Command: "rm -f $out && touch $out",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700163 })
164
Nan Zhang43a485c2017-03-27 14:27:58 -0700165 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700166
167 toc = pctx.AndroidStaticRule("toc",
168 blueprint.RuleParams{
169 Depfile: "${out}.d",
170 Deps: blueprint.DepsGCC,
Colin Crossb496cfd2018-09-10 16:50:05 -0700171 Command: "CROSS_COMPILE=$crossCompile $tocPath $format -i ${in} -o ${out} -d ${out}.d",
Colin Cross26c34ed2016-09-30 17:10:16 -0700172 CommandDeps: []string{"$tocPath"},
173 Restat: true,
174 },
Colin Crossb496cfd2018-09-10 16:50:05 -0700175 "crossCompile", "format")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700176
177 clangTidy = pctx.AndroidStaticRule("clangTidy",
178 blueprint.RuleParams{
George Burgess IVc4624c02019-04-04 16:22:37 -0700179 Command: "rm -f $out && ${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out",
180 CommandDeps: []string{"${config.ClangBin}/clang-tidy"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700181 },
182 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800183
Nan Zhang43a485c2017-03-27 14:27:58 -0700184 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800185
186 yasm = pctx.AndroidStaticRule("yasm",
187 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700188 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800189 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700190 Depfile: "$out.d",
191 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800192 },
193 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800194
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700195 windres = pctx.AndroidStaticRule("windres",
196 blueprint.RuleParams{
Nick Desaulniers18eeffa2020-01-29 16:20:11 -0800197 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 -0700198 CommandDeps: []string{"$windresCmd"},
199 },
200 "windresCmd", "flags")
201
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800202 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800203
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700204 // -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 -0400205 sAbiDump, sAbiDumpRE = remoteexec.StaticRules(pctx, "sAbiDump",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800206 blueprint.RuleParams{
Ramy Medhat31ec9422020-04-17 15:03:58 -0400207 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 -0800208 CommandDeps: []string{"$sAbiDumper"},
Ramy Medhat31ec9422020-04-17 15:03:58 -0400209 }, &remoteexec.REParams{
210 Labels: map[string]string{"type": "abi-dump", "tool": "header-abi-dumper"},
211 ExecStrategy: "${config.REAbiDumperExecStrategy}",
212 Platform: map[string]string{
213 remoteexec.PoolKey: "${config.RECXXPool}",
214 "InputRootAbsolutePath": android.AbsSrcDirForExistingUseCases(),
215 },
216 }, []string{"cFlags", "exportDirs"}, nil)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800217
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800218 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
Ramy Medhat808594c2020-05-07 06:56:47 -0400219 _ = pctx.SourcePathVariable("sAbiLinkerLibs", "prebuilts/clang-tools/${config.HostPrebuiltTag}/lib64")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800220
Ramy Medhat808594c2020-05-07 06:56:47 -0400221 sAbiLink, sAbiLinkRE = remoteexec.StaticRules(pctx, "sAbiLink",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800222 blueprint.RuleParams{
Ramy Medhat808594c2020-05-07 06:56:47 -0400223 Command: "$reTemplate$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800224 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800225 Rspfile: "${out}.rsp",
226 RspfileContent: "${in}",
Ramy Medhat808594c2020-05-07 06:56:47 -0400227 }, &remoteexec.REParams{
228 Labels: map[string]string{"type": "tool", "name": "abi-linker"},
229 ExecStrategy: "${config.REAbiLinkerExecStrategy}",
230 Inputs: []string{"$sAbiLinkerLibs", "${out}.rsp", "$implicits"},
231 RSPFile: "${out}.rsp",
232 OutputFiles: []string{"$out"},
233 ToolchainInputs: []string{"$sAbiLinker"},
234 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXPool}"},
235 }, []string{"symbolFilter", "arch", "exportedHeaderFlags"}, []string{"implicits"})
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800236
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800237 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700238
Colin Cross2e2dbc22019-09-25 13:31:46 -0700239 sAbiDiff = pctx.RuleFunc("sAbiDiff",
Dan Willemsen54daaf02018-03-12 13:24:09 -0700240 func(ctx android.PackageRuleContext) blueprint.RuleParams {
Logan Chien2a65dda2019-10-01 15:58:07 -0700241 commandStr := "($sAbiDiffer ${extraFlags} -lib ${libName} -arch ${arch} -o ${out} -new ${in} -old ${referenceDump})"
Logan Chien6227fed2019-02-18 13:12:21 +0800242 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 +0800243 commandStr += " && (mkdir -p $$DIST_DIR/abidiffs && cp ${out} $$DIST_DIR/abidiffs/)"
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800244 commandStr += " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800245 return blueprint.RuleParams{
246 Command: commandStr,
247 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700248 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800249 },
Logan Chien2a65dda2019-10-01 15:58:07 -0700250 "extraFlags", "referenceDump", "libName", "arch", "createReferenceDumpFlags")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700251
252 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
253 blueprint.RuleParams{
254 Command: "gunzip -c $in > $out",
255 })
Oliver Nguyenc7434142019-04-24 14:22:25 -0700256
257 zip = pctx.AndroidStaticRule("zip",
258 blueprint.RuleParams{
259 Command: "cat $out.rsp | tr ' ' '\\n' | tr -d \\' | sort -u > ${out}.tmp && ${SoongZipCmd} -o ${out} -C $$OUT_DIR -l ${out}.tmp",
260 CommandDeps: []string{"${SoongZipCmd}"},
261 Rspfile: "$out.rsp",
262 RspfileContent: "$in",
263 })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800264
265 _ = pctx.SourcePathVariable("cxxExtractor",
266 "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/cxx_extractor")
Sasha Smundak65143642019-09-26 20:14:28 -0700267 _ = pctx.SourcePathVariable("kytheVnames", "build/soong/vnames.json")
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800268 _ = pctx.VariableFunc("kytheCorpus",
269 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCorpusName() })
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800270 _ = pctx.VariableFunc("kytheCuEncoding",
271 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCuEncoding() })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800272 kytheExtract = pctx.StaticRule("kythe",
273 blueprint.RuleParams{
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800274 Command: `rm -f $out && ` +
Sasha Smundaka4ef83b2020-04-21 17:08:35 -0700275 `KYTHE_CORPUS=${kytheCorpus} ` +
276 `KYTHE_OUTPUT_FILE=$out ` +
277 `KYTHE_VNAMES=$kytheVnames ` +
278 `KYTHE_KZIP_ENCODING=${kytheCuEncoding} ` +
279 `KYTHE_CANONICALIZE_VNAME_PATHS=prefer-relative ` +
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800280 `$cxxExtractor $cFlags $in `,
Sasha Smundak65143642019-09-26 20:14:28 -0700281 CommandDeps: []string{"$cxxExtractor", "$kytheVnames"},
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800282 },
283 "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -0800284)
285
Ivan Lozanof3717ee2020-05-20 09:03:20 -0400286func PwdPrefix() string {
287 // Darwin doesn't have /proc
288 if runtime.GOOS != "darwin" {
289 return "PWD=/proc/self/cwd"
290 }
291 return ""
292}
293
Dan Willemsen322a0a62015-11-17 15:19:46 -0800294func init() {
295 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
296 // debug output. That way two builds in two different directories will
297 // create the same output.
Ivan Lozanof3717ee2020-05-20 09:03:20 -0400298 pctx.StaticVariable("relPwd", PwdPrefix())
Oliver Nguyenc7434142019-04-24 14:22:25 -0700299
300 pctx.HostBinToolVariable("SoongZipCmd", "soong_zip")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400301 pctx.Import("android/soong/remoteexec")
Dan Willemsen322a0a62015-11-17 15:19:46 -0800302}
303
Colin Cross3f40fa42015-01-30 17:27:36 -0800304type builderFlags struct {
Colin Cross6d88dba2019-11-06 07:06:58 -0800305 globalCommonFlags string
306 globalAsFlags string
307 globalYasmFlags string
308 globalCFlags string
309 globalToolingCFlags string // A separate set of cFlags for clang LibTooling tools
310 globalToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
311 globalConlyFlags string
312 globalCppFlags string
313 globalLdFlags string
314
315 localCommonFlags string
316 localAsFlags string
317 localYasmFlags string
318 localCFlags string
319 localToolingCFlags string // A separate set of cFlags for clang LibTooling tools
320 localToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
321 localConlyFlags string
322 localCppFlags string
323 localLdFlags string
324
325 libFlags string
326 extraLibFlags string
327 tidyFlags string
328 sAbiFlags string
329 aidlFlags string
330 rsFlags string
331 toolchain config.Toolchain
332 tidy bool
Oliver Nguyen04526782020-04-21 12:40:27 -0700333 gcovCoverage bool
Colin Cross6d88dba2019-11-06 07:06:58 -0800334 sAbiDump bool
335 emitXrefs bool
Colin Cross665dce92016-04-28 14:50:03 -0700336
Dan Willemsen98ab3112019-08-27 21:20:40 -0700337 assemblerWithCpp bool
338
Colin Crossc3199482017-03-30 15:03:04 -0700339 systemIncludeFlags string
340
Colin Cross18c0c5a2016-12-01 14:45:23 -0800341 groupStaticLibs bool
342
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700343 stripKeepSymbols bool
344 stripKeepSymbolsList string
345 stripKeepSymbolsAndDebugFrame bool
346 stripKeepMiniDebugInfo bool
347 stripAddGnuDebuglink bool
348 stripUseGnuStrip bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800349
Colin Cross19878da2019-03-28 14:45:07 -0700350 proto android.ProtoFlags
Dan Willemsen60e62f02018-11-16 21:05:32 -0800351 protoC bool
352 protoOptionsFile bool
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700353
354 yacc *YaccProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800355}
356
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700357type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800358 objFiles android.Paths
359 tidyFiles android.Paths
360 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800361 sAbiDumpFiles android.Paths
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800362 kytheFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700363}
364
365func (a Objects) Copy() Objects {
366 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800367 objFiles: append(android.Paths{}, a.objFiles...),
368 tidyFiles: append(android.Paths{}, a.tidyFiles...),
369 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800370 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800371 kytheFiles: append(android.Paths{}, a.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700372 }
373}
374
375func (a Objects) Append(b Objects) Objects {
376 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800377 objFiles: append(a.objFiles, b.objFiles...),
378 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
379 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800380 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800381 kytheFiles: append(a.kytheFiles, b.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700382 }
383}
384
Colin Cross3f40fa42015-01-30 17:27:36 -0800385// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700386func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800387 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700388
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700389 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700390 var tidyFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700391 if flags.tidy {
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700392 tidyFiles = make(android.Paths, 0, len(srcFiles))
393 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800394 var coverageFiles android.Paths
Oliver Nguyen04526782020-04-21 12:40:27 -0700395 if flags.gcovCoverage {
Dan Willemsen581341d2017-02-09 16:16:31 -0800396 coverageFiles = make(android.Paths, 0, len(srcFiles))
397 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800398 var kytheFiles android.Paths
399 if flags.emitXrefs {
400 kytheFiles = make(android.Paths, 0, len(srcFiles))
401 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800402
Colin Cross6d88dba2019-11-06 07:06:58 -0800403 // Produce fully expanded flags for use by C tools, C compiles, C++ tools, C++ compiles, and asm compiles
404 // respectively.
405 toolingCflags := flags.globalCommonFlags + " " +
406 flags.globalToolingCFlags + " " +
407 flags.globalConlyFlags + " " +
408 flags.localCommonFlags + " " +
409 flags.localToolingCFlags + " " +
410 flags.localConlyFlags + " " +
411 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700412
Colin Cross6d88dba2019-11-06 07:06:58 -0800413 cflags := flags.globalCommonFlags + " " +
414 flags.globalCFlags + " " +
415 flags.globalConlyFlags + " " +
416 flags.localCommonFlags + " " +
417 flags.localCFlags + " " +
418 flags.localConlyFlags + " " +
419 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700420
Colin Cross6d88dba2019-11-06 07:06:58 -0800421 toolingCppflags := flags.globalCommonFlags + " " +
422 flags.globalToolingCFlags + " " +
423 flags.globalToolingCppFlags + " " +
424 flags.localCommonFlags + " " +
425 flags.localToolingCFlags + " " +
426 flags.localToolingCppFlags + " " +
427 flags.systemIncludeFlags
Colin Crossc3199482017-03-30 15:03:04 -0700428
Colin Cross6d88dba2019-11-06 07:06:58 -0800429 cppflags := flags.globalCommonFlags + " " +
430 flags.globalCFlags + " " +
431 flags.globalCppFlags + " " +
432 flags.localCommonFlags + " " +
433 flags.localCFlags + " " +
434 flags.localCppFlags + " " +
435 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700436
Colin Cross6d88dba2019-11-06 07:06:58 -0800437 asflags := flags.globalCommonFlags + " " +
438 flags.globalAsFlags + " " +
439 flags.localCommonFlags + " " +
440 flags.localAsFlags + " " +
441 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700442
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800443 var sAbiDumpFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700444 if flags.sAbiDump {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800445 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
446 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800447
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700448 cflags += " ${config.NoOverrideClangGlobalCflags}"
449 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
450 cppflags += " ${config.NoOverrideClangGlobalCflags}"
451 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800452
Colin Cross3f40fa42015-01-30 17:27:36 -0800453 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700454 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800455
456 objFiles[i] = objFile
457
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700458 switch srcFile.Ext() {
459 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700460 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700461 Rule: yasm,
462 Description: "yasm " + srcFile.Rel(),
463 Output: objFile,
464 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800465 Implicits: cFlagsDeps,
466 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800467 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800468 "asFlags": flags.globalYasmFlags + " " + flags.localYasmFlags,
Colin Cross91e90042016-12-02 17:13:24 -0800469 },
470 })
471 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700472 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700473 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700474 Rule: windres,
475 Description: "windres " + srcFile.Rel(),
476 Output: objFile,
477 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800478 Implicits: cFlagsDeps,
479 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700480 Args: map[string]string{
481 "windresCmd": gccCmd(flags.toolchain, "windres"),
482 "flags": flags.toolchain.WindresFlags(),
483 },
484 })
485 continue
Pete Bentleyfcf55bf2019-08-16 20:14:32 +0100486 case ".o":
487 objFiles[i] = srcFile
488 continue
Colin Cross91e90042016-12-02 17:13:24 -0800489 }
490
Colin Cross6d88dba2019-11-06 07:06:58 -0800491 var moduleFlags string
492 var moduleToolingFlags string
493
Colin Cross3f40fa42015-01-30 17:27:36 -0800494 var ccCmd string
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700495 tidy := flags.tidy
Oliver Nguyen04526782020-04-21 12:40:27 -0700496 coverage := flags.gcovCoverage
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700497 dump := flags.sAbiDump
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800498 rule := cc
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800499 emitXref := flags.emitXrefs
Colin Cross3f40fa42015-01-30 17:27:36 -0800500
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700501 switch srcFile.Ext() {
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800502 case ".s":
Dan Willemsen98ab3112019-08-27 21:20:40 -0700503 if !flags.assemblerWithCpp {
504 rule = ccNoDeps
505 }
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800506 fallthrough
507 case ".S":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700508 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800509 moduleFlags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700510 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800511 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800512 dump = false
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800513 emitXref = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800514 case ".c":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700515 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800516 moduleFlags = cflags
517 moduleToolingFlags = toolingCflags
Colin Crossd34ab7c2019-06-27 14:46:10 -0700518 case ".cpp", ".cc", ".cxx", ".mm":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700519 ccCmd = "clang++"
Colin Cross6d88dba2019-11-06 07:06:58 -0800520 moduleFlags = cppflags
521 moduleToolingFlags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800522 default:
523 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
524 continue
525 }
526
Colin Cross67a5c132017-05-09 13:45:28 -0700527 ccDesc := ccCmd
528
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700529 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800530
Dan Willemsen581341d2017-02-09 16:16:31 -0800531 var implicitOutputs android.WritablePaths
532 if coverage {
533 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
534 implicitOutputs = append(implicitOutputs, gcnoFile)
535 coverageFiles = append(coverageFiles, gcnoFile)
536 }
537
Colin Crossae887032017-10-23 17:16:14 -0700538 ctx.Build(pctx, android.BuildParams{
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800539 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700540 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800541 Output: objFile,
542 ImplicitOutputs: implicitOutputs,
543 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800544 Implicits: cFlagsDeps,
545 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800546 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800547 "cFlags": moduleFlags,
Colin Cross28344522015-04-22 13:07:53 -0700548 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800549 },
550 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700551
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800552 if emitXref {
553 kytheFile := android.ObjPathWithExt(ctx, subdir, srcFile, "kzip")
554 ctx.Build(pctx, android.BuildParams{
555 Rule: kytheExtract,
556 Description: "Xref C++ extractor " + srcFile.Rel(),
557 Output: kytheFile,
558 Input: srcFile,
559 Implicits: cFlagsDeps,
560 OrderOnly: pathDeps,
561 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800562 "cFlags": moduleFlags,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800563 },
564 })
565 kytheFiles = append(kytheFiles, kytheFile)
566 }
567
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700568 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700569 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700570 tidyFiles = append(tidyFiles, tidyFile)
571
Colin Crossae887032017-10-23 17:16:14 -0700572 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700573 Rule: clangTidy,
574 Description: "clang-tidy " + srcFile.Rel(),
575 Output: tidyFile,
576 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700577 // We must depend on objFile, since clang-tidy doesn't
578 // support exporting dependencies.
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700579 Implicit: objFile,
580 Implicits: cFlagsDeps,
581 OrderOnly: pathDeps,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700582 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800583 "cFlags": moduleToolingFlags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700584 "tidyFlags": flags.tidyFlags,
585 },
586 })
587 }
588
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800589 if dump {
590 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
591 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
592
Ramy Medhat31ec9422020-04-17 15:03:58 -0400593 dumpRule := sAbiDump
594 if ctx.Config().IsEnvTrue("RBE_ABI_DUMPER") {
595 dumpRule = sAbiDumpRE
596 }
Colin Crossae887032017-10-23 17:16:14 -0700597 ctx.Build(pctx, android.BuildParams{
Ramy Medhat31ec9422020-04-17 15:03:58 -0400598 Rule: dumpRule,
Colin Cross67a5c132017-05-09 13:45:28 -0700599 Description: "header-abi-dumper " + srcFile.Rel(),
600 Output: sAbiDumpFile,
601 Input: srcFile,
602 Implicit: objFile,
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700603 Implicits: cFlagsDeps,
604 OrderOnly: pathDeps,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800605 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800606 "cFlags": moduleToolingFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800607 "exportDirs": flags.sAbiFlags,
608 },
609 })
610 }
611
Colin Cross3f40fa42015-01-30 17:27:36 -0800612 }
613
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700614 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800615 objFiles: objFiles,
616 tidyFiles: tidyFiles,
617 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800618 sAbiDumpFiles: sAbiDumpFiles,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800619 kytheFiles: kytheFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700620 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800621}
622
623// Generate a rule for compiling multiple .o files to a static library (.a)
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100624func TransformObjToStaticLib(ctx android.ModuleContext,
625 objFiles android.Paths, wholeStaticLibs android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700626 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800627
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800628 arCmd := "${config.ClangBin}/llvm-ar"
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100629 arFlags := ""
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800630 if !ctx.Darwin() {
631 arFlags += " -format=gnu"
632 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800633
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100634 if len(wholeStaticLibs) == 0 {
635 ctx.Build(pctx, android.BuildParams{
636 Rule: ar,
637 Description: "static link " + outputFile.Base(),
638 Output: outputFile,
639 Inputs: objFiles,
640 Implicits: deps,
641 Args: map[string]string{
642 "arFlags": "crsPD" + arFlags,
643 "arCmd": arCmd,
644 },
645 })
646
647 } else {
648 ctx.Build(pctx, android.BuildParams{
649 Rule: arWithLibs,
650 Description: "static link " + outputFile.Base(),
651 Output: outputFile,
652 Inputs: append(objFiles, wholeStaticLibs...),
653 Implicits: deps,
654 Args: map[string]string{
655 "arCmd": arCmd,
656 "arObjFlags": "crsPD" + arFlags,
657 "arObjs": strings.Join(objFiles.Strings(), " "),
658 "arLibFlags": "cqsL" + arFlags,
659 "arLibs": strings.Join(wholeStaticLibs.Strings(), " "),
660 },
661 })
662 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800663}
664
665// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700666// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700667func TransformObjToDynamicBinary(ctx android.ModuleContext,
668 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
Josh Gao75a50a22019-06-07 17:58:59 -0700669 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath, implicitOutputs android.WritablePaths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800670
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700671 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800672
Colin Cross3f40fa42015-01-30 17:27:36 -0800673 var libFlagsList []string
674
Colin Cross16b23492016-01-06 14:41:07 -0800675 if len(flags.libFlags) > 0 {
676 libFlagsList = append(libFlagsList, flags.libFlags)
677 }
678
Colin Cross3f40fa42015-01-30 17:27:36 -0800679 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800680 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700681 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700682 } else {
683 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700684 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700685 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
686 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800687 }
688
Colin Cross7a7cf972016-12-05 18:47:39 -0800689 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800690 libFlagsList = append(libFlagsList, "-Wl,--start-group")
691 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700692 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800693 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800694 libFlagsList = append(libFlagsList, "-Wl,--end-group")
695 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800696
Stephen Hines10347862016-07-18 15:54:54 -0700697 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700698 libFlagsList = append(libFlagsList, "-Wl,--start-group")
699 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700700 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700701 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700702 libFlagsList = append(libFlagsList, "-Wl,--end-group")
703 }
704
Colin Cross3f40fa42015-01-30 17:27:36 -0800705 for _, lib := range sharedLibs {
Josh Gao75a50a22019-06-07 17:58:59 -0700706 libFile := lib.String()
707 if ctx.Windows() {
708 libFile = pathtools.ReplaceExtension(libFile, "lib")
709 }
710 libFlagsList = append(libFlagsList, libFile)
Colin Cross3f40fa42015-01-30 17:27:36 -0800711 }
712
Colin Cross3f40fa42015-01-30 17:27:36 -0800713 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700714 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800715 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700716 if crtBegin.Valid() {
717 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800718 }
719
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400720 rule := ld
Kousik Kumar3fb61262020-04-22 13:31:09 -0700721 args := map[string]string{
722 "ldCmd": ldCmd,
723 "crtBegin": crtBegin.String(),
724 "libFlags": strings.Join(libFlagsList, " "),
725 "extraLibFlags": flags.extraLibFlags,
726 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
727 "crtEnd": crtEnd.String(),
728 }
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400729 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
730 rule = ldRE
Kousik Kumar3fb61262020-04-22 13:31:09 -0700731 args["implicitOutputs"] = strings.Join(implicitOutputs.Strings(), ",")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400732 }
733
Colin Crossae887032017-10-23 17:16:14 -0700734 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400735 Rule: rule,
Josh Gao75a50a22019-06-07 17:58:59 -0700736 Description: "link " + outputFile.Base(),
737 Output: outputFile,
738 ImplicitOutputs: implicitOutputs,
739 Inputs: objFiles,
740 Implicits: deps,
Kousik Kumar3fb61262020-04-22 13:31:09 -0700741 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800742 })
743}
744
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800745// Generate a rule to combine .dump sAbi dump files from multiple source files
746// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700747func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800748 baseName, exportedHeaderFlags string, symbolFile android.OptionalPath,
749 excludedSymbolVersions, excludedSymbolTags []string) android.OptionalPath {
750
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800751 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800752
753 implicits := android.Paths{soFile}
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800754 symbolFilterStr := "-so " + soFile.String()
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800755
756 if symbolFile.Valid() {
757 implicits = append(implicits, symbolFile.Path())
758 symbolFilterStr += " -v " + symbolFile.String()
759 }
760 for _, ver := range excludedSymbolVersions {
761 symbolFilterStr += " --exclude-symbol-version " + ver
762 }
763 for _, tag := range excludedSymbolTags {
764 symbolFilterStr += " --exclude-symbol-tag " + tag
765 }
Ramy Medhat808594c2020-05-07 06:56:47 -0400766 rule := sAbiLink
767 args := map[string]string{
768 "symbolFilter": symbolFilterStr,
769 "arch": ctx.Arch().ArchType.Name,
770 "exportedHeaderFlags": exportedHeaderFlags,
771 }
772 if ctx.Config().IsEnvTrue("RBE_ABI_LINKER") {
773 rule = sAbiLinkRE
774 rbeImplicits := implicits.Strings()
775 for _, p := range strings.Split(exportedHeaderFlags, " ") {
776 if len(p) > 2 {
777 // Exclude the -I prefix.
778 rbeImplicits = append(rbeImplicits, p[2:])
779 }
780 }
781 args["implicits"] = strings.Join(rbeImplicits, ",")
782 }
Colin Crossae887032017-10-23 17:16:14 -0700783 ctx.Build(pctx, android.BuildParams{
Ramy Medhat808594c2020-05-07 06:56:47 -0400784 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700785 Description: "header-abi-linker " + outputFile.Base(),
786 Output: outputFile,
787 Inputs: sAbiDumps,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800788 Implicits: implicits,
Ramy Medhat808594c2020-05-07 06:56:47 -0400789 Args: args,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800790 })
791 return android.OptionalPathForPath(outputFile)
792}
793
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700794func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
795 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700796 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700797 Rule: unzipRefSAbiDump,
798 Description: "gunzip" + outputFile.Base(),
799 Output: outputFile,
800 Input: zippedRefDump,
801 })
802 return outputFile
803}
804
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800805func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chien2a65dda2019-10-01 15:58:07 -0700806 baseName, exportedHeaderFlags string, checkAllApis, isLlndk, isNdk, isVndkExt bool) android.OptionalPath {
Logan Chienf3511742017-10-31 18:04:35 +0800807
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800808 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700809 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Logan Chien6227fed2019-02-18 13:12:21 +0800810 createReferenceDumpFlags := ""
811
Logan Chien2a65dda2019-10-01 15:58:07 -0700812 var extraFlags []string
813 if checkAllApis {
814 extraFlags = append(extraFlags, "-check-all-apis")
815 } else {
816 extraFlags = append(extraFlags,
817 "-allow-unreferenced-changes",
818 "-allow-unreferenced-elf-symbol-changes")
Jayant Chowdharye4499502018-01-17 13:13:33 -0800819 }
Logan Chien2a65dda2019-10-01 15:58:07 -0700820
821 if exportedHeaderFlags == "" {
822 extraFlags = append(extraFlags, "-advice-only")
823 }
824
Logan Chien62f1f942019-02-18 15:40:42 +0800825 if isLlndk || isNdk {
Logan Chien6227fed2019-02-18 13:12:21 +0800826 createReferenceDumpFlags = "--llndk"
Logan Chien62f1f942019-02-18 15:40:42 +0800827 if isLlndk {
828 // TODO(b/130324828): "-consider-opaque-types-different" should apply to
829 // both LLNDK and NDK shared libs. However, a known issue in header-abi-diff
830 // breaks libaaudio. Remove the if-guard after the issue is fixed.
Logan Chien2a65dda2019-10-01 15:58:07 -0700831 extraFlags = append(extraFlags, "-consider-opaque-types-different")
Logan Chien62f1f942019-02-18 15:40:42 +0800832 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700833 }
Logan Chienf3511742017-10-31 18:04:35 +0800834 if isVndkExt {
Logan Chien2a65dda2019-10-01 15:58:07 -0700835 extraFlags = append(extraFlags, "-allow-extensions")
Logan Chienf3511742017-10-31 18:04:35 +0800836 }
837
Colin Crossae887032017-10-23 17:16:14 -0700838 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700839 Rule: sAbiDiff,
840 Description: "header-abi-diff " + outputFile.Base(),
841 Output: outputFile,
842 Input: inputDump,
843 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800844 Args: map[string]string{
Logan Chien6227fed2019-02-18 13:12:21 +0800845 "referenceDump": referenceDump.String(),
846 "libName": libName,
847 "arch": ctx.Arch().ArchType.Name,
Logan Chien2a65dda2019-10-01 15:58:07 -0700848 "extraFlags": strings.Join(extraFlags, " "),
Logan Chien6227fed2019-02-18 13:12:21 +0800849 "createReferenceDumpFlags": createReferenceDumpFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800850 },
851 })
852 return android.OptionalPathForPath(outputFile)
853}
854
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700855// Generate a rule for extracting a table of contents from a shared library (.so)
856func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700857 outputFile android.WritablePath, flags builderFlags) {
858
Colin Crossb496cfd2018-09-10 16:50:05 -0700859 var format string
860 var crossCompile string
861 if ctx.Darwin() {
862 format = "--macho"
863 crossCompile = "${config.MacToolPath}"
864 } else if ctx.Windows() {
865 format = "--pe"
866 crossCompile = gccCmd(flags.toolchain, "")
867 } else {
868 format = "--elf"
869 crossCompile = gccCmd(flags.toolchain, "")
870 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700871
Colin Crossae887032017-10-23 17:16:14 -0700872 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700873 Rule: toc,
874 Description: "generate toc " + inputFile.Base(),
875 Output: outputFile,
876 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700877 Args: map[string]string{
878 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700879 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700880 },
881 })
882}
883
Colin Cross3f40fa42015-01-30 17:27:36 -0800884// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700885func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700886 flags builderFlags, outputFile android.WritablePath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800887
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700888 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800889
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400890 rule := partialLd
891 args := map[string]string{
892 "ldCmd": ldCmd,
893 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
894 }
895 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
896 rule = partialLdRE
897 args["inCommaList"] = strings.Join(objFiles.Strings(), ",")
898 }
Colin Crossae887032017-10-23 17:16:14 -0700899 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400900 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700901 Description: "link " + outputFile.Base(),
902 Output: outputFile,
903 Inputs: objFiles,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700904 Implicits: deps,
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400905 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800906 })
907}
908
Colin Crossbfae8852015-03-26 14:44:11 -0700909// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700910func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
911 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700912
913 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
914
Colin Crossae887032017-10-23 17:16:14 -0700915 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700916 Rule: prefixSymbols,
917 Description: "prefix symbols " + outputFile.Base(),
918 Output: outputFile,
919 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700920 Args: map[string]string{
921 "objcopyCmd": objcopyCmd,
922 "prefix": prefix,
923 },
924 })
925}
926
Colin Cross635c3b02016-05-18 15:37:25 -0700927func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
928 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700929
930 crossCompile := gccCmd(flags.toolchain, "")
931 args := ""
932 if flags.stripAddGnuDebuglink {
933 args += " --add-gnu-debuglink"
934 }
935 if flags.stripKeepMiniDebugInfo {
936 args += " --keep-mini-debug-info"
937 }
938 if flags.stripKeepSymbols {
939 args += " --keep-symbols"
940 }
Yi Kongacee27c2019-03-29 20:05:14 -0700941 if flags.stripKeepSymbolsList != "" {
942 args += " -k" + flags.stripKeepSymbolsList
943 }
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700944 if flags.stripKeepSymbolsAndDebugFrame {
945 args += " --keep-symbols-and-debug-frame"
946 }
Yi Kongb5c34d72018-11-07 16:28:49 -0800947 if flags.stripUseGnuStrip {
948 args += " --use-gnu-strip"
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700949 }
Colin Cross665dce92016-04-28 14:50:03 -0700950
Colin Crossae887032017-10-23 17:16:14 -0700951 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700952 Rule: strip,
953 Description: "strip " + outputFile.Base(),
954 Output: outputFile,
955 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700956 Args: map[string]string{
957 "crossCompile": crossCompile,
958 "args": args,
959 },
960 })
961}
962
Colin Cross635c3b02016-05-18 15:37:25 -0700963func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
964 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700965
Colin Crossae887032017-10-23 17:16:14 -0700966 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700967 Rule: darwinStrip,
968 Description: "strip " + outputFile.Base(),
969 Output: outputFile,
970 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700971 })
972}
973
Oliver Nguyenc7434142019-04-24 14:22:25 -0700974func TransformCoverageFilesToZip(ctx android.ModuleContext,
975 inputs Objects, baseName string) android.OptionalPath {
Dan Willemsen581341d2017-02-09 16:16:31 -0800976
977 if len(inputs.coverageFiles) > 0 {
Oliver Nguyenc7434142019-04-24 14:22:25 -0700978 outputFile := android.PathForModuleOut(ctx, baseName+".zip")
Dan Willemsen581341d2017-02-09 16:16:31 -0800979
Oliver Nguyenc7434142019-04-24 14:22:25 -0700980 ctx.Build(pctx, android.BuildParams{
981 Rule: zip,
982 Description: "zip " + outputFile.Base(),
983 Inputs: inputs.coverageFiles,
984 Output: outputFile,
985 })
Dan Willemsen581341d2017-02-09 16:16:31 -0800986
987 return android.OptionalPathForPath(outputFile)
988 }
989
990 return android.OptionalPath{}
991}
992
Yi Kongc49c3932019-10-15 02:01:19 -0700993func TransformArchiveRepack(ctx android.ModuleContext, inputFile android.Path,
994 outputFile android.WritablePath, objects []string) {
995
996 ctx.Build(pctx, android.BuildParams{
997 Rule: archiveRepack,
998 Description: "Repack archive " + outputFile.Base(),
999 Output: outputFile,
1000 Input: inputFile,
1001 Args: map[string]string{
1002 "objects": strings.Join(objects, " "),
1003 },
1004 })
1005}
1006
Colin Crossb98c8b02016-07-29 13:44:28 -07001007func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -08001008 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
1009}
Colin Cross0af4b842015-04-30 16:36:18 -07001010
Colin Cross5b529592017-05-09 13:34:34 -07001011func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -07001012 var i int
1013
1014 start := 0
1015 bytes := 0
1016 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -07001017 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -07001018 if l > limit {
1019 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
1020 }
1021 if bytes+l > limit {
1022 lists = append(lists, list[start:i])
1023 start = i
1024 bytes = 0
1025 }
1026 bytes += l + 1 // count a space between each list element
1027 }
1028
1029 lists = append(lists, list[start:])
1030
1031 totalLen := 0
1032 for _, l := range lists {
1033 totalLen += len(l)
1034 }
1035 if totalLen != len(list) {
1036 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
1037 }
1038 return lists, nil
1039}