blob: 3d125381f7221a2c99247434dbafa23b7db59460 [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("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700131
132 toc = pctx.AndroidStaticRule("toc",
133 blueprint.RuleParams{
134 Depfile: "${out}.d",
135 Deps: blueprint.DepsGCC,
Colin Crossb496cfd2018-09-10 16:50:05 -0700136 Command: "CROSS_COMPILE=$crossCompile $tocPath $format -i ${in} -o ${out} -d ${out}.d",
Colin Cross26c34ed2016-09-30 17:10:16 -0700137 CommandDeps: []string{"$tocPath"},
138 Restat: true,
139 },
Colin Crossb496cfd2018-09-10 16:50:05 -0700140 "crossCompile", "format")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700141
142 clangTidy = pctx.AndroidStaticRule("clangTidy",
143 blueprint.RuleParams{
Chih-Hung Hsiehb699c432018-08-27 16:19:59 -0700144 Command: "rm -f $out && CLANG_TIDY=${config.ClangBin}/clang-tidy ${config.ClangTidyShellPath} $tidyFlags $in -- $cFlags && touch $out",
145 CommandDeps: []string{"${config.ClangBin}/clang-tidy", "${config.ClangTidyShellPath}"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700146 },
147 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800148
Nan Zhang43a485c2017-03-27 14:27:58 -0700149 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800150
151 yasm = pctx.AndroidStaticRule("yasm",
152 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700153 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800154 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700155 Depfile: "$out.d",
156 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800157 },
158 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800159
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700160 windres = pctx.AndroidStaticRule("windres",
161 blueprint.RuleParams{
162 Command: "$windresCmd $flags -I$$(dirname $in) -i $in -o $out",
163 CommandDeps: []string{"$windresCmd"},
164 },
165 "windresCmd", "flags")
166
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800167 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800168
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700169 // -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 -0800170 sAbiDump = pctx.AndroidStaticRule("sAbiDump",
171 blueprint.RuleParams{
Logan Chien3ff624f2018-10-08 11:49:32 +0800172 Command: "rm -f $out && $sAbiDumper -o ${out} $in $exportDirs -- $cFlags -w -isystem prebuilts/clang-tools/${config.HostPrebuiltTag}/clang-headers",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800173 CommandDeps: []string{"$sAbiDumper"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800174 },
175 "cFlags", "exportDirs")
176
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800177 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800178
179 sAbiLink = pctx.AndroidStaticRule("sAbiLink",
180 blueprint.RuleParams{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800181 Command: "$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800182 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800183 Rspfile: "${out}.rsp",
184 RspfileContent: "${in}",
185 },
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800186 "symbolFilter", "arch", "exportedHeaderFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800187
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800188 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700189
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800190 sAbiDiff = pctx.AndroidRuleFunc("sAbiDiff",
Dan Willemsen54daaf02018-03-12 13:24:09 -0700191 func(ctx android.PackageRuleContext) blueprint.RuleParams {
Jayant Chowdhary39d167a2018-05-17 16:45:51 -0700192 // TODO(b/78139997): Add -check-all-apis back
193 commandStr := "($sAbiDiffer $allowFlags -lib $libName -arch $arch -o ${out} -new $in -old $referenceDump)"
Jiyong Parka5f11e42018-04-17 12:19:51 +0900194 commandStr += "|| (echo ' ---- Please update abi references by running $$ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py -l ${libName} ----'"
Dan Willemsen2d31a442018-10-20 21:33:41 -0700195 commandStr += " && (mkdir -p $$DIST_DIR/abidiffs && cp ${out} $$DIST_DIR/abidiff/)"
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800196 commandStr += " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800197 return blueprint.RuleParams{
198 Command: commandStr,
199 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700200 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800201 },
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -0700202 "allowFlags", "referenceDump", "libName", "arch")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700203
204 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
205 blueprint.RuleParams{
206 Command: "gunzip -c $in > $out",
207 })
Colin Cross3f40fa42015-01-30 17:27:36 -0800208)
209
Dan Willemsen322a0a62015-11-17 15:19:46 -0800210func init() {
211 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
212 // debug output. That way two builds in two different directories will
213 // create the same output.
214 if runtime.GOOS != "darwin" {
215 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
216 } else {
217 // Darwin doesn't have /proc
218 pctx.StaticVariable("relPwd", "")
219 }
220}
221
Colin Cross3f40fa42015-01-30 17:27:36 -0800222type builderFlags struct {
Chih-Hung Hsieh9e88ba92018-08-22 14:18:04 -0700223 globalFlags string
224 arFlags string
225 asFlags string
226 cFlags string
227 toolingCFlags string // A separate set of cFlags for clang LibTooling tools
228 toolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
229 conlyFlags string
230 cppFlags string
231 ldFlags string
232 libFlags string
233 yaccFlags string
234 protoFlags string
235 protoOutParams string
236 tidyFlags string
237 sAbiFlags string
238 yasmFlags string
239 aidlFlags string
240 rsFlags string
241 toolchain config.Toolchain
Chih-Hung Hsieh9e88ba92018-08-22 14:18:04 -0700242 tidy bool
243 coverage bool
244 sAbiDump bool
245 protoRoot bool
Colin Cross665dce92016-04-28 14:50:03 -0700246
Colin Crossc3199482017-03-30 15:03:04 -0700247 systemIncludeFlags string
248
Colin Cross18c0c5a2016-12-01 14:45:23 -0800249 groupStaticLibs bool
Zhizhou Yang51be6322018-02-08 18:32:11 -0800250 arGoldPlugin bool
Colin Cross18c0c5a2016-12-01 14:45:23 -0800251
Colin Cross665dce92016-04-28 14:50:03 -0700252 stripKeepSymbols bool
253 stripKeepMiniDebugInfo bool
254 stripAddGnuDebuglink bool
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700255 stripUseLlvmStrip bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800256}
257
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700258type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800259 objFiles android.Paths
260 tidyFiles android.Paths
261 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800262 sAbiDumpFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700263}
264
265func (a Objects) Copy() Objects {
266 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800267 objFiles: append(android.Paths{}, a.objFiles...),
268 tidyFiles: append(android.Paths{}, a.tidyFiles...),
269 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800270 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700271 }
272}
273
274func (a Objects) Append(b Objects) Objects {
275 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800276 objFiles: append(a.objFiles, b.objFiles...),
277 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
278 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800279 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700280 }
281}
282
Colin Cross3f40fa42015-01-30 17:27:36 -0800283// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700284func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800285 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700286
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700287 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700288 var tidyFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700289 if flags.tidy {
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700290 tidyFiles = make(android.Paths, 0, len(srcFiles))
291 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800292 var coverageFiles android.Paths
293 if flags.coverage {
294 coverageFiles = make(android.Paths, 0, len(srcFiles))
295 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800296
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700297 commonFlags := strings.Join([]string{
Colin Crossc3199482017-03-30 15:03:04 -0700298 flags.globalFlags,
299 flags.systemIncludeFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700300 }, " ")
301
302 toolingCflags := strings.Join([]string{
303 commonFlags,
304 flags.toolingCFlags,
305 flags.conlyFlags,
306 }, " ")
307
308 cflags := strings.Join([]string{
309 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700310 flags.cFlags,
311 flags.conlyFlags,
312 }, " ")
313
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700314 toolingCppflags := strings.Join([]string{
315 commonFlags,
316 flags.toolingCFlags,
Chih-Hung Hsieh9e88ba92018-08-22 14:18:04 -0700317 flags.toolingCppFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700318 }, " ")
319
Colin Crossc3199482017-03-30 15:03:04 -0700320 cppflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700321 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700322 flags.cFlags,
323 flags.cppFlags,
324 }, " ")
325
326 asflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700327 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700328 flags.asFlags,
329 }, " ")
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700330
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800331 var sAbiDumpFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700332 if flags.sAbiDump {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800333 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
334 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800335
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700336 cflags += " ${config.NoOverrideClangGlobalCflags}"
337 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
338 cppflags += " ${config.NoOverrideClangGlobalCflags}"
339 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800340
Colin Cross3f40fa42015-01-30 17:27:36 -0800341 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700342 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800343
344 objFiles[i] = objFile
345
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700346 switch srcFile.Ext() {
347 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700348 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700349 Rule: yasm,
350 Description: "yasm " + srcFile.Rel(),
351 Output: objFile,
352 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800353 Implicits: cFlagsDeps,
354 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800355 Args: map[string]string{
356 "asFlags": flags.yasmFlags,
357 },
358 })
359 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700360 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700361 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700362 Rule: windres,
363 Description: "windres " + srcFile.Rel(),
364 Output: objFile,
365 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800366 Implicits: cFlagsDeps,
367 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700368 Args: map[string]string{
369 "windresCmd": gccCmd(flags.toolchain, "windres"),
370 "flags": flags.toolchain.WindresFlags(),
371 },
372 })
373 continue
Colin Cross91e90042016-12-02 17:13:24 -0800374 }
375
Colin Cross3f40fa42015-01-30 17:27:36 -0800376 var moduleCflags string
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700377 var moduleToolingCflags string
Colin Cross3f40fa42015-01-30 17:27:36 -0800378 var ccCmd string
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700379 tidy := flags.tidy
Dan Willemsen581341d2017-02-09 16:16:31 -0800380 coverage := flags.coverage
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700381 dump := flags.sAbiDump
Colin Cross3f40fa42015-01-30 17:27:36 -0800382
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700383 switch srcFile.Ext() {
Colin Cross3f40fa42015-01-30 17:27:36 -0800384 case ".S", ".s":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700385 ccCmd = "clang"
Colin Cross3f40fa42015-01-30 17:27:36 -0800386 moduleCflags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700387 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800388 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800389 dump = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800390 case ".c":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700391 ccCmd = "clang"
Colin Cross3f40fa42015-01-30 17:27:36 -0800392 moduleCflags = cflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700393 moduleToolingCflags = toolingCflags
Colin Cross9978ffe2016-12-01 15:31:22 -0800394 case ".cpp", ".cc", ".mm":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700395 ccCmd = "clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800396 moduleCflags = cppflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700397 moduleToolingCflags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800398 default:
399 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
400 continue
401 }
402
Colin Cross67a5c132017-05-09 13:45:28 -0700403 ccDesc := ccCmd
404
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700405 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800406
Dan Willemsen581341d2017-02-09 16:16:31 -0800407 var implicitOutputs android.WritablePaths
408 if coverage {
409 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
410 implicitOutputs = append(implicitOutputs, gcnoFile)
411 coverageFiles = append(coverageFiles, gcnoFile)
412 }
413
Colin Crossae887032017-10-23 17:16:14 -0700414 ctx.Build(pctx, android.BuildParams{
Dan Willemsen581341d2017-02-09 16:16:31 -0800415 Rule: cc,
Colin Cross67a5c132017-05-09 13:45:28 -0700416 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800417 Output: objFile,
418 ImplicitOutputs: implicitOutputs,
419 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800420 Implicits: cFlagsDeps,
421 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800422 Args: map[string]string{
Colin Cross28344522015-04-22 13:07:53 -0700423 "cFlags": moduleCflags,
424 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800425 },
426 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700427
428 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700429 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700430 tidyFiles = append(tidyFiles, tidyFile)
431
Colin Crossae887032017-10-23 17:16:14 -0700432 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700433 Rule: clangTidy,
434 Description: "clang-tidy " + srcFile.Rel(),
435 Output: tidyFile,
436 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700437 // We must depend on objFile, since clang-tidy doesn't
438 // support exporting dependencies.
439 Implicit: objFile,
440 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700441 "cFlags": moduleToolingCflags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700442 "tidyFlags": flags.tidyFlags,
443 },
444 })
445 }
446
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800447 if dump {
448 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
449 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
450
Colin Crossae887032017-10-23 17:16:14 -0700451 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700452 Rule: sAbiDump,
453 Description: "header-abi-dumper " + srcFile.Rel(),
454 Output: sAbiDumpFile,
455 Input: srcFile,
456 Implicit: objFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800457 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700458 "cFlags": moduleToolingCflags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800459 "exportDirs": flags.sAbiFlags,
460 },
461 })
462 }
463
Colin Cross3f40fa42015-01-30 17:27:36 -0800464 }
465
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700466 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800467 objFiles: objFiles,
468 tidyFiles: tidyFiles,
469 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800470 sAbiDumpFiles: sAbiDumpFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700471 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800472}
473
474// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700475func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700476 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800477
Dan Willemsen581341d2017-02-09 16:16:31 -0800478 if ctx.Darwin() {
479 transformDarwinObjToStaticLib(ctx, objFiles, flags, outputFile, deps)
480 return
481 }
482
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800483 arCmd := "${config.ClangBin}/llvm-ar"
484 arFlags := "crsD"
485 if !ctx.Darwin() {
486 arFlags += " -format=gnu"
487 }
Zhizhou Yang51be6322018-02-08 18:32:11 -0800488 if flags.arGoldPlugin {
489 arFlags += " --plugin ${config.LLVMGoldPlugin}"
490 }
Vishwath Mohan83d9f712017-03-16 11:01:23 -0700491 if flags.arFlags != "" {
492 arFlags += " " + flags.arFlags
493 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800494
Colin Crossae887032017-10-23 17:16:14 -0700495 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700496 Rule: ar,
497 Description: "static link " + outputFile.Base(),
498 Output: outputFile,
499 Inputs: objFiles,
500 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800501 Args: map[string]string{
502 "arFlags": arFlags,
503 "arCmd": arCmd,
504 },
505 })
506}
507
Colin Cross0af4b842015-04-30 16:36:18 -0700508// Generate a rule for compiling multiple .o files to a static library (.a) on
509// darwin. The darwin ar tool doesn't support @file for list files, and has a
510// very small command line length limit, so we have to split the ar into multiple
511// steps, each appending to the previous one.
Dan Willemsen581341d2017-02-09 16:16:31 -0800512func transformDarwinObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Colin Cross5b529592017-05-09 13:34:34 -0700513 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross0af4b842015-04-30 16:36:18 -0700514
Colin Cross0af4b842015-04-30 16:36:18 -0700515 arFlags := "cqs"
516
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700517 if len(objFiles) == 0 {
Colin Cross635c3b02016-05-18 15:37:25 -0700518 dummy := android.PathForModuleOut(ctx, "dummy"+objectExtension)
519 dummyAr := android.PathForModuleOut(ctx, "dummy"+staticLibraryExtension)
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700520
Colin Crossae887032017-10-23 17:16:14 -0700521 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700522 Rule: emptyFile,
523 Description: "empty object file",
524 Output: dummy,
525 Implicits: deps,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700526 })
527
Colin Crossae887032017-10-23 17:16:14 -0700528 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700529 Rule: darwinAr,
530 Description: "empty static archive",
531 Output: dummyAr,
532 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700533 Args: map[string]string{
534 "arFlags": arFlags,
535 },
536 })
537
Colin Crossae887032017-10-23 17:16:14 -0700538 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700539 Rule: darwinAppendAr,
540 Description: "static link " + outputFile.Base(),
541 Output: outputFile,
542 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700543 Args: map[string]string{
544 "arFlags": "d",
545 "inAr": dummyAr.String(),
546 },
547 })
548
549 return
550 }
551
Colin Cross0af4b842015-04-30 16:36:18 -0700552 // ARG_MAX on darwin is 262144, use half that to be safe
Colin Cross5b529592017-05-09 13:34:34 -0700553 objFilesLists, err := splitListForSize(objFiles, 131072)
Colin Cross0af4b842015-04-30 16:36:18 -0700554 if err != nil {
555 ctx.ModuleErrorf("%s", err.Error())
556 }
557
Colin Cross5b529592017-05-09 13:34:34 -0700558 var in, out android.WritablePath
Colin Cross0af4b842015-04-30 16:36:18 -0700559 for i, l := range objFilesLists {
560 in = out
561 out = outputFile
562 if i != len(objFilesLists)-1 {
Colin Cross5b529592017-05-09 13:34:34 -0700563 out = android.PathForModuleOut(ctx, outputFile.Base()+strconv.Itoa(i))
Colin Cross0af4b842015-04-30 16:36:18 -0700564 }
565
Colin Crossae887032017-10-23 17:16:14 -0700566 build := android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700567 Rule: darwinAr,
568 Description: "static link " + out.Base(),
569 Output: out,
570 Inputs: l,
571 Implicits: deps,
Colin Cross5b529592017-05-09 13:34:34 -0700572 Args: map[string]string{
573 "arFlags": arFlags,
574 },
Colin Cross0af4b842015-04-30 16:36:18 -0700575 }
Colin Cross5b529592017-05-09 13:34:34 -0700576 if i != 0 {
577 build.Rule = darwinAppendAr
578 build.Args["inAr"] = in.String()
579 }
Colin Crossae887032017-10-23 17:16:14 -0700580 ctx.Build(pctx, build)
Colin Cross0af4b842015-04-30 16:36:18 -0700581 }
582}
583
Colin Cross3f40fa42015-01-30 17:27:36 -0800584// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700585// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700586func TransformObjToDynamicBinary(ctx android.ModuleContext,
587 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
588 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800589
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700590 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800591
Colin Cross3f40fa42015-01-30 17:27:36 -0800592 var libFlagsList []string
593
Colin Cross16b23492016-01-06 14:41:07 -0800594 if len(flags.libFlags) > 0 {
595 libFlagsList = append(libFlagsList, flags.libFlags)
596 }
597
Colin Cross3f40fa42015-01-30 17:27:36 -0800598 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800599 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700600 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700601 } else {
602 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700603 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700604 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
605 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800606 }
607
Colin Cross7a7cf972016-12-05 18:47:39 -0800608 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800609 libFlagsList = append(libFlagsList, "-Wl,--start-group")
610 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700611 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800612 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800613 libFlagsList = append(libFlagsList, "-Wl,--end-group")
614 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800615
Stephen Hines10347862016-07-18 15:54:54 -0700616 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700617 libFlagsList = append(libFlagsList, "-Wl,--start-group")
618 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700619 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700620 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700621 libFlagsList = append(libFlagsList, "-Wl,--end-group")
622 }
623
Colin Cross3f40fa42015-01-30 17:27:36 -0800624 for _, lib := range sharedLibs {
Dan Albert9840e1b2016-07-21 08:47:33 -0700625 libFlagsList = append(libFlagsList, lib.String())
Colin Cross3f40fa42015-01-30 17:27:36 -0800626 }
627
Colin Cross3f40fa42015-01-30 17:27:36 -0800628 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700629 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800630 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700631 if crtBegin.Valid() {
632 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800633 }
634
Colin Crossae887032017-10-23 17:16:14 -0700635 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700636 Rule: ld,
637 Description: "link " + outputFile.Base(),
638 Output: outputFile,
639 Inputs: objFiles,
640 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800641 Args: map[string]string{
Dan Albertce2b8392016-07-21 13:16:49 -0700642 "ldCmd": ldCmd,
643 "crtBegin": crtBegin.String(),
644 "libFlags": strings.Join(libFlagsList, " "),
645 "ldFlags": flags.ldFlags,
646 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800647 },
648 })
649}
650
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800651// Generate a rule to combine .dump sAbi dump files from multiple source files
652// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700653func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800654 baseName, exportedHeaderFlags string) android.OptionalPath {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800655 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Jayant Chowdharydcd33b62018-02-23 16:43:23 -0800656 sabiLock.Lock()
657 lsdumpPaths = append(lsdumpPaths, outputFile.String())
658 sabiLock.Unlock()
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800659 symbolFilterStr := "-so " + soFile.String()
Colin Crossae887032017-10-23 17:16:14 -0700660 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700661 Rule: sAbiLink,
662 Description: "header-abi-linker " + outputFile.Base(),
663 Output: outputFile,
664 Inputs: sAbiDumps,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800665 Implicit: soFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800666 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800667 "symbolFilter": symbolFilterStr,
668 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800669 "exportedHeaderFlags": exportedHeaderFlags,
670 },
671 })
672 return android.OptionalPathForPath(outputFile)
673}
674
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700675func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
676 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700677 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700678 Rule: unzipRefSAbiDump,
679 Description: "gunzip" + outputFile.Base(),
680 Output: outputFile,
681 Input: zippedRefDump,
682 })
683 return outputFile
684}
685
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800686func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chienf3511742017-10-31 18:04:35 +0800687 baseName, exportedHeaderFlags string, isVndkExt bool) android.OptionalPath {
688
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800689 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700690 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Jayant Chowdharye4499502018-01-17 13:13:33 -0800691 localAbiCheckAllowFlags := append([]string(nil), abiCheckAllowFlags...)
692 if exportedHeaderFlags == "" {
693 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-advice-only")
694 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700695 if inList(libName, llndkLibraries) {
696 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-consider-opaque-types-different")
697 }
Logan Chienf3511742017-10-31 18:04:35 +0800698 if isVndkExt {
699 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-allow-extensions")
700 }
701
Colin Crossae887032017-10-23 17:16:14 -0700702 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700703 Rule: sAbiDiff,
704 Description: "header-abi-diff " + outputFile.Base(),
705 Output: outputFile,
706 Input: inputDump,
707 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800708 Args: map[string]string{
709 "referenceDump": referenceDump.String(),
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700710 "libName": libName,
Jayant Chowdharyf54e0a72017-05-22 10:53:24 -0700711 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdharye4499502018-01-17 13:13:33 -0800712 "allowFlags": strings.Join(localAbiCheckAllowFlags, " "),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800713 },
714 })
715 return android.OptionalPathForPath(outputFile)
716}
717
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700718// Generate a rule for extracting a table of contents from a shared library (.so)
719func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700720 outputFile android.WritablePath, flags builderFlags) {
721
Colin Crossb496cfd2018-09-10 16:50:05 -0700722 var format string
723 var crossCompile string
724 if ctx.Darwin() {
725 format = "--macho"
726 crossCompile = "${config.MacToolPath}"
727 } else if ctx.Windows() {
728 format = "--pe"
729 crossCompile = gccCmd(flags.toolchain, "")
730 } else {
731 format = "--elf"
732 crossCompile = gccCmd(flags.toolchain, "")
733 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700734
Colin Crossae887032017-10-23 17:16:14 -0700735 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700736 Rule: toc,
737 Description: "generate toc " + inputFile.Base(),
738 Output: outputFile,
739 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700740 Args: map[string]string{
741 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700742 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700743 },
744 })
745}
746
Colin Cross3f40fa42015-01-30 17:27:36 -0800747// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700748func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
749 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800750
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700751 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800752
Colin Crossae887032017-10-23 17:16:14 -0700753 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700754 Rule: partialLd,
755 Description: "link " + outputFile.Base(),
756 Output: outputFile,
757 Inputs: objFiles,
Colin Cross3f40fa42015-01-30 17:27:36 -0800758 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700759 "ldCmd": ldCmd,
Colin Cross41280a42015-11-23 14:01:42 -0800760 "ldFlags": flags.ldFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800761 },
762 })
763}
764
Colin Crossbfae8852015-03-26 14:44:11 -0700765// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700766func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
767 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700768
769 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
770
Colin Crossae887032017-10-23 17:16:14 -0700771 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700772 Rule: prefixSymbols,
773 Description: "prefix symbols " + outputFile.Base(),
774 Output: outputFile,
775 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700776 Args: map[string]string{
777 "objcopyCmd": objcopyCmd,
778 "prefix": prefix,
779 },
780 })
781}
782
Colin Cross635c3b02016-05-18 15:37:25 -0700783func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
784 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700785
786 crossCompile := gccCmd(flags.toolchain, "")
787 args := ""
788 if flags.stripAddGnuDebuglink {
789 args += " --add-gnu-debuglink"
790 }
791 if flags.stripKeepMiniDebugInfo {
792 args += " --keep-mini-debug-info"
793 }
794 if flags.stripKeepSymbols {
795 args += " --keep-symbols"
796 }
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700797 if flags.stripUseLlvmStrip {
798 args += " --use-llvm-strip"
799 }
Colin Cross665dce92016-04-28 14:50:03 -0700800
Colin Crossae887032017-10-23 17:16:14 -0700801 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700802 Rule: strip,
803 Description: "strip " + outputFile.Base(),
804 Output: outputFile,
805 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700806 Args: map[string]string{
807 "crossCompile": crossCompile,
808 "args": args,
809 },
810 })
811}
812
Colin Cross635c3b02016-05-18 15:37:25 -0700813func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
814 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700815
Colin Crossae887032017-10-23 17:16:14 -0700816 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700817 Rule: darwinStrip,
818 Description: "strip " + outputFile.Base(),
819 Output: outputFile,
820 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700821 })
822}
823
Dan Willemsen581341d2017-02-09 16:16:31 -0800824func TransformCoverageFilesToLib(ctx android.ModuleContext,
825 inputs Objects, flags builderFlags, baseName string) android.OptionalPath {
826
827 if len(inputs.coverageFiles) > 0 {
828 outputFile := android.PathForModuleOut(ctx, baseName+".gcnodir")
829
830 TransformObjToStaticLib(ctx, inputs.coverageFiles, flags, outputFile, nil)
831
832 return android.OptionalPathForPath(outputFile)
833 }
834
835 return android.OptionalPath{}
836}
837
Colin Crossb98c8b02016-07-29 13:44:28 -0700838func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800839 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
840}
Colin Cross0af4b842015-04-30 16:36:18 -0700841
Colin Cross5b529592017-05-09 13:34:34 -0700842func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700843 var i int
844
845 start := 0
846 bytes := 0
847 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700848 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700849 if l > limit {
850 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
851 }
852 if bytes+l > limit {
853 lists = append(lists, list[start:i])
854 start = i
855 bytes = 0
856 }
857 bytes += l + 1 // count a space between each list element
858 }
859
860 lists = append(lists, list[start:])
861
862 totalLen := 0
863 for _, l := range lists {
864 totalLen += len(l)
865 }
866 if totalLen != len(list) {
867 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
868 }
869 return lists, nil
870}