blob: de85d6e7f58608916747d011d2a9e44bc07a8aff [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{
41 "-allow-extensions",
42 "-allow-unreferenced-changes",
43 "-allow-unreferenced-elf-symbol-changes",
44 }
45)
46
47var (
Colin Cross635c3b02016-05-18 15:37:25 -070048 pctx = android.NewPackageContext("android/soong/cc")
Colin Cross3f40fa42015-01-30 17:27:36 -080049
Colin Cross9d45bb72016-08-29 16:14:13 -070050 cc = pctx.AndroidGomaStaticRule("cc",
Colin Cross3f40fa42015-01-30 17:27:36 -080051 blueprint.RuleParams{
52 Depfile: "${out}.d",
53 Deps: blueprint.DepsGCC,
Alistair Strachan777475c2016-08-26 12:55:49 -070054 Command: "$relPwd ${config.CcWrapper}$ccCmd -c $cFlags -MD -MF ${out}.d -o $out $in",
Dan Willemsenc94a7682015-11-17 15:27:28 -080055 CommandDeps: []string{"$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080056 },
Dan Willemsen322a0a62015-11-17 15:19:46 -080057 "ccCmd", "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080058
Colin Cross9d45bb72016-08-29 16:14:13 -070059 ld = pctx.AndroidStaticRule("ld",
Colin Cross3f40fa42015-01-30 17:27:36 -080060 blueprint.RuleParams{
Dan Albertce2b8392016-07-21 13:16:49 -070061 Command: "$ldCmd ${crtBegin} @${out}.rsp " +
Colin Cross28344522015-04-22 13:07:53 -070062 "${libFlags} ${crtEnd} -o ${out} ${ldFlags}",
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 Cross3f40fa42015-01-30 17:27:36 -080066 },
Dan Albertce2b8392016-07-21 13:16:49 -070067 "ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080068
Colin Cross9d45bb72016-08-29 16:14:13 -070069 partialLd = pctx.AndroidStaticRule("partialLd",
Colin Cross3f40fa42015-01-30 17:27:36 -080070 blueprint.RuleParams{
Colin Cross41280a42015-11-23 14:01:42 -080071 Command: "$ldCmd -nostdlib -Wl,-r ${in} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080072 CommandDeps: []string{"$ldCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080073 },
Colin Cross41280a42015-11-23 14:01:42 -080074 "ldCmd", "ldFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080075
Colin Cross9d45bb72016-08-29 16:14:13 -070076 ar = pctx.AndroidStaticRule("ar",
Colin Cross3f40fa42015-01-30 17:27:36 -080077 blueprint.RuleParams{
Colin Cross7d21c442015-03-30 17:47:53 -070078 Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
Dan Willemsenc94a7682015-11-17 15:27:28 -080079 CommandDeps: []string{"$arCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070080 Rspfile: "${out}.rsp",
81 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080082 },
83 "arCmd", "arFlags")
84
Colin Cross9d45bb72016-08-29 16:14:13 -070085 darwinAr = pctx.AndroidStaticRule("darwinAr",
Colin Cross0af4b842015-04-30 16:36:18 -070086 blueprint.RuleParams{
Colin Crossb98c8b02016-07-29 13:44:28 -070087 Command: "rm -f ${out} && ${config.MacArPath} $arFlags $out $in",
88 CommandDeps: []string{"${config.MacArPath}"},
Colin Cross0af4b842015-04-30 16:36:18 -070089 },
Colin Crossb8ecdfe2016-05-03 15:10:29 -070090 "arFlags")
Colin Cross0af4b842015-04-30 16:36:18 -070091
Colin Cross9d45bb72016-08-29 16:14:13 -070092 darwinAppendAr = pctx.AndroidStaticRule("darwinAppendAr",
Colin Cross0af4b842015-04-30 16:36:18 -070093 blueprint.RuleParams{
Colin Crossb98c8b02016-07-29 13:44:28 -070094 Command: "cp -f ${inAr} ${out}.tmp && ${config.MacArPath} $arFlags ${out}.tmp $in && mv ${out}.tmp ${out}",
95 CommandDeps: []string{"${config.MacArPath}", "${inAr}"},
Colin Cross0af4b842015-04-30 16:36:18 -070096 },
Colin Crossb8ecdfe2016-05-03 15:10:29 -070097 "arFlags", "inAr")
98
Colin Cross9d45bb72016-08-29 16:14:13 -070099 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700100 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -0700101 Command: "${config.MacStripPath} -u -r -o $out $in",
102 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700103 })
Colin Cross0af4b842015-04-30 16:36:18 -0700104
Colin Cross9d45bb72016-08-29 16:14:13 -0700105 prefixSymbols = pctx.AndroidStaticRule("prefixSymbols",
Colin Crossbfae8852015-03-26 14:44:11 -0700106 blueprint.RuleParams{
107 Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800108 CommandDeps: []string{"$objcopyCmd"},
Colin Crossbfae8852015-03-26 14:44:11 -0700109 },
110 "objcopyCmd", "prefix")
111
Nan Zhang43a485c2017-03-27 14:27:58 -0700112 _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh")
Colin Cross665dce92016-04-28 14:50:03 -0700113
Colin Cross9d45bb72016-08-29 16:14:13 -0700114 strip = pctx.AndroidStaticRule("strip",
Colin Cross665dce92016-04-28 14:50:03 -0700115 blueprint.RuleParams{
116 Depfile: "${out}.d",
117 Deps: blueprint.DepsGCC,
118 Command: "CROSS_COMPILE=$crossCompile $stripPath ${args} -i ${in} -o ${out} -d ${out}.d",
119 CommandDeps: []string{"$stripPath"},
Colin Cross665dce92016-04-28 14:50:03 -0700120 },
121 "args", "crossCompile")
122
Colin Cross9d45bb72016-08-29 16:14:13 -0700123 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700124 blueprint.RuleParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700125 Command: "rm -f $out && touch $out",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700126 })
127
Nan Zhang43a485c2017-03-27 14:27:58 -0700128 _ = pctx.SourcePathVariable("copyGccLibPath", "build/soong/scripts/copygcclib.sh")
Colin Cross3f40fa42015-01-30 17:27:36 -0800129
Colin Cross9d45bb72016-08-29 16:14:13 -0700130 copyGccLib = pctx.AndroidStaticRule("copyGccLib",
Colin Cross3f40fa42015-01-30 17:27:36 -0800131 blueprint.RuleParams{
132 Depfile: "${out}.d",
133 Deps: blueprint.DepsGCC,
134 Command: "$copyGccLibPath $out $ccCmd $cFlags -print-file-name=${libName}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800135 CommandDeps: []string{"$copyGccLibPath", "$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -0800136 },
137 "ccCmd", "cFlags", "libName")
Colin Cross26c34ed2016-09-30 17:10:16 -0700138
Nan Zhang43a485c2017-03-27 14:27:58 -0700139 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700140
141 toc = pctx.AndroidStaticRule("toc",
142 blueprint.RuleParams{
143 Depfile: "${out}.d",
144 Deps: blueprint.DepsGCC,
145 Command: "CROSS_COMPILE=$crossCompile $tocPath -i ${in} -o ${out} -d ${out}.d",
146 CommandDeps: []string{"$tocPath"},
147 Restat: true,
148 },
149 "crossCompile")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700150
151 clangTidy = pctx.AndroidStaticRule("clangTidy",
152 blueprint.RuleParams{
153 Command: "rm -f $out && ${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out",
154 CommandDeps: []string{"${config.ClangBin}/clang-tidy"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700155 },
156 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800157
Nan Zhang43a485c2017-03-27 14:27:58 -0700158 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800159
160 yasm = pctx.AndroidStaticRule("yasm",
161 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700162 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800163 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700164 Depfile: "$out.d",
165 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800166 },
167 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800168
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700169 windres = pctx.AndroidStaticRule("windres",
170 blueprint.RuleParams{
171 Command: "$windresCmd $flags -I$$(dirname $in) -i $in -o $out",
172 CommandDeps: []string{"$windresCmd"},
173 },
174 "windresCmd", "flags")
175
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800176 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
177
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700178 // -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 -0800179 sAbiDump = pctx.AndroidStaticRule("sAbiDump",
180 blueprint.RuleParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700181 Command: "rm -f $out && $sAbiDumper -o ${out} $in $exportDirs -- $cFlags -w -isystem ${config.RSIncludePath}",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800182 CommandDeps: []string{"$sAbiDumper"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800183 },
184 "cFlags", "exportDirs")
185
186 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
187
188 sAbiLink = pctx.AndroidStaticRule("sAbiLink",
189 blueprint.RuleParams{
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700190 Command: "$sAbiLinker -o ${out} $symbolFilter -arch $arch -api $api $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800191 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800192 Rspfile: "${out}.rsp",
193 RspfileContent: "${in}",
194 },
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700195 "symbolFilter", "arch", "api", "exportedHeaderFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800196
197 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700198
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800199 sAbiDiff = pctx.AndroidRuleFunc("sAbiDiff",
200 func(config android.Config) (blueprint.RuleParams, error) {
201
202 commandStr := "($sAbiDiffer $allowFlags -lib $libName -arch $arch -check-all-apis -o ${out} -new $in -old $referenceDump)"
203 distDir := config.ProductVariables.DistDir
204 if distDir != nil && *distDir != "" {
205 distAbiDiffDir := *distDir + "/abidiffs/"
206 commandStr += " || (mkdir -p " + distAbiDiffDir + " && cp ${out} " + distAbiDiffDir + " && exit 1)"
207 }
208 return blueprint.RuleParams{
209 Command: commandStr,
210 CommandDeps: []string{"$sAbiDiffer"},
211 }, nil
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800212 },
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -0700213 "allowFlags", "referenceDump", "libName", "arch")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700214
215 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
216 blueprint.RuleParams{
217 Command: "gunzip -c $in > $out",
218 })
Colin Cross3f40fa42015-01-30 17:27:36 -0800219)
220
Dan Willemsen322a0a62015-11-17 15:19:46 -0800221func init() {
222 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
223 // debug output. That way two builds in two different directories will
224 // create the same output.
225 if runtime.GOOS != "darwin" {
226 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
227 } else {
228 // Darwin doesn't have /proc
229 pctx.StaticVariable("relPwd", "")
230 }
231}
232
Colin Cross3f40fa42015-01-30 17:27:36 -0800233type builderFlags struct {
Joe Onorato09e94ab2017-11-18 18:23:14 -0800234 globalFlags string
235 arFlags string
236 asFlags string
237 cFlags string
238 toolingCFlags string // A separate set of Cflags for clang LibTooling tools
239 conlyFlags string
240 cppFlags string
241 ldFlags string
242 libFlags string
243 yaccFlags string
244 protoFlags string
245 protoOutParams string
246 tidyFlags string
247 sAbiFlags string
248 yasmFlags string
249 aidlFlags string
250 rsFlags string
251 toolchain config.Toolchain
252 clang bool
253 tidy bool
254 coverage bool
255 sAbiDump bool
Colin Cross665dce92016-04-28 14:50:03 -0700256
Colin Crossc3199482017-03-30 15:03:04 -0700257 systemIncludeFlags string
258
Colin Cross18c0c5a2016-12-01 14:45:23 -0800259 groupStaticLibs bool
260
Colin Cross665dce92016-04-28 14:50:03 -0700261 stripKeepSymbols bool
262 stripKeepMiniDebugInfo bool
263 stripAddGnuDebuglink bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800264}
265
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700266type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800267 objFiles android.Paths
268 tidyFiles android.Paths
269 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800270 sAbiDumpFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700271}
272
273func (a Objects) Copy() Objects {
274 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800275 objFiles: append(android.Paths{}, a.objFiles...),
276 tidyFiles: append(android.Paths{}, a.tidyFiles...),
277 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800278 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700279 }
280}
281
282func (a Objects) Append(b Objects) Objects {
283 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800284 objFiles: append(a.objFiles, b.objFiles...),
285 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
286 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800287 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700288 }
289}
290
Colin Cross3f40fa42015-01-30 17:27:36 -0800291// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700292func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainar70ba5a32017-12-19 15:11:01 -0800293 flags builderFlags, pathDeps android.Paths, genDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700294
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700295 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700296 var tidyFiles android.Paths
297 if flags.tidy && flags.clang {
298 tidyFiles = make(android.Paths, 0, len(srcFiles))
299 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800300 var coverageFiles android.Paths
301 if flags.coverage {
302 coverageFiles = make(android.Paths, 0, len(srcFiles))
303 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800304
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700305 commonFlags := strings.Join([]string{
Colin Crossc3199482017-03-30 15:03:04 -0700306 flags.globalFlags,
307 flags.systemIncludeFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700308 }, " ")
309
310 toolingCflags := strings.Join([]string{
311 commonFlags,
312 flags.toolingCFlags,
313 flags.conlyFlags,
314 }, " ")
315
316 cflags := strings.Join([]string{
317 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700318 flags.cFlags,
319 flags.conlyFlags,
320 }, " ")
321
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700322 toolingCppflags := strings.Join([]string{
323 commonFlags,
324 flags.toolingCFlags,
325 flags.cppFlags,
326 }, " ")
327
Colin Crossc3199482017-03-30 15:03:04 -0700328 cppflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700329 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700330 flags.cFlags,
331 flags.cppFlags,
332 }, " ")
333
334 asflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700335 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700336 flags.asFlags,
337 }, " ")
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700338
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800339 var sAbiDumpFiles android.Paths
340 if flags.sAbiDump && flags.clang {
341 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
342 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800343
Dan Willemsenbe03f342016-03-03 17:21:04 -0800344 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700345 cflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700346 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700347 cppflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700348 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800349 } else {
Colin Crossb98c8b02016-07-29 13:44:28 -0700350 cflags += " ${config.NoOverrideGlobalCflags}"
351 cppflags += " ${config.NoOverrideGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800352 }
353
Colin Cross3f40fa42015-01-30 17:27:36 -0800354 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700355 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800356
357 objFiles[i] = objFile
358
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700359 switch srcFile.Ext() {
360 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700361 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700362 Rule: yasm,
363 Description: "yasm " + srcFile.Rel(),
364 Output: objFile,
365 Input: srcFile,
Pirama Arumuga Nainar70ba5a32017-12-19 15:11:01 -0800366 Implicits: pathDeps,
367 OrderOnly: genDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800368 Args: map[string]string{
369 "asFlags": flags.yasmFlags,
370 },
371 })
372 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700373 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700374 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700375 Rule: windres,
376 Description: "windres " + srcFile.Rel(),
377 Output: objFile,
378 Input: srcFile,
Pirama Arumuga Nainar70ba5a32017-12-19 15:11:01 -0800379 Implicits: pathDeps,
380 OrderOnly: genDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700381 Args: map[string]string{
382 "windresCmd": gccCmd(flags.toolchain, "windres"),
383 "flags": flags.toolchain.WindresFlags(),
384 },
385 })
386 continue
Colin Cross91e90042016-12-02 17:13:24 -0800387 }
388
Colin Cross3f40fa42015-01-30 17:27:36 -0800389 var moduleCflags string
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700390 var moduleToolingCflags string
Colin Cross3f40fa42015-01-30 17:27:36 -0800391 var ccCmd string
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700392 tidy := flags.tidy && flags.clang
Dan Willemsen581341d2017-02-09 16:16:31 -0800393 coverage := flags.coverage
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800394 dump := flags.sAbiDump && flags.clang
Colin Cross3f40fa42015-01-30 17:27:36 -0800395
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700396 switch srcFile.Ext() {
Colin Cross3f40fa42015-01-30 17:27:36 -0800397 case ".S", ".s":
398 ccCmd = "gcc"
399 moduleCflags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700400 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800401 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800402 dump = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800403 case ".c":
404 ccCmd = "gcc"
405 moduleCflags = cflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700406 moduleToolingCflags = toolingCflags
Colin Cross9978ffe2016-12-01 15:31:22 -0800407 case ".cpp", ".cc", ".mm":
Colin Cross3f40fa42015-01-30 17:27:36 -0800408 ccCmd = "g++"
409 moduleCflags = cppflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700410 moduleToolingCflags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800411 default:
412 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
413 continue
414 }
415
416 if flags.clang {
417 switch ccCmd {
418 case "gcc":
419 ccCmd = "clang"
420 case "g++":
421 ccCmd = "clang++"
422 default:
423 panic("unrecoginzied ccCmd")
424 }
Colin Cross67a5c132017-05-09 13:45:28 -0700425 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800426
Colin Cross67a5c132017-05-09 13:45:28 -0700427 ccDesc := ccCmd
428
429 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700430 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800431 } else {
432 ccCmd = gccCmd(flags.toolchain, ccCmd)
433 }
434
Dan Willemsen581341d2017-02-09 16:16:31 -0800435 var implicitOutputs android.WritablePaths
436 if coverage {
437 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
438 implicitOutputs = append(implicitOutputs, gcnoFile)
439 coverageFiles = append(coverageFiles, gcnoFile)
440 }
441
Colin Crossae887032017-10-23 17:16:14 -0700442 ctx.Build(pctx, android.BuildParams{
Dan Willemsen581341d2017-02-09 16:16:31 -0800443 Rule: cc,
Colin Cross67a5c132017-05-09 13:45:28 -0700444 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800445 Output: objFile,
446 ImplicitOutputs: implicitOutputs,
447 Input: srcFile,
Pirama Arumuga Nainar70ba5a32017-12-19 15:11:01 -0800448 Implicits: pathDeps,
449 OrderOnly: genDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800450 Args: map[string]string{
Colin Cross28344522015-04-22 13:07:53 -0700451 "cFlags": moduleCflags,
452 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800453 },
454 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700455
456 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700457 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700458 tidyFiles = append(tidyFiles, tidyFile)
459
Colin Crossae887032017-10-23 17:16:14 -0700460 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700461 Rule: clangTidy,
462 Description: "clang-tidy " + srcFile.Rel(),
463 Output: tidyFile,
464 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700465 // We must depend on objFile, since clang-tidy doesn't
466 // support exporting dependencies.
467 Implicit: objFile,
468 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700469 "cFlags": moduleToolingCflags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700470 "tidyFlags": flags.tidyFlags,
471 },
472 })
473 }
474
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800475 if dump {
476 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
477 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
478
Colin Crossae887032017-10-23 17:16:14 -0700479 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700480 Rule: sAbiDump,
481 Description: "header-abi-dumper " + srcFile.Rel(),
482 Output: sAbiDumpFile,
483 Input: srcFile,
484 Implicit: objFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800485 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700486 "cFlags": moduleToolingCflags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800487 "exportDirs": flags.sAbiFlags,
488 },
489 })
490 }
491
Colin Cross3f40fa42015-01-30 17:27:36 -0800492 }
493
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700494 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800495 objFiles: objFiles,
496 tidyFiles: tidyFiles,
497 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800498 sAbiDumpFiles: sAbiDumpFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700499 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800500}
501
502// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700503func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700504 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800505
Dan Willemsen581341d2017-02-09 16:16:31 -0800506 if ctx.Darwin() {
507 transformDarwinObjToStaticLib(ctx, objFiles, flags, outputFile, deps)
508 return
509 }
510
Colin Cross3f40fa42015-01-30 17:27:36 -0800511 arCmd := gccCmd(flags.toolchain, "ar")
512 arFlags := "crsPD"
Vishwath Mohan83d9f712017-03-16 11:01:23 -0700513 if flags.arFlags != "" {
514 arFlags += " " + flags.arFlags
515 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800516
Colin Crossae887032017-10-23 17:16:14 -0700517 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700518 Rule: ar,
519 Description: "static link " + outputFile.Base(),
520 Output: outputFile,
521 Inputs: objFiles,
522 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800523 Args: map[string]string{
524 "arFlags": arFlags,
525 "arCmd": arCmd,
526 },
527 })
528}
529
Colin Cross0af4b842015-04-30 16:36:18 -0700530// Generate a rule for compiling multiple .o files to a static library (.a) on
531// darwin. The darwin ar tool doesn't support @file for list files, and has a
532// very small command line length limit, so we have to split the ar into multiple
533// steps, each appending to the previous one.
Dan Willemsen581341d2017-02-09 16:16:31 -0800534func transformDarwinObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Colin Cross5b529592017-05-09 13:34:34 -0700535 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross0af4b842015-04-30 16:36:18 -0700536
Colin Cross0af4b842015-04-30 16:36:18 -0700537 arFlags := "cqs"
538
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700539 if len(objFiles) == 0 {
Colin Cross635c3b02016-05-18 15:37:25 -0700540 dummy := android.PathForModuleOut(ctx, "dummy"+objectExtension)
541 dummyAr := android.PathForModuleOut(ctx, "dummy"+staticLibraryExtension)
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700542
Colin Crossae887032017-10-23 17:16:14 -0700543 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700544 Rule: emptyFile,
545 Description: "empty object file",
546 Output: dummy,
547 Implicits: deps,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700548 })
549
Colin Crossae887032017-10-23 17:16:14 -0700550 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700551 Rule: darwinAr,
552 Description: "empty static archive",
553 Output: dummyAr,
554 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700555 Args: map[string]string{
556 "arFlags": arFlags,
557 },
558 })
559
Colin Crossae887032017-10-23 17:16:14 -0700560 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700561 Rule: darwinAppendAr,
562 Description: "static link " + outputFile.Base(),
563 Output: outputFile,
564 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700565 Args: map[string]string{
566 "arFlags": "d",
567 "inAr": dummyAr.String(),
568 },
569 })
570
571 return
572 }
573
Colin Cross0af4b842015-04-30 16:36:18 -0700574 // ARG_MAX on darwin is 262144, use half that to be safe
Colin Cross5b529592017-05-09 13:34:34 -0700575 objFilesLists, err := splitListForSize(objFiles, 131072)
Colin Cross0af4b842015-04-30 16:36:18 -0700576 if err != nil {
577 ctx.ModuleErrorf("%s", err.Error())
578 }
579
Colin Cross5b529592017-05-09 13:34:34 -0700580 var in, out android.WritablePath
Colin Cross0af4b842015-04-30 16:36:18 -0700581 for i, l := range objFilesLists {
582 in = out
583 out = outputFile
584 if i != len(objFilesLists)-1 {
Colin Cross5b529592017-05-09 13:34:34 -0700585 out = android.PathForModuleOut(ctx, outputFile.Base()+strconv.Itoa(i))
Colin Cross0af4b842015-04-30 16:36:18 -0700586 }
587
Colin Crossae887032017-10-23 17:16:14 -0700588 build := android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700589 Rule: darwinAr,
590 Description: "static link " + out.Base(),
591 Output: out,
592 Inputs: l,
593 Implicits: deps,
Colin Cross5b529592017-05-09 13:34:34 -0700594 Args: map[string]string{
595 "arFlags": arFlags,
596 },
Colin Cross0af4b842015-04-30 16:36:18 -0700597 }
Colin Cross5b529592017-05-09 13:34:34 -0700598 if i != 0 {
599 build.Rule = darwinAppendAr
600 build.Args["inAr"] = in.String()
601 }
Colin Crossae887032017-10-23 17:16:14 -0700602 ctx.Build(pctx, build)
Colin Cross0af4b842015-04-30 16:36:18 -0700603 }
604}
605
Colin Cross3f40fa42015-01-30 17:27:36 -0800606// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700607// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700608func TransformObjToDynamicBinary(ctx android.ModuleContext,
609 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
610 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800611
612 var ldCmd string
613 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700614 ldCmd = "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800615 } else {
616 ldCmd = gccCmd(flags.toolchain, "g++")
617 }
618
Colin Cross3f40fa42015-01-30 17:27:36 -0800619 var libFlagsList []string
620
Colin Cross16b23492016-01-06 14:41:07 -0800621 if len(flags.libFlags) > 0 {
622 libFlagsList = append(libFlagsList, flags.libFlags)
623 }
624
Colin Cross3f40fa42015-01-30 17:27:36 -0800625 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800626 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700627 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700628 } else {
629 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700630 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700631 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
632 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800633 }
634
Colin Cross7a7cf972016-12-05 18:47:39 -0800635 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800636 libFlagsList = append(libFlagsList, "-Wl,--start-group")
637 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700638 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800639 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800640 libFlagsList = append(libFlagsList, "-Wl,--end-group")
641 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800642
Stephen Hines10347862016-07-18 15:54:54 -0700643 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700644 libFlagsList = append(libFlagsList, "-Wl,--start-group")
645 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700646 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700647 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700648 libFlagsList = append(libFlagsList, "-Wl,--end-group")
649 }
650
Colin Cross3f40fa42015-01-30 17:27:36 -0800651 for _, lib := range sharedLibs {
Dan Albert9840e1b2016-07-21 08:47:33 -0700652 libFlagsList = append(libFlagsList, lib.String())
Colin Cross3f40fa42015-01-30 17:27:36 -0800653 }
654
Colin Cross3f40fa42015-01-30 17:27:36 -0800655 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700656 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800657 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700658 if crtBegin.Valid() {
659 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800660 }
661
Colin Crossae887032017-10-23 17:16:14 -0700662 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700663 Rule: ld,
664 Description: "link " + outputFile.Base(),
665 Output: outputFile,
666 Inputs: objFiles,
667 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800668 Args: map[string]string{
Dan Albertce2b8392016-07-21 13:16:49 -0700669 "ldCmd": ldCmd,
670 "crtBegin": crtBegin.String(),
671 "libFlags": strings.Join(libFlagsList, " "),
672 "ldFlags": flags.ldFlags,
673 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800674 },
675 })
676}
677
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800678// Generate a rule to combine .dump sAbi dump files from multiple source files
679// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700680func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800681 symbolFile android.OptionalPath, apiLevel, baseName, exportedHeaderFlags string) android.OptionalPath {
682 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700683 var symbolFilterStr string
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800684 var linkedDumpDep android.Path
685 if symbolFile.Valid() {
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700686 symbolFilterStr = "-v " + symbolFile.Path().String()
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800687 linkedDumpDep = symbolFile.Path()
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700688 } else {
689 linkedDumpDep = soFile
690 symbolFilterStr = "-so " + soFile.String()
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800691 }
Colin Crossae887032017-10-23 17:16:14 -0700692 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700693 Rule: sAbiLink,
694 Description: "header-abi-linker " + outputFile.Base(),
695 Output: outputFile,
696 Inputs: sAbiDumps,
697 Implicit: linkedDumpDep,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800698 Args: map[string]string{
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700699 "symbolFilter": symbolFilterStr,
700 "arch": ctx.Arch().ArchType.Name,
701 "api": apiLevel,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800702 "exportedHeaderFlags": exportedHeaderFlags,
703 },
704 })
705 return android.OptionalPathForPath(outputFile)
706}
707
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700708func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
709 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700710 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700711 Rule: unzipRefSAbiDump,
712 Description: "gunzip" + outputFile.Base(),
713 Output: outputFile,
714 Input: zippedRefDump,
715 })
716 return outputFile
717}
718
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800719func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
720 baseName string) android.OptionalPath {
721 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Colin Crossae887032017-10-23 17:16:14 -0700722 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700723 Rule: sAbiDiff,
724 Description: "header-abi-diff " + outputFile.Base(),
725 Output: outputFile,
726 Input: inputDump,
727 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800728 Args: map[string]string{
729 "referenceDump": referenceDump.String(),
Jayant Chowdharyf54e0a72017-05-22 10:53:24 -0700730 "libName": baseName,
731 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -0700732 "allowFlags": strings.Join(abiCheckAllowFlags, " "),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800733 },
734 })
735 return android.OptionalPathForPath(outputFile)
736}
737
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700738// Generate a rule for extracting a table of contents from a shared library (.so)
739func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700740 outputFile android.WritablePath, flags builderFlags) {
741
742 crossCompile := gccCmd(flags.toolchain, "")
743
Colin Crossae887032017-10-23 17:16:14 -0700744 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700745 Rule: toc,
746 Description: "generate toc " + inputFile.Base(),
747 Output: outputFile,
748 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700749 Args: map[string]string{
750 "crossCompile": crossCompile,
751 },
752 })
753}
754
Colin Cross3f40fa42015-01-30 17:27:36 -0800755// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700756func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
757 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800758
Colin Cross41280a42015-11-23 14:01:42 -0800759 var ldCmd string
760 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700761 ldCmd = "${config.ClangBin}/clang++"
Colin Cross41280a42015-11-23 14:01:42 -0800762 } else {
763 ldCmd = gccCmd(flags.toolchain, "g++")
764 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800765
Colin Crossae887032017-10-23 17:16:14 -0700766 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700767 Rule: partialLd,
768 Description: "link " + outputFile.Base(),
769 Output: outputFile,
770 Inputs: objFiles,
Colin Cross3f40fa42015-01-30 17:27:36 -0800771 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700772 "ldCmd": ldCmd,
Colin Cross41280a42015-11-23 14:01:42 -0800773 "ldFlags": flags.ldFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800774 },
775 })
776}
777
Colin Crossbfae8852015-03-26 14:44:11 -0700778// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700779func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
780 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700781
782 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
783
Colin Crossae887032017-10-23 17:16:14 -0700784 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700785 Rule: prefixSymbols,
786 Description: "prefix symbols " + outputFile.Base(),
787 Output: outputFile,
788 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700789 Args: map[string]string{
790 "objcopyCmd": objcopyCmd,
791 "prefix": prefix,
792 },
793 })
794}
795
Colin Cross635c3b02016-05-18 15:37:25 -0700796func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
797 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700798
799 crossCompile := gccCmd(flags.toolchain, "")
800 args := ""
801 if flags.stripAddGnuDebuglink {
802 args += " --add-gnu-debuglink"
803 }
804 if flags.stripKeepMiniDebugInfo {
805 args += " --keep-mini-debug-info"
806 }
807 if flags.stripKeepSymbols {
808 args += " --keep-symbols"
809 }
810
Colin Crossae887032017-10-23 17:16:14 -0700811 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700812 Rule: strip,
813 Description: "strip " + outputFile.Base(),
814 Output: outputFile,
815 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700816 Args: map[string]string{
817 "crossCompile": crossCompile,
818 "args": args,
819 },
820 })
821}
822
Colin Cross635c3b02016-05-18 15:37:25 -0700823func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
824 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700825
Colin Crossae887032017-10-23 17:16:14 -0700826 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700827 Rule: darwinStrip,
828 Description: "strip " + outputFile.Base(),
829 Output: outputFile,
830 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700831 })
832}
833
Dan Willemsen581341d2017-02-09 16:16:31 -0800834func TransformCoverageFilesToLib(ctx android.ModuleContext,
835 inputs Objects, flags builderFlags, baseName string) android.OptionalPath {
836
837 if len(inputs.coverageFiles) > 0 {
838 outputFile := android.PathForModuleOut(ctx, baseName+".gcnodir")
839
840 TransformObjToStaticLib(ctx, inputs.coverageFiles, flags, outputFile, nil)
841
842 return android.OptionalPathForPath(outputFile)
843 }
844
845 return android.OptionalPath{}
846}
847
Colin Cross635c3b02016-05-18 15:37:25 -0700848func CopyGccLib(ctx android.ModuleContext, libName string,
849 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800850
Colin Crossae887032017-10-23 17:16:14 -0700851 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700852 Rule: copyGccLib,
853 Description: "copy gcc library " + libName,
854 Output: outputFile,
Colin Cross3f40fa42015-01-30 17:27:36 -0800855 Args: map[string]string{
856 "ccCmd": gccCmd(flags.toolchain, "gcc"),
857 "cFlags": flags.globalFlags,
858 "libName": libName,
859 },
860 })
861}
862
Colin Crossb98c8b02016-07-29 13:44:28 -0700863func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800864 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
865}
Colin Cross0af4b842015-04-30 16:36:18 -0700866
Colin Cross5b529592017-05-09 13:34:34 -0700867func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700868 var i int
869
870 start := 0
871 bytes := 0
872 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700873 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700874 if l > limit {
875 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
876 }
877 if bytes+l > limit {
878 lists = append(lists, list[start:i])
879 start = i
880 bytes = 0
881 }
882 bytes += l + 1 // count a space between each list element
883 }
884
885 lists = append(lists, list[start:])
886
887 totalLen := 0
888 for _, l := range lists {
889 totalLen += len(l)
890 }
891 if totalLen != len(list) {
892 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
893 }
894 return lists, nil
895}