blob: a81dc89443247e82fadf9a46e66025f7b4732c2e [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 Chowdhary918b1d92017-04-18 10:44:00 -0700199 // Abidiff check turned on in advice-only mode. Builds will not fail on abi incompatibilties / extensions.
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800200 sAbiDiff = pctx.AndroidStaticRule("sAbiDiff",
201 blueprint.RuleParams{
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -0700202 Command: "$sAbiDiffer $allowFlags -lib $libName -arch $arch -check-all-apis -o ${out} -new $in -old $referenceDump",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800203 CommandDeps: []string{"$sAbiDiffer"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800204 },
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -0700205 "allowFlags", "referenceDump", "libName", "arch")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700206
207 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
208 blueprint.RuleParams{
209 Command: "gunzip -c $in > $out",
210 })
Colin Cross3f40fa42015-01-30 17:27:36 -0800211)
212
Dan Willemsen322a0a62015-11-17 15:19:46 -0800213func init() {
214 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
215 // debug output. That way two builds in two different directories will
216 // create the same output.
217 if runtime.GOOS != "darwin" {
218 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
219 } else {
220 // Darwin doesn't have /proc
221 pctx.StaticVariable("relPwd", "")
222 }
223}
224
Colin Cross3f40fa42015-01-30 17:27:36 -0800225type builderFlags struct {
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700226 globalFlags string
227 arFlags string
228 asFlags string
229 cFlags string
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700230 toolingCFlags string // A separate set of Cflags for clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700231 conlyFlags string
232 cppFlags string
233 ldFlags string
234 libFlags string
235 yaccFlags string
236 protoFlags string
237 tidyFlags string
238 sAbiFlags string
239 yasmFlags string
240 aidlFlags string
241 rsFlags string
242 toolchain config.Toolchain
243 clang bool
244 tidy bool
245 coverage bool
246 sAbiDump bool
Colin Cross665dce92016-04-28 14:50:03 -0700247
Colin Crossc3199482017-03-30 15:03:04 -0700248 systemIncludeFlags string
249
Colin Cross18c0c5a2016-12-01 14:45:23 -0800250 groupStaticLibs bool
251
Colin Cross665dce92016-04-28 14:50:03 -0700252 stripKeepSymbols bool
253 stripKeepMiniDebugInfo bool
254 stripAddGnuDebuglink bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800255}
256
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700257type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800258 objFiles android.Paths
259 tidyFiles android.Paths
260 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800261 sAbiDumpFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700262}
263
264func (a Objects) Copy() Objects {
265 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800266 objFiles: append(android.Paths{}, a.objFiles...),
267 tidyFiles: append(android.Paths{}, a.tidyFiles...),
268 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800269 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700270 }
271}
272
273func (a Objects) Append(b Objects) Objects {
274 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800275 objFiles: append(a.objFiles, b.objFiles...),
276 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
277 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800278 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700279 }
280}
281
Colin Cross3f40fa42015-01-30 17:27:36 -0800282// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700283func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700284 flags builderFlags, deps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700285
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700286 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700287 var tidyFiles android.Paths
288 if flags.tidy && flags.clang {
289 tidyFiles = make(android.Paths, 0, len(srcFiles))
290 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800291 var coverageFiles android.Paths
292 if flags.coverage {
293 coverageFiles = make(android.Paths, 0, len(srcFiles))
294 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800295
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700296 commonFlags := strings.Join([]string{
Colin Crossc3199482017-03-30 15:03:04 -0700297 flags.globalFlags,
298 flags.systemIncludeFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700299 }, " ")
300
301 toolingCflags := strings.Join([]string{
302 commonFlags,
303 flags.toolingCFlags,
304 flags.conlyFlags,
305 }, " ")
306
307 cflags := strings.Join([]string{
308 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700309 flags.cFlags,
310 flags.conlyFlags,
311 }, " ")
312
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700313 toolingCppflags := strings.Join([]string{
314 commonFlags,
315 flags.toolingCFlags,
316 flags.cppFlags,
317 }, " ")
318
Colin Crossc3199482017-03-30 15:03:04 -0700319 cppflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700320 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700321 flags.cFlags,
322 flags.cppFlags,
323 }, " ")
324
325 asflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700326 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700327 flags.asFlags,
328 }, " ")
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700329
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800330 var sAbiDumpFiles android.Paths
331 if flags.sAbiDump && flags.clang {
332 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
333 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800334
Dan Willemsenbe03f342016-03-03 17:21:04 -0800335 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700336 cflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700337 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700338 cppflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700339 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800340 } else {
Colin Crossb98c8b02016-07-29 13:44:28 -0700341 cflags += " ${config.NoOverrideGlobalCflags}"
342 cppflags += " ${config.NoOverrideGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800343 }
344
Colin Cross3f40fa42015-01-30 17:27:36 -0800345 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700346 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800347
348 objFiles[i] = objFile
349
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700350 switch srcFile.Ext() {
351 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700352 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700353 Rule: yasm,
354 Description: "yasm " + srcFile.Rel(),
355 Output: objFile,
356 Input: srcFile,
357 OrderOnly: deps,
Colin Cross91e90042016-12-02 17:13:24 -0800358 Args: map[string]string{
359 "asFlags": flags.yasmFlags,
360 },
361 })
362 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700363 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700364 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700365 Rule: windres,
366 Description: "windres " + srcFile.Rel(),
367 Output: objFile,
368 Input: srcFile,
369 OrderOnly: deps,
370 Args: map[string]string{
371 "windresCmd": gccCmd(flags.toolchain, "windres"),
372 "flags": flags.toolchain.WindresFlags(),
373 },
374 })
375 continue
Colin Cross91e90042016-12-02 17:13:24 -0800376 }
377
Colin Cross3f40fa42015-01-30 17:27:36 -0800378 var moduleCflags string
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700379 var moduleToolingCflags string
Colin Cross3f40fa42015-01-30 17:27:36 -0800380 var ccCmd string
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700381 tidy := flags.tidy && flags.clang
Dan Willemsen581341d2017-02-09 16:16:31 -0800382 coverage := flags.coverage
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800383 dump := flags.sAbiDump && flags.clang
Colin Cross3f40fa42015-01-30 17:27:36 -0800384
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700385 switch srcFile.Ext() {
Colin Cross3f40fa42015-01-30 17:27:36 -0800386 case ".S", ".s":
387 ccCmd = "gcc"
388 moduleCflags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700389 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800390 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800391 dump = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800392 case ".c":
393 ccCmd = "gcc"
394 moduleCflags = cflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700395 moduleToolingCflags = toolingCflags
Colin Cross9978ffe2016-12-01 15:31:22 -0800396 case ".cpp", ".cc", ".mm":
Colin Cross3f40fa42015-01-30 17:27:36 -0800397 ccCmd = "g++"
398 moduleCflags = cppflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700399 moduleToolingCflags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800400 default:
401 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
402 continue
403 }
404
405 if flags.clang {
406 switch ccCmd {
407 case "gcc":
408 ccCmd = "clang"
409 case "g++":
410 ccCmd = "clang++"
411 default:
412 panic("unrecoginzied ccCmd")
413 }
Colin Cross67a5c132017-05-09 13:45:28 -0700414 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800415
Colin Cross67a5c132017-05-09 13:45:28 -0700416 ccDesc := ccCmd
417
418 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700419 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800420 } else {
421 ccCmd = gccCmd(flags.toolchain, ccCmd)
422 }
423
Dan Willemsen581341d2017-02-09 16:16:31 -0800424 var implicitOutputs android.WritablePaths
425 if coverage {
426 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
427 implicitOutputs = append(implicitOutputs, gcnoFile)
428 coverageFiles = append(coverageFiles, gcnoFile)
429 }
430
Colin Crossae887032017-10-23 17:16:14 -0700431 ctx.Build(pctx, android.BuildParams{
Dan Willemsen581341d2017-02-09 16:16:31 -0800432 Rule: cc,
Colin Cross67a5c132017-05-09 13:45:28 -0700433 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800434 Output: objFile,
435 ImplicitOutputs: implicitOutputs,
436 Input: srcFile,
437 OrderOnly: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800438 Args: map[string]string{
Colin Cross28344522015-04-22 13:07:53 -0700439 "cFlags": moduleCflags,
440 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800441 },
442 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700443
444 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700445 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700446 tidyFiles = append(tidyFiles, tidyFile)
447
Colin Crossae887032017-10-23 17:16:14 -0700448 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700449 Rule: clangTidy,
450 Description: "clang-tidy " + srcFile.Rel(),
451 Output: tidyFile,
452 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700453 // We must depend on objFile, since clang-tidy doesn't
454 // support exporting dependencies.
455 Implicit: objFile,
456 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700457 "cFlags": moduleToolingCflags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700458 "tidyFlags": flags.tidyFlags,
459 },
460 })
461 }
462
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800463 if dump {
464 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
465 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
466
Colin Crossae887032017-10-23 17:16:14 -0700467 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700468 Rule: sAbiDump,
469 Description: "header-abi-dumper " + srcFile.Rel(),
470 Output: sAbiDumpFile,
471 Input: srcFile,
472 Implicit: objFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800473 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700474 "cFlags": moduleToolingCflags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800475 "exportDirs": flags.sAbiFlags,
476 },
477 })
478 }
479
Colin Cross3f40fa42015-01-30 17:27:36 -0800480 }
481
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700482 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800483 objFiles: objFiles,
484 tidyFiles: tidyFiles,
485 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800486 sAbiDumpFiles: sAbiDumpFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700487 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800488}
489
490// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700491func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700492 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800493
Dan Willemsen581341d2017-02-09 16:16:31 -0800494 if ctx.Darwin() {
495 transformDarwinObjToStaticLib(ctx, objFiles, flags, outputFile, deps)
496 return
497 }
498
Colin Cross3f40fa42015-01-30 17:27:36 -0800499 arCmd := gccCmd(flags.toolchain, "ar")
500 arFlags := "crsPD"
Vishwath Mohan83d9f712017-03-16 11:01:23 -0700501 if flags.arFlags != "" {
502 arFlags += " " + flags.arFlags
503 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800504
Colin Crossae887032017-10-23 17:16:14 -0700505 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700506 Rule: ar,
507 Description: "static link " + outputFile.Base(),
508 Output: outputFile,
509 Inputs: objFiles,
510 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800511 Args: map[string]string{
512 "arFlags": arFlags,
513 "arCmd": arCmd,
514 },
515 })
516}
517
Colin Cross0af4b842015-04-30 16:36:18 -0700518// Generate a rule for compiling multiple .o files to a static library (.a) on
519// darwin. The darwin ar tool doesn't support @file for list files, and has a
520// very small command line length limit, so we have to split the ar into multiple
521// steps, each appending to the previous one.
Dan Willemsen581341d2017-02-09 16:16:31 -0800522func transformDarwinObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Colin Cross5b529592017-05-09 13:34:34 -0700523 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross0af4b842015-04-30 16:36:18 -0700524
Colin Cross0af4b842015-04-30 16:36:18 -0700525 arFlags := "cqs"
526
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700527 if len(objFiles) == 0 {
Colin Cross635c3b02016-05-18 15:37:25 -0700528 dummy := android.PathForModuleOut(ctx, "dummy"+objectExtension)
529 dummyAr := android.PathForModuleOut(ctx, "dummy"+staticLibraryExtension)
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700530
Colin Crossae887032017-10-23 17:16:14 -0700531 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700532 Rule: emptyFile,
533 Description: "empty object file",
534 Output: dummy,
535 Implicits: deps,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700536 })
537
Colin Crossae887032017-10-23 17:16:14 -0700538 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700539 Rule: darwinAr,
540 Description: "empty static archive",
541 Output: dummyAr,
542 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700543 Args: map[string]string{
544 "arFlags": arFlags,
545 },
546 })
547
Colin Crossae887032017-10-23 17:16:14 -0700548 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700549 Rule: darwinAppendAr,
550 Description: "static link " + outputFile.Base(),
551 Output: outputFile,
552 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700553 Args: map[string]string{
554 "arFlags": "d",
555 "inAr": dummyAr.String(),
556 },
557 })
558
559 return
560 }
561
Colin Cross0af4b842015-04-30 16:36:18 -0700562 // ARG_MAX on darwin is 262144, use half that to be safe
Colin Cross5b529592017-05-09 13:34:34 -0700563 objFilesLists, err := splitListForSize(objFiles, 131072)
Colin Cross0af4b842015-04-30 16:36:18 -0700564 if err != nil {
565 ctx.ModuleErrorf("%s", err.Error())
566 }
567
Colin Cross5b529592017-05-09 13:34:34 -0700568 var in, out android.WritablePath
Colin Cross0af4b842015-04-30 16:36:18 -0700569 for i, l := range objFilesLists {
570 in = out
571 out = outputFile
572 if i != len(objFilesLists)-1 {
Colin Cross5b529592017-05-09 13:34:34 -0700573 out = android.PathForModuleOut(ctx, outputFile.Base()+strconv.Itoa(i))
Colin Cross0af4b842015-04-30 16:36:18 -0700574 }
575
Colin Crossae887032017-10-23 17:16:14 -0700576 build := android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700577 Rule: darwinAr,
578 Description: "static link " + out.Base(),
579 Output: out,
580 Inputs: l,
581 Implicits: deps,
Colin Cross5b529592017-05-09 13:34:34 -0700582 Args: map[string]string{
583 "arFlags": arFlags,
584 },
Colin Cross0af4b842015-04-30 16:36:18 -0700585 }
Colin Cross5b529592017-05-09 13:34:34 -0700586 if i != 0 {
587 build.Rule = darwinAppendAr
588 build.Args["inAr"] = in.String()
589 }
Colin Crossae887032017-10-23 17:16:14 -0700590 ctx.Build(pctx, build)
Colin Cross0af4b842015-04-30 16:36:18 -0700591 }
592}
593
Colin Cross3f40fa42015-01-30 17:27:36 -0800594// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700595// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700596func TransformObjToDynamicBinary(ctx android.ModuleContext,
597 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
598 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800599
600 var ldCmd string
601 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700602 ldCmd = "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800603 } else {
604 ldCmd = gccCmd(flags.toolchain, "g++")
605 }
606
Colin Cross3f40fa42015-01-30 17:27:36 -0800607 var libFlagsList []string
608
Colin Cross16b23492016-01-06 14:41:07 -0800609 if len(flags.libFlags) > 0 {
610 libFlagsList = append(libFlagsList, flags.libFlags)
611 }
612
Colin Cross3f40fa42015-01-30 17:27:36 -0800613 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800614 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700615 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700616 } else {
617 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700618 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700619 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
620 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800621 }
622
Colin Cross7a7cf972016-12-05 18:47:39 -0800623 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800624 libFlagsList = append(libFlagsList, "-Wl,--start-group")
625 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700626 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800627 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800628 libFlagsList = append(libFlagsList, "-Wl,--end-group")
629 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800630
Stephen Hines10347862016-07-18 15:54:54 -0700631 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700632 libFlagsList = append(libFlagsList, "-Wl,--start-group")
633 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700634 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700635 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700636 libFlagsList = append(libFlagsList, "-Wl,--end-group")
637 }
638
Colin Cross3f40fa42015-01-30 17:27:36 -0800639 for _, lib := range sharedLibs {
Dan Albert9840e1b2016-07-21 08:47:33 -0700640 libFlagsList = append(libFlagsList, lib.String())
Colin Cross3f40fa42015-01-30 17:27:36 -0800641 }
642
Colin Cross3f40fa42015-01-30 17:27:36 -0800643 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700644 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800645 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700646 if crtBegin.Valid() {
647 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800648 }
649
Colin Crossae887032017-10-23 17:16:14 -0700650 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700651 Rule: ld,
652 Description: "link " + outputFile.Base(),
653 Output: outputFile,
654 Inputs: objFiles,
655 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800656 Args: map[string]string{
Dan Albertce2b8392016-07-21 13:16:49 -0700657 "ldCmd": ldCmd,
658 "crtBegin": crtBegin.String(),
659 "libFlags": strings.Join(libFlagsList, " "),
660 "ldFlags": flags.ldFlags,
661 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800662 },
663 })
664}
665
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800666// Generate a rule to combine .dump sAbi dump files from multiple source files
667// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700668func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800669 symbolFile android.OptionalPath, apiLevel, baseName, exportedHeaderFlags string) android.OptionalPath {
670 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700671 var symbolFilterStr string
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800672 var linkedDumpDep android.Path
673 if symbolFile.Valid() {
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700674 symbolFilterStr = "-v " + symbolFile.Path().String()
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800675 linkedDumpDep = symbolFile.Path()
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700676 } else {
677 linkedDumpDep = soFile
678 symbolFilterStr = "-so " + soFile.String()
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800679 }
Colin Crossae887032017-10-23 17:16:14 -0700680 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700681 Rule: sAbiLink,
682 Description: "header-abi-linker " + outputFile.Base(),
683 Output: outputFile,
684 Inputs: sAbiDumps,
685 Implicit: linkedDumpDep,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800686 Args: map[string]string{
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700687 "symbolFilter": symbolFilterStr,
688 "arch": ctx.Arch().ArchType.Name,
689 "api": apiLevel,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800690 "exportedHeaderFlags": exportedHeaderFlags,
691 },
692 })
693 return android.OptionalPathForPath(outputFile)
694}
695
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700696func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
697 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700698 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700699 Rule: unzipRefSAbiDump,
700 Description: "gunzip" + outputFile.Base(),
701 Output: outputFile,
702 Input: zippedRefDump,
703 })
704 return outputFile
705}
706
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800707func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
708 baseName string) android.OptionalPath {
709 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Colin Crossae887032017-10-23 17:16:14 -0700710 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700711 Rule: sAbiDiff,
712 Description: "header-abi-diff " + outputFile.Base(),
713 Output: outputFile,
714 Input: inputDump,
715 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800716 Args: map[string]string{
717 "referenceDump": referenceDump.String(),
Jayant Chowdharyf54e0a72017-05-22 10:53:24 -0700718 "libName": baseName,
719 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -0700720 "allowFlags": strings.Join(abiCheckAllowFlags, " "),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800721 },
722 })
723 return android.OptionalPathForPath(outputFile)
724}
725
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700726// Generate a rule for extracting a table of contents from a shared library (.so)
727func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700728 outputFile android.WritablePath, flags builderFlags) {
729
730 crossCompile := gccCmd(flags.toolchain, "")
731
Colin Crossae887032017-10-23 17:16:14 -0700732 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700733 Rule: toc,
734 Description: "generate toc " + inputFile.Base(),
735 Output: outputFile,
736 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700737 Args: map[string]string{
738 "crossCompile": crossCompile,
739 },
740 })
741}
742
Colin Cross3f40fa42015-01-30 17:27:36 -0800743// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700744func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
745 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800746
Colin Cross41280a42015-11-23 14:01:42 -0800747 var ldCmd string
748 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700749 ldCmd = "${config.ClangBin}/clang++"
Colin Cross41280a42015-11-23 14:01:42 -0800750 } else {
751 ldCmd = gccCmd(flags.toolchain, "g++")
752 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800753
Colin Crossae887032017-10-23 17:16:14 -0700754 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700755 Rule: partialLd,
756 Description: "link " + outputFile.Base(),
757 Output: outputFile,
758 Inputs: objFiles,
Colin Cross3f40fa42015-01-30 17:27:36 -0800759 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700760 "ldCmd": ldCmd,
Colin Cross41280a42015-11-23 14:01:42 -0800761 "ldFlags": flags.ldFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800762 },
763 })
764}
765
Colin Crossbfae8852015-03-26 14:44:11 -0700766// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700767func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
768 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700769
770 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
771
Colin Crossae887032017-10-23 17:16:14 -0700772 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700773 Rule: prefixSymbols,
774 Description: "prefix symbols " + outputFile.Base(),
775 Output: outputFile,
776 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700777 Args: map[string]string{
778 "objcopyCmd": objcopyCmd,
779 "prefix": prefix,
780 },
781 })
782}
783
Colin Cross635c3b02016-05-18 15:37:25 -0700784func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
785 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700786
787 crossCompile := gccCmd(flags.toolchain, "")
788 args := ""
789 if flags.stripAddGnuDebuglink {
790 args += " --add-gnu-debuglink"
791 }
792 if flags.stripKeepMiniDebugInfo {
793 args += " --keep-mini-debug-info"
794 }
795 if flags.stripKeepSymbols {
796 args += " --keep-symbols"
797 }
798
Colin Crossae887032017-10-23 17:16:14 -0700799 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700800 Rule: strip,
801 Description: "strip " + outputFile.Base(),
802 Output: outputFile,
803 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700804 Args: map[string]string{
805 "crossCompile": crossCompile,
806 "args": args,
807 },
808 })
809}
810
Colin Cross635c3b02016-05-18 15:37:25 -0700811func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
812 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700813
Colin Crossae887032017-10-23 17:16:14 -0700814 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700815 Rule: darwinStrip,
816 Description: "strip " + outputFile.Base(),
817 Output: outputFile,
818 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700819 })
820}
821
Dan Willemsen581341d2017-02-09 16:16:31 -0800822func TransformCoverageFilesToLib(ctx android.ModuleContext,
823 inputs Objects, flags builderFlags, baseName string) android.OptionalPath {
824
825 if len(inputs.coverageFiles) > 0 {
826 outputFile := android.PathForModuleOut(ctx, baseName+".gcnodir")
827
828 TransformObjToStaticLib(ctx, inputs.coverageFiles, flags, outputFile, nil)
829
830 return android.OptionalPathForPath(outputFile)
831 }
832
833 return android.OptionalPath{}
834}
835
Colin Cross635c3b02016-05-18 15:37:25 -0700836func CopyGccLib(ctx android.ModuleContext, libName string,
837 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800838
Colin Crossae887032017-10-23 17:16:14 -0700839 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700840 Rule: copyGccLib,
841 Description: "copy gcc library " + libName,
842 Output: outputFile,
Colin Cross3f40fa42015-01-30 17:27:36 -0800843 Args: map[string]string{
844 "ccCmd": gccCmd(flags.toolchain, "gcc"),
845 "cFlags": flags.globalFlags,
846 "libName": libName,
847 },
848 })
849}
850
Colin Crossb98c8b02016-07-29 13:44:28 -0700851func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800852 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
853}
Colin Cross0af4b842015-04-30 16:36:18 -0700854
Colin Cross5b529592017-05-09 13:34:34 -0700855func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700856 var i int
857
858 start := 0
859 bytes := 0
860 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700861 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700862 if l > limit {
863 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
864 }
865 if bytes+l > limit {
866 lists = append(lists, list[start:i])
867 start = i
868 bytes = 0
869 }
870 bytes += l + 1 // count a space between each list element
871 }
872
873 lists = append(lists, list[start:])
874
875 totalLen := 0
876 for _, l := range lists {
877 totalLen += len(l)
878 }
879 if totalLen != len(list) {
880 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
881 }
882 return lists, nil
883}