blob: e583834eda55f5b9dbd4de57e282524f63d8fa57 [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,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700293 flags builderFlags, deps 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,
366 OrderOnly: deps,
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,
378 OrderOnly: deps,
379 Args: map[string]string{
380 "windresCmd": gccCmd(flags.toolchain, "windres"),
381 "flags": flags.toolchain.WindresFlags(),
382 },
383 })
384 continue
Colin Cross91e90042016-12-02 17:13:24 -0800385 }
386
Colin Cross3f40fa42015-01-30 17:27:36 -0800387 var moduleCflags string
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700388 var moduleToolingCflags string
Colin Cross3f40fa42015-01-30 17:27:36 -0800389 var ccCmd string
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700390 tidy := flags.tidy && flags.clang
Dan Willemsen581341d2017-02-09 16:16:31 -0800391 coverage := flags.coverage
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800392 dump := flags.sAbiDump && flags.clang
Colin Cross3f40fa42015-01-30 17:27:36 -0800393
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700394 switch srcFile.Ext() {
Colin Cross3f40fa42015-01-30 17:27:36 -0800395 case ".S", ".s":
396 ccCmd = "gcc"
397 moduleCflags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700398 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800399 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800400 dump = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800401 case ".c":
402 ccCmd = "gcc"
403 moduleCflags = cflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700404 moduleToolingCflags = toolingCflags
Colin Cross9978ffe2016-12-01 15:31:22 -0800405 case ".cpp", ".cc", ".mm":
Colin Cross3f40fa42015-01-30 17:27:36 -0800406 ccCmd = "g++"
407 moduleCflags = cppflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700408 moduleToolingCflags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800409 default:
410 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
411 continue
412 }
413
414 if flags.clang {
415 switch ccCmd {
416 case "gcc":
417 ccCmd = "clang"
418 case "g++":
419 ccCmd = "clang++"
420 default:
421 panic("unrecoginzied ccCmd")
422 }
Colin Cross67a5c132017-05-09 13:45:28 -0700423 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800424
Colin Cross67a5c132017-05-09 13:45:28 -0700425 ccDesc := ccCmd
426
427 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700428 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800429 } else {
430 ccCmd = gccCmd(flags.toolchain, ccCmd)
431 }
432
Dan Willemsen581341d2017-02-09 16:16:31 -0800433 var implicitOutputs android.WritablePaths
434 if coverage {
435 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
436 implicitOutputs = append(implicitOutputs, gcnoFile)
437 coverageFiles = append(coverageFiles, gcnoFile)
438 }
439
Colin Crossae887032017-10-23 17:16:14 -0700440 ctx.Build(pctx, android.BuildParams{
Dan Willemsen581341d2017-02-09 16:16:31 -0800441 Rule: cc,
Colin Cross67a5c132017-05-09 13:45:28 -0700442 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800443 Output: objFile,
444 ImplicitOutputs: implicitOutputs,
445 Input: srcFile,
446 OrderOnly: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800447 Args: map[string]string{
Colin Cross28344522015-04-22 13:07:53 -0700448 "cFlags": moduleCflags,
449 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800450 },
451 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700452
453 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700454 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700455 tidyFiles = append(tidyFiles, tidyFile)
456
Colin Crossae887032017-10-23 17:16:14 -0700457 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700458 Rule: clangTidy,
459 Description: "clang-tidy " + srcFile.Rel(),
460 Output: tidyFile,
461 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700462 // We must depend on objFile, since clang-tidy doesn't
463 // support exporting dependencies.
464 Implicit: objFile,
465 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700466 "cFlags": moduleToolingCflags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700467 "tidyFlags": flags.tidyFlags,
468 },
469 })
470 }
471
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800472 if dump {
473 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
474 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
475
Colin Crossae887032017-10-23 17:16:14 -0700476 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700477 Rule: sAbiDump,
478 Description: "header-abi-dumper " + srcFile.Rel(),
479 Output: sAbiDumpFile,
480 Input: srcFile,
481 Implicit: objFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800482 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700483 "cFlags": moduleToolingCflags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800484 "exportDirs": flags.sAbiFlags,
485 },
486 })
487 }
488
Colin Cross3f40fa42015-01-30 17:27:36 -0800489 }
490
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700491 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800492 objFiles: objFiles,
493 tidyFiles: tidyFiles,
494 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800495 sAbiDumpFiles: sAbiDumpFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700496 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800497}
498
499// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700500func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700501 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800502
Dan Willemsen581341d2017-02-09 16:16:31 -0800503 if ctx.Darwin() {
504 transformDarwinObjToStaticLib(ctx, objFiles, flags, outputFile, deps)
505 return
506 }
507
Colin Cross3f40fa42015-01-30 17:27:36 -0800508 arCmd := gccCmd(flags.toolchain, "ar")
509 arFlags := "crsPD"
Vishwath Mohan83d9f712017-03-16 11:01:23 -0700510 if flags.arFlags != "" {
511 arFlags += " " + flags.arFlags
512 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800513
Colin Crossae887032017-10-23 17:16:14 -0700514 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700515 Rule: ar,
516 Description: "static link " + outputFile.Base(),
517 Output: outputFile,
518 Inputs: objFiles,
519 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800520 Args: map[string]string{
521 "arFlags": arFlags,
522 "arCmd": arCmd,
523 },
524 })
525}
526
Colin Cross0af4b842015-04-30 16:36:18 -0700527// Generate a rule for compiling multiple .o files to a static library (.a) on
528// darwin. The darwin ar tool doesn't support @file for list files, and has a
529// very small command line length limit, so we have to split the ar into multiple
530// steps, each appending to the previous one.
Dan Willemsen581341d2017-02-09 16:16:31 -0800531func transformDarwinObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Colin Cross5b529592017-05-09 13:34:34 -0700532 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross0af4b842015-04-30 16:36:18 -0700533
Colin Cross0af4b842015-04-30 16:36:18 -0700534 arFlags := "cqs"
535
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700536 if len(objFiles) == 0 {
Colin Cross635c3b02016-05-18 15:37:25 -0700537 dummy := android.PathForModuleOut(ctx, "dummy"+objectExtension)
538 dummyAr := android.PathForModuleOut(ctx, "dummy"+staticLibraryExtension)
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700539
Colin Crossae887032017-10-23 17:16:14 -0700540 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700541 Rule: emptyFile,
542 Description: "empty object file",
543 Output: dummy,
544 Implicits: deps,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700545 })
546
Colin Crossae887032017-10-23 17:16:14 -0700547 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700548 Rule: darwinAr,
549 Description: "empty static archive",
550 Output: dummyAr,
551 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700552 Args: map[string]string{
553 "arFlags": arFlags,
554 },
555 })
556
Colin Crossae887032017-10-23 17:16:14 -0700557 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700558 Rule: darwinAppendAr,
559 Description: "static link " + outputFile.Base(),
560 Output: outputFile,
561 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700562 Args: map[string]string{
563 "arFlags": "d",
564 "inAr": dummyAr.String(),
565 },
566 })
567
568 return
569 }
570
Colin Cross0af4b842015-04-30 16:36:18 -0700571 // ARG_MAX on darwin is 262144, use half that to be safe
Colin Cross5b529592017-05-09 13:34:34 -0700572 objFilesLists, err := splitListForSize(objFiles, 131072)
Colin Cross0af4b842015-04-30 16:36:18 -0700573 if err != nil {
574 ctx.ModuleErrorf("%s", err.Error())
575 }
576
Colin Cross5b529592017-05-09 13:34:34 -0700577 var in, out android.WritablePath
Colin Cross0af4b842015-04-30 16:36:18 -0700578 for i, l := range objFilesLists {
579 in = out
580 out = outputFile
581 if i != len(objFilesLists)-1 {
Colin Cross5b529592017-05-09 13:34:34 -0700582 out = android.PathForModuleOut(ctx, outputFile.Base()+strconv.Itoa(i))
Colin Cross0af4b842015-04-30 16:36:18 -0700583 }
584
Colin Crossae887032017-10-23 17:16:14 -0700585 build := android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700586 Rule: darwinAr,
587 Description: "static link " + out.Base(),
588 Output: out,
589 Inputs: l,
590 Implicits: deps,
Colin Cross5b529592017-05-09 13:34:34 -0700591 Args: map[string]string{
592 "arFlags": arFlags,
593 },
Colin Cross0af4b842015-04-30 16:36:18 -0700594 }
Colin Cross5b529592017-05-09 13:34:34 -0700595 if i != 0 {
596 build.Rule = darwinAppendAr
597 build.Args["inAr"] = in.String()
598 }
Colin Crossae887032017-10-23 17:16:14 -0700599 ctx.Build(pctx, build)
Colin Cross0af4b842015-04-30 16:36:18 -0700600 }
601}
602
Colin Cross3f40fa42015-01-30 17:27:36 -0800603// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700604// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700605func TransformObjToDynamicBinary(ctx android.ModuleContext,
606 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
607 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800608
609 var ldCmd string
610 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700611 ldCmd = "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800612 } else {
613 ldCmd = gccCmd(flags.toolchain, "g++")
614 }
615
Colin Cross3f40fa42015-01-30 17:27:36 -0800616 var libFlagsList []string
617
Colin Cross16b23492016-01-06 14:41:07 -0800618 if len(flags.libFlags) > 0 {
619 libFlagsList = append(libFlagsList, flags.libFlags)
620 }
621
Colin Cross3f40fa42015-01-30 17:27:36 -0800622 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800623 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700624 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700625 } else {
626 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700627 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700628 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
629 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800630 }
631
Colin Cross7a7cf972016-12-05 18:47:39 -0800632 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800633 libFlagsList = append(libFlagsList, "-Wl,--start-group")
634 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700635 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800636 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800637 libFlagsList = append(libFlagsList, "-Wl,--end-group")
638 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800639
Stephen Hines10347862016-07-18 15:54:54 -0700640 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700641 libFlagsList = append(libFlagsList, "-Wl,--start-group")
642 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700643 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700644 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700645 libFlagsList = append(libFlagsList, "-Wl,--end-group")
646 }
647
Colin Cross3f40fa42015-01-30 17:27:36 -0800648 for _, lib := range sharedLibs {
Dan Albert9840e1b2016-07-21 08:47:33 -0700649 libFlagsList = append(libFlagsList, lib.String())
Colin Cross3f40fa42015-01-30 17:27:36 -0800650 }
651
Colin Cross3f40fa42015-01-30 17:27:36 -0800652 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700653 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800654 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700655 if crtBegin.Valid() {
656 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800657 }
658
Colin Crossae887032017-10-23 17:16:14 -0700659 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700660 Rule: ld,
661 Description: "link " + outputFile.Base(),
662 Output: outputFile,
663 Inputs: objFiles,
664 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800665 Args: map[string]string{
Dan Albertce2b8392016-07-21 13:16:49 -0700666 "ldCmd": ldCmd,
667 "crtBegin": crtBegin.String(),
668 "libFlags": strings.Join(libFlagsList, " "),
669 "ldFlags": flags.ldFlags,
670 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800671 },
672 })
673}
674
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800675// Generate a rule to combine .dump sAbi dump files from multiple source files
676// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700677func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800678 symbolFile android.OptionalPath, apiLevel, baseName, exportedHeaderFlags string) android.OptionalPath {
679 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700680 var symbolFilterStr string
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800681 var linkedDumpDep android.Path
682 if symbolFile.Valid() {
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700683 symbolFilterStr = "-v " + symbolFile.Path().String()
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800684 linkedDumpDep = symbolFile.Path()
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700685 } else {
686 linkedDumpDep = soFile
687 symbolFilterStr = "-so " + soFile.String()
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800688 }
Colin Crossae887032017-10-23 17:16:14 -0700689 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700690 Rule: sAbiLink,
691 Description: "header-abi-linker " + outputFile.Base(),
692 Output: outputFile,
693 Inputs: sAbiDumps,
694 Implicit: linkedDumpDep,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800695 Args: map[string]string{
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700696 "symbolFilter": symbolFilterStr,
697 "arch": ctx.Arch().ArchType.Name,
698 "api": apiLevel,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800699 "exportedHeaderFlags": exportedHeaderFlags,
700 },
701 })
702 return android.OptionalPathForPath(outputFile)
703}
704
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700705func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
706 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700707 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700708 Rule: unzipRefSAbiDump,
709 Description: "gunzip" + outputFile.Base(),
710 Output: outputFile,
711 Input: zippedRefDump,
712 })
713 return outputFile
714}
715
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800716func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
717 baseName string) android.OptionalPath {
718 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Colin Crossae887032017-10-23 17:16:14 -0700719 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700720 Rule: sAbiDiff,
721 Description: "header-abi-diff " + outputFile.Base(),
722 Output: outputFile,
723 Input: inputDump,
724 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800725 Args: map[string]string{
726 "referenceDump": referenceDump.String(),
Jayant Chowdharyf54e0a72017-05-22 10:53:24 -0700727 "libName": baseName,
728 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -0700729 "allowFlags": strings.Join(abiCheckAllowFlags, " "),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800730 },
731 })
732 return android.OptionalPathForPath(outputFile)
733}
734
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700735// Generate a rule for extracting a table of contents from a shared library (.so)
736func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700737 outputFile android.WritablePath, flags builderFlags) {
738
739 crossCompile := gccCmd(flags.toolchain, "")
740
Colin Crossae887032017-10-23 17:16:14 -0700741 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700742 Rule: toc,
743 Description: "generate toc " + inputFile.Base(),
744 Output: outputFile,
745 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700746 Args: map[string]string{
747 "crossCompile": crossCompile,
748 },
749 })
750}
751
Colin Cross3f40fa42015-01-30 17:27:36 -0800752// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700753func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
754 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800755
Colin Cross41280a42015-11-23 14:01:42 -0800756 var ldCmd string
757 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700758 ldCmd = "${config.ClangBin}/clang++"
Colin Cross41280a42015-11-23 14:01:42 -0800759 } else {
760 ldCmd = gccCmd(flags.toolchain, "g++")
761 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800762
Colin Crossae887032017-10-23 17:16:14 -0700763 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700764 Rule: partialLd,
765 Description: "link " + outputFile.Base(),
766 Output: outputFile,
767 Inputs: objFiles,
Colin Cross3f40fa42015-01-30 17:27:36 -0800768 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700769 "ldCmd": ldCmd,
Colin Cross41280a42015-11-23 14:01:42 -0800770 "ldFlags": flags.ldFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800771 },
772 })
773}
774
Colin Crossbfae8852015-03-26 14:44:11 -0700775// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700776func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
777 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700778
779 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
780
Colin Crossae887032017-10-23 17:16:14 -0700781 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700782 Rule: prefixSymbols,
783 Description: "prefix symbols " + outputFile.Base(),
784 Output: outputFile,
785 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700786 Args: map[string]string{
787 "objcopyCmd": objcopyCmd,
788 "prefix": prefix,
789 },
790 })
791}
792
Colin Cross635c3b02016-05-18 15:37:25 -0700793func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
794 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700795
796 crossCompile := gccCmd(flags.toolchain, "")
797 args := ""
798 if flags.stripAddGnuDebuglink {
799 args += " --add-gnu-debuglink"
800 }
801 if flags.stripKeepMiniDebugInfo {
802 args += " --keep-mini-debug-info"
803 }
804 if flags.stripKeepSymbols {
805 args += " --keep-symbols"
806 }
807
Colin Crossae887032017-10-23 17:16:14 -0700808 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700809 Rule: strip,
810 Description: "strip " + outputFile.Base(),
811 Output: outputFile,
812 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700813 Args: map[string]string{
814 "crossCompile": crossCompile,
815 "args": args,
816 },
817 })
818}
819
Colin Cross635c3b02016-05-18 15:37:25 -0700820func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
821 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700822
Colin Crossae887032017-10-23 17:16:14 -0700823 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700824 Rule: darwinStrip,
825 Description: "strip " + outputFile.Base(),
826 Output: outputFile,
827 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700828 })
829}
830
Dan Willemsen581341d2017-02-09 16:16:31 -0800831func TransformCoverageFilesToLib(ctx android.ModuleContext,
832 inputs Objects, flags builderFlags, baseName string) android.OptionalPath {
833
834 if len(inputs.coverageFiles) > 0 {
835 outputFile := android.PathForModuleOut(ctx, baseName+".gcnodir")
836
837 TransformObjToStaticLib(ctx, inputs.coverageFiles, flags, outputFile, nil)
838
839 return android.OptionalPathForPath(outputFile)
840 }
841
842 return android.OptionalPath{}
843}
844
Colin Cross635c3b02016-05-18 15:37:25 -0700845func CopyGccLib(ctx android.ModuleContext, libName string,
846 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800847
Colin Crossae887032017-10-23 17:16:14 -0700848 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700849 Rule: copyGccLib,
850 Description: "copy gcc library " + libName,
851 Output: outputFile,
Colin Cross3f40fa42015-01-30 17:27:36 -0800852 Args: map[string]string{
853 "ccCmd": gccCmd(flags.toolchain, "gcc"),
854 "cFlags": flags.globalFlags,
855 "libName": libName,
856 },
857 })
858}
859
Colin Crossb98c8b02016-07-29 13:44:28 -0700860func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800861 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
862}
Colin Cross0af4b842015-04-30 16:36:18 -0700863
Colin Cross5b529592017-05-09 13:34:34 -0700864func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700865 var i int
866
867 start := 0
868 bytes := 0
869 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700870 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700871 if l > limit {
872 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
873 }
874 if bytes+l > limit {
875 lists = append(lists, list[start:i])
876 start = i
877 bytes = 0
878 }
879 bytes += l + 1 // count a space between each list element
880 }
881
882 lists = append(lists, list[start:])
883
884 totalLen := 0
885 for _, l := range lists {
886 totalLen += len(l)
887 }
888 if totalLen != len(list) {
889 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
890 }
891 return lists, nil
892}