blob: d16efd004540525bc059c578a03e49dee8696ee2 [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{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700172 Command: "rm -f $out && $sAbiDumper -o ${out} $in $exportDirs -- $cFlags -w -isystem ${config.RSIncludePath}",
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)"
Dan Willemsenbc0c5092018-03-10 16:25:53 -0800194 distAbiDiffDir := android.PathForDist(ctx, "abidiffs")
Jiyong Parka5f11e42018-04-17 12:19:51 +0900195 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 -0800196 if distAbiDiffDir.Valid() {
Dan Willemsenedd1ae02018-04-17 10:41:11 -0700197 commandStr += " && (mkdir -p " + distAbiDiffDir.String() + " && cp ${out} " + distAbiDiffDir.String() + ")"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800198 }
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800199 commandStr += " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800200 return blueprint.RuleParams{
201 Command: commandStr,
202 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700203 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800204 },
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -0700205 "allowFlags", "referenceDump", "libName", "arch")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700206
207 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
208 blueprint.RuleParams{
209 Command: "gunzip -c $in > $out",
210 })
Colin Cross3f40fa42015-01-30 17:27:36 -0800211)
212
Dan Willemsen322a0a62015-11-17 15:19:46 -0800213func init() {
214 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
215 // debug output. That way two builds in two different directories will
216 // create the same output.
217 if runtime.GOOS != "darwin" {
218 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
219 } else {
220 // Darwin doesn't have /proc
221 pctx.StaticVariable("relPwd", "")
222 }
223}
224
Colin Cross3f40fa42015-01-30 17:27:36 -0800225type builderFlags struct {
Chih-Hung Hsieh9e88ba92018-08-22 14:18:04 -0700226 globalFlags string
227 arFlags string
228 asFlags string
229 cFlags string
230 toolingCFlags string // A separate set of cFlags for clang LibTooling tools
231 toolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
232 conlyFlags string
233 cppFlags string
234 ldFlags string
235 libFlags string
236 yaccFlags string
237 protoFlags string
238 protoOutParams string
239 tidyFlags string
240 sAbiFlags string
241 yasmFlags string
242 aidlFlags string
243 rsFlags string
244 toolchain config.Toolchain
Chih-Hung Hsieh9e88ba92018-08-22 14:18:04 -0700245 tidy bool
246 coverage bool
247 sAbiDump bool
248 protoRoot bool
Colin Cross665dce92016-04-28 14:50:03 -0700249
Colin Crossc3199482017-03-30 15:03:04 -0700250 systemIncludeFlags string
251
Colin Cross18c0c5a2016-12-01 14:45:23 -0800252 groupStaticLibs bool
Zhizhou Yang51be6322018-02-08 18:32:11 -0800253 arGoldPlugin bool
Colin Cross18c0c5a2016-12-01 14:45:23 -0800254
Colin Cross665dce92016-04-28 14:50:03 -0700255 stripKeepSymbols bool
256 stripKeepMiniDebugInfo bool
257 stripAddGnuDebuglink bool
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700258 stripUseLlvmStrip bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800259}
260
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700261type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800262 objFiles android.Paths
263 tidyFiles android.Paths
264 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800265 sAbiDumpFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700266}
267
268func (a Objects) Copy() Objects {
269 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800270 objFiles: append(android.Paths{}, a.objFiles...),
271 tidyFiles: append(android.Paths{}, a.tidyFiles...),
272 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800273 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700274 }
275}
276
277func (a Objects) Append(b Objects) Objects {
278 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800279 objFiles: append(a.objFiles, b.objFiles...),
280 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
281 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800282 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700283 }
284}
285
Colin Cross3f40fa42015-01-30 17:27:36 -0800286// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700287func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800288 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700289
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700290 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700291 var tidyFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700292 if flags.tidy {
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700293 tidyFiles = make(android.Paths, 0, len(srcFiles))
294 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800295 var coverageFiles android.Paths
296 if flags.coverage {
297 coverageFiles = make(android.Paths, 0, len(srcFiles))
298 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800299
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700300 commonFlags := strings.Join([]string{
Colin Crossc3199482017-03-30 15:03:04 -0700301 flags.globalFlags,
302 flags.systemIncludeFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700303 }, " ")
304
305 toolingCflags := strings.Join([]string{
306 commonFlags,
307 flags.toolingCFlags,
308 flags.conlyFlags,
309 }, " ")
310
311 cflags := strings.Join([]string{
312 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700313 flags.cFlags,
314 flags.conlyFlags,
315 }, " ")
316
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700317 toolingCppflags := strings.Join([]string{
318 commonFlags,
319 flags.toolingCFlags,
Chih-Hung Hsieh9e88ba92018-08-22 14:18:04 -0700320 flags.toolingCppFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700321 }, " ")
322
Colin Crossc3199482017-03-30 15:03:04 -0700323 cppflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700324 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700325 flags.cFlags,
326 flags.cppFlags,
327 }, " ")
328
329 asflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700330 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700331 flags.asFlags,
332 }, " ")
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700333
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800334 var sAbiDumpFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700335 if flags.sAbiDump {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800336 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
337 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800338
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700339 cflags += " ${config.NoOverrideClangGlobalCflags}"
340 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
341 cppflags += " ${config.NoOverrideClangGlobalCflags}"
342 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800343
Colin Cross3f40fa42015-01-30 17:27:36 -0800344 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700345 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800346
347 objFiles[i] = objFile
348
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700349 switch srcFile.Ext() {
350 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700351 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700352 Rule: yasm,
353 Description: "yasm " + srcFile.Rel(),
354 Output: objFile,
355 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800356 Implicits: cFlagsDeps,
357 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800358 Args: map[string]string{
359 "asFlags": flags.yasmFlags,
360 },
361 })
362 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700363 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700364 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700365 Rule: windres,
366 Description: "windres " + srcFile.Rel(),
367 Output: objFile,
368 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800369 Implicits: cFlagsDeps,
370 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700371 Args: map[string]string{
372 "windresCmd": gccCmd(flags.toolchain, "windres"),
373 "flags": flags.toolchain.WindresFlags(),
374 },
375 })
376 continue
Colin Cross91e90042016-12-02 17:13:24 -0800377 }
378
Colin Cross3f40fa42015-01-30 17:27:36 -0800379 var moduleCflags string
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700380 var moduleToolingCflags string
Colin Cross3f40fa42015-01-30 17:27:36 -0800381 var ccCmd string
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700382 tidy := flags.tidy
Dan Willemsen581341d2017-02-09 16:16:31 -0800383 coverage := flags.coverage
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700384 dump := flags.sAbiDump
Colin Cross3f40fa42015-01-30 17:27:36 -0800385
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700386 switch srcFile.Ext() {
Colin Cross3f40fa42015-01-30 17:27:36 -0800387 case ".S", ".s":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700388 ccCmd = "clang"
Colin Cross3f40fa42015-01-30 17:27:36 -0800389 moduleCflags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700390 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800391 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800392 dump = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800393 case ".c":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700394 ccCmd = "clang"
Colin Cross3f40fa42015-01-30 17:27:36 -0800395 moduleCflags = cflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700396 moduleToolingCflags = toolingCflags
Colin Cross9978ffe2016-12-01 15:31:22 -0800397 case ".cpp", ".cc", ".mm":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700398 ccCmd = "clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800399 moduleCflags = cppflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700400 moduleToolingCflags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800401 default:
402 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
403 continue
404 }
405
Colin Cross67a5c132017-05-09 13:45:28 -0700406 ccDesc := ccCmd
407
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700408 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800409
Dan Willemsen581341d2017-02-09 16:16:31 -0800410 var implicitOutputs android.WritablePaths
411 if coverage {
412 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
413 implicitOutputs = append(implicitOutputs, gcnoFile)
414 coverageFiles = append(coverageFiles, gcnoFile)
415 }
416
Colin Crossae887032017-10-23 17:16:14 -0700417 ctx.Build(pctx, android.BuildParams{
Dan Willemsen581341d2017-02-09 16:16:31 -0800418 Rule: cc,
Colin Cross67a5c132017-05-09 13:45:28 -0700419 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800420 Output: objFile,
421 ImplicitOutputs: implicitOutputs,
422 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800423 Implicits: cFlagsDeps,
424 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800425 Args: map[string]string{
Colin Cross28344522015-04-22 13:07:53 -0700426 "cFlags": moduleCflags,
427 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800428 },
429 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700430
431 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700432 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700433 tidyFiles = append(tidyFiles, tidyFile)
434
Colin Crossae887032017-10-23 17:16:14 -0700435 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700436 Rule: clangTidy,
437 Description: "clang-tidy " + srcFile.Rel(),
438 Output: tidyFile,
439 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700440 // We must depend on objFile, since clang-tidy doesn't
441 // support exporting dependencies.
442 Implicit: objFile,
443 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700444 "cFlags": moduleToolingCflags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700445 "tidyFlags": flags.tidyFlags,
446 },
447 })
448 }
449
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800450 if dump {
451 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
452 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
453
Colin Crossae887032017-10-23 17:16:14 -0700454 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700455 Rule: sAbiDump,
456 Description: "header-abi-dumper " + srcFile.Rel(),
457 Output: sAbiDumpFile,
458 Input: srcFile,
459 Implicit: objFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800460 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700461 "cFlags": moduleToolingCflags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800462 "exportDirs": flags.sAbiFlags,
463 },
464 })
465 }
466
Colin Cross3f40fa42015-01-30 17:27:36 -0800467 }
468
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700469 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800470 objFiles: objFiles,
471 tidyFiles: tidyFiles,
472 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800473 sAbiDumpFiles: sAbiDumpFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700474 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800475}
476
477// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700478func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700479 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800480
Dan Willemsen581341d2017-02-09 16:16:31 -0800481 if ctx.Darwin() {
482 transformDarwinObjToStaticLib(ctx, objFiles, flags, outputFile, deps)
483 return
484 }
485
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800486 arCmd := "${config.ClangBin}/llvm-ar"
487 arFlags := "crsD"
488 if !ctx.Darwin() {
489 arFlags += " -format=gnu"
490 }
Zhizhou Yang51be6322018-02-08 18:32:11 -0800491 if flags.arGoldPlugin {
492 arFlags += " --plugin ${config.LLVMGoldPlugin}"
493 }
Vishwath Mohan83d9f712017-03-16 11:01:23 -0700494 if flags.arFlags != "" {
495 arFlags += " " + flags.arFlags
496 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800497
Colin Crossae887032017-10-23 17:16:14 -0700498 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700499 Rule: ar,
500 Description: "static link " + outputFile.Base(),
501 Output: outputFile,
502 Inputs: objFiles,
503 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800504 Args: map[string]string{
505 "arFlags": arFlags,
506 "arCmd": arCmd,
507 },
508 })
509}
510
Colin Cross0af4b842015-04-30 16:36:18 -0700511// Generate a rule for compiling multiple .o files to a static library (.a) on
512// darwin. The darwin ar tool doesn't support @file for list files, and has a
513// very small command line length limit, so we have to split the ar into multiple
514// steps, each appending to the previous one.
Dan Willemsen581341d2017-02-09 16:16:31 -0800515func transformDarwinObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Colin Cross5b529592017-05-09 13:34:34 -0700516 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross0af4b842015-04-30 16:36:18 -0700517
Colin Cross0af4b842015-04-30 16:36:18 -0700518 arFlags := "cqs"
519
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700520 if len(objFiles) == 0 {
Colin Cross635c3b02016-05-18 15:37:25 -0700521 dummy := android.PathForModuleOut(ctx, "dummy"+objectExtension)
522 dummyAr := android.PathForModuleOut(ctx, "dummy"+staticLibraryExtension)
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700523
Colin Crossae887032017-10-23 17:16:14 -0700524 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700525 Rule: emptyFile,
526 Description: "empty object file",
527 Output: dummy,
528 Implicits: deps,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700529 })
530
Colin Crossae887032017-10-23 17:16:14 -0700531 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700532 Rule: darwinAr,
533 Description: "empty static archive",
534 Output: dummyAr,
535 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700536 Args: map[string]string{
537 "arFlags": arFlags,
538 },
539 })
540
Colin Crossae887032017-10-23 17:16:14 -0700541 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700542 Rule: darwinAppendAr,
543 Description: "static link " + outputFile.Base(),
544 Output: outputFile,
545 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700546 Args: map[string]string{
547 "arFlags": "d",
548 "inAr": dummyAr.String(),
549 },
550 })
551
552 return
553 }
554
Colin Cross0af4b842015-04-30 16:36:18 -0700555 // ARG_MAX on darwin is 262144, use half that to be safe
Colin Cross5b529592017-05-09 13:34:34 -0700556 objFilesLists, err := splitListForSize(objFiles, 131072)
Colin Cross0af4b842015-04-30 16:36:18 -0700557 if err != nil {
558 ctx.ModuleErrorf("%s", err.Error())
559 }
560
Colin Cross5b529592017-05-09 13:34:34 -0700561 var in, out android.WritablePath
Colin Cross0af4b842015-04-30 16:36:18 -0700562 for i, l := range objFilesLists {
563 in = out
564 out = outputFile
565 if i != len(objFilesLists)-1 {
Colin Cross5b529592017-05-09 13:34:34 -0700566 out = android.PathForModuleOut(ctx, outputFile.Base()+strconv.Itoa(i))
Colin Cross0af4b842015-04-30 16:36:18 -0700567 }
568
Colin Crossae887032017-10-23 17:16:14 -0700569 build := android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700570 Rule: darwinAr,
571 Description: "static link " + out.Base(),
572 Output: out,
573 Inputs: l,
574 Implicits: deps,
Colin Cross5b529592017-05-09 13:34:34 -0700575 Args: map[string]string{
576 "arFlags": arFlags,
577 },
Colin Cross0af4b842015-04-30 16:36:18 -0700578 }
Colin Cross5b529592017-05-09 13:34:34 -0700579 if i != 0 {
580 build.Rule = darwinAppendAr
581 build.Args["inAr"] = in.String()
582 }
Colin Crossae887032017-10-23 17:16:14 -0700583 ctx.Build(pctx, build)
Colin Cross0af4b842015-04-30 16:36:18 -0700584 }
585}
586
Colin Cross3f40fa42015-01-30 17:27:36 -0800587// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700588// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700589func TransformObjToDynamicBinary(ctx android.ModuleContext,
590 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
591 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800592
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700593 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800594
Colin Cross3f40fa42015-01-30 17:27:36 -0800595 var libFlagsList []string
596
Colin Cross16b23492016-01-06 14:41:07 -0800597 if len(flags.libFlags) > 0 {
598 libFlagsList = append(libFlagsList, flags.libFlags)
599 }
600
Colin Cross3f40fa42015-01-30 17:27:36 -0800601 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800602 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700603 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700604 } else {
605 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700606 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700607 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
608 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800609 }
610
Colin Cross7a7cf972016-12-05 18:47:39 -0800611 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800612 libFlagsList = append(libFlagsList, "-Wl,--start-group")
613 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700614 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800615 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800616 libFlagsList = append(libFlagsList, "-Wl,--end-group")
617 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800618
Stephen Hines10347862016-07-18 15:54:54 -0700619 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700620 libFlagsList = append(libFlagsList, "-Wl,--start-group")
621 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700622 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700623 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700624 libFlagsList = append(libFlagsList, "-Wl,--end-group")
625 }
626
Colin Cross3f40fa42015-01-30 17:27:36 -0800627 for _, lib := range sharedLibs {
Dan Albert9840e1b2016-07-21 08:47:33 -0700628 libFlagsList = append(libFlagsList, lib.String())
Colin Cross3f40fa42015-01-30 17:27:36 -0800629 }
630
Colin Cross3f40fa42015-01-30 17:27:36 -0800631 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700632 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800633 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700634 if crtBegin.Valid() {
635 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800636 }
637
Colin Crossae887032017-10-23 17:16:14 -0700638 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700639 Rule: ld,
640 Description: "link " + outputFile.Base(),
641 Output: outputFile,
642 Inputs: objFiles,
643 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800644 Args: map[string]string{
Dan Albertce2b8392016-07-21 13:16:49 -0700645 "ldCmd": ldCmd,
646 "crtBegin": crtBegin.String(),
647 "libFlags": strings.Join(libFlagsList, " "),
648 "ldFlags": flags.ldFlags,
649 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800650 },
651 })
652}
653
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800654// Generate a rule to combine .dump sAbi dump files from multiple source files
655// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700656func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800657 baseName, exportedHeaderFlags string) android.OptionalPath {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800658 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Jayant Chowdharydcd33b62018-02-23 16:43:23 -0800659 sabiLock.Lock()
660 lsdumpPaths = append(lsdumpPaths, outputFile.String())
661 sabiLock.Unlock()
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800662 symbolFilterStr := "-so " + soFile.String()
Colin Crossae887032017-10-23 17:16:14 -0700663 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700664 Rule: sAbiLink,
665 Description: "header-abi-linker " + outputFile.Base(),
666 Output: outputFile,
667 Inputs: sAbiDumps,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800668 Implicit: soFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800669 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800670 "symbolFilter": symbolFilterStr,
671 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800672 "exportedHeaderFlags": exportedHeaderFlags,
673 },
674 })
675 return android.OptionalPathForPath(outputFile)
676}
677
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700678func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
679 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700680 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700681 Rule: unzipRefSAbiDump,
682 Description: "gunzip" + outputFile.Base(),
683 Output: outputFile,
684 Input: zippedRefDump,
685 })
686 return outputFile
687}
688
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800689func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chienf3511742017-10-31 18:04:35 +0800690 baseName, exportedHeaderFlags string, isVndkExt bool) android.OptionalPath {
691
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800692 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700693 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Jayant Chowdharye4499502018-01-17 13:13:33 -0800694 localAbiCheckAllowFlags := append([]string(nil), abiCheckAllowFlags...)
695 if exportedHeaderFlags == "" {
696 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-advice-only")
697 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700698 if inList(libName, llndkLibraries) {
699 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-consider-opaque-types-different")
700 }
Logan Chienf3511742017-10-31 18:04:35 +0800701 if isVndkExt {
702 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-allow-extensions")
703 }
704
Colin Crossae887032017-10-23 17:16:14 -0700705 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700706 Rule: sAbiDiff,
707 Description: "header-abi-diff " + outputFile.Base(),
708 Output: outputFile,
709 Input: inputDump,
710 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800711 Args: map[string]string{
712 "referenceDump": referenceDump.String(),
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700713 "libName": libName,
Jayant Chowdharyf54e0a72017-05-22 10:53:24 -0700714 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdharye4499502018-01-17 13:13:33 -0800715 "allowFlags": strings.Join(localAbiCheckAllowFlags, " "),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800716 },
717 })
718 return android.OptionalPathForPath(outputFile)
719}
720
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700721// Generate a rule for extracting a table of contents from a shared library (.so)
722func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700723 outputFile android.WritablePath, flags builderFlags) {
724
Colin Crossb496cfd2018-09-10 16:50:05 -0700725 var format string
726 var crossCompile string
727 if ctx.Darwin() {
728 format = "--macho"
729 crossCompile = "${config.MacToolPath}"
730 } else if ctx.Windows() {
731 format = "--pe"
732 crossCompile = gccCmd(flags.toolchain, "")
733 } else {
734 format = "--elf"
735 crossCompile = gccCmd(flags.toolchain, "")
736 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700737
Colin Crossae887032017-10-23 17:16:14 -0700738 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700739 Rule: toc,
740 Description: "generate toc " + inputFile.Base(),
741 Output: outputFile,
742 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700743 Args: map[string]string{
744 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700745 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700746 },
747 })
748}
749
Colin Cross3f40fa42015-01-30 17:27:36 -0800750// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700751func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
752 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800753
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700754 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800755
Colin Crossae887032017-10-23 17:16:14 -0700756 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700757 Rule: partialLd,
758 Description: "link " + outputFile.Base(),
759 Output: outputFile,
760 Inputs: objFiles,
Colin Cross3f40fa42015-01-30 17:27:36 -0800761 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700762 "ldCmd": ldCmd,
Colin Cross41280a42015-11-23 14:01:42 -0800763 "ldFlags": flags.ldFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800764 },
765 })
766}
767
Colin Crossbfae8852015-03-26 14:44:11 -0700768// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700769func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
770 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700771
772 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
773
Colin Crossae887032017-10-23 17:16:14 -0700774 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700775 Rule: prefixSymbols,
776 Description: "prefix symbols " + outputFile.Base(),
777 Output: outputFile,
778 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700779 Args: map[string]string{
780 "objcopyCmd": objcopyCmd,
781 "prefix": prefix,
782 },
783 })
784}
785
Colin Cross635c3b02016-05-18 15:37:25 -0700786func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
787 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700788
789 crossCompile := gccCmd(flags.toolchain, "")
790 args := ""
791 if flags.stripAddGnuDebuglink {
792 args += " --add-gnu-debuglink"
793 }
794 if flags.stripKeepMiniDebugInfo {
795 args += " --keep-mini-debug-info"
796 }
797 if flags.stripKeepSymbols {
798 args += " --keep-symbols"
799 }
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700800 if flags.stripUseLlvmStrip {
801 args += " --use-llvm-strip"
802 }
Colin Cross665dce92016-04-28 14:50:03 -0700803
Colin Crossae887032017-10-23 17:16:14 -0700804 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700805 Rule: strip,
806 Description: "strip " + outputFile.Base(),
807 Output: outputFile,
808 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700809 Args: map[string]string{
810 "crossCompile": crossCompile,
811 "args": args,
812 },
813 })
814}
815
Colin Cross635c3b02016-05-18 15:37:25 -0700816func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
817 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700818
Colin Crossae887032017-10-23 17:16:14 -0700819 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700820 Rule: darwinStrip,
821 Description: "strip " + outputFile.Base(),
822 Output: outputFile,
823 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700824 })
825}
826
Dan Willemsen581341d2017-02-09 16:16:31 -0800827func TransformCoverageFilesToLib(ctx android.ModuleContext,
828 inputs Objects, flags builderFlags, baseName string) android.OptionalPath {
829
830 if len(inputs.coverageFiles) > 0 {
831 outputFile := android.PathForModuleOut(ctx, baseName+".gcnodir")
832
833 TransformObjToStaticLib(ctx, inputs.coverageFiles, flags, outputFile, nil)
834
835 return android.OptionalPathForPath(outputFile)
836 }
837
838 return android.OptionalPath{}
839}
840
Colin Crossb98c8b02016-07-29 13:44:28 -0700841func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800842 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
843}
Colin Cross0af4b842015-04-30 16:36:18 -0700844
Colin Cross5b529592017-05-09 13:34:34 -0700845func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700846 var i int
847
848 start := 0
849 bytes := 0
850 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700851 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700852 if l > limit {
853 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
854 }
855 if bytes+l > limit {
856 lists = append(lists, list[start:i])
857 start = i
858 bytes = 0
859 }
860 bytes += l + 1 // count a space between each list element
861 }
862
863 lists = append(lists, list[start:])
864
865 totalLen := 0
866 for _, l := range lists {
867 totalLen += len(l)
868 }
869 if totalLen != len(list) {
870 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
871 }
872 return lists, nil
873}