blob: a88df888cbec6cbabfb42367dcef1dc484cf9450 [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{
Chih-Hung Hsieh3ede2942018-01-10 14:30:44 -080070 // Without -no-pie, clang 7.0 adds -pie to link Android files,
71 // but -r and -pie cannot be used together.
72 Command: "$ldCmd -nostdlib -no-pie -Wl,-r ${in} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080073 CommandDeps: []string{"$ldCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080074 },
Colin Cross41280a42015-11-23 14:01:42 -080075 "ldCmd", "ldFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080076
Colin Cross9d45bb72016-08-29 16:14:13 -070077 ar = pctx.AndroidStaticRule("ar",
Colin Cross3f40fa42015-01-30 17:27:36 -080078 blueprint.RuleParams{
Colin Cross7d21c442015-03-30 17:47:53 -070079 Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
Dan Willemsenc94a7682015-11-17 15:27:28 -080080 CommandDeps: []string{"$arCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070081 Rspfile: "${out}.rsp",
82 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080083 },
84 "arCmd", "arFlags")
85
Colin Cross9d45bb72016-08-29 16:14:13 -070086 darwinAr = pctx.AndroidStaticRule("darwinAr",
Colin Cross0af4b842015-04-30 16:36:18 -070087 blueprint.RuleParams{
Colin Crossb98c8b02016-07-29 13:44:28 -070088 Command: "rm -f ${out} && ${config.MacArPath} $arFlags $out $in",
89 CommandDeps: []string{"${config.MacArPath}"},
Colin Cross0af4b842015-04-30 16:36:18 -070090 },
Colin Crossb8ecdfe2016-05-03 15:10:29 -070091 "arFlags")
Colin Cross0af4b842015-04-30 16:36:18 -070092
Colin Cross9d45bb72016-08-29 16:14:13 -070093 darwinAppendAr = pctx.AndroidStaticRule("darwinAppendAr",
Colin Cross0af4b842015-04-30 16:36:18 -070094 blueprint.RuleParams{
Colin Crossb98c8b02016-07-29 13:44:28 -070095 Command: "cp -f ${inAr} ${out}.tmp && ${config.MacArPath} $arFlags ${out}.tmp $in && mv ${out}.tmp ${out}",
96 CommandDeps: []string{"${config.MacArPath}", "${inAr}"},
Colin Cross0af4b842015-04-30 16:36:18 -070097 },
Colin Crossb8ecdfe2016-05-03 15:10:29 -070098 "arFlags", "inAr")
99
Colin Cross9d45bb72016-08-29 16:14:13 -0700100 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700101 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -0700102 Command: "${config.MacStripPath} -u -r -o $out $in",
103 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700104 })
Colin Cross0af4b842015-04-30 16:36:18 -0700105
Colin Cross9d45bb72016-08-29 16:14:13 -0700106 prefixSymbols = pctx.AndroidStaticRule("prefixSymbols",
Colin Crossbfae8852015-03-26 14:44:11 -0700107 blueprint.RuleParams{
108 Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800109 CommandDeps: []string{"$objcopyCmd"},
Colin Crossbfae8852015-03-26 14:44:11 -0700110 },
111 "objcopyCmd", "prefix")
112
Nan Zhang43a485c2017-03-27 14:27:58 -0700113 _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh")
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800114 _ = pctx.SourcePathVariable("xzCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/xz")
Colin Cross665dce92016-04-28 14:50:03 -0700115
Colin Cross9d45bb72016-08-29 16:14:13 -0700116 strip = pctx.AndroidStaticRule("strip",
Colin Cross665dce92016-04-28 14:50:03 -0700117 blueprint.RuleParams{
118 Depfile: "${out}.d",
119 Deps: blueprint.DepsGCC,
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800120 Command: "CROSS_COMPILE=$crossCompile XZ=$xzCmd $stripPath ${args} -i ${in} -o ${out} -d ${out}.d",
121 CommandDeps: []string{"$stripPath", "$xzCmd"},
Colin Cross665dce92016-04-28 14:50:03 -0700122 },
123 "args", "crossCompile")
124
Colin Cross9d45bb72016-08-29 16:14:13 -0700125 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700126 blueprint.RuleParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700127 Command: "rm -f $out && touch $out",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700128 })
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 },
139 "ccCmd", "cFlags", "libName")
Colin Cross26c34ed2016-09-30 17:10:16 -0700140
Nan Zhang43a485c2017-03-27 14:27:58 -0700141 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700142
143 toc = pctx.AndroidStaticRule("toc",
144 blueprint.RuleParams{
145 Depfile: "${out}.d",
146 Deps: blueprint.DepsGCC,
147 Command: "CROSS_COMPILE=$crossCompile $tocPath -i ${in} -o ${out} -d ${out}.d",
148 CommandDeps: []string{"$tocPath"},
149 Restat: true,
150 },
151 "crossCompile")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700152
153 clangTidy = pctx.AndroidStaticRule("clangTidy",
154 blueprint.RuleParams{
155 Command: "rm -f $out && ${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out",
156 CommandDeps: []string{"${config.ClangBin}/clang-tidy"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700157 },
158 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800159
Nan Zhang43a485c2017-03-27 14:27:58 -0700160 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800161
162 yasm = pctx.AndroidStaticRule("yasm",
163 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700164 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800165 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700166 Depfile: "$out.d",
167 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800168 },
169 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800170
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700171 windres = pctx.AndroidStaticRule("windres",
172 blueprint.RuleParams{
173 Command: "$windresCmd $flags -I$$(dirname $in) -i $in -o $out",
174 CommandDeps: []string{"$windresCmd"},
175 },
176 "windresCmd", "flags")
177
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800178 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800179
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700180 // -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 -0800181 sAbiDump = pctx.AndroidStaticRule("sAbiDump",
182 blueprint.RuleParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700183 Command: "rm -f $out && $sAbiDumper -o ${out} $in $exportDirs -- $cFlags -w -isystem ${config.RSIncludePath}",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800184 CommandDeps: []string{"$sAbiDumper"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800185 },
186 "cFlags", "exportDirs")
187
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800188 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800189
190 sAbiLink = pctx.AndroidStaticRule("sAbiLink",
191 blueprint.RuleParams{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800192 Command: "$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800193 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800194 Rspfile: "${out}.rsp",
195 RspfileContent: "${in}",
196 },
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800197 "symbolFilter", "arch", "exportedHeaderFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800198
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800199 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700200
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800201 sAbiDiff = pctx.AndroidRuleFunc("sAbiDiff",
Dan Willemsen54daaf02018-03-12 13:24:09 -0700202 func(ctx android.PackageRuleContext) blueprint.RuleParams {
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800203
204 commandStr := "($sAbiDiffer $allowFlags -lib $libName -arch $arch -check-all-apis -o ${out} -new $in -old $referenceDump)"
Dan Willemsenbc0c5092018-03-10 16:25:53 -0800205 distAbiDiffDir := android.PathForDist(ctx, "abidiffs")
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800206 commandStr += "|| (echo ' ---- Please update abi references by running platform/development/vndk/tools/header-checker/utils/create_reference_dumps.py -l ${libName} ----'"
Dan Willemsenbc0c5092018-03-10 16:25:53 -0800207 if distAbiDiffDir.Valid() {
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800208 commandStr += ") && (mkdir -p " + distAbiDiffDir.String() + " && cp ${out} " + distAbiDiffDir.String()
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800209 }
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800210 commandStr += " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800211 return blueprint.RuleParams{
212 Command: commandStr,
213 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700214 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800215 },
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -0700216 "allowFlags", "referenceDump", "libName", "arch")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700217
218 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
219 blueprint.RuleParams{
220 Command: "gunzip -c $in > $out",
221 })
Colin Cross3f40fa42015-01-30 17:27:36 -0800222)
223
Dan Willemsen322a0a62015-11-17 15:19:46 -0800224func init() {
225 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
226 // debug output. That way two builds in two different directories will
227 // create the same output.
228 if runtime.GOOS != "darwin" {
229 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
230 } else {
231 // Darwin doesn't have /proc
232 pctx.StaticVariable("relPwd", "")
233 }
234}
235
Colin Cross3f40fa42015-01-30 17:27:36 -0800236type builderFlags struct {
Joe Onorato09e94ab2017-11-18 18:23:14 -0800237 globalFlags string
238 arFlags string
239 asFlags string
240 cFlags string
241 toolingCFlags string // A separate set of Cflags for clang LibTooling tools
242 conlyFlags string
243 cppFlags string
244 ldFlags string
245 libFlags string
246 yaccFlags string
247 protoFlags string
248 protoOutParams string
249 tidyFlags string
250 sAbiFlags string
251 yasmFlags string
252 aidlFlags string
253 rsFlags string
254 toolchain config.Toolchain
255 clang bool
256 tidy bool
257 coverage bool
258 sAbiDump bool
Dan Willemsenab9f4262018-02-14 13:58:34 -0800259 protoRoot bool
Colin Cross665dce92016-04-28 14:50:03 -0700260
Colin Crossc3199482017-03-30 15:03:04 -0700261 systemIncludeFlags string
262
Colin Cross18c0c5a2016-12-01 14:45:23 -0800263 groupStaticLibs bool
Zhizhou Yang51be6322018-02-08 18:32:11 -0800264 arGoldPlugin bool
Colin Cross18c0c5a2016-12-01 14:45:23 -0800265
Colin Cross665dce92016-04-28 14:50:03 -0700266 stripKeepSymbols bool
267 stripKeepMiniDebugInfo bool
268 stripAddGnuDebuglink bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800269}
270
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700271type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800272 objFiles android.Paths
273 tidyFiles android.Paths
274 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800275 sAbiDumpFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700276}
277
278func (a Objects) Copy() Objects {
279 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800280 objFiles: append(android.Paths{}, a.objFiles...),
281 tidyFiles: append(android.Paths{}, a.tidyFiles...),
282 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800283 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700284 }
285}
286
287func (a Objects) Append(b Objects) Objects {
288 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800289 objFiles: append(a.objFiles, b.objFiles...),
290 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
291 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800292 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700293 }
294}
295
Colin Cross3f40fa42015-01-30 17:27:36 -0800296// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700297func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800298 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700299
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700300 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700301 var tidyFiles android.Paths
302 if flags.tidy && flags.clang {
303 tidyFiles = make(android.Paths, 0, len(srcFiles))
304 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800305 var coverageFiles android.Paths
306 if flags.coverage {
307 coverageFiles = make(android.Paths, 0, len(srcFiles))
308 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800309
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700310 commonFlags := strings.Join([]string{
Colin Crossc3199482017-03-30 15:03:04 -0700311 flags.globalFlags,
312 flags.systemIncludeFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700313 }, " ")
314
315 toolingCflags := strings.Join([]string{
316 commonFlags,
317 flags.toolingCFlags,
318 flags.conlyFlags,
319 }, " ")
320
321 cflags := strings.Join([]string{
322 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700323 flags.cFlags,
324 flags.conlyFlags,
325 }, " ")
326
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700327 toolingCppflags := strings.Join([]string{
328 commonFlags,
329 flags.toolingCFlags,
330 flags.cppFlags,
331 }, " ")
332
Colin Crossc3199482017-03-30 15:03:04 -0700333 cppflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700334 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700335 flags.cFlags,
336 flags.cppFlags,
337 }, " ")
338
339 asflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700340 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700341 flags.asFlags,
342 }, " ")
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700343
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800344 var sAbiDumpFiles android.Paths
345 if flags.sAbiDump && flags.clang {
346 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
347 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800348
Dan Willemsenbe03f342016-03-03 17:21:04 -0800349 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700350 cflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700351 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700352 cppflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700353 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800354 } else {
Colin Crossb98c8b02016-07-29 13:44:28 -0700355 cflags += " ${config.NoOverrideGlobalCflags}"
356 cppflags += " ${config.NoOverrideGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800357 }
358
Colin Cross3f40fa42015-01-30 17:27:36 -0800359 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700360 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800361
362 objFiles[i] = objFile
363
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700364 switch srcFile.Ext() {
365 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700366 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700367 Rule: yasm,
368 Description: "yasm " + srcFile.Rel(),
369 Output: objFile,
370 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800371 Implicits: cFlagsDeps,
372 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800373 Args: map[string]string{
374 "asFlags": flags.yasmFlags,
375 },
376 })
377 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700378 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700379 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700380 Rule: windres,
381 Description: "windres " + srcFile.Rel(),
382 Output: objFile,
383 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800384 Implicits: cFlagsDeps,
385 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700386 Args: map[string]string{
387 "windresCmd": gccCmd(flags.toolchain, "windres"),
388 "flags": flags.toolchain.WindresFlags(),
389 },
390 })
391 continue
Colin Cross91e90042016-12-02 17:13:24 -0800392 }
393
Colin Cross3f40fa42015-01-30 17:27:36 -0800394 var moduleCflags string
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700395 var moduleToolingCflags string
Colin Cross3f40fa42015-01-30 17:27:36 -0800396 var ccCmd string
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700397 tidy := flags.tidy && flags.clang
Dan Willemsen581341d2017-02-09 16:16:31 -0800398 coverage := flags.coverage
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800399 dump := flags.sAbiDump && flags.clang
Colin Cross3f40fa42015-01-30 17:27:36 -0800400
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700401 switch srcFile.Ext() {
Colin Cross3f40fa42015-01-30 17:27:36 -0800402 case ".S", ".s":
403 ccCmd = "gcc"
404 moduleCflags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700405 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800406 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800407 dump = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800408 case ".c":
409 ccCmd = "gcc"
410 moduleCflags = cflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700411 moduleToolingCflags = toolingCflags
Colin Cross9978ffe2016-12-01 15:31:22 -0800412 case ".cpp", ".cc", ".mm":
Colin Cross3f40fa42015-01-30 17:27:36 -0800413 ccCmd = "g++"
414 moduleCflags = cppflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700415 moduleToolingCflags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800416 default:
417 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
418 continue
419 }
420
421 if flags.clang {
422 switch ccCmd {
423 case "gcc":
424 ccCmd = "clang"
425 case "g++":
426 ccCmd = "clang++"
427 default:
428 panic("unrecoginzied ccCmd")
429 }
Colin Cross67a5c132017-05-09 13:45:28 -0700430 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800431
Colin Cross67a5c132017-05-09 13:45:28 -0700432 ccDesc := ccCmd
433
434 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700435 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800436 } else {
437 ccCmd = gccCmd(flags.toolchain, ccCmd)
438 }
439
Dan Willemsen581341d2017-02-09 16:16:31 -0800440 var implicitOutputs android.WritablePaths
441 if coverage {
442 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
443 implicitOutputs = append(implicitOutputs, gcnoFile)
444 coverageFiles = append(coverageFiles, gcnoFile)
445 }
446
Colin Crossae887032017-10-23 17:16:14 -0700447 ctx.Build(pctx, android.BuildParams{
Dan Willemsen581341d2017-02-09 16:16:31 -0800448 Rule: cc,
Colin Cross67a5c132017-05-09 13:45:28 -0700449 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800450 Output: objFile,
451 ImplicitOutputs: implicitOutputs,
452 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800453 Implicits: cFlagsDeps,
454 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800455 Args: map[string]string{
Colin Cross28344522015-04-22 13:07:53 -0700456 "cFlags": moduleCflags,
457 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800458 },
459 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700460
461 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700462 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700463 tidyFiles = append(tidyFiles, tidyFile)
464
Colin Crossae887032017-10-23 17:16:14 -0700465 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700466 Rule: clangTidy,
467 Description: "clang-tidy " + srcFile.Rel(),
468 Output: tidyFile,
469 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700470 // We must depend on objFile, since clang-tidy doesn't
471 // support exporting dependencies.
472 Implicit: objFile,
473 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700474 "cFlags": moduleToolingCflags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700475 "tidyFlags": flags.tidyFlags,
476 },
477 })
478 }
479
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800480 if dump {
481 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
482 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
483
Colin Crossae887032017-10-23 17:16:14 -0700484 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700485 Rule: sAbiDump,
486 Description: "header-abi-dumper " + srcFile.Rel(),
487 Output: sAbiDumpFile,
488 Input: srcFile,
489 Implicit: objFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800490 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700491 "cFlags": moduleToolingCflags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800492 "exportDirs": flags.sAbiFlags,
493 },
494 })
495 }
496
Colin Cross3f40fa42015-01-30 17:27:36 -0800497 }
498
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700499 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800500 objFiles: objFiles,
501 tidyFiles: tidyFiles,
502 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800503 sAbiDumpFiles: sAbiDumpFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700504 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800505}
506
507// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700508func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700509 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800510
Dan Willemsen581341d2017-02-09 16:16:31 -0800511 if ctx.Darwin() {
512 transformDarwinObjToStaticLib(ctx, objFiles, flags, outputFile, deps)
513 return
514 }
515
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800516 arCmd := "${config.ClangBin}/llvm-ar"
517 arFlags := "crsD"
518 if !ctx.Darwin() {
519 arFlags += " -format=gnu"
520 }
Zhizhou Yang51be6322018-02-08 18:32:11 -0800521 if flags.arGoldPlugin {
522 arFlags += " --plugin ${config.LLVMGoldPlugin}"
523 }
Vishwath Mohan83d9f712017-03-16 11:01:23 -0700524 if flags.arFlags != "" {
525 arFlags += " " + flags.arFlags
526 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800527
Colin Crossae887032017-10-23 17:16:14 -0700528 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700529 Rule: ar,
530 Description: "static link " + outputFile.Base(),
531 Output: outputFile,
532 Inputs: objFiles,
533 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800534 Args: map[string]string{
535 "arFlags": arFlags,
536 "arCmd": arCmd,
537 },
538 })
539}
540
Colin Cross0af4b842015-04-30 16:36:18 -0700541// Generate a rule for compiling multiple .o files to a static library (.a) on
542// darwin. The darwin ar tool doesn't support @file for list files, and has a
543// very small command line length limit, so we have to split the ar into multiple
544// steps, each appending to the previous one.
Dan Willemsen581341d2017-02-09 16:16:31 -0800545func transformDarwinObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Colin Cross5b529592017-05-09 13:34:34 -0700546 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross0af4b842015-04-30 16:36:18 -0700547
Colin Cross0af4b842015-04-30 16:36:18 -0700548 arFlags := "cqs"
549
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700550 if len(objFiles) == 0 {
Colin Cross635c3b02016-05-18 15:37:25 -0700551 dummy := android.PathForModuleOut(ctx, "dummy"+objectExtension)
552 dummyAr := android.PathForModuleOut(ctx, "dummy"+staticLibraryExtension)
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700553
Colin Crossae887032017-10-23 17:16:14 -0700554 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700555 Rule: emptyFile,
556 Description: "empty object file",
557 Output: dummy,
558 Implicits: deps,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700559 })
560
Colin Crossae887032017-10-23 17:16:14 -0700561 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700562 Rule: darwinAr,
563 Description: "empty static archive",
564 Output: dummyAr,
565 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700566 Args: map[string]string{
567 "arFlags": arFlags,
568 },
569 })
570
Colin Crossae887032017-10-23 17:16:14 -0700571 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700572 Rule: darwinAppendAr,
573 Description: "static link " + outputFile.Base(),
574 Output: outputFile,
575 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700576 Args: map[string]string{
577 "arFlags": "d",
578 "inAr": dummyAr.String(),
579 },
580 })
581
582 return
583 }
584
Colin Cross0af4b842015-04-30 16:36:18 -0700585 // ARG_MAX on darwin is 262144, use half that to be safe
Colin Cross5b529592017-05-09 13:34:34 -0700586 objFilesLists, err := splitListForSize(objFiles, 131072)
Colin Cross0af4b842015-04-30 16:36:18 -0700587 if err != nil {
588 ctx.ModuleErrorf("%s", err.Error())
589 }
590
Colin Cross5b529592017-05-09 13:34:34 -0700591 var in, out android.WritablePath
Colin Cross0af4b842015-04-30 16:36:18 -0700592 for i, l := range objFilesLists {
593 in = out
594 out = outputFile
595 if i != len(objFilesLists)-1 {
Colin Cross5b529592017-05-09 13:34:34 -0700596 out = android.PathForModuleOut(ctx, outputFile.Base()+strconv.Itoa(i))
Colin Cross0af4b842015-04-30 16:36:18 -0700597 }
598
Colin Crossae887032017-10-23 17:16:14 -0700599 build := android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700600 Rule: darwinAr,
601 Description: "static link " + out.Base(),
602 Output: out,
603 Inputs: l,
604 Implicits: deps,
Colin Cross5b529592017-05-09 13:34:34 -0700605 Args: map[string]string{
606 "arFlags": arFlags,
607 },
Colin Cross0af4b842015-04-30 16:36:18 -0700608 }
Colin Cross5b529592017-05-09 13:34:34 -0700609 if i != 0 {
610 build.Rule = darwinAppendAr
611 build.Args["inAr"] = in.String()
612 }
Colin Crossae887032017-10-23 17:16:14 -0700613 ctx.Build(pctx, build)
Colin Cross0af4b842015-04-30 16:36:18 -0700614 }
615}
616
Colin Cross3f40fa42015-01-30 17:27:36 -0800617// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700618// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700619func TransformObjToDynamicBinary(ctx android.ModuleContext,
620 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
621 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800622
623 var ldCmd string
624 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700625 ldCmd = "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800626 } else {
627 ldCmd = gccCmd(flags.toolchain, "g++")
628 }
629
Colin Cross3f40fa42015-01-30 17:27:36 -0800630 var libFlagsList []string
631
Colin Cross16b23492016-01-06 14:41:07 -0800632 if len(flags.libFlags) > 0 {
633 libFlagsList = append(libFlagsList, flags.libFlags)
634 }
635
Colin Cross3f40fa42015-01-30 17:27:36 -0800636 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800637 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700638 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700639 } else {
640 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700641 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700642 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
643 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800644 }
645
Colin Cross7a7cf972016-12-05 18:47:39 -0800646 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800647 libFlagsList = append(libFlagsList, "-Wl,--start-group")
648 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700649 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800650 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800651 libFlagsList = append(libFlagsList, "-Wl,--end-group")
652 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800653
Stephen Hines10347862016-07-18 15:54:54 -0700654 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700655 libFlagsList = append(libFlagsList, "-Wl,--start-group")
656 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700657 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700658 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700659 libFlagsList = append(libFlagsList, "-Wl,--end-group")
660 }
661
Colin Cross3f40fa42015-01-30 17:27:36 -0800662 for _, lib := range sharedLibs {
Dan Albert9840e1b2016-07-21 08:47:33 -0700663 libFlagsList = append(libFlagsList, lib.String())
Colin Cross3f40fa42015-01-30 17:27:36 -0800664 }
665
Colin Cross3f40fa42015-01-30 17:27:36 -0800666 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700667 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800668 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700669 if crtBegin.Valid() {
670 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800671 }
672
Colin Crossae887032017-10-23 17:16:14 -0700673 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700674 Rule: ld,
675 Description: "link " + outputFile.Base(),
676 Output: outputFile,
677 Inputs: objFiles,
678 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800679 Args: map[string]string{
Dan Albertce2b8392016-07-21 13:16:49 -0700680 "ldCmd": ldCmd,
681 "crtBegin": crtBegin.String(),
682 "libFlags": strings.Join(libFlagsList, " "),
683 "ldFlags": flags.ldFlags,
684 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800685 },
686 })
687}
688
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800689// Generate a rule to combine .dump sAbi dump files from multiple source files
690// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700691func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800692 baseName, exportedHeaderFlags string) android.OptionalPath {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800693 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Jayant Chowdharydcd33b62018-02-23 16:43:23 -0800694 sabiLock.Lock()
695 lsdumpPaths = append(lsdumpPaths, outputFile.String())
696 sabiLock.Unlock()
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800697 symbolFilterStr := "-so " + soFile.String()
Colin Crossae887032017-10-23 17:16:14 -0700698 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700699 Rule: sAbiLink,
700 Description: "header-abi-linker " + outputFile.Base(),
701 Output: outputFile,
702 Inputs: sAbiDumps,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800703 Implicit: soFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800704 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800705 "symbolFilter": symbolFilterStr,
706 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800707 "exportedHeaderFlags": exportedHeaderFlags,
708 },
709 })
710 return android.OptionalPathForPath(outputFile)
711}
712
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700713func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
714 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700715 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700716 Rule: unzipRefSAbiDump,
717 Description: "gunzip" + outputFile.Base(),
718 Output: outputFile,
719 Input: zippedRefDump,
720 })
721 return outputFile
722}
723
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800724func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chienf3511742017-10-31 18:04:35 +0800725 baseName, exportedHeaderFlags string, isVndkExt bool) android.OptionalPath {
726
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800727 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Logan Chienf3511742017-10-31 18:04:35 +0800728
Jayant Chowdharye4499502018-01-17 13:13:33 -0800729 localAbiCheckAllowFlags := append([]string(nil), abiCheckAllowFlags...)
730 if exportedHeaderFlags == "" {
731 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-advice-only")
732 }
Logan Chienf3511742017-10-31 18:04:35 +0800733 if isVndkExt {
734 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-allow-extensions")
735 }
736
Colin Crossae887032017-10-23 17:16:14 -0700737 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700738 Rule: sAbiDiff,
739 Description: "header-abi-diff " + outputFile.Base(),
740 Output: outputFile,
741 Input: inputDump,
742 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800743 Args: map[string]string{
744 "referenceDump": referenceDump.String(),
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800745 "libName": baseName[0:(len(baseName) - len(filepath.Ext(baseName)))],
Jayant Chowdharyf54e0a72017-05-22 10:53:24 -0700746 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdharye4499502018-01-17 13:13:33 -0800747 "allowFlags": strings.Join(localAbiCheckAllowFlags, " "),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800748 },
749 })
750 return android.OptionalPathForPath(outputFile)
751}
752
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700753// Generate a rule for extracting a table of contents from a shared library (.so)
754func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700755 outputFile android.WritablePath, flags builderFlags) {
756
757 crossCompile := gccCmd(flags.toolchain, "")
758
Colin Crossae887032017-10-23 17:16:14 -0700759 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700760 Rule: toc,
761 Description: "generate toc " + inputFile.Base(),
762 Output: outputFile,
763 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700764 Args: map[string]string{
765 "crossCompile": crossCompile,
766 },
767 })
768}
769
Colin Cross3f40fa42015-01-30 17:27:36 -0800770// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700771func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
772 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800773
Colin Cross41280a42015-11-23 14:01:42 -0800774 var ldCmd string
775 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700776 ldCmd = "${config.ClangBin}/clang++"
Colin Cross41280a42015-11-23 14:01:42 -0800777 } else {
778 ldCmd = gccCmd(flags.toolchain, "g++")
779 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800780
Colin Crossae887032017-10-23 17:16:14 -0700781 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700782 Rule: partialLd,
783 Description: "link " + outputFile.Base(),
784 Output: outputFile,
785 Inputs: objFiles,
Colin Cross3f40fa42015-01-30 17:27:36 -0800786 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700787 "ldCmd": ldCmd,
Colin Cross41280a42015-11-23 14:01:42 -0800788 "ldFlags": flags.ldFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800789 },
790 })
791}
792
Colin Crossbfae8852015-03-26 14:44:11 -0700793// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700794func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
795 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700796
797 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
798
Colin Crossae887032017-10-23 17:16:14 -0700799 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700800 Rule: prefixSymbols,
801 Description: "prefix symbols " + outputFile.Base(),
802 Output: outputFile,
803 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700804 Args: map[string]string{
805 "objcopyCmd": objcopyCmd,
806 "prefix": prefix,
807 },
808 })
809}
810
Colin Cross635c3b02016-05-18 15:37:25 -0700811func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
812 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700813
814 crossCompile := gccCmd(flags.toolchain, "")
815 args := ""
816 if flags.stripAddGnuDebuglink {
817 args += " --add-gnu-debuglink"
818 }
819 if flags.stripKeepMiniDebugInfo {
820 args += " --keep-mini-debug-info"
821 }
822 if flags.stripKeepSymbols {
823 args += " --keep-symbols"
824 }
825
Colin Crossae887032017-10-23 17:16:14 -0700826 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700827 Rule: strip,
828 Description: "strip " + outputFile.Base(),
829 Output: outputFile,
830 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700831 Args: map[string]string{
832 "crossCompile": crossCompile,
833 "args": args,
834 },
835 })
836}
837
Colin Cross635c3b02016-05-18 15:37:25 -0700838func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
839 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700840
Colin Crossae887032017-10-23 17:16:14 -0700841 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700842 Rule: darwinStrip,
843 Description: "strip " + outputFile.Base(),
844 Output: outputFile,
845 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700846 })
847}
848
Dan Willemsen581341d2017-02-09 16:16:31 -0800849func TransformCoverageFilesToLib(ctx android.ModuleContext,
850 inputs Objects, flags builderFlags, baseName string) android.OptionalPath {
851
852 if len(inputs.coverageFiles) > 0 {
853 outputFile := android.PathForModuleOut(ctx, baseName+".gcnodir")
854
855 TransformObjToStaticLib(ctx, inputs.coverageFiles, flags, outputFile, nil)
856
857 return android.OptionalPathForPath(outputFile)
858 }
859
860 return android.OptionalPath{}
861}
862
Colin Cross635c3b02016-05-18 15:37:25 -0700863func CopyGccLib(ctx android.ModuleContext, libName string,
864 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800865
Colin Crossae887032017-10-23 17:16:14 -0700866 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700867 Rule: copyGccLib,
868 Description: "copy gcc library " + libName,
869 Output: outputFile,
Colin Cross3f40fa42015-01-30 17:27:36 -0800870 Args: map[string]string{
871 "ccCmd": gccCmd(flags.toolchain, "gcc"),
872 "cFlags": flags.globalFlags,
873 "libName": libName,
874 },
875 })
876}
877
Colin Crossb98c8b02016-07-29 13:44:28 -0700878func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800879 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
880}
Colin Cross0af4b842015-04-30 16:36:18 -0700881
Colin Cross5b529592017-05-09 13:34:34 -0700882func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700883 var i int
884
885 start := 0
886 bytes := 0
887 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700888 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700889 if l > limit {
890 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
891 }
892 if bytes+l > limit {
893 lists = append(lists, list[start:i])
894 start = i
895 bytes = 0
896 }
897 bytes += l + 1 // count a space between each list element
898 }
899
900 lists = append(lists, list[start:])
901
902 totalLen := 0
903 for _, l := range lists {
904 totalLen += len(l)
905 }
906 if totalLen != len(list) {
907 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
908 }
909 return lists, nil
910}