blob: fe35d5c168f3088a1c057581d1abeb6778580249 [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{
Colin Cross41280a42015-11-23 14:01:42 -080070 Command: "$ldCmd -nostdlib -Wl,-r ${in} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080071 CommandDeps: []string{"$ldCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080072 },
Colin Cross41280a42015-11-23 14:01:42 -080073 "ldCmd", "ldFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080074
Colin Cross9d45bb72016-08-29 16:14:13 -070075 ar = pctx.AndroidStaticRule("ar",
Colin Cross3f40fa42015-01-30 17:27:36 -080076 blueprint.RuleParams{
Colin Cross7d21c442015-03-30 17:47:53 -070077 Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
Dan Willemsenc94a7682015-11-17 15:27:28 -080078 CommandDeps: []string{"$arCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070079 Rspfile: "${out}.rsp",
80 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080081 },
82 "arCmd", "arFlags")
83
Colin Cross9d45bb72016-08-29 16:14:13 -070084 darwinAr = pctx.AndroidStaticRule("darwinAr",
Colin Cross0af4b842015-04-30 16:36:18 -070085 blueprint.RuleParams{
Colin Crossb98c8b02016-07-29 13:44:28 -070086 Command: "rm -f ${out} && ${config.MacArPath} $arFlags $out $in",
87 CommandDeps: []string{"${config.MacArPath}"},
Colin Cross0af4b842015-04-30 16:36:18 -070088 },
Colin Crossb8ecdfe2016-05-03 15:10:29 -070089 "arFlags")
Colin Cross0af4b842015-04-30 16:36:18 -070090
Colin Cross9d45bb72016-08-29 16:14:13 -070091 darwinAppendAr = pctx.AndroidStaticRule("darwinAppendAr",
Colin Cross0af4b842015-04-30 16:36:18 -070092 blueprint.RuleParams{
Colin Crossb98c8b02016-07-29 13:44:28 -070093 Command: "cp -f ${inAr} ${out}.tmp && ${config.MacArPath} $arFlags ${out}.tmp $in && mv ${out}.tmp ${out}",
94 CommandDeps: []string{"${config.MacArPath}", "${inAr}"},
Colin Cross0af4b842015-04-30 16:36:18 -070095 },
Colin Crossb8ecdfe2016-05-03 15:10:29 -070096 "arFlags", "inAr")
97
Colin Cross9d45bb72016-08-29 16:14:13 -070098 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -070099 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -0700100 Command: "${config.MacStripPath} -u -r -o $out $in",
101 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700102 })
Colin Cross0af4b842015-04-30 16:36:18 -0700103
Colin Cross9d45bb72016-08-29 16:14:13 -0700104 prefixSymbols = pctx.AndroidStaticRule("prefixSymbols",
Colin Crossbfae8852015-03-26 14:44:11 -0700105 blueprint.RuleParams{
106 Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800107 CommandDeps: []string{"$objcopyCmd"},
Colin Crossbfae8852015-03-26 14:44:11 -0700108 },
109 "objcopyCmd", "prefix")
110
Nan Zhang43a485c2017-03-27 14:27:58 -0700111 _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh")
Colin Cross665dce92016-04-28 14:50:03 -0700112
Colin Cross9d45bb72016-08-29 16:14:13 -0700113 strip = pctx.AndroidStaticRule("strip",
Colin Cross665dce92016-04-28 14:50:03 -0700114 blueprint.RuleParams{
115 Depfile: "${out}.d",
116 Deps: blueprint.DepsGCC,
117 Command: "CROSS_COMPILE=$crossCompile $stripPath ${args} -i ${in} -o ${out} -d ${out}.d",
118 CommandDeps: []string{"$stripPath"},
Colin Cross665dce92016-04-28 14:50:03 -0700119 },
120 "args", "crossCompile")
121
Colin Cross9d45bb72016-08-29 16:14:13 -0700122 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700123 blueprint.RuleParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700124 Command: "rm -f $out && touch $out",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700125 })
126
Nan Zhang43a485c2017-03-27 14:27:58 -0700127 _ = pctx.SourcePathVariable("copyGccLibPath", "build/soong/scripts/copygcclib.sh")
Colin Cross3f40fa42015-01-30 17:27:36 -0800128
Colin Cross9d45bb72016-08-29 16:14:13 -0700129 copyGccLib = pctx.AndroidStaticRule("copyGccLib",
Colin Cross3f40fa42015-01-30 17:27:36 -0800130 blueprint.RuleParams{
131 Depfile: "${out}.d",
132 Deps: blueprint.DepsGCC,
133 Command: "$copyGccLibPath $out $ccCmd $cFlags -print-file-name=${libName}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800134 CommandDeps: []string{"$copyGccLibPath", "$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -0800135 },
136 "ccCmd", "cFlags", "libName")
Colin Cross26c34ed2016-09-30 17:10:16 -0700137
Nan Zhang43a485c2017-03-27 14:27:58 -0700138 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700139
140 toc = pctx.AndroidStaticRule("toc",
141 blueprint.RuleParams{
142 Depfile: "${out}.d",
143 Deps: blueprint.DepsGCC,
144 Command: "CROSS_COMPILE=$crossCompile $tocPath -i ${in} -o ${out} -d ${out}.d",
145 CommandDeps: []string{"$tocPath"},
146 Restat: true,
147 },
148 "crossCompile")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700149
150 clangTidy = pctx.AndroidStaticRule("clangTidy",
151 blueprint.RuleParams{
152 Command: "rm -f $out && ${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out",
153 CommandDeps: []string{"${config.ClangBin}/clang-tidy"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700154 },
155 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800156
Nan Zhang43a485c2017-03-27 14:27:58 -0700157 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800158
159 yasm = pctx.AndroidStaticRule("yasm",
160 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700161 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800162 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700163 Depfile: "$out.d",
164 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800165 },
166 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800167
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700168 windres = pctx.AndroidStaticRule("windres",
169 blueprint.RuleParams{
170 Command: "$windresCmd $flags -I$$(dirname $in) -i $in -o $out",
171 CommandDeps: []string{"$windresCmd"},
172 },
173 "windresCmd", "flags")
174
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800175 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
176
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700177 // -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 -0800178 sAbiDump = pctx.AndroidStaticRule("sAbiDump",
179 blueprint.RuleParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700180 Command: "rm -f $out && $sAbiDumper -o ${out} $in $exportDirs -- $cFlags -w -isystem ${config.RSIncludePath}",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800181 CommandDeps: []string{"$sAbiDumper"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800182 },
183 "cFlags", "exportDirs")
184
185 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
186
187 sAbiLink = pctx.AndroidStaticRule("sAbiLink",
188 blueprint.RuleParams{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800189 Command: "$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800190 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800191 Rspfile: "${out}.rsp",
192 RspfileContent: "${in}",
193 },
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800194 "symbolFilter", "arch", "exportedHeaderFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800195
196 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700197
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800198 sAbiDiff = pctx.AndroidRuleFunc("sAbiDiff",
199 func(config android.Config) (blueprint.RuleParams, error) {
200
201 commandStr := "($sAbiDiffer $allowFlags -lib $libName -arch $arch -check-all-apis -o ${out} -new $in -old $referenceDump)"
202 distDir := config.ProductVariables.DistDir
203 if distDir != nil && *distDir != "" {
204 distAbiDiffDir := *distDir + "/abidiffs/"
205 commandStr += " || (mkdir -p " + distAbiDiffDir + " && cp ${out} " + distAbiDiffDir + " && exit 1)"
206 }
207 return blueprint.RuleParams{
208 Command: commandStr,
209 CommandDeps: []string{"$sAbiDiffer"},
210 }, nil
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800211 },
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -0700212 "allowFlags", "referenceDump", "libName", "arch")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700213
214 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
215 blueprint.RuleParams{
216 Command: "gunzip -c $in > $out",
217 })
Colin Cross3f40fa42015-01-30 17:27:36 -0800218)
219
Dan Willemsen322a0a62015-11-17 15:19:46 -0800220func init() {
221 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
222 // debug output. That way two builds in two different directories will
223 // create the same output.
224 if runtime.GOOS != "darwin" {
225 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
226 } else {
227 // Darwin doesn't have /proc
228 pctx.StaticVariable("relPwd", "")
229 }
230}
231
Colin Cross3f40fa42015-01-30 17:27:36 -0800232type builderFlags struct {
Joe Onorato09e94ab2017-11-18 18:23:14 -0800233 globalFlags string
234 arFlags string
235 asFlags string
236 cFlags string
237 toolingCFlags string // A separate set of Cflags for clang LibTooling tools
238 conlyFlags string
239 cppFlags string
240 ldFlags string
241 libFlags string
242 yaccFlags string
243 protoFlags string
244 protoOutParams string
245 tidyFlags string
246 sAbiFlags string
247 yasmFlags string
248 aidlFlags string
249 rsFlags string
250 toolchain config.Toolchain
251 clang bool
252 tidy bool
253 coverage bool
254 sAbiDump bool
Colin Cross665dce92016-04-28 14:50:03 -0700255
Colin Crossc3199482017-03-30 15:03:04 -0700256 systemIncludeFlags string
257
Colin Cross18c0c5a2016-12-01 14:45:23 -0800258 groupStaticLibs bool
259
Colin Cross665dce92016-04-28 14:50:03 -0700260 stripKeepSymbols bool
261 stripKeepMiniDebugInfo bool
262 stripAddGnuDebuglink bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800263}
264
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700265type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800266 objFiles android.Paths
267 tidyFiles android.Paths
268 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800269 sAbiDumpFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700270}
271
272func (a Objects) Copy() Objects {
273 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800274 objFiles: append(android.Paths{}, a.objFiles...),
275 tidyFiles: append(android.Paths{}, a.tidyFiles...),
276 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800277 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700278 }
279}
280
281func (a Objects) Append(b Objects) Objects {
282 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800283 objFiles: append(a.objFiles, b.objFiles...),
284 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
285 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800286 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700287 }
288}
289
Colin Cross3f40fa42015-01-30 17:27:36 -0800290// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700291func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainar70ba5a32017-12-19 15:11:01 -0800292 flags builderFlags, pathDeps android.Paths, genDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700293
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700294 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700295 var tidyFiles android.Paths
296 if flags.tidy && flags.clang {
297 tidyFiles = make(android.Paths, 0, len(srcFiles))
298 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800299 var coverageFiles android.Paths
300 if flags.coverage {
301 coverageFiles = make(android.Paths, 0, len(srcFiles))
302 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800303
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700304 commonFlags := strings.Join([]string{
Colin Crossc3199482017-03-30 15:03:04 -0700305 flags.globalFlags,
306 flags.systemIncludeFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700307 }, " ")
308
309 toolingCflags := strings.Join([]string{
310 commonFlags,
311 flags.toolingCFlags,
312 flags.conlyFlags,
313 }, " ")
314
315 cflags := strings.Join([]string{
316 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700317 flags.cFlags,
318 flags.conlyFlags,
319 }, " ")
320
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700321 toolingCppflags := strings.Join([]string{
322 commonFlags,
323 flags.toolingCFlags,
324 flags.cppFlags,
325 }, " ")
326
Colin Crossc3199482017-03-30 15:03:04 -0700327 cppflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700328 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700329 flags.cFlags,
330 flags.cppFlags,
331 }, " ")
332
333 asflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700334 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700335 flags.asFlags,
336 }, " ")
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700337
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800338 var sAbiDumpFiles android.Paths
339 if flags.sAbiDump && flags.clang {
340 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
341 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800342
Dan Willemsenbe03f342016-03-03 17:21:04 -0800343 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700344 cflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700345 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700346 cppflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700347 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800348 } else {
Colin Crossb98c8b02016-07-29 13:44:28 -0700349 cflags += " ${config.NoOverrideGlobalCflags}"
350 cppflags += " ${config.NoOverrideGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800351 }
352
Colin Cross3f40fa42015-01-30 17:27:36 -0800353 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700354 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800355
356 objFiles[i] = objFile
357
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700358 switch srcFile.Ext() {
359 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700360 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700361 Rule: yasm,
362 Description: "yasm " + srcFile.Rel(),
363 Output: objFile,
364 Input: srcFile,
Pirama Arumuga Nainar70ba5a32017-12-19 15:11:01 -0800365 Implicits: pathDeps,
366 OrderOnly: genDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800367 Args: map[string]string{
368 "asFlags": flags.yasmFlags,
369 },
370 })
371 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700372 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700373 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700374 Rule: windres,
375 Description: "windres " + srcFile.Rel(),
376 Output: objFile,
377 Input: srcFile,
Pirama Arumuga Nainar70ba5a32017-12-19 15:11:01 -0800378 Implicits: pathDeps,
379 OrderOnly: genDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700380 Args: map[string]string{
381 "windresCmd": gccCmd(flags.toolchain, "windres"),
382 "flags": flags.toolchain.WindresFlags(),
383 },
384 })
385 continue
Colin Cross91e90042016-12-02 17:13:24 -0800386 }
387
Colin Cross3f40fa42015-01-30 17:27:36 -0800388 var moduleCflags string
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700389 var moduleToolingCflags string
Colin Cross3f40fa42015-01-30 17:27:36 -0800390 var ccCmd string
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700391 tidy := flags.tidy && flags.clang
Dan Willemsen581341d2017-02-09 16:16:31 -0800392 coverage := flags.coverage
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800393 dump := flags.sAbiDump && flags.clang
Colin Cross3f40fa42015-01-30 17:27:36 -0800394
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700395 switch srcFile.Ext() {
Colin Cross3f40fa42015-01-30 17:27:36 -0800396 case ".S", ".s":
397 ccCmd = "gcc"
398 moduleCflags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700399 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800400 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800401 dump = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800402 case ".c":
403 ccCmd = "gcc"
404 moduleCflags = cflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700405 moduleToolingCflags = toolingCflags
Colin Cross9978ffe2016-12-01 15:31:22 -0800406 case ".cpp", ".cc", ".mm":
Colin Cross3f40fa42015-01-30 17:27:36 -0800407 ccCmd = "g++"
408 moduleCflags = cppflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700409 moduleToolingCflags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800410 default:
411 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
412 continue
413 }
414
415 if flags.clang {
416 switch ccCmd {
417 case "gcc":
418 ccCmd = "clang"
419 case "g++":
420 ccCmd = "clang++"
421 default:
422 panic("unrecoginzied ccCmd")
423 }
Colin Cross67a5c132017-05-09 13:45:28 -0700424 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800425
Colin Cross67a5c132017-05-09 13:45:28 -0700426 ccDesc := ccCmd
427
428 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700429 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800430 } else {
431 ccCmd = gccCmd(flags.toolchain, ccCmd)
432 }
433
Dan Willemsen581341d2017-02-09 16:16:31 -0800434 var implicitOutputs android.WritablePaths
435 if coverage {
436 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
437 implicitOutputs = append(implicitOutputs, gcnoFile)
438 coverageFiles = append(coverageFiles, gcnoFile)
439 }
440
Colin Crossae887032017-10-23 17:16:14 -0700441 ctx.Build(pctx, android.BuildParams{
Dan Willemsen581341d2017-02-09 16:16:31 -0800442 Rule: cc,
Colin Cross67a5c132017-05-09 13:45:28 -0700443 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800444 Output: objFile,
445 ImplicitOutputs: implicitOutputs,
446 Input: srcFile,
Pirama Arumuga Nainar70ba5a32017-12-19 15:11:01 -0800447 Implicits: pathDeps,
448 OrderOnly: genDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800449 Args: map[string]string{
Colin Cross28344522015-04-22 13:07:53 -0700450 "cFlags": moduleCflags,
451 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800452 },
453 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700454
455 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700456 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700457 tidyFiles = append(tidyFiles, tidyFile)
458
Colin Crossae887032017-10-23 17:16:14 -0700459 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700460 Rule: clangTidy,
461 Description: "clang-tidy " + srcFile.Rel(),
462 Output: tidyFile,
463 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700464 // We must depend on objFile, since clang-tidy doesn't
465 // support exporting dependencies.
466 Implicit: objFile,
467 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700468 "cFlags": moduleToolingCflags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700469 "tidyFlags": flags.tidyFlags,
470 },
471 })
472 }
473
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800474 if dump {
475 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
476 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
477
Colin Crossae887032017-10-23 17:16:14 -0700478 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700479 Rule: sAbiDump,
480 Description: "header-abi-dumper " + srcFile.Rel(),
481 Output: sAbiDumpFile,
482 Input: srcFile,
483 Implicit: objFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800484 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700485 "cFlags": moduleToolingCflags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800486 "exportDirs": flags.sAbiFlags,
487 },
488 })
489 }
490
Colin Cross3f40fa42015-01-30 17:27:36 -0800491 }
492
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700493 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800494 objFiles: objFiles,
495 tidyFiles: tidyFiles,
496 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800497 sAbiDumpFiles: sAbiDumpFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700498 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800499}
500
501// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700502func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700503 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800504
Dan Willemsen581341d2017-02-09 16:16:31 -0800505 if ctx.Darwin() {
506 transformDarwinObjToStaticLib(ctx, objFiles, flags, outputFile, deps)
507 return
508 }
509
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800510 arCmd := "${config.ClangBin}/llvm-ar"
511 arFlags := "crsD"
512 if !ctx.Darwin() {
513 arFlags += " -format=gnu"
514 }
Vishwath Mohan83d9f712017-03-16 11:01:23 -0700515 if flags.arFlags != "" {
516 arFlags += " " + flags.arFlags
517 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800518
Colin Crossae887032017-10-23 17:16:14 -0700519 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700520 Rule: ar,
521 Description: "static link " + outputFile.Base(),
522 Output: outputFile,
523 Inputs: objFiles,
524 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800525 Args: map[string]string{
526 "arFlags": arFlags,
527 "arCmd": arCmd,
528 },
529 })
530}
531
Colin Cross0af4b842015-04-30 16:36:18 -0700532// Generate a rule for compiling multiple .o files to a static library (.a) on
533// darwin. The darwin ar tool doesn't support @file for list files, and has a
534// very small command line length limit, so we have to split the ar into multiple
535// steps, each appending to the previous one.
Dan Willemsen581341d2017-02-09 16:16:31 -0800536func transformDarwinObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Colin Cross5b529592017-05-09 13:34:34 -0700537 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross0af4b842015-04-30 16:36:18 -0700538
Colin Cross0af4b842015-04-30 16:36:18 -0700539 arFlags := "cqs"
540
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700541 if len(objFiles) == 0 {
Colin Cross635c3b02016-05-18 15:37:25 -0700542 dummy := android.PathForModuleOut(ctx, "dummy"+objectExtension)
543 dummyAr := android.PathForModuleOut(ctx, "dummy"+staticLibraryExtension)
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700544
Colin Crossae887032017-10-23 17:16:14 -0700545 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700546 Rule: emptyFile,
547 Description: "empty object file",
548 Output: dummy,
549 Implicits: deps,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700550 })
551
Colin Crossae887032017-10-23 17:16:14 -0700552 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700553 Rule: darwinAr,
554 Description: "empty static archive",
555 Output: dummyAr,
556 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700557 Args: map[string]string{
558 "arFlags": arFlags,
559 },
560 })
561
Colin Crossae887032017-10-23 17:16:14 -0700562 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700563 Rule: darwinAppendAr,
564 Description: "static link " + outputFile.Base(),
565 Output: outputFile,
566 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700567 Args: map[string]string{
568 "arFlags": "d",
569 "inAr": dummyAr.String(),
570 },
571 })
572
573 return
574 }
575
Colin Cross0af4b842015-04-30 16:36:18 -0700576 // ARG_MAX on darwin is 262144, use half that to be safe
Colin Cross5b529592017-05-09 13:34:34 -0700577 objFilesLists, err := splitListForSize(objFiles, 131072)
Colin Cross0af4b842015-04-30 16:36:18 -0700578 if err != nil {
579 ctx.ModuleErrorf("%s", err.Error())
580 }
581
Colin Cross5b529592017-05-09 13:34:34 -0700582 var in, out android.WritablePath
Colin Cross0af4b842015-04-30 16:36:18 -0700583 for i, l := range objFilesLists {
584 in = out
585 out = outputFile
586 if i != len(objFilesLists)-1 {
Colin Cross5b529592017-05-09 13:34:34 -0700587 out = android.PathForModuleOut(ctx, outputFile.Base()+strconv.Itoa(i))
Colin Cross0af4b842015-04-30 16:36:18 -0700588 }
589
Colin Crossae887032017-10-23 17:16:14 -0700590 build := android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700591 Rule: darwinAr,
592 Description: "static link " + out.Base(),
593 Output: out,
594 Inputs: l,
595 Implicits: deps,
Colin Cross5b529592017-05-09 13:34:34 -0700596 Args: map[string]string{
597 "arFlags": arFlags,
598 },
Colin Cross0af4b842015-04-30 16:36:18 -0700599 }
Colin Cross5b529592017-05-09 13:34:34 -0700600 if i != 0 {
601 build.Rule = darwinAppendAr
602 build.Args["inAr"] = in.String()
603 }
Colin Crossae887032017-10-23 17:16:14 -0700604 ctx.Build(pctx, build)
Colin Cross0af4b842015-04-30 16:36:18 -0700605 }
606}
607
Colin Cross3f40fa42015-01-30 17:27:36 -0800608// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700609// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700610func TransformObjToDynamicBinary(ctx android.ModuleContext,
611 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
612 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800613
614 var ldCmd string
615 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700616 ldCmd = "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800617 } else {
618 ldCmd = gccCmd(flags.toolchain, "g++")
619 }
620
Colin Cross3f40fa42015-01-30 17:27:36 -0800621 var libFlagsList []string
622
Colin Cross16b23492016-01-06 14:41:07 -0800623 if len(flags.libFlags) > 0 {
624 libFlagsList = append(libFlagsList, flags.libFlags)
625 }
626
Colin Cross3f40fa42015-01-30 17:27:36 -0800627 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800628 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700629 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700630 } else {
631 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700632 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700633 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
634 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800635 }
636
Colin Cross7a7cf972016-12-05 18:47:39 -0800637 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800638 libFlagsList = append(libFlagsList, "-Wl,--start-group")
639 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700640 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800641 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800642 libFlagsList = append(libFlagsList, "-Wl,--end-group")
643 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800644
Stephen Hines10347862016-07-18 15:54:54 -0700645 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700646 libFlagsList = append(libFlagsList, "-Wl,--start-group")
647 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700648 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700649 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700650 libFlagsList = append(libFlagsList, "-Wl,--end-group")
651 }
652
Colin Cross3f40fa42015-01-30 17:27:36 -0800653 for _, lib := range sharedLibs {
Dan Albert9840e1b2016-07-21 08:47:33 -0700654 libFlagsList = append(libFlagsList, lib.String())
Colin Cross3f40fa42015-01-30 17:27:36 -0800655 }
656
Colin Cross3f40fa42015-01-30 17:27:36 -0800657 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700658 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800659 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700660 if crtBegin.Valid() {
661 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800662 }
663
Colin Crossae887032017-10-23 17:16:14 -0700664 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700665 Rule: ld,
666 Description: "link " + outputFile.Base(),
667 Output: outputFile,
668 Inputs: objFiles,
669 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800670 Args: map[string]string{
Dan Albertce2b8392016-07-21 13:16:49 -0700671 "ldCmd": ldCmd,
672 "crtBegin": crtBegin.String(),
673 "libFlags": strings.Join(libFlagsList, " "),
674 "ldFlags": flags.ldFlags,
675 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800676 },
677 })
678}
679
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800680// Generate a rule to combine .dump sAbi dump files from multiple source files
681// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700682func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800683 baseName, exportedHeaderFlags string) android.OptionalPath {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800684 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800685 symbolFilterStr := "-so " + soFile.String()
Colin Crossae887032017-10-23 17:16:14 -0700686 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700687 Rule: sAbiLink,
688 Description: "header-abi-linker " + outputFile.Base(),
689 Output: outputFile,
690 Inputs: sAbiDumps,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800691 Implicit: soFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800692 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800693 "symbolFilter": symbolFilterStr,
694 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800695 "exportedHeaderFlags": exportedHeaderFlags,
696 },
697 })
698 return android.OptionalPathForPath(outputFile)
699}
700
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700701func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
702 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700703 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700704 Rule: unzipRefSAbiDump,
705 Description: "gunzip" + outputFile.Base(),
706 Output: outputFile,
707 Input: zippedRefDump,
708 })
709 return outputFile
710}
711
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800712func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chienf3511742017-10-31 18:04:35 +0800713 baseName, exportedHeaderFlags string, isVndkExt bool) android.OptionalPath {
714
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800715 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Logan Chienf3511742017-10-31 18:04:35 +0800716
Jayant Chowdharye4499502018-01-17 13:13:33 -0800717 localAbiCheckAllowFlags := append([]string(nil), abiCheckAllowFlags...)
718 if exportedHeaderFlags == "" {
719 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-advice-only")
720 }
Logan Chienf3511742017-10-31 18:04:35 +0800721 if isVndkExt {
722 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-allow-extensions")
723 }
724
Colin Crossae887032017-10-23 17:16:14 -0700725 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700726 Rule: sAbiDiff,
727 Description: "header-abi-diff " + outputFile.Base(),
728 Output: outputFile,
729 Input: inputDump,
730 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800731 Args: map[string]string{
732 "referenceDump": referenceDump.String(),
Jayant Chowdharyf54e0a72017-05-22 10:53:24 -0700733 "libName": baseName,
734 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdharye4499502018-01-17 13:13:33 -0800735 "allowFlags": strings.Join(localAbiCheckAllowFlags, " "),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800736 },
737 })
738 return android.OptionalPathForPath(outputFile)
739}
740
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700741// Generate a rule for extracting a table of contents from a shared library (.so)
742func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700743 outputFile android.WritablePath, flags builderFlags) {
744
745 crossCompile := gccCmd(flags.toolchain, "")
746
Colin Crossae887032017-10-23 17:16:14 -0700747 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700748 Rule: toc,
749 Description: "generate toc " + inputFile.Base(),
750 Output: outputFile,
751 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700752 Args: map[string]string{
753 "crossCompile": crossCompile,
754 },
755 })
756}
757
Colin Cross3f40fa42015-01-30 17:27:36 -0800758// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700759func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
760 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800761
Colin Cross41280a42015-11-23 14:01:42 -0800762 var ldCmd string
763 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700764 ldCmd = "${config.ClangBin}/clang++"
Colin Cross41280a42015-11-23 14:01:42 -0800765 } else {
766 ldCmd = gccCmd(flags.toolchain, "g++")
767 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800768
Colin Crossae887032017-10-23 17:16:14 -0700769 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700770 Rule: partialLd,
771 Description: "link " + outputFile.Base(),
772 Output: outputFile,
773 Inputs: objFiles,
Colin Cross3f40fa42015-01-30 17:27:36 -0800774 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700775 "ldCmd": ldCmd,
Colin Cross41280a42015-11-23 14:01:42 -0800776 "ldFlags": flags.ldFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800777 },
778 })
779}
780
Colin Crossbfae8852015-03-26 14:44:11 -0700781// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700782func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
783 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700784
785 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
786
Colin Crossae887032017-10-23 17:16:14 -0700787 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700788 Rule: prefixSymbols,
789 Description: "prefix symbols " + outputFile.Base(),
790 Output: outputFile,
791 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700792 Args: map[string]string{
793 "objcopyCmd": objcopyCmd,
794 "prefix": prefix,
795 },
796 })
797}
798
Colin Cross635c3b02016-05-18 15:37:25 -0700799func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
800 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700801
802 crossCompile := gccCmd(flags.toolchain, "")
803 args := ""
804 if flags.stripAddGnuDebuglink {
805 args += " --add-gnu-debuglink"
806 }
807 if flags.stripKeepMiniDebugInfo {
808 args += " --keep-mini-debug-info"
809 }
810 if flags.stripKeepSymbols {
811 args += " --keep-symbols"
812 }
813
Colin Crossae887032017-10-23 17:16:14 -0700814 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700815 Rule: strip,
816 Description: "strip " + outputFile.Base(),
817 Output: outputFile,
818 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700819 Args: map[string]string{
820 "crossCompile": crossCompile,
821 "args": args,
822 },
823 })
824}
825
Colin Cross635c3b02016-05-18 15:37:25 -0700826func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
827 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700828
Colin Crossae887032017-10-23 17:16:14 -0700829 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700830 Rule: darwinStrip,
831 Description: "strip " + outputFile.Base(),
832 Output: outputFile,
833 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700834 })
835}
836
Dan Willemsen581341d2017-02-09 16:16:31 -0800837func TransformCoverageFilesToLib(ctx android.ModuleContext,
838 inputs Objects, flags builderFlags, baseName string) android.OptionalPath {
839
840 if len(inputs.coverageFiles) > 0 {
841 outputFile := android.PathForModuleOut(ctx, baseName+".gcnodir")
842
843 TransformObjToStaticLib(ctx, inputs.coverageFiles, flags, outputFile, nil)
844
845 return android.OptionalPathForPath(outputFile)
846 }
847
848 return android.OptionalPath{}
849}
850
Colin Cross635c3b02016-05-18 15:37:25 -0700851func CopyGccLib(ctx android.ModuleContext, libName string,
852 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800853
Colin Crossae887032017-10-23 17:16:14 -0700854 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700855 Rule: copyGccLib,
856 Description: "copy gcc library " + libName,
857 Output: outputFile,
Colin Cross3f40fa42015-01-30 17:27:36 -0800858 Args: map[string]string{
859 "ccCmd": gccCmd(flags.toolchain, "gcc"),
860 "cFlags": flags.globalFlags,
861 "libName": libName,
862 },
863 })
864}
865
Colin Crossb98c8b02016-07-29 13:44:28 -0700866func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800867 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
868}
Colin Cross0af4b842015-04-30 16:36:18 -0700869
Colin Cross5b529592017-05-09 13:34:34 -0700870func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700871 var i int
872
873 start := 0
874 bytes := 0
875 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700876 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700877 if l > limit {
878 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
879 }
880 if bytes+l > limit {
881 lists = append(lists, list[start:i])
882 start = i
883 bytes = 0
884 }
885 bytes += l + 1 // count a space between each list element
886 }
887
888 lists = append(lists, list[start:])
889
890 totalLen := 0
891 for _, l := range lists {
892 totalLen += len(l)
893 }
894 if totalLen != len(list) {
895 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
896 }
897 return lists, nil
898}