blob: 5a77d3e1ef2f6dc3397a5c0672329930b842606e [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"
25 "strconv"
Colin Cross3f40fa42015-01-30 17:27:36 -080026 "strings"
Colin Crossed4cf0b2015-03-26 14:43:45 -070027
28 "github.com/google/blueprint"
Colin Crossb98c8b02016-07-29 13:44:28 -070029
30 "android/soong/android"
31 "android/soong/cc/config"
Colin Cross3f40fa42015-01-30 17:27:36 -080032)
33
34const (
Dan Albertc3144b12015-04-28 18:17:56 -070035 objectExtension = ".o"
Colin Cross3f40fa42015-01-30 17:27:36 -080036 staticLibraryExtension = ".a"
37)
38
39var (
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -070040 abiCheckAllowFlags = []string{
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -070041 "-allow-unreferenced-changes",
42 "-allow-unreferenced-elf-symbol-changes",
43 }
44)
45
46var (
Colin Cross635c3b02016-05-18 15:37:25 -070047 pctx = android.NewPackageContext("android/soong/cc")
Colin Cross3f40fa42015-01-30 17:27:36 -080048
Colin Cross9d45bb72016-08-29 16:14:13 -070049 cc = pctx.AndroidGomaStaticRule("cc",
Colin Cross3f40fa42015-01-30 17:27:36 -080050 blueprint.RuleParams{
51 Depfile: "${out}.d",
52 Deps: blueprint.DepsGCC,
Alistair Strachan777475c2016-08-26 12:55:49 -070053 Command: "$relPwd ${config.CcWrapper}$ccCmd -c $cFlags -MD -MF ${out}.d -o $out $in",
Dan Willemsenc94a7682015-11-17 15:27:28 -080054 CommandDeps: []string{"$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080055 },
Dan Willemsen322a0a62015-11-17 15:19:46 -080056 "ccCmd", "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080057
Colin Cross9d45bb72016-08-29 16:14:13 -070058 ld = pctx.AndroidStaticRule("ld",
Colin Cross3f40fa42015-01-30 17:27:36 -080059 blueprint.RuleParams{
Dan Albertce2b8392016-07-21 13:16:49 -070060 Command: "$ldCmd ${crtBegin} @${out}.rsp " +
Colin Cross28344522015-04-22 13:07:53 -070061 "${libFlags} ${crtEnd} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080062 CommandDeps: []string{"$ldCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070063 Rspfile: "${out}.rsp",
64 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080065 },
Dan Albertce2b8392016-07-21 13:16:49 -070066 "ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080067
Colin Cross9d45bb72016-08-29 16:14:13 -070068 partialLd = pctx.AndroidStaticRule("partialLd",
Colin Cross3f40fa42015-01-30 17:27:36 -080069 blueprint.RuleParams{
Chih-Hung Hsieh3ede2942018-01-10 14:30:44 -080070 // Without -no-pie, clang 7.0 adds -pie to link Android files,
71 // but -r and -pie cannot be used together.
72 Command: "$ldCmd -nostdlib -no-pie -Wl,-r ${in} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080073 CommandDeps: []string{"$ldCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080074 },
Colin Cross41280a42015-11-23 14:01:42 -080075 "ldCmd", "ldFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080076
Colin Cross9d45bb72016-08-29 16:14:13 -070077 ar = pctx.AndroidStaticRule("ar",
Colin Cross3f40fa42015-01-30 17:27:36 -080078 blueprint.RuleParams{
Colin Cross7d21c442015-03-30 17:47:53 -070079 Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
Dan Willemsenc94a7682015-11-17 15:27:28 -080080 CommandDeps: []string{"$arCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070081 Rspfile: "${out}.rsp",
82 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080083 },
84 "arCmd", "arFlags")
85
Colin Cross9d45bb72016-08-29 16:14:13 -070086 darwinAr = pctx.AndroidStaticRule("darwinAr",
Colin Cross0af4b842015-04-30 16:36:18 -070087 blueprint.RuleParams{
Colin Crossb98c8b02016-07-29 13:44:28 -070088 Command: "rm -f ${out} && ${config.MacArPath} $arFlags $out $in",
89 CommandDeps: []string{"${config.MacArPath}"},
Colin Cross0af4b842015-04-30 16:36:18 -070090 },
Colin Crossb8ecdfe2016-05-03 15:10:29 -070091 "arFlags")
Colin Cross0af4b842015-04-30 16:36:18 -070092
Colin Cross9d45bb72016-08-29 16:14:13 -070093 darwinAppendAr = pctx.AndroidStaticRule("darwinAppendAr",
Colin Cross0af4b842015-04-30 16:36:18 -070094 blueprint.RuleParams{
Colin Crossb98c8b02016-07-29 13:44:28 -070095 Command: "cp -f ${inAr} ${out}.tmp && ${config.MacArPath} $arFlags ${out}.tmp $in && mv ${out}.tmp ${out}",
96 CommandDeps: []string{"${config.MacArPath}", "${inAr}"},
Colin Cross0af4b842015-04-30 16:36:18 -070097 },
Colin Crossb8ecdfe2016-05-03 15:10:29 -070098 "arFlags", "inAr")
99
Colin Cross9d45bb72016-08-29 16:14:13 -0700100 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700101 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -0700102 Command: "${config.MacStripPath} -u -r -o $out $in",
103 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700104 })
Colin Cross0af4b842015-04-30 16:36:18 -0700105
Colin Cross9d45bb72016-08-29 16:14:13 -0700106 prefixSymbols = pctx.AndroidStaticRule("prefixSymbols",
Colin Crossbfae8852015-03-26 14:44:11 -0700107 blueprint.RuleParams{
108 Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800109 CommandDeps: []string{"$objcopyCmd"},
Colin Crossbfae8852015-03-26 14:44:11 -0700110 },
111 "objcopyCmd", "prefix")
112
Nan Zhang43a485c2017-03-27 14:27:58 -0700113 _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh")
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800114 _ = pctx.SourcePathVariable("xzCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/xz")
Colin Cross665dce92016-04-28 14:50:03 -0700115
Colin Cross9d45bb72016-08-29 16:14:13 -0700116 strip = pctx.AndroidStaticRule("strip",
Colin Cross665dce92016-04-28 14:50:03 -0700117 blueprint.RuleParams{
118 Depfile: "${out}.d",
119 Deps: blueprint.DepsGCC,
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700120 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 -0800121 CommandDeps: []string{"$stripPath", "$xzCmd"},
Colin Cross665dce92016-04-28 14:50:03 -0700122 },
123 "args", "crossCompile")
124
Colin Cross9d45bb72016-08-29 16:14:13 -0700125 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700126 blueprint.RuleParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700127 Command: "rm -f $out && touch $out",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700128 })
129
Nan Zhang43a485c2017-03-27 14:27:58 -0700130 _ = pctx.SourcePathVariable("copyGccLibPath", "build/soong/scripts/copygcclib.sh")
Colin Cross3f40fa42015-01-30 17:27:36 -0800131
Colin Cross9d45bb72016-08-29 16:14:13 -0700132 copyGccLib = pctx.AndroidStaticRule("copyGccLib",
Colin Cross3f40fa42015-01-30 17:27:36 -0800133 blueprint.RuleParams{
134 Depfile: "${out}.d",
135 Deps: blueprint.DepsGCC,
136 Command: "$copyGccLibPath $out $ccCmd $cFlags -print-file-name=${libName}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800137 CommandDeps: []string{"$copyGccLibPath", "$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -0800138 },
139 "ccCmd", "cFlags", "libName")
Colin Cross26c34ed2016-09-30 17:10:16 -0700140
Nan Zhang43a485c2017-03-27 14:27:58 -0700141 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700142
143 toc = pctx.AndroidStaticRule("toc",
144 blueprint.RuleParams{
145 Depfile: "${out}.d",
146 Deps: blueprint.DepsGCC,
147 Command: "CROSS_COMPILE=$crossCompile $tocPath -i ${in} -o ${out} -d ${out}.d",
148 CommandDeps: []string{"$tocPath"},
149 Restat: true,
150 },
151 "crossCompile")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700152
Chih-Hung Hsieha7aa9582018-08-15 11:28:38 -0700153 _ = pctx.SourcePathVariable("tidyPath", "build/soong/scripts/clang-tidy.sh")
154
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700155 clangTidy = pctx.AndroidStaticRule("clangTidy",
156 blueprint.RuleParams{
Chih-Hung Hsieha7aa9582018-08-15 11:28:38 -0700157 Command: "rm -f $out && CLANG_TIDY=${config.ClangBin}/clang-tidy $tidyPath $tidyFlags $in -- $cFlags && touch $out",
158 CommandDeps: []string{"${config.ClangBin}/clang-tidy", "$tidyPath"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700159 },
160 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800161
Nan Zhang43a485c2017-03-27 14:27:58 -0700162 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800163
164 yasm = pctx.AndroidStaticRule("yasm",
165 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700166 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800167 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700168 Depfile: "$out.d",
169 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800170 },
171 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800172
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700173 windres = pctx.AndroidStaticRule("windres",
174 blueprint.RuleParams{
175 Command: "$windresCmd $flags -I$$(dirname $in) -i $in -o $out",
176 CommandDeps: []string{"$windresCmd"},
177 },
178 "windresCmd", "flags")
179
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800180 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800181
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700182 // -w has been added since header-abi-dumper does not need to produce any sort of diagnostic information.
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800183 sAbiDump = pctx.AndroidStaticRule("sAbiDump",
184 blueprint.RuleParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700185 Command: "rm -f $out && $sAbiDumper -o ${out} $in $exportDirs -- $cFlags -w -isystem ${config.RSIncludePath}",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800186 CommandDeps: []string{"$sAbiDumper"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800187 },
188 "cFlags", "exportDirs")
189
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800190 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800191
192 sAbiLink = pctx.AndroidStaticRule("sAbiLink",
193 blueprint.RuleParams{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800194 Command: "$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800195 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800196 Rspfile: "${out}.rsp",
197 RspfileContent: "${in}",
198 },
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800199 "symbolFilter", "arch", "exportedHeaderFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800200
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800201 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700202
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800203 sAbiDiff = pctx.AndroidRuleFunc("sAbiDiff",
Dan Willemsen54daaf02018-03-12 13:24:09 -0700204 func(ctx android.PackageRuleContext) blueprint.RuleParams {
Jayant Chowdhary39d167a2018-05-17 16:45:51 -0700205 // TODO(b/78139997): Add -check-all-apis back
206 commandStr := "($sAbiDiffer $allowFlags -lib $libName -arch $arch -o ${out} -new $in -old $referenceDump)"
Dan Willemsenbc0c5092018-03-10 16:25:53 -0800207 distAbiDiffDir := android.PathForDist(ctx, "abidiffs")
Jiyong Parka5f11e42018-04-17 12:19:51 +0900208 commandStr += "|| (echo ' ---- Please update abi references by running $$ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py -l ${libName} ----'"
Dan Willemsenbc0c5092018-03-10 16:25:53 -0800209 if distAbiDiffDir.Valid() {
Dan Willemsenedd1ae02018-04-17 10:41:11 -0700210 commandStr += " && (mkdir -p " + distAbiDiffDir.String() + " && cp ${out} " + distAbiDiffDir.String() + ")"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800211 }
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800212 commandStr += " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800213 return blueprint.RuleParams{
214 Command: commandStr,
215 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700216 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800217 },
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -0700218 "allowFlags", "referenceDump", "libName", "arch")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700219
220 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
221 blueprint.RuleParams{
222 Command: "gunzip -c $in > $out",
223 })
Colin Cross3f40fa42015-01-30 17:27:36 -0800224)
225
Dan Willemsen322a0a62015-11-17 15:19:46 -0800226func init() {
227 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
228 // debug output. That way two builds in two different directories will
229 // create the same output.
230 if runtime.GOOS != "darwin" {
231 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
232 } else {
233 // Darwin doesn't have /proc
234 pctx.StaticVariable("relPwd", "")
235 }
236}
237
Colin Cross3f40fa42015-01-30 17:27:36 -0800238type builderFlags struct {
Joe Onorato09e94ab2017-11-18 18:23:14 -0800239 globalFlags string
240 arFlags string
241 asFlags string
242 cFlags string
243 toolingCFlags string // A separate set of Cflags for clang LibTooling tools
244 conlyFlags string
245 cppFlags string
246 ldFlags string
247 libFlags string
248 yaccFlags string
249 protoFlags string
250 protoOutParams string
251 tidyFlags string
252 sAbiFlags string
253 yasmFlags string
254 aidlFlags string
255 rsFlags string
256 toolchain config.Toolchain
257 clang bool
258 tidy bool
259 coverage bool
260 sAbiDump bool
Dan Willemsenab9f4262018-02-14 13:58:34 -0800261 protoRoot bool
Colin Cross665dce92016-04-28 14:50:03 -0700262
Colin Crossc3199482017-03-30 15:03:04 -0700263 systemIncludeFlags string
264
Colin Cross18c0c5a2016-12-01 14:45:23 -0800265 groupStaticLibs bool
Zhizhou Yang51be6322018-02-08 18:32:11 -0800266 arGoldPlugin bool
Colin Cross18c0c5a2016-12-01 14:45:23 -0800267
Colin Cross665dce92016-04-28 14:50:03 -0700268 stripKeepSymbols bool
269 stripKeepMiniDebugInfo bool
270 stripAddGnuDebuglink bool
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700271 stripUseLlvmStrip bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800272}
273
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700274type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800275 objFiles android.Paths
276 tidyFiles android.Paths
277 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800278 sAbiDumpFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700279}
280
281func (a Objects) Copy() Objects {
282 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800283 objFiles: append(android.Paths{}, a.objFiles...),
284 tidyFiles: append(android.Paths{}, a.tidyFiles...),
285 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800286 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700287 }
288}
289
290func (a Objects) Append(b Objects) Objects {
291 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800292 objFiles: append(a.objFiles, b.objFiles...),
293 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
294 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800295 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700296 }
297}
298
Colin Cross3f40fa42015-01-30 17:27:36 -0800299// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700300func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800301 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700302
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700303 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700304 var tidyFiles android.Paths
305 if flags.tidy && flags.clang {
306 tidyFiles = make(android.Paths, 0, len(srcFiles))
307 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800308 var coverageFiles android.Paths
309 if flags.coverage {
310 coverageFiles = make(android.Paths, 0, len(srcFiles))
311 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800312
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700313 commonFlags := strings.Join([]string{
Colin Crossc3199482017-03-30 15:03:04 -0700314 flags.globalFlags,
315 flags.systemIncludeFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700316 }, " ")
317
318 toolingCflags := strings.Join([]string{
319 commonFlags,
320 flags.toolingCFlags,
321 flags.conlyFlags,
322 }, " ")
323
324 cflags := strings.Join([]string{
325 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700326 flags.cFlags,
327 flags.conlyFlags,
328 }, " ")
329
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700330 toolingCppflags := strings.Join([]string{
331 commonFlags,
332 flags.toolingCFlags,
333 flags.cppFlags,
334 }, " ")
335
Colin Crossc3199482017-03-30 15:03:04 -0700336 cppflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700337 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700338 flags.cFlags,
339 flags.cppFlags,
340 }, " ")
341
342 asflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700343 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700344 flags.asFlags,
345 }, " ")
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700346
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800347 var sAbiDumpFiles android.Paths
348 if flags.sAbiDump && flags.clang {
349 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
350 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800351
Dan Willemsenbe03f342016-03-03 17:21:04 -0800352 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700353 cflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700354 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700355 cppflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700356 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800357 } else {
Colin Crossb98c8b02016-07-29 13:44:28 -0700358 cflags += " ${config.NoOverrideGlobalCflags}"
359 cppflags += " ${config.NoOverrideGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800360 }
361
Colin Cross3f40fa42015-01-30 17:27:36 -0800362 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700363 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800364
365 objFiles[i] = objFile
366
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700367 switch srcFile.Ext() {
368 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700369 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700370 Rule: yasm,
371 Description: "yasm " + srcFile.Rel(),
372 Output: objFile,
373 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800374 Implicits: cFlagsDeps,
375 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800376 Args: map[string]string{
377 "asFlags": flags.yasmFlags,
378 },
379 })
380 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700381 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700382 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700383 Rule: windres,
384 Description: "windres " + srcFile.Rel(),
385 Output: objFile,
386 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800387 Implicits: cFlagsDeps,
388 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700389 Args: map[string]string{
390 "windresCmd": gccCmd(flags.toolchain, "windres"),
391 "flags": flags.toolchain.WindresFlags(),
392 },
393 })
394 continue
Colin Cross91e90042016-12-02 17:13:24 -0800395 }
396
Colin Cross3f40fa42015-01-30 17:27:36 -0800397 var moduleCflags string
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700398 var moduleToolingCflags string
Colin Cross3f40fa42015-01-30 17:27:36 -0800399 var ccCmd string
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700400 tidy := flags.tidy && flags.clang
Dan Willemsen581341d2017-02-09 16:16:31 -0800401 coverage := flags.coverage
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800402 dump := flags.sAbiDump && flags.clang
Colin Cross3f40fa42015-01-30 17:27:36 -0800403
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700404 switch srcFile.Ext() {
Colin Cross3f40fa42015-01-30 17:27:36 -0800405 case ".S", ".s":
406 ccCmd = "gcc"
407 moduleCflags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700408 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800409 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800410 dump = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800411 case ".c":
412 ccCmd = "gcc"
413 moduleCflags = cflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700414 moduleToolingCflags = toolingCflags
Colin Cross9978ffe2016-12-01 15:31:22 -0800415 case ".cpp", ".cc", ".mm":
Colin Cross3f40fa42015-01-30 17:27:36 -0800416 ccCmd = "g++"
417 moduleCflags = cppflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700418 moduleToolingCflags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800419 default:
420 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
421 continue
422 }
423
424 if flags.clang {
425 switch ccCmd {
426 case "gcc":
427 ccCmd = "clang"
428 case "g++":
429 ccCmd = "clang++"
430 default:
431 panic("unrecoginzied ccCmd")
432 }
Colin Cross67a5c132017-05-09 13:45:28 -0700433 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800434
Colin Cross67a5c132017-05-09 13:45:28 -0700435 ccDesc := ccCmd
436
437 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700438 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800439 } else {
440 ccCmd = gccCmd(flags.toolchain, ccCmd)
441 }
442
Dan Willemsen581341d2017-02-09 16:16:31 -0800443 var implicitOutputs android.WritablePaths
444 if coverage {
445 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
446 implicitOutputs = append(implicitOutputs, gcnoFile)
447 coverageFiles = append(coverageFiles, gcnoFile)
448 }
449
Colin Crossae887032017-10-23 17:16:14 -0700450 ctx.Build(pctx, android.BuildParams{
Dan Willemsen581341d2017-02-09 16:16:31 -0800451 Rule: cc,
Colin Cross67a5c132017-05-09 13:45:28 -0700452 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800453 Output: objFile,
454 ImplicitOutputs: implicitOutputs,
455 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800456 Implicits: cFlagsDeps,
457 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800458 Args: map[string]string{
Colin Cross28344522015-04-22 13:07:53 -0700459 "cFlags": moduleCflags,
460 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800461 },
462 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700463
464 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700465 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700466 tidyFiles = append(tidyFiles, tidyFile)
467
Colin Crossae887032017-10-23 17:16:14 -0700468 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700469 Rule: clangTidy,
470 Description: "clang-tidy " + srcFile.Rel(),
471 Output: tidyFile,
472 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700473 // We must depend on objFile, since clang-tidy doesn't
474 // support exporting dependencies.
475 Implicit: objFile,
476 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700477 "cFlags": moduleToolingCflags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700478 "tidyFlags": flags.tidyFlags,
479 },
480 })
481 }
482
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800483 if dump {
484 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
485 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
486
Colin Crossae887032017-10-23 17:16:14 -0700487 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700488 Rule: sAbiDump,
489 Description: "header-abi-dumper " + srcFile.Rel(),
490 Output: sAbiDumpFile,
491 Input: srcFile,
492 Implicit: objFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800493 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700494 "cFlags": moduleToolingCflags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800495 "exportDirs": flags.sAbiFlags,
496 },
497 })
498 }
499
Colin Cross3f40fa42015-01-30 17:27:36 -0800500 }
501
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700502 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800503 objFiles: objFiles,
504 tidyFiles: tidyFiles,
505 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800506 sAbiDumpFiles: sAbiDumpFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700507 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800508}
509
510// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700511func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700512 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800513
Dan Willemsen581341d2017-02-09 16:16:31 -0800514 if ctx.Darwin() {
515 transformDarwinObjToStaticLib(ctx, objFiles, flags, outputFile, deps)
516 return
517 }
518
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800519 arCmd := "${config.ClangBin}/llvm-ar"
520 arFlags := "crsD"
521 if !ctx.Darwin() {
522 arFlags += " -format=gnu"
523 }
Zhizhou Yang51be6322018-02-08 18:32:11 -0800524 if flags.arGoldPlugin {
525 arFlags += " --plugin ${config.LLVMGoldPlugin}"
526 }
Vishwath Mohan83d9f712017-03-16 11:01:23 -0700527 if flags.arFlags != "" {
528 arFlags += " " + flags.arFlags
529 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800530
Colin Crossae887032017-10-23 17:16:14 -0700531 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700532 Rule: ar,
533 Description: "static link " + outputFile.Base(),
534 Output: outputFile,
535 Inputs: objFiles,
536 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800537 Args: map[string]string{
538 "arFlags": arFlags,
539 "arCmd": arCmd,
540 },
541 })
542}
543
Colin Cross0af4b842015-04-30 16:36:18 -0700544// Generate a rule for compiling multiple .o files to a static library (.a) on
545// darwin. The darwin ar tool doesn't support @file for list files, and has a
546// very small command line length limit, so we have to split the ar into multiple
547// steps, each appending to the previous one.
Dan Willemsen581341d2017-02-09 16:16:31 -0800548func transformDarwinObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Colin Cross5b529592017-05-09 13:34:34 -0700549 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross0af4b842015-04-30 16:36:18 -0700550
Colin Cross0af4b842015-04-30 16:36:18 -0700551 arFlags := "cqs"
552
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700553 if len(objFiles) == 0 {
Colin Cross635c3b02016-05-18 15:37:25 -0700554 dummy := android.PathForModuleOut(ctx, "dummy"+objectExtension)
555 dummyAr := android.PathForModuleOut(ctx, "dummy"+staticLibraryExtension)
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700556
Colin Crossae887032017-10-23 17:16:14 -0700557 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700558 Rule: emptyFile,
559 Description: "empty object file",
560 Output: dummy,
561 Implicits: deps,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700562 })
563
Colin Crossae887032017-10-23 17:16:14 -0700564 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700565 Rule: darwinAr,
566 Description: "empty static archive",
567 Output: dummyAr,
568 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700569 Args: map[string]string{
570 "arFlags": arFlags,
571 },
572 })
573
Colin Crossae887032017-10-23 17:16:14 -0700574 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700575 Rule: darwinAppendAr,
576 Description: "static link " + outputFile.Base(),
577 Output: outputFile,
578 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700579 Args: map[string]string{
580 "arFlags": "d",
581 "inAr": dummyAr.String(),
582 },
583 })
584
585 return
586 }
587
Colin Cross0af4b842015-04-30 16:36:18 -0700588 // ARG_MAX on darwin is 262144, use half that to be safe
Colin Cross5b529592017-05-09 13:34:34 -0700589 objFilesLists, err := splitListForSize(objFiles, 131072)
Colin Cross0af4b842015-04-30 16:36:18 -0700590 if err != nil {
591 ctx.ModuleErrorf("%s", err.Error())
592 }
593
Colin Cross5b529592017-05-09 13:34:34 -0700594 var in, out android.WritablePath
Colin Cross0af4b842015-04-30 16:36:18 -0700595 for i, l := range objFilesLists {
596 in = out
597 out = outputFile
598 if i != len(objFilesLists)-1 {
Colin Cross5b529592017-05-09 13:34:34 -0700599 out = android.PathForModuleOut(ctx, outputFile.Base()+strconv.Itoa(i))
Colin Cross0af4b842015-04-30 16:36:18 -0700600 }
601
Colin Crossae887032017-10-23 17:16:14 -0700602 build := android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700603 Rule: darwinAr,
604 Description: "static link " + out.Base(),
605 Output: out,
606 Inputs: l,
607 Implicits: deps,
Colin Cross5b529592017-05-09 13:34:34 -0700608 Args: map[string]string{
609 "arFlags": arFlags,
610 },
Colin Cross0af4b842015-04-30 16:36:18 -0700611 }
Colin Cross5b529592017-05-09 13:34:34 -0700612 if i != 0 {
613 build.Rule = darwinAppendAr
614 build.Args["inAr"] = in.String()
615 }
Colin Crossae887032017-10-23 17:16:14 -0700616 ctx.Build(pctx, build)
Colin Cross0af4b842015-04-30 16:36:18 -0700617 }
618}
619
Colin Cross3f40fa42015-01-30 17:27:36 -0800620// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700621// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700622func TransformObjToDynamicBinary(ctx android.ModuleContext,
623 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
624 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800625
626 var ldCmd string
627 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700628 ldCmd = "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800629 } else {
630 ldCmd = gccCmd(flags.toolchain, "g++")
631 }
632
Colin Cross3f40fa42015-01-30 17:27:36 -0800633 var libFlagsList []string
634
Colin Cross16b23492016-01-06 14:41:07 -0800635 if len(flags.libFlags) > 0 {
636 libFlagsList = append(libFlagsList, flags.libFlags)
637 }
638
Colin Cross3f40fa42015-01-30 17:27:36 -0800639 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800640 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700641 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700642 } else {
643 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700644 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700645 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
646 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800647 }
648
Colin Cross7a7cf972016-12-05 18:47:39 -0800649 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800650 libFlagsList = append(libFlagsList, "-Wl,--start-group")
651 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700652 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800653 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800654 libFlagsList = append(libFlagsList, "-Wl,--end-group")
655 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800656
Stephen Hines10347862016-07-18 15:54:54 -0700657 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700658 libFlagsList = append(libFlagsList, "-Wl,--start-group")
659 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700660 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700661 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700662 libFlagsList = append(libFlagsList, "-Wl,--end-group")
663 }
664
Colin Cross3f40fa42015-01-30 17:27:36 -0800665 for _, lib := range sharedLibs {
Dan Albert9840e1b2016-07-21 08:47:33 -0700666 libFlagsList = append(libFlagsList, lib.String())
Colin Cross3f40fa42015-01-30 17:27:36 -0800667 }
668
Colin Cross3f40fa42015-01-30 17:27:36 -0800669 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700670 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800671 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700672 if crtBegin.Valid() {
673 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800674 }
675
Colin Crossae887032017-10-23 17:16:14 -0700676 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700677 Rule: ld,
678 Description: "link " + outputFile.Base(),
679 Output: outputFile,
680 Inputs: objFiles,
681 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800682 Args: map[string]string{
Dan Albertce2b8392016-07-21 13:16:49 -0700683 "ldCmd": ldCmd,
684 "crtBegin": crtBegin.String(),
685 "libFlags": strings.Join(libFlagsList, " "),
686 "ldFlags": flags.ldFlags,
687 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800688 },
689 })
690}
691
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800692// Generate a rule to combine .dump sAbi dump files from multiple source files
693// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700694func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800695 baseName, exportedHeaderFlags string) android.OptionalPath {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800696 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Jayant Chowdharydcd33b62018-02-23 16:43:23 -0800697 sabiLock.Lock()
698 lsdumpPaths = append(lsdumpPaths, outputFile.String())
699 sabiLock.Unlock()
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800700 symbolFilterStr := "-so " + soFile.String()
Colin Crossae887032017-10-23 17:16:14 -0700701 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700702 Rule: sAbiLink,
703 Description: "header-abi-linker " + outputFile.Base(),
704 Output: outputFile,
705 Inputs: sAbiDumps,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800706 Implicit: soFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800707 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800708 "symbolFilter": symbolFilterStr,
709 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800710 "exportedHeaderFlags": exportedHeaderFlags,
711 },
712 })
713 return android.OptionalPathForPath(outputFile)
714}
715
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700716func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
717 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700718 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700719 Rule: unzipRefSAbiDump,
720 Description: "gunzip" + outputFile.Base(),
721 Output: outputFile,
722 Input: zippedRefDump,
723 })
724 return outputFile
725}
726
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800727func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chienf3511742017-10-31 18:04:35 +0800728 baseName, exportedHeaderFlags string, isVndkExt bool) android.OptionalPath {
729
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800730 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700731 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Jayant Chowdharye4499502018-01-17 13:13:33 -0800732 localAbiCheckAllowFlags := append([]string(nil), abiCheckAllowFlags...)
733 if exportedHeaderFlags == "" {
734 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-advice-only")
735 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700736 if inList(libName, llndkLibraries) {
737 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-consider-opaque-types-different")
738 }
Logan Chienf3511742017-10-31 18:04:35 +0800739 if isVndkExt {
740 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-allow-extensions")
741 }
742
Colin Crossae887032017-10-23 17:16:14 -0700743 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700744 Rule: sAbiDiff,
745 Description: "header-abi-diff " + outputFile.Base(),
746 Output: outputFile,
747 Input: inputDump,
748 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800749 Args: map[string]string{
750 "referenceDump": referenceDump.String(),
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700751 "libName": libName,
Jayant Chowdharyf54e0a72017-05-22 10:53:24 -0700752 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdharye4499502018-01-17 13:13:33 -0800753 "allowFlags": strings.Join(localAbiCheckAllowFlags, " "),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800754 },
755 })
756 return android.OptionalPathForPath(outputFile)
757}
758
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700759// Generate a rule for extracting a table of contents from a shared library (.so)
760func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700761 outputFile android.WritablePath, flags builderFlags) {
762
763 crossCompile := gccCmd(flags.toolchain, "")
764
Colin Crossae887032017-10-23 17:16:14 -0700765 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700766 Rule: toc,
767 Description: "generate toc " + inputFile.Base(),
768 Output: outputFile,
769 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700770 Args: map[string]string{
771 "crossCompile": crossCompile,
772 },
773 })
774}
775
Colin Cross3f40fa42015-01-30 17:27:36 -0800776// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700777func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
778 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800779
Colin Cross41280a42015-11-23 14:01:42 -0800780 var ldCmd string
781 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700782 ldCmd = "${config.ClangBin}/clang++"
Colin Cross41280a42015-11-23 14:01:42 -0800783 } else {
784 ldCmd = gccCmd(flags.toolchain, "g++")
785 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800786
Colin Crossae887032017-10-23 17:16:14 -0700787 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700788 Rule: partialLd,
789 Description: "link " + outputFile.Base(),
790 Output: outputFile,
791 Inputs: objFiles,
Colin Cross3f40fa42015-01-30 17:27:36 -0800792 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700793 "ldCmd": ldCmd,
Colin Cross41280a42015-11-23 14:01:42 -0800794 "ldFlags": flags.ldFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800795 },
796 })
797}
798
Colin Crossbfae8852015-03-26 14:44:11 -0700799// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700800func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
801 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700802
803 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
804
Colin Crossae887032017-10-23 17:16:14 -0700805 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700806 Rule: prefixSymbols,
807 Description: "prefix symbols " + outputFile.Base(),
808 Output: outputFile,
809 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700810 Args: map[string]string{
811 "objcopyCmd": objcopyCmd,
812 "prefix": prefix,
813 },
814 })
815}
816
Colin Cross635c3b02016-05-18 15:37:25 -0700817func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
818 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700819
820 crossCompile := gccCmd(flags.toolchain, "")
821 args := ""
822 if flags.stripAddGnuDebuglink {
823 args += " --add-gnu-debuglink"
824 }
825 if flags.stripKeepMiniDebugInfo {
826 args += " --keep-mini-debug-info"
827 }
828 if flags.stripKeepSymbols {
829 args += " --keep-symbols"
830 }
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700831 if flags.stripUseLlvmStrip {
832 args += " --use-llvm-strip"
833 }
Colin Cross665dce92016-04-28 14:50:03 -0700834
Colin Crossae887032017-10-23 17:16:14 -0700835 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700836 Rule: strip,
837 Description: "strip " + outputFile.Base(),
838 Output: outputFile,
839 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700840 Args: map[string]string{
841 "crossCompile": crossCompile,
842 "args": args,
843 },
844 })
845}
846
Colin Cross635c3b02016-05-18 15:37:25 -0700847func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
848 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700849
Colin Crossae887032017-10-23 17:16:14 -0700850 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700851 Rule: darwinStrip,
852 Description: "strip " + outputFile.Base(),
853 Output: outputFile,
854 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700855 })
856}
857
Dan Willemsen581341d2017-02-09 16:16:31 -0800858func TransformCoverageFilesToLib(ctx android.ModuleContext,
859 inputs Objects, flags builderFlags, baseName string) android.OptionalPath {
860
861 if len(inputs.coverageFiles) > 0 {
862 outputFile := android.PathForModuleOut(ctx, baseName+".gcnodir")
863
864 TransformObjToStaticLib(ctx, inputs.coverageFiles, flags, outputFile, nil)
865
866 return android.OptionalPathForPath(outputFile)
867 }
868
869 return android.OptionalPath{}
870}
871
Colin Cross635c3b02016-05-18 15:37:25 -0700872func CopyGccLib(ctx android.ModuleContext, libName string,
873 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800874
Colin Crossae887032017-10-23 17:16:14 -0700875 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700876 Rule: copyGccLib,
877 Description: "copy gcc library " + libName,
878 Output: outputFile,
Colin Cross3f40fa42015-01-30 17:27:36 -0800879 Args: map[string]string{
880 "ccCmd": gccCmd(flags.toolchain, "gcc"),
881 "cFlags": flags.globalFlags,
882 "libName": libName,
883 },
884 })
885}
886
Colin Crossb98c8b02016-07-29 13:44:28 -0700887func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800888 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
889}
Colin Cross0af4b842015-04-30 16:36:18 -0700890
Colin Cross5b529592017-05-09 13:34:34 -0700891func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700892 var i int
893
894 start := 0
895 bytes := 0
896 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700897 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700898 if l > limit {
899 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
900 }
901 if bytes+l > limit {
902 lists = append(lists, list[start:i])
903 start = i
904 bytes = 0
905 }
906 bytes += l + 1 // count a space between each list element
907 }
908
909 lists = append(lists, list[start:])
910
911 totalLen := 0
912 for _, l := range lists {
913 totalLen += len(l)
914 }
915 if totalLen != len(list) {
916 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
917 }
918 return lists, nil
919}