blob: d1bc23fdf75b02e32a8bda24d0a9f0cad92963f7 [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
245 clang bool
246 tidy bool
247 coverage bool
248 sAbiDump bool
249 protoRoot bool
Colin Cross665dce92016-04-28 14:50:03 -0700250
Colin Crossc3199482017-03-30 15:03:04 -0700251 systemIncludeFlags string
252
Colin Cross18c0c5a2016-12-01 14:45:23 -0800253 groupStaticLibs bool
Zhizhou Yang51be6322018-02-08 18:32:11 -0800254 arGoldPlugin bool
Colin Cross18c0c5a2016-12-01 14:45:23 -0800255
Colin Cross665dce92016-04-28 14:50:03 -0700256 stripKeepSymbols bool
257 stripKeepMiniDebugInfo bool
258 stripAddGnuDebuglink bool
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700259 stripUseLlvmStrip bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800260}
261
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700262type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800263 objFiles android.Paths
264 tidyFiles android.Paths
265 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800266 sAbiDumpFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700267}
268
269func (a Objects) Copy() Objects {
270 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800271 objFiles: append(android.Paths{}, a.objFiles...),
272 tidyFiles: append(android.Paths{}, a.tidyFiles...),
273 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800274 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700275 }
276}
277
278func (a Objects) Append(b Objects) Objects {
279 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800280 objFiles: append(a.objFiles, b.objFiles...),
281 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
282 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800283 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700284 }
285}
286
Colin Cross3f40fa42015-01-30 17:27:36 -0800287// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700288func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800289 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700290
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700291 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700292 var tidyFiles android.Paths
293 if flags.tidy && flags.clang {
294 tidyFiles = make(android.Paths, 0, len(srcFiles))
295 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800296 var coverageFiles android.Paths
297 if flags.coverage {
298 coverageFiles = make(android.Paths, 0, len(srcFiles))
299 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800300
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700301 commonFlags := strings.Join([]string{
Colin Crossc3199482017-03-30 15:03:04 -0700302 flags.globalFlags,
303 flags.systemIncludeFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700304 }, " ")
305
306 toolingCflags := strings.Join([]string{
307 commonFlags,
308 flags.toolingCFlags,
309 flags.conlyFlags,
310 }, " ")
311
312 cflags := strings.Join([]string{
313 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700314 flags.cFlags,
315 flags.conlyFlags,
316 }, " ")
317
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700318 toolingCppflags := strings.Join([]string{
319 commonFlags,
320 flags.toolingCFlags,
Chih-Hung Hsieh9e88ba92018-08-22 14:18:04 -0700321 flags.toolingCppFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700322 }, " ")
323
Colin Crossc3199482017-03-30 15:03:04 -0700324 cppflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700325 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700326 flags.cFlags,
327 flags.cppFlags,
328 }, " ")
329
330 asflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700331 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700332 flags.asFlags,
333 }, " ")
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700334
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800335 var sAbiDumpFiles android.Paths
336 if flags.sAbiDump && flags.clang {
337 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
338 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800339
Dan Willemsenbe03f342016-03-03 17:21:04 -0800340 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700341 cflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700342 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700343 cppflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700344 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800345 } else {
Colin Crossb98c8b02016-07-29 13:44:28 -0700346 cflags += " ${config.NoOverrideGlobalCflags}"
347 cppflags += " ${config.NoOverrideGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800348 }
349
Colin Cross3f40fa42015-01-30 17:27:36 -0800350 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700351 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800352
353 objFiles[i] = objFile
354
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700355 switch srcFile.Ext() {
356 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700357 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700358 Rule: yasm,
359 Description: "yasm " + srcFile.Rel(),
360 Output: objFile,
361 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800362 Implicits: cFlagsDeps,
363 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800364 Args: map[string]string{
365 "asFlags": flags.yasmFlags,
366 },
367 })
368 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700369 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700370 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700371 Rule: windres,
372 Description: "windres " + srcFile.Rel(),
373 Output: objFile,
374 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800375 Implicits: cFlagsDeps,
376 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700377 Args: map[string]string{
378 "windresCmd": gccCmd(flags.toolchain, "windres"),
379 "flags": flags.toolchain.WindresFlags(),
380 },
381 })
382 continue
Colin Cross91e90042016-12-02 17:13:24 -0800383 }
384
Colin Cross3f40fa42015-01-30 17:27:36 -0800385 var moduleCflags string
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700386 var moduleToolingCflags string
Colin Cross3f40fa42015-01-30 17:27:36 -0800387 var ccCmd string
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700388 tidy := flags.tidy && flags.clang
Dan Willemsen581341d2017-02-09 16:16:31 -0800389 coverage := flags.coverage
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800390 dump := flags.sAbiDump && flags.clang
Colin Cross3f40fa42015-01-30 17:27:36 -0800391
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700392 switch srcFile.Ext() {
Colin Cross3f40fa42015-01-30 17:27:36 -0800393 case ".S", ".s":
394 ccCmd = "gcc"
395 moduleCflags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700396 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800397 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800398 dump = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800399 case ".c":
400 ccCmd = "gcc"
401 moduleCflags = cflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700402 moduleToolingCflags = toolingCflags
Colin Cross9978ffe2016-12-01 15:31:22 -0800403 case ".cpp", ".cc", ".mm":
Colin Cross3f40fa42015-01-30 17:27:36 -0800404 ccCmd = "g++"
405 moduleCflags = cppflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700406 moduleToolingCflags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800407 default:
408 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
409 continue
410 }
411
412 if flags.clang {
413 switch ccCmd {
414 case "gcc":
415 ccCmd = "clang"
416 case "g++":
417 ccCmd = "clang++"
418 default:
419 panic("unrecoginzied ccCmd")
420 }
Colin Cross67a5c132017-05-09 13:45:28 -0700421 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800422
Colin Cross67a5c132017-05-09 13:45:28 -0700423 ccDesc := ccCmd
424
425 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700426 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800427 } else {
428 ccCmd = gccCmd(flags.toolchain, ccCmd)
429 }
430
Dan Willemsen581341d2017-02-09 16:16:31 -0800431 var implicitOutputs android.WritablePaths
432 if coverage {
433 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
434 implicitOutputs = append(implicitOutputs, gcnoFile)
435 coverageFiles = append(coverageFiles, gcnoFile)
436 }
437
Colin Crossae887032017-10-23 17:16:14 -0700438 ctx.Build(pctx, android.BuildParams{
Dan Willemsen581341d2017-02-09 16:16:31 -0800439 Rule: cc,
Colin Cross67a5c132017-05-09 13:45:28 -0700440 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800441 Output: objFile,
442 ImplicitOutputs: implicitOutputs,
443 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800444 Implicits: cFlagsDeps,
445 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800446 Args: map[string]string{
Colin Cross28344522015-04-22 13:07:53 -0700447 "cFlags": moduleCflags,
448 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800449 },
450 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700451
452 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700453 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700454 tidyFiles = append(tidyFiles, tidyFile)
455
Colin Crossae887032017-10-23 17:16:14 -0700456 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700457 Rule: clangTidy,
458 Description: "clang-tidy " + srcFile.Rel(),
459 Output: tidyFile,
460 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700461 // We must depend on objFile, since clang-tidy doesn't
462 // support exporting dependencies.
463 Implicit: objFile,
464 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700465 "cFlags": moduleToolingCflags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700466 "tidyFlags": flags.tidyFlags,
467 },
468 })
469 }
470
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800471 if dump {
472 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
473 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
474
Colin Crossae887032017-10-23 17:16:14 -0700475 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700476 Rule: sAbiDump,
477 Description: "header-abi-dumper " + srcFile.Rel(),
478 Output: sAbiDumpFile,
479 Input: srcFile,
480 Implicit: objFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800481 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700482 "cFlags": moduleToolingCflags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800483 "exportDirs": flags.sAbiFlags,
484 },
485 })
486 }
487
Colin Cross3f40fa42015-01-30 17:27:36 -0800488 }
489
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700490 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800491 objFiles: objFiles,
492 tidyFiles: tidyFiles,
493 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800494 sAbiDumpFiles: sAbiDumpFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700495 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800496}
497
498// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700499func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700500 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800501
Dan Willemsen581341d2017-02-09 16:16:31 -0800502 if ctx.Darwin() {
503 transformDarwinObjToStaticLib(ctx, objFiles, flags, outputFile, deps)
504 return
505 }
506
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800507 arCmd := "${config.ClangBin}/llvm-ar"
508 arFlags := "crsD"
509 if !ctx.Darwin() {
510 arFlags += " -format=gnu"
511 }
Zhizhou Yang51be6322018-02-08 18:32:11 -0800512 if flags.arGoldPlugin {
513 arFlags += " --plugin ${config.LLVMGoldPlugin}"
514 }
Vishwath Mohan83d9f712017-03-16 11:01:23 -0700515 if flags.arFlags != "" {
516 arFlags += " " + flags.arFlags
517 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800518
Colin Crossae887032017-10-23 17:16:14 -0700519 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700520 Rule: ar,
521 Description: "static link " + outputFile.Base(),
522 Output: outputFile,
523 Inputs: objFiles,
524 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800525 Args: map[string]string{
526 "arFlags": arFlags,
527 "arCmd": arCmd,
528 },
529 })
530}
531
Colin Cross0af4b842015-04-30 16:36:18 -0700532// Generate a rule for compiling multiple .o files to a static library (.a) on
533// darwin. The darwin ar tool doesn't support @file for list files, and has a
534// very small command line length limit, so we have to split the ar into multiple
535// steps, each appending to the previous one.
Dan Willemsen581341d2017-02-09 16:16:31 -0800536func transformDarwinObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Colin Cross5b529592017-05-09 13:34:34 -0700537 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross0af4b842015-04-30 16:36:18 -0700538
Colin Cross0af4b842015-04-30 16:36:18 -0700539 arFlags := "cqs"
540
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700541 if len(objFiles) == 0 {
Colin Cross635c3b02016-05-18 15:37:25 -0700542 dummy := android.PathForModuleOut(ctx, "dummy"+objectExtension)
543 dummyAr := android.PathForModuleOut(ctx, "dummy"+staticLibraryExtension)
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700544
Colin Crossae887032017-10-23 17:16:14 -0700545 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700546 Rule: emptyFile,
547 Description: "empty object file",
548 Output: dummy,
549 Implicits: deps,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700550 })
551
Colin Crossae887032017-10-23 17:16:14 -0700552 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700553 Rule: darwinAr,
554 Description: "empty static archive",
555 Output: dummyAr,
556 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700557 Args: map[string]string{
558 "arFlags": arFlags,
559 },
560 })
561
Colin Crossae887032017-10-23 17:16:14 -0700562 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700563 Rule: darwinAppendAr,
564 Description: "static link " + outputFile.Base(),
565 Output: outputFile,
566 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700567 Args: map[string]string{
568 "arFlags": "d",
569 "inAr": dummyAr.String(),
570 },
571 })
572
573 return
574 }
575
Colin Cross0af4b842015-04-30 16:36:18 -0700576 // ARG_MAX on darwin is 262144, use half that to be safe
Colin Cross5b529592017-05-09 13:34:34 -0700577 objFilesLists, err := splitListForSize(objFiles, 131072)
Colin Cross0af4b842015-04-30 16:36:18 -0700578 if err != nil {
579 ctx.ModuleErrorf("%s", err.Error())
580 }
581
Colin Cross5b529592017-05-09 13:34:34 -0700582 var in, out android.WritablePath
Colin Cross0af4b842015-04-30 16:36:18 -0700583 for i, l := range objFilesLists {
584 in = out
585 out = outputFile
586 if i != len(objFilesLists)-1 {
Colin Cross5b529592017-05-09 13:34:34 -0700587 out = android.PathForModuleOut(ctx, outputFile.Base()+strconv.Itoa(i))
Colin Cross0af4b842015-04-30 16:36:18 -0700588 }
589
Colin Crossae887032017-10-23 17:16:14 -0700590 build := android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700591 Rule: darwinAr,
592 Description: "static link " + out.Base(),
593 Output: out,
594 Inputs: l,
595 Implicits: deps,
Colin Cross5b529592017-05-09 13:34:34 -0700596 Args: map[string]string{
597 "arFlags": arFlags,
598 },
Colin Cross0af4b842015-04-30 16:36:18 -0700599 }
Colin Cross5b529592017-05-09 13:34:34 -0700600 if i != 0 {
601 build.Rule = darwinAppendAr
602 build.Args["inAr"] = in.String()
603 }
Colin Crossae887032017-10-23 17:16:14 -0700604 ctx.Build(pctx, build)
Colin Cross0af4b842015-04-30 16:36:18 -0700605 }
606}
607
Colin Cross3f40fa42015-01-30 17:27:36 -0800608// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700609// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700610func TransformObjToDynamicBinary(ctx android.ModuleContext,
611 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
612 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800613
614 var ldCmd string
615 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700616 ldCmd = "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800617 } else {
618 ldCmd = gccCmd(flags.toolchain, "g++")
619 }
620
Colin Cross3f40fa42015-01-30 17:27:36 -0800621 var libFlagsList []string
622
Colin Cross16b23492016-01-06 14:41:07 -0800623 if len(flags.libFlags) > 0 {
624 libFlagsList = append(libFlagsList, flags.libFlags)
625 }
626
Colin Cross3f40fa42015-01-30 17:27:36 -0800627 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800628 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700629 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700630 } else {
631 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700632 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700633 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
634 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800635 }
636
Colin Cross7a7cf972016-12-05 18:47:39 -0800637 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800638 libFlagsList = append(libFlagsList, "-Wl,--start-group")
639 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700640 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800641 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800642 libFlagsList = append(libFlagsList, "-Wl,--end-group")
643 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800644
Stephen Hines10347862016-07-18 15:54:54 -0700645 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700646 libFlagsList = append(libFlagsList, "-Wl,--start-group")
647 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700648 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700649 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700650 libFlagsList = append(libFlagsList, "-Wl,--end-group")
651 }
652
Colin Cross3f40fa42015-01-30 17:27:36 -0800653 for _, lib := range sharedLibs {
Dan Albert9840e1b2016-07-21 08:47:33 -0700654 libFlagsList = append(libFlagsList, lib.String())
Colin Cross3f40fa42015-01-30 17:27:36 -0800655 }
656
Colin Cross3f40fa42015-01-30 17:27:36 -0800657 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700658 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800659 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700660 if crtBegin.Valid() {
661 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800662 }
663
Colin Crossae887032017-10-23 17:16:14 -0700664 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700665 Rule: ld,
666 Description: "link " + outputFile.Base(),
667 Output: outputFile,
668 Inputs: objFiles,
669 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800670 Args: map[string]string{
Dan Albertce2b8392016-07-21 13:16:49 -0700671 "ldCmd": ldCmd,
672 "crtBegin": crtBegin.String(),
673 "libFlags": strings.Join(libFlagsList, " "),
674 "ldFlags": flags.ldFlags,
675 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800676 },
677 })
678}
679
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800680// Generate a rule to combine .dump sAbi dump files from multiple source files
681// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700682func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800683 baseName, exportedHeaderFlags string) android.OptionalPath {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800684 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Jayant Chowdharydcd33b62018-02-23 16:43:23 -0800685 sabiLock.Lock()
686 lsdumpPaths = append(lsdumpPaths, outputFile.String())
687 sabiLock.Unlock()
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800688 symbolFilterStr := "-so " + soFile.String()
Colin Crossae887032017-10-23 17:16:14 -0700689 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700690 Rule: sAbiLink,
691 Description: "header-abi-linker " + outputFile.Base(),
692 Output: outputFile,
693 Inputs: sAbiDumps,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800694 Implicit: soFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800695 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800696 "symbolFilter": symbolFilterStr,
697 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800698 "exportedHeaderFlags": exportedHeaderFlags,
699 },
700 })
701 return android.OptionalPathForPath(outputFile)
702}
703
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700704func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
705 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700706 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700707 Rule: unzipRefSAbiDump,
708 Description: "gunzip" + outputFile.Base(),
709 Output: outputFile,
710 Input: zippedRefDump,
711 })
712 return outputFile
713}
714
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800715func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chienf3511742017-10-31 18:04:35 +0800716 baseName, exportedHeaderFlags string, isVndkExt bool) android.OptionalPath {
717
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800718 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700719 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Jayant Chowdharye4499502018-01-17 13:13:33 -0800720 localAbiCheckAllowFlags := append([]string(nil), abiCheckAllowFlags...)
721 if exportedHeaderFlags == "" {
722 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-advice-only")
723 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700724 if inList(libName, llndkLibraries) {
725 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-consider-opaque-types-different")
726 }
Logan Chienf3511742017-10-31 18:04:35 +0800727 if isVndkExt {
728 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-allow-extensions")
729 }
730
Colin Crossae887032017-10-23 17:16:14 -0700731 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700732 Rule: sAbiDiff,
733 Description: "header-abi-diff " + outputFile.Base(),
734 Output: outputFile,
735 Input: inputDump,
736 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800737 Args: map[string]string{
738 "referenceDump": referenceDump.String(),
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700739 "libName": libName,
Jayant Chowdharyf54e0a72017-05-22 10:53:24 -0700740 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdharye4499502018-01-17 13:13:33 -0800741 "allowFlags": strings.Join(localAbiCheckAllowFlags, " "),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800742 },
743 })
744 return android.OptionalPathForPath(outputFile)
745}
746
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700747// Generate a rule for extracting a table of contents from a shared library (.so)
748func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700749 outputFile android.WritablePath, flags builderFlags) {
750
Colin Crossb496cfd2018-09-10 16:50:05 -0700751 var format string
752 var crossCompile string
753 if ctx.Darwin() {
754 format = "--macho"
755 crossCompile = "${config.MacToolPath}"
756 } else if ctx.Windows() {
757 format = "--pe"
758 crossCompile = gccCmd(flags.toolchain, "")
759 } else {
760 format = "--elf"
761 crossCompile = gccCmd(flags.toolchain, "")
762 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700763
Colin Crossae887032017-10-23 17:16:14 -0700764 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700765 Rule: toc,
766 Description: "generate toc " + inputFile.Base(),
767 Output: outputFile,
768 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700769 Args: map[string]string{
770 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700771 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700772 },
773 })
774}
775
Colin Cross3f40fa42015-01-30 17:27:36 -0800776// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700777func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
778 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800779
Colin Cross41280a42015-11-23 14:01:42 -0800780 var ldCmd string
781 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700782 ldCmd = "${config.ClangBin}/clang++"
Colin Cross41280a42015-11-23 14:01:42 -0800783 } else {
784 ldCmd = gccCmd(flags.toolchain, "g++")
785 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800786
Colin Crossae887032017-10-23 17:16:14 -0700787 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700788 Rule: partialLd,
789 Description: "link " + outputFile.Base(),
790 Output: outputFile,
791 Inputs: objFiles,
Colin Cross3f40fa42015-01-30 17:27:36 -0800792 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700793 "ldCmd": ldCmd,
Colin Cross41280a42015-11-23 14:01:42 -0800794 "ldFlags": flags.ldFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800795 },
796 })
797}
798
Colin Crossbfae8852015-03-26 14:44:11 -0700799// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700800func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
801 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700802
803 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
804
Colin Crossae887032017-10-23 17:16:14 -0700805 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700806 Rule: prefixSymbols,
807 Description: "prefix symbols " + outputFile.Base(),
808 Output: outputFile,
809 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700810 Args: map[string]string{
811 "objcopyCmd": objcopyCmd,
812 "prefix": prefix,
813 },
814 })
815}
816
Colin Cross635c3b02016-05-18 15:37:25 -0700817func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
818 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700819
820 crossCompile := gccCmd(flags.toolchain, "")
821 args := ""
822 if flags.stripAddGnuDebuglink {
823 args += " --add-gnu-debuglink"
824 }
825 if flags.stripKeepMiniDebugInfo {
826 args += " --keep-mini-debug-info"
827 }
828 if flags.stripKeepSymbols {
829 args += " --keep-symbols"
830 }
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700831 if flags.stripUseLlvmStrip {
832 args += " --use-llvm-strip"
833 }
Colin Cross665dce92016-04-28 14:50:03 -0700834
Colin Crossae887032017-10-23 17:16:14 -0700835 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700836 Rule: strip,
837 Description: "strip " + outputFile.Base(),
838 Output: outputFile,
839 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700840 Args: map[string]string{
841 "crossCompile": crossCompile,
842 "args": args,
843 },
844 })
845}
846
Colin Cross635c3b02016-05-18 15:37:25 -0700847func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
848 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700849
Colin Crossae887032017-10-23 17:16:14 -0700850 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700851 Rule: darwinStrip,
852 Description: "strip " + outputFile.Base(),
853 Output: outputFile,
854 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700855 })
856}
857
Dan Willemsen581341d2017-02-09 16:16:31 -0800858func TransformCoverageFilesToLib(ctx android.ModuleContext,
859 inputs Objects, flags builderFlags, baseName string) android.OptionalPath {
860
861 if len(inputs.coverageFiles) > 0 {
862 outputFile := android.PathForModuleOut(ctx, baseName+".gcnodir")
863
864 TransformObjToStaticLib(ctx, inputs.coverageFiles, flags, outputFile, nil)
865
866 return android.OptionalPathForPath(outputFile)
867 }
868
869 return android.OptionalPath{}
870}
871
Colin Crossb98c8b02016-07-29 13:44:28 -0700872func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800873 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
874}
Colin Cross0af4b842015-04-30 16:36:18 -0700875
Colin Cross5b529592017-05-09 13:34:34 -0700876func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700877 var i int
878
879 start := 0
880 bytes := 0
881 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700882 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700883 if l > limit {
884 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
885 }
886 if bytes+l > limit {
887 lists = append(lists, list[start:i])
888 start = i
889 bytes = 0
890 }
891 bytes += l + 1 // count a space between each list element
892 }
893
894 lists = append(lists, list[start:])
895
896 totalLen := 0
897 for _, l := range lists {
898 totalLen += len(l)
899 }
900 if totalLen != len(list) {
901 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
902 }
903 return lists, nil
904}