blob: bc3652e94301e01bf60d6f6134a76bd689784c19 [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,
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700120 Command: "CROSS_COMPILE=$crossCompile XZ=$xzCmd CLANG_BIN=${config.ClangBin} $stripPath ${args} -i ${in} -o ${out} -d ${out}.d",
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800121 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 Chowdhary39d167a2018-05-17 16:45:51 -0700203 // TODO(b/78139997): Add -check-all-apis back
204 commandStr := "($sAbiDiffer $allowFlags -lib $libName -arch $arch -o ${out} -new $in -old $referenceDump)"
Dan Willemsenbc0c5092018-03-10 16:25:53 -0800205 distAbiDiffDir := android.PathForDist(ctx, "abidiffs")
Jiyong Parka5f11e42018-04-17 12:19:51 +0900206 commandStr += "|| (echo ' ---- Please update abi references by running $$ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py -l ${libName} ----'"
Dan Willemsenbc0c5092018-03-10 16:25:53 -0800207 if distAbiDiffDir.Valid() {
Dan Willemsenedd1ae02018-04-17 10:41:11 -0700208 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
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700269 stripUseLlvmStrip bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800270}
271
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700272type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800273 objFiles android.Paths
274 tidyFiles android.Paths
275 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800276 sAbiDumpFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700277}
278
279func (a Objects) Copy() Objects {
280 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800281 objFiles: append(android.Paths{}, a.objFiles...),
282 tidyFiles: append(android.Paths{}, a.tidyFiles...),
283 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800284 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700285 }
286}
287
288func (a Objects) Append(b Objects) Objects {
289 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800290 objFiles: append(a.objFiles, b.objFiles...),
291 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
292 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800293 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700294 }
295}
296
Colin Cross3f40fa42015-01-30 17:27:36 -0800297// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700298func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800299 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700300
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700301 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700302 var tidyFiles android.Paths
303 if flags.tidy && flags.clang {
304 tidyFiles = make(android.Paths, 0, len(srcFiles))
305 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800306 var coverageFiles android.Paths
307 if flags.coverage {
308 coverageFiles = make(android.Paths, 0, len(srcFiles))
309 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800310
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700311 commonFlags := strings.Join([]string{
Colin Crossc3199482017-03-30 15:03:04 -0700312 flags.globalFlags,
313 flags.systemIncludeFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700314 }, " ")
315
316 toolingCflags := strings.Join([]string{
317 commonFlags,
318 flags.toolingCFlags,
319 flags.conlyFlags,
320 }, " ")
321
322 cflags := strings.Join([]string{
323 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700324 flags.cFlags,
325 flags.conlyFlags,
326 }, " ")
327
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700328 toolingCppflags := strings.Join([]string{
329 commonFlags,
330 flags.toolingCFlags,
331 flags.cppFlags,
332 }, " ")
333
Colin Crossc3199482017-03-30 15:03:04 -0700334 cppflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700335 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700336 flags.cFlags,
337 flags.cppFlags,
338 }, " ")
339
340 asflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700341 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700342 flags.asFlags,
343 }, " ")
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700344
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800345 var sAbiDumpFiles android.Paths
346 if flags.sAbiDump && flags.clang {
347 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
348 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800349
Dan Willemsenbe03f342016-03-03 17:21:04 -0800350 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700351 cflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700352 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700353 cppflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700354 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800355 } else {
Colin Crossb98c8b02016-07-29 13:44:28 -0700356 cflags += " ${config.NoOverrideGlobalCflags}"
357 cppflags += " ${config.NoOverrideGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800358 }
359
Colin Cross3f40fa42015-01-30 17:27:36 -0800360 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700361 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800362
363 objFiles[i] = objFile
364
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700365 switch srcFile.Ext() {
366 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700367 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700368 Rule: yasm,
369 Description: "yasm " + srcFile.Rel(),
370 Output: objFile,
371 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800372 Implicits: cFlagsDeps,
373 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800374 Args: map[string]string{
375 "asFlags": flags.yasmFlags,
376 },
377 })
378 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700379 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700380 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700381 Rule: windres,
382 Description: "windres " + srcFile.Rel(),
383 Output: objFile,
384 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800385 Implicits: cFlagsDeps,
386 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700387 Args: map[string]string{
388 "windresCmd": gccCmd(flags.toolchain, "windres"),
389 "flags": flags.toolchain.WindresFlags(),
390 },
391 })
392 continue
Colin Cross91e90042016-12-02 17:13:24 -0800393 }
394
Colin Cross3f40fa42015-01-30 17:27:36 -0800395 var moduleCflags string
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700396 var moduleToolingCflags string
Colin Cross3f40fa42015-01-30 17:27:36 -0800397 var ccCmd string
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700398 tidy := flags.tidy && flags.clang
Dan Willemsen581341d2017-02-09 16:16:31 -0800399 coverage := flags.coverage
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800400 dump := flags.sAbiDump && flags.clang
Colin Cross3f40fa42015-01-30 17:27:36 -0800401
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700402 switch srcFile.Ext() {
Colin Cross3f40fa42015-01-30 17:27:36 -0800403 case ".S", ".s":
404 ccCmd = "gcc"
405 moduleCflags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700406 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800407 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800408 dump = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800409 case ".c":
410 ccCmd = "gcc"
411 moduleCflags = cflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700412 moduleToolingCflags = toolingCflags
Colin Cross9978ffe2016-12-01 15:31:22 -0800413 case ".cpp", ".cc", ".mm":
Colin Cross3f40fa42015-01-30 17:27:36 -0800414 ccCmd = "g++"
415 moduleCflags = cppflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700416 moduleToolingCflags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800417 default:
418 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
419 continue
420 }
421
422 if flags.clang {
423 switch ccCmd {
424 case "gcc":
425 ccCmd = "clang"
426 case "g++":
427 ccCmd = "clang++"
428 default:
429 panic("unrecoginzied ccCmd")
430 }
Colin Cross67a5c132017-05-09 13:45:28 -0700431 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800432
Colin Cross67a5c132017-05-09 13:45:28 -0700433 ccDesc := ccCmd
434
435 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700436 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800437 } else {
438 ccCmd = gccCmd(flags.toolchain, ccCmd)
439 }
440
Dan Willemsen581341d2017-02-09 16:16:31 -0800441 var implicitOutputs android.WritablePaths
442 if coverage {
443 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
444 implicitOutputs = append(implicitOutputs, gcnoFile)
445 coverageFiles = append(coverageFiles, gcnoFile)
446 }
447
Colin Crossae887032017-10-23 17:16:14 -0700448 ctx.Build(pctx, android.BuildParams{
Dan Willemsen581341d2017-02-09 16:16:31 -0800449 Rule: cc,
Colin Cross67a5c132017-05-09 13:45:28 -0700450 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800451 Output: objFile,
452 ImplicitOutputs: implicitOutputs,
453 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800454 Implicits: cFlagsDeps,
455 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800456 Args: map[string]string{
Colin Cross28344522015-04-22 13:07:53 -0700457 "cFlags": moduleCflags,
458 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800459 },
460 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700461
462 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700463 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700464 tidyFiles = append(tidyFiles, tidyFile)
465
Colin Crossae887032017-10-23 17:16:14 -0700466 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700467 Rule: clangTidy,
468 Description: "clang-tidy " + srcFile.Rel(),
469 Output: tidyFile,
470 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700471 // We must depend on objFile, since clang-tidy doesn't
472 // support exporting dependencies.
473 Implicit: objFile,
474 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700475 "cFlags": moduleToolingCflags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700476 "tidyFlags": flags.tidyFlags,
477 },
478 })
479 }
480
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800481 if dump {
482 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
483 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
484
Colin Crossae887032017-10-23 17:16:14 -0700485 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700486 Rule: sAbiDump,
487 Description: "header-abi-dumper " + srcFile.Rel(),
488 Output: sAbiDumpFile,
489 Input: srcFile,
490 Implicit: objFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800491 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700492 "cFlags": moduleToolingCflags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800493 "exportDirs": flags.sAbiFlags,
494 },
495 })
496 }
497
Colin Cross3f40fa42015-01-30 17:27:36 -0800498 }
499
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700500 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800501 objFiles: objFiles,
502 tidyFiles: tidyFiles,
503 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800504 sAbiDumpFiles: sAbiDumpFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700505 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800506}
507
508// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700509func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700510 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800511
Dan Willemsen581341d2017-02-09 16:16:31 -0800512 if ctx.Darwin() {
513 transformDarwinObjToStaticLib(ctx, objFiles, flags, outputFile, deps)
514 return
515 }
516
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800517 arCmd := "${config.ClangBin}/llvm-ar"
518 arFlags := "crsD"
519 if !ctx.Darwin() {
520 arFlags += " -format=gnu"
521 }
Zhizhou Yang51be6322018-02-08 18:32:11 -0800522 if flags.arGoldPlugin {
523 arFlags += " --plugin ${config.LLVMGoldPlugin}"
524 }
Vishwath Mohan83d9f712017-03-16 11:01:23 -0700525 if flags.arFlags != "" {
526 arFlags += " " + flags.arFlags
527 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800528
Colin Crossae887032017-10-23 17:16:14 -0700529 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700530 Rule: ar,
531 Description: "static link " + outputFile.Base(),
532 Output: outputFile,
533 Inputs: objFiles,
534 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800535 Args: map[string]string{
536 "arFlags": arFlags,
537 "arCmd": arCmd,
538 },
539 })
540}
541
Colin Cross0af4b842015-04-30 16:36:18 -0700542// Generate a rule for compiling multiple .o files to a static library (.a) on
543// darwin. The darwin ar tool doesn't support @file for list files, and has a
544// very small command line length limit, so we have to split the ar into multiple
545// steps, each appending to the previous one.
Dan Willemsen581341d2017-02-09 16:16:31 -0800546func transformDarwinObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Colin Cross5b529592017-05-09 13:34:34 -0700547 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross0af4b842015-04-30 16:36:18 -0700548
Colin Cross0af4b842015-04-30 16:36:18 -0700549 arFlags := "cqs"
550
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700551 if len(objFiles) == 0 {
Colin Cross635c3b02016-05-18 15:37:25 -0700552 dummy := android.PathForModuleOut(ctx, "dummy"+objectExtension)
553 dummyAr := android.PathForModuleOut(ctx, "dummy"+staticLibraryExtension)
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700554
Colin Crossae887032017-10-23 17:16:14 -0700555 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700556 Rule: emptyFile,
557 Description: "empty object file",
558 Output: dummy,
559 Implicits: deps,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700560 })
561
Colin Crossae887032017-10-23 17:16:14 -0700562 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700563 Rule: darwinAr,
564 Description: "empty static archive",
565 Output: dummyAr,
566 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700567 Args: map[string]string{
568 "arFlags": arFlags,
569 },
570 })
571
Colin Crossae887032017-10-23 17:16:14 -0700572 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700573 Rule: darwinAppendAr,
574 Description: "static link " + outputFile.Base(),
575 Output: outputFile,
576 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700577 Args: map[string]string{
578 "arFlags": "d",
579 "inAr": dummyAr.String(),
580 },
581 })
582
583 return
584 }
585
Colin Cross0af4b842015-04-30 16:36:18 -0700586 // ARG_MAX on darwin is 262144, use half that to be safe
Colin Cross5b529592017-05-09 13:34:34 -0700587 objFilesLists, err := splitListForSize(objFiles, 131072)
Colin Cross0af4b842015-04-30 16:36:18 -0700588 if err != nil {
589 ctx.ModuleErrorf("%s", err.Error())
590 }
591
Colin Cross5b529592017-05-09 13:34:34 -0700592 var in, out android.WritablePath
Colin Cross0af4b842015-04-30 16:36:18 -0700593 for i, l := range objFilesLists {
594 in = out
595 out = outputFile
596 if i != len(objFilesLists)-1 {
Colin Cross5b529592017-05-09 13:34:34 -0700597 out = android.PathForModuleOut(ctx, outputFile.Base()+strconv.Itoa(i))
Colin Cross0af4b842015-04-30 16:36:18 -0700598 }
599
Colin Crossae887032017-10-23 17:16:14 -0700600 build := android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700601 Rule: darwinAr,
602 Description: "static link " + out.Base(),
603 Output: out,
604 Inputs: l,
605 Implicits: deps,
Colin Cross5b529592017-05-09 13:34:34 -0700606 Args: map[string]string{
607 "arFlags": arFlags,
608 },
Colin Cross0af4b842015-04-30 16:36:18 -0700609 }
Colin Cross5b529592017-05-09 13:34:34 -0700610 if i != 0 {
611 build.Rule = darwinAppendAr
612 build.Args["inAr"] = in.String()
613 }
Colin Crossae887032017-10-23 17:16:14 -0700614 ctx.Build(pctx, build)
Colin Cross0af4b842015-04-30 16:36:18 -0700615 }
616}
617
Colin Cross3f40fa42015-01-30 17:27:36 -0800618// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700619// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700620func TransformObjToDynamicBinary(ctx android.ModuleContext,
621 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
622 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800623
624 var ldCmd string
625 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700626 ldCmd = "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800627 } else {
628 ldCmd = gccCmd(flags.toolchain, "g++")
629 }
630
Colin Cross3f40fa42015-01-30 17:27:36 -0800631 var libFlagsList []string
632
Colin Cross16b23492016-01-06 14:41:07 -0800633 if len(flags.libFlags) > 0 {
634 libFlagsList = append(libFlagsList, flags.libFlags)
635 }
636
Colin Cross3f40fa42015-01-30 17:27:36 -0800637 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800638 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700639 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700640 } else {
641 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700642 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700643 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
644 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800645 }
646
Colin Cross7a7cf972016-12-05 18:47:39 -0800647 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800648 libFlagsList = append(libFlagsList, "-Wl,--start-group")
649 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700650 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800651 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800652 libFlagsList = append(libFlagsList, "-Wl,--end-group")
653 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800654
Stephen Hines10347862016-07-18 15:54:54 -0700655 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700656 libFlagsList = append(libFlagsList, "-Wl,--start-group")
657 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700658 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700659 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700660 libFlagsList = append(libFlagsList, "-Wl,--end-group")
661 }
662
Colin Cross3f40fa42015-01-30 17:27:36 -0800663 for _, lib := range sharedLibs {
Dan Albert9840e1b2016-07-21 08:47:33 -0700664 libFlagsList = append(libFlagsList, lib.String())
Colin Cross3f40fa42015-01-30 17:27:36 -0800665 }
666
Colin Cross3f40fa42015-01-30 17:27:36 -0800667 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700668 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800669 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700670 if crtBegin.Valid() {
671 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800672 }
673
Colin Crossae887032017-10-23 17:16:14 -0700674 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700675 Rule: ld,
676 Description: "link " + outputFile.Base(),
677 Output: outputFile,
678 Inputs: objFiles,
679 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800680 Args: map[string]string{
Dan Albertce2b8392016-07-21 13:16:49 -0700681 "ldCmd": ldCmd,
682 "crtBegin": crtBegin.String(),
683 "libFlags": strings.Join(libFlagsList, " "),
684 "ldFlags": flags.ldFlags,
685 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800686 },
687 })
688}
689
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800690// Generate a rule to combine .dump sAbi dump files from multiple source files
691// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700692func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800693 baseName, exportedHeaderFlags string) android.OptionalPath {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800694 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Jayant Chowdharydcd33b62018-02-23 16:43:23 -0800695 sabiLock.Lock()
696 lsdumpPaths = append(lsdumpPaths, outputFile.String())
697 sabiLock.Unlock()
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800698 symbolFilterStr := "-so " + soFile.String()
Colin Crossae887032017-10-23 17:16:14 -0700699 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700700 Rule: sAbiLink,
701 Description: "header-abi-linker " + outputFile.Base(),
702 Output: outputFile,
703 Inputs: sAbiDumps,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800704 Implicit: soFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800705 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800706 "symbolFilter": symbolFilterStr,
707 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800708 "exportedHeaderFlags": exportedHeaderFlags,
709 },
710 })
711 return android.OptionalPathForPath(outputFile)
712}
713
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700714func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
715 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700716 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700717 Rule: unzipRefSAbiDump,
718 Description: "gunzip" + outputFile.Base(),
719 Output: outputFile,
720 Input: zippedRefDump,
721 })
722 return outputFile
723}
724
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800725func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chienf3511742017-10-31 18:04:35 +0800726 baseName, exportedHeaderFlags string, isVndkExt bool) android.OptionalPath {
727
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800728 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Logan Chienf3511742017-10-31 18:04:35 +0800729
Jayant Chowdharye4499502018-01-17 13:13:33 -0800730 localAbiCheckAllowFlags := append([]string(nil), abiCheckAllowFlags...)
731 if exportedHeaderFlags == "" {
732 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-advice-only")
733 }
Logan Chienf3511742017-10-31 18:04:35 +0800734 if isVndkExt {
735 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-allow-extensions")
736 }
737
Colin Crossae887032017-10-23 17:16:14 -0700738 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700739 Rule: sAbiDiff,
740 Description: "header-abi-diff " + outputFile.Base(),
741 Output: outputFile,
742 Input: inputDump,
743 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800744 Args: map[string]string{
745 "referenceDump": referenceDump.String(),
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800746 "libName": baseName[0:(len(baseName) - len(filepath.Ext(baseName)))],
Jayant Chowdharyf54e0a72017-05-22 10:53:24 -0700747 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdharye4499502018-01-17 13:13:33 -0800748 "allowFlags": strings.Join(localAbiCheckAllowFlags, " "),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800749 },
750 })
751 return android.OptionalPathForPath(outputFile)
752}
753
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700754// Generate a rule for extracting a table of contents from a shared library (.so)
755func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700756 outputFile android.WritablePath, flags builderFlags) {
757
758 crossCompile := gccCmd(flags.toolchain, "")
759
Colin Crossae887032017-10-23 17:16:14 -0700760 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700761 Rule: toc,
762 Description: "generate toc " + inputFile.Base(),
763 Output: outputFile,
764 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700765 Args: map[string]string{
766 "crossCompile": crossCompile,
767 },
768 })
769}
770
Colin Cross3f40fa42015-01-30 17:27:36 -0800771// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700772func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
773 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800774
Colin Cross41280a42015-11-23 14:01:42 -0800775 var ldCmd string
776 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700777 ldCmd = "${config.ClangBin}/clang++"
Colin Cross41280a42015-11-23 14:01:42 -0800778 } else {
779 ldCmd = gccCmd(flags.toolchain, "g++")
780 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800781
Colin Crossae887032017-10-23 17:16:14 -0700782 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700783 Rule: partialLd,
784 Description: "link " + outputFile.Base(),
785 Output: outputFile,
786 Inputs: objFiles,
Colin Cross3f40fa42015-01-30 17:27:36 -0800787 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700788 "ldCmd": ldCmd,
Colin Cross41280a42015-11-23 14:01:42 -0800789 "ldFlags": flags.ldFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800790 },
791 })
792}
793
Colin Crossbfae8852015-03-26 14:44:11 -0700794// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700795func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
796 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700797
798 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
799
Colin Crossae887032017-10-23 17:16:14 -0700800 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700801 Rule: prefixSymbols,
802 Description: "prefix symbols " + outputFile.Base(),
803 Output: outputFile,
804 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700805 Args: map[string]string{
806 "objcopyCmd": objcopyCmd,
807 "prefix": prefix,
808 },
809 })
810}
811
Colin Cross635c3b02016-05-18 15:37:25 -0700812func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
813 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700814
815 crossCompile := gccCmd(flags.toolchain, "")
816 args := ""
817 if flags.stripAddGnuDebuglink {
818 args += " --add-gnu-debuglink"
819 }
820 if flags.stripKeepMiniDebugInfo {
821 args += " --keep-mini-debug-info"
822 }
823 if flags.stripKeepSymbols {
824 args += " --keep-symbols"
825 }
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700826 if flags.stripUseLlvmStrip {
827 args += " --use-llvm-strip"
828 }
Colin Cross665dce92016-04-28 14:50:03 -0700829
Colin Crossae887032017-10-23 17:16:14 -0700830 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700831 Rule: strip,
832 Description: "strip " + outputFile.Base(),
833 Output: outputFile,
834 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700835 Args: map[string]string{
836 "crossCompile": crossCompile,
837 "args": args,
838 },
839 })
840}
841
Colin Cross635c3b02016-05-18 15:37:25 -0700842func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
843 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700844
Colin Crossae887032017-10-23 17:16:14 -0700845 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700846 Rule: darwinStrip,
847 Description: "strip " + outputFile.Base(),
848 Output: outputFile,
849 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700850 })
851}
852
Dan Willemsen581341d2017-02-09 16:16:31 -0800853func TransformCoverageFilesToLib(ctx android.ModuleContext,
854 inputs Objects, flags builderFlags, baseName string) android.OptionalPath {
855
856 if len(inputs.coverageFiles) > 0 {
857 outputFile := android.PathForModuleOut(ctx, baseName+".gcnodir")
858
859 TransformObjToStaticLib(ctx, inputs.coverageFiles, flags, outputFile, nil)
860
861 return android.OptionalPathForPath(outputFile)
862 }
863
864 return android.OptionalPath{}
865}
866
Colin Cross635c3b02016-05-18 15:37:25 -0700867func CopyGccLib(ctx android.ModuleContext, libName string,
868 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800869
Colin Crossae887032017-10-23 17:16:14 -0700870 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700871 Rule: copyGccLib,
872 Description: "copy gcc library " + libName,
873 Output: outputFile,
Colin Cross3f40fa42015-01-30 17:27:36 -0800874 Args: map[string]string{
875 "ccCmd": gccCmd(flags.toolchain, "gcc"),
876 "cFlags": flags.globalFlags,
877 "libName": libName,
878 },
879 })
880}
881
Colin Crossb98c8b02016-07-29 13:44:28 -0700882func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800883 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
884}
Colin Cross0af4b842015-04-30 16:36:18 -0700885
Colin Cross5b529592017-05-09 13:34:34 -0700886func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700887 var i int
888
889 start := 0
890 bytes := 0
891 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700892 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700893 if l > limit {
894 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
895 }
896 if bytes+l > limit {
897 lists = append(lists, list[start:i])
898 start = i
899 bytes = 0
900 }
901 bytes += l + 1 // count a space between each list element
902 }
903
904 lists = append(lists, list[start:])
905
906 totalLen := 0
907 for _, l := range lists {
908 totalLen += len(l)
909 }
910 if totalLen != len(list) {
911 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
912 }
913 return lists, nil
914}