blob: 81c09b1a15675173788d7ef420ae6c90585e8940 [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}",
222 Platform: map[string]string{
Kousik Kumard207cbe2020-10-20 05:52:49 +0000223 remoteexec.PoolKey: "${config.RECXXPool}",
Ramy Medhat31ec9422020-04-17 15:03:58 -0400224 },
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}",
Ramy Medhat6797edc2020-08-28 14:21:55 -0400239 Inputs: []string{"$sAbiLinkerLibs", "${out}.rsp", "$implicitInputs"},
Ramy Medhat808594c2020-05-07 06:56:47 -0400240 RSPFile: "${out}.rsp",
241 OutputFiles: []string{"$out"},
242 ToolchainInputs: []string{"$sAbiLinker"},
243 Platform: map[string]string{remoteexec.PoolKey: "${config.RECXXPool}"},
Ramy Medhat6797edc2020-08-28 14:21:55 -0400244 }, []string{"symbolFilter", "arch", "exportedHeaderFlags"}, []string{"implicitInputs"})
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800245
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800246 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700247
Colin Cross2e2dbc22019-09-25 13:31:46 -0700248 sAbiDiff = pctx.RuleFunc("sAbiDiff",
Dan Willemsen54daaf02018-03-12 13:24:09 -0700249 func(ctx android.PackageRuleContext) blueprint.RuleParams {
Logan Chien2a65dda2019-10-01 15:58:07 -0700250 commandStr := "($sAbiDiffer ${extraFlags} -lib ${libName} -arch ${arch} -o ${out} -new ${in} -old ${referenceDump})"
Logan Chien6227fed2019-02-18 13:12:21 +0800251 commandStr += "|| (echo 'error: Please update ABI references with: $$ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py ${createReferenceDumpFlags} -l ${libName}'"
Logan Chien8f74fe62019-01-28 12:14:54 +0800252 commandStr += " && (mkdir -p $$DIST_DIR/abidiffs && cp ${out} $$DIST_DIR/abidiffs/)"
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800253 commandStr += " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800254 return blueprint.RuleParams{
255 Command: commandStr,
256 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700257 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800258 },
Logan Chien2a65dda2019-10-01 15:58:07 -0700259 "extraFlags", "referenceDump", "libName", "arch", "createReferenceDumpFlags")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700260
261 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
262 blueprint.RuleParams{
263 Command: "gunzip -c $in > $out",
264 })
Oliver Nguyenc7434142019-04-24 14:22:25 -0700265
266 zip = pctx.AndroidStaticRule("zip",
267 blueprint.RuleParams{
Colin Cross053fca12020-08-19 13:51:47 -0700268 Command: "${SoongZipCmd} -o ${out} -C $$OUT_DIR -r ${out}.rsp",
Oliver Nguyenc7434142019-04-24 14:22:25 -0700269 CommandDeps: []string{"${SoongZipCmd}"},
Colin Cross053fca12020-08-19 13:51:47 -0700270 Rspfile: "${out}.rsp",
Oliver Nguyenc7434142019-04-24 14:22:25 -0700271 RspfileContent: "$in",
272 })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800273
274 _ = pctx.SourcePathVariable("cxxExtractor",
275 "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/cxx_extractor")
Sasha Smundak65143642019-09-26 20:14:28 -0700276 _ = pctx.SourcePathVariable("kytheVnames", "build/soong/vnames.json")
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800277 _ = pctx.VariableFunc("kytheCorpus",
278 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCorpusName() })
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800279 _ = pctx.VariableFunc("kytheCuEncoding",
280 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCuEncoding() })
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800281 kytheExtract = pctx.StaticRule("kythe",
282 blueprint.RuleParams{
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800283 Command: `rm -f $out && ` +
Sasha Smundaka4ef83b2020-04-21 17:08:35 -0700284 `KYTHE_CORPUS=${kytheCorpus} ` +
285 `KYTHE_OUTPUT_FILE=$out ` +
286 `KYTHE_VNAMES=$kytheVnames ` +
287 `KYTHE_KZIP_ENCODING=${kytheCuEncoding} ` +
288 `KYTHE_CANONICALIZE_VNAME_PATHS=prefer-relative ` +
Sasha Smundak6c2d4f92020-01-09 17:34:23 -0800289 `$cxxExtractor $cFlags $in `,
Sasha Smundak65143642019-09-26 20:14:28 -0700290 CommandDeps: []string{"$cxxExtractor", "$kytheVnames"},
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800291 },
292 "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -0800293)
294
Ivan Lozanof3717ee2020-05-20 09:03:20 -0400295func PwdPrefix() string {
296 // Darwin doesn't have /proc
297 if runtime.GOOS != "darwin" {
298 return "PWD=/proc/self/cwd"
299 }
300 return ""
301}
302
Dan Willemsen322a0a62015-11-17 15:19:46 -0800303func init() {
304 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
305 // debug output. That way two builds in two different directories will
306 // create the same output.
Ivan Lozanof3717ee2020-05-20 09:03:20 -0400307 pctx.StaticVariable("relPwd", PwdPrefix())
Oliver Nguyenc7434142019-04-24 14:22:25 -0700308
309 pctx.HostBinToolVariable("SoongZipCmd", "soong_zip")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400310 pctx.Import("android/soong/remoteexec")
Dan Willemsen322a0a62015-11-17 15:19:46 -0800311}
312
Colin Cross3f40fa42015-01-30 17:27:36 -0800313type builderFlags struct {
Colin Cross6d88dba2019-11-06 07:06:58 -0800314 globalCommonFlags string
315 globalAsFlags string
316 globalYasmFlags string
317 globalCFlags string
318 globalToolingCFlags string // A separate set of cFlags for clang LibTooling tools
319 globalToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
320 globalConlyFlags string
321 globalCppFlags string
322 globalLdFlags string
323
324 localCommonFlags string
325 localAsFlags string
326 localYasmFlags string
327 localCFlags string
328 localToolingCFlags string // A separate set of cFlags for clang LibTooling tools
329 localToolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
330 localConlyFlags string
331 localCppFlags string
332 localLdFlags string
333
334 libFlags string
335 extraLibFlags string
336 tidyFlags string
337 sAbiFlags string
338 aidlFlags string
339 rsFlags string
340 toolchain config.Toolchain
341 tidy bool
Oliver Nguyen04526782020-04-21 12:40:27 -0700342 gcovCoverage bool
Colin Cross6d88dba2019-11-06 07:06:58 -0800343 sAbiDump bool
344 emitXrefs bool
Colin Cross665dce92016-04-28 14:50:03 -0700345
Dan Willemsen98ab3112019-08-27 21:20:40 -0700346 assemblerWithCpp bool
347
Colin Crossc3199482017-03-30 15:03:04 -0700348 systemIncludeFlags string
349
Colin Cross18c0c5a2016-12-01 14:45:23 -0800350 groupStaticLibs bool
351
Colin Cross19878da2019-03-28 14:45:07 -0700352 proto android.ProtoFlags
Dan Willemsen60e62f02018-11-16 21:05:32 -0800353 protoC bool
354 protoOptionsFile bool
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700355
356 yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200357 lex *LexProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800358}
359
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200360type StripFlags struct {
361 Toolchain config.Toolchain
362 StripKeepSymbols bool
363 StripKeepSymbolsList string
364 StripKeepSymbolsAndDebugFrame bool
365 StripKeepMiniDebugInfo bool
366 StripAddGnuDebuglink bool
367 StripUseGnuStrip bool
368}
369
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700370type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800371 objFiles android.Paths
372 tidyFiles android.Paths
373 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800374 sAbiDumpFiles android.Paths
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800375 kytheFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700376}
377
378func (a Objects) Copy() Objects {
379 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800380 objFiles: append(android.Paths{}, a.objFiles...),
381 tidyFiles: append(android.Paths{}, a.tidyFiles...),
382 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800383 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800384 kytheFiles: append(android.Paths{}, a.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700385 }
386}
387
388func (a Objects) Append(b Objects) Objects {
389 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800390 objFiles: append(a.objFiles, b.objFiles...),
391 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
392 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800393 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800394 kytheFiles: append(a.kytheFiles, b.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700395 }
396}
397
Colin Cross3f40fa42015-01-30 17:27:36 -0800398// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700399func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800400 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700401
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700402 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700403 var tidyFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700404 if flags.tidy {
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700405 tidyFiles = make(android.Paths, 0, len(srcFiles))
406 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800407 var coverageFiles android.Paths
Oliver Nguyen04526782020-04-21 12:40:27 -0700408 if flags.gcovCoverage {
Dan Willemsen581341d2017-02-09 16:16:31 -0800409 coverageFiles = make(android.Paths, 0, len(srcFiles))
410 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800411 var kytheFiles android.Paths
412 if flags.emitXrefs {
413 kytheFiles = make(android.Paths, 0, len(srcFiles))
414 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800415
Colin Cross6d88dba2019-11-06 07:06:58 -0800416 // Produce fully expanded flags for use by C tools, C compiles, C++ tools, C++ compiles, and asm compiles
417 // respectively.
418 toolingCflags := flags.globalCommonFlags + " " +
419 flags.globalToolingCFlags + " " +
420 flags.globalConlyFlags + " " +
421 flags.localCommonFlags + " " +
422 flags.localToolingCFlags + " " +
423 flags.localConlyFlags + " " +
424 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700425
Colin Cross6d88dba2019-11-06 07:06:58 -0800426 cflags := flags.globalCommonFlags + " " +
427 flags.globalCFlags + " " +
428 flags.globalConlyFlags + " " +
429 flags.localCommonFlags + " " +
430 flags.localCFlags + " " +
431 flags.localConlyFlags + " " +
432 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700433
Colin Cross6d88dba2019-11-06 07:06:58 -0800434 toolingCppflags := flags.globalCommonFlags + " " +
435 flags.globalToolingCFlags + " " +
436 flags.globalToolingCppFlags + " " +
437 flags.localCommonFlags + " " +
438 flags.localToolingCFlags + " " +
439 flags.localToolingCppFlags + " " +
440 flags.systemIncludeFlags
Colin Crossc3199482017-03-30 15:03:04 -0700441
Colin Cross6d88dba2019-11-06 07:06:58 -0800442 cppflags := flags.globalCommonFlags + " " +
443 flags.globalCFlags + " " +
444 flags.globalCppFlags + " " +
445 flags.localCommonFlags + " " +
446 flags.localCFlags + " " +
447 flags.localCppFlags + " " +
448 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700449
Colin Cross6d88dba2019-11-06 07:06:58 -0800450 asflags := flags.globalCommonFlags + " " +
451 flags.globalAsFlags + " " +
452 flags.localCommonFlags + " " +
453 flags.localAsFlags + " " +
454 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700455
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800456 var sAbiDumpFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700457 if flags.sAbiDump {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800458 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
459 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800460
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700461 cflags += " ${config.NoOverrideClangGlobalCflags}"
462 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
463 cppflags += " ${config.NoOverrideClangGlobalCflags}"
464 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800465
Colin Cross3f40fa42015-01-30 17:27:36 -0800466 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700467 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800468
469 objFiles[i] = objFile
470
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700471 switch srcFile.Ext() {
472 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700473 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700474 Rule: yasm,
475 Description: "yasm " + srcFile.Rel(),
476 Output: objFile,
477 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800478 Implicits: cFlagsDeps,
479 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800480 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800481 "asFlags": flags.globalYasmFlags + " " + flags.localYasmFlags,
Colin Cross91e90042016-12-02 17:13:24 -0800482 },
483 })
484 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700485 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700486 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700487 Rule: windres,
488 Description: "windres " + srcFile.Rel(),
489 Output: objFile,
490 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800491 Implicits: cFlagsDeps,
492 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700493 Args: map[string]string{
494 "windresCmd": gccCmd(flags.toolchain, "windres"),
495 "flags": flags.toolchain.WindresFlags(),
496 },
497 })
498 continue
Pete Bentleyfcf55bf2019-08-16 20:14:32 +0100499 case ".o":
500 objFiles[i] = srcFile
501 continue
Colin Cross91e90042016-12-02 17:13:24 -0800502 }
503
Colin Cross6d88dba2019-11-06 07:06:58 -0800504 var moduleFlags string
505 var moduleToolingFlags string
506
Colin Cross3f40fa42015-01-30 17:27:36 -0800507 var ccCmd string
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700508 tidy := flags.tidy
Oliver Nguyen04526782020-04-21 12:40:27 -0700509 coverage := flags.gcovCoverage
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700510 dump := flags.sAbiDump
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800511 rule := cc
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800512 emitXref := flags.emitXrefs
Colin Cross3f40fa42015-01-30 17:27:36 -0800513
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700514 switch srcFile.Ext() {
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800515 case ".s":
Dan Willemsen98ab3112019-08-27 21:20:40 -0700516 if !flags.assemblerWithCpp {
517 rule = ccNoDeps
518 }
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800519 fallthrough
520 case ".S":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700521 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800522 moduleFlags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700523 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800524 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800525 dump = false
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800526 emitXref = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800527 case ".c":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700528 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800529 moduleFlags = cflags
530 moduleToolingFlags = toolingCflags
Colin Crossd34ab7c2019-06-27 14:46:10 -0700531 case ".cpp", ".cc", ".cxx", ".mm":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700532 ccCmd = "clang++"
Colin Cross6d88dba2019-11-06 07:06:58 -0800533 moduleFlags = cppflags
534 moduleToolingFlags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800535 default:
536 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
537 continue
538 }
539
Colin Cross67a5c132017-05-09 13:45:28 -0700540 ccDesc := ccCmd
541
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700542 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800543
Dan Willemsen581341d2017-02-09 16:16:31 -0800544 var implicitOutputs android.WritablePaths
545 if coverage {
546 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
547 implicitOutputs = append(implicitOutputs, gcnoFile)
548 coverageFiles = append(coverageFiles, gcnoFile)
549 }
550
Colin Crossae887032017-10-23 17:16:14 -0700551 ctx.Build(pctx, android.BuildParams{
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800552 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700553 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800554 Output: objFile,
555 ImplicitOutputs: implicitOutputs,
556 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800557 Implicits: cFlagsDeps,
558 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800559 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800560 "cFlags": moduleFlags,
Colin Cross28344522015-04-22 13:07:53 -0700561 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800562 },
563 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700564
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800565 if emitXref {
566 kytheFile := android.ObjPathWithExt(ctx, subdir, srcFile, "kzip")
567 ctx.Build(pctx, android.BuildParams{
568 Rule: kytheExtract,
569 Description: "Xref C++ extractor " + srcFile.Rel(),
570 Output: kytheFile,
571 Input: srcFile,
572 Implicits: cFlagsDeps,
573 OrderOnly: pathDeps,
574 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800575 "cFlags": moduleFlags,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800576 },
577 })
578 kytheFiles = append(kytheFiles, kytheFile)
579 }
580
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700581 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700582 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700583 tidyFiles = append(tidyFiles, tidyFile)
584
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700585 rule := clangTidy
Ramy Medhat16f23a42020-09-03 01:29:49 -0400586 if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_CLANG_TIDY") {
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700587 rule = clangTidyRE
588 }
589
Colin Crossae887032017-10-23 17:16:14 -0700590 ctx.Build(pctx, android.BuildParams{
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700591 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700592 Description: "clang-tidy " + srcFile.Rel(),
593 Output: tidyFile,
594 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700595 // We must depend on objFile, since clang-tidy doesn't
596 // support exporting dependencies.
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700597 Implicit: objFile,
598 Implicits: cFlagsDeps,
599 OrderOnly: pathDeps,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700600 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800601 "cFlags": moduleToolingFlags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700602 "tidyFlags": flags.tidyFlags,
603 },
604 })
605 }
606
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800607 if dump {
608 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
609 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
610
Ramy Medhat31ec9422020-04-17 15:03:58 -0400611 dumpRule := sAbiDump
Ramy Medhat16f23a42020-09-03 01:29:49 -0400612 if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_ABI_DUMPER") {
Ramy Medhat31ec9422020-04-17 15:03:58 -0400613 dumpRule = sAbiDumpRE
614 }
Colin Crossae887032017-10-23 17:16:14 -0700615 ctx.Build(pctx, android.BuildParams{
Ramy Medhat31ec9422020-04-17 15:03:58 -0400616 Rule: dumpRule,
Colin Cross67a5c132017-05-09 13:45:28 -0700617 Description: "header-abi-dumper " + srcFile.Rel(),
618 Output: sAbiDumpFile,
619 Input: srcFile,
620 Implicit: objFile,
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700621 Implicits: cFlagsDeps,
622 OrderOnly: pathDeps,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800623 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800624 "cFlags": moduleToolingFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800625 "exportDirs": flags.sAbiFlags,
626 },
627 })
628 }
629
Colin Cross3f40fa42015-01-30 17:27:36 -0800630 }
631
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700632 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800633 objFiles: objFiles,
634 tidyFiles: tidyFiles,
635 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800636 sAbiDumpFiles: sAbiDumpFiles,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800637 kytheFiles: kytheFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700638 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800639}
640
641// Generate a rule for compiling multiple .o files to a static library (.a)
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100642func TransformObjToStaticLib(ctx android.ModuleContext,
643 objFiles android.Paths, wholeStaticLibs android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700644 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800645
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800646 arCmd := "${config.ClangBin}/llvm-ar"
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100647 arFlags := ""
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800648 if !ctx.Darwin() {
649 arFlags += " -format=gnu"
650 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800651
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100652 if len(wholeStaticLibs) == 0 {
653 ctx.Build(pctx, android.BuildParams{
654 Rule: ar,
655 Description: "static link " + outputFile.Base(),
656 Output: outputFile,
657 Inputs: objFiles,
658 Implicits: deps,
659 Args: map[string]string{
660 "arFlags": "crsPD" + arFlags,
661 "arCmd": arCmd,
662 },
663 })
664
665 } else {
666 ctx.Build(pctx, android.BuildParams{
667 Rule: arWithLibs,
668 Description: "static link " + outputFile.Base(),
669 Output: outputFile,
670 Inputs: append(objFiles, wholeStaticLibs...),
671 Implicits: deps,
672 Args: map[string]string{
673 "arCmd": arCmd,
674 "arObjFlags": "crsPD" + arFlags,
675 "arObjs": strings.Join(objFiles.Strings(), " "),
676 "arLibFlags": "cqsL" + arFlags,
677 "arLibs": strings.Join(wholeStaticLibs.Strings(), " "),
678 },
679 })
680 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800681}
682
683// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700684// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700685func TransformObjToDynamicBinary(ctx android.ModuleContext,
686 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
Josh Gao75a50a22019-06-07 17:58:59 -0700687 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath, implicitOutputs android.WritablePaths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800688
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700689 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800690
Colin Cross3f40fa42015-01-30 17:27:36 -0800691 var libFlagsList []string
692
Colin Cross16b23492016-01-06 14:41:07 -0800693 if len(flags.libFlags) > 0 {
694 libFlagsList = append(libFlagsList, flags.libFlags)
695 }
696
Colin Cross3f40fa42015-01-30 17:27:36 -0800697 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800698 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700699 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700700 } else {
701 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700702 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700703 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
704 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800705 }
706
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,--start-group")
709 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700710 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800711 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800712 libFlagsList = append(libFlagsList, "-Wl,--end-group")
713 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800714
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,--start-group")
717 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700718 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700719 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700720 libFlagsList = append(libFlagsList, "-Wl,--end-group")
721 }
722
Colin Cross3f40fa42015-01-30 17:27:36 -0800723 for _, lib := range sharedLibs {
Josh Gao75a50a22019-06-07 17:58:59 -0700724 libFile := lib.String()
725 if ctx.Windows() {
726 libFile = pathtools.ReplaceExtension(libFile, "lib")
727 }
728 libFlagsList = append(libFlagsList, libFile)
Colin Cross3f40fa42015-01-30 17:27:36 -0800729 }
730
Colin Cross3f40fa42015-01-30 17:27:36 -0800731 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700732 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800733 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700734 if crtBegin.Valid() {
735 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800736 }
737
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400738 rule := ld
Kousik Kumar3fb61262020-04-22 13:31:09 -0700739 args := map[string]string{
740 "ldCmd": ldCmd,
741 "crtBegin": crtBegin.String(),
742 "libFlags": strings.Join(libFlagsList, " "),
743 "extraLibFlags": flags.extraLibFlags,
744 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
745 "crtEnd": crtEnd.String(),
746 }
Ramy Medhat16f23a42020-09-03 01:29:49 -0400747 if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400748 rule = ldRE
Kousik Kumar3fb61262020-04-22 13:31:09 -0700749 args["implicitOutputs"] = strings.Join(implicitOutputs.Strings(), ",")
Ramy Medhat6797edc2020-08-28 14:21:55 -0400750 args["implicitInputs"] = strings.Join(deps.Strings(), ",")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400751 }
752
Colin Crossae887032017-10-23 17:16:14 -0700753 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400754 Rule: rule,
Josh Gao75a50a22019-06-07 17:58:59 -0700755 Description: "link " + outputFile.Base(),
756 Output: outputFile,
757 ImplicitOutputs: implicitOutputs,
758 Inputs: objFiles,
759 Implicits: deps,
Kousik Kumar3fb61262020-04-22 13:31:09 -0700760 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800761 })
762}
763
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800764// Generate a rule to combine .dump sAbi dump files from multiple source files
765// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700766func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800767 baseName, exportedHeaderFlags string, symbolFile android.OptionalPath,
768 excludedSymbolVersions, excludedSymbolTags []string) android.OptionalPath {
769
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800770 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800771
772 implicits := android.Paths{soFile}
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800773 symbolFilterStr := "-so " + soFile.String()
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800774
775 if symbolFile.Valid() {
776 implicits = append(implicits, symbolFile.Path())
777 symbolFilterStr += " -v " + symbolFile.String()
778 }
779 for _, ver := range excludedSymbolVersions {
780 symbolFilterStr += " --exclude-symbol-version " + ver
781 }
782 for _, tag := range excludedSymbolTags {
783 symbolFilterStr += " --exclude-symbol-tag " + tag
784 }
Ramy Medhat808594c2020-05-07 06:56:47 -0400785 rule := sAbiLink
786 args := map[string]string{
787 "symbolFilter": symbolFilterStr,
788 "arch": ctx.Arch().ArchType.Name,
789 "exportedHeaderFlags": exportedHeaderFlags,
790 }
Ramy Medhat16f23a42020-09-03 01:29:49 -0400791 if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_ABI_LINKER") {
Ramy Medhat808594c2020-05-07 06:56:47 -0400792 rule = sAbiLinkRE
793 rbeImplicits := implicits.Strings()
794 for _, p := range strings.Split(exportedHeaderFlags, " ") {
795 if len(p) > 2 {
796 // Exclude the -I prefix.
797 rbeImplicits = append(rbeImplicits, p[2:])
798 }
799 }
Ramy Medhat6797edc2020-08-28 14:21:55 -0400800 args["implicitInputs"] = strings.Join(rbeImplicits, ",")
Ramy Medhat808594c2020-05-07 06:56:47 -0400801 }
Colin Crossae887032017-10-23 17:16:14 -0700802 ctx.Build(pctx, android.BuildParams{
Ramy Medhat808594c2020-05-07 06:56:47 -0400803 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700804 Description: "header-abi-linker " + outputFile.Base(),
805 Output: outputFile,
806 Inputs: sAbiDumps,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800807 Implicits: implicits,
Ramy Medhat808594c2020-05-07 06:56:47 -0400808 Args: args,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800809 })
810 return android.OptionalPathForPath(outputFile)
811}
812
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700813func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
814 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700815 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700816 Rule: unzipRefSAbiDump,
817 Description: "gunzip" + outputFile.Base(),
818 Output: outputFile,
819 Input: zippedRefDump,
820 })
821 return outputFile
822}
823
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800824func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chien2a65dda2019-10-01 15:58:07 -0700825 baseName, exportedHeaderFlags string, checkAllApis, isLlndk, isNdk, isVndkExt bool) android.OptionalPath {
Logan Chienf3511742017-10-31 18:04:35 +0800826
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800827 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700828 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Logan Chien6227fed2019-02-18 13:12:21 +0800829 createReferenceDumpFlags := ""
830
Logan Chien2a65dda2019-10-01 15:58:07 -0700831 var extraFlags []string
832 if checkAllApis {
833 extraFlags = append(extraFlags, "-check-all-apis")
834 } else {
835 extraFlags = append(extraFlags,
836 "-allow-unreferenced-changes",
837 "-allow-unreferenced-elf-symbol-changes")
Jayant Chowdharye4499502018-01-17 13:13:33 -0800838 }
Logan Chien2a65dda2019-10-01 15:58:07 -0700839
840 if exportedHeaderFlags == "" {
841 extraFlags = append(extraFlags, "-advice-only")
842 }
843
Logan Chien62f1f942019-02-18 15:40:42 +0800844 if isLlndk || isNdk {
Logan Chien6227fed2019-02-18 13:12:21 +0800845 createReferenceDumpFlags = "--llndk"
Logan Chien62f1f942019-02-18 15:40:42 +0800846 if isLlndk {
847 // TODO(b/130324828): "-consider-opaque-types-different" should apply to
848 // both LLNDK and NDK shared libs. However, a known issue in header-abi-diff
849 // breaks libaaudio. Remove the if-guard after the issue is fixed.
Logan Chien2a65dda2019-10-01 15:58:07 -0700850 extraFlags = append(extraFlags, "-consider-opaque-types-different")
Logan Chien62f1f942019-02-18 15:40:42 +0800851 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700852 }
Logan Chienf3511742017-10-31 18:04:35 +0800853 if isVndkExt {
Logan Chien2a65dda2019-10-01 15:58:07 -0700854 extraFlags = append(extraFlags, "-allow-extensions")
Logan Chienf3511742017-10-31 18:04:35 +0800855 }
856
Colin Crossae887032017-10-23 17:16:14 -0700857 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700858 Rule: sAbiDiff,
859 Description: "header-abi-diff " + outputFile.Base(),
860 Output: outputFile,
861 Input: inputDump,
862 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800863 Args: map[string]string{
Logan Chien6227fed2019-02-18 13:12:21 +0800864 "referenceDump": referenceDump.String(),
865 "libName": libName,
866 "arch": ctx.Arch().ArchType.Name,
Logan Chien2a65dda2019-10-01 15:58:07 -0700867 "extraFlags": strings.Join(extraFlags, " "),
Logan Chien6227fed2019-02-18 13:12:21 +0800868 "createReferenceDumpFlags": createReferenceDumpFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800869 },
870 })
871 return android.OptionalPathForPath(outputFile)
872}
873
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700874// Generate a rule for extracting a table of contents from a shared library (.so)
875func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700876 outputFile android.WritablePath, flags builderFlags) {
877
Colin Crossb496cfd2018-09-10 16:50:05 -0700878 var format string
879 var crossCompile string
880 if ctx.Darwin() {
881 format = "--macho"
882 crossCompile = "${config.MacToolPath}"
883 } else if ctx.Windows() {
884 format = "--pe"
885 crossCompile = gccCmd(flags.toolchain, "")
886 } else {
887 format = "--elf"
888 crossCompile = gccCmd(flags.toolchain, "")
889 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700890
Colin Crossae887032017-10-23 17:16:14 -0700891 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700892 Rule: toc,
893 Description: "generate toc " + inputFile.Base(),
894 Output: outputFile,
895 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700896 Args: map[string]string{
897 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700898 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700899 },
900 })
901}
902
Colin Cross3f40fa42015-01-30 17:27:36 -0800903// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700904func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700905 flags builderFlags, outputFile android.WritablePath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800906
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700907 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800908
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400909 rule := partialLd
910 args := map[string]string{
911 "ldCmd": ldCmd,
912 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
913 }
Ramy Medhat16f23a42020-09-03 01:29:49 -0400914 if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400915 rule = partialLdRE
916 args["inCommaList"] = strings.Join(objFiles.Strings(), ",")
Ramy Medhat6797edc2020-08-28 14:21:55 -0400917 args["implicitInputs"] = strings.Join(deps.Strings(), ",")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400918 }
Colin Crossae887032017-10-23 17:16:14 -0700919 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400920 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700921 Description: "link " + outputFile.Base(),
922 Output: outputFile,
923 Inputs: objFiles,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700924 Implicits: deps,
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400925 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800926 })
927}
928
Colin Crossbfae8852015-03-26 14:44:11 -0700929// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700930func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
931 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700932
933 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
934
Colin Crossae887032017-10-23 17:16:14 -0700935 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700936 Rule: prefixSymbols,
937 Description: "prefix symbols " + outputFile.Base(),
938 Output: outputFile,
939 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700940 Args: map[string]string{
941 "objcopyCmd": objcopyCmd,
942 "prefix": prefix,
943 },
944 })
945}
946
Colin Cross635c3b02016-05-18 15:37:25 -0700947func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200948 outputFile android.WritablePath, flags StripFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700949
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200950 crossCompile := gccCmd(flags.Toolchain, "")
Colin Cross665dce92016-04-28 14:50:03 -0700951 args := ""
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200952 if flags.StripAddGnuDebuglink {
Colin Cross665dce92016-04-28 14:50:03 -0700953 args += " --add-gnu-debuglink"
954 }
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200955 if flags.StripKeepMiniDebugInfo {
Colin Cross665dce92016-04-28 14:50:03 -0700956 args += " --keep-mini-debug-info"
957 }
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200958 if flags.StripKeepSymbols {
Colin Cross665dce92016-04-28 14:50:03 -0700959 args += " --keep-symbols"
960 }
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200961 if flags.StripKeepSymbolsList != "" {
962 args += " -k" + flags.StripKeepSymbolsList
Yi Kongacee27c2019-03-29 20:05:14 -0700963 }
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200964 if flags.StripKeepSymbolsAndDebugFrame {
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700965 args += " --keep-symbols-and-debug-frame"
966 }
Thiébaud Weksteend4587452020-08-19 14:53:01 +0200967 if flags.StripUseGnuStrip {
Yi Kongb5c34d72018-11-07 16:28:49 -0800968 args += " --use-gnu-strip"
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700969 }
Colin Cross665dce92016-04-28 14:50:03 -0700970
Colin Crossae887032017-10-23 17:16:14 -0700971 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700972 Rule: strip,
973 Description: "strip " + outputFile.Base(),
974 Output: outputFile,
975 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700976 Args: map[string]string{
977 "crossCompile": crossCompile,
978 "args": args,
979 },
980 })
981}
982
Colin Cross635c3b02016-05-18 15:37:25 -0700983func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
984 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700985
Colin Crossae887032017-10-23 17:16:14 -0700986 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700987 Rule: darwinStrip,
988 Description: "strip " + outputFile.Base(),
989 Output: outputFile,
990 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700991 })
992}
993
Oliver Nguyenc7434142019-04-24 14:22:25 -0700994func TransformCoverageFilesToZip(ctx android.ModuleContext,
995 inputs Objects, baseName string) android.OptionalPath {
Dan Willemsen581341d2017-02-09 16:16:31 -0800996
997 if len(inputs.coverageFiles) > 0 {
Oliver Nguyenc7434142019-04-24 14:22:25 -0700998 outputFile := android.PathForModuleOut(ctx, baseName+".zip")
Dan Willemsen581341d2017-02-09 16:16:31 -0800999
Oliver Nguyenc7434142019-04-24 14:22:25 -07001000 ctx.Build(pctx, android.BuildParams{
1001 Rule: zip,
1002 Description: "zip " + outputFile.Base(),
1003 Inputs: inputs.coverageFiles,
1004 Output: outputFile,
1005 })
Dan Willemsen581341d2017-02-09 16:16:31 -08001006
1007 return android.OptionalPathForPath(outputFile)
1008 }
1009
1010 return android.OptionalPath{}
1011}
1012
Yi Kongc49c3932019-10-15 02:01:19 -07001013func TransformArchiveRepack(ctx android.ModuleContext, inputFile android.Path,
1014 outputFile android.WritablePath, objects []string) {
1015
1016 ctx.Build(pctx, android.BuildParams{
1017 Rule: archiveRepack,
1018 Description: "Repack archive " + outputFile.Base(),
1019 Output: outputFile,
1020 Input: inputFile,
1021 Args: map[string]string{
1022 "objects": strings.Join(objects, " "),
1023 },
1024 })
1025}
1026
Colin Crossb98c8b02016-07-29 13:44:28 -07001027func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -08001028 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
1029}
Colin Cross0af4b842015-04-30 16:36:18 -07001030
Colin Cross5b529592017-05-09 13:34:34 -07001031func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -07001032 var i int
1033
1034 start := 0
1035 bytes := 0
1036 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -07001037 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -07001038 if l > limit {
1039 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
1040 }
1041 if bytes+l > limit {
1042 lists = append(lists, list[start:i])
1043 start = i
1044 bytes = 0
1045 }
1046 bytes += l + 1 // count a space between each list element
1047 }
1048
1049 lists = append(lists, list[start:])
1050
1051 totalLen := 0
1052 for _, l := range lists {
1053 totalLen += len(l)
1054 }
1055 if totalLen != len(list) {
1056 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
1057 }
1058 return lists, nil
1059}