blob: 53ef69c47139af4cb4fc5c73fdeb5b2cb0260f6a [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")
206 if distAbiDiffDir.Valid() {
207 commandStr += " || (mkdir -p " + distAbiDiffDir.String() + " && cp ${out} " + distAbiDiffDir.String() + " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800208 }
209 return blueprint.RuleParams{
210 Command: commandStr,
211 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700212 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800213 },
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -0700214 "allowFlags", "referenceDump", "libName", "arch")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700215
216 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
217 blueprint.RuleParams{
218 Command: "gunzip -c $in > $out",
219 })
Colin Cross3f40fa42015-01-30 17:27:36 -0800220)
221
Dan Willemsen322a0a62015-11-17 15:19:46 -0800222func init() {
223 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
224 // debug output. That way two builds in two different directories will
225 // create the same output.
226 if runtime.GOOS != "darwin" {
227 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
228 } else {
229 // Darwin doesn't have /proc
230 pctx.StaticVariable("relPwd", "")
231 }
232}
233
Colin Cross3f40fa42015-01-30 17:27:36 -0800234type builderFlags struct {
Joe Onorato09e94ab2017-11-18 18:23:14 -0800235 globalFlags string
236 arFlags string
237 asFlags string
238 cFlags string
239 toolingCFlags string // A separate set of Cflags for clang LibTooling tools
240 conlyFlags string
241 cppFlags string
242 ldFlags string
243 libFlags string
244 yaccFlags string
245 protoFlags string
246 protoOutParams string
247 tidyFlags string
248 sAbiFlags string
249 yasmFlags string
250 aidlFlags string
251 rsFlags string
252 toolchain config.Toolchain
253 clang bool
254 tidy bool
255 coverage bool
256 sAbiDump bool
Dan Willemsenab9f4262018-02-14 13:58:34 -0800257 protoRoot bool
Colin Cross665dce92016-04-28 14:50:03 -0700258
Colin Crossc3199482017-03-30 15:03:04 -0700259 systemIncludeFlags string
260
Colin Cross18c0c5a2016-12-01 14:45:23 -0800261 groupStaticLibs bool
Zhizhou Yang51be6322018-02-08 18:32:11 -0800262 arGoldPlugin bool
Colin Cross18c0c5a2016-12-01 14:45:23 -0800263
Colin Cross665dce92016-04-28 14:50:03 -0700264 stripKeepSymbols bool
265 stripKeepMiniDebugInfo bool
266 stripAddGnuDebuglink bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800267}
268
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700269type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800270 objFiles android.Paths
271 tidyFiles android.Paths
272 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800273 sAbiDumpFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700274}
275
276func (a Objects) Copy() Objects {
277 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800278 objFiles: append(android.Paths{}, a.objFiles...),
279 tidyFiles: append(android.Paths{}, a.tidyFiles...),
280 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800281 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700282 }
283}
284
285func (a Objects) Append(b Objects) Objects {
286 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800287 objFiles: append(a.objFiles, b.objFiles...),
288 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
289 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800290 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700291 }
292}
293
Colin Cross3f40fa42015-01-30 17:27:36 -0800294// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700295func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800296 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700297
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700298 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700299 var tidyFiles android.Paths
300 if flags.tidy && flags.clang {
301 tidyFiles = make(android.Paths, 0, len(srcFiles))
302 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800303 var coverageFiles android.Paths
304 if flags.coverage {
305 coverageFiles = make(android.Paths, 0, len(srcFiles))
306 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800307
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700308 commonFlags := strings.Join([]string{
Colin Crossc3199482017-03-30 15:03:04 -0700309 flags.globalFlags,
310 flags.systemIncludeFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700311 }, " ")
312
313 toolingCflags := strings.Join([]string{
314 commonFlags,
315 flags.toolingCFlags,
316 flags.conlyFlags,
317 }, " ")
318
319 cflags := strings.Join([]string{
320 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700321 flags.cFlags,
322 flags.conlyFlags,
323 }, " ")
324
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700325 toolingCppflags := strings.Join([]string{
326 commonFlags,
327 flags.toolingCFlags,
328 flags.cppFlags,
329 }, " ")
330
Colin Crossc3199482017-03-30 15:03:04 -0700331 cppflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700332 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700333 flags.cFlags,
334 flags.cppFlags,
335 }, " ")
336
337 asflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700338 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700339 flags.asFlags,
340 }, " ")
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700341
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800342 var sAbiDumpFiles android.Paths
343 if flags.sAbiDump && flags.clang {
344 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
345 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800346
Dan Willemsenbe03f342016-03-03 17:21:04 -0800347 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700348 cflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700349 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700350 cppflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700351 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800352 } else {
Colin Crossb98c8b02016-07-29 13:44:28 -0700353 cflags += " ${config.NoOverrideGlobalCflags}"
354 cppflags += " ${config.NoOverrideGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800355 }
356
Colin Cross3f40fa42015-01-30 17:27:36 -0800357 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700358 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800359
360 objFiles[i] = objFile
361
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700362 switch srcFile.Ext() {
363 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700364 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700365 Rule: yasm,
366 Description: "yasm " + srcFile.Rel(),
367 Output: objFile,
368 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800369 Implicits: cFlagsDeps,
370 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800371 Args: map[string]string{
372 "asFlags": flags.yasmFlags,
373 },
374 })
375 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700376 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700377 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700378 Rule: windres,
379 Description: "windres " + srcFile.Rel(),
380 Output: objFile,
381 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800382 Implicits: cFlagsDeps,
383 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700384 Args: map[string]string{
385 "windresCmd": gccCmd(flags.toolchain, "windres"),
386 "flags": flags.toolchain.WindresFlags(),
387 },
388 })
389 continue
Colin Cross91e90042016-12-02 17:13:24 -0800390 }
391
Colin Cross3f40fa42015-01-30 17:27:36 -0800392 var moduleCflags string
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700393 var moduleToolingCflags string
Colin Cross3f40fa42015-01-30 17:27:36 -0800394 var ccCmd string
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700395 tidy := flags.tidy && flags.clang
Dan Willemsen581341d2017-02-09 16:16:31 -0800396 coverage := flags.coverage
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800397 dump := flags.sAbiDump && flags.clang
Colin Cross3f40fa42015-01-30 17:27:36 -0800398
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700399 switch srcFile.Ext() {
Colin Cross3f40fa42015-01-30 17:27:36 -0800400 case ".S", ".s":
401 ccCmd = "gcc"
402 moduleCflags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700403 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800404 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800405 dump = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800406 case ".c":
407 ccCmd = "gcc"
408 moduleCflags = cflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700409 moduleToolingCflags = toolingCflags
Colin Cross9978ffe2016-12-01 15:31:22 -0800410 case ".cpp", ".cc", ".mm":
Colin Cross3f40fa42015-01-30 17:27:36 -0800411 ccCmd = "g++"
412 moduleCflags = cppflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700413 moduleToolingCflags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800414 default:
415 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
416 continue
417 }
418
419 if flags.clang {
420 switch ccCmd {
421 case "gcc":
422 ccCmd = "clang"
423 case "g++":
424 ccCmd = "clang++"
425 default:
426 panic("unrecoginzied ccCmd")
427 }
Colin Cross67a5c132017-05-09 13:45:28 -0700428 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800429
Colin Cross67a5c132017-05-09 13:45:28 -0700430 ccDesc := ccCmd
431
432 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700433 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800434 } else {
435 ccCmd = gccCmd(flags.toolchain, ccCmd)
436 }
437
Dan Willemsen581341d2017-02-09 16:16:31 -0800438 var implicitOutputs android.WritablePaths
439 if coverage {
440 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
441 implicitOutputs = append(implicitOutputs, gcnoFile)
442 coverageFiles = append(coverageFiles, gcnoFile)
443 }
444
Colin Crossae887032017-10-23 17:16:14 -0700445 ctx.Build(pctx, android.BuildParams{
Dan Willemsen581341d2017-02-09 16:16:31 -0800446 Rule: cc,
Colin Cross67a5c132017-05-09 13:45:28 -0700447 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800448 Output: objFile,
449 ImplicitOutputs: implicitOutputs,
450 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800451 Implicits: cFlagsDeps,
452 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800453 Args: map[string]string{
Colin Cross28344522015-04-22 13:07:53 -0700454 "cFlags": moduleCflags,
455 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800456 },
457 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700458
459 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700460 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700461 tidyFiles = append(tidyFiles, tidyFile)
462
Colin Crossae887032017-10-23 17:16:14 -0700463 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700464 Rule: clangTidy,
465 Description: "clang-tidy " + srcFile.Rel(),
466 Output: tidyFile,
467 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700468 // We must depend on objFile, since clang-tidy doesn't
469 // support exporting dependencies.
470 Implicit: objFile,
471 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700472 "cFlags": moduleToolingCflags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700473 "tidyFlags": flags.tidyFlags,
474 },
475 })
476 }
477
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800478 if dump {
479 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
480 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
481
Colin Crossae887032017-10-23 17:16:14 -0700482 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700483 Rule: sAbiDump,
484 Description: "header-abi-dumper " + srcFile.Rel(),
485 Output: sAbiDumpFile,
486 Input: srcFile,
487 Implicit: objFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800488 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700489 "cFlags": moduleToolingCflags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800490 "exportDirs": flags.sAbiFlags,
491 },
492 })
493 }
494
Colin Cross3f40fa42015-01-30 17:27:36 -0800495 }
496
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700497 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800498 objFiles: objFiles,
499 tidyFiles: tidyFiles,
500 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800501 sAbiDumpFiles: sAbiDumpFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700502 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800503}
504
505// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700506func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700507 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800508
Dan Willemsen581341d2017-02-09 16:16:31 -0800509 if ctx.Darwin() {
510 transformDarwinObjToStaticLib(ctx, objFiles, flags, outputFile, deps)
511 return
512 }
513
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800514 arCmd := "${config.ClangBin}/llvm-ar"
515 arFlags := "crsD"
516 if !ctx.Darwin() {
517 arFlags += " -format=gnu"
518 }
Zhizhou Yang51be6322018-02-08 18:32:11 -0800519 if flags.arGoldPlugin {
520 arFlags += " --plugin ${config.LLVMGoldPlugin}"
521 }
Vishwath Mohan83d9f712017-03-16 11:01:23 -0700522 if flags.arFlags != "" {
523 arFlags += " " + flags.arFlags
524 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800525
Colin Crossae887032017-10-23 17:16:14 -0700526 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700527 Rule: ar,
528 Description: "static link " + outputFile.Base(),
529 Output: outputFile,
530 Inputs: objFiles,
531 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800532 Args: map[string]string{
533 "arFlags": arFlags,
534 "arCmd": arCmd,
535 },
536 })
537}
538
Colin Cross0af4b842015-04-30 16:36:18 -0700539// Generate a rule for compiling multiple .o files to a static library (.a) on
540// darwin. The darwin ar tool doesn't support @file for list files, and has a
541// very small command line length limit, so we have to split the ar into multiple
542// steps, each appending to the previous one.
Dan Willemsen581341d2017-02-09 16:16:31 -0800543func transformDarwinObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Colin Cross5b529592017-05-09 13:34:34 -0700544 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross0af4b842015-04-30 16:36:18 -0700545
Colin Cross0af4b842015-04-30 16:36:18 -0700546 arFlags := "cqs"
547
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700548 if len(objFiles) == 0 {
Colin Cross635c3b02016-05-18 15:37:25 -0700549 dummy := android.PathForModuleOut(ctx, "dummy"+objectExtension)
550 dummyAr := android.PathForModuleOut(ctx, "dummy"+staticLibraryExtension)
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700551
Colin Crossae887032017-10-23 17:16:14 -0700552 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700553 Rule: emptyFile,
554 Description: "empty object file",
555 Output: dummy,
556 Implicits: deps,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700557 })
558
Colin Crossae887032017-10-23 17:16:14 -0700559 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700560 Rule: darwinAr,
561 Description: "empty static archive",
562 Output: dummyAr,
563 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700564 Args: map[string]string{
565 "arFlags": arFlags,
566 },
567 })
568
Colin Crossae887032017-10-23 17:16:14 -0700569 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700570 Rule: darwinAppendAr,
571 Description: "static link " + outputFile.Base(),
572 Output: outputFile,
573 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700574 Args: map[string]string{
575 "arFlags": "d",
576 "inAr": dummyAr.String(),
577 },
578 })
579
580 return
581 }
582
Colin Cross0af4b842015-04-30 16:36:18 -0700583 // ARG_MAX on darwin is 262144, use half that to be safe
Colin Cross5b529592017-05-09 13:34:34 -0700584 objFilesLists, err := splitListForSize(objFiles, 131072)
Colin Cross0af4b842015-04-30 16:36:18 -0700585 if err != nil {
586 ctx.ModuleErrorf("%s", err.Error())
587 }
588
Colin Cross5b529592017-05-09 13:34:34 -0700589 var in, out android.WritablePath
Colin Cross0af4b842015-04-30 16:36:18 -0700590 for i, l := range objFilesLists {
591 in = out
592 out = outputFile
593 if i != len(objFilesLists)-1 {
Colin Cross5b529592017-05-09 13:34:34 -0700594 out = android.PathForModuleOut(ctx, outputFile.Base()+strconv.Itoa(i))
Colin Cross0af4b842015-04-30 16:36:18 -0700595 }
596
Colin Crossae887032017-10-23 17:16:14 -0700597 build := android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700598 Rule: darwinAr,
599 Description: "static link " + out.Base(),
600 Output: out,
601 Inputs: l,
602 Implicits: deps,
Colin Cross5b529592017-05-09 13:34:34 -0700603 Args: map[string]string{
604 "arFlags": arFlags,
605 },
Colin Cross0af4b842015-04-30 16:36:18 -0700606 }
Colin Cross5b529592017-05-09 13:34:34 -0700607 if i != 0 {
608 build.Rule = darwinAppendAr
609 build.Args["inAr"] = in.String()
610 }
Colin Crossae887032017-10-23 17:16:14 -0700611 ctx.Build(pctx, build)
Colin Cross0af4b842015-04-30 16:36:18 -0700612 }
613}
614
Colin Cross3f40fa42015-01-30 17:27:36 -0800615// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700616// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700617func TransformObjToDynamicBinary(ctx android.ModuleContext,
618 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
619 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800620
621 var ldCmd string
622 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700623 ldCmd = "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800624 } else {
625 ldCmd = gccCmd(flags.toolchain, "g++")
626 }
627
Colin Cross3f40fa42015-01-30 17:27:36 -0800628 var libFlagsList []string
629
Colin Cross16b23492016-01-06 14:41:07 -0800630 if len(flags.libFlags) > 0 {
631 libFlagsList = append(libFlagsList, flags.libFlags)
632 }
633
Colin Cross3f40fa42015-01-30 17:27:36 -0800634 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800635 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700636 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700637 } else {
638 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700639 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700640 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
641 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800642 }
643
Colin Cross7a7cf972016-12-05 18:47:39 -0800644 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800645 libFlagsList = append(libFlagsList, "-Wl,--start-group")
646 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700647 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800648 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800649 libFlagsList = append(libFlagsList, "-Wl,--end-group")
650 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800651
Stephen Hines10347862016-07-18 15:54:54 -0700652 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700653 libFlagsList = append(libFlagsList, "-Wl,--start-group")
654 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700655 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700656 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700657 libFlagsList = append(libFlagsList, "-Wl,--end-group")
658 }
659
Colin Cross3f40fa42015-01-30 17:27:36 -0800660 for _, lib := range sharedLibs {
Dan Albert9840e1b2016-07-21 08:47:33 -0700661 libFlagsList = append(libFlagsList, lib.String())
Colin Cross3f40fa42015-01-30 17:27:36 -0800662 }
663
Colin Cross3f40fa42015-01-30 17:27:36 -0800664 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700665 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800666 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700667 if crtBegin.Valid() {
668 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800669 }
670
Colin Crossae887032017-10-23 17:16:14 -0700671 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700672 Rule: ld,
673 Description: "link " + outputFile.Base(),
674 Output: outputFile,
675 Inputs: objFiles,
676 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800677 Args: map[string]string{
Dan Albertce2b8392016-07-21 13:16:49 -0700678 "ldCmd": ldCmd,
679 "crtBegin": crtBegin.String(),
680 "libFlags": strings.Join(libFlagsList, " "),
681 "ldFlags": flags.ldFlags,
682 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800683 },
684 })
685}
686
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800687// Generate a rule to combine .dump sAbi dump files from multiple source files
688// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700689func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800690 baseName, exportedHeaderFlags string) android.OptionalPath {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800691 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Jayant Chowdharydcd33b62018-02-23 16:43:23 -0800692 sabiLock.Lock()
693 lsdumpPaths = append(lsdumpPaths, outputFile.String())
694 sabiLock.Unlock()
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800695 symbolFilterStr := "-so " + soFile.String()
Colin Crossae887032017-10-23 17:16:14 -0700696 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700697 Rule: sAbiLink,
698 Description: "header-abi-linker " + outputFile.Base(),
699 Output: outputFile,
700 Inputs: sAbiDumps,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800701 Implicit: soFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800702 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800703 "symbolFilter": symbolFilterStr,
704 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800705 "exportedHeaderFlags": exportedHeaderFlags,
706 },
707 })
708 return android.OptionalPathForPath(outputFile)
709}
710
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700711func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
712 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700713 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700714 Rule: unzipRefSAbiDump,
715 Description: "gunzip" + outputFile.Base(),
716 Output: outputFile,
717 Input: zippedRefDump,
718 })
719 return outputFile
720}
721
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800722func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chienf3511742017-10-31 18:04:35 +0800723 baseName, exportedHeaderFlags string, isVndkExt bool) android.OptionalPath {
724
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800725 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Logan Chienf3511742017-10-31 18:04:35 +0800726
Jayant Chowdharye4499502018-01-17 13:13:33 -0800727 localAbiCheckAllowFlags := append([]string(nil), abiCheckAllowFlags...)
728 if exportedHeaderFlags == "" {
729 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-advice-only")
730 }
Logan Chienf3511742017-10-31 18:04:35 +0800731 if isVndkExt {
732 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-allow-extensions")
733 }
734
Colin Crossae887032017-10-23 17:16:14 -0700735 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700736 Rule: sAbiDiff,
737 Description: "header-abi-diff " + outputFile.Base(),
738 Output: outputFile,
739 Input: inputDump,
740 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800741 Args: map[string]string{
742 "referenceDump": referenceDump.String(),
Jayant Chowdharyf54e0a72017-05-22 10:53:24 -0700743 "libName": baseName,
744 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdharye4499502018-01-17 13:13:33 -0800745 "allowFlags": strings.Join(localAbiCheckAllowFlags, " "),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800746 },
747 })
748 return android.OptionalPathForPath(outputFile)
749}
750
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700751// Generate a rule for extracting a table of contents from a shared library (.so)
752func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700753 outputFile android.WritablePath, flags builderFlags) {
754
755 crossCompile := gccCmd(flags.toolchain, "")
756
Colin Crossae887032017-10-23 17:16:14 -0700757 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700758 Rule: toc,
759 Description: "generate toc " + inputFile.Base(),
760 Output: outputFile,
761 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700762 Args: map[string]string{
763 "crossCompile": crossCompile,
764 },
765 })
766}
767
Colin Cross3f40fa42015-01-30 17:27:36 -0800768// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700769func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
770 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800771
Colin Cross41280a42015-11-23 14:01:42 -0800772 var ldCmd string
773 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700774 ldCmd = "${config.ClangBin}/clang++"
Colin Cross41280a42015-11-23 14:01:42 -0800775 } else {
776 ldCmd = gccCmd(flags.toolchain, "g++")
777 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800778
Colin Crossae887032017-10-23 17:16:14 -0700779 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700780 Rule: partialLd,
781 Description: "link " + outputFile.Base(),
782 Output: outputFile,
783 Inputs: objFiles,
Colin Cross3f40fa42015-01-30 17:27:36 -0800784 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700785 "ldCmd": ldCmd,
Colin Cross41280a42015-11-23 14:01:42 -0800786 "ldFlags": flags.ldFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800787 },
788 })
789}
790
Colin Crossbfae8852015-03-26 14:44:11 -0700791// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700792func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
793 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700794
795 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
796
Colin Crossae887032017-10-23 17:16:14 -0700797 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700798 Rule: prefixSymbols,
799 Description: "prefix symbols " + outputFile.Base(),
800 Output: outputFile,
801 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700802 Args: map[string]string{
803 "objcopyCmd": objcopyCmd,
804 "prefix": prefix,
805 },
806 })
807}
808
Colin Cross635c3b02016-05-18 15:37:25 -0700809func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
810 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700811
812 crossCompile := gccCmd(flags.toolchain, "")
813 args := ""
814 if flags.stripAddGnuDebuglink {
815 args += " --add-gnu-debuglink"
816 }
817 if flags.stripKeepMiniDebugInfo {
818 args += " --keep-mini-debug-info"
819 }
820 if flags.stripKeepSymbols {
821 args += " --keep-symbols"
822 }
823
Colin Crossae887032017-10-23 17:16:14 -0700824 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700825 Rule: strip,
826 Description: "strip " + outputFile.Base(),
827 Output: outputFile,
828 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700829 Args: map[string]string{
830 "crossCompile": crossCompile,
831 "args": args,
832 },
833 })
834}
835
Colin Cross635c3b02016-05-18 15:37:25 -0700836func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
837 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700838
Colin Crossae887032017-10-23 17:16:14 -0700839 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700840 Rule: darwinStrip,
841 Description: "strip " + outputFile.Base(),
842 Output: outputFile,
843 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700844 })
845}
846
Dan Willemsen581341d2017-02-09 16:16:31 -0800847func TransformCoverageFilesToLib(ctx android.ModuleContext,
848 inputs Objects, flags builderFlags, baseName string) android.OptionalPath {
849
850 if len(inputs.coverageFiles) > 0 {
851 outputFile := android.PathForModuleOut(ctx, baseName+".gcnodir")
852
853 TransformObjToStaticLib(ctx, inputs.coverageFiles, flags, outputFile, nil)
854
855 return android.OptionalPathForPath(outputFile)
856 }
857
858 return android.OptionalPath{}
859}
860
Colin Cross635c3b02016-05-18 15:37:25 -0700861func CopyGccLib(ctx android.ModuleContext, libName string,
862 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800863
Colin Crossae887032017-10-23 17:16:14 -0700864 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700865 Rule: copyGccLib,
866 Description: "copy gcc library " + libName,
867 Output: outputFile,
Colin Cross3f40fa42015-01-30 17:27:36 -0800868 Args: map[string]string{
869 "ccCmd": gccCmd(flags.toolchain, "gcc"),
870 "cFlags": flags.globalFlags,
871 "libName": libName,
872 },
873 })
874}
875
Colin Crossb98c8b02016-07-29 13:44:28 -0700876func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800877 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
878}
Colin Cross0af4b842015-04-30 16:36:18 -0700879
Colin Cross5b529592017-05-09 13:34:34 -0700880func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700881 var i int
882
883 start := 0
884 bytes := 0
885 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700886 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700887 if l > limit {
888 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
889 }
890 if bytes+l > limit {
891 lists = append(lists, list[start:i])
892 start = i
893 bytes = 0
894 }
895 bytes += l + 1 // count a space between each list element
896 }
897
898 lists = append(lists, list[start:])
899
900 totalLen := 0
901 for _, l := range lists {
902 totalLen += len(l)
903 }
904 if totalLen != len(list) {
905 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
906 }
907 return lists, nil
908}