blob: 1e1c4f23a036e8fcda40ff8dbfe374818feaa825 [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 Chowdharydf344d52018-01-17 11:11:42 -0800190 Command: "$sAbiLinker -o ${out} $symbolFilter -arch $arch $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 Chowdharydf344d52018-01-17 11:11:42 -0800195 "symbolFilter", "arch", "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
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800511 arCmd := "${config.ClangBin}/llvm-ar"
512 arFlags := "crsD"
513 if !ctx.Darwin() {
514 arFlags += " -format=gnu"
515 }
Vishwath Mohan83d9f712017-03-16 11:01:23 -0700516 if flags.arFlags != "" {
517 arFlags += " " + flags.arFlags
518 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800519
Colin Crossae887032017-10-23 17:16:14 -0700520 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700521 Rule: ar,
522 Description: "static link " + outputFile.Base(),
523 Output: outputFile,
524 Inputs: objFiles,
525 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800526 Args: map[string]string{
527 "arFlags": arFlags,
528 "arCmd": arCmd,
529 },
530 })
531}
532
Colin Cross0af4b842015-04-30 16:36:18 -0700533// Generate a rule for compiling multiple .o files to a static library (.a) on
534// darwin. The darwin ar tool doesn't support @file for list files, and has a
535// very small command line length limit, so we have to split the ar into multiple
536// steps, each appending to the previous one.
Dan Willemsen581341d2017-02-09 16:16:31 -0800537func transformDarwinObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Colin Cross5b529592017-05-09 13:34:34 -0700538 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross0af4b842015-04-30 16:36:18 -0700539
Colin Cross0af4b842015-04-30 16:36:18 -0700540 arFlags := "cqs"
541
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700542 if len(objFiles) == 0 {
Colin Cross635c3b02016-05-18 15:37:25 -0700543 dummy := android.PathForModuleOut(ctx, "dummy"+objectExtension)
544 dummyAr := android.PathForModuleOut(ctx, "dummy"+staticLibraryExtension)
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700545
Colin Crossae887032017-10-23 17:16:14 -0700546 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700547 Rule: emptyFile,
548 Description: "empty object file",
549 Output: dummy,
550 Implicits: deps,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700551 })
552
Colin Crossae887032017-10-23 17:16:14 -0700553 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700554 Rule: darwinAr,
555 Description: "empty static archive",
556 Output: dummyAr,
557 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700558 Args: map[string]string{
559 "arFlags": arFlags,
560 },
561 })
562
Colin Crossae887032017-10-23 17:16:14 -0700563 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700564 Rule: darwinAppendAr,
565 Description: "static link " + outputFile.Base(),
566 Output: outputFile,
567 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700568 Args: map[string]string{
569 "arFlags": "d",
570 "inAr": dummyAr.String(),
571 },
572 })
573
574 return
575 }
576
Colin Cross0af4b842015-04-30 16:36:18 -0700577 // ARG_MAX on darwin is 262144, use half that to be safe
Colin Cross5b529592017-05-09 13:34:34 -0700578 objFilesLists, err := splitListForSize(objFiles, 131072)
Colin Cross0af4b842015-04-30 16:36:18 -0700579 if err != nil {
580 ctx.ModuleErrorf("%s", err.Error())
581 }
582
Colin Cross5b529592017-05-09 13:34:34 -0700583 var in, out android.WritablePath
Colin Cross0af4b842015-04-30 16:36:18 -0700584 for i, l := range objFilesLists {
585 in = out
586 out = outputFile
587 if i != len(objFilesLists)-1 {
Colin Cross5b529592017-05-09 13:34:34 -0700588 out = android.PathForModuleOut(ctx, outputFile.Base()+strconv.Itoa(i))
Colin Cross0af4b842015-04-30 16:36:18 -0700589 }
590
Colin Crossae887032017-10-23 17:16:14 -0700591 build := android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700592 Rule: darwinAr,
593 Description: "static link " + out.Base(),
594 Output: out,
595 Inputs: l,
596 Implicits: deps,
Colin Cross5b529592017-05-09 13:34:34 -0700597 Args: map[string]string{
598 "arFlags": arFlags,
599 },
Colin Cross0af4b842015-04-30 16:36:18 -0700600 }
Colin Cross5b529592017-05-09 13:34:34 -0700601 if i != 0 {
602 build.Rule = darwinAppendAr
603 build.Args["inAr"] = in.String()
604 }
Colin Crossae887032017-10-23 17:16:14 -0700605 ctx.Build(pctx, build)
Colin Cross0af4b842015-04-30 16:36:18 -0700606 }
607}
608
Colin Cross3f40fa42015-01-30 17:27:36 -0800609// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700610// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700611func TransformObjToDynamicBinary(ctx android.ModuleContext,
612 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
613 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800614
615 var ldCmd string
616 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700617 ldCmd = "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800618 } else {
619 ldCmd = gccCmd(flags.toolchain, "g++")
620 }
621
Colin Cross3f40fa42015-01-30 17:27:36 -0800622 var libFlagsList []string
623
Colin Cross16b23492016-01-06 14:41:07 -0800624 if len(flags.libFlags) > 0 {
625 libFlagsList = append(libFlagsList, flags.libFlags)
626 }
627
Colin Cross3f40fa42015-01-30 17:27:36 -0800628 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800629 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700630 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700631 } else {
632 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700633 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700634 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
635 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800636 }
637
Colin Cross7a7cf972016-12-05 18:47:39 -0800638 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800639 libFlagsList = append(libFlagsList, "-Wl,--start-group")
640 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700641 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800642 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800643 libFlagsList = append(libFlagsList, "-Wl,--end-group")
644 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800645
Stephen Hines10347862016-07-18 15:54:54 -0700646 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700647 libFlagsList = append(libFlagsList, "-Wl,--start-group")
648 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700649 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700650 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700651 libFlagsList = append(libFlagsList, "-Wl,--end-group")
652 }
653
Colin Cross3f40fa42015-01-30 17:27:36 -0800654 for _, lib := range sharedLibs {
Dan Albert9840e1b2016-07-21 08:47:33 -0700655 libFlagsList = append(libFlagsList, lib.String())
Colin Cross3f40fa42015-01-30 17:27:36 -0800656 }
657
Colin Cross3f40fa42015-01-30 17:27:36 -0800658 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700659 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800660 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700661 if crtBegin.Valid() {
662 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800663 }
664
Colin Crossae887032017-10-23 17:16:14 -0700665 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700666 Rule: ld,
667 Description: "link " + outputFile.Base(),
668 Output: outputFile,
669 Inputs: objFiles,
670 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800671 Args: map[string]string{
Dan Albertce2b8392016-07-21 13:16:49 -0700672 "ldCmd": ldCmd,
673 "crtBegin": crtBegin.String(),
674 "libFlags": strings.Join(libFlagsList, " "),
675 "ldFlags": flags.ldFlags,
676 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800677 },
678 })
679}
680
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800681// Generate a rule to combine .dump sAbi dump files from multiple source files
682// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700683func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800684 baseName, exportedHeaderFlags string) android.OptionalPath {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800685 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800686 symbolFilterStr := "-so " + soFile.String()
Colin Crossae887032017-10-23 17:16:14 -0700687 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700688 Rule: sAbiLink,
689 Description: "header-abi-linker " + outputFile.Base(),
690 Output: outputFile,
691 Inputs: sAbiDumps,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800692 Implicit: soFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800693 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800694 "symbolFilter": symbolFilterStr,
695 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800696 "exportedHeaderFlags": exportedHeaderFlags,
697 },
698 })
699 return android.OptionalPathForPath(outputFile)
700}
701
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700702func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
703 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700704 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700705 Rule: unzipRefSAbiDump,
706 Description: "gunzip" + outputFile.Base(),
707 Output: outputFile,
708 Input: zippedRefDump,
709 })
710 return outputFile
711}
712
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800713func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Jayant Chowdharye4499502018-01-17 13:13:33 -0800714 baseName, exportedHeaderFlags string) android.OptionalPath {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800715 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharye4499502018-01-17 13:13:33 -0800716 localAbiCheckAllowFlags := append([]string(nil), abiCheckAllowFlags...)
717 if exportedHeaderFlags == "" {
718 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-advice-only")
719 }
Colin Crossae887032017-10-23 17:16:14 -0700720 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700721 Rule: sAbiDiff,
722 Description: "header-abi-diff " + outputFile.Base(),
723 Output: outputFile,
724 Input: inputDump,
725 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800726 Args: map[string]string{
727 "referenceDump": referenceDump.String(),
Jayant Chowdharyf54e0a72017-05-22 10:53:24 -0700728 "libName": baseName,
729 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdharye4499502018-01-17 13:13:33 -0800730 "allowFlags": strings.Join(localAbiCheckAllowFlags, " "),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800731 },
732 })
733 return android.OptionalPathForPath(outputFile)
734}
735
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700736// Generate a rule for extracting a table of contents from a shared library (.so)
737func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700738 outputFile android.WritablePath, flags builderFlags) {
739
740 crossCompile := gccCmd(flags.toolchain, "")
741
Colin Crossae887032017-10-23 17:16:14 -0700742 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700743 Rule: toc,
744 Description: "generate toc " + inputFile.Base(),
745 Output: outputFile,
746 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700747 Args: map[string]string{
748 "crossCompile": crossCompile,
749 },
750 })
751}
752
Colin Cross3f40fa42015-01-30 17:27:36 -0800753// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700754func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
755 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800756
Colin Cross41280a42015-11-23 14:01:42 -0800757 var ldCmd string
758 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700759 ldCmd = "${config.ClangBin}/clang++"
Colin Cross41280a42015-11-23 14:01:42 -0800760 } else {
761 ldCmd = gccCmd(flags.toolchain, "g++")
762 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800763
Colin Crossae887032017-10-23 17:16:14 -0700764 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700765 Rule: partialLd,
766 Description: "link " + outputFile.Base(),
767 Output: outputFile,
768 Inputs: objFiles,
Colin Cross3f40fa42015-01-30 17:27:36 -0800769 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700770 "ldCmd": ldCmd,
Colin Cross41280a42015-11-23 14:01:42 -0800771 "ldFlags": flags.ldFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800772 },
773 })
774}
775
Colin Crossbfae8852015-03-26 14:44:11 -0700776// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700777func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
778 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700779
780 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
781
Colin Crossae887032017-10-23 17:16:14 -0700782 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700783 Rule: prefixSymbols,
784 Description: "prefix symbols " + outputFile.Base(),
785 Output: outputFile,
786 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700787 Args: map[string]string{
788 "objcopyCmd": objcopyCmd,
789 "prefix": prefix,
790 },
791 })
792}
793
Colin Cross635c3b02016-05-18 15:37:25 -0700794func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
795 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700796
797 crossCompile := gccCmd(flags.toolchain, "")
798 args := ""
799 if flags.stripAddGnuDebuglink {
800 args += " --add-gnu-debuglink"
801 }
802 if flags.stripKeepMiniDebugInfo {
803 args += " --keep-mini-debug-info"
804 }
805 if flags.stripKeepSymbols {
806 args += " --keep-symbols"
807 }
808
Colin Crossae887032017-10-23 17:16:14 -0700809 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700810 Rule: strip,
811 Description: "strip " + outputFile.Base(),
812 Output: outputFile,
813 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700814 Args: map[string]string{
815 "crossCompile": crossCompile,
816 "args": args,
817 },
818 })
819}
820
Colin Cross635c3b02016-05-18 15:37:25 -0700821func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
822 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700823
Colin Crossae887032017-10-23 17:16:14 -0700824 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700825 Rule: darwinStrip,
826 Description: "strip " + outputFile.Base(),
827 Output: outputFile,
828 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700829 })
830}
831
Dan Willemsen581341d2017-02-09 16:16:31 -0800832func TransformCoverageFilesToLib(ctx android.ModuleContext,
833 inputs Objects, flags builderFlags, baseName string) android.OptionalPath {
834
835 if len(inputs.coverageFiles) > 0 {
836 outputFile := android.PathForModuleOut(ctx, baseName+".gcnodir")
837
838 TransformObjToStaticLib(ctx, inputs.coverageFiles, flags, outputFile, nil)
839
840 return android.OptionalPathForPath(outputFile)
841 }
842
843 return android.OptionalPath{}
844}
845
Colin Cross635c3b02016-05-18 15:37:25 -0700846func CopyGccLib(ctx android.ModuleContext, libName string,
847 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800848
Colin Crossae887032017-10-23 17:16:14 -0700849 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700850 Rule: copyGccLib,
851 Description: "copy gcc library " + libName,
852 Output: outputFile,
Colin Cross3f40fa42015-01-30 17:27:36 -0800853 Args: map[string]string{
854 "ccCmd": gccCmd(flags.toolchain, "gcc"),
855 "cFlags": flags.globalFlags,
856 "libName": libName,
857 },
858 })
859}
860
Colin Crossb98c8b02016-07-29 13:44:28 -0700861func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800862 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
863}
Colin Cross0af4b842015-04-30 16:36:18 -0700864
Colin Cross5b529592017-05-09 13:34:34 -0700865func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700866 var i int
867
868 start := 0
869 bytes := 0
870 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700871 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700872 if l > limit {
873 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
874 }
875 if bytes+l > limit {
876 lists = append(lists, list[start:i])
877 start = i
878 bytes = 0
879 }
880 bytes += l + 1 // count a space between each list element
881 }
882
883 lists = append(lists, list[start:])
884
885 totalLen := 0
886 for _, l := range lists {
887 totalLen += len(l)
888 }
889 if totalLen != len(list) {
890 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
891 }
892 return lists, nil
893}