blob: f2bab8cb4431b284baab6300d678cae077381992 [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
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700352 stripKeepSymbols bool
353 stripKeepSymbolsList string
354 stripKeepSymbolsAndDebugFrame bool
355 stripKeepMiniDebugInfo bool
356 stripAddGnuDebuglink bool
357 stripUseGnuStrip bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800358
Colin Cross19878da2019-03-28 14:45:07 -0700359 proto android.ProtoFlags
Dan Willemsen60e62f02018-11-16 21:05:32 -0800360 protoC bool
361 protoOptionsFile bool
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700362
363 yacc *YaccProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800364}
365
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700366type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800367 objFiles android.Paths
368 tidyFiles android.Paths
369 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800370 sAbiDumpFiles android.Paths
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800371 kytheFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700372}
373
374func (a Objects) Copy() Objects {
375 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800376 objFiles: append(android.Paths{}, a.objFiles...),
377 tidyFiles: append(android.Paths{}, a.tidyFiles...),
378 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800379 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800380 kytheFiles: append(android.Paths{}, a.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700381 }
382}
383
384func (a Objects) Append(b Objects) Objects {
385 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800386 objFiles: append(a.objFiles, b.objFiles...),
387 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
388 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800389 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800390 kytheFiles: append(a.kytheFiles, b.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700391 }
392}
393
Colin Cross3f40fa42015-01-30 17:27:36 -0800394// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700395func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800396 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700397
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700398 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700399 var tidyFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700400 if flags.tidy {
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700401 tidyFiles = make(android.Paths, 0, len(srcFiles))
402 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800403 var coverageFiles android.Paths
Oliver Nguyen04526782020-04-21 12:40:27 -0700404 if flags.gcovCoverage {
Dan Willemsen581341d2017-02-09 16:16:31 -0800405 coverageFiles = make(android.Paths, 0, len(srcFiles))
406 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800407 var kytheFiles android.Paths
408 if flags.emitXrefs {
409 kytheFiles = make(android.Paths, 0, len(srcFiles))
410 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800411
Colin Cross6d88dba2019-11-06 07:06:58 -0800412 // Produce fully expanded flags for use by C tools, C compiles, C++ tools, C++ compiles, and asm compiles
413 // respectively.
414 toolingCflags := flags.globalCommonFlags + " " +
415 flags.globalToolingCFlags + " " +
416 flags.globalConlyFlags + " " +
417 flags.localCommonFlags + " " +
418 flags.localToolingCFlags + " " +
419 flags.localConlyFlags + " " +
420 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700421
Colin Cross6d88dba2019-11-06 07:06:58 -0800422 cflags := flags.globalCommonFlags + " " +
423 flags.globalCFlags + " " +
424 flags.globalConlyFlags + " " +
425 flags.localCommonFlags + " " +
426 flags.localCFlags + " " +
427 flags.localConlyFlags + " " +
428 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700429
Colin Cross6d88dba2019-11-06 07:06:58 -0800430 toolingCppflags := flags.globalCommonFlags + " " +
431 flags.globalToolingCFlags + " " +
432 flags.globalToolingCppFlags + " " +
433 flags.localCommonFlags + " " +
434 flags.localToolingCFlags + " " +
435 flags.localToolingCppFlags + " " +
436 flags.systemIncludeFlags
Colin Crossc3199482017-03-30 15:03:04 -0700437
Colin Cross6d88dba2019-11-06 07:06:58 -0800438 cppflags := flags.globalCommonFlags + " " +
439 flags.globalCFlags + " " +
440 flags.globalCppFlags + " " +
441 flags.localCommonFlags + " " +
442 flags.localCFlags + " " +
443 flags.localCppFlags + " " +
444 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700445
Colin Cross6d88dba2019-11-06 07:06:58 -0800446 asflags := flags.globalCommonFlags + " " +
447 flags.globalAsFlags + " " +
448 flags.localCommonFlags + " " +
449 flags.localAsFlags + " " +
450 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700451
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800452 var sAbiDumpFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700453 if flags.sAbiDump {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800454 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
455 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800456
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700457 cflags += " ${config.NoOverrideClangGlobalCflags}"
458 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
459 cppflags += " ${config.NoOverrideClangGlobalCflags}"
460 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800461
Colin Cross3f40fa42015-01-30 17:27:36 -0800462 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700463 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800464
465 objFiles[i] = objFile
466
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700467 switch srcFile.Ext() {
468 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700469 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700470 Rule: yasm,
471 Description: "yasm " + srcFile.Rel(),
472 Output: objFile,
473 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800474 Implicits: cFlagsDeps,
475 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800476 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800477 "asFlags": flags.globalYasmFlags + " " + flags.localYasmFlags,
Colin Cross91e90042016-12-02 17:13:24 -0800478 },
479 })
480 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700481 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700482 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700483 Rule: windres,
484 Description: "windres " + srcFile.Rel(),
485 Output: objFile,
486 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800487 Implicits: cFlagsDeps,
488 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700489 Args: map[string]string{
490 "windresCmd": gccCmd(flags.toolchain, "windres"),
491 "flags": flags.toolchain.WindresFlags(),
492 },
493 })
494 continue
Pete Bentleyfcf55bf2019-08-16 20:14:32 +0100495 case ".o":
496 objFiles[i] = srcFile
497 continue
Colin Cross91e90042016-12-02 17:13:24 -0800498 }
499
Colin Cross6d88dba2019-11-06 07:06:58 -0800500 var moduleFlags string
501 var moduleToolingFlags string
502
Colin Cross3f40fa42015-01-30 17:27:36 -0800503 var ccCmd string
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700504 tidy := flags.tidy
Oliver Nguyen04526782020-04-21 12:40:27 -0700505 coverage := flags.gcovCoverage
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700506 dump := flags.sAbiDump
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800507 rule := cc
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800508 emitXref := flags.emitXrefs
Colin Cross3f40fa42015-01-30 17:27:36 -0800509
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700510 switch srcFile.Ext() {
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800511 case ".s":
Dan Willemsen98ab3112019-08-27 21:20:40 -0700512 if !flags.assemblerWithCpp {
513 rule = ccNoDeps
514 }
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800515 fallthrough
516 case ".S":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700517 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800518 moduleFlags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700519 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800520 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800521 dump = false
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800522 emitXref = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800523 case ".c":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700524 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800525 moduleFlags = cflags
526 moduleToolingFlags = toolingCflags
Colin Crossd34ab7c2019-06-27 14:46:10 -0700527 case ".cpp", ".cc", ".cxx", ".mm":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700528 ccCmd = "clang++"
Colin Cross6d88dba2019-11-06 07:06:58 -0800529 moduleFlags = cppflags
530 moduleToolingFlags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800531 default:
532 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
533 continue
534 }
535
Colin Cross67a5c132017-05-09 13:45:28 -0700536 ccDesc := ccCmd
537
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700538 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800539
Dan Willemsen581341d2017-02-09 16:16:31 -0800540 var implicitOutputs android.WritablePaths
541 if coverage {
542 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
543 implicitOutputs = append(implicitOutputs, gcnoFile)
544 coverageFiles = append(coverageFiles, gcnoFile)
545 }
546
Colin Crossae887032017-10-23 17:16:14 -0700547 ctx.Build(pctx, android.BuildParams{
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800548 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700549 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800550 Output: objFile,
551 ImplicitOutputs: implicitOutputs,
552 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800553 Implicits: cFlagsDeps,
554 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800555 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800556 "cFlags": moduleFlags,
Colin Cross28344522015-04-22 13:07:53 -0700557 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800558 },
559 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700560
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800561 if emitXref {
562 kytheFile := android.ObjPathWithExt(ctx, subdir, srcFile, "kzip")
563 ctx.Build(pctx, android.BuildParams{
564 Rule: kytheExtract,
565 Description: "Xref C++ extractor " + srcFile.Rel(),
566 Output: kytheFile,
567 Input: srcFile,
568 Implicits: cFlagsDeps,
569 OrderOnly: pathDeps,
570 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800571 "cFlags": moduleFlags,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800572 },
573 })
574 kytheFiles = append(kytheFiles, kytheFile)
575 }
576
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700577 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700578 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700579 tidyFiles = append(tidyFiles, tidyFile)
580
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700581 rule := clangTidy
582 if ctx.Config().IsEnvTrue("RBE_CLANG_TIDY") {
583 rule = clangTidyRE
584 }
585
Colin Crossae887032017-10-23 17:16:14 -0700586 ctx.Build(pctx, android.BuildParams{
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700587 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700588 Description: "clang-tidy " + srcFile.Rel(),
589 Output: tidyFile,
590 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700591 // We must depend on objFile, since clang-tidy doesn't
592 // support exporting dependencies.
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700593 Implicit: objFile,
594 Implicits: cFlagsDeps,
595 OrderOnly: pathDeps,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700596 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800597 "cFlags": moduleToolingFlags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700598 "tidyFlags": flags.tidyFlags,
599 },
600 })
601 }
602
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800603 if dump {
604 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
605 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
606
Ramy Medhat31ec9422020-04-17 15:03:58 -0400607 dumpRule := sAbiDump
608 if ctx.Config().IsEnvTrue("RBE_ABI_DUMPER") {
609 dumpRule = sAbiDumpRE
610 }
Colin Crossae887032017-10-23 17:16:14 -0700611 ctx.Build(pctx, android.BuildParams{
Ramy Medhat31ec9422020-04-17 15:03:58 -0400612 Rule: dumpRule,
Colin Cross67a5c132017-05-09 13:45:28 -0700613 Description: "header-abi-dumper " + srcFile.Rel(),
614 Output: sAbiDumpFile,
615 Input: srcFile,
616 Implicit: objFile,
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700617 Implicits: cFlagsDeps,
618 OrderOnly: pathDeps,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800619 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800620 "cFlags": moduleToolingFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800621 "exportDirs": flags.sAbiFlags,
622 },
623 })
624 }
625
Colin Cross3f40fa42015-01-30 17:27:36 -0800626 }
627
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700628 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800629 objFiles: objFiles,
630 tidyFiles: tidyFiles,
631 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800632 sAbiDumpFiles: sAbiDumpFiles,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800633 kytheFiles: kytheFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700634 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800635}
636
637// Generate a rule for compiling multiple .o files to a static library (.a)
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100638func TransformObjToStaticLib(ctx android.ModuleContext,
639 objFiles android.Paths, wholeStaticLibs android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700640 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800641
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800642 arCmd := "${config.ClangBin}/llvm-ar"
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100643 arFlags := ""
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800644 if !ctx.Darwin() {
645 arFlags += " -format=gnu"
646 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800647
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100648 if len(wholeStaticLibs) == 0 {
649 ctx.Build(pctx, android.BuildParams{
650 Rule: ar,
651 Description: "static link " + outputFile.Base(),
652 Output: outputFile,
653 Inputs: objFiles,
654 Implicits: deps,
655 Args: map[string]string{
656 "arFlags": "crsPD" + arFlags,
657 "arCmd": arCmd,
658 },
659 })
660
661 } else {
662 ctx.Build(pctx, android.BuildParams{
663 Rule: arWithLibs,
664 Description: "static link " + outputFile.Base(),
665 Output: outputFile,
666 Inputs: append(objFiles, wholeStaticLibs...),
667 Implicits: deps,
668 Args: map[string]string{
669 "arCmd": arCmd,
670 "arObjFlags": "crsPD" + arFlags,
671 "arObjs": strings.Join(objFiles.Strings(), " "),
672 "arLibFlags": "cqsL" + arFlags,
673 "arLibs": strings.Join(wholeStaticLibs.Strings(), " "),
674 },
675 })
676 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800677}
678
679// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700680// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700681func TransformObjToDynamicBinary(ctx android.ModuleContext,
682 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
Josh Gao75a50a22019-06-07 17:58:59 -0700683 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath, implicitOutputs android.WritablePaths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800684
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700685 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800686
Colin Cross3f40fa42015-01-30 17:27:36 -0800687 var libFlagsList []string
688
Colin Cross16b23492016-01-06 14:41:07 -0800689 if len(flags.libFlags) > 0 {
690 libFlagsList = append(libFlagsList, flags.libFlags)
691 }
692
Colin Cross3f40fa42015-01-30 17:27:36 -0800693 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800694 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700695 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700696 } else {
697 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700698 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700699 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
700 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800701 }
702
Colin Cross7a7cf972016-12-05 18:47:39 -0800703 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800704 libFlagsList = append(libFlagsList, "-Wl,--start-group")
705 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700706 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800707 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800708 libFlagsList = append(libFlagsList, "-Wl,--end-group")
709 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800710
Stephen Hines10347862016-07-18 15:54:54 -0700711 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700712 libFlagsList = append(libFlagsList, "-Wl,--start-group")
713 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700714 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700715 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700716 libFlagsList = append(libFlagsList, "-Wl,--end-group")
717 }
718
Colin Cross3f40fa42015-01-30 17:27:36 -0800719 for _, lib := range sharedLibs {
Josh Gao75a50a22019-06-07 17:58:59 -0700720 libFile := lib.String()
721 if ctx.Windows() {
722 libFile = pathtools.ReplaceExtension(libFile, "lib")
723 }
724 libFlagsList = append(libFlagsList, libFile)
Colin Cross3f40fa42015-01-30 17:27:36 -0800725 }
726
Colin Cross3f40fa42015-01-30 17:27:36 -0800727 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700728 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800729 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700730 if crtBegin.Valid() {
731 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800732 }
733
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400734 rule := ld
Kousik Kumar3fb61262020-04-22 13:31:09 -0700735 args := map[string]string{
736 "ldCmd": ldCmd,
737 "crtBegin": crtBegin.String(),
738 "libFlags": strings.Join(libFlagsList, " "),
739 "extraLibFlags": flags.extraLibFlags,
740 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
741 "crtEnd": crtEnd.String(),
742 }
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400743 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
744 rule = ldRE
Kousik Kumar3fb61262020-04-22 13:31:09 -0700745 args["implicitOutputs"] = strings.Join(implicitOutputs.Strings(), ",")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400746 }
747
Colin Crossae887032017-10-23 17:16:14 -0700748 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400749 Rule: rule,
Josh Gao75a50a22019-06-07 17:58:59 -0700750 Description: "link " + outputFile.Base(),
751 Output: outputFile,
752 ImplicitOutputs: implicitOutputs,
753 Inputs: objFiles,
754 Implicits: deps,
Kousik Kumar3fb61262020-04-22 13:31:09 -0700755 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800756 })
757}
758
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800759// Generate a rule to combine .dump sAbi dump files from multiple source files
760// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700761func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800762 baseName, exportedHeaderFlags string, symbolFile android.OptionalPath,
763 excludedSymbolVersions, excludedSymbolTags []string) android.OptionalPath {
764
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800765 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800766
767 implicits := android.Paths{soFile}
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800768 symbolFilterStr := "-so " + soFile.String()
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800769
770 if symbolFile.Valid() {
771 implicits = append(implicits, symbolFile.Path())
772 symbolFilterStr += " -v " + symbolFile.String()
773 }
774 for _, ver := range excludedSymbolVersions {
775 symbolFilterStr += " --exclude-symbol-version " + ver
776 }
777 for _, tag := range excludedSymbolTags {
778 symbolFilterStr += " --exclude-symbol-tag " + tag
779 }
Ramy Medhat808594c2020-05-07 06:56:47 -0400780 rule := sAbiLink
781 args := map[string]string{
782 "symbolFilter": symbolFilterStr,
783 "arch": ctx.Arch().ArchType.Name,
784 "exportedHeaderFlags": exportedHeaderFlags,
785 }
786 if ctx.Config().IsEnvTrue("RBE_ABI_LINKER") {
787 rule = sAbiLinkRE
788 rbeImplicits := implicits.Strings()
789 for _, p := range strings.Split(exportedHeaderFlags, " ") {
790 if len(p) > 2 {
791 // Exclude the -I prefix.
792 rbeImplicits = append(rbeImplicits, p[2:])
793 }
794 }
795 args["implicits"] = strings.Join(rbeImplicits, ",")
796 }
Colin Crossae887032017-10-23 17:16:14 -0700797 ctx.Build(pctx, android.BuildParams{
Ramy Medhat808594c2020-05-07 06:56:47 -0400798 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700799 Description: "header-abi-linker " + outputFile.Base(),
800 Output: outputFile,
801 Inputs: sAbiDumps,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800802 Implicits: implicits,
Ramy Medhat808594c2020-05-07 06:56:47 -0400803 Args: args,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800804 })
805 return android.OptionalPathForPath(outputFile)
806}
807
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700808func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
809 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700810 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700811 Rule: unzipRefSAbiDump,
812 Description: "gunzip" + outputFile.Base(),
813 Output: outputFile,
814 Input: zippedRefDump,
815 })
816 return outputFile
817}
818
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800819func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chien2a65dda2019-10-01 15:58:07 -0700820 baseName, exportedHeaderFlags string, checkAllApis, isLlndk, isNdk, isVndkExt bool) android.OptionalPath {
Logan Chienf3511742017-10-31 18:04:35 +0800821
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800822 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700823 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Logan Chien6227fed2019-02-18 13:12:21 +0800824 createReferenceDumpFlags := ""
825
Logan Chien2a65dda2019-10-01 15:58:07 -0700826 var extraFlags []string
827 if checkAllApis {
828 extraFlags = append(extraFlags, "-check-all-apis")
829 } else {
830 extraFlags = append(extraFlags,
831 "-allow-unreferenced-changes",
832 "-allow-unreferenced-elf-symbol-changes")
Jayant Chowdharye4499502018-01-17 13:13:33 -0800833 }
Logan Chien2a65dda2019-10-01 15:58:07 -0700834
835 if exportedHeaderFlags == "" {
836 extraFlags = append(extraFlags, "-advice-only")
837 }
838
Logan Chien62f1f942019-02-18 15:40:42 +0800839 if isLlndk || isNdk {
Logan Chien6227fed2019-02-18 13:12:21 +0800840 createReferenceDumpFlags = "--llndk"
Logan Chien62f1f942019-02-18 15:40:42 +0800841 if isLlndk {
842 // TODO(b/130324828): "-consider-opaque-types-different" should apply to
843 // both LLNDK and NDK shared libs. However, a known issue in header-abi-diff
844 // breaks libaaudio. Remove the if-guard after the issue is fixed.
Logan Chien2a65dda2019-10-01 15:58:07 -0700845 extraFlags = append(extraFlags, "-consider-opaque-types-different")
Logan Chien62f1f942019-02-18 15:40:42 +0800846 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700847 }
Logan Chienf3511742017-10-31 18:04:35 +0800848 if isVndkExt {
Logan Chien2a65dda2019-10-01 15:58:07 -0700849 extraFlags = append(extraFlags, "-allow-extensions")
Logan Chienf3511742017-10-31 18:04:35 +0800850 }
851
Colin Crossae887032017-10-23 17:16:14 -0700852 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700853 Rule: sAbiDiff,
854 Description: "header-abi-diff " + outputFile.Base(),
855 Output: outputFile,
856 Input: inputDump,
857 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800858 Args: map[string]string{
Logan Chien6227fed2019-02-18 13:12:21 +0800859 "referenceDump": referenceDump.String(),
860 "libName": libName,
861 "arch": ctx.Arch().ArchType.Name,
Logan Chien2a65dda2019-10-01 15:58:07 -0700862 "extraFlags": strings.Join(extraFlags, " "),
Logan Chien6227fed2019-02-18 13:12:21 +0800863 "createReferenceDumpFlags": createReferenceDumpFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800864 },
865 })
866 return android.OptionalPathForPath(outputFile)
867}
868
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700869// Generate a rule for extracting a table of contents from a shared library (.so)
870func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700871 outputFile android.WritablePath, flags builderFlags) {
872
Colin Crossb496cfd2018-09-10 16:50:05 -0700873 var format string
874 var crossCompile string
875 if ctx.Darwin() {
876 format = "--macho"
877 crossCompile = "${config.MacToolPath}"
878 } else if ctx.Windows() {
879 format = "--pe"
880 crossCompile = gccCmd(flags.toolchain, "")
881 } else {
882 format = "--elf"
883 crossCompile = gccCmd(flags.toolchain, "")
884 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700885
Colin Crossae887032017-10-23 17:16:14 -0700886 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700887 Rule: toc,
888 Description: "generate toc " + inputFile.Base(),
889 Output: outputFile,
890 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700891 Args: map[string]string{
892 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700893 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700894 },
895 })
896}
897
Colin Cross3f40fa42015-01-30 17:27:36 -0800898// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700899func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700900 flags builderFlags, outputFile android.WritablePath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800901
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700902 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800903
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400904 rule := partialLd
905 args := map[string]string{
906 "ldCmd": ldCmd,
907 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
908 }
909 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
910 rule = partialLdRE
911 args["inCommaList"] = strings.Join(objFiles.Strings(), ",")
912 }
Colin Crossae887032017-10-23 17:16:14 -0700913 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400914 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700915 Description: "link " + outputFile.Base(),
916 Output: outputFile,
917 Inputs: objFiles,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700918 Implicits: deps,
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400919 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800920 })
921}
922
Colin Crossbfae8852015-03-26 14:44:11 -0700923// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700924func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
925 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700926
927 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
928
Colin Crossae887032017-10-23 17:16:14 -0700929 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700930 Rule: prefixSymbols,
931 Description: "prefix symbols " + outputFile.Base(),
932 Output: outputFile,
933 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700934 Args: map[string]string{
935 "objcopyCmd": objcopyCmd,
936 "prefix": prefix,
937 },
938 })
939}
940
Colin Cross635c3b02016-05-18 15:37:25 -0700941func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
942 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700943
944 crossCompile := gccCmd(flags.toolchain, "")
945 args := ""
946 if flags.stripAddGnuDebuglink {
947 args += " --add-gnu-debuglink"
948 }
949 if flags.stripKeepMiniDebugInfo {
950 args += " --keep-mini-debug-info"
951 }
952 if flags.stripKeepSymbols {
953 args += " --keep-symbols"
954 }
Yi Kongacee27c2019-03-29 20:05:14 -0700955 if flags.stripKeepSymbolsList != "" {
956 args += " -k" + flags.stripKeepSymbolsList
957 }
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700958 if flags.stripKeepSymbolsAndDebugFrame {
959 args += " --keep-symbols-and-debug-frame"
960 }
Yi Kongb5c34d72018-11-07 16:28:49 -0800961 if flags.stripUseGnuStrip {
962 args += " --use-gnu-strip"
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700963 }
Colin Cross665dce92016-04-28 14:50:03 -0700964
Colin Crossae887032017-10-23 17:16:14 -0700965 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700966 Rule: strip,
967 Description: "strip " + outputFile.Base(),
968 Output: outputFile,
969 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700970 Args: map[string]string{
971 "crossCompile": crossCompile,
972 "args": args,
973 },
974 })
975}
976
Colin Cross635c3b02016-05-18 15:37:25 -0700977func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
978 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700979
Colin Crossae887032017-10-23 17:16:14 -0700980 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700981 Rule: darwinStrip,
982 Description: "strip " + outputFile.Base(),
983 Output: outputFile,
984 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700985 })
986}
987
Oliver Nguyenc7434142019-04-24 14:22:25 -0700988func TransformCoverageFilesToZip(ctx android.ModuleContext,
989 inputs Objects, baseName string) android.OptionalPath {
Dan Willemsen581341d2017-02-09 16:16:31 -0800990
991 if len(inputs.coverageFiles) > 0 {
Oliver Nguyenc7434142019-04-24 14:22:25 -0700992 outputFile := android.PathForModuleOut(ctx, baseName+".zip")
Dan Willemsen581341d2017-02-09 16:16:31 -0800993
Oliver Nguyenc7434142019-04-24 14:22:25 -0700994 ctx.Build(pctx, android.BuildParams{
995 Rule: zip,
996 Description: "zip " + outputFile.Base(),
997 Inputs: inputs.coverageFiles,
998 Output: outputFile,
999 })
Dan Willemsen581341d2017-02-09 16:16:31 -08001000
1001 return android.OptionalPathForPath(outputFile)
1002 }
1003
1004 return android.OptionalPath{}
1005}
1006
Yi Kongc49c3932019-10-15 02:01:19 -07001007func TransformArchiveRepack(ctx android.ModuleContext, inputFile android.Path,
1008 outputFile android.WritablePath, objects []string) {
1009
1010 ctx.Build(pctx, android.BuildParams{
1011 Rule: archiveRepack,
1012 Description: "Repack archive " + outputFile.Base(),
1013 Output: outputFile,
1014 Input: inputFile,
1015 Args: map[string]string{
1016 "objects": strings.Join(objects, " "),
1017 },
1018 })
1019}
1020
Colin Crossb98c8b02016-07-29 13:44:28 -07001021func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -08001022 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
1023}
Colin Cross0af4b842015-04-30 16:36:18 -07001024
Colin Cross5b529592017-05-09 13:34:34 -07001025func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -07001026 var i int
1027
1028 start := 0
1029 bytes := 0
1030 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -07001031 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -07001032 if l > limit {
1033 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
1034 }
1035 if bytes+l > limit {
1036 lists = append(lists, list[start:i])
1037 start = i
1038 bytes = 0
1039 }
1040 bytes += l + 1 // count a space between each list element
1041 }
1042
1043 lists = append(lists, list[start:])
1044
1045 totalLen := 0
1046 for _, l := range lists {
1047 totalLen += len(l)
1048 }
1049 if totalLen != len(list) {
1050 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
1051 }
1052 return lists, nil
1053}