blob: e571e5a0cbfb4f20126d5d00ed540a713581a1ab [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
Dan Willemsen322a0a62015-11-17 15:19:46 -0800286func init() {
287 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
288 // debug output. That way two builds in two different directories will
289 // create the same output.
290 if runtime.GOOS != "darwin" {
291 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
292 } else {
293 // Darwin doesn't have /proc
294 pctx.StaticVariable("relPwd", "")
295 }
Oliver Nguyenc7434142019-04-24 14:22:25 -0700296
297 pctx.HostBinToolVariable("SoongZipCmd", "soong_zip")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400298 pctx.Import("android/soong/remoteexec")
Dan Willemsen322a0a62015-11-17 15:19:46 -0800299}
300
Colin Cross3f40fa42015-01-30 17:27:36 -0800301type builderFlags struct {
Colin Cross6d88dba2019-11-06 07:06:58 -0800302 globalCommonFlags string
303 globalAsFlags string
304 globalYasmFlags string
305 globalCFlags string
306 globalToolingCFlags string // A separate set of cFlags for clang LibTooling tools
307 globalToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
308 globalConlyFlags string
309 globalCppFlags string
310 globalLdFlags string
311
312 localCommonFlags string
313 localAsFlags string
314 localYasmFlags string
315 localCFlags string
316 localToolingCFlags string // A separate set of cFlags for clang LibTooling tools
317 localToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
318 localConlyFlags string
319 localCppFlags string
320 localLdFlags string
321
322 libFlags string
323 extraLibFlags string
324 tidyFlags string
325 sAbiFlags string
326 aidlFlags string
327 rsFlags string
328 toolchain config.Toolchain
329 tidy bool
Oliver Nguyen04526782020-04-21 12:40:27 -0700330 gcovCoverage bool
Colin Cross6d88dba2019-11-06 07:06:58 -0800331 sAbiDump bool
332 emitXrefs bool
Colin Cross665dce92016-04-28 14:50:03 -0700333
Dan Willemsen98ab3112019-08-27 21:20:40 -0700334 assemblerWithCpp bool
335
Colin Crossc3199482017-03-30 15:03:04 -0700336 systemIncludeFlags string
337
Colin Cross18c0c5a2016-12-01 14:45:23 -0800338 groupStaticLibs bool
339
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700340 stripKeepSymbols bool
341 stripKeepSymbolsList string
342 stripKeepSymbolsAndDebugFrame bool
343 stripKeepMiniDebugInfo bool
344 stripAddGnuDebuglink bool
345 stripUseGnuStrip bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800346
Colin Cross19878da2019-03-28 14:45:07 -0700347 proto android.ProtoFlags
Dan Willemsen60e62f02018-11-16 21:05:32 -0800348 protoC bool
349 protoOptionsFile bool
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700350
351 yacc *YaccProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800352}
353
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700354type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800355 objFiles android.Paths
356 tidyFiles android.Paths
357 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800358 sAbiDumpFiles android.Paths
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800359 kytheFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700360}
361
362func (a Objects) Copy() Objects {
363 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800364 objFiles: append(android.Paths{}, a.objFiles...),
365 tidyFiles: append(android.Paths{}, a.tidyFiles...),
366 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800367 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800368 kytheFiles: append(android.Paths{}, a.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700369 }
370}
371
372func (a Objects) Append(b Objects) Objects {
373 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800374 objFiles: append(a.objFiles, b.objFiles...),
375 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
376 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800377 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800378 kytheFiles: append(a.kytheFiles, b.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700379 }
380}
381
Colin Cross3f40fa42015-01-30 17:27:36 -0800382// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700383func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800384 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700385
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700386 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700387 var tidyFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700388 if flags.tidy {
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700389 tidyFiles = make(android.Paths, 0, len(srcFiles))
390 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800391 var coverageFiles android.Paths
Oliver Nguyen04526782020-04-21 12:40:27 -0700392 if flags.gcovCoverage {
Dan Willemsen581341d2017-02-09 16:16:31 -0800393 coverageFiles = make(android.Paths, 0, len(srcFiles))
394 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800395 var kytheFiles android.Paths
396 if flags.emitXrefs {
397 kytheFiles = make(android.Paths, 0, len(srcFiles))
398 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800399
Colin Cross6d88dba2019-11-06 07:06:58 -0800400 // Produce fully expanded flags for use by C tools, C compiles, C++ tools, C++ compiles, and asm compiles
401 // respectively.
402 toolingCflags := flags.globalCommonFlags + " " +
403 flags.globalToolingCFlags + " " +
404 flags.globalConlyFlags + " " +
405 flags.localCommonFlags + " " +
406 flags.localToolingCFlags + " " +
407 flags.localConlyFlags + " " +
408 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700409
Colin Cross6d88dba2019-11-06 07:06:58 -0800410 cflags := flags.globalCommonFlags + " " +
411 flags.globalCFlags + " " +
412 flags.globalConlyFlags + " " +
413 flags.localCommonFlags + " " +
414 flags.localCFlags + " " +
415 flags.localConlyFlags + " " +
416 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700417
Colin Cross6d88dba2019-11-06 07:06:58 -0800418 toolingCppflags := flags.globalCommonFlags + " " +
419 flags.globalToolingCFlags + " " +
420 flags.globalToolingCppFlags + " " +
421 flags.localCommonFlags + " " +
422 flags.localToolingCFlags + " " +
423 flags.localToolingCppFlags + " " +
424 flags.systemIncludeFlags
Colin Crossc3199482017-03-30 15:03:04 -0700425
Colin Cross6d88dba2019-11-06 07:06:58 -0800426 cppflags := flags.globalCommonFlags + " " +
427 flags.globalCFlags + " " +
428 flags.globalCppFlags + " " +
429 flags.localCommonFlags + " " +
430 flags.localCFlags + " " +
431 flags.localCppFlags + " " +
432 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700433
Colin Cross6d88dba2019-11-06 07:06:58 -0800434 asflags := flags.globalCommonFlags + " " +
435 flags.globalAsFlags + " " +
436 flags.localCommonFlags + " " +
437 flags.localAsFlags + " " +
438 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700439
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800440 var sAbiDumpFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700441 if flags.sAbiDump {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800442 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
443 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800444
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700445 cflags += " ${config.NoOverrideClangGlobalCflags}"
446 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
447 cppflags += " ${config.NoOverrideClangGlobalCflags}"
448 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800449
Colin Cross3f40fa42015-01-30 17:27:36 -0800450 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700451 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800452
453 objFiles[i] = objFile
454
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700455 switch srcFile.Ext() {
456 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700457 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700458 Rule: yasm,
459 Description: "yasm " + srcFile.Rel(),
460 Output: objFile,
461 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800462 Implicits: cFlagsDeps,
463 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800464 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800465 "asFlags": flags.globalYasmFlags + " " + flags.localYasmFlags,
Colin Cross91e90042016-12-02 17:13:24 -0800466 },
467 })
468 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700469 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700470 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700471 Rule: windres,
472 Description: "windres " + srcFile.Rel(),
473 Output: objFile,
474 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800475 Implicits: cFlagsDeps,
476 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700477 Args: map[string]string{
478 "windresCmd": gccCmd(flags.toolchain, "windres"),
479 "flags": flags.toolchain.WindresFlags(),
480 },
481 })
482 continue
Pete Bentleyfcf55bf2019-08-16 20:14:32 +0100483 case ".o":
484 objFiles[i] = srcFile
485 continue
Colin Cross91e90042016-12-02 17:13:24 -0800486 }
487
Colin Cross6d88dba2019-11-06 07:06:58 -0800488 var moduleFlags string
489 var moduleToolingFlags string
490
Colin Cross3f40fa42015-01-30 17:27:36 -0800491 var ccCmd string
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700492 tidy := flags.tidy
Oliver Nguyen04526782020-04-21 12:40:27 -0700493 coverage := flags.gcovCoverage
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700494 dump := flags.sAbiDump
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800495 rule := cc
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800496 emitXref := flags.emitXrefs
Colin Cross3f40fa42015-01-30 17:27:36 -0800497
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700498 switch srcFile.Ext() {
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800499 case ".s":
Dan Willemsen98ab3112019-08-27 21:20:40 -0700500 if !flags.assemblerWithCpp {
501 rule = ccNoDeps
502 }
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800503 fallthrough
504 case ".S":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700505 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800506 moduleFlags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700507 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800508 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800509 dump = false
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800510 emitXref = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800511 case ".c":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700512 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800513 moduleFlags = cflags
514 moduleToolingFlags = toolingCflags
Colin Crossd34ab7c2019-06-27 14:46:10 -0700515 case ".cpp", ".cc", ".cxx", ".mm":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700516 ccCmd = "clang++"
Colin Cross6d88dba2019-11-06 07:06:58 -0800517 moduleFlags = cppflags
518 moduleToolingFlags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800519 default:
520 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
521 continue
522 }
523
Colin Cross67a5c132017-05-09 13:45:28 -0700524 ccDesc := ccCmd
525
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700526 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800527
Dan Willemsen581341d2017-02-09 16:16:31 -0800528 var implicitOutputs android.WritablePaths
529 if coverage {
530 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
531 implicitOutputs = append(implicitOutputs, gcnoFile)
532 coverageFiles = append(coverageFiles, gcnoFile)
533 }
534
Colin Crossae887032017-10-23 17:16:14 -0700535 ctx.Build(pctx, android.BuildParams{
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800536 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700537 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800538 Output: objFile,
539 ImplicitOutputs: implicitOutputs,
540 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800541 Implicits: cFlagsDeps,
542 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800543 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800544 "cFlags": moduleFlags,
Colin Cross28344522015-04-22 13:07:53 -0700545 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800546 },
547 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700548
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800549 if emitXref {
550 kytheFile := android.ObjPathWithExt(ctx, subdir, srcFile, "kzip")
551 ctx.Build(pctx, android.BuildParams{
552 Rule: kytheExtract,
553 Description: "Xref C++ extractor " + srcFile.Rel(),
554 Output: kytheFile,
555 Input: srcFile,
556 Implicits: cFlagsDeps,
557 OrderOnly: pathDeps,
558 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800559 "cFlags": moduleFlags,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800560 },
561 })
562 kytheFiles = append(kytheFiles, kytheFile)
563 }
564
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700565 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700566 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700567 tidyFiles = append(tidyFiles, tidyFile)
568
Colin Crossae887032017-10-23 17:16:14 -0700569 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700570 Rule: clangTidy,
571 Description: "clang-tidy " + srcFile.Rel(),
572 Output: tidyFile,
573 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700574 // We must depend on objFile, since clang-tidy doesn't
575 // support exporting dependencies.
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700576 Implicit: objFile,
577 Implicits: cFlagsDeps,
578 OrderOnly: pathDeps,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700579 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800580 "cFlags": moduleToolingFlags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700581 "tidyFlags": flags.tidyFlags,
582 },
583 })
584 }
585
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800586 if dump {
587 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
588 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
589
Ramy Medhat31ec9422020-04-17 15:03:58 -0400590 dumpRule := sAbiDump
591 if ctx.Config().IsEnvTrue("RBE_ABI_DUMPER") {
592 dumpRule = sAbiDumpRE
593 }
Colin Crossae887032017-10-23 17:16:14 -0700594 ctx.Build(pctx, android.BuildParams{
Ramy Medhat31ec9422020-04-17 15:03:58 -0400595 Rule: dumpRule,
Colin Cross67a5c132017-05-09 13:45:28 -0700596 Description: "header-abi-dumper " + srcFile.Rel(),
597 Output: sAbiDumpFile,
598 Input: srcFile,
599 Implicit: objFile,
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700600 Implicits: cFlagsDeps,
601 OrderOnly: pathDeps,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800602 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800603 "cFlags": moduleToolingFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800604 "exportDirs": flags.sAbiFlags,
605 },
606 })
607 }
608
Colin Cross3f40fa42015-01-30 17:27:36 -0800609 }
610
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700611 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800612 objFiles: objFiles,
613 tidyFiles: tidyFiles,
614 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800615 sAbiDumpFiles: sAbiDumpFiles,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800616 kytheFiles: kytheFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700617 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800618}
619
620// Generate a rule for compiling multiple .o files to a static library (.a)
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100621func TransformObjToStaticLib(ctx android.ModuleContext,
622 objFiles android.Paths, wholeStaticLibs android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700623 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800624
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800625 arCmd := "${config.ClangBin}/llvm-ar"
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100626 arFlags := ""
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800627 if !ctx.Darwin() {
628 arFlags += " -format=gnu"
629 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800630
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100631 if len(wholeStaticLibs) == 0 {
632 ctx.Build(pctx, android.BuildParams{
633 Rule: ar,
634 Description: "static link " + outputFile.Base(),
635 Output: outputFile,
636 Inputs: objFiles,
637 Implicits: deps,
638 Args: map[string]string{
639 "arFlags": "crsPD" + arFlags,
640 "arCmd": arCmd,
641 },
642 })
643
644 } else {
645 ctx.Build(pctx, android.BuildParams{
646 Rule: arWithLibs,
647 Description: "static link " + outputFile.Base(),
648 Output: outputFile,
649 Inputs: append(objFiles, wholeStaticLibs...),
650 Implicits: deps,
651 Args: map[string]string{
652 "arCmd": arCmd,
653 "arObjFlags": "crsPD" + arFlags,
654 "arObjs": strings.Join(objFiles.Strings(), " "),
655 "arLibFlags": "cqsL" + arFlags,
656 "arLibs": strings.Join(wholeStaticLibs.Strings(), " "),
657 },
658 })
659 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800660}
661
662// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700663// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700664func TransformObjToDynamicBinary(ctx android.ModuleContext,
665 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
Josh Gao75a50a22019-06-07 17:58:59 -0700666 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath, implicitOutputs android.WritablePaths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800667
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700668 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800669
Colin Cross3f40fa42015-01-30 17:27:36 -0800670 var libFlagsList []string
671
Colin Cross16b23492016-01-06 14:41:07 -0800672 if len(flags.libFlags) > 0 {
673 libFlagsList = append(libFlagsList, flags.libFlags)
674 }
675
Colin Cross3f40fa42015-01-30 17:27:36 -0800676 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800677 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700678 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700679 } else {
680 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700681 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700682 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
683 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800684 }
685
Colin Cross7a7cf972016-12-05 18:47:39 -0800686 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800687 libFlagsList = append(libFlagsList, "-Wl,--start-group")
688 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700689 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800690 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800691 libFlagsList = append(libFlagsList, "-Wl,--end-group")
692 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800693
Stephen Hines10347862016-07-18 15:54:54 -0700694 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700695 libFlagsList = append(libFlagsList, "-Wl,--start-group")
696 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700697 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700698 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700699 libFlagsList = append(libFlagsList, "-Wl,--end-group")
700 }
701
Colin Cross3f40fa42015-01-30 17:27:36 -0800702 for _, lib := range sharedLibs {
Josh Gao75a50a22019-06-07 17:58:59 -0700703 libFile := lib.String()
704 if ctx.Windows() {
705 libFile = pathtools.ReplaceExtension(libFile, "lib")
706 }
707 libFlagsList = append(libFlagsList, libFile)
Colin Cross3f40fa42015-01-30 17:27:36 -0800708 }
709
Colin Cross3f40fa42015-01-30 17:27:36 -0800710 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700711 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800712 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700713 if crtBegin.Valid() {
714 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800715 }
716
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400717 rule := ld
Kousik Kumar3fb61262020-04-22 13:31:09 -0700718 args := map[string]string{
719 "ldCmd": ldCmd,
720 "crtBegin": crtBegin.String(),
721 "libFlags": strings.Join(libFlagsList, " "),
722 "extraLibFlags": flags.extraLibFlags,
723 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
724 "crtEnd": crtEnd.String(),
725 }
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400726 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
727 rule = ldRE
Kousik Kumar3fb61262020-04-22 13:31:09 -0700728 args["implicitOutputs"] = strings.Join(implicitOutputs.Strings(), ",")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400729 }
730
Colin Crossae887032017-10-23 17:16:14 -0700731 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400732 Rule: rule,
Josh Gao75a50a22019-06-07 17:58:59 -0700733 Description: "link " + outputFile.Base(),
734 Output: outputFile,
735 ImplicitOutputs: implicitOutputs,
736 Inputs: objFiles,
737 Implicits: deps,
Kousik Kumar3fb61262020-04-22 13:31:09 -0700738 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800739 })
740}
741
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800742// Generate a rule to combine .dump sAbi dump files from multiple source files
743// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700744func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800745 baseName, exportedHeaderFlags string, symbolFile android.OptionalPath,
746 excludedSymbolVersions, excludedSymbolTags []string) android.OptionalPath {
747
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800748 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800749
750 implicits := android.Paths{soFile}
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800751 symbolFilterStr := "-so " + soFile.String()
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800752
753 if symbolFile.Valid() {
754 implicits = append(implicits, symbolFile.Path())
755 symbolFilterStr += " -v " + symbolFile.String()
756 }
757 for _, ver := range excludedSymbolVersions {
758 symbolFilterStr += " --exclude-symbol-version " + ver
759 }
760 for _, tag := range excludedSymbolTags {
761 symbolFilterStr += " --exclude-symbol-tag " + tag
762 }
Ramy Medhat808594c2020-05-07 06:56:47 -0400763 rule := sAbiLink
764 args := map[string]string{
765 "symbolFilter": symbolFilterStr,
766 "arch": ctx.Arch().ArchType.Name,
767 "exportedHeaderFlags": exportedHeaderFlags,
768 }
769 if ctx.Config().IsEnvTrue("RBE_ABI_LINKER") {
770 rule = sAbiLinkRE
771 rbeImplicits := implicits.Strings()
772 for _, p := range strings.Split(exportedHeaderFlags, " ") {
773 if len(p) > 2 {
774 // Exclude the -I prefix.
775 rbeImplicits = append(rbeImplicits, p[2:])
776 }
777 }
778 args["implicits"] = strings.Join(rbeImplicits, ",")
779 }
Colin Crossae887032017-10-23 17:16:14 -0700780 ctx.Build(pctx, android.BuildParams{
Ramy Medhat808594c2020-05-07 06:56:47 -0400781 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700782 Description: "header-abi-linker " + outputFile.Base(),
783 Output: outputFile,
784 Inputs: sAbiDumps,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800785 Implicits: implicits,
Ramy Medhat808594c2020-05-07 06:56:47 -0400786 Args: args,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800787 })
788 return android.OptionalPathForPath(outputFile)
789}
790
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700791func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
792 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700793 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700794 Rule: unzipRefSAbiDump,
795 Description: "gunzip" + outputFile.Base(),
796 Output: outputFile,
797 Input: zippedRefDump,
798 })
799 return outputFile
800}
801
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800802func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chien2a65dda2019-10-01 15:58:07 -0700803 baseName, exportedHeaderFlags string, checkAllApis, isLlndk, isNdk, isVndkExt bool) android.OptionalPath {
Logan Chienf3511742017-10-31 18:04:35 +0800804
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800805 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700806 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Logan Chien6227fed2019-02-18 13:12:21 +0800807 createReferenceDumpFlags := ""
808
Logan Chien2a65dda2019-10-01 15:58:07 -0700809 var extraFlags []string
810 if checkAllApis {
811 extraFlags = append(extraFlags, "-check-all-apis")
812 } else {
813 extraFlags = append(extraFlags,
814 "-allow-unreferenced-changes",
815 "-allow-unreferenced-elf-symbol-changes")
Jayant Chowdharye4499502018-01-17 13:13:33 -0800816 }
Logan Chien2a65dda2019-10-01 15:58:07 -0700817
818 if exportedHeaderFlags == "" {
819 extraFlags = append(extraFlags, "-advice-only")
820 }
821
Logan Chien62f1f942019-02-18 15:40:42 +0800822 if isLlndk || isNdk {
Logan Chien6227fed2019-02-18 13:12:21 +0800823 createReferenceDumpFlags = "--llndk"
Logan Chien62f1f942019-02-18 15:40:42 +0800824 if isLlndk {
825 // TODO(b/130324828): "-consider-opaque-types-different" should apply to
826 // both LLNDK and NDK shared libs. However, a known issue in header-abi-diff
827 // breaks libaaudio. Remove the if-guard after the issue is fixed.
Logan Chien2a65dda2019-10-01 15:58:07 -0700828 extraFlags = append(extraFlags, "-consider-opaque-types-different")
Logan Chien62f1f942019-02-18 15:40:42 +0800829 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700830 }
Logan Chienf3511742017-10-31 18:04:35 +0800831 if isVndkExt {
Logan Chien2a65dda2019-10-01 15:58:07 -0700832 extraFlags = append(extraFlags, "-allow-extensions")
Logan Chienf3511742017-10-31 18:04:35 +0800833 }
834
Colin Crossae887032017-10-23 17:16:14 -0700835 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700836 Rule: sAbiDiff,
837 Description: "header-abi-diff " + outputFile.Base(),
838 Output: outputFile,
839 Input: inputDump,
840 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800841 Args: map[string]string{
Logan Chien6227fed2019-02-18 13:12:21 +0800842 "referenceDump": referenceDump.String(),
843 "libName": libName,
844 "arch": ctx.Arch().ArchType.Name,
Logan Chien2a65dda2019-10-01 15:58:07 -0700845 "extraFlags": strings.Join(extraFlags, " "),
Logan Chien6227fed2019-02-18 13:12:21 +0800846 "createReferenceDumpFlags": createReferenceDumpFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800847 },
848 })
849 return android.OptionalPathForPath(outputFile)
850}
851
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700852// Generate a rule for extracting a table of contents from a shared library (.so)
853func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700854 outputFile android.WritablePath, flags builderFlags) {
855
Colin Crossb496cfd2018-09-10 16:50:05 -0700856 var format string
857 var crossCompile string
858 if ctx.Darwin() {
859 format = "--macho"
860 crossCompile = "${config.MacToolPath}"
861 } else if ctx.Windows() {
862 format = "--pe"
863 crossCompile = gccCmd(flags.toolchain, "")
864 } else {
865 format = "--elf"
866 crossCompile = gccCmd(flags.toolchain, "")
867 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700868
Colin Crossae887032017-10-23 17:16:14 -0700869 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700870 Rule: toc,
871 Description: "generate toc " + inputFile.Base(),
872 Output: outputFile,
873 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700874 Args: map[string]string{
875 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700876 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700877 },
878 })
879}
880
Colin Cross3f40fa42015-01-30 17:27:36 -0800881// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700882func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700883 flags builderFlags, outputFile android.WritablePath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800884
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700885 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800886
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400887 rule := partialLd
888 args := map[string]string{
889 "ldCmd": ldCmd,
890 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
891 }
892 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
893 rule = partialLdRE
894 args["inCommaList"] = strings.Join(objFiles.Strings(), ",")
895 }
Colin Crossae887032017-10-23 17:16:14 -0700896 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400897 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700898 Description: "link " + outputFile.Base(),
899 Output: outputFile,
900 Inputs: objFiles,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700901 Implicits: deps,
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400902 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800903 })
904}
905
Colin Crossbfae8852015-03-26 14:44:11 -0700906// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700907func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
908 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700909
910 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
911
Colin Crossae887032017-10-23 17:16:14 -0700912 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700913 Rule: prefixSymbols,
914 Description: "prefix symbols " + outputFile.Base(),
915 Output: outputFile,
916 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700917 Args: map[string]string{
918 "objcopyCmd": objcopyCmd,
919 "prefix": prefix,
920 },
921 })
922}
923
Colin Cross635c3b02016-05-18 15:37:25 -0700924func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
925 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700926
927 crossCompile := gccCmd(flags.toolchain, "")
928 args := ""
929 if flags.stripAddGnuDebuglink {
930 args += " --add-gnu-debuglink"
931 }
932 if flags.stripKeepMiniDebugInfo {
933 args += " --keep-mini-debug-info"
934 }
935 if flags.stripKeepSymbols {
936 args += " --keep-symbols"
937 }
Yi Kongacee27c2019-03-29 20:05:14 -0700938 if flags.stripKeepSymbolsList != "" {
939 args += " -k" + flags.stripKeepSymbolsList
940 }
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700941 if flags.stripKeepSymbolsAndDebugFrame {
942 args += " --keep-symbols-and-debug-frame"
943 }
Yi Kongb5c34d72018-11-07 16:28:49 -0800944 if flags.stripUseGnuStrip {
945 args += " --use-gnu-strip"
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700946 }
Colin Cross665dce92016-04-28 14:50:03 -0700947
Colin Crossae887032017-10-23 17:16:14 -0700948 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700949 Rule: strip,
950 Description: "strip " + outputFile.Base(),
951 Output: outputFile,
952 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700953 Args: map[string]string{
954 "crossCompile": crossCompile,
955 "args": args,
956 },
957 })
958}
959
Colin Cross635c3b02016-05-18 15:37:25 -0700960func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
961 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700962
Colin Crossae887032017-10-23 17:16:14 -0700963 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700964 Rule: darwinStrip,
965 Description: "strip " + outputFile.Base(),
966 Output: outputFile,
967 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700968 })
969}
970
Oliver Nguyenc7434142019-04-24 14:22:25 -0700971func TransformCoverageFilesToZip(ctx android.ModuleContext,
972 inputs Objects, baseName string) android.OptionalPath {
Dan Willemsen581341d2017-02-09 16:16:31 -0800973
974 if len(inputs.coverageFiles) > 0 {
Oliver Nguyenc7434142019-04-24 14:22:25 -0700975 outputFile := android.PathForModuleOut(ctx, baseName+".zip")
Dan Willemsen581341d2017-02-09 16:16:31 -0800976
Oliver Nguyenc7434142019-04-24 14:22:25 -0700977 ctx.Build(pctx, android.BuildParams{
978 Rule: zip,
979 Description: "zip " + outputFile.Base(),
980 Inputs: inputs.coverageFiles,
981 Output: outputFile,
982 })
Dan Willemsen581341d2017-02-09 16:16:31 -0800983
984 return android.OptionalPathForPath(outputFile)
985 }
986
987 return android.OptionalPath{}
988}
989
Yi Kongc49c3932019-10-15 02:01:19 -0700990func TransformArchiveRepack(ctx android.ModuleContext, inputFile android.Path,
991 outputFile android.WritablePath, objects []string) {
992
993 ctx.Build(pctx, android.BuildParams{
994 Rule: archiveRepack,
995 Description: "Repack archive " + outputFile.Base(),
996 Output: outputFile,
997 Input: inputFile,
998 Args: map[string]string{
999 "objects": strings.Join(objects, " "),
1000 },
1001 })
1002}
1003
Colin Crossb98c8b02016-07-29 13:44:28 -07001004func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -08001005 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
1006}
Colin Cross0af4b842015-04-30 16:36:18 -07001007
Colin Cross5b529592017-05-09 13:34:34 -07001008func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -07001009 var i int
1010
1011 start := 0
1012 bytes := 0
1013 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -07001014 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -07001015 if l > limit {
1016 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
1017 }
1018 if bytes+l > limit {
1019 lists = append(lists, list[start:i])
1020 start = i
1021 bytes = 0
1022 }
1023 bytes += l + 1 // count a space between each list element
1024 }
1025
1026 lists = append(lists, list[start:])
1027
1028 totalLen := 0
1029 for _, l := range lists {
1030 totalLen += len(l)
1031 }
1032 if totalLen != len(list) {
1033 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
1034 }
1035 return lists, nil
1036}