blob: 8f253caacc174ecf34cb21a759238fa4b2c9c755 [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{
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -070041 "-allow-unreferenced-changes",
42 "-allow-unreferenced-elf-symbol-changes",
43 }
44)
45
46var (
Colin Cross635c3b02016-05-18 15:37:25 -070047 pctx = android.NewPackageContext("android/soong/cc")
Colin Cross3f40fa42015-01-30 17:27:36 -080048
Colin Cross9d45bb72016-08-29 16:14:13 -070049 cc = pctx.AndroidGomaStaticRule("cc",
Colin Cross3f40fa42015-01-30 17:27:36 -080050 blueprint.RuleParams{
51 Depfile: "${out}.d",
52 Deps: blueprint.DepsGCC,
Alistair Strachan777475c2016-08-26 12:55:49 -070053 Command: "$relPwd ${config.CcWrapper}$ccCmd -c $cFlags -MD -MF ${out}.d -o $out $in",
Dan Willemsenc94a7682015-11-17 15:27:28 -080054 CommandDeps: []string{"$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080055 },
Dan Willemsen322a0a62015-11-17 15:19:46 -080056 "ccCmd", "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080057
Colin Cross9d45bb72016-08-29 16:14:13 -070058 ld = pctx.AndroidStaticRule("ld",
Colin Cross3f40fa42015-01-30 17:27:36 -080059 blueprint.RuleParams{
Dan Albertce2b8392016-07-21 13:16:49 -070060 Command: "$ldCmd ${crtBegin} @${out}.rsp " +
Colin Cross28344522015-04-22 13:07:53 -070061 "${libFlags} ${crtEnd} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080062 CommandDeps: []string{"$ldCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070063 Rspfile: "${out}.rsp",
64 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080065 },
Dan Albertce2b8392016-07-21 13:16:49 -070066 "ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080067
Colin Cross9d45bb72016-08-29 16:14:13 -070068 partialLd = pctx.AndroidStaticRule("partialLd",
Colin Cross3f40fa42015-01-30 17:27:36 -080069 blueprint.RuleParams{
Colin Cross41280a42015-11-23 14:01:42 -080070 Command: "$ldCmd -nostdlib -Wl,-r ${in} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080071 CommandDeps: []string{"$ldCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080072 },
Colin Cross41280a42015-11-23 14:01:42 -080073 "ldCmd", "ldFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080074
Colin Cross9d45bb72016-08-29 16:14:13 -070075 ar = pctx.AndroidStaticRule("ar",
Colin Cross3f40fa42015-01-30 17:27:36 -080076 blueprint.RuleParams{
Colin Cross7d21c442015-03-30 17:47:53 -070077 Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
Dan Willemsenc94a7682015-11-17 15:27:28 -080078 CommandDeps: []string{"$arCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070079 Rspfile: "${out}.rsp",
80 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080081 },
82 "arCmd", "arFlags")
83
Colin Cross9d45bb72016-08-29 16:14:13 -070084 darwinAr = pctx.AndroidStaticRule("darwinAr",
Colin Cross0af4b842015-04-30 16:36:18 -070085 blueprint.RuleParams{
Colin Crossb98c8b02016-07-29 13:44:28 -070086 Command: "rm -f ${out} && ${config.MacArPath} $arFlags $out $in",
87 CommandDeps: []string{"${config.MacArPath}"},
Colin Cross0af4b842015-04-30 16:36:18 -070088 },
Colin Crossb8ecdfe2016-05-03 15:10:29 -070089 "arFlags")
Colin Cross0af4b842015-04-30 16:36:18 -070090
Colin Cross9d45bb72016-08-29 16:14:13 -070091 darwinAppendAr = pctx.AndroidStaticRule("darwinAppendAr",
Colin Cross0af4b842015-04-30 16:36:18 -070092 blueprint.RuleParams{
Colin Crossb98c8b02016-07-29 13:44:28 -070093 Command: "cp -f ${inAr} ${out}.tmp && ${config.MacArPath} $arFlags ${out}.tmp $in && mv ${out}.tmp ${out}",
94 CommandDeps: []string{"${config.MacArPath}", "${inAr}"},
Colin Cross0af4b842015-04-30 16:36:18 -070095 },
Colin Crossb8ecdfe2016-05-03 15:10:29 -070096 "arFlags", "inAr")
97
Colin Cross9d45bb72016-08-29 16:14:13 -070098 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -070099 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -0700100 Command: "${config.MacStripPath} -u -r -o $out $in",
101 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700102 })
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 },
109 "objcopyCmd", "prefix")
110
Nan Zhang43a485c2017-03-27 14:27:58 -0700111 _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh")
Colin Cross665dce92016-04-28 14:50:03 -0700112
Colin Cross9d45bb72016-08-29 16:14:13 -0700113 strip = pctx.AndroidStaticRule("strip",
Colin Cross665dce92016-04-28 14:50:03 -0700114 blueprint.RuleParams{
115 Depfile: "${out}.d",
116 Deps: blueprint.DepsGCC,
117 Command: "CROSS_COMPILE=$crossCompile $stripPath ${args} -i ${in} -o ${out} -d ${out}.d",
118 CommandDeps: []string{"$stripPath"},
Colin Cross665dce92016-04-28 14:50:03 -0700119 },
120 "args", "crossCompile")
121
Colin Cross9d45bb72016-08-29 16:14:13 -0700122 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700123 blueprint.RuleParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700124 Command: "rm -f $out && touch $out",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700125 })
126
Nan Zhang43a485c2017-03-27 14:27:58 -0700127 _ = pctx.SourcePathVariable("copyGccLibPath", "build/soong/scripts/copygcclib.sh")
Colin Cross3f40fa42015-01-30 17:27:36 -0800128
Colin Cross9d45bb72016-08-29 16:14:13 -0700129 copyGccLib = pctx.AndroidStaticRule("copyGccLib",
Colin Cross3f40fa42015-01-30 17:27:36 -0800130 blueprint.RuleParams{
131 Depfile: "${out}.d",
132 Deps: blueprint.DepsGCC,
133 Command: "$copyGccLibPath $out $ccCmd $cFlags -print-file-name=${libName}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800134 CommandDeps: []string{"$copyGccLibPath", "$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -0800135 },
136 "ccCmd", "cFlags", "libName")
Colin Cross26c34ed2016-09-30 17:10:16 -0700137
Nan Zhang43a485c2017-03-27 14:27:58 -0700138 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700139
140 toc = pctx.AndroidStaticRule("toc",
141 blueprint.RuleParams{
142 Depfile: "${out}.d",
143 Deps: blueprint.DepsGCC,
144 Command: "CROSS_COMPILE=$crossCompile $tocPath -i ${in} -o ${out} -d ${out}.d",
145 CommandDeps: []string{"$tocPath"},
146 Restat: true,
147 },
148 "crossCompile")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700149
150 clangTidy = pctx.AndroidStaticRule("clangTidy",
151 blueprint.RuleParams{
152 Command: "rm -f $out && ${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out",
153 CommandDeps: []string{"${config.ClangBin}/clang-tidy"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700154 },
155 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800156
Nan Zhang43a485c2017-03-27 14:27:58 -0700157 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800158
159 yasm = pctx.AndroidStaticRule("yasm",
160 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700161 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800162 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700163 Depfile: "$out.d",
164 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800165 },
166 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800167
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700168 windres = pctx.AndroidStaticRule("windres",
169 blueprint.RuleParams{
170 Command: "$windresCmd $flags -I$$(dirname $in) -i $in -o $out",
171 CommandDeps: []string{"$windresCmd"},
172 },
173 "windresCmd", "flags")
174
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800175 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800176
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700177 // -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 -0800178 sAbiDump = pctx.AndroidStaticRule("sAbiDump",
179 blueprint.RuleParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700180 Command: "rm -f $out && $sAbiDumper -o ${out} $in $exportDirs -- $cFlags -w -isystem ${config.RSIncludePath}",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800181 CommandDeps: []string{"$sAbiDumper"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800182 },
183 "cFlags", "exportDirs")
184
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800185 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800186
187 sAbiLink = pctx.AndroidStaticRule("sAbiLink",
188 blueprint.RuleParams{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800189 Command: "$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800190 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800191 Rspfile: "${out}.rsp",
192 RspfileContent: "${in}",
193 },
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800194 "symbolFilter", "arch", "exportedHeaderFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800195
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800196 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700197
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800198 sAbiDiff = pctx.AndroidRuleFunc("sAbiDiff",
199 func(config android.Config) (blueprint.RuleParams, error) {
200
201 commandStr := "($sAbiDiffer $allowFlags -lib $libName -arch $arch -check-all-apis -o ${out} -new $in -old $referenceDump)"
202 distDir := config.ProductVariables.DistDir
203 if distDir != nil && *distDir != "" {
204 distAbiDiffDir := *distDir + "/abidiffs/"
205 commandStr += " || (mkdir -p " + distAbiDiffDir + " && cp ${out} " + distAbiDiffDir + " && exit 1)"
206 }
207 return blueprint.RuleParams{
208 Command: commandStr,
209 CommandDeps: []string{"$sAbiDiffer"},
210 }, nil
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800211 },
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -0700212 "allowFlags", "referenceDump", "libName", "arch")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700213
214 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
215 blueprint.RuleParams{
216 Command: "gunzip -c $in > $out",
217 })
Colin Cross3f40fa42015-01-30 17:27:36 -0800218)
219
Dan Willemsen322a0a62015-11-17 15:19:46 -0800220func init() {
221 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
222 // debug output. That way two builds in two different directories will
223 // create the same output.
224 if runtime.GOOS != "darwin" {
225 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
226 } else {
227 // Darwin doesn't have /proc
228 pctx.StaticVariable("relPwd", "")
229 }
230}
231
Colin Cross3f40fa42015-01-30 17:27:36 -0800232type builderFlags struct {
Joe Onorato09e94ab2017-11-18 18:23:14 -0800233 globalFlags string
234 arFlags string
235 asFlags string
236 cFlags string
237 toolingCFlags string // A separate set of Cflags for clang LibTooling tools
238 conlyFlags string
239 cppFlags string
240 ldFlags string
241 libFlags string
242 yaccFlags string
243 protoFlags string
244 protoOutParams string
245 tidyFlags string
246 sAbiFlags string
247 yasmFlags string
248 aidlFlags string
249 rsFlags string
250 toolchain config.Toolchain
251 clang bool
252 tidy bool
253 coverage bool
254 sAbiDump bool
Colin Cross665dce92016-04-28 14:50:03 -0700255
Colin Crossc3199482017-03-30 15:03:04 -0700256 systemIncludeFlags string
257
Colin Cross18c0c5a2016-12-01 14:45:23 -0800258 groupStaticLibs bool
Zhizhou Yang51be6322018-02-08 18:32:11 -0800259 arGoldPlugin bool
Colin Cross18c0c5a2016-12-01 14:45:23 -0800260
Colin Cross665dce92016-04-28 14:50:03 -0700261 stripKeepSymbols bool
262 stripKeepMiniDebugInfo bool
263 stripAddGnuDebuglink bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800264}
265
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700266type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800267 objFiles android.Paths
268 tidyFiles android.Paths
269 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800270 sAbiDumpFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700271}
272
273func (a Objects) Copy() Objects {
274 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800275 objFiles: append(android.Paths{}, a.objFiles...),
276 tidyFiles: append(android.Paths{}, a.tidyFiles...),
277 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800278 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700279 }
280}
281
282func (a Objects) Append(b Objects) Objects {
283 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800284 objFiles: append(a.objFiles, b.objFiles...),
285 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
286 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800287 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700288 }
289}
290
Colin Cross3f40fa42015-01-30 17:27:36 -0800291// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700292func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800293 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700294
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700295 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700296 var tidyFiles android.Paths
297 if flags.tidy && flags.clang {
298 tidyFiles = make(android.Paths, 0, len(srcFiles))
299 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800300 var coverageFiles android.Paths
301 if flags.coverage {
302 coverageFiles = make(android.Paths, 0, len(srcFiles))
303 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800304
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700305 commonFlags := strings.Join([]string{
Colin Crossc3199482017-03-30 15:03:04 -0700306 flags.globalFlags,
307 flags.systemIncludeFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700308 }, " ")
309
310 toolingCflags := strings.Join([]string{
311 commonFlags,
312 flags.toolingCFlags,
313 flags.conlyFlags,
314 }, " ")
315
316 cflags := strings.Join([]string{
317 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700318 flags.cFlags,
319 flags.conlyFlags,
320 }, " ")
321
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700322 toolingCppflags := strings.Join([]string{
323 commonFlags,
324 flags.toolingCFlags,
325 flags.cppFlags,
326 }, " ")
327
Colin Crossc3199482017-03-30 15:03:04 -0700328 cppflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700329 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700330 flags.cFlags,
331 flags.cppFlags,
332 }, " ")
333
334 asflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700335 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700336 flags.asFlags,
337 }, " ")
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700338
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800339 var sAbiDumpFiles android.Paths
340 if flags.sAbiDump && flags.clang {
341 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
342 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800343
Dan Willemsenbe03f342016-03-03 17:21:04 -0800344 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700345 cflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700346 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700347 cppflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700348 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800349 } else {
Colin Crossb98c8b02016-07-29 13:44:28 -0700350 cflags += " ${config.NoOverrideGlobalCflags}"
351 cppflags += " ${config.NoOverrideGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800352 }
353
Colin Cross3f40fa42015-01-30 17:27:36 -0800354 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700355 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800356
357 objFiles[i] = objFile
358
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700359 switch srcFile.Ext() {
360 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700361 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700362 Rule: yasm,
363 Description: "yasm " + srcFile.Rel(),
364 Output: objFile,
365 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800366 Implicits: cFlagsDeps,
367 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800368 Args: map[string]string{
369 "asFlags": flags.yasmFlags,
370 },
371 })
372 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700373 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700374 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700375 Rule: windres,
376 Description: "windres " + srcFile.Rel(),
377 Output: objFile,
378 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800379 Implicits: cFlagsDeps,
380 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700381 Args: map[string]string{
382 "windresCmd": gccCmd(flags.toolchain, "windres"),
383 "flags": flags.toolchain.WindresFlags(),
384 },
385 })
386 continue
Colin Cross91e90042016-12-02 17:13:24 -0800387 }
388
Colin Cross3f40fa42015-01-30 17:27:36 -0800389 var moduleCflags string
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700390 var moduleToolingCflags string
Colin Cross3f40fa42015-01-30 17:27:36 -0800391 var ccCmd string
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700392 tidy := flags.tidy && flags.clang
Dan Willemsen581341d2017-02-09 16:16:31 -0800393 coverage := flags.coverage
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800394 dump := flags.sAbiDump && flags.clang
Colin Cross3f40fa42015-01-30 17:27:36 -0800395
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700396 switch srcFile.Ext() {
Colin Cross3f40fa42015-01-30 17:27:36 -0800397 case ".S", ".s":
398 ccCmd = "gcc"
399 moduleCflags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700400 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800401 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800402 dump = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800403 case ".c":
404 ccCmd = "gcc"
405 moduleCflags = cflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700406 moduleToolingCflags = toolingCflags
Colin Cross9978ffe2016-12-01 15:31:22 -0800407 case ".cpp", ".cc", ".mm":
Colin Cross3f40fa42015-01-30 17:27:36 -0800408 ccCmd = "g++"
409 moduleCflags = cppflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700410 moduleToolingCflags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800411 default:
412 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
413 continue
414 }
415
416 if flags.clang {
417 switch ccCmd {
418 case "gcc":
419 ccCmd = "clang"
420 case "g++":
421 ccCmd = "clang++"
422 default:
423 panic("unrecoginzied ccCmd")
424 }
Colin Cross67a5c132017-05-09 13:45:28 -0700425 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800426
Colin Cross67a5c132017-05-09 13:45:28 -0700427 ccDesc := ccCmd
428
429 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700430 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800431 } else {
432 ccCmd = gccCmd(flags.toolchain, ccCmd)
433 }
434
Dan Willemsen581341d2017-02-09 16:16:31 -0800435 var implicitOutputs android.WritablePaths
436 if coverage {
437 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
438 implicitOutputs = append(implicitOutputs, gcnoFile)
439 coverageFiles = append(coverageFiles, gcnoFile)
440 }
441
Colin Crossae887032017-10-23 17:16:14 -0700442 ctx.Build(pctx, android.BuildParams{
Dan Willemsen581341d2017-02-09 16:16:31 -0800443 Rule: cc,
Colin Cross67a5c132017-05-09 13:45:28 -0700444 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800445 Output: objFile,
446 ImplicitOutputs: implicitOutputs,
447 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800448 Implicits: cFlagsDeps,
449 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800450 Args: map[string]string{
Colin Cross28344522015-04-22 13:07:53 -0700451 "cFlags": moduleCflags,
452 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800453 },
454 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700455
456 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700457 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700458 tidyFiles = append(tidyFiles, tidyFile)
459
Colin Crossae887032017-10-23 17:16:14 -0700460 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700461 Rule: clangTidy,
462 Description: "clang-tidy " + srcFile.Rel(),
463 Output: tidyFile,
464 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700465 // We must depend on objFile, since clang-tidy doesn't
466 // support exporting dependencies.
467 Implicit: objFile,
468 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700469 "cFlags": moduleToolingCflags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700470 "tidyFlags": flags.tidyFlags,
471 },
472 })
473 }
474
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800475 if dump {
476 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
477 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
478
Colin Crossae887032017-10-23 17:16:14 -0700479 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700480 Rule: sAbiDump,
481 Description: "header-abi-dumper " + srcFile.Rel(),
482 Output: sAbiDumpFile,
483 Input: srcFile,
484 Implicit: objFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800485 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700486 "cFlags": moduleToolingCflags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800487 "exportDirs": flags.sAbiFlags,
488 },
489 })
490 }
491
Colin Cross3f40fa42015-01-30 17:27:36 -0800492 }
493
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700494 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800495 objFiles: objFiles,
496 tidyFiles: tidyFiles,
497 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800498 sAbiDumpFiles: sAbiDumpFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700499 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800500}
501
502// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700503func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700504 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800505
Dan Willemsen581341d2017-02-09 16:16:31 -0800506 if ctx.Darwin() {
507 transformDarwinObjToStaticLib(ctx, objFiles, flags, outputFile, deps)
508 return
509 }
510
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800511 arCmd := "${config.ClangBin}/llvm-ar"
512 arFlags := "crsD"
513 if !ctx.Darwin() {
514 arFlags += " -format=gnu"
515 }
Zhizhou Yang51be6322018-02-08 18:32:11 -0800516 if flags.arGoldPlugin {
517 arFlags += " --plugin ${config.LLVMGoldPlugin}"
518 }
Vishwath Mohan83d9f712017-03-16 11:01:23 -0700519 if flags.arFlags != "" {
520 arFlags += " " + flags.arFlags
521 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800522
Colin Crossae887032017-10-23 17:16:14 -0700523 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700524 Rule: ar,
525 Description: "static link " + outputFile.Base(),
526 Output: outputFile,
527 Inputs: objFiles,
528 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800529 Args: map[string]string{
530 "arFlags": arFlags,
531 "arCmd": arCmd,
532 },
533 })
534}
535
Colin Cross0af4b842015-04-30 16:36:18 -0700536// Generate a rule for compiling multiple .o files to a static library (.a) on
537// darwin. The darwin ar tool doesn't support @file for list files, and has a
538// very small command line length limit, so we have to split the ar into multiple
539// steps, each appending to the previous one.
Dan Willemsen581341d2017-02-09 16:16:31 -0800540func transformDarwinObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Colin Cross5b529592017-05-09 13:34:34 -0700541 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross0af4b842015-04-30 16:36:18 -0700542
Colin Cross0af4b842015-04-30 16:36:18 -0700543 arFlags := "cqs"
544
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700545 if len(objFiles) == 0 {
Colin Cross635c3b02016-05-18 15:37:25 -0700546 dummy := android.PathForModuleOut(ctx, "dummy"+objectExtension)
547 dummyAr := android.PathForModuleOut(ctx, "dummy"+staticLibraryExtension)
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700548
Colin Crossae887032017-10-23 17:16:14 -0700549 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700550 Rule: emptyFile,
551 Description: "empty object file",
552 Output: dummy,
553 Implicits: deps,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700554 })
555
Colin Crossae887032017-10-23 17:16:14 -0700556 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700557 Rule: darwinAr,
558 Description: "empty static archive",
559 Output: dummyAr,
560 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700561 Args: map[string]string{
562 "arFlags": arFlags,
563 },
564 })
565
Colin Crossae887032017-10-23 17:16:14 -0700566 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700567 Rule: darwinAppendAr,
568 Description: "static link " + outputFile.Base(),
569 Output: outputFile,
570 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700571 Args: map[string]string{
572 "arFlags": "d",
573 "inAr": dummyAr.String(),
574 },
575 })
576
577 return
578 }
579
Colin Cross0af4b842015-04-30 16:36:18 -0700580 // ARG_MAX on darwin is 262144, use half that to be safe
Colin Cross5b529592017-05-09 13:34:34 -0700581 objFilesLists, err := splitListForSize(objFiles, 131072)
Colin Cross0af4b842015-04-30 16:36:18 -0700582 if err != nil {
583 ctx.ModuleErrorf("%s", err.Error())
584 }
585
Colin Cross5b529592017-05-09 13:34:34 -0700586 var in, out android.WritablePath
Colin Cross0af4b842015-04-30 16:36:18 -0700587 for i, l := range objFilesLists {
588 in = out
589 out = outputFile
590 if i != len(objFilesLists)-1 {
Colin Cross5b529592017-05-09 13:34:34 -0700591 out = android.PathForModuleOut(ctx, outputFile.Base()+strconv.Itoa(i))
Colin Cross0af4b842015-04-30 16:36:18 -0700592 }
593
Colin Crossae887032017-10-23 17:16:14 -0700594 build := android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700595 Rule: darwinAr,
596 Description: "static link " + out.Base(),
597 Output: out,
598 Inputs: l,
599 Implicits: deps,
Colin Cross5b529592017-05-09 13:34:34 -0700600 Args: map[string]string{
601 "arFlags": arFlags,
602 },
Colin Cross0af4b842015-04-30 16:36:18 -0700603 }
Colin Cross5b529592017-05-09 13:34:34 -0700604 if i != 0 {
605 build.Rule = darwinAppendAr
606 build.Args["inAr"] = in.String()
607 }
Colin Crossae887032017-10-23 17:16:14 -0700608 ctx.Build(pctx, build)
Colin Cross0af4b842015-04-30 16:36:18 -0700609 }
610}
611
Colin Cross3f40fa42015-01-30 17:27:36 -0800612// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700613// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700614func TransformObjToDynamicBinary(ctx android.ModuleContext,
615 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
616 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800617
618 var ldCmd string
619 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700620 ldCmd = "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800621 } else {
622 ldCmd = gccCmd(flags.toolchain, "g++")
623 }
624
Colin Cross3f40fa42015-01-30 17:27:36 -0800625 var libFlagsList []string
626
Colin Cross16b23492016-01-06 14:41:07 -0800627 if len(flags.libFlags) > 0 {
628 libFlagsList = append(libFlagsList, flags.libFlags)
629 }
630
Colin Cross3f40fa42015-01-30 17:27:36 -0800631 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800632 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700633 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700634 } else {
635 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700636 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700637 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
638 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800639 }
640
Colin Cross7a7cf972016-12-05 18:47:39 -0800641 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800642 libFlagsList = append(libFlagsList, "-Wl,--start-group")
643 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700644 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800645 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800646 libFlagsList = append(libFlagsList, "-Wl,--end-group")
647 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800648
Stephen Hines10347862016-07-18 15:54:54 -0700649 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700650 libFlagsList = append(libFlagsList, "-Wl,--start-group")
651 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700652 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700653 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700654 libFlagsList = append(libFlagsList, "-Wl,--end-group")
655 }
656
Colin Cross3f40fa42015-01-30 17:27:36 -0800657 for _, lib := range sharedLibs {
Dan Albert9840e1b2016-07-21 08:47:33 -0700658 libFlagsList = append(libFlagsList, lib.String())
Colin Cross3f40fa42015-01-30 17:27:36 -0800659 }
660
Colin Cross3f40fa42015-01-30 17:27:36 -0800661 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700662 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800663 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700664 if crtBegin.Valid() {
665 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800666 }
667
Colin Crossae887032017-10-23 17:16:14 -0700668 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700669 Rule: ld,
670 Description: "link " + outputFile.Base(),
671 Output: outputFile,
672 Inputs: objFiles,
673 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800674 Args: map[string]string{
Dan Albertce2b8392016-07-21 13:16:49 -0700675 "ldCmd": ldCmd,
676 "crtBegin": crtBegin.String(),
677 "libFlags": strings.Join(libFlagsList, " "),
678 "ldFlags": flags.ldFlags,
679 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800680 },
681 })
682}
683
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800684// Generate a rule to combine .dump sAbi dump files from multiple source files
685// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700686func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800687 baseName, exportedHeaderFlags string) android.OptionalPath {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800688 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800689 symbolFilterStr := "-so " + soFile.String()
Colin Crossae887032017-10-23 17:16:14 -0700690 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700691 Rule: sAbiLink,
692 Description: "header-abi-linker " + outputFile.Base(),
693 Output: outputFile,
694 Inputs: sAbiDumps,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800695 Implicit: soFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800696 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800697 "symbolFilter": symbolFilterStr,
698 "arch": ctx.Arch().ArchType.Name,
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,
Logan Chienf3511742017-10-31 18:04:35 +0800717 baseName, exportedHeaderFlags string, isVndkExt bool) android.OptionalPath {
718
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800719 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Logan Chienf3511742017-10-31 18:04:35 +0800720
Jayant Chowdharye4499502018-01-17 13:13:33 -0800721 localAbiCheckAllowFlags := append([]string(nil), abiCheckAllowFlags...)
722 if exportedHeaderFlags == "" {
723 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-advice-only")
724 }
Logan Chienf3511742017-10-31 18:04:35 +0800725 if isVndkExt {
726 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-allow-extensions")
727 }
728
Colin Crossae887032017-10-23 17:16:14 -0700729 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700730 Rule: sAbiDiff,
731 Description: "header-abi-diff " + outputFile.Base(),
732 Output: outputFile,
733 Input: inputDump,
734 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800735 Args: map[string]string{
736 "referenceDump": referenceDump.String(),
Jayant Chowdharyf54e0a72017-05-22 10:53:24 -0700737 "libName": baseName,
738 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdharye4499502018-01-17 13:13:33 -0800739 "allowFlags": strings.Join(localAbiCheckAllowFlags, " "),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800740 },
741 })
742 return android.OptionalPathForPath(outputFile)
743}
744
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700745// Generate a rule for extracting a table of contents from a shared library (.so)
746func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700747 outputFile android.WritablePath, flags builderFlags) {
748
749 crossCompile := gccCmd(flags.toolchain, "")
750
Colin Crossae887032017-10-23 17:16:14 -0700751 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700752 Rule: toc,
753 Description: "generate toc " + inputFile.Base(),
754 Output: outputFile,
755 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700756 Args: map[string]string{
757 "crossCompile": crossCompile,
758 },
759 })
760}
761
Colin Cross3f40fa42015-01-30 17:27:36 -0800762// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700763func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
764 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800765
Colin Cross41280a42015-11-23 14:01:42 -0800766 var ldCmd string
767 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700768 ldCmd = "${config.ClangBin}/clang++"
Colin Cross41280a42015-11-23 14:01:42 -0800769 } else {
770 ldCmd = gccCmd(flags.toolchain, "g++")
771 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800772
Colin Crossae887032017-10-23 17:16:14 -0700773 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700774 Rule: partialLd,
775 Description: "link " + outputFile.Base(),
776 Output: outputFile,
777 Inputs: objFiles,
Colin Cross3f40fa42015-01-30 17:27:36 -0800778 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700779 "ldCmd": ldCmd,
Colin Cross41280a42015-11-23 14:01:42 -0800780 "ldFlags": flags.ldFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800781 },
782 })
783}
784
Colin Crossbfae8852015-03-26 14:44:11 -0700785// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700786func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
787 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700788
789 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
790
Colin Crossae887032017-10-23 17:16:14 -0700791 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700792 Rule: prefixSymbols,
793 Description: "prefix symbols " + outputFile.Base(),
794 Output: outputFile,
795 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700796 Args: map[string]string{
797 "objcopyCmd": objcopyCmd,
798 "prefix": prefix,
799 },
800 })
801}
802
Colin Cross635c3b02016-05-18 15:37:25 -0700803func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
804 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700805
806 crossCompile := gccCmd(flags.toolchain, "")
807 args := ""
808 if flags.stripAddGnuDebuglink {
809 args += " --add-gnu-debuglink"
810 }
811 if flags.stripKeepMiniDebugInfo {
812 args += " --keep-mini-debug-info"
813 }
814 if flags.stripKeepSymbols {
815 args += " --keep-symbols"
816 }
817
Colin Crossae887032017-10-23 17:16:14 -0700818 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700819 Rule: strip,
820 Description: "strip " + outputFile.Base(),
821 Output: outputFile,
822 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700823 Args: map[string]string{
824 "crossCompile": crossCompile,
825 "args": args,
826 },
827 })
828}
829
Colin Cross635c3b02016-05-18 15:37:25 -0700830func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
831 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700832
Colin Crossae887032017-10-23 17:16:14 -0700833 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700834 Rule: darwinStrip,
835 Description: "strip " + outputFile.Base(),
836 Output: outputFile,
837 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700838 })
839}
840
Dan Willemsen581341d2017-02-09 16:16:31 -0800841func TransformCoverageFilesToLib(ctx android.ModuleContext,
842 inputs Objects, flags builderFlags, baseName string) android.OptionalPath {
843
844 if len(inputs.coverageFiles) > 0 {
845 outputFile := android.PathForModuleOut(ctx, baseName+".gcnodir")
846
847 TransformObjToStaticLib(ctx, inputs.coverageFiles, flags, outputFile, nil)
848
849 return android.OptionalPathForPath(outputFile)
850 }
851
852 return android.OptionalPath{}
853}
854
Colin Cross635c3b02016-05-18 15:37:25 -0700855func CopyGccLib(ctx android.ModuleContext, libName string,
856 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800857
Colin Crossae887032017-10-23 17:16:14 -0700858 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700859 Rule: copyGccLib,
860 Description: "copy gcc library " + libName,
861 Output: outputFile,
Colin Cross3f40fa42015-01-30 17:27:36 -0800862 Args: map[string]string{
863 "ccCmd": gccCmd(flags.toolchain, "gcc"),
864 "cFlags": flags.globalFlags,
865 "libName": libName,
866 },
867 })
868}
869
Colin Crossb98c8b02016-07-29 13:44:28 -0700870func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800871 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
872}
Colin Cross0af4b842015-04-30 16:36:18 -0700873
Colin Cross5b529592017-05-09 13:34:34 -0700874func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700875 var i int
876
877 start := 0
878 bytes := 0
879 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700880 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700881 if l > limit {
882 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
883 }
884 if bytes+l > limit {
885 lists = append(lists, list[start:i])
886 start = i
887 bytes = 0
888 }
889 bytes += l + 1 // count a space between each list element
890 }
891
892 lists = append(lists, list[start:])
893
894 totalLen := 0
895 for _, l := range lists {
896 totalLen += len(l)
897 }
898 if totalLen != len(list) {
899 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
900 }
901 return lists, nil
902}