blob: 58196f4c8bea59b6789904622df8bff6165ffe64 [file] [log] [blame]
Colin Cross3f40fa42015-01-30 17:27:36 -08001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package cc
16
17// This file generates the final rules for compiling all C/C++. All properties related to
18// compiling should have been translated into builderFlags or another argument to the Transform*
19// functions.
20
21import (
Colin Cross0af4b842015-04-30 16:36:18 -070022 "fmt"
Colin Crossb98c8b02016-07-29 13:44:28 -070023 "path/filepath"
Colin Cross0af4b842015-04-30 16:36:18 -070024 "runtime"
25 "strconv"
Colin Cross3f40fa42015-01-30 17:27:36 -080026 "strings"
Colin Crossed4cf0b2015-03-26 14:43:45 -070027
28 "github.com/google/blueprint"
Colin Crossb98c8b02016-07-29 13:44:28 -070029
30 "android/soong/android"
31 "android/soong/cc/config"
Colin Cross3f40fa42015-01-30 17:27:36 -080032)
33
34const (
Dan Albertc3144b12015-04-28 18:17:56 -070035 objectExtension = ".o"
Colin Cross3f40fa42015-01-30 17:27:36 -080036 staticLibraryExtension = ".a"
37)
38
39var (
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -070040 abiCheckAllowFlags = []string{
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -070041 "-allow-unreferenced-changes",
42 "-allow-unreferenced-elf-symbol-changes",
43 }
44)
45
46var (
Colin Cross635c3b02016-05-18 15:37:25 -070047 pctx = android.NewPackageContext("android/soong/cc")
Colin Cross3f40fa42015-01-30 17:27:36 -080048
Colin Cross9d45bb72016-08-29 16:14:13 -070049 cc = pctx.AndroidGomaStaticRule("cc",
Colin Cross3f40fa42015-01-30 17:27:36 -080050 blueprint.RuleParams{
51 Depfile: "${out}.d",
52 Deps: blueprint.DepsGCC,
Alistair Strachan777475c2016-08-26 12:55:49 -070053 Command: "$relPwd ${config.CcWrapper}$ccCmd -c $cFlags -MD -MF ${out}.d -o $out $in",
Dan Willemsenc94a7682015-11-17 15:27:28 -080054 CommandDeps: []string{"$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080055 },
Dan Willemsen322a0a62015-11-17 15:19:46 -080056 "ccCmd", "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080057
Colin Cross9d45bb72016-08-29 16:14:13 -070058 ld = pctx.AndroidStaticRule("ld",
Colin Cross3f40fa42015-01-30 17:27:36 -080059 blueprint.RuleParams{
Dan Albertce2b8392016-07-21 13:16:49 -070060 Command: "$ldCmd ${crtBegin} @${out}.rsp " +
Colin Cross28344522015-04-22 13:07:53 -070061 "${libFlags} ${crtEnd} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080062 CommandDeps: []string{"$ldCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070063 Rspfile: "${out}.rsp",
64 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080065 },
Dan Albertce2b8392016-07-21 13:16:49 -070066 "ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080067
Colin Cross9d45bb72016-08-29 16:14:13 -070068 partialLd = pctx.AndroidStaticRule("partialLd",
Colin Cross3f40fa42015-01-30 17:27:36 -080069 blueprint.RuleParams{
Chih-Hung Hsieh3ede2942018-01-10 14:30:44 -080070 // Without -no-pie, clang 7.0 adds -pie to link Android files,
71 // but -r and -pie cannot be used together.
72 Command: "$ldCmd -nostdlib -no-pie -Wl,-r ${in} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080073 CommandDeps: []string{"$ldCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080074 },
Colin Cross41280a42015-11-23 14:01:42 -080075 "ldCmd", "ldFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080076
Colin Cross9d45bb72016-08-29 16:14:13 -070077 ar = pctx.AndroidStaticRule("ar",
Colin Cross3f40fa42015-01-30 17:27:36 -080078 blueprint.RuleParams{
Colin Cross7d21c442015-03-30 17:47:53 -070079 Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
Dan Willemsenc94a7682015-11-17 15:27:28 -080080 CommandDeps: []string{"$arCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070081 Rspfile: "${out}.rsp",
82 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080083 },
84 "arCmd", "arFlags")
85
Colin Cross9d45bb72016-08-29 16:14:13 -070086 darwinAr = pctx.AndroidStaticRule("darwinAr",
Colin Cross0af4b842015-04-30 16:36:18 -070087 blueprint.RuleParams{
Colin Crossb98c8b02016-07-29 13:44:28 -070088 Command: "rm -f ${out} && ${config.MacArPath} $arFlags $out $in",
89 CommandDeps: []string{"${config.MacArPath}"},
Colin Cross0af4b842015-04-30 16:36:18 -070090 },
Colin Crossb8ecdfe2016-05-03 15:10:29 -070091 "arFlags")
Colin Cross0af4b842015-04-30 16:36:18 -070092
Colin Cross9d45bb72016-08-29 16:14:13 -070093 darwinAppendAr = pctx.AndroidStaticRule("darwinAppendAr",
Colin Cross0af4b842015-04-30 16:36:18 -070094 blueprint.RuleParams{
Colin Crossb98c8b02016-07-29 13:44:28 -070095 Command: "cp -f ${inAr} ${out}.tmp && ${config.MacArPath} $arFlags ${out}.tmp $in && mv ${out}.tmp ${out}",
96 CommandDeps: []string{"${config.MacArPath}", "${inAr}"},
Colin Cross0af4b842015-04-30 16:36:18 -070097 },
Colin Crossb8ecdfe2016-05-03 15:10:29 -070098 "arFlags", "inAr")
99
Colin Cross9d45bb72016-08-29 16:14:13 -0700100 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700101 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -0700102 Command: "${config.MacStripPath} -u -r -o $out $in",
103 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700104 })
Colin Cross0af4b842015-04-30 16:36:18 -0700105
Colin Cross9d45bb72016-08-29 16:14:13 -0700106 prefixSymbols = pctx.AndroidStaticRule("prefixSymbols",
Colin Crossbfae8852015-03-26 14:44:11 -0700107 blueprint.RuleParams{
108 Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800109 CommandDeps: []string{"$objcopyCmd"},
Colin Crossbfae8852015-03-26 14:44:11 -0700110 },
111 "objcopyCmd", "prefix")
112
Nan Zhang43a485c2017-03-27 14:27:58 -0700113 _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh")
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800114 _ = pctx.SourcePathVariable("xzCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/xz")
Colin Cross665dce92016-04-28 14:50:03 -0700115
Colin Cross9d45bb72016-08-29 16:14:13 -0700116 strip = pctx.AndroidStaticRule("strip",
Colin Cross665dce92016-04-28 14:50:03 -0700117 blueprint.RuleParams{
118 Depfile: "${out}.d",
119 Deps: blueprint.DepsGCC,
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700120 Command: "CROSS_COMPILE=$crossCompile XZ=$xzCmd CLANG_BIN=${config.ClangBin} $stripPath ${args} -i ${in} -o ${out} -d ${out}.d",
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800121 CommandDeps: []string{"$stripPath", "$xzCmd"},
Colin Cross665dce92016-04-28 14:50:03 -0700122 },
123 "args", "crossCompile")
124
Colin Cross9d45bb72016-08-29 16:14:13 -0700125 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700126 blueprint.RuleParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700127 Command: "rm -f $out && touch $out",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700128 })
129
Nan Zhang43a485c2017-03-27 14:27:58 -0700130 _ = pctx.SourcePathVariable("copyGccLibPath", "build/soong/scripts/copygcclib.sh")
Colin Cross3f40fa42015-01-30 17:27:36 -0800131
Colin Cross9d45bb72016-08-29 16:14:13 -0700132 copyGccLib = pctx.AndroidStaticRule("copyGccLib",
Colin Cross3f40fa42015-01-30 17:27:36 -0800133 blueprint.RuleParams{
134 Depfile: "${out}.d",
135 Deps: blueprint.DepsGCC,
136 Command: "$copyGccLibPath $out $ccCmd $cFlags -print-file-name=${libName}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800137 CommandDeps: []string{"$copyGccLibPath", "$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -0800138 },
139 "ccCmd", "cFlags", "libName")
Colin Cross26c34ed2016-09-30 17:10:16 -0700140
Nan Zhang43a485c2017-03-27 14:27:58 -0700141 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700142
143 toc = pctx.AndroidStaticRule("toc",
144 blueprint.RuleParams{
145 Depfile: "${out}.d",
146 Deps: blueprint.DepsGCC,
Colin Crossb496cfd2018-09-10 16:50:05 -0700147 Command: "CROSS_COMPILE=$crossCompile $tocPath $format -i ${in} -o ${out} -d ${out}.d",
Colin Cross26c34ed2016-09-30 17:10:16 -0700148 CommandDeps: []string{"$tocPath"},
149 Restat: true,
150 },
Colin Crossb496cfd2018-09-10 16:50:05 -0700151 "crossCompile", "format")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700152
153 clangTidy = pctx.AndroidStaticRule("clangTidy",
154 blueprint.RuleParams{
Chih-Hung Hsiehb699c432018-08-27 16:19:59 -0700155 Command: "rm -f $out && CLANG_TIDY=${config.ClangBin}/clang-tidy ${config.ClangTidyShellPath} $tidyFlags $in -- $cFlags && touch $out",
156 CommandDeps: []string{"${config.ClangBin}/clang-tidy", "${config.ClangTidyShellPath}"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700157 },
158 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800159
Nan Zhang43a485c2017-03-27 14:27:58 -0700160 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800161
162 yasm = pctx.AndroidStaticRule("yasm",
163 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700164 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800165 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700166 Depfile: "$out.d",
167 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800168 },
169 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800170
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700171 windres = pctx.AndroidStaticRule("windres",
172 blueprint.RuleParams{
173 Command: "$windresCmd $flags -I$$(dirname $in) -i $in -o $out",
174 CommandDeps: []string{"$windresCmd"},
175 },
176 "windresCmd", "flags")
177
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800178 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800179
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700180 // -w has been added since header-abi-dumper does not need to produce any sort of diagnostic information.
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800181 sAbiDump = pctx.AndroidStaticRule("sAbiDump",
182 blueprint.RuleParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700183 Command: "rm -f $out && $sAbiDumper -o ${out} $in $exportDirs -- $cFlags -w -isystem ${config.RSIncludePath}",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800184 CommandDeps: []string{"$sAbiDumper"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800185 },
186 "cFlags", "exportDirs")
187
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800188 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800189
190 sAbiLink = pctx.AndroidStaticRule("sAbiLink",
191 blueprint.RuleParams{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800192 Command: "$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800193 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800194 Rspfile: "${out}.rsp",
195 RspfileContent: "${in}",
196 },
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800197 "symbolFilter", "arch", "exportedHeaderFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800198
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800199 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700200
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800201 sAbiDiff = pctx.AndroidRuleFunc("sAbiDiff",
Dan Willemsen54daaf02018-03-12 13:24:09 -0700202 func(ctx android.PackageRuleContext) blueprint.RuleParams {
Jayant Chowdhary39d167a2018-05-17 16:45:51 -0700203 // TODO(b/78139997): Add -check-all-apis back
204 commandStr := "($sAbiDiffer $allowFlags -lib $libName -arch $arch -o ${out} -new $in -old $referenceDump)"
Dan Willemsenbc0c5092018-03-10 16:25:53 -0800205 distAbiDiffDir := android.PathForDist(ctx, "abidiffs")
Jiyong Parka5f11e42018-04-17 12:19:51 +0900206 commandStr += "|| (echo ' ---- Please update abi references by running $$ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py -l ${libName} ----'"
Dan Willemsenbc0c5092018-03-10 16:25:53 -0800207 if distAbiDiffDir.Valid() {
Dan Willemsenedd1ae02018-04-17 10:41:11 -0700208 commandStr += " && (mkdir -p " + distAbiDiffDir.String() + " && cp ${out} " + distAbiDiffDir.String() + ")"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800209 }
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800210 commandStr += " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800211 return blueprint.RuleParams{
212 Command: commandStr,
213 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700214 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800215 },
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -0700216 "allowFlags", "referenceDump", "libName", "arch")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700217
218 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
219 blueprint.RuleParams{
220 Command: "gunzip -c $in > $out",
221 })
Colin Cross3f40fa42015-01-30 17:27:36 -0800222)
223
Dan Willemsen322a0a62015-11-17 15:19:46 -0800224func init() {
225 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
226 // debug output. That way two builds in two different directories will
227 // create the same output.
228 if runtime.GOOS != "darwin" {
229 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
230 } else {
231 // Darwin doesn't have /proc
232 pctx.StaticVariable("relPwd", "")
233 }
234}
235
Colin Cross3f40fa42015-01-30 17:27:36 -0800236type builderFlags struct {
Chih-Hung Hsieh9e88ba92018-08-22 14:18:04 -0700237 globalFlags string
238 arFlags string
239 asFlags string
240 cFlags string
241 toolingCFlags string // A separate set of cFlags for clang LibTooling tools
242 toolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
243 conlyFlags string
244 cppFlags string
245 ldFlags string
246 libFlags string
247 yaccFlags string
248 protoFlags string
249 protoOutParams string
250 tidyFlags string
251 sAbiFlags string
252 yasmFlags string
253 aidlFlags string
254 rsFlags string
255 toolchain config.Toolchain
256 clang bool
257 tidy bool
258 coverage bool
259 sAbiDump bool
260 protoRoot bool
Colin Cross665dce92016-04-28 14:50:03 -0700261
Colin Crossc3199482017-03-30 15:03:04 -0700262 systemIncludeFlags string
263
Colin Cross18c0c5a2016-12-01 14:45:23 -0800264 groupStaticLibs bool
Zhizhou Yang51be6322018-02-08 18:32:11 -0800265 arGoldPlugin bool
Colin Cross18c0c5a2016-12-01 14:45:23 -0800266
Colin Cross665dce92016-04-28 14:50:03 -0700267 stripKeepSymbols bool
268 stripKeepMiniDebugInfo bool
269 stripAddGnuDebuglink bool
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700270 stripUseLlvmStrip bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800271}
272
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700273type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800274 objFiles android.Paths
275 tidyFiles android.Paths
276 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800277 sAbiDumpFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700278}
279
280func (a Objects) Copy() Objects {
281 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800282 objFiles: append(android.Paths{}, a.objFiles...),
283 tidyFiles: append(android.Paths{}, a.tidyFiles...),
284 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800285 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700286 }
287}
288
289func (a Objects) Append(b Objects) Objects {
290 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800291 objFiles: append(a.objFiles, b.objFiles...),
292 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
293 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800294 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700295 }
296}
297
Colin Cross3f40fa42015-01-30 17:27:36 -0800298// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700299func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800300 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700301
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700302 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700303 var tidyFiles android.Paths
304 if flags.tidy && flags.clang {
305 tidyFiles = make(android.Paths, 0, len(srcFiles))
306 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800307 var coverageFiles android.Paths
308 if flags.coverage {
309 coverageFiles = make(android.Paths, 0, len(srcFiles))
310 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800311
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700312 commonFlags := strings.Join([]string{
Colin Crossc3199482017-03-30 15:03:04 -0700313 flags.globalFlags,
314 flags.systemIncludeFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700315 }, " ")
316
317 toolingCflags := strings.Join([]string{
318 commonFlags,
319 flags.toolingCFlags,
320 flags.conlyFlags,
321 }, " ")
322
323 cflags := strings.Join([]string{
324 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700325 flags.cFlags,
326 flags.conlyFlags,
327 }, " ")
328
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700329 toolingCppflags := strings.Join([]string{
330 commonFlags,
331 flags.toolingCFlags,
Chih-Hung Hsieh9e88ba92018-08-22 14:18:04 -0700332 flags.toolingCppFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700333 }, " ")
334
Colin Crossc3199482017-03-30 15:03:04 -0700335 cppflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700336 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700337 flags.cFlags,
338 flags.cppFlags,
339 }, " ")
340
341 asflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700342 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700343 flags.asFlags,
344 }, " ")
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700345
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800346 var sAbiDumpFiles android.Paths
347 if flags.sAbiDump && flags.clang {
348 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
349 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800350
Dan Willemsenbe03f342016-03-03 17:21:04 -0800351 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700352 cflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700353 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700354 cppflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700355 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800356 } else {
Colin Crossb98c8b02016-07-29 13:44:28 -0700357 cflags += " ${config.NoOverrideGlobalCflags}"
358 cppflags += " ${config.NoOverrideGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800359 }
360
Colin Cross3f40fa42015-01-30 17:27:36 -0800361 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700362 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800363
364 objFiles[i] = objFile
365
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700366 switch srcFile.Ext() {
367 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700368 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700369 Rule: yasm,
370 Description: "yasm " + srcFile.Rel(),
371 Output: objFile,
372 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800373 Implicits: cFlagsDeps,
374 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800375 Args: map[string]string{
376 "asFlags": flags.yasmFlags,
377 },
378 })
379 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700380 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700381 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700382 Rule: windres,
383 Description: "windres " + srcFile.Rel(),
384 Output: objFile,
385 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800386 Implicits: cFlagsDeps,
387 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700388 Args: map[string]string{
389 "windresCmd": gccCmd(flags.toolchain, "windres"),
390 "flags": flags.toolchain.WindresFlags(),
391 },
392 })
393 continue
Colin Cross91e90042016-12-02 17:13:24 -0800394 }
395
Colin Cross3f40fa42015-01-30 17:27:36 -0800396 var moduleCflags string
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700397 var moduleToolingCflags string
Colin Cross3f40fa42015-01-30 17:27:36 -0800398 var ccCmd string
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700399 tidy := flags.tidy && flags.clang
Dan Willemsen581341d2017-02-09 16:16:31 -0800400 coverage := flags.coverage
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800401 dump := flags.sAbiDump && flags.clang
Colin Cross3f40fa42015-01-30 17:27:36 -0800402
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700403 switch srcFile.Ext() {
Colin Cross3f40fa42015-01-30 17:27:36 -0800404 case ".S", ".s":
405 ccCmd = "gcc"
406 moduleCflags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700407 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800408 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800409 dump = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800410 case ".c":
411 ccCmd = "gcc"
412 moduleCflags = cflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700413 moduleToolingCflags = toolingCflags
Colin Cross9978ffe2016-12-01 15:31:22 -0800414 case ".cpp", ".cc", ".mm":
Colin Cross3f40fa42015-01-30 17:27:36 -0800415 ccCmd = "g++"
416 moduleCflags = cppflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700417 moduleToolingCflags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800418 default:
419 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
420 continue
421 }
422
423 if flags.clang {
424 switch ccCmd {
425 case "gcc":
426 ccCmd = "clang"
427 case "g++":
428 ccCmd = "clang++"
429 default:
430 panic("unrecoginzied ccCmd")
431 }
Colin Cross67a5c132017-05-09 13:45:28 -0700432 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800433
Colin Cross67a5c132017-05-09 13:45:28 -0700434 ccDesc := ccCmd
435
436 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700437 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800438 } else {
439 ccCmd = gccCmd(flags.toolchain, ccCmd)
440 }
441
Dan Willemsen581341d2017-02-09 16:16:31 -0800442 var implicitOutputs android.WritablePaths
443 if coverage {
444 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
445 implicitOutputs = append(implicitOutputs, gcnoFile)
446 coverageFiles = append(coverageFiles, gcnoFile)
447 }
448
Colin Crossae887032017-10-23 17:16:14 -0700449 ctx.Build(pctx, android.BuildParams{
Dan Willemsen581341d2017-02-09 16:16:31 -0800450 Rule: cc,
Colin Cross67a5c132017-05-09 13:45:28 -0700451 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800452 Output: objFile,
453 ImplicitOutputs: implicitOutputs,
454 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800455 Implicits: cFlagsDeps,
456 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800457 Args: map[string]string{
Colin Cross28344522015-04-22 13:07:53 -0700458 "cFlags": moduleCflags,
459 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800460 },
461 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700462
463 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700464 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700465 tidyFiles = append(tidyFiles, tidyFile)
466
Colin Crossae887032017-10-23 17:16:14 -0700467 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700468 Rule: clangTidy,
469 Description: "clang-tidy " + srcFile.Rel(),
470 Output: tidyFile,
471 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700472 // We must depend on objFile, since clang-tidy doesn't
473 // support exporting dependencies.
474 Implicit: objFile,
475 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700476 "cFlags": moduleToolingCflags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700477 "tidyFlags": flags.tidyFlags,
478 },
479 })
480 }
481
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800482 if dump {
483 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
484 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
485
Colin Crossae887032017-10-23 17:16:14 -0700486 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700487 Rule: sAbiDump,
488 Description: "header-abi-dumper " + srcFile.Rel(),
489 Output: sAbiDumpFile,
490 Input: srcFile,
491 Implicit: objFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800492 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700493 "cFlags": moduleToolingCflags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800494 "exportDirs": flags.sAbiFlags,
495 },
496 })
497 }
498
Colin Cross3f40fa42015-01-30 17:27:36 -0800499 }
500
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700501 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800502 objFiles: objFiles,
503 tidyFiles: tidyFiles,
504 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800505 sAbiDumpFiles: sAbiDumpFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700506 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800507}
508
509// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700510func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700511 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800512
Dan Willemsen581341d2017-02-09 16:16:31 -0800513 if ctx.Darwin() {
514 transformDarwinObjToStaticLib(ctx, objFiles, flags, outputFile, deps)
515 return
516 }
517
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800518 arCmd := "${config.ClangBin}/llvm-ar"
519 arFlags := "crsD"
520 if !ctx.Darwin() {
521 arFlags += " -format=gnu"
522 }
Zhizhou Yang51be6322018-02-08 18:32:11 -0800523 if flags.arGoldPlugin {
524 arFlags += " --plugin ${config.LLVMGoldPlugin}"
525 }
Vishwath Mohan83d9f712017-03-16 11:01:23 -0700526 if flags.arFlags != "" {
527 arFlags += " " + flags.arFlags
528 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800529
Colin Crossae887032017-10-23 17:16:14 -0700530 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700531 Rule: ar,
532 Description: "static link " + outputFile.Base(),
533 Output: outputFile,
534 Inputs: objFiles,
535 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800536 Args: map[string]string{
537 "arFlags": arFlags,
538 "arCmd": arCmd,
539 },
540 })
541}
542
Colin Cross0af4b842015-04-30 16:36:18 -0700543// Generate a rule for compiling multiple .o files to a static library (.a) on
544// darwin. The darwin ar tool doesn't support @file for list files, and has a
545// very small command line length limit, so we have to split the ar into multiple
546// steps, each appending to the previous one.
Dan Willemsen581341d2017-02-09 16:16:31 -0800547func transformDarwinObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Colin Cross5b529592017-05-09 13:34:34 -0700548 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross0af4b842015-04-30 16:36:18 -0700549
Colin Cross0af4b842015-04-30 16:36:18 -0700550 arFlags := "cqs"
551
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700552 if len(objFiles) == 0 {
Colin Cross635c3b02016-05-18 15:37:25 -0700553 dummy := android.PathForModuleOut(ctx, "dummy"+objectExtension)
554 dummyAr := android.PathForModuleOut(ctx, "dummy"+staticLibraryExtension)
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700555
Colin Crossae887032017-10-23 17:16:14 -0700556 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700557 Rule: emptyFile,
558 Description: "empty object file",
559 Output: dummy,
560 Implicits: deps,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700561 })
562
Colin Crossae887032017-10-23 17:16:14 -0700563 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700564 Rule: darwinAr,
565 Description: "empty static archive",
566 Output: dummyAr,
567 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700568 Args: map[string]string{
569 "arFlags": arFlags,
570 },
571 })
572
Colin Crossae887032017-10-23 17:16:14 -0700573 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700574 Rule: darwinAppendAr,
575 Description: "static link " + outputFile.Base(),
576 Output: outputFile,
577 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700578 Args: map[string]string{
579 "arFlags": "d",
580 "inAr": dummyAr.String(),
581 },
582 })
583
584 return
585 }
586
Colin Cross0af4b842015-04-30 16:36:18 -0700587 // ARG_MAX on darwin is 262144, use half that to be safe
Colin Cross5b529592017-05-09 13:34:34 -0700588 objFilesLists, err := splitListForSize(objFiles, 131072)
Colin Cross0af4b842015-04-30 16:36:18 -0700589 if err != nil {
590 ctx.ModuleErrorf("%s", err.Error())
591 }
592
Colin Cross5b529592017-05-09 13:34:34 -0700593 var in, out android.WritablePath
Colin Cross0af4b842015-04-30 16:36:18 -0700594 for i, l := range objFilesLists {
595 in = out
596 out = outputFile
597 if i != len(objFilesLists)-1 {
Colin Cross5b529592017-05-09 13:34:34 -0700598 out = android.PathForModuleOut(ctx, outputFile.Base()+strconv.Itoa(i))
Colin Cross0af4b842015-04-30 16:36:18 -0700599 }
600
Colin Crossae887032017-10-23 17:16:14 -0700601 build := android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700602 Rule: darwinAr,
603 Description: "static link " + out.Base(),
604 Output: out,
605 Inputs: l,
606 Implicits: deps,
Colin Cross5b529592017-05-09 13:34:34 -0700607 Args: map[string]string{
608 "arFlags": arFlags,
609 },
Colin Cross0af4b842015-04-30 16:36:18 -0700610 }
Colin Cross5b529592017-05-09 13:34:34 -0700611 if i != 0 {
612 build.Rule = darwinAppendAr
613 build.Args["inAr"] = in.String()
614 }
Colin Crossae887032017-10-23 17:16:14 -0700615 ctx.Build(pctx, build)
Colin Cross0af4b842015-04-30 16:36:18 -0700616 }
617}
618
Colin Cross3f40fa42015-01-30 17:27:36 -0800619// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700620// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700621func TransformObjToDynamicBinary(ctx android.ModuleContext,
622 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
623 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800624
625 var ldCmd string
626 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700627 ldCmd = "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800628 } else {
629 ldCmd = gccCmd(flags.toolchain, "g++")
630 }
631
Colin Cross3f40fa42015-01-30 17:27:36 -0800632 var libFlagsList []string
633
Colin Cross16b23492016-01-06 14:41:07 -0800634 if len(flags.libFlags) > 0 {
635 libFlagsList = append(libFlagsList, flags.libFlags)
636 }
637
Colin Cross3f40fa42015-01-30 17:27:36 -0800638 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800639 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700640 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700641 } else {
642 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700643 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700644 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
645 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800646 }
647
Colin Cross7a7cf972016-12-05 18:47:39 -0800648 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800649 libFlagsList = append(libFlagsList, "-Wl,--start-group")
650 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700651 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800652 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800653 libFlagsList = append(libFlagsList, "-Wl,--end-group")
654 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800655
Stephen Hines10347862016-07-18 15:54:54 -0700656 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700657 libFlagsList = append(libFlagsList, "-Wl,--start-group")
658 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700659 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700660 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700661 libFlagsList = append(libFlagsList, "-Wl,--end-group")
662 }
663
Colin Cross3f40fa42015-01-30 17:27:36 -0800664 for _, lib := range sharedLibs {
Dan Albert9840e1b2016-07-21 08:47:33 -0700665 libFlagsList = append(libFlagsList, lib.String())
Colin Cross3f40fa42015-01-30 17:27:36 -0800666 }
667
Colin Cross3f40fa42015-01-30 17:27:36 -0800668 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700669 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800670 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700671 if crtBegin.Valid() {
672 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800673 }
674
Colin Crossae887032017-10-23 17:16:14 -0700675 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700676 Rule: ld,
677 Description: "link " + outputFile.Base(),
678 Output: outputFile,
679 Inputs: objFiles,
680 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800681 Args: map[string]string{
Dan Albertce2b8392016-07-21 13:16:49 -0700682 "ldCmd": ldCmd,
683 "crtBegin": crtBegin.String(),
684 "libFlags": strings.Join(libFlagsList, " "),
685 "ldFlags": flags.ldFlags,
686 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800687 },
688 })
689}
690
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800691// Generate a rule to combine .dump sAbi dump files from multiple source files
692// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700693func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800694 baseName, exportedHeaderFlags string) android.OptionalPath {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800695 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Jayant Chowdharydcd33b62018-02-23 16:43:23 -0800696 sabiLock.Lock()
697 lsdumpPaths = append(lsdumpPaths, outputFile.String())
698 sabiLock.Unlock()
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800699 symbolFilterStr := "-so " + soFile.String()
Colin Crossae887032017-10-23 17:16:14 -0700700 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700701 Rule: sAbiLink,
702 Description: "header-abi-linker " + outputFile.Base(),
703 Output: outputFile,
704 Inputs: sAbiDumps,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800705 Implicit: soFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800706 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800707 "symbolFilter": symbolFilterStr,
708 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800709 "exportedHeaderFlags": exportedHeaderFlags,
710 },
711 })
712 return android.OptionalPathForPath(outputFile)
713}
714
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700715func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
716 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700717 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700718 Rule: unzipRefSAbiDump,
719 Description: "gunzip" + outputFile.Base(),
720 Output: outputFile,
721 Input: zippedRefDump,
722 })
723 return outputFile
724}
725
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800726func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chienf3511742017-10-31 18:04:35 +0800727 baseName, exportedHeaderFlags string, isVndkExt bool) android.OptionalPath {
728
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800729 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700730 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Jayant Chowdharye4499502018-01-17 13:13:33 -0800731 localAbiCheckAllowFlags := append([]string(nil), abiCheckAllowFlags...)
732 if exportedHeaderFlags == "" {
733 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-advice-only")
734 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700735 if inList(libName, llndkLibraries) {
736 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-consider-opaque-types-different")
737 }
Logan Chienf3511742017-10-31 18:04:35 +0800738 if isVndkExt {
739 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-allow-extensions")
740 }
741
Colin Crossae887032017-10-23 17:16:14 -0700742 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700743 Rule: sAbiDiff,
744 Description: "header-abi-diff " + outputFile.Base(),
745 Output: outputFile,
746 Input: inputDump,
747 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800748 Args: map[string]string{
749 "referenceDump": referenceDump.String(),
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700750 "libName": libName,
Jayant Chowdharyf54e0a72017-05-22 10:53:24 -0700751 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdharye4499502018-01-17 13:13:33 -0800752 "allowFlags": strings.Join(localAbiCheckAllowFlags, " "),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800753 },
754 })
755 return android.OptionalPathForPath(outputFile)
756}
757
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700758// Generate a rule for extracting a table of contents from a shared library (.so)
759func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700760 outputFile android.WritablePath, flags builderFlags) {
761
Colin Crossb496cfd2018-09-10 16:50:05 -0700762 var format string
763 var crossCompile string
764 if ctx.Darwin() {
765 format = "--macho"
766 crossCompile = "${config.MacToolPath}"
767 } else if ctx.Windows() {
768 format = "--pe"
769 crossCompile = gccCmd(flags.toolchain, "")
770 } else {
771 format = "--elf"
772 crossCompile = gccCmd(flags.toolchain, "")
773 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700774
Colin Crossae887032017-10-23 17:16:14 -0700775 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700776 Rule: toc,
777 Description: "generate toc " + inputFile.Base(),
778 Output: outputFile,
779 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700780 Args: map[string]string{
781 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700782 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700783 },
784 })
785}
786
Colin Cross3f40fa42015-01-30 17:27:36 -0800787// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700788func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
789 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800790
Colin Cross41280a42015-11-23 14:01:42 -0800791 var ldCmd string
792 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700793 ldCmd = "${config.ClangBin}/clang++"
Colin Cross41280a42015-11-23 14:01:42 -0800794 } else {
795 ldCmd = gccCmd(flags.toolchain, "g++")
796 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800797
Colin Crossae887032017-10-23 17:16:14 -0700798 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700799 Rule: partialLd,
800 Description: "link " + outputFile.Base(),
801 Output: outputFile,
802 Inputs: objFiles,
Colin Cross3f40fa42015-01-30 17:27:36 -0800803 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700804 "ldCmd": ldCmd,
Colin Cross41280a42015-11-23 14:01:42 -0800805 "ldFlags": flags.ldFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800806 },
807 })
808}
809
Colin Crossbfae8852015-03-26 14:44:11 -0700810// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700811func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
812 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700813
814 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
815
Colin Crossae887032017-10-23 17:16:14 -0700816 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700817 Rule: prefixSymbols,
818 Description: "prefix symbols " + outputFile.Base(),
819 Output: outputFile,
820 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700821 Args: map[string]string{
822 "objcopyCmd": objcopyCmd,
823 "prefix": prefix,
824 },
825 })
826}
827
Colin Cross635c3b02016-05-18 15:37:25 -0700828func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
829 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700830
831 crossCompile := gccCmd(flags.toolchain, "")
832 args := ""
833 if flags.stripAddGnuDebuglink {
834 args += " --add-gnu-debuglink"
835 }
836 if flags.stripKeepMiniDebugInfo {
837 args += " --keep-mini-debug-info"
838 }
839 if flags.stripKeepSymbols {
840 args += " --keep-symbols"
841 }
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700842 if flags.stripUseLlvmStrip {
843 args += " --use-llvm-strip"
844 }
Colin Cross665dce92016-04-28 14:50:03 -0700845
Colin Crossae887032017-10-23 17:16:14 -0700846 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700847 Rule: strip,
848 Description: "strip " + outputFile.Base(),
849 Output: outputFile,
850 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700851 Args: map[string]string{
852 "crossCompile": crossCompile,
853 "args": args,
854 },
855 })
856}
857
Colin Cross635c3b02016-05-18 15:37:25 -0700858func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
859 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700860
Colin Crossae887032017-10-23 17:16:14 -0700861 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700862 Rule: darwinStrip,
863 Description: "strip " + outputFile.Base(),
864 Output: outputFile,
865 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700866 })
867}
868
Dan Willemsen581341d2017-02-09 16:16:31 -0800869func TransformCoverageFilesToLib(ctx android.ModuleContext,
870 inputs Objects, flags builderFlags, baseName string) android.OptionalPath {
871
872 if len(inputs.coverageFiles) > 0 {
873 outputFile := android.PathForModuleOut(ctx, baseName+".gcnodir")
874
875 TransformObjToStaticLib(ctx, inputs.coverageFiles, flags, outputFile, nil)
876
877 return android.OptionalPathForPath(outputFile)
878 }
879
880 return android.OptionalPath{}
881}
882
Colin Cross635c3b02016-05-18 15:37:25 -0700883func CopyGccLib(ctx android.ModuleContext, libName string,
884 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800885
Colin Crossae887032017-10-23 17:16:14 -0700886 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700887 Rule: copyGccLib,
888 Description: "copy gcc library " + libName,
889 Output: outputFile,
Colin Cross3f40fa42015-01-30 17:27:36 -0800890 Args: map[string]string{
891 "ccCmd": gccCmd(flags.toolchain, "gcc"),
892 "cFlags": flags.globalFlags,
893 "libName": libName,
894 },
895 })
896}
897
Colin Crossb98c8b02016-07-29 13:44:28 -0700898func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800899 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
900}
Colin Cross0af4b842015-04-30 16:36:18 -0700901
Colin Cross5b529592017-05-09 13:34:34 -0700902func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700903 var i int
904
905 start := 0
906 bytes := 0
907 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700908 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700909 if l > limit {
910 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
911 }
912 if bytes+l > limit {
913 lists = append(lists, list[start:i])
914 start = i
915 bytes = 0
916 }
917 bytes += l + 1 // count a space between each list element
918 }
919
920 lists = append(lists, list[start:])
921
922 totalLen := 0
923 for _, l := range lists {
924 totalLen += len(l)
925 }
926 if totalLen != len(list) {
927 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
928 }
929 return lists, nil
930}