blob: 8ae35a8d5ec741534c4a85839f4c99250798657b [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 (
Colin Cross635c3b02016-05-18 15:37:25 -070040 pctx = android.NewPackageContext("android/soong/cc")
Colin Cross3f40fa42015-01-30 17:27:36 -080041
Colin Cross9d45bb72016-08-29 16:14:13 -070042 cc = pctx.AndroidGomaStaticRule("cc",
Colin Cross3f40fa42015-01-30 17:27:36 -080043 blueprint.RuleParams{
44 Depfile: "${out}.d",
45 Deps: blueprint.DepsGCC,
Alistair Strachan777475c2016-08-26 12:55:49 -070046 Command: "$relPwd ${config.CcWrapper}$ccCmd -c $cFlags -MD -MF ${out}.d -o $out $in",
Dan Willemsenc94a7682015-11-17 15:27:28 -080047 CommandDeps: []string{"$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080048 Description: "cc $out",
49 },
Dan Willemsen322a0a62015-11-17 15:19:46 -080050 "ccCmd", "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080051
Colin Cross9d45bb72016-08-29 16:14:13 -070052 ld = pctx.AndroidStaticRule("ld",
Colin Cross3f40fa42015-01-30 17:27:36 -080053 blueprint.RuleParams{
Dan Albertce2b8392016-07-21 13:16:49 -070054 Command: "$ldCmd ${crtBegin} @${out}.rsp " +
Colin Cross28344522015-04-22 13:07:53 -070055 "${libFlags} ${crtEnd} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080056 CommandDeps: []string{"$ldCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070057 Description: "ld $out",
58 Rspfile: "${out}.rsp",
59 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080060 },
Dan Albertce2b8392016-07-21 13:16:49 -070061 "ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080062
Colin Cross9d45bb72016-08-29 16:14:13 -070063 partialLd = pctx.AndroidStaticRule("partialLd",
Colin Cross3f40fa42015-01-30 17:27:36 -080064 blueprint.RuleParams{
Colin Cross41280a42015-11-23 14:01:42 -080065 Command: "$ldCmd -nostdlib -Wl,-r ${in} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080066 CommandDeps: []string{"$ldCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080067 Description: "partialLd $out",
68 },
Colin Cross41280a42015-11-23 14:01:42 -080069 "ldCmd", "ldFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080070
Colin Cross9d45bb72016-08-29 16:14:13 -070071 ar = pctx.AndroidStaticRule("ar",
Colin Cross3f40fa42015-01-30 17:27:36 -080072 blueprint.RuleParams{
Colin Cross7d21c442015-03-30 17:47:53 -070073 Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
Dan Willemsenc94a7682015-11-17 15:27:28 -080074 CommandDeps: []string{"$arCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070075 Description: "ar $out",
76 Rspfile: "${out}.rsp",
77 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080078 },
79 "arCmd", "arFlags")
80
Colin Cross9d45bb72016-08-29 16:14:13 -070081 darwinAr = pctx.AndroidStaticRule("darwinAr",
Colin Cross0af4b842015-04-30 16:36:18 -070082 blueprint.RuleParams{
Colin Crossb98c8b02016-07-29 13:44:28 -070083 Command: "rm -f ${out} && ${config.MacArPath} $arFlags $out $in",
84 CommandDeps: []string{"${config.MacArPath}"},
Colin Cross0af4b842015-04-30 16:36:18 -070085 Description: "ar $out",
86 },
Colin Crossb8ecdfe2016-05-03 15:10:29 -070087 "arFlags")
Colin Cross0af4b842015-04-30 16:36:18 -070088
Colin Cross9d45bb72016-08-29 16:14:13 -070089 darwinAppendAr = pctx.AndroidStaticRule("darwinAppendAr",
Colin Cross0af4b842015-04-30 16:36:18 -070090 blueprint.RuleParams{
Colin Crossb98c8b02016-07-29 13:44:28 -070091 Command: "cp -f ${inAr} ${out}.tmp && ${config.MacArPath} $arFlags ${out}.tmp $in && mv ${out}.tmp ${out}",
92 CommandDeps: []string{"${config.MacArPath}", "${inAr}"},
Colin Cross0af4b842015-04-30 16:36:18 -070093 Description: "ar $out",
94 },
Colin Crossb8ecdfe2016-05-03 15:10:29 -070095 "arFlags", "inAr")
96
Colin Cross9d45bb72016-08-29 16:14:13 -070097 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -070098 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -070099 Command: "${config.MacStripPath} -u -r -o $out $in",
100 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700101 Description: "strip $out",
102 })
Colin Cross0af4b842015-04-30 16:36:18 -0700103
Colin Cross9d45bb72016-08-29 16:14:13 -0700104 prefixSymbols = pctx.AndroidStaticRule("prefixSymbols",
Colin Crossbfae8852015-03-26 14:44:11 -0700105 blueprint.RuleParams{
106 Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800107 CommandDeps: []string{"$objcopyCmd"},
Colin Crossbfae8852015-03-26 14:44:11 -0700108 Description: "prefixSymbols $out",
109 },
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"},
120 Description: "strip $out",
121 },
122 "args", "crossCompile")
123
Colin Cross9d45bb72016-08-29 16:14:13 -0700124 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700125 blueprint.RuleParams{
126 Command: "rm -f $out && touch $out",
127 Description: "empty file $out",
128 })
129
Nan Zhang43a485c2017-03-27 14:27:58 -0700130 _ = pctx.SourcePathVariable("copyGccLibPath", "build/soong/scripts/copygcclib.sh")
Colin Cross3f40fa42015-01-30 17:27:36 -0800131
Colin Cross9d45bb72016-08-29 16:14:13 -0700132 copyGccLib = pctx.AndroidStaticRule("copyGccLib",
Colin Cross3f40fa42015-01-30 17:27:36 -0800133 blueprint.RuleParams{
134 Depfile: "${out}.d",
135 Deps: blueprint.DepsGCC,
136 Command: "$copyGccLibPath $out $ccCmd $cFlags -print-file-name=${libName}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800137 CommandDeps: []string{"$copyGccLibPath", "$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -0800138 Description: "copy gcc $out",
139 },
140 "ccCmd", "cFlags", "libName")
Colin Cross26c34ed2016-09-30 17:10:16 -0700141
Nan Zhang43a485c2017-03-27 14:27:58 -0700142 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700143
144 toc = pctx.AndroidStaticRule("toc",
145 blueprint.RuleParams{
146 Depfile: "${out}.d",
147 Deps: blueprint.DepsGCC,
148 Command: "CROSS_COMPILE=$crossCompile $tocPath -i ${in} -o ${out} -d ${out}.d",
149 CommandDeps: []string{"$tocPath"},
150 Restat: true,
151 },
152 "crossCompile")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700153
154 clangTidy = pctx.AndroidStaticRule("clangTidy",
155 blueprint.RuleParams{
156 Command: "rm -f $out && ${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out",
157 CommandDeps: []string{"${config.ClangBin}/clang-tidy"},
158 Description: "tidy $out",
159 },
160 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800161
Nan Zhang43a485c2017-03-27 14:27:58 -0700162 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800163
164 yasm = pctx.AndroidStaticRule("yasm",
165 blueprint.RuleParams{
166 Command: "$yasmCmd $asFlags -o $out $in",
167 CommandDeps: []string{"$yasmCmd"},
168 Description: "yasm $out",
169 },
170 "asFlags")
Jayant Chowdhary756b1c22017-02-08 13:45:53 -0800171
172 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
173
Jayant Chowdhary8cede072017-04-20 06:53:59 -0700174 // -w has been added since header-abi-dumper does not need to produce any sort of diagnostic information.
Jayant Chowdhary756b1c22017-02-08 13:45:53 -0800175 sAbiDump = pctx.AndroidStaticRule("sAbiDump",
176 blueprint.RuleParams{
Jayant Chowdhary8cede072017-04-20 06:53:59 -0700177 Command: "rm -f $out && $sAbiDumper -o ${out} $in $exportDirs -- $cFlags -w -isystem ${config.RSIncludePath}",
Jayant Chowdhary756b1c22017-02-08 13:45:53 -0800178 CommandDeps: []string{"$sAbiDumper"},
179 Description: "header-abi-dumper $in -o $out $exportDirs",
180 },
181 "cFlags", "exportDirs")
182
183 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
184
185 sAbiLink = pctx.AndroidStaticRule("sAbiLink",
186 blueprint.RuleParams{
187 Command: "$sAbiLinker -o ${out} $symbolFile -arch $arch -api $api $exportedHeaderFlags @${out}.rsp ",
188 CommandDeps: []string{"$sAbiLinker"},
189 Description: "header-abi-linker $in -o $out",
190 Rspfile: "${out}.rsp",
191 RspfileContent: "${in}",
192 },
193 "symbolFile", "arch", "api", "exportedHeaderFlags")
194
195 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary8cede072017-04-20 06:53:59 -0700196
Jayant Chowdhary10b40b02017-04-18 10:44:00 -0700197 // Abidiff check turned on in advice-only mode. Builds will not fail on abi incompatibilties / extensions.
Jayant Chowdhary756b1c22017-02-08 13:45:53 -0800198 sAbiDiff = pctx.AndroidStaticRule("sAbiDiff",
199 blueprint.RuleParams{
Jayant Chowdhary0f1bd9d2017-05-22 10:53:24 -0700200 Command: "$sAbiDiffer -lib $libName -arch $arch -advice-only -o ${out} -new $in -old $referenceDump",
Jayant Chowdhary756b1c22017-02-08 13:45:53 -0800201 CommandDeps: []string{"$sAbiDiffer"},
202 Description: "header-abi-diff -o ${out} -new $in -old $referenceDump",
203 },
Jayant Chowdhary0f1bd9d2017-05-22 10:53:24 -0700204 "referenceDump", "libName", "arch")
Jayant Chowdhary8cede072017-04-20 06:53:59 -0700205
206 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
207 blueprint.RuleParams{
208 Command: "gunzip -c $in > $out",
209 Description: "gunzip $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 {
226 globalFlags string
Vishwath Mohan83d9f712017-03-16 11:01:23 -0700227 arFlags string
Colin Cross3f40fa42015-01-30 17:27:36 -0800228 asFlags string
229 cFlags string
230 conlyFlags string
231 cppFlags string
232 ldFlags string
Colin Cross16b23492016-01-06 14:41:07 -0800233 libFlags string
Colin Cross581c1892015-04-07 16:50:10 -0700234 yaccFlags string
Colin Cross0c461f12016-10-20 16:11:43 -0700235 protoFlags string
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700236 tidyFlags string
Jayant Chowdhary756b1c22017-02-08 13:45:53 -0800237 sAbiFlags string
Colin Cross91e90042016-12-02 17:13:24 -0800238 yasmFlags string
Dan Willemsene1240db2016-11-03 14:28:51 -0700239 aidlFlags string
Colin Crossb98c8b02016-07-29 13:44:28 -0700240 toolchain config.Toolchain
Colin Cross3f40fa42015-01-30 17:27:36 -0800241 clang bool
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700242 tidy bool
Dan Willemsen581341d2017-02-09 16:16:31 -0800243 coverage bool
Jayant Chowdhary756b1c22017-02-08 13:45:53 -0800244 sAbiDump bool
Colin Cross665dce92016-04-28 14:50:03 -0700245
Colin Cross1a805c22017-03-30 15:03:04 -0700246 systemIncludeFlags string
247
Colin Cross18c0c5a2016-12-01 14:45:23 -0800248 groupStaticLibs bool
249
Colin Cross665dce92016-04-28 14:50:03 -0700250 stripKeepSymbols bool
251 stripKeepMiniDebugInfo bool
252 stripAddGnuDebuglink bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800253}
254
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700255type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800256 objFiles android.Paths
257 tidyFiles android.Paths
258 coverageFiles android.Paths
Jayant Chowdhary756b1c22017-02-08 13:45:53 -0800259 sAbiDumpFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700260}
261
262func (a Objects) Copy() Objects {
263 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800264 objFiles: append(android.Paths{}, a.objFiles...),
265 tidyFiles: append(android.Paths{}, a.tidyFiles...),
266 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary756b1c22017-02-08 13:45:53 -0800267 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700268 }
269}
270
271func (a Objects) Append(b Objects) Objects {
272 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800273 objFiles: append(a.objFiles, b.objFiles...),
274 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
275 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary756b1c22017-02-08 13:45:53 -0800276 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700277 }
278}
279
Colin Cross3f40fa42015-01-30 17:27:36 -0800280// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700281func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700282 flags builderFlags, deps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700283
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700284 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700285 var tidyFiles android.Paths
286 if flags.tidy && flags.clang {
287 tidyFiles = make(android.Paths, 0, len(srcFiles))
288 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800289 var coverageFiles android.Paths
290 if flags.coverage {
291 coverageFiles = make(android.Paths, 0, len(srcFiles))
292 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800293
Colin Cross1a805c22017-03-30 15:03:04 -0700294 cflags := strings.Join([]string{
295 flags.globalFlags,
296 flags.systemIncludeFlags,
297 flags.cFlags,
298 flags.conlyFlags,
299 }, " ")
300
301 cppflags := strings.Join([]string{
302 flags.globalFlags,
303 flags.systemIncludeFlags,
304 flags.cFlags,
305 flags.cppFlags,
306 }, " ")
307
308 asflags := strings.Join([]string{
309 flags.globalFlags,
310 flags.systemIncludeFlags,
311 flags.asFlags,
312 }, " ")
Jayant Chowdhary756b1c22017-02-08 13:45:53 -0800313 var sAbiDumpFiles android.Paths
314 if flags.sAbiDump && flags.clang {
315 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
316 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800317
Dan Willemsenbe03f342016-03-03 17:21:04 -0800318 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700319 cflags += " ${config.NoOverrideClangGlobalCflags}"
320 cppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800321 } else {
Colin Crossb98c8b02016-07-29 13:44:28 -0700322 cflags += " ${config.NoOverrideGlobalCflags}"
323 cppflags += " ${config.NoOverrideGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800324 }
325
Colin Cross3f40fa42015-01-30 17:27:36 -0800326 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700327 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800328
329 objFiles[i] = objFile
330
Colin Cross91e90042016-12-02 17:13:24 -0800331 if srcFile.Ext() == ".asm" {
332 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
333 Rule: yasm,
334 Output: objFile,
335 Input: srcFile,
336 OrderOnly: deps,
337 Args: map[string]string{
338 "asFlags": flags.yasmFlags,
339 },
340 })
341 continue
342 }
343
Colin Cross3f40fa42015-01-30 17:27:36 -0800344 var moduleCflags string
345 var ccCmd string
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700346 tidy := flags.tidy && flags.clang
Dan Willemsen581341d2017-02-09 16:16:31 -0800347 coverage := flags.coverage
Jayant Chowdhary756b1c22017-02-08 13:45:53 -0800348 dump := flags.sAbiDump && flags.clang
Colin Cross3f40fa42015-01-30 17:27:36 -0800349
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700350 switch srcFile.Ext() {
Colin Cross3f40fa42015-01-30 17:27:36 -0800351 case ".S", ".s":
352 ccCmd = "gcc"
353 moduleCflags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700354 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800355 coverage = false
Jayant Chowdhary756b1c22017-02-08 13:45:53 -0800356 dump = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800357 case ".c":
358 ccCmd = "gcc"
359 moduleCflags = cflags
Colin Cross9978ffe2016-12-01 15:31:22 -0800360 case ".cpp", ".cc", ".mm":
Colin Cross3f40fa42015-01-30 17:27:36 -0800361 ccCmd = "g++"
362 moduleCflags = cppflags
363 default:
364 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
365 continue
366 }
367
368 if flags.clang {
369 switch ccCmd {
370 case "gcc":
371 ccCmd = "clang"
372 case "g++":
373 ccCmd = "clang++"
374 default:
375 panic("unrecoginzied ccCmd")
376 }
377
Colin Crossb98c8b02016-07-29 13:44:28 -0700378 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800379 } else {
380 ccCmd = gccCmd(flags.toolchain, ccCmd)
381 }
382
Dan Willemsen581341d2017-02-09 16:16:31 -0800383 var implicitOutputs android.WritablePaths
384 if coverage {
385 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
386 implicitOutputs = append(implicitOutputs, gcnoFile)
387 coverageFiles = append(coverageFiles, gcnoFile)
388 }
389
Colin Cross635c3b02016-05-18 15:37:25 -0700390 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Dan Willemsen581341d2017-02-09 16:16:31 -0800391 Rule: cc,
392 Output: objFile,
393 ImplicitOutputs: implicitOutputs,
394 Input: srcFile,
395 OrderOnly: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800396 Args: map[string]string{
Colin Cross28344522015-04-22 13:07:53 -0700397 "cFlags": moduleCflags,
398 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800399 },
400 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700401
402 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700403 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700404 tidyFiles = append(tidyFiles, tidyFile)
405
406 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
407 Rule: clangTidy,
408 Output: tidyFile,
409 Input: srcFile,
410 // We must depend on objFile, since clang-tidy doesn't
411 // support exporting dependencies.
412 Implicit: objFile,
413 Args: map[string]string{
414 "cFlags": moduleCflags,
415 "tidyFlags": flags.tidyFlags,
416 },
417 })
418 }
419
Jayant Chowdhary756b1c22017-02-08 13:45:53 -0800420 if dump {
421 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
422 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
423
424 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
425 Rule: sAbiDump,
426 Output: sAbiDumpFile,
427 Input: srcFile,
428 Implicit: objFile,
429 Args: map[string]string{
430 "cFlags": moduleCflags,
431 "exportDirs": flags.sAbiFlags,
432 },
433 })
434 }
435
Colin Cross3f40fa42015-01-30 17:27:36 -0800436 }
437
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700438 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800439 objFiles: objFiles,
440 tidyFiles: tidyFiles,
441 coverageFiles: coverageFiles,
Jayant Chowdhary756b1c22017-02-08 13:45:53 -0800442 sAbiDumpFiles: sAbiDumpFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700443 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800444}
445
446// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700447func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700448 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800449
Dan Willemsen581341d2017-02-09 16:16:31 -0800450 if ctx.Darwin() {
451 transformDarwinObjToStaticLib(ctx, objFiles, flags, outputFile, deps)
452 return
453 }
454
Colin Cross3f40fa42015-01-30 17:27:36 -0800455 arCmd := gccCmd(flags.toolchain, "ar")
456 arFlags := "crsPD"
Vishwath Mohan83d9f712017-03-16 11:01:23 -0700457 if flags.arFlags != "" {
458 arFlags += " " + flags.arFlags
459 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800460
Colin Cross635c3b02016-05-18 15:37:25 -0700461 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700462 Rule: ar,
463 Output: outputFile,
464 Inputs: objFiles,
465 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800466 Args: map[string]string{
467 "arFlags": arFlags,
468 "arCmd": arCmd,
469 },
470 })
471}
472
Colin Cross0af4b842015-04-30 16:36:18 -0700473// Generate a rule for compiling multiple .o files to a static library (.a) on
474// darwin. The darwin ar tool doesn't support @file for list files, and has a
475// very small command line length limit, so we have to split the ar into multiple
476// steps, each appending to the previous one.
Dan Willemsen581341d2017-02-09 16:16:31 -0800477func transformDarwinObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700478 flags builderFlags, outputPath android.ModuleOutPath, deps android.Paths) {
Colin Cross0af4b842015-04-30 16:36:18 -0700479
Colin Cross0af4b842015-04-30 16:36:18 -0700480 arFlags := "cqs"
481
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700482 if len(objFiles) == 0 {
Colin Cross635c3b02016-05-18 15:37:25 -0700483 dummy := android.PathForModuleOut(ctx, "dummy"+objectExtension)
484 dummyAr := android.PathForModuleOut(ctx, "dummy"+staticLibraryExtension)
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700485
Colin Cross635c3b02016-05-18 15:37:25 -0700486 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700487 Rule: emptyFile,
488 Output: dummy,
489 Implicits: deps,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700490 })
491
Colin Cross635c3b02016-05-18 15:37:25 -0700492 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700493 Rule: darwinAr,
494 Output: dummyAr,
495 Input: dummy,
496 Args: map[string]string{
497 "arFlags": arFlags,
498 },
499 })
500
Colin Cross635c3b02016-05-18 15:37:25 -0700501 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700502 Rule: darwinAppendAr,
503 Output: outputPath,
504 Input: dummy,
505 Args: map[string]string{
506 "arFlags": "d",
507 "inAr": dummyAr.String(),
508 },
509 })
510
511 return
512 }
513
Colin Cross0af4b842015-04-30 16:36:18 -0700514 // ARG_MAX on darwin is 262144, use half that to be safe
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700515 objFilesLists, err := splitListForSize(objFiles.Strings(), 131072)
Colin Cross0af4b842015-04-30 16:36:18 -0700516 if err != nil {
517 ctx.ModuleErrorf("%s", err.Error())
518 }
519
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700520 outputFile := outputPath.String()
521
Colin Cross0af4b842015-04-30 16:36:18 -0700522 var in, out string
523 for i, l := range objFilesLists {
524 in = out
525 out = outputFile
526 if i != len(objFilesLists)-1 {
527 out += "." + strconv.Itoa(i)
528 }
529
530 if in == "" {
531 ctx.Build(pctx, blueprint.BuildParams{
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700532 Rule: darwinAr,
533 Outputs: []string{out},
534 Inputs: l,
535 Implicits: deps.Strings(),
Colin Cross0af4b842015-04-30 16:36:18 -0700536 Args: map[string]string{
537 "arFlags": arFlags,
Colin Cross0af4b842015-04-30 16:36:18 -0700538 },
539 })
540 } else {
541 ctx.Build(pctx, blueprint.BuildParams{
Colin Cross635c3b02016-05-18 15:37:25 -0700542 Rule: darwinAppendAr,
543 Outputs: []string{out},
544 Inputs: l,
Colin Cross0af4b842015-04-30 16:36:18 -0700545 Args: map[string]string{
546 "arFlags": arFlags,
Colin Cross0af4b842015-04-30 16:36:18 -0700547 "inAr": in,
548 },
549 })
550 }
551 }
552}
553
Colin Cross3f40fa42015-01-30 17:27:36 -0800554// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
555// and shared libraires, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700556func TransformObjToDynamicBinary(ctx android.ModuleContext,
557 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
558 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800559
560 var ldCmd string
561 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700562 ldCmd = "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800563 } else {
564 ldCmd = gccCmd(flags.toolchain, "g++")
565 }
566
Colin Cross3f40fa42015-01-30 17:27:36 -0800567 var libFlagsList []string
568
Colin Cross16b23492016-01-06 14:41:07 -0800569 if len(flags.libFlags) > 0 {
570 libFlagsList = append(libFlagsList, flags.libFlags)
571 }
572
Colin Cross3f40fa42015-01-30 17:27:36 -0800573 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800574 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700575 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700576 } else {
577 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700578 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700579 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
580 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800581 }
582
Colin Cross7a7cf972016-12-05 18:47:39 -0800583 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800584 libFlagsList = append(libFlagsList, "-Wl,--start-group")
585 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700586 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800587 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800588 libFlagsList = append(libFlagsList, "-Wl,--end-group")
589 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800590
Stephen Hines10347862016-07-18 15:54:54 -0700591 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700592 libFlagsList = append(libFlagsList, "-Wl,--start-group")
593 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700594 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700595 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700596 libFlagsList = append(libFlagsList, "-Wl,--end-group")
597 }
598
Colin Cross3f40fa42015-01-30 17:27:36 -0800599 for _, lib := range sharedLibs {
Dan Albert9840e1b2016-07-21 08:47:33 -0700600 libFlagsList = append(libFlagsList, lib.String())
Colin Cross3f40fa42015-01-30 17:27:36 -0800601 }
602
Colin Cross3f40fa42015-01-30 17:27:36 -0800603 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700604 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800605 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700606 if crtBegin.Valid() {
607 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800608 }
609
Colin Cross635c3b02016-05-18 15:37:25 -0700610 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross3f40fa42015-01-30 17:27:36 -0800611 Rule: ld,
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700612 Output: outputFile,
Colin Cross3f40fa42015-01-30 17:27:36 -0800613 Inputs: objFiles,
614 Implicits: deps,
615 Args: map[string]string{
Dan Albertce2b8392016-07-21 13:16:49 -0700616 "ldCmd": ldCmd,
617 "crtBegin": crtBegin.String(),
618 "libFlags": strings.Join(libFlagsList, " "),
619 "ldFlags": flags.ldFlags,
620 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800621 },
622 })
623}
624
Jayant Chowdhary756b1c22017-02-08 13:45:53 -0800625// Generate a rule to combine .dump sAbi dump files from multiple source files
626// into a single .ldump sAbi dump file
627func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths,
628 symbolFile android.OptionalPath, apiLevel, baseName, exportedHeaderFlags string) android.OptionalPath {
629 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
630 var symbolFileStr string
631 var linkedDumpDep android.Path
632 if symbolFile.Valid() {
633 symbolFileStr = "-v " + symbolFile.Path().String()
634 linkedDumpDep = symbolFile.Path()
635 }
636 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
637 Rule: sAbiLink,
638 Output: outputFile,
639 Inputs: sAbiDumps,
640 Implicit: linkedDumpDep,
641 Args: map[string]string{
642 "symbolFile": symbolFileStr,
643 "arch": ctx.Arch().ArchType.Name,
644 "api": apiLevel,
645 "exportedHeaderFlags": exportedHeaderFlags,
646 },
647 })
648 return android.OptionalPathForPath(outputFile)
649}
650
Jayant Chowdhary8cede072017-04-20 06:53:59 -0700651func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
652 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
653 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
654 Rule: unzipRefSAbiDump,
655 Output: outputFile,
656 Input: zippedRefDump,
657 })
658 return outputFile
659}
660
Jayant Chowdhary756b1c22017-02-08 13:45:53 -0800661func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
662 baseName string) android.OptionalPath {
663 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
664 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
665 Rule: sAbiDiff,
666 Output: outputFile,
667 Input: inputDump,
668 Implicit: referenceDump,
669 Args: map[string]string{
670 "referenceDump": referenceDump.String(),
Jayant Chowdhary0f1bd9d2017-05-22 10:53:24 -0700671 "libName": baseName,
672 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary756b1c22017-02-08 13:45:53 -0800673 },
674 })
675 return android.OptionalPathForPath(outputFile)
676}
677
Colin Cross26c34ed2016-09-30 17:10:16 -0700678// Generate a rule for extract a table of contents from a shared library (.so)
679func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.WritablePath,
680 outputFile android.WritablePath, flags builderFlags) {
681
682 crossCompile := gccCmd(flags.toolchain, "")
683
684 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
685 Rule: toc,
686 Output: outputFile,
687 Input: inputFile,
688 Args: map[string]string{
689 "crossCompile": crossCompile,
690 },
691 })
692}
693
Colin Cross3f40fa42015-01-30 17:27:36 -0800694// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700695func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
696 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800697
Colin Cross41280a42015-11-23 14:01:42 -0800698 var ldCmd string
699 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700700 ldCmd = "${config.ClangBin}/clang++"
Colin Cross41280a42015-11-23 14:01:42 -0800701 } else {
702 ldCmd = gccCmd(flags.toolchain, "g++")
703 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800704
Colin Cross635c3b02016-05-18 15:37:25 -0700705 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700706 Rule: partialLd,
707 Output: outputFile,
708 Inputs: objFiles,
Colin Cross3f40fa42015-01-30 17:27:36 -0800709 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700710 "ldCmd": ldCmd,
Colin Cross41280a42015-11-23 14:01:42 -0800711 "ldFlags": flags.ldFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800712 },
713 })
714}
715
Colin Crossbfae8852015-03-26 14:44:11 -0700716// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700717func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
718 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700719
720 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
721
Colin Cross635c3b02016-05-18 15:37:25 -0700722 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700723 Rule: prefixSymbols,
724 Output: outputFile,
725 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700726 Args: map[string]string{
727 "objcopyCmd": objcopyCmd,
728 "prefix": prefix,
729 },
730 })
731}
732
Colin Cross635c3b02016-05-18 15:37:25 -0700733func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
734 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700735
736 crossCompile := gccCmd(flags.toolchain, "")
737 args := ""
738 if flags.stripAddGnuDebuglink {
739 args += " --add-gnu-debuglink"
740 }
741 if flags.stripKeepMiniDebugInfo {
742 args += " --keep-mini-debug-info"
743 }
744 if flags.stripKeepSymbols {
745 args += " --keep-symbols"
746 }
747
Colin Cross635c3b02016-05-18 15:37:25 -0700748 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross665dce92016-04-28 14:50:03 -0700749 Rule: strip,
750 Output: outputFile,
751 Input: inputFile,
752 Args: map[string]string{
753 "crossCompile": crossCompile,
754 "args": args,
755 },
756 })
757}
758
Colin Cross635c3b02016-05-18 15:37:25 -0700759func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
760 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700761
Colin Cross635c3b02016-05-18 15:37:25 -0700762 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700763 Rule: darwinStrip,
764 Output: outputFile,
765 Input: inputFile,
766 })
767}
768
Dan Willemsen581341d2017-02-09 16:16:31 -0800769func TransformCoverageFilesToLib(ctx android.ModuleContext,
770 inputs Objects, flags builderFlags, baseName string) android.OptionalPath {
771
772 if len(inputs.coverageFiles) > 0 {
773 outputFile := android.PathForModuleOut(ctx, baseName+".gcnodir")
774
775 TransformObjToStaticLib(ctx, inputs.coverageFiles, flags, outputFile, nil)
776
777 return android.OptionalPathForPath(outputFile)
778 }
779
780 return android.OptionalPath{}
781}
782
Colin Cross635c3b02016-05-18 15:37:25 -0700783func CopyGccLib(ctx android.ModuleContext, libName string,
784 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800785
Colin Cross635c3b02016-05-18 15:37:25 -0700786 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700787 Rule: copyGccLib,
788 Output: outputFile,
Colin Cross3f40fa42015-01-30 17:27:36 -0800789 Args: map[string]string{
790 "ccCmd": gccCmd(flags.toolchain, "gcc"),
791 "cFlags": flags.globalFlags,
792 "libName": libName,
793 },
794 })
795}
796
Colin Crossb98c8b02016-07-29 13:44:28 -0700797func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800798 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
799}
Colin Cross0af4b842015-04-30 16:36:18 -0700800
801func splitListForSize(list []string, limit int) (lists [][]string, err error) {
802 var i int
803
804 start := 0
805 bytes := 0
806 for i = range list {
807 l := len(list[i])
808 if l > limit {
809 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
810 }
811 if bytes+l > limit {
812 lists = append(lists, list[start:i])
813 start = i
814 bytes = 0
815 }
816 bytes += l + 1 // count a space between each list element
817 }
818
819 lists = append(lists, list[start:])
820
821 totalLen := 0
822 for _, l := range lists {
823 totalLen += len(l)
824 }
825 if totalLen != len(list) {
826 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
827 }
828 return lists, nil
829}