blob: d69c9169ef93700e376897073f4dcc5e859bb011 [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,
Kousik Kumard207cbe2020-10-20 05:52:49 +000047 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 Kumard207cbe2020-10-20 05:52:49 +000054 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}",
Ramy Medhat6797edc2020-08-28 14:21:55 -040072 Inputs: []string{"${out}.rsp", "$implicitInputs"},
Ramy Medhat9a90fe52020-04-13 13:21:23 -040073 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}"},
Ramy Medhat6797edc2020-08-28 14:21:55 -040077 }, []string{"ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags", "extraLibFlags"}, []string{"implicitInputs", "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{
Ramy Medhat6797edc2020-08-28 14:21:55 -040086 Labels: map[string]string{"type": "link", "tool": "clang"},
87 ExecStrategy: "${config.RECXXLinksExecStrategy}",
88 Inputs: []string{"$inCommaList", "$implicitInputs"},
Kousik Kumar3fb61262020-04-22 13:31:09 -070089 OutputFiles: []string{"${out}", "$implicitOutputs"},
Ramy Medhat9a90fe52020-04-13 13:21:23 -040090 ToolchainInputs: []string{"$ldCmd"},
91 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXLinksPool}"},
Ramy Medhat6797edc2020-08-28 14:21:55 -040092 }, []string{"ldCmd", "ldFlags"}, []string{"implicitInputs", "inCommaList", "implicitOutputs"})
Colin Cross3f40fa42015-01-30 17:27:36 -080093
Colin Cross9d45bb72016-08-29 16:14:13 -070094 ar = pctx.AndroidStaticRule("ar",
Colin Cross3f40fa42015-01-30 17:27:36 -080095 blueprint.RuleParams{
Colin Cross7d21c442015-03-30 17:47:53 -070096 Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
Dan Willemsenc94a7682015-11-17 15:27:28 -080097 CommandDeps: []string{"$arCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070098 Rspfile: "${out}.rsp",
99 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -0800100 },
101 "arCmd", "arFlags")
102
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100103 arWithLibs = pctx.AndroidStaticRule("arWithLibs",
104 blueprint.RuleParams{
105 Command: "rm -f ${out} && $arCmd $arObjFlags $out @${out}.rsp && $arCmd $arLibFlags $out $arLibs",
106 CommandDeps: []string{"$arCmd"},
107 Rspfile: "${out}.rsp",
108 RspfileContent: "${arObjs}",
109 },
110 "arCmd", "arObjFlags", "arObjs", "arLibFlags", "arLibs")
111
Colin Cross9d45bb72016-08-29 16:14:13 -0700112 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700113 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -0700114 Command: "${config.MacStripPath} -u -r -o $out $in",
115 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700116 })
Colin Cross0af4b842015-04-30 16:36:18 -0700117
Colin Cross9d45bb72016-08-29 16:14:13 -0700118 prefixSymbols = pctx.AndroidStaticRule("prefixSymbols",
Colin Crossbfae8852015-03-26 14:44:11 -0700119 blueprint.RuleParams{
120 Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800121 CommandDeps: []string{"$objcopyCmd"},
Colin Crossbfae8852015-03-26 14:44:11 -0700122 },
123 "objcopyCmd", "prefix")
124
Nan Zhang43a485c2017-03-27 14:27:58 -0700125 _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh")
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800126 _ = pctx.SourcePathVariable("xzCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/xz")
Colin Cross665dce92016-04-28 14:50:03 -0700127
Colin Crossee3ea312019-05-17 15:36:46 -0700128 // 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 -0700129 // file descriptors on darwin. Limit concurrent calls to 5 on darwin.
Colin Crossee3ea312019-05-17 15:36:46 -0700130 darwinStripPool = func() blueprint.Pool {
131 if runtime.GOOS == "darwin" {
132 return pctx.StaticPool("darwinStripPool", blueprint.PoolParams{
Colin Crossbadf8d62019-05-22 13:25:50 -0700133 Depth: 5,
Colin Crossee3ea312019-05-17 15:36:46 -0700134 })
135 } else {
136 return nil
137 }
138 }()
139
Colin Cross9d45bb72016-08-29 16:14:13 -0700140 strip = pctx.AndroidStaticRule("strip",
Colin Cross665dce92016-04-28 14:50:03 -0700141 blueprint.RuleParams{
142 Depfile: "${out}.d",
143 Deps: blueprint.DepsGCC,
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700144 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 -0800145 CommandDeps: []string{"$stripPath", "$xzCmd"},
Colin Crossee3ea312019-05-17 15:36:46 -0700146 Pool: darwinStripPool,
Colin Cross665dce92016-04-28 14:50:03 -0700147 },
148 "args", "crossCompile")
149
Yi Kongc49c3932019-10-15 02:01:19 -0700150 _ = pctx.SourcePathVariable("archiveRepackPath", "build/soong/scripts/archive_repack.sh")
151
152 archiveRepack = pctx.AndroidStaticRule("archiveRepack",
153 blueprint.RuleParams{
154 Depfile: "${out}.d",
155 Deps: blueprint.DepsGCC,
156 Command: "CLANG_BIN=${config.ClangBin} $archiveRepackPath -i ${in} -o ${out} -d ${out}.d ${objects}",
157 CommandDeps: []string{"$archiveRepackPath"},
158 },
159 "objects")
160
Colin Cross9d45bb72016-08-29 16:14:13 -0700161 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700162 blueprint.RuleParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700163 Command: "rm -f $out && touch $out",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700164 })
165
Nan Zhang43a485c2017-03-27 14:27:58 -0700166 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700167
168 toc = pctx.AndroidStaticRule("toc",
169 blueprint.RuleParams{
170 Depfile: "${out}.d",
171 Deps: blueprint.DepsGCC,
Colin Crossb496cfd2018-09-10 16:50:05 -0700172 Command: "CROSS_COMPILE=$crossCompile $tocPath $format -i ${in} -o ${out} -d ${out}.d",
Colin Cross26c34ed2016-09-30 17:10:16 -0700173 CommandDeps: []string{"$tocPath"},
174 Restat: true,
175 },
Colin Crossb496cfd2018-09-10 16:50:05 -0700176 "crossCompile", "format")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700177
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700178 clangTidy, clangTidyRE = remoteexec.StaticRules(pctx, "clangTidy",
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700179 blueprint.RuleParams{
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700180 Command: "rm -f $out && $reTemplate${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out",
George Burgess IVc4624c02019-04-04 16:22:37 -0700181 CommandDeps: []string{"${config.ClangBin}/clang-tidy"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700182 },
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700183 &remoteexec.REParams{
184 Labels: map[string]string{"type": "lint", "tool": "clang-tidy", "lang": "cpp"},
185 ExecStrategy: "${config.REClangTidyExecStrategy}",
186 Inputs: []string{"$in"},
187 // OutputFile here is $in for remote-execution since its possible that
188 // clang-tidy modifies the given input file itself and $out refers to the
189 // ".tidy" file generated for ninja-dependency reasons.
Colin Cross053fca12020-08-19 13:51:47 -0700190 OutputFiles: []string{"$in"},
191 Platform: map[string]string{remoteexec.PoolKey: "${config.REClangTidyPool}"},
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700192 }, []string{"cFlags", "tidyFlags"}, []string{})
Colin Cross91e90042016-12-02 17:13:24 -0800193
Nan Zhang43a485c2017-03-27 14:27:58 -0700194 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800195
196 yasm = pctx.AndroidStaticRule("yasm",
197 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700198 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800199 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700200 Depfile: "$out.d",
201 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800202 },
203 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800204
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700205 windres = pctx.AndroidStaticRule("windres",
206 blueprint.RuleParams{
Nick Desaulniers18eeffa2020-01-29 16:20:11 -0800207 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 -0700208 CommandDeps: []string{"$windresCmd"},
209 },
210 "windresCmd", "flags")
211
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800212 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800213
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700214 // -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 -0400215 sAbiDump, sAbiDumpRE = remoteexec.StaticRules(pctx, "sAbiDump",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800216 blueprint.RuleParams{
Ramy Medhat31ec9422020-04-17 15:03:58 -0400217 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 -0800218 CommandDeps: []string{"$sAbiDumper"},
Ramy Medhat31ec9422020-04-17 15:03:58 -0400219 }, &remoteexec.REParams{
220 Labels: map[string]string{"type": "abi-dump", "tool": "header-abi-dumper"},
221 ExecStrategy: "${config.REAbiDumperExecStrategy}",
Ulf Adams18931762020-11-25 22:54:35 +0100222 Inputs: []string{"$sAbiLinkerLibs"},
Ramy Medhat31ec9422020-04-17 15:03:58 -0400223 Platform: map[string]string{
Ulf Adams18931762020-11-25 22:54:35 +0100224 remoteexec.PoolKey: "${config.RECXXPool}",
Ramy Medhat31ec9422020-04-17 15:03:58 -0400225 },
226 }, []string{"cFlags", "exportDirs"}, nil)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800227
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800228 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
Ramy Medhat808594c2020-05-07 06:56:47 -0400229 _ = pctx.SourcePathVariable("sAbiLinkerLibs", "prebuilts/clang-tools/${config.HostPrebuiltTag}/lib64")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800230
Ramy Medhat808594c2020-05-07 06:56:47 -0400231 sAbiLink, sAbiLinkRE = remoteexec.StaticRules(pctx, "sAbiLink",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800232 blueprint.RuleParams{
Ramy Medhat808594c2020-05-07 06:56:47 -0400233 Command: "$reTemplate$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800234 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800235 Rspfile: "${out}.rsp",
236 RspfileContent: "${in}",
Ramy Medhat808594c2020-05-07 06:56:47 -0400237 }, &remoteexec.REParams{
238 Labels: map[string]string{"type": "tool", "name": "abi-linker"},
239 ExecStrategy: "${config.REAbiLinkerExecStrategy}",
Ramy Medhat6797edc2020-08-28 14:21:55 -0400240 Inputs: []string{"$sAbiLinkerLibs", "${out}.rsp", "$implicitInputs"},
Ramy Medhat808594c2020-05-07 06:56:47 -0400241 RSPFile: "${out}.rsp",
242 OutputFiles: []string{"$out"},
243 ToolchainInputs: []string{"$sAbiLinker"},
244 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXPool}"},
Ramy Medhat6797edc2020-08-28 14:21:55 -0400245 }, []string{"symbolFilter", "arch", "exportedHeaderFlags"}, []string{"implicitInputs"})
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800246
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800247 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700248
Colin Cross2e2dbc22019-09-25 13:31:46 -0700249 sAbiDiff = pctx.RuleFunc("sAbiDiff",
Dan Willemsen54daaf02018-03-12 13:24:09 -0700250 func(ctx android.PackageRuleContext) blueprint.RuleParams {
Logan Chien2a65dda2019-10-01 15:58:07 -0700251 commandStr := "($sAbiDiffer ${extraFlags} -lib ${libName} -arch ${arch} -o ${out} -new ${in} -old ${referenceDump})"
Logan Chien6227fed2019-02-18 13:12:21 +0800252 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 +0800253 commandStr += " && (mkdir -p $$DIST_DIR/abidiffs && cp ${out} $$DIST_DIR/abidiffs/)"
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800254 commandStr += " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800255 return blueprint.RuleParams{
256 Command: commandStr,
257 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700258 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800259 },
Logan Chien2a65dda2019-10-01 15:58:07 -0700260 "extraFlags", "referenceDump", "libName", "arch", "createReferenceDumpFlags")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700261
262 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
263 blueprint.RuleParams{
264 Command: "gunzip -c $in > $out",
265 })
Oliver Nguyenc7434142019-04-24 14:22:25 -0700266
267 zip = pctx.AndroidStaticRule("zip",
268 blueprint.RuleParams{
Colin Cross053fca12020-08-19 13:51:47 -0700269 Command: "${SoongZipCmd} -o ${out} -C $$OUT_DIR -r ${out}.rsp",
Oliver Nguyenc7434142019-04-24 14:22:25 -0700270 CommandDeps: []string{"${SoongZipCmd}"},
Colin Cross053fca12020-08-19 13:51:47 -0700271 Rspfile: "${out}.rsp",
Oliver Nguyenc7434142019-04-24 14:22:25 -0700272 RspfileContent: "$in",
273 })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800274
275 _ = pctx.SourcePathVariable("cxxExtractor",
276 "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/cxx_extractor")
Sasha Smundak65143642019-09-26 20:14:28 -0700277 _ = pctx.SourcePathVariable("kytheVnames", "build/soong/vnames.json")
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800278 _ = pctx.VariableFunc("kytheCorpus",
279 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCorpusName() })
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800280 _ = pctx.VariableFunc("kytheCuEncoding",
281 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCuEncoding() })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800282 kytheExtract = pctx.StaticRule("kythe",
283 blueprint.RuleParams{
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800284 Command: `rm -f $out && ` +
Sasha Smundaka4ef83b2020-04-21 17:08:35 -0700285 `KYTHE_CORPUS=${kytheCorpus} ` +
286 `KYTHE_OUTPUT_FILE=$out ` +
287 `KYTHE_VNAMES=$kytheVnames ` +
288 `KYTHE_KZIP_ENCODING=${kytheCuEncoding} ` +
289 `KYTHE_CANONICALIZE_VNAME_PATHS=prefer-relative ` +
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800290 `$cxxExtractor $cFlags $in `,
Sasha Smundak65143642019-09-26 20:14:28 -0700291 CommandDeps: []string{"$cxxExtractor", "$kytheVnames"},
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800292 },
293 "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -0800294)
295
Ivan Lozanof3717ee2020-05-20 09:03:20 -0400296func PwdPrefix() string {
297 // Darwin doesn't have /proc
298 if runtime.GOOS != "darwin" {
299 return "PWD=/proc/self/cwd"
300 }
301 return ""
302}
303
Dan Willemsen322a0a62015-11-17 15:19:46 -0800304func init() {
305 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
306 // debug output. That way two builds in two different directories will
307 // create the same output.
Ivan Lozanof3717ee2020-05-20 09:03:20 -0400308 pctx.StaticVariable("relPwd", PwdPrefix())
Oliver Nguyenc7434142019-04-24 14:22:25 -0700309
310 pctx.HostBinToolVariable("SoongZipCmd", "soong_zip")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400311 pctx.Import("android/soong/remoteexec")
Dan Willemsen322a0a62015-11-17 15:19:46 -0800312}
313
Colin Cross3f40fa42015-01-30 17:27:36 -0800314type builderFlags struct {
Colin Cross6d88dba2019-11-06 07:06:58 -0800315 globalCommonFlags string
316 globalAsFlags string
317 globalYasmFlags string
318 globalCFlags string
319 globalToolingCFlags string // A separate set of cFlags for clang LibTooling tools
320 globalToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
321 globalConlyFlags string
322 globalCppFlags string
323 globalLdFlags string
324
325 localCommonFlags string
326 localAsFlags string
327 localYasmFlags string
328 localCFlags string
329 localToolingCFlags string // A separate set of cFlags for clang LibTooling tools
330 localToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
331 localConlyFlags string
332 localCppFlags string
333 localLdFlags string
334
335 libFlags string
336 extraLibFlags string
337 tidyFlags string
338 sAbiFlags string
339 aidlFlags string
340 rsFlags string
341 toolchain config.Toolchain
342 tidy bool
Oliver Nguyen04526782020-04-21 12:40:27 -0700343 gcovCoverage bool
Colin Cross6d88dba2019-11-06 07:06:58 -0800344 sAbiDump bool
345 emitXrefs bool
Colin Cross665dce92016-04-28 14:50:03 -0700346
Dan Willemsen98ab3112019-08-27 21:20:40 -0700347 assemblerWithCpp bool
348
Colin Crossc3199482017-03-30 15:03:04 -0700349 systemIncludeFlags string
350
Colin Cross18c0c5a2016-12-01 14:45:23 -0800351 groupStaticLibs bool
352
Colin Cross19878da2019-03-28 14:45:07 -0700353 proto android.ProtoFlags
Dan Willemsen60e62f02018-11-16 21:05:32 -0800354 protoC bool
355 protoOptionsFile bool
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700356
357 yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200358 lex *LexProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800359}
360
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200361type StripFlags struct {
362 Toolchain config.Toolchain
363 StripKeepSymbols bool
364 StripKeepSymbolsList string
365 StripKeepSymbolsAndDebugFrame bool
366 StripKeepMiniDebugInfo bool
367 StripAddGnuDebuglink bool
368 StripUseGnuStrip bool
369}
370
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700371type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800372 objFiles android.Paths
373 tidyFiles android.Paths
374 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800375 sAbiDumpFiles android.Paths
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800376 kytheFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700377}
378
379func (a Objects) Copy() Objects {
380 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800381 objFiles: append(android.Paths{}, a.objFiles...),
382 tidyFiles: append(android.Paths{}, a.tidyFiles...),
383 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800384 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800385 kytheFiles: append(android.Paths{}, a.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700386 }
387}
388
389func (a Objects) Append(b Objects) Objects {
390 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800391 objFiles: append(a.objFiles, b.objFiles...),
392 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
393 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800394 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800395 kytheFiles: append(a.kytheFiles, b.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700396 }
397}
398
Colin Cross3f40fa42015-01-30 17:27:36 -0800399// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700400func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800401 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700402
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700403 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700404 var tidyFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700405 if flags.tidy {
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700406 tidyFiles = make(android.Paths, 0, len(srcFiles))
407 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800408 var coverageFiles android.Paths
Oliver Nguyen04526782020-04-21 12:40:27 -0700409 if flags.gcovCoverage {
Dan Willemsen581341d2017-02-09 16:16:31 -0800410 coverageFiles = make(android.Paths, 0, len(srcFiles))
411 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800412 var kytheFiles android.Paths
413 if flags.emitXrefs {
414 kytheFiles = make(android.Paths, 0, len(srcFiles))
415 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800416
Colin Cross6d88dba2019-11-06 07:06:58 -0800417 // Produce fully expanded flags for use by C tools, C compiles, C++ tools, C++ compiles, and asm compiles
418 // respectively.
419 toolingCflags := flags.globalCommonFlags + " " +
420 flags.globalToolingCFlags + " " +
421 flags.globalConlyFlags + " " +
422 flags.localCommonFlags + " " +
423 flags.localToolingCFlags + " " +
424 flags.localConlyFlags + " " +
425 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700426
Colin Cross6d88dba2019-11-06 07:06:58 -0800427 cflags := flags.globalCommonFlags + " " +
428 flags.globalCFlags + " " +
429 flags.globalConlyFlags + " " +
430 flags.localCommonFlags + " " +
431 flags.localCFlags + " " +
432 flags.localConlyFlags + " " +
433 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700434
Colin Cross6d88dba2019-11-06 07:06:58 -0800435 toolingCppflags := flags.globalCommonFlags + " " +
436 flags.globalToolingCFlags + " " +
437 flags.globalToolingCppFlags + " " +
438 flags.localCommonFlags + " " +
439 flags.localToolingCFlags + " " +
440 flags.localToolingCppFlags + " " +
441 flags.systemIncludeFlags
Colin Crossc3199482017-03-30 15:03:04 -0700442
Colin Cross6d88dba2019-11-06 07:06:58 -0800443 cppflags := flags.globalCommonFlags + " " +
444 flags.globalCFlags + " " +
445 flags.globalCppFlags + " " +
446 flags.localCommonFlags + " " +
447 flags.localCFlags + " " +
448 flags.localCppFlags + " " +
449 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700450
Colin Cross6d88dba2019-11-06 07:06:58 -0800451 asflags := flags.globalCommonFlags + " " +
452 flags.globalAsFlags + " " +
453 flags.localCommonFlags + " " +
454 flags.localAsFlags + " " +
455 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700456
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800457 var sAbiDumpFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700458 if flags.sAbiDump {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800459 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
460 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800461
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700462 cflags += " ${config.NoOverrideClangGlobalCflags}"
463 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
464 cppflags += " ${config.NoOverrideClangGlobalCflags}"
465 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800466
Colin Cross3f40fa42015-01-30 17:27:36 -0800467 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700468 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800469
470 objFiles[i] = objFile
471
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700472 switch srcFile.Ext() {
473 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700474 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700475 Rule: yasm,
476 Description: "yasm " + srcFile.Rel(),
477 Output: objFile,
478 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800479 Implicits: cFlagsDeps,
480 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800481 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800482 "asFlags": flags.globalYasmFlags + " " + flags.localYasmFlags,
Colin Cross91e90042016-12-02 17:13:24 -0800483 },
484 })
485 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700486 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700487 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700488 Rule: windres,
489 Description: "windres " + srcFile.Rel(),
490 Output: objFile,
491 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800492 Implicits: cFlagsDeps,
493 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700494 Args: map[string]string{
495 "windresCmd": gccCmd(flags.toolchain, "windres"),
496 "flags": flags.toolchain.WindresFlags(),
497 },
498 })
499 continue
Pete Bentleyfcf55bf2019-08-16 20:14:32 +0100500 case ".o":
501 objFiles[i] = srcFile
502 continue
Colin Cross91e90042016-12-02 17:13:24 -0800503 }
504
Colin Cross6d88dba2019-11-06 07:06:58 -0800505 var moduleFlags string
506 var moduleToolingFlags string
507
Colin Cross3f40fa42015-01-30 17:27:36 -0800508 var ccCmd string
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700509 tidy := flags.tidy
Oliver Nguyen04526782020-04-21 12:40:27 -0700510 coverage := flags.gcovCoverage
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700511 dump := flags.sAbiDump
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800512 rule := cc
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800513 emitXref := flags.emitXrefs
Colin Cross3f40fa42015-01-30 17:27:36 -0800514
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700515 switch srcFile.Ext() {
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800516 case ".s":
Dan Willemsen98ab3112019-08-27 21:20:40 -0700517 if !flags.assemblerWithCpp {
518 rule = ccNoDeps
519 }
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800520 fallthrough
521 case ".S":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700522 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800523 moduleFlags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700524 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800525 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800526 dump = false
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800527 emitXref = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800528 case ".c":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700529 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800530 moduleFlags = cflags
531 moduleToolingFlags = toolingCflags
Colin Crossd34ab7c2019-06-27 14:46:10 -0700532 case ".cpp", ".cc", ".cxx", ".mm":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700533 ccCmd = "clang++"
Colin Cross6d88dba2019-11-06 07:06:58 -0800534 moduleFlags = cppflags
535 moduleToolingFlags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800536 default:
537 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
538 continue
539 }
540
Colin Cross67a5c132017-05-09 13:45:28 -0700541 ccDesc := ccCmd
542
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700543 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800544
Dan Willemsen581341d2017-02-09 16:16:31 -0800545 var implicitOutputs android.WritablePaths
546 if coverage {
547 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
548 implicitOutputs = append(implicitOutputs, gcnoFile)
549 coverageFiles = append(coverageFiles, gcnoFile)
550 }
551
Colin Crossae887032017-10-23 17:16:14 -0700552 ctx.Build(pctx, android.BuildParams{
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800553 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700554 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800555 Output: objFile,
556 ImplicitOutputs: implicitOutputs,
557 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800558 Implicits: cFlagsDeps,
559 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800560 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800561 "cFlags": moduleFlags,
Colin Cross28344522015-04-22 13:07:53 -0700562 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800563 },
564 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700565
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800566 if emitXref {
567 kytheFile := android.ObjPathWithExt(ctx, subdir, srcFile, "kzip")
568 ctx.Build(pctx, android.BuildParams{
569 Rule: kytheExtract,
570 Description: "Xref C++ extractor " + srcFile.Rel(),
571 Output: kytheFile,
572 Input: srcFile,
573 Implicits: cFlagsDeps,
574 OrderOnly: pathDeps,
575 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800576 "cFlags": moduleFlags,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800577 },
578 })
579 kytheFiles = append(kytheFiles, kytheFile)
580 }
581
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700582 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700583 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700584 tidyFiles = append(tidyFiles, tidyFile)
585
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700586 rule := clangTidy
Ramy Medhat16f23a42020-09-03 01:29:49 -0400587 if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_CLANG_TIDY") {
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700588 rule = clangTidyRE
589 }
590
Colin Crossae887032017-10-23 17:16:14 -0700591 ctx.Build(pctx, android.BuildParams{
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700592 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700593 Description: "clang-tidy " + srcFile.Rel(),
594 Output: tidyFile,
595 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700596 // We must depend on objFile, since clang-tidy doesn't
597 // support exporting dependencies.
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700598 Implicit: objFile,
599 Implicits: cFlagsDeps,
600 OrderOnly: pathDeps,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700601 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800602 "cFlags": moduleToolingFlags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700603 "tidyFlags": flags.tidyFlags,
604 },
605 })
606 }
607
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800608 if dump {
609 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
610 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
611
Ramy Medhat31ec9422020-04-17 15:03:58 -0400612 dumpRule := sAbiDump
Ramy Medhat16f23a42020-09-03 01:29:49 -0400613 if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_ABI_DUMPER") {
Ramy Medhat31ec9422020-04-17 15:03:58 -0400614 dumpRule = sAbiDumpRE
615 }
Colin Crossae887032017-10-23 17:16:14 -0700616 ctx.Build(pctx, android.BuildParams{
Ramy Medhat31ec9422020-04-17 15:03:58 -0400617 Rule: dumpRule,
Colin Cross67a5c132017-05-09 13:45:28 -0700618 Description: "header-abi-dumper " + srcFile.Rel(),
619 Output: sAbiDumpFile,
620 Input: srcFile,
621 Implicit: objFile,
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700622 Implicits: cFlagsDeps,
623 OrderOnly: pathDeps,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800624 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800625 "cFlags": moduleToolingFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800626 "exportDirs": flags.sAbiFlags,
627 },
628 })
629 }
630
Colin Cross3f40fa42015-01-30 17:27:36 -0800631 }
632
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700633 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800634 objFiles: objFiles,
635 tidyFiles: tidyFiles,
636 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800637 sAbiDumpFiles: sAbiDumpFiles,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800638 kytheFiles: kytheFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700639 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800640}
641
642// Generate a rule for compiling multiple .o files to a static library (.a)
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100643func TransformObjToStaticLib(ctx android.ModuleContext,
644 objFiles android.Paths, wholeStaticLibs android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700645 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800646
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800647 arCmd := "${config.ClangBin}/llvm-ar"
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100648 arFlags := ""
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800649 if !ctx.Darwin() {
650 arFlags += " -format=gnu"
651 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800652
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100653 if len(wholeStaticLibs) == 0 {
654 ctx.Build(pctx, android.BuildParams{
655 Rule: ar,
656 Description: "static link " + outputFile.Base(),
657 Output: outputFile,
658 Inputs: objFiles,
659 Implicits: deps,
660 Args: map[string]string{
661 "arFlags": "crsPD" + arFlags,
662 "arCmd": arCmd,
663 },
664 })
665
666 } else {
667 ctx.Build(pctx, android.BuildParams{
668 Rule: arWithLibs,
669 Description: "static link " + outputFile.Base(),
670 Output: outputFile,
671 Inputs: append(objFiles, wholeStaticLibs...),
672 Implicits: deps,
673 Args: map[string]string{
674 "arCmd": arCmd,
675 "arObjFlags": "crsPD" + arFlags,
676 "arObjs": strings.Join(objFiles.Strings(), " "),
677 "arLibFlags": "cqsL" + arFlags,
678 "arLibs": strings.Join(wholeStaticLibs.Strings(), " "),
679 },
680 })
681 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800682}
683
684// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700685// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700686func TransformObjToDynamicBinary(ctx android.ModuleContext,
687 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
Josh Gao75a50a22019-06-07 17:58:59 -0700688 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath, implicitOutputs android.WritablePaths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800689
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700690 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800691
Colin Cross3f40fa42015-01-30 17:27:36 -0800692 var libFlagsList []string
693
Colin Cross16b23492016-01-06 14:41:07 -0800694 if len(flags.libFlags) > 0 {
695 libFlagsList = append(libFlagsList, flags.libFlags)
696 }
697
Colin Cross3f40fa42015-01-30 17:27:36 -0800698 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800699 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700700 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700701 } else {
702 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700703 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700704 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
705 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800706 }
707
Colin Cross7a7cf972016-12-05 18:47:39 -0800708 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800709 libFlagsList = append(libFlagsList, "-Wl,--start-group")
710 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700711 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800712 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800713 libFlagsList = append(libFlagsList, "-Wl,--end-group")
714 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800715
Stephen Hines10347862016-07-18 15:54:54 -0700716 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700717 libFlagsList = append(libFlagsList, "-Wl,--start-group")
718 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700719 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700720 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700721 libFlagsList = append(libFlagsList, "-Wl,--end-group")
722 }
723
Colin Cross3f40fa42015-01-30 17:27:36 -0800724 for _, lib := range sharedLibs {
Josh Gao75a50a22019-06-07 17:58:59 -0700725 libFile := lib.String()
726 if ctx.Windows() {
727 libFile = pathtools.ReplaceExtension(libFile, "lib")
728 }
729 libFlagsList = append(libFlagsList, libFile)
Colin Cross3f40fa42015-01-30 17:27:36 -0800730 }
731
Colin Cross3f40fa42015-01-30 17:27:36 -0800732 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700733 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800734 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700735 if crtBegin.Valid() {
736 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800737 }
738
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400739 rule := ld
Kousik Kumar3fb61262020-04-22 13:31:09 -0700740 args := map[string]string{
741 "ldCmd": ldCmd,
742 "crtBegin": crtBegin.String(),
743 "libFlags": strings.Join(libFlagsList, " "),
744 "extraLibFlags": flags.extraLibFlags,
745 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
746 "crtEnd": crtEnd.String(),
747 }
Ramy Medhat16f23a42020-09-03 01:29:49 -0400748 if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400749 rule = ldRE
Kousik Kumar3fb61262020-04-22 13:31:09 -0700750 args["implicitOutputs"] = strings.Join(implicitOutputs.Strings(), ",")
Ramy Medhat6797edc2020-08-28 14:21:55 -0400751 args["implicitInputs"] = strings.Join(deps.Strings(), ",")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400752 }
753
Colin Crossae887032017-10-23 17:16:14 -0700754 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400755 Rule: rule,
Josh Gao75a50a22019-06-07 17:58:59 -0700756 Description: "link " + outputFile.Base(),
757 Output: outputFile,
758 ImplicitOutputs: implicitOutputs,
759 Inputs: objFiles,
760 Implicits: deps,
Kousik Kumar3fb61262020-04-22 13:31:09 -0700761 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800762 })
763}
764
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800765// Generate a rule to combine .dump sAbi dump files from multiple source files
766// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700767func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800768 baseName, exportedHeaderFlags string, symbolFile android.OptionalPath,
769 excludedSymbolVersions, excludedSymbolTags []string) android.OptionalPath {
770
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800771 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800772
773 implicits := android.Paths{soFile}
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800774 symbolFilterStr := "-so " + soFile.String()
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800775
776 if symbolFile.Valid() {
777 implicits = append(implicits, symbolFile.Path())
778 symbolFilterStr += " -v " + symbolFile.String()
779 }
780 for _, ver := range excludedSymbolVersions {
781 symbolFilterStr += " --exclude-symbol-version " + ver
782 }
783 for _, tag := range excludedSymbolTags {
784 symbolFilterStr += " --exclude-symbol-tag " + tag
785 }
Ramy Medhat808594c2020-05-07 06:56:47 -0400786 rule := sAbiLink
787 args := map[string]string{
788 "symbolFilter": symbolFilterStr,
789 "arch": ctx.Arch().ArchType.Name,
790 "exportedHeaderFlags": exportedHeaderFlags,
791 }
Ramy Medhat16f23a42020-09-03 01:29:49 -0400792 if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_ABI_LINKER") {
Ramy Medhat808594c2020-05-07 06:56:47 -0400793 rule = sAbiLinkRE
794 rbeImplicits := implicits.Strings()
795 for _, p := range strings.Split(exportedHeaderFlags, " ") {
796 if len(p) > 2 {
797 // Exclude the -I prefix.
798 rbeImplicits = append(rbeImplicits, p[2:])
799 }
800 }
Ramy Medhat6797edc2020-08-28 14:21:55 -0400801 args["implicitInputs"] = strings.Join(rbeImplicits, ",")
Ramy Medhat808594c2020-05-07 06:56:47 -0400802 }
Colin Crossae887032017-10-23 17:16:14 -0700803 ctx.Build(pctx, android.BuildParams{
Ramy Medhat808594c2020-05-07 06:56:47 -0400804 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700805 Description: "header-abi-linker " + outputFile.Base(),
806 Output: outputFile,
807 Inputs: sAbiDumps,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800808 Implicits: implicits,
Ramy Medhat808594c2020-05-07 06:56:47 -0400809 Args: args,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800810 })
811 return android.OptionalPathForPath(outputFile)
812}
813
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700814func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
815 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700816 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700817 Rule: unzipRefSAbiDump,
818 Description: "gunzip" + outputFile.Base(),
819 Output: outputFile,
820 Input: zippedRefDump,
821 })
822 return outputFile
823}
824
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800825func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chien2a65dda2019-10-01 15:58:07 -0700826 baseName, exportedHeaderFlags string, checkAllApis, isLlndk, isNdk, isVndkExt bool) android.OptionalPath {
Logan Chienf3511742017-10-31 18:04:35 +0800827
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800828 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700829 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Logan Chien6227fed2019-02-18 13:12:21 +0800830 createReferenceDumpFlags := ""
831
Logan Chien2a65dda2019-10-01 15:58:07 -0700832 var extraFlags []string
833 if checkAllApis {
834 extraFlags = append(extraFlags, "-check-all-apis")
835 } else {
836 extraFlags = append(extraFlags,
837 "-allow-unreferenced-changes",
838 "-allow-unreferenced-elf-symbol-changes")
Jayant Chowdharye4499502018-01-17 13:13:33 -0800839 }
Logan Chien2a65dda2019-10-01 15:58:07 -0700840
841 if exportedHeaderFlags == "" {
842 extraFlags = append(extraFlags, "-advice-only")
843 }
844
Logan Chien62f1f942019-02-18 15:40:42 +0800845 if isLlndk || isNdk {
Logan Chien6227fed2019-02-18 13:12:21 +0800846 createReferenceDumpFlags = "--llndk"
Logan Chien62f1f942019-02-18 15:40:42 +0800847 if isLlndk {
848 // TODO(b/130324828): "-consider-opaque-types-different" should apply to
849 // both LLNDK and NDK shared libs. However, a known issue in header-abi-diff
850 // breaks libaaudio. Remove the if-guard after the issue is fixed.
Logan Chien2a65dda2019-10-01 15:58:07 -0700851 extraFlags = append(extraFlags, "-consider-opaque-types-different")
Logan Chien62f1f942019-02-18 15:40:42 +0800852 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700853 }
Logan Chienf3511742017-10-31 18:04:35 +0800854 if isVndkExt {
Logan Chien2a65dda2019-10-01 15:58:07 -0700855 extraFlags = append(extraFlags, "-allow-extensions")
Logan Chienf3511742017-10-31 18:04:35 +0800856 }
857
Colin Crossae887032017-10-23 17:16:14 -0700858 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700859 Rule: sAbiDiff,
860 Description: "header-abi-diff " + outputFile.Base(),
861 Output: outputFile,
862 Input: inputDump,
863 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800864 Args: map[string]string{
Logan Chien6227fed2019-02-18 13:12:21 +0800865 "referenceDump": referenceDump.String(),
866 "libName": libName,
867 "arch": ctx.Arch().ArchType.Name,
Logan Chien2a65dda2019-10-01 15:58:07 -0700868 "extraFlags": strings.Join(extraFlags, " "),
Logan Chien6227fed2019-02-18 13:12:21 +0800869 "createReferenceDumpFlags": createReferenceDumpFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800870 },
871 })
872 return android.OptionalPathForPath(outputFile)
873}
874
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700875// Generate a rule for extracting a table of contents from a shared library (.so)
876func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700877 outputFile android.WritablePath, flags builderFlags) {
878
Colin Crossb496cfd2018-09-10 16:50:05 -0700879 var format string
880 var crossCompile string
881 if ctx.Darwin() {
882 format = "--macho"
883 crossCompile = "${config.MacToolPath}"
884 } else if ctx.Windows() {
885 format = "--pe"
886 crossCompile = gccCmd(flags.toolchain, "")
887 } else {
888 format = "--elf"
889 crossCompile = gccCmd(flags.toolchain, "")
890 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700891
Colin Crossae887032017-10-23 17:16:14 -0700892 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700893 Rule: toc,
894 Description: "generate toc " + inputFile.Base(),
895 Output: outputFile,
896 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700897 Args: map[string]string{
898 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700899 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700900 },
901 })
902}
903
Colin Cross3f40fa42015-01-30 17:27:36 -0800904// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700905func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700906 flags builderFlags, outputFile android.WritablePath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800907
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700908 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800909
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400910 rule := partialLd
911 args := map[string]string{
912 "ldCmd": ldCmd,
913 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
914 }
Ramy Medhat16f23a42020-09-03 01:29:49 -0400915 if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400916 rule = partialLdRE
917 args["inCommaList"] = strings.Join(objFiles.Strings(), ",")
Ramy Medhat6797edc2020-08-28 14:21:55 -0400918 args["implicitInputs"] = strings.Join(deps.Strings(), ",")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400919 }
Colin Crossae887032017-10-23 17:16:14 -0700920 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400921 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700922 Description: "link " + outputFile.Base(),
923 Output: outputFile,
924 Inputs: objFiles,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700925 Implicits: deps,
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400926 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800927 })
928}
929
Colin Crossbfae8852015-03-26 14:44:11 -0700930// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700931func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
932 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700933
934 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
935
Colin Crossae887032017-10-23 17:16:14 -0700936 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700937 Rule: prefixSymbols,
938 Description: "prefix symbols " + outputFile.Base(),
939 Output: outputFile,
940 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700941 Args: map[string]string{
942 "objcopyCmd": objcopyCmd,
943 "prefix": prefix,
944 },
945 })
946}
947
Colin Cross635c3b02016-05-18 15:37:25 -0700948func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200949 outputFile android.WritablePath, flags StripFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700950
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200951 crossCompile := gccCmd(flags.Toolchain, "")
Colin Cross665dce92016-04-28 14:50:03 -0700952 args := ""
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200953 if flags.StripAddGnuDebuglink {
Colin Cross665dce92016-04-28 14:50:03 -0700954 args += " --add-gnu-debuglink"
955 }
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200956 if flags.StripKeepMiniDebugInfo {
Colin Cross665dce92016-04-28 14:50:03 -0700957 args += " --keep-mini-debug-info"
958 }
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200959 if flags.StripKeepSymbols {
Colin Cross665dce92016-04-28 14:50:03 -0700960 args += " --keep-symbols"
961 }
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200962 if flags.StripKeepSymbolsList != "" {
963 args += " -k" + flags.StripKeepSymbolsList
Yi Kongacee27c2019-03-29 20:05:14 -0700964 }
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200965 if flags.StripKeepSymbolsAndDebugFrame {
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700966 args += " --keep-symbols-and-debug-frame"
967 }
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200968 if flags.StripUseGnuStrip {
Yi Kongb5c34d72018-11-07 16:28:49 -0800969 args += " --use-gnu-strip"
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700970 }
Colin Cross665dce92016-04-28 14:50:03 -0700971
Colin Crossae887032017-10-23 17:16:14 -0700972 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700973 Rule: strip,
974 Description: "strip " + outputFile.Base(),
975 Output: outputFile,
976 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700977 Args: map[string]string{
978 "crossCompile": crossCompile,
979 "args": args,
980 },
981 })
982}
983
Colin Cross635c3b02016-05-18 15:37:25 -0700984func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
985 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700986
Colin Crossae887032017-10-23 17:16:14 -0700987 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700988 Rule: darwinStrip,
989 Description: "strip " + outputFile.Base(),
990 Output: outputFile,
991 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700992 })
993}
994
Oliver Nguyenc7434142019-04-24 14:22:25 -0700995func TransformCoverageFilesToZip(ctx android.ModuleContext,
996 inputs Objects, baseName string) android.OptionalPath {
Dan Willemsen581341d2017-02-09 16:16:31 -0800997
998 if len(inputs.coverageFiles) > 0 {
Oliver Nguyenc7434142019-04-24 14:22:25 -0700999 outputFile := android.PathForModuleOut(ctx, baseName+".zip")
Dan Willemsen581341d2017-02-09 16:16:31 -08001000
Oliver Nguyenc7434142019-04-24 14:22:25 -07001001 ctx.Build(pctx, android.BuildParams{
1002 Rule: zip,
1003 Description: "zip " + outputFile.Base(),
1004 Inputs: inputs.coverageFiles,
1005 Output: outputFile,
1006 })
Dan Willemsen581341d2017-02-09 16:16:31 -08001007
1008 return android.OptionalPathForPath(outputFile)
1009 }
1010
1011 return android.OptionalPath{}
1012}
1013
Yi Kongc49c3932019-10-15 02:01:19 -07001014func TransformArchiveRepack(ctx android.ModuleContext, inputFile android.Path,
1015 outputFile android.WritablePath, objects []string) {
1016
1017 ctx.Build(pctx, android.BuildParams{
1018 Rule: archiveRepack,
1019 Description: "Repack archive " + outputFile.Base(),
1020 Output: outputFile,
1021 Input: inputFile,
1022 Args: map[string]string{
1023 "objects": strings.Join(objects, " "),
1024 },
1025 })
1026}
1027
Colin Crossb98c8b02016-07-29 13:44:28 -07001028func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -08001029 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
1030}
Colin Cross0af4b842015-04-30 16:36:18 -07001031
Colin Cross5b529592017-05-09 13:34:34 -07001032func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -07001033 var i int
1034
1035 start := 0
1036 bytes := 0
1037 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -07001038 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -07001039 if l > limit {
1040 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
1041 }
1042 if bytes+l > limit {
1043 lists = append(lists, list[start:i])
1044 start = i
1045 bytes = 0
1046 }
1047 bytes += l + 1 // count a space between each list element
1048 }
1049
1050 lists = append(lists, list[start:])
1051
1052 totalLen := 0
1053 for _, l := range lists {
1054 totalLen += len(l)
1055 }
1056 if totalLen != len(list) {
1057 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
1058 }
1059 return lists, nil
1060}