blob: ab25e5572ad935c5b8ba7395258b89e3161596f3 [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
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700177 clangTidy, clangTidyRE = remoteexec.StaticRules(pctx, "clangTidy",
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700178 blueprint.RuleParams{
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700179 Command: "rm -f $out && $reTemplate${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out",
George Burgess IVc4624c02019-04-04 16:22:37 -0700180 CommandDeps: []string{"${config.ClangBin}/clang-tidy"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700181 },
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700182 &remoteexec.REParams{
183 Labels: map[string]string{"type": "lint", "tool": "clang-tidy", "lang": "cpp"},
184 ExecStrategy: "${config.REClangTidyExecStrategy}",
185 Inputs: []string{"$in"},
186 // OutputFile here is $in for remote-execution since its possible that
187 // clang-tidy modifies the given input file itself and $out refers to the
188 // ".tidy" file generated for ninja-dependency reasons.
Colin Cross053fca12020-08-19 13:51:47 -0700189 OutputFiles: []string{"$in"},
190 Platform: map[string]string{remoteexec.PoolKey: "${config.REClangTidyPool}"},
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700191 }, []string{"cFlags", "tidyFlags"}, []string{})
Colin Cross91e90042016-12-02 17:13:24 -0800192
Nan Zhang43a485c2017-03-27 14:27:58 -0700193 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800194
195 yasm = pctx.AndroidStaticRule("yasm",
196 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700197 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800198 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700199 Depfile: "$out.d",
200 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800201 },
202 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800203
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700204 windres = pctx.AndroidStaticRule("windres",
205 blueprint.RuleParams{
Nick Desaulniers18eeffa2020-01-29 16:20:11 -0800206 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 -0700207 CommandDeps: []string{"$windresCmd"},
208 },
209 "windresCmd", "flags")
210
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800211 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800212
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700213 // -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 -0400214 sAbiDump, sAbiDumpRE = remoteexec.StaticRules(pctx, "sAbiDump",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800215 blueprint.RuleParams{
Ramy Medhat31ec9422020-04-17 15:03:58 -0400216 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 -0800217 CommandDeps: []string{"$sAbiDumper"},
Ramy Medhat31ec9422020-04-17 15:03:58 -0400218 }, &remoteexec.REParams{
219 Labels: map[string]string{"type": "abi-dump", "tool": "header-abi-dumper"},
220 ExecStrategy: "${config.REAbiDumperExecStrategy}",
221 Platform: map[string]string{
222 remoteexec.PoolKey: "${config.RECXXPool}",
223 "InputRootAbsolutePath": android.AbsSrcDirForExistingUseCases(),
224 },
225 }, []string{"cFlags", "exportDirs"}, nil)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800226
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800227 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
Ramy Medhat808594c2020-05-07 06:56:47 -0400228 _ = pctx.SourcePathVariable("sAbiLinkerLibs", "prebuilts/clang-tools/${config.HostPrebuiltTag}/lib64")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800229
Ramy Medhat808594c2020-05-07 06:56:47 -0400230 sAbiLink, sAbiLinkRE = remoteexec.StaticRules(pctx, "sAbiLink",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800231 blueprint.RuleParams{
Ramy Medhat808594c2020-05-07 06:56:47 -0400232 Command: "$reTemplate$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800233 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800234 Rspfile: "${out}.rsp",
235 RspfileContent: "${in}",
Ramy Medhat808594c2020-05-07 06:56:47 -0400236 }, &remoteexec.REParams{
237 Labels: map[string]string{"type": "tool", "name": "abi-linker"},
238 ExecStrategy: "${config.REAbiLinkerExecStrategy}",
239 Inputs: []string{"$sAbiLinkerLibs", "${out}.rsp", "$implicits"},
240 RSPFile: "${out}.rsp",
241 OutputFiles: []string{"$out"},
242 ToolchainInputs: []string{"$sAbiLinker"},
243 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXPool}"},
244 }, []string{"symbolFilter", "arch", "exportedHeaderFlags"}, []string{"implicits"})
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800245
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800246 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700247
Colin Cross2e2dbc22019-09-25 13:31:46 -0700248 sAbiDiff = pctx.RuleFunc("sAbiDiff",
Dan Willemsen54daaf02018-03-12 13:24:09 -0700249 func(ctx android.PackageRuleContext) blueprint.RuleParams {
Logan Chien2a65dda2019-10-01 15:58:07 -0700250 commandStr := "($sAbiDiffer ${extraFlags} -lib ${libName} -arch ${arch} -o ${out} -new ${in} -old ${referenceDump})"
Logan Chien6227fed2019-02-18 13:12:21 +0800251 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 +0800252 commandStr += " && (mkdir -p $$DIST_DIR/abidiffs && cp ${out} $$DIST_DIR/abidiffs/)"
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800253 commandStr += " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800254 return blueprint.RuleParams{
255 Command: commandStr,
256 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700257 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800258 },
Logan Chien2a65dda2019-10-01 15:58:07 -0700259 "extraFlags", "referenceDump", "libName", "arch", "createReferenceDumpFlags")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700260
261 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
262 blueprint.RuleParams{
263 Command: "gunzip -c $in > $out",
264 })
Oliver Nguyenc7434142019-04-24 14:22:25 -0700265
266 zip = pctx.AndroidStaticRule("zip",
267 blueprint.RuleParams{
Colin Cross053fca12020-08-19 13:51:47 -0700268 Command: "${SoongZipCmd} -o ${out} -C $$OUT_DIR -r ${out}.rsp",
Oliver Nguyenc7434142019-04-24 14:22:25 -0700269 CommandDeps: []string{"${SoongZipCmd}"},
Colin Cross053fca12020-08-19 13:51:47 -0700270 Rspfile: "${out}.rsp",
Oliver Nguyenc7434142019-04-24 14:22:25 -0700271 RspfileContent: "$in",
272 })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800273
274 _ = pctx.SourcePathVariable("cxxExtractor",
275 "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/cxx_extractor")
Sasha Smundak65143642019-09-26 20:14:28 -0700276 _ = pctx.SourcePathVariable("kytheVnames", "build/soong/vnames.json")
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800277 _ = pctx.VariableFunc("kytheCorpus",
278 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCorpusName() })
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800279 _ = pctx.VariableFunc("kytheCuEncoding",
280 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCuEncoding() })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800281 kytheExtract = pctx.StaticRule("kythe",
282 blueprint.RuleParams{
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800283 Command: `rm -f $out && ` +
Sasha Smundaka4ef83b2020-04-21 17:08:35 -0700284 `KYTHE_CORPUS=${kytheCorpus} ` +
285 `KYTHE_OUTPUT_FILE=$out ` +
286 `KYTHE_VNAMES=$kytheVnames ` +
287 `KYTHE_KZIP_ENCODING=${kytheCuEncoding} ` +
288 `KYTHE_CANONICALIZE_VNAME_PATHS=prefer-relative ` +
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800289 `$cxxExtractor $cFlags $in `,
Sasha Smundak65143642019-09-26 20:14:28 -0700290 CommandDeps: []string{"$cxxExtractor", "$kytheVnames"},
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800291 },
292 "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -0800293)
294
Ivan Lozanof3717ee2020-05-20 09:03:20 -0400295func PwdPrefix() string {
296 // Darwin doesn't have /proc
297 if runtime.GOOS != "darwin" {
298 return "PWD=/proc/self/cwd"
299 }
300 return ""
301}
302
Dan Willemsen322a0a62015-11-17 15:19:46 -0800303func init() {
304 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
305 // debug output. That way two builds in two different directories will
306 // create the same output.
Ivan Lozanof3717ee2020-05-20 09:03:20 -0400307 pctx.StaticVariable("relPwd", PwdPrefix())
Oliver Nguyenc7434142019-04-24 14:22:25 -0700308
309 pctx.HostBinToolVariable("SoongZipCmd", "soong_zip")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400310 pctx.Import("android/soong/remoteexec")
Dan Willemsen322a0a62015-11-17 15:19:46 -0800311}
312
Colin Cross3f40fa42015-01-30 17:27:36 -0800313type builderFlags struct {
Colin Cross6d88dba2019-11-06 07:06:58 -0800314 globalCommonFlags string
315 globalAsFlags string
316 globalYasmFlags string
317 globalCFlags string
318 globalToolingCFlags string // A separate set of cFlags for clang LibTooling tools
319 globalToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
320 globalConlyFlags string
321 globalCppFlags string
322 globalLdFlags string
323
324 localCommonFlags string
325 localAsFlags string
326 localYasmFlags string
327 localCFlags string
328 localToolingCFlags string // A separate set of cFlags for clang LibTooling tools
329 localToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
330 localConlyFlags string
331 localCppFlags string
332 localLdFlags string
333
334 libFlags string
335 extraLibFlags string
336 tidyFlags string
337 sAbiFlags string
338 aidlFlags string
339 rsFlags string
340 toolchain config.Toolchain
341 tidy bool
Oliver Nguyen04526782020-04-21 12:40:27 -0700342 gcovCoverage bool
Colin Cross6d88dba2019-11-06 07:06:58 -0800343 sAbiDump bool
344 emitXrefs bool
Colin Cross665dce92016-04-28 14:50:03 -0700345
Dan Willemsen98ab3112019-08-27 21:20:40 -0700346 assemblerWithCpp bool
347
Colin Crossc3199482017-03-30 15:03:04 -0700348 systemIncludeFlags string
349
Colin Cross18c0c5a2016-12-01 14:45:23 -0800350 groupStaticLibs bool
351
Colin Cross19878da2019-03-28 14:45:07 -0700352 proto android.ProtoFlags
Dan Willemsen60e62f02018-11-16 21:05:32 -0800353 protoC bool
354 protoOptionsFile bool
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700355
356 yacc *YaccProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800357}
358
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200359type StripFlags struct {
360 Toolchain config.Toolchain
361 StripKeepSymbols bool
362 StripKeepSymbolsList string
363 StripKeepSymbolsAndDebugFrame bool
364 StripKeepMiniDebugInfo bool
365 StripAddGnuDebuglink bool
366 StripUseGnuStrip bool
367}
368
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700369type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800370 objFiles android.Paths
371 tidyFiles android.Paths
372 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800373 sAbiDumpFiles android.Paths
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800374 kytheFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700375}
376
377func (a Objects) Copy() Objects {
378 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800379 objFiles: append(android.Paths{}, a.objFiles...),
380 tidyFiles: append(android.Paths{}, a.tidyFiles...),
381 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800382 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800383 kytheFiles: append(android.Paths{}, a.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700384 }
385}
386
387func (a Objects) Append(b Objects) Objects {
388 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800389 objFiles: append(a.objFiles, b.objFiles...),
390 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
391 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800392 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800393 kytheFiles: append(a.kytheFiles, b.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700394 }
395}
396
Colin Cross3f40fa42015-01-30 17:27:36 -0800397// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700398func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800399 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700400
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700401 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700402 var tidyFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700403 if flags.tidy {
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700404 tidyFiles = make(android.Paths, 0, len(srcFiles))
405 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800406 var coverageFiles android.Paths
Oliver Nguyen04526782020-04-21 12:40:27 -0700407 if flags.gcovCoverage {
Dan Willemsen581341d2017-02-09 16:16:31 -0800408 coverageFiles = make(android.Paths, 0, len(srcFiles))
409 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800410 var kytheFiles android.Paths
411 if flags.emitXrefs {
412 kytheFiles = make(android.Paths, 0, len(srcFiles))
413 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800414
Colin Cross6d88dba2019-11-06 07:06:58 -0800415 // Produce fully expanded flags for use by C tools, C compiles, C++ tools, C++ compiles, and asm compiles
416 // respectively.
417 toolingCflags := flags.globalCommonFlags + " " +
418 flags.globalToolingCFlags + " " +
419 flags.globalConlyFlags + " " +
420 flags.localCommonFlags + " " +
421 flags.localToolingCFlags + " " +
422 flags.localConlyFlags + " " +
423 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700424
Colin Cross6d88dba2019-11-06 07:06:58 -0800425 cflags := flags.globalCommonFlags + " " +
426 flags.globalCFlags + " " +
427 flags.globalConlyFlags + " " +
428 flags.localCommonFlags + " " +
429 flags.localCFlags + " " +
430 flags.localConlyFlags + " " +
431 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700432
Colin Cross6d88dba2019-11-06 07:06:58 -0800433 toolingCppflags := flags.globalCommonFlags + " " +
434 flags.globalToolingCFlags + " " +
435 flags.globalToolingCppFlags + " " +
436 flags.localCommonFlags + " " +
437 flags.localToolingCFlags + " " +
438 flags.localToolingCppFlags + " " +
439 flags.systemIncludeFlags
Colin Crossc3199482017-03-30 15:03:04 -0700440
Colin Cross6d88dba2019-11-06 07:06:58 -0800441 cppflags := flags.globalCommonFlags + " " +
442 flags.globalCFlags + " " +
443 flags.globalCppFlags + " " +
444 flags.localCommonFlags + " " +
445 flags.localCFlags + " " +
446 flags.localCppFlags + " " +
447 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700448
Colin Cross6d88dba2019-11-06 07:06:58 -0800449 asflags := flags.globalCommonFlags + " " +
450 flags.globalAsFlags + " " +
451 flags.localCommonFlags + " " +
452 flags.localAsFlags + " " +
453 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700454
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800455 var sAbiDumpFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700456 if flags.sAbiDump {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800457 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
458 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800459
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700460 cflags += " ${config.NoOverrideClangGlobalCflags}"
461 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
462 cppflags += " ${config.NoOverrideClangGlobalCflags}"
463 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800464
Colin Cross3f40fa42015-01-30 17:27:36 -0800465 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700466 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800467
468 objFiles[i] = objFile
469
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700470 switch srcFile.Ext() {
471 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700472 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700473 Rule: yasm,
474 Description: "yasm " + srcFile.Rel(),
475 Output: objFile,
476 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800477 Implicits: cFlagsDeps,
478 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800479 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800480 "asFlags": flags.globalYasmFlags + " " + flags.localYasmFlags,
Colin Cross91e90042016-12-02 17:13:24 -0800481 },
482 })
483 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700484 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700485 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700486 Rule: windres,
487 Description: "windres " + srcFile.Rel(),
488 Output: objFile,
489 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800490 Implicits: cFlagsDeps,
491 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700492 Args: map[string]string{
493 "windresCmd": gccCmd(flags.toolchain, "windres"),
494 "flags": flags.toolchain.WindresFlags(),
495 },
496 })
497 continue
Pete Bentleyfcf55bf2019-08-16 20:14:32 +0100498 case ".o":
499 objFiles[i] = srcFile
500 continue
Colin Cross91e90042016-12-02 17:13:24 -0800501 }
502
Colin Cross6d88dba2019-11-06 07:06:58 -0800503 var moduleFlags string
504 var moduleToolingFlags string
505
Colin Cross3f40fa42015-01-30 17:27:36 -0800506 var ccCmd string
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700507 tidy := flags.tidy
Oliver Nguyen04526782020-04-21 12:40:27 -0700508 coverage := flags.gcovCoverage
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700509 dump := flags.sAbiDump
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800510 rule := cc
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800511 emitXref := flags.emitXrefs
Colin Cross3f40fa42015-01-30 17:27:36 -0800512
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700513 switch srcFile.Ext() {
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800514 case ".s":
Dan Willemsen98ab3112019-08-27 21:20:40 -0700515 if !flags.assemblerWithCpp {
516 rule = ccNoDeps
517 }
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800518 fallthrough
519 case ".S":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700520 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800521 moduleFlags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700522 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800523 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800524 dump = false
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800525 emitXref = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800526 case ".c":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700527 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800528 moduleFlags = cflags
529 moduleToolingFlags = toolingCflags
Colin Crossd34ab7c2019-06-27 14:46:10 -0700530 case ".cpp", ".cc", ".cxx", ".mm":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700531 ccCmd = "clang++"
Colin Cross6d88dba2019-11-06 07:06:58 -0800532 moduleFlags = cppflags
533 moduleToolingFlags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800534 default:
535 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
536 continue
537 }
538
Colin Cross67a5c132017-05-09 13:45:28 -0700539 ccDesc := ccCmd
540
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700541 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800542
Dan Willemsen581341d2017-02-09 16:16:31 -0800543 var implicitOutputs android.WritablePaths
544 if coverage {
545 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
546 implicitOutputs = append(implicitOutputs, gcnoFile)
547 coverageFiles = append(coverageFiles, gcnoFile)
548 }
549
Colin Crossae887032017-10-23 17:16:14 -0700550 ctx.Build(pctx, android.BuildParams{
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800551 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700552 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800553 Output: objFile,
554 ImplicitOutputs: implicitOutputs,
555 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800556 Implicits: cFlagsDeps,
557 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800558 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800559 "cFlags": moduleFlags,
Colin Cross28344522015-04-22 13:07:53 -0700560 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800561 },
562 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700563
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800564 if emitXref {
565 kytheFile := android.ObjPathWithExt(ctx, subdir, srcFile, "kzip")
566 ctx.Build(pctx, android.BuildParams{
567 Rule: kytheExtract,
568 Description: "Xref C++ extractor " + srcFile.Rel(),
569 Output: kytheFile,
570 Input: srcFile,
571 Implicits: cFlagsDeps,
572 OrderOnly: pathDeps,
573 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800574 "cFlags": moduleFlags,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800575 },
576 })
577 kytheFiles = append(kytheFiles, kytheFile)
578 }
579
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700580 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700581 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700582 tidyFiles = append(tidyFiles, tidyFile)
583
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700584 rule := clangTidy
585 if ctx.Config().IsEnvTrue("RBE_CLANG_TIDY") {
586 rule = clangTidyRE
587 }
588
Colin Crossae887032017-10-23 17:16:14 -0700589 ctx.Build(pctx, android.BuildParams{
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700590 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700591 Description: "clang-tidy " + srcFile.Rel(),
592 Output: tidyFile,
593 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700594 // We must depend on objFile, since clang-tidy doesn't
595 // support exporting dependencies.
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700596 Implicit: objFile,
597 Implicits: cFlagsDeps,
598 OrderOnly: pathDeps,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700599 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800600 "cFlags": moduleToolingFlags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700601 "tidyFlags": flags.tidyFlags,
602 },
603 })
604 }
605
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800606 if dump {
607 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
608 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
609
Ramy Medhat31ec9422020-04-17 15:03:58 -0400610 dumpRule := sAbiDump
611 if ctx.Config().IsEnvTrue("RBE_ABI_DUMPER") {
612 dumpRule = sAbiDumpRE
613 }
Colin Crossae887032017-10-23 17:16:14 -0700614 ctx.Build(pctx, android.BuildParams{
Ramy Medhat31ec9422020-04-17 15:03:58 -0400615 Rule: dumpRule,
Colin Cross67a5c132017-05-09 13:45:28 -0700616 Description: "header-abi-dumper " + srcFile.Rel(),
617 Output: sAbiDumpFile,
618 Input: srcFile,
619 Implicit: objFile,
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700620 Implicits: cFlagsDeps,
621 OrderOnly: pathDeps,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800622 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800623 "cFlags": moduleToolingFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800624 "exportDirs": flags.sAbiFlags,
625 },
626 })
627 }
628
Colin Cross3f40fa42015-01-30 17:27:36 -0800629 }
630
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700631 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800632 objFiles: objFiles,
633 tidyFiles: tidyFiles,
634 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800635 sAbiDumpFiles: sAbiDumpFiles,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800636 kytheFiles: kytheFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700637 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800638}
639
640// Generate a rule for compiling multiple .o files to a static library (.a)
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100641func TransformObjToStaticLib(ctx android.ModuleContext,
642 objFiles android.Paths, wholeStaticLibs android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700643 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800644
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800645 arCmd := "${config.ClangBin}/llvm-ar"
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100646 arFlags := ""
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800647 if !ctx.Darwin() {
648 arFlags += " -format=gnu"
649 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800650
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100651 if len(wholeStaticLibs) == 0 {
652 ctx.Build(pctx, android.BuildParams{
653 Rule: ar,
654 Description: "static link " + outputFile.Base(),
655 Output: outputFile,
656 Inputs: objFiles,
657 Implicits: deps,
658 Args: map[string]string{
659 "arFlags": "crsPD" + arFlags,
660 "arCmd": arCmd,
661 },
662 })
663
664 } else {
665 ctx.Build(pctx, android.BuildParams{
666 Rule: arWithLibs,
667 Description: "static link " + outputFile.Base(),
668 Output: outputFile,
669 Inputs: append(objFiles, wholeStaticLibs...),
670 Implicits: deps,
671 Args: map[string]string{
672 "arCmd": arCmd,
673 "arObjFlags": "crsPD" + arFlags,
674 "arObjs": strings.Join(objFiles.Strings(), " "),
675 "arLibFlags": "cqsL" + arFlags,
676 "arLibs": strings.Join(wholeStaticLibs.Strings(), " "),
677 },
678 })
679 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800680}
681
682// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700683// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700684func TransformObjToDynamicBinary(ctx android.ModuleContext,
685 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
Josh Gao75a50a22019-06-07 17:58:59 -0700686 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath, implicitOutputs android.WritablePaths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800687
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700688 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800689
Colin Cross3f40fa42015-01-30 17:27:36 -0800690 var libFlagsList []string
691
Colin Cross16b23492016-01-06 14:41:07 -0800692 if len(flags.libFlags) > 0 {
693 libFlagsList = append(libFlagsList, flags.libFlags)
694 }
695
Colin Cross3f40fa42015-01-30 17:27:36 -0800696 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800697 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700698 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700699 } else {
700 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700701 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700702 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
703 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800704 }
705
Colin Cross7a7cf972016-12-05 18:47:39 -0800706 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800707 libFlagsList = append(libFlagsList, "-Wl,--start-group")
708 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700709 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800710 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800711 libFlagsList = append(libFlagsList, "-Wl,--end-group")
712 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800713
Stephen Hines10347862016-07-18 15:54:54 -0700714 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700715 libFlagsList = append(libFlagsList, "-Wl,--start-group")
716 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700717 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700718 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700719 libFlagsList = append(libFlagsList, "-Wl,--end-group")
720 }
721
Colin Cross3f40fa42015-01-30 17:27:36 -0800722 for _, lib := range sharedLibs {
Josh Gao75a50a22019-06-07 17:58:59 -0700723 libFile := lib.String()
724 if ctx.Windows() {
725 libFile = pathtools.ReplaceExtension(libFile, "lib")
726 }
727 libFlagsList = append(libFlagsList, libFile)
Colin Cross3f40fa42015-01-30 17:27:36 -0800728 }
729
Colin Cross3f40fa42015-01-30 17:27:36 -0800730 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700731 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800732 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700733 if crtBegin.Valid() {
734 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800735 }
736
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400737 rule := ld
Kousik Kumar3fb61262020-04-22 13:31:09 -0700738 args := map[string]string{
739 "ldCmd": ldCmd,
740 "crtBegin": crtBegin.String(),
741 "libFlags": strings.Join(libFlagsList, " "),
742 "extraLibFlags": flags.extraLibFlags,
743 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
744 "crtEnd": crtEnd.String(),
745 }
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400746 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
747 rule = ldRE
Kousik Kumar3fb61262020-04-22 13:31:09 -0700748 args["implicitOutputs"] = strings.Join(implicitOutputs.Strings(), ",")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400749 }
750
Colin Crossae887032017-10-23 17:16:14 -0700751 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400752 Rule: rule,
Josh Gao75a50a22019-06-07 17:58:59 -0700753 Description: "link " + outputFile.Base(),
754 Output: outputFile,
755 ImplicitOutputs: implicitOutputs,
756 Inputs: objFiles,
757 Implicits: deps,
Kousik Kumar3fb61262020-04-22 13:31:09 -0700758 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800759 })
760}
761
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800762// Generate a rule to combine .dump sAbi dump files from multiple source files
763// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700764func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800765 baseName, exportedHeaderFlags string, symbolFile android.OptionalPath,
766 excludedSymbolVersions, excludedSymbolTags []string) android.OptionalPath {
767
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800768 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800769
770 implicits := android.Paths{soFile}
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800771 symbolFilterStr := "-so " + soFile.String()
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800772
773 if symbolFile.Valid() {
774 implicits = append(implicits, symbolFile.Path())
775 symbolFilterStr += " -v " + symbolFile.String()
776 }
777 for _, ver := range excludedSymbolVersions {
778 symbolFilterStr += " --exclude-symbol-version " + ver
779 }
780 for _, tag := range excludedSymbolTags {
781 symbolFilterStr += " --exclude-symbol-tag " + tag
782 }
Ramy Medhat808594c2020-05-07 06:56:47 -0400783 rule := sAbiLink
784 args := map[string]string{
785 "symbolFilter": symbolFilterStr,
786 "arch": ctx.Arch().ArchType.Name,
787 "exportedHeaderFlags": exportedHeaderFlags,
788 }
789 if ctx.Config().IsEnvTrue("RBE_ABI_LINKER") {
790 rule = sAbiLinkRE
791 rbeImplicits := implicits.Strings()
792 for _, p := range strings.Split(exportedHeaderFlags, " ") {
793 if len(p) > 2 {
794 // Exclude the -I prefix.
795 rbeImplicits = append(rbeImplicits, p[2:])
796 }
797 }
798 args["implicits"] = strings.Join(rbeImplicits, ",")
799 }
Colin Crossae887032017-10-23 17:16:14 -0700800 ctx.Build(pctx, android.BuildParams{
Ramy Medhat808594c2020-05-07 06:56:47 -0400801 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700802 Description: "header-abi-linker " + outputFile.Base(),
803 Output: outputFile,
804 Inputs: sAbiDumps,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800805 Implicits: implicits,
Ramy Medhat808594c2020-05-07 06:56:47 -0400806 Args: args,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800807 })
808 return android.OptionalPathForPath(outputFile)
809}
810
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700811func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
812 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700813 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700814 Rule: unzipRefSAbiDump,
815 Description: "gunzip" + outputFile.Base(),
816 Output: outputFile,
817 Input: zippedRefDump,
818 })
819 return outputFile
820}
821
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800822func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chien2a65dda2019-10-01 15:58:07 -0700823 baseName, exportedHeaderFlags string, checkAllApis, isLlndk, isNdk, isVndkExt bool) android.OptionalPath {
Logan Chienf3511742017-10-31 18:04:35 +0800824
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800825 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700826 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Logan Chien6227fed2019-02-18 13:12:21 +0800827 createReferenceDumpFlags := ""
828
Logan Chien2a65dda2019-10-01 15:58:07 -0700829 var extraFlags []string
830 if checkAllApis {
831 extraFlags = append(extraFlags, "-check-all-apis")
832 } else {
833 extraFlags = append(extraFlags,
834 "-allow-unreferenced-changes",
835 "-allow-unreferenced-elf-symbol-changes")
Jayant Chowdharye4499502018-01-17 13:13:33 -0800836 }
Logan Chien2a65dda2019-10-01 15:58:07 -0700837
838 if exportedHeaderFlags == "" {
839 extraFlags = append(extraFlags, "-advice-only")
840 }
841
Logan Chien62f1f942019-02-18 15:40:42 +0800842 if isLlndk || isNdk {
Logan Chien6227fed2019-02-18 13:12:21 +0800843 createReferenceDumpFlags = "--llndk"
Logan Chien62f1f942019-02-18 15:40:42 +0800844 if isLlndk {
845 // TODO(b/130324828): "-consider-opaque-types-different" should apply to
846 // both LLNDK and NDK shared libs. However, a known issue in header-abi-diff
847 // breaks libaaudio. Remove the if-guard after the issue is fixed.
Logan Chien2a65dda2019-10-01 15:58:07 -0700848 extraFlags = append(extraFlags, "-consider-opaque-types-different")
Logan Chien62f1f942019-02-18 15:40:42 +0800849 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700850 }
Logan Chienf3511742017-10-31 18:04:35 +0800851 if isVndkExt {
Logan Chien2a65dda2019-10-01 15:58:07 -0700852 extraFlags = append(extraFlags, "-allow-extensions")
Logan Chienf3511742017-10-31 18:04:35 +0800853 }
854
Colin Crossae887032017-10-23 17:16:14 -0700855 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700856 Rule: sAbiDiff,
857 Description: "header-abi-diff " + outputFile.Base(),
858 Output: outputFile,
859 Input: inputDump,
860 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800861 Args: map[string]string{
Logan Chien6227fed2019-02-18 13:12:21 +0800862 "referenceDump": referenceDump.String(),
863 "libName": libName,
864 "arch": ctx.Arch().ArchType.Name,
Logan Chien2a65dda2019-10-01 15:58:07 -0700865 "extraFlags": strings.Join(extraFlags, " "),
Logan Chien6227fed2019-02-18 13:12:21 +0800866 "createReferenceDumpFlags": createReferenceDumpFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800867 },
868 })
869 return android.OptionalPathForPath(outputFile)
870}
871
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700872// Generate a rule for extracting a table of contents from a shared library (.so)
873func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700874 outputFile android.WritablePath, flags builderFlags) {
875
Colin Crossb496cfd2018-09-10 16:50:05 -0700876 var format string
877 var crossCompile string
878 if ctx.Darwin() {
879 format = "--macho"
880 crossCompile = "${config.MacToolPath}"
881 } else if ctx.Windows() {
882 format = "--pe"
883 crossCompile = gccCmd(flags.toolchain, "")
884 } else {
885 format = "--elf"
886 crossCompile = gccCmd(flags.toolchain, "")
887 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700888
Colin Crossae887032017-10-23 17:16:14 -0700889 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700890 Rule: toc,
891 Description: "generate toc " + inputFile.Base(),
892 Output: outputFile,
893 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700894 Args: map[string]string{
895 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700896 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700897 },
898 })
899}
900
Colin Cross3f40fa42015-01-30 17:27:36 -0800901// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700902func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700903 flags builderFlags, outputFile android.WritablePath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800904
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700905 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800906
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400907 rule := partialLd
908 args := map[string]string{
909 "ldCmd": ldCmd,
910 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
911 }
912 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
913 rule = partialLdRE
914 args["inCommaList"] = strings.Join(objFiles.Strings(), ",")
915 }
Colin Crossae887032017-10-23 17:16:14 -0700916 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400917 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700918 Description: "link " + outputFile.Base(),
919 Output: outputFile,
920 Inputs: objFiles,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700921 Implicits: deps,
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400922 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800923 })
924}
925
Colin Crossbfae8852015-03-26 14:44:11 -0700926// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700927func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
928 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700929
930 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
931
Colin Crossae887032017-10-23 17:16:14 -0700932 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700933 Rule: prefixSymbols,
934 Description: "prefix symbols " + outputFile.Base(),
935 Output: outputFile,
936 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700937 Args: map[string]string{
938 "objcopyCmd": objcopyCmd,
939 "prefix": prefix,
940 },
941 })
942}
943
Colin Cross635c3b02016-05-18 15:37:25 -0700944func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200945 outputFile android.WritablePath, flags StripFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700946
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200947 crossCompile := gccCmd(flags.Toolchain, "")
Colin Cross665dce92016-04-28 14:50:03 -0700948 args := ""
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200949 if flags.StripAddGnuDebuglink {
Colin Cross665dce92016-04-28 14:50:03 -0700950 args += " --add-gnu-debuglink"
951 }
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200952 if flags.StripKeepMiniDebugInfo {
Colin Cross665dce92016-04-28 14:50:03 -0700953 args += " --keep-mini-debug-info"
954 }
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200955 if flags.StripKeepSymbols {
Colin Cross665dce92016-04-28 14:50:03 -0700956 args += " --keep-symbols"
957 }
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200958 if flags.StripKeepSymbolsList != "" {
959 args += " -k" + flags.StripKeepSymbolsList
Yi Kongacee27c2019-03-29 20:05:14 -0700960 }
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200961 if flags.StripKeepSymbolsAndDebugFrame {
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700962 args += " --keep-symbols-and-debug-frame"
963 }
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200964 if flags.StripUseGnuStrip {
Yi Kongb5c34d72018-11-07 16:28:49 -0800965 args += " --use-gnu-strip"
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700966 }
Colin Cross665dce92016-04-28 14:50:03 -0700967
Colin Crossae887032017-10-23 17:16:14 -0700968 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700969 Rule: strip,
970 Description: "strip " + outputFile.Base(),
971 Output: outputFile,
972 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700973 Args: map[string]string{
974 "crossCompile": crossCompile,
975 "args": args,
976 },
977 })
978}
979
Colin Cross635c3b02016-05-18 15:37:25 -0700980func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
981 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700982
Colin Crossae887032017-10-23 17:16:14 -0700983 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700984 Rule: darwinStrip,
985 Description: "strip " + outputFile.Base(),
986 Output: outputFile,
987 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700988 })
989}
990
Oliver Nguyenc7434142019-04-24 14:22:25 -0700991func TransformCoverageFilesToZip(ctx android.ModuleContext,
992 inputs Objects, baseName string) android.OptionalPath {
Dan Willemsen581341d2017-02-09 16:16:31 -0800993
994 if len(inputs.coverageFiles) > 0 {
Oliver Nguyenc7434142019-04-24 14:22:25 -0700995 outputFile := android.PathForModuleOut(ctx, baseName+".zip")
Dan Willemsen581341d2017-02-09 16:16:31 -0800996
Oliver Nguyenc7434142019-04-24 14:22:25 -0700997 ctx.Build(pctx, android.BuildParams{
998 Rule: zip,
999 Description: "zip " + outputFile.Base(),
1000 Inputs: inputs.coverageFiles,
1001 Output: outputFile,
1002 })
Dan Willemsen581341d2017-02-09 16:16:31 -08001003
1004 return android.OptionalPathForPath(outputFile)
1005 }
1006
1007 return android.OptionalPath{}
1008}
1009
Yi Kongc49c3932019-10-15 02:01:19 -07001010func TransformArchiveRepack(ctx android.ModuleContext, inputFile android.Path,
1011 outputFile android.WritablePath, objects []string) {
1012
1013 ctx.Build(pctx, android.BuildParams{
1014 Rule: archiveRepack,
1015 Description: "Repack archive " + outputFile.Base(),
1016 Output: outputFile,
1017 Input: inputFile,
1018 Args: map[string]string{
1019 "objects": strings.Join(objects, " "),
1020 },
1021 })
1022}
1023
Colin Crossb98c8b02016-07-29 13:44:28 -07001024func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -08001025 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
1026}
Colin Cross0af4b842015-04-30 16:36:18 -07001027
Colin Cross5b529592017-05-09 13:34:34 -07001028func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -07001029 var i int
1030
1031 start := 0
1032 bytes := 0
1033 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -07001034 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -07001035 if l > limit {
1036 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
1037 }
1038 if bytes+l > limit {
1039 lists = append(lists, list[start:i])
1040 start = i
1041 bytes = 0
1042 }
1043 bytes += l + 1 // count a space between each list element
1044 }
1045
1046 lists = append(lists, list[start:])
1047
1048 totalLen := 0
1049 for _, l := range lists {
1050 totalLen += len(l)
1051 }
1052 if totalLen != len(list) {
1053 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
1054 }
1055 return lists, nil
1056}