blob: 2bbf47ab978492e64a77b064b0d881c659c2d1d6 [file] [log] [blame]
Colin Cross3f40fa42015-01-30 17:27:36 -08001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package cc
16
17// This file generates the final rules for compiling all C/C++. All properties related to
18// compiling should have been translated into builderFlags or another argument to the Transform*
19// functions.
20
21import (
Colin Cross0af4b842015-04-30 16:36:18 -070022 "fmt"
Colin Crossb98c8b02016-07-29 13:44:28 -070023 "path/filepath"
Colin Cross0af4b842015-04-30 16:36:18 -070024 "runtime"
Colin Cross3f40fa42015-01-30 17:27:36 -080025 "strings"
Colin Crossed4cf0b2015-03-26 14:43:45 -070026
27 "github.com/google/blueprint"
Josh Gao75a50a22019-06-07 17:58:59 -070028 "github.com/google/blueprint/pathtools"
Colin Crossb98c8b02016-07-29 13:44:28 -070029
30 "android/soong/android"
31 "android/soong/cc/config"
Ramy Medhat9a90fe52020-04-13 13:21:23 -040032 "android/soong/remoteexec"
Colin Cross3f40fa42015-01-30 17:27:36 -080033)
34
35const (
Dan Albertc3144b12015-04-28 18:17:56 -070036 objectExtension = ".o"
Colin Cross3f40fa42015-01-30 17:27:36 -080037 staticLibraryExtension = ".a"
38)
39
40var (
Colin Cross635c3b02016-05-18 15:37:25 -070041 pctx = android.NewPackageContext("android/soong/cc")
Colin Cross3f40fa42015-01-30 17:27:36 -080042
Ramy Medhat8ea054a2020-01-27 14:19:44 -050043 cc = pctx.AndroidRemoteStaticRule("cc", android.RemoteRuleSupports{Goma: true, RBE: true},
Colin Cross3f40fa42015-01-30 17:27:36 -080044 blueprint.RuleParams{
45 Depfile: "${out}.d",
46 Deps: blueprint.DepsGCC,
Alistair Strachan777475c2016-08-26 12:55:49 -070047 Command: "$relPwd ${config.CcWrapper}$ccCmd -c $cFlags -MD -MF ${out}.d -o $out $in",
Dan Willemsenc94a7682015-11-17 15:27:28 -080048 CommandDeps: []string{"$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080049 },
Dan Willemsen322a0a62015-11-17 15:19:46 -080050 "ccCmd", "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080051
Kousik Kumar2976bfd2020-02-17 00:26:55 -080052 ccNoDeps = pctx.AndroidStaticRule("ccNoDeps",
Dan Willemsenfcabb1c2019-01-03 23:25:11 -080053 blueprint.RuleParams{
Kousik Kumar2976bfd2020-02-17 00:26:55 -080054 Command: "$relPwd $ccCmd -c $cFlags -o $out $in",
Dan Willemsenfcabb1c2019-01-03 23:25:11 -080055 CommandDeps: []string{"$ccCmd"},
56 },
57 "ccCmd", "cFlags")
58
Ramy Medhat9a90fe52020-04-13 13:21:23 -040059 ld, ldRE = remoteexec.StaticRules(pctx, "ld",
Colin Cross3f40fa42015-01-30 17:27:36 -080060 blueprint.RuleParams{
Ramy Medhat31ec9422020-04-17 15:03:58 -040061 Command: "$reTemplate$ldCmd ${crtBegin} @${out}.rsp " +
Pete Bentley99f2fc22019-08-02 14:02:20 +010062 "${libFlags} ${crtEnd} -o ${out} ${ldFlags} ${extraLibFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080063 CommandDeps: []string{"$ldCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070064 Rspfile: "${out}.rsp",
65 RspfileContent: "${in}",
Colin Cross36ae1352019-03-29 15:55:30 -070066 // clang -Wl,--out-implib doesn't update its output file if it hasn't changed.
67 Restat: true,
Colin Cross3f40fa42015-01-30 17:27:36 -080068 },
Ramy Medhat31ec9422020-04-17 15:03:58 -040069 &remoteexec.REParams{
70 Labels: map[string]string{"type": "link", "tool": "clang"},
Ramy Medhat9a90fe52020-04-13 13:21:23 -040071 ExecStrategy: "${config.RECXXLinksExecStrategy}",
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{
223 remoteexec.PoolKey: "${config.RECXXPool}",
224 "InputRootAbsolutePath": android.AbsSrcDirForExistingUseCases(),
225 },
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
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700353 stripKeepSymbols bool
354 stripKeepSymbolsList string
355 stripKeepSymbolsAndDebugFrame bool
356 stripKeepMiniDebugInfo bool
357 stripAddGnuDebuglink bool
358 stripUseGnuStrip bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800359
Colin Cross19878da2019-03-28 14:45:07 -0700360 proto android.ProtoFlags
Dan Willemsen60e62f02018-11-16 21:05:32 -0800361 protoC bool
362 protoOptionsFile bool
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700363
364 yacc *YaccProperties
Colin Cross3f40fa42015-01-30 17:27:36 -0800365}
366
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700367type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800368 objFiles android.Paths
369 tidyFiles android.Paths
370 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800371 sAbiDumpFiles android.Paths
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800372 kytheFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700373}
374
375func (a Objects) Copy() Objects {
376 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800377 objFiles: append(android.Paths{}, a.objFiles...),
378 tidyFiles: append(android.Paths{}, a.tidyFiles...),
379 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800380 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800381 kytheFiles: append(android.Paths{}, a.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700382 }
383}
384
385func (a Objects) Append(b Objects) Objects {
386 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800387 objFiles: append(a.objFiles, b.objFiles...),
388 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
389 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800390 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800391 kytheFiles: append(a.kytheFiles, b.kytheFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700392 }
393}
394
Colin Cross3f40fa42015-01-30 17:27:36 -0800395// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700396func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800397 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700398
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700399 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700400 var tidyFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700401 if flags.tidy {
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700402 tidyFiles = make(android.Paths, 0, len(srcFiles))
403 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800404 var coverageFiles android.Paths
Oliver Nguyen04526782020-04-21 12:40:27 -0700405 if flags.gcovCoverage {
Dan Willemsen581341d2017-02-09 16:16:31 -0800406 coverageFiles = make(android.Paths, 0, len(srcFiles))
407 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800408 var kytheFiles android.Paths
409 if flags.emitXrefs {
410 kytheFiles = make(android.Paths, 0, len(srcFiles))
411 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800412
Colin Cross6d88dba2019-11-06 07:06:58 -0800413 // Produce fully expanded flags for use by C tools, C compiles, C++ tools, C++ compiles, and asm compiles
414 // respectively.
415 toolingCflags := flags.globalCommonFlags + " " +
416 flags.globalToolingCFlags + " " +
417 flags.globalConlyFlags + " " +
418 flags.localCommonFlags + " " +
419 flags.localToolingCFlags + " " +
420 flags.localConlyFlags + " " +
421 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700422
Colin Cross6d88dba2019-11-06 07:06:58 -0800423 cflags := flags.globalCommonFlags + " " +
424 flags.globalCFlags + " " +
425 flags.globalConlyFlags + " " +
426 flags.localCommonFlags + " " +
427 flags.localCFlags + " " +
428 flags.localConlyFlags + " " +
429 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700430
Colin Cross6d88dba2019-11-06 07:06:58 -0800431 toolingCppflags := flags.globalCommonFlags + " " +
432 flags.globalToolingCFlags + " " +
433 flags.globalToolingCppFlags + " " +
434 flags.localCommonFlags + " " +
435 flags.localToolingCFlags + " " +
436 flags.localToolingCppFlags + " " +
437 flags.systemIncludeFlags
Colin Crossc3199482017-03-30 15:03:04 -0700438
Colin Cross6d88dba2019-11-06 07:06:58 -0800439 cppflags := flags.globalCommonFlags + " " +
440 flags.globalCFlags + " " +
441 flags.globalCppFlags + " " +
442 flags.localCommonFlags + " " +
443 flags.localCFlags + " " +
444 flags.localCppFlags + " " +
445 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700446
Colin Cross6d88dba2019-11-06 07:06:58 -0800447 asflags := flags.globalCommonFlags + " " +
448 flags.globalAsFlags + " " +
449 flags.localCommonFlags + " " +
450 flags.localAsFlags + " " +
451 flags.systemIncludeFlags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700452
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800453 var sAbiDumpFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700454 if flags.sAbiDump {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800455 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
456 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800457
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700458 cflags += " ${config.NoOverrideClangGlobalCflags}"
459 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
460 cppflags += " ${config.NoOverrideClangGlobalCflags}"
461 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800462
Colin Cross3f40fa42015-01-30 17:27:36 -0800463 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700464 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800465
466 objFiles[i] = objFile
467
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700468 switch srcFile.Ext() {
469 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700470 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700471 Rule: yasm,
472 Description: "yasm " + srcFile.Rel(),
473 Output: objFile,
474 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800475 Implicits: cFlagsDeps,
476 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800477 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800478 "asFlags": flags.globalYasmFlags + " " + flags.localYasmFlags,
Colin Cross91e90042016-12-02 17:13:24 -0800479 },
480 })
481 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700482 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700483 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700484 Rule: windres,
485 Description: "windres " + srcFile.Rel(),
486 Output: objFile,
487 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800488 Implicits: cFlagsDeps,
489 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700490 Args: map[string]string{
491 "windresCmd": gccCmd(flags.toolchain, "windres"),
492 "flags": flags.toolchain.WindresFlags(),
493 },
494 })
495 continue
Pete Bentleyfcf55bf2019-08-16 20:14:32 +0100496 case ".o":
497 objFiles[i] = srcFile
498 continue
Colin Cross91e90042016-12-02 17:13:24 -0800499 }
500
Colin Cross6d88dba2019-11-06 07:06:58 -0800501 var moduleFlags string
502 var moduleToolingFlags string
503
Colin Cross3f40fa42015-01-30 17:27:36 -0800504 var ccCmd string
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700505 tidy := flags.tidy
Oliver Nguyen04526782020-04-21 12:40:27 -0700506 coverage := flags.gcovCoverage
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700507 dump := flags.sAbiDump
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800508 rule := cc
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800509 emitXref := flags.emitXrefs
Colin Cross3f40fa42015-01-30 17:27:36 -0800510
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700511 switch srcFile.Ext() {
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800512 case ".s":
Dan Willemsen98ab3112019-08-27 21:20:40 -0700513 if !flags.assemblerWithCpp {
514 rule = ccNoDeps
515 }
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800516 fallthrough
517 case ".S":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700518 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800519 moduleFlags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700520 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800521 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800522 dump = false
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800523 emitXref = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800524 case ".c":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700525 ccCmd = "clang"
Colin Cross6d88dba2019-11-06 07:06:58 -0800526 moduleFlags = cflags
527 moduleToolingFlags = toolingCflags
Colin Crossd34ab7c2019-06-27 14:46:10 -0700528 case ".cpp", ".cc", ".cxx", ".mm":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700529 ccCmd = "clang++"
Colin Cross6d88dba2019-11-06 07:06:58 -0800530 moduleFlags = cppflags
531 moduleToolingFlags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800532 default:
533 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
534 continue
535 }
536
Colin Cross67a5c132017-05-09 13:45:28 -0700537 ccDesc := ccCmd
538
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700539 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800540
Dan Willemsen581341d2017-02-09 16:16:31 -0800541 var implicitOutputs android.WritablePaths
542 if coverage {
543 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
544 implicitOutputs = append(implicitOutputs, gcnoFile)
545 coverageFiles = append(coverageFiles, gcnoFile)
546 }
547
Colin Crossae887032017-10-23 17:16:14 -0700548 ctx.Build(pctx, android.BuildParams{
Dan Willemsenfcabb1c2019-01-03 23:25:11 -0800549 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700550 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800551 Output: objFile,
552 ImplicitOutputs: implicitOutputs,
553 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800554 Implicits: cFlagsDeps,
555 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800556 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800557 "cFlags": moduleFlags,
Colin Cross28344522015-04-22 13:07:53 -0700558 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800559 },
560 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700561
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800562 if emitXref {
563 kytheFile := android.ObjPathWithExt(ctx, subdir, srcFile, "kzip")
564 ctx.Build(pctx, android.BuildParams{
565 Rule: kytheExtract,
566 Description: "Xref C++ extractor " + srcFile.Rel(),
567 Output: kytheFile,
568 Input: srcFile,
569 Implicits: cFlagsDeps,
570 OrderOnly: pathDeps,
571 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800572 "cFlags": moduleFlags,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800573 },
574 })
575 kytheFiles = append(kytheFiles, kytheFile)
576 }
577
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700578 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700579 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700580 tidyFiles = append(tidyFiles, tidyFile)
581
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700582 rule := clangTidy
583 if ctx.Config().IsEnvTrue("RBE_CLANG_TIDY") {
584 rule = clangTidyRE
585 }
586
Colin Crossae887032017-10-23 17:16:14 -0700587 ctx.Build(pctx, android.BuildParams{
Kousik Kumar4e30bba2020-06-18 09:17:51 -0700588 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700589 Description: "clang-tidy " + srcFile.Rel(),
590 Output: tidyFile,
591 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700592 // We must depend on objFile, since clang-tidy doesn't
593 // support exporting dependencies.
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700594 Implicit: objFile,
595 Implicits: cFlagsDeps,
596 OrderOnly: pathDeps,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700597 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800598 "cFlags": moduleToolingFlags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700599 "tidyFlags": flags.tidyFlags,
600 },
601 })
602 }
603
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800604 if dump {
605 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
606 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
607
Ramy Medhat31ec9422020-04-17 15:03:58 -0400608 dumpRule := sAbiDump
609 if ctx.Config().IsEnvTrue("RBE_ABI_DUMPER") {
610 dumpRule = sAbiDumpRE
611 }
Colin Crossae887032017-10-23 17:16:14 -0700612 ctx.Build(pctx, android.BuildParams{
Ramy Medhat31ec9422020-04-17 15:03:58 -0400613 Rule: dumpRule,
Colin Cross67a5c132017-05-09 13:45:28 -0700614 Description: "header-abi-dumper " + srcFile.Rel(),
615 Output: sAbiDumpFile,
616 Input: srcFile,
617 Implicit: objFile,
Dan Willemsen6b4419c2019-08-09 12:45:53 -0700618 Implicits: cFlagsDeps,
619 OrderOnly: pathDeps,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800620 Args: map[string]string{
Colin Cross6d88dba2019-11-06 07:06:58 -0800621 "cFlags": moduleToolingFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800622 "exportDirs": flags.sAbiFlags,
623 },
624 })
625 }
626
Colin Cross3f40fa42015-01-30 17:27:36 -0800627 }
628
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700629 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800630 objFiles: objFiles,
631 tidyFiles: tidyFiles,
632 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800633 sAbiDumpFiles: sAbiDumpFiles,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800634 kytheFiles: kytheFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700635 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800636}
637
638// Generate a rule for compiling multiple .o files to a static library (.a)
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100639func TransformObjToStaticLib(ctx android.ModuleContext,
640 objFiles android.Paths, wholeStaticLibs android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700641 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800642
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800643 arCmd := "${config.ClangBin}/llvm-ar"
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100644 arFlags := ""
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800645 if !ctx.Darwin() {
646 arFlags += " -format=gnu"
647 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800648
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100649 if len(wholeStaticLibs) == 0 {
650 ctx.Build(pctx, android.BuildParams{
651 Rule: ar,
652 Description: "static link " + outputFile.Base(),
653 Output: outputFile,
654 Inputs: objFiles,
655 Implicits: deps,
656 Args: map[string]string{
657 "arFlags": "crsPD" + arFlags,
658 "arCmd": arCmd,
659 },
660 })
661
662 } else {
663 ctx.Build(pctx, android.BuildParams{
664 Rule: arWithLibs,
665 Description: "static link " + outputFile.Base(),
666 Output: outputFile,
667 Inputs: append(objFiles, wholeStaticLibs...),
668 Implicits: deps,
669 Args: map[string]string{
670 "arCmd": arCmd,
671 "arObjFlags": "crsPD" + arFlags,
672 "arObjs": strings.Join(objFiles.Strings(), " "),
673 "arLibFlags": "cqsL" + arFlags,
674 "arLibs": strings.Join(wholeStaticLibs.Strings(), " "),
675 },
676 })
677 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800678}
679
680// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700681// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700682func TransformObjToDynamicBinary(ctx android.ModuleContext,
683 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
Josh Gao75a50a22019-06-07 17:58:59 -0700684 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath, implicitOutputs android.WritablePaths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800685
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700686 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800687
Colin Cross3f40fa42015-01-30 17:27:36 -0800688 var libFlagsList []string
689
Colin Cross16b23492016-01-06 14:41:07 -0800690 if len(flags.libFlags) > 0 {
691 libFlagsList = append(libFlagsList, flags.libFlags)
692 }
693
Colin Cross3f40fa42015-01-30 17:27:36 -0800694 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800695 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700696 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700697 } else {
698 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700699 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700700 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
701 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800702 }
703
Colin Cross7a7cf972016-12-05 18:47:39 -0800704 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800705 libFlagsList = append(libFlagsList, "-Wl,--start-group")
706 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700707 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
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,--end-group")
710 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800711
Stephen Hines10347862016-07-18 15:54:54 -0700712 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700713 libFlagsList = append(libFlagsList, "-Wl,--start-group")
714 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700715 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
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,--end-group")
718 }
719
Colin Cross3f40fa42015-01-30 17:27:36 -0800720 for _, lib := range sharedLibs {
Josh Gao75a50a22019-06-07 17:58:59 -0700721 libFile := lib.String()
722 if ctx.Windows() {
723 libFile = pathtools.ReplaceExtension(libFile, "lib")
724 }
725 libFlagsList = append(libFlagsList, libFile)
Colin Cross3f40fa42015-01-30 17:27:36 -0800726 }
727
Colin Cross3f40fa42015-01-30 17:27:36 -0800728 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700729 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800730 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700731 if crtBegin.Valid() {
732 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800733 }
734
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400735 rule := ld
Kousik Kumar3fb61262020-04-22 13:31:09 -0700736 args := map[string]string{
737 "ldCmd": ldCmd,
738 "crtBegin": crtBegin.String(),
739 "libFlags": strings.Join(libFlagsList, " "),
740 "extraLibFlags": flags.extraLibFlags,
741 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
742 "crtEnd": crtEnd.String(),
743 }
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400744 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
745 rule = ldRE
Kousik Kumar3fb61262020-04-22 13:31:09 -0700746 args["implicitOutputs"] = strings.Join(implicitOutputs.Strings(), ",")
Ramy Medhat6797edc2020-08-28 14:21:55 -0400747 args["implicitInputs"] = strings.Join(deps.Strings(), ",")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400748 }
749
Colin Crossae887032017-10-23 17:16:14 -0700750 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400751 Rule: rule,
Josh Gao75a50a22019-06-07 17:58:59 -0700752 Description: "link " + outputFile.Base(),
753 Output: outputFile,
754 ImplicitOutputs: implicitOutputs,
755 Inputs: objFiles,
756 Implicits: deps,
Kousik Kumar3fb61262020-04-22 13:31:09 -0700757 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800758 })
759}
760
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800761// Generate a rule to combine .dump sAbi dump files from multiple source files
762// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700763func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800764 baseName, exportedHeaderFlags string, symbolFile android.OptionalPath,
765 excludedSymbolVersions, excludedSymbolTags []string) android.OptionalPath {
766
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800767 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800768
769 implicits := android.Paths{soFile}
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800770 symbolFilterStr := "-so " + soFile.String()
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800771
772 if symbolFile.Valid() {
773 implicits = append(implicits, symbolFile.Path())
774 symbolFilterStr += " -v " + symbolFile.String()
775 }
776 for _, ver := range excludedSymbolVersions {
777 symbolFilterStr += " --exclude-symbol-version " + ver
778 }
779 for _, tag := range excludedSymbolTags {
780 symbolFilterStr += " --exclude-symbol-tag " + tag
781 }
Ramy Medhat808594c2020-05-07 06:56:47 -0400782 rule := sAbiLink
783 args := map[string]string{
784 "symbolFilter": symbolFilterStr,
785 "arch": ctx.Arch().ArchType.Name,
786 "exportedHeaderFlags": exportedHeaderFlags,
787 }
788 if ctx.Config().IsEnvTrue("RBE_ABI_LINKER") {
789 rule = sAbiLinkRE
790 rbeImplicits := implicits.Strings()
791 for _, p := range strings.Split(exportedHeaderFlags, " ") {
792 if len(p) > 2 {
793 // Exclude the -I prefix.
794 rbeImplicits = append(rbeImplicits, p[2:])
795 }
796 }
Ramy Medhat6797edc2020-08-28 14:21:55 -0400797 args["implicitInputs"] = strings.Join(rbeImplicits, ",")
Ramy Medhat808594c2020-05-07 06:56:47 -0400798 }
Colin Crossae887032017-10-23 17:16:14 -0700799 ctx.Build(pctx, android.BuildParams{
Ramy Medhat808594c2020-05-07 06:56:47 -0400800 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700801 Description: "header-abi-linker " + outputFile.Base(),
802 Output: outputFile,
803 Inputs: sAbiDumps,
Logan Chiene3d7a0d2019-01-17 00:18:02 +0800804 Implicits: implicits,
Ramy Medhat808594c2020-05-07 06:56:47 -0400805 Args: args,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800806 })
807 return android.OptionalPathForPath(outputFile)
808}
809
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700810func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
811 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700812 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700813 Rule: unzipRefSAbiDump,
814 Description: "gunzip" + outputFile.Base(),
815 Output: outputFile,
816 Input: zippedRefDump,
817 })
818 return outputFile
819}
820
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800821func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chien2a65dda2019-10-01 15:58:07 -0700822 baseName, exportedHeaderFlags string, checkAllApis, isLlndk, isNdk, isVndkExt bool) android.OptionalPath {
Logan Chienf3511742017-10-31 18:04:35 +0800823
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800824 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700825 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Logan Chien6227fed2019-02-18 13:12:21 +0800826 createReferenceDumpFlags := ""
827
Logan Chien2a65dda2019-10-01 15:58:07 -0700828 var extraFlags []string
829 if checkAllApis {
830 extraFlags = append(extraFlags, "-check-all-apis")
831 } else {
832 extraFlags = append(extraFlags,
833 "-allow-unreferenced-changes",
834 "-allow-unreferenced-elf-symbol-changes")
Jayant Chowdharye4499502018-01-17 13:13:33 -0800835 }
Logan Chien2a65dda2019-10-01 15:58:07 -0700836
837 if exportedHeaderFlags == "" {
838 extraFlags = append(extraFlags, "-advice-only")
839 }
840
Logan Chien62f1f942019-02-18 15:40:42 +0800841 if isLlndk || isNdk {
Logan Chien6227fed2019-02-18 13:12:21 +0800842 createReferenceDumpFlags = "--llndk"
Logan Chien62f1f942019-02-18 15:40:42 +0800843 if isLlndk {
844 // TODO(b/130324828): "-consider-opaque-types-different" should apply to
845 // both LLNDK and NDK shared libs. However, a known issue in header-abi-diff
846 // breaks libaaudio. Remove the if-guard after the issue is fixed.
Logan Chien2a65dda2019-10-01 15:58:07 -0700847 extraFlags = append(extraFlags, "-consider-opaque-types-different")
Logan Chien62f1f942019-02-18 15:40:42 +0800848 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700849 }
Logan Chienf3511742017-10-31 18:04:35 +0800850 if isVndkExt {
Logan Chien2a65dda2019-10-01 15:58:07 -0700851 extraFlags = append(extraFlags, "-allow-extensions")
Logan Chienf3511742017-10-31 18:04:35 +0800852 }
853
Colin Crossae887032017-10-23 17:16:14 -0700854 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700855 Rule: sAbiDiff,
856 Description: "header-abi-diff " + outputFile.Base(),
857 Output: outputFile,
858 Input: inputDump,
859 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800860 Args: map[string]string{
Logan Chien6227fed2019-02-18 13:12:21 +0800861 "referenceDump": referenceDump.String(),
862 "libName": libName,
863 "arch": ctx.Arch().ArchType.Name,
Logan Chien2a65dda2019-10-01 15:58:07 -0700864 "extraFlags": strings.Join(extraFlags, " "),
Logan Chien6227fed2019-02-18 13:12:21 +0800865 "createReferenceDumpFlags": createReferenceDumpFlags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800866 },
867 })
868 return android.OptionalPathForPath(outputFile)
869}
870
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700871// Generate a rule for extracting a table of contents from a shared library (.so)
872func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700873 outputFile android.WritablePath, flags builderFlags) {
874
Colin Crossb496cfd2018-09-10 16:50:05 -0700875 var format string
876 var crossCompile string
877 if ctx.Darwin() {
878 format = "--macho"
879 crossCompile = "${config.MacToolPath}"
880 } else if ctx.Windows() {
881 format = "--pe"
882 crossCompile = gccCmd(flags.toolchain, "")
883 } else {
884 format = "--elf"
885 crossCompile = gccCmd(flags.toolchain, "")
886 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700887
Colin Crossae887032017-10-23 17:16:14 -0700888 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700889 Rule: toc,
890 Description: "generate toc " + inputFile.Base(),
891 Output: outputFile,
892 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700893 Args: map[string]string{
894 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700895 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700896 },
897 })
898}
899
Colin Cross3f40fa42015-01-30 17:27:36 -0800900// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700901func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700902 flags builderFlags, outputFile android.WritablePath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800903
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700904 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800905
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400906 rule := partialLd
907 args := map[string]string{
908 "ldCmd": ldCmd,
909 "ldFlags": flags.globalLdFlags + " " + flags.localLdFlags,
910 }
911 if ctx.Config().IsEnvTrue("RBE_CXX_LINKS") {
912 rule = partialLdRE
913 args["inCommaList"] = strings.Join(objFiles.Strings(), ",")
Ramy Medhat6797edc2020-08-28 14:21:55 -0400914 args["implicitInputs"] = strings.Join(deps.Strings(), ",")
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400915 }
Colin Crossae887032017-10-23 17:16:14 -0700916 ctx.Build(pctx, android.BuildParams{
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400917 Rule: rule,
Colin Cross67a5c132017-05-09 13:45:28 -0700918 Description: "link " + outputFile.Base(),
919 Output: outputFile,
920 Inputs: objFiles,
Dan Willemsen724ab5d2019-09-19 10:50:18 -0700921 Implicits: deps,
Ramy Medhat9a90fe52020-04-13 13:21:23 -0400922 Args: args,
Colin Cross3f40fa42015-01-30 17:27:36 -0800923 })
924}
925
Colin Crossbfae8852015-03-26 14:44:11 -0700926// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700927func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
928 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700929
930 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
931
Colin Crossae887032017-10-23 17:16:14 -0700932 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700933 Rule: prefixSymbols,
934 Description: "prefix symbols " + outputFile.Base(),
935 Output: outputFile,
936 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700937 Args: map[string]string{
938 "objcopyCmd": objcopyCmd,
939 "prefix": prefix,
940 },
941 })
942}
943
Colin Cross635c3b02016-05-18 15:37:25 -0700944func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
945 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700946
947 crossCompile := gccCmd(flags.toolchain, "")
948 args := ""
949 if flags.stripAddGnuDebuglink {
950 args += " --add-gnu-debuglink"
951 }
952 if flags.stripKeepMiniDebugInfo {
953 args += " --keep-mini-debug-info"
954 }
955 if flags.stripKeepSymbols {
956 args += " --keep-symbols"
957 }
Yi Kongacee27c2019-03-29 20:05:14 -0700958 if flags.stripKeepSymbolsList != "" {
959 args += " -k" + flags.stripKeepSymbolsList
960 }
Christopher Ferrisb43fe7a2019-05-17 16:39:54 -0700961 if flags.stripKeepSymbolsAndDebugFrame {
962 args += " --keep-symbols-and-debug-frame"
963 }
Yi Kongb5c34d72018-11-07 16:28:49 -0800964 if flags.stripUseGnuStrip {
965 args += " --use-gnu-strip"
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700966 }
Colin Cross665dce92016-04-28 14:50:03 -0700967
Colin Crossae887032017-10-23 17:16:14 -0700968 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700969 Rule: strip,
970 Description: "strip " + outputFile.Base(),
971 Output: outputFile,
972 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700973 Args: map[string]string{
974 "crossCompile": crossCompile,
975 "args": args,
976 },
977 })
978}
979
Colin Cross635c3b02016-05-18 15:37:25 -0700980func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
981 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700982
Colin Crossae887032017-10-23 17:16:14 -0700983 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700984 Rule: darwinStrip,
985 Description: "strip " + outputFile.Base(),
986 Output: outputFile,
987 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700988 })
989}
990
Oliver Nguyenc7434142019-04-24 14:22:25 -0700991func TransformCoverageFilesToZip(ctx android.ModuleContext,
992 inputs Objects, baseName string) android.OptionalPath {
Dan Willemsen581341d2017-02-09 16:16:31 -0800993
994 if len(inputs.coverageFiles) > 0 {
Oliver Nguyenc7434142019-04-24 14:22:25 -0700995 outputFile := android.PathForModuleOut(ctx, baseName+".zip")
Dan Willemsen581341d2017-02-09 16:16:31 -0800996
Oliver Nguyenc7434142019-04-24 14:22:25 -0700997 ctx.Build(pctx, android.BuildParams{
998 Rule: zip,
999 Description: "zip " + outputFile.Base(),
1000 Inputs: inputs.coverageFiles,
1001 Output: outputFile,
1002 })
Dan Willemsen581341d2017-02-09 16:16:31 -08001003
1004 return android.OptionalPathForPath(outputFile)
1005 }
1006
1007 return android.OptionalPath{}
1008}
1009
Yi Kongc49c3932019-10-15 02:01:19 -07001010func TransformArchiveRepack(ctx android.ModuleContext, inputFile android.Path,
1011 outputFile android.WritablePath, objects []string) {
1012
1013 ctx.Build(pctx, android.BuildParams{
1014 Rule: archiveRepack,
1015 Description: "Repack archive " + outputFile.Base(),
1016 Output: outputFile,
1017 Input: inputFile,
1018 Args: map[string]string{
1019 "objects": strings.Join(objects, " "),
1020 },
1021 })
1022}
1023
Colin Crossb98c8b02016-07-29 13:44:28 -07001024func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -08001025 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
1026}
Colin Cross0af4b842015-04-30 16:36:18 -07001027
Colin Cross5b529592017-05-09 13:34:34 -07001028func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -07001029 var i int
1030
1031 start := 0
1032 bytes := 0
1033 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -07001034 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -07001035 if l > limit {
1036 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
1037 }
1038 if bytes+l > limit {
1039 lists = append(lists, list[start:i])
1040 start = i
1041 bytes = 0
1042 }
1043 bytes += l + 1 // count a space between each list element
1044 }
1045
1046 lists = append(lists, list[start:])
1047
1048 totalLen := 0
1049 for _, l := range lists {
1050 totalLen += len(l)
1051 }
1052 if totalLen != len(list) {
1053 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
1054 }
1055 return lists, nil
1056}