blob: 7d207b0b92ef0a7a0967e622d1ad17d8fe9f4752 [file] [log] [blame]
Colin Cross3f40fa42015-01-30 17:27:36 -08001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package cc
16
17// This file generates the final rules for compiling all C/C++. All properties related to
18// compiling should have been translated into builderFlags or another argument to the Transform*
19// functions.
20
21import (
Colin Cross0af4b842015-04-30 16:36:18 -070022 "fmt"
Colin Crossb98c8b02016-07-29 13:44:28 -070023 "path/filepath"
Colin Cross0af4b842015-04-30 16:36:18 -070024 "runtime"
25 "strconv"
Colin Cross3f40fa42015-01-30 17:27:36 -080026 "strings"
Colin Crossed4cf0b2015-03-26 14:43:45 -070027
28 "github.com/google/blueprint"
Colin Crossb98c8b02016-07-29 13:44:28 -070029
30 "android/soong/android"
31 "android/soong/cc/config"
Colin Cross3f40fa42015-01-30 17:27:36 -080032)
33
34const (
Dan Albertc3144b12015-04-28 18:17:56 -070035 objectExtension = ".o"
Colin Cross3f40fa42015-01-30 17:27:36 -080036 staticLibraryExtension = ".a"
37)
38
39var (
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -070040 abiCheckAllowFlags = []string{
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -070041 "-allow-unreferenced-changes",
42 "-allow-unreferenced-elf-symbol-changes",
43 }
44)
45
46var (
Colin Cross635c3b02016-05-18 15:37:25 -070047 pctx = android.NewPackageContext("android/soong/cc")
Colin Cross3f40fa42015-01-30 17:27:36 -080048
Colin Cross9d45bb72016-08-29 16:14:13 -070049 cc = pctx.AndroidGomaStaticRule("cc",
Colin Cross3f40fa42015-01-30 17:27:36 -080050 blueprint.RuleParams{
51 Depfile: "${out}.d",
52 Deps: blueprint.DepsGCC,
Alistair Strachan777475c2016-08-26 12:55:49 -070053 Command: "$relPwd ${config.CcWrapper}$ccCmd -c $cFlags -MD -MF ${out}.d -o $out $in",
Dan Willemsenc94a7682015-11-17 15:27:28 -080054 CommandDeps: []string{"$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080055 },
Dan Willemsen322a0a62015-11-17 15:19:46 -080056 "ccCmd", "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080057
Colin Cross9d45bb72016-08-29 16:14:13 -070058 ld = pctx.AndroidStaticRule("ld",
Colin Cross3f40fa42015-01-30 17:27:36 -080059 blueprint.RuleParams{
Dan Albertce2b8392016-07-21 13:16:49 -070060 Command: "$ldCmd ${crtBegin} @${out}.rsp " +
Colin Cross28344522015-04-22 13:07:53 -070061 "${libFlags} ${crtEnd} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080062 CommandDeps: []string{"$ldCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070063 Rspfile: "${out}.rsp",
64 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080065 },
Dan Albertce2b8392016-07-21 13:16:49 -070066 "ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080067
Colin Cross9d45bb72016-08-29 16:14:13 -070068 partialLd = pctx.AndroidStaticRule("partialLd",
Colin Cross3f40fa42015-01-30 17:27:36 -080069 blueprint.RuleParams{
Chih-Hung Hsieh3ede2942018-01-10 14:30:44 -080070 // Without -no-pie, clang 7.0 adds -pie to link Android files,
71 // but -r and -pie cannot be used together.
72 Command: "$ldCmd -nostdlib -no-pie -Wl,-r ${in} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080073 CommandDeps: []string{"$ldCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080074 },
Colin Cross41280a42015-11-23 14:01:42 -080075 "ldCmd", "ldFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080076
Colin Cross9d45bb72016-08-29 16:14:13 -070077 ar = pctx.AndroidStaticRule("ar",
Colin Cross3f40fa42015-01-30 17:27:36 -080078 blueprint.RuleParams{
Colin Cross7d21c442015-03-30 17:47:53 -070079 Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
Dan Willemsenc94a7682015-11-17 15:27:28 -080080 CommandDeps: []string{"$arCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070081 Rspfile: "${out}.rsp",
82 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080083 },
84 "arCmd", "arFlags")
85
Colin Cross9d45bb72016-08-29 16:14:13 -070086 darwinAr = pctx.AndroidStaticRule("darwinAr",
Colin Cross0af4b842015-04-30 16:36:18 -070087 blueprint.RuleParams{
Colin Crossb98c8b02016-07-29 13:44:28 -070088 Command: "rm -f ${out} && ${config.MacArPath} $arFlags $out $in",
89 CommandDeps: []string{"${config.MacArPath}"},
Colin Cross0af4b842015-04-30 16:36:18 -070090 },
Colin Crossb8ecdfe2016-05-03 15:10:29 -070091 "arFlags")
Colin Cross0af4b842015-04-30 16:36:18 -070092
Colin Cross9d45bb72016-08-29 16:14:13 -070093 darwinAppendAr = pctx.AndroidStaticRule("darwinAppendAr",
Colin Cross0af4b842015-04-30 16:36:18 -070094 blueprint.RuleParams{
Colin Crossb98c8b02016-07-29 13:44:28 -070095 Command: "cp -f ${inAr} ${out}.tmp && ${config.MacArPath} $arFlags ${out}.tmp $in && mv ${out}.tmp ${out}",
96 CommandDeps: []string{"${config.MacArPath}", "${inAr}"},
Colin Cross0af4b842015-04-30 16:36:18 -070097 },
Colin Crossb8ecdfe2016-05-03 15:10:29 -070098 "arFlags", "inAr")
99
Colin Cross9d45bb72016-08-29 16:14:13 -0700100 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700101 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -0700102 Command: "${config.MacStripPath} -u -r -o $out $in",
103 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700104 })
Colin Cross0af4b842015-04-30 16:36:18 -0700105
Colin Cross9d45bb72016-08-29 16:14:13 -0700106 prefixSymbols = pctx.AndroidStaticRule("prefixSymbols",
Colin Crossbfae8852015-03-26 14:44:11 -0700107 blueprint.RuleParams{
108 Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800109 CommandDeps: []string{"$objcopyCmd"},
Colin Crossbfae8852015-03-26 14:44:11 -0700110 },
111 "objcopyCmd", "prefix")
112
Nan Zhang43a485c2017-03-27 14:27:58 -0700113 _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh")
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800114 _ = pctx.SourcePathVariable("xzCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/xz")
Colin Cross665dce92016-04-28 14:50:03 -0700115
Colin Cross9d45bb72016-08-29 16:14:13 -0700116 strip = pctx.AndroidStaticRule("strip",
Colin Cross665dce92016-04-28 14:50:03 -0700117 blueprint.RuleParams{
118 Depfile: "${out}.d",
119 Deps: blueprint.DepsGCC,
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700120 Command: "CROSS_COMPILE=$crossCompile XZ=$xzCmd CLANG_BIN=${config.ClangBin} $stripPath ${args} -i ${in} -o ${out} -d ${out}.d",
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800121 CommandDeps: []string{"$stripPath", "$xzCmd"},
Colin Cross665dce92016-04-28 14:50:03 -0700122 },
123 "args", "crossCompile")
124
Colin Cross9d45bb72016-08-29 16:14:13 -0700125 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700126 blueprint.RuleParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700127 Command: "rm -f $out && touch $out",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700128 })
129
Nan Zhang43a485c2017-03-27 14:27:58 -0700130 _ = pctx.SourcePathVariable("copyGccLibPath", "build/soong/scripts/copygcclib.sh")
Colin Cross3f40fa42015-01-30 17:27:36 -0800131
Colin Cross9d45bb72016-08-29 16:14:13 -0700132 copyGccLib = pctx.AndroidStaticRule("copyGccLib",
Colin Cross3f40fa42015-01-30 17:27:36 -0800133 blueprint.RuleParams{
134 Depfile: "${out}.d",
135 Deps: blueprint.DepsGCC,
136 Command: "$copyGccLibPath $out $ccCmd $cFlags -print-file-name=${libName}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800137 CommandDeps: []string{"$copyGccLibPath", "$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -0800138 },
139 "ccCmd", "cFlags", "libName")
Colin Cross26c34ed2016-09-30 17:10:16 -0700140
Nan Zhang43a485c2017-03-27 14:27:58 -0700141 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700142
143 toc = pctx.AndroidStaticRule("toc",
144 blueprint.RuleParams{
145 Depfile: "${out}.d",
146 Deps: blueprint.DepsGCC,
147 Command: "CROSS_COMPILE=$crossCompile $tocPath -i ${in} -o ${out} -d ${out}.d",
148 CommandDeps: []string{"$tocPath"},
149 Restat: true,
150 },
151 "crossCompile")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700152
Chih-Hung Hsieha7aa9582018-08-15 11:28:38 -0700153 _ = pctx.SourcePathVariable("tidyPath", "build/soong/scripts/clang-tidy.sh")
154
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700155 clangTidy = pctx.AndroidStaticRule("clangTidy",
156 blueprint.RuleParams{
Chih-Hung Hsieha7aa9582018-08-15 11:28:38 -0700157 Command: "rm -f $out && CLANG_TIDY=${config.ClangBin}/clang-tidy $tidyPath $tidyFlags $in -- $cFlags && touch $out",
158 CommandDeps: []string{"${config.ClangBin}/clang-tidy", "$tidyPath"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700159 },
160 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800161
Nan Zhang43a485c2017-03-27 14:27:58 -0700162 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800163
164 yasm = pctx.AndroidStaticRule("yasm",
165 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700166 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800167 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700168 Depfile: "$out.d",
169 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800170 },
171 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800172
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700173 windres = pctx.AndroidStaticRule("windres",
174 blueprint.RuleParams{
175 Command: "$windresCmd $flags -I$$(dirname $in) -i $in -o $out",
176 CommandDeps: []string{"$windresCmd"},
177 },
178 "windresCmd", "flags")
179
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800180 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800181
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700182 // -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 -0800183 sAbiDump = pctx.AndroidStaticRule("sAbiDump",
184 blueprint.RuleParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700185 Command: "rm -f $out && $sAbiDumper -o ${out} $in $exportDirs -- $cFlags -w -isystem ${config.RSIncludePath}",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800186 CommandDeps: []string{"$sAbiDumper"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800187 },
188 "cFlags", "exportDirs")
189
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800190 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800191
192 sAbiLink = pctx.AndroidStaticRule("sAbiLink",
193 blueprint.RuleParams{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800194 Command: "$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800195 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800196 Rspfile: "${out}.rsp",
197 RspfileContent: "${in}",
198 },
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800199 "symbolFilter", "arch", "exportedHeaderFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800200
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800201 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700202
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800203 sAbiDiff = pctx.AndroidRuleFunc("sAbiDiff",
Dan Willemsen54daaf02018-03-12 13:24:09 -0700204 func(ctx android.PackageRuleContext) blueprint.RuleParams {
Jayant Chowdhary39d167a2018-05-17 16:45:51 -0700205 // TODO(b/78139997): Add -check-all-apis back
206 commandStr := "($sAbiDiffer $allowFlags -lib $libName -arch $arch -o ${out} -new $in -old $referenceDump)"
Dan Willemsenbc0c5092018-03-10 16:25:53 -0800207 distAbiDiffDir := android.PathForDist(ctx, "abidiffs")
Jiyong Parka5f11e42018-04-17 12:19:51 +0900208 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 -0800209 if distAbiDiffDir.Valid() {
Dan Willemsenedd1ae02018-04-17 10:41:11 -0700210 commandStr += " && (mkdir -p " + distAbiDiffDir.String() + " && cp ${out} " + distAbiDiffDir.String() + ")"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800211 }
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800212 commandStr += " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800213 return blueprint.RuleParams{
214 Command: commandStr,
215 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700216 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800217 },
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -0700218 "allowFlags", "referenceDump", "libName", "arch")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700219
220 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
221 blueprint.RuleParams{
222 Command: "gunzip -c $in > $out",
223 })
Colin Cross3f40fa42015-01-30 17:27:36 -0800224)
225
Dan Willemsen322a0a62015-11-17 15:19:46 -0800226func init() {
227 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
228 // debug output. That way two builds in two different directories will
229 // create the same output.
230 if runtime.GOOS != "darwin" {
231 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
232 } else {
233 // Darwin doesn't have /proc
234 pctx.StaticVariable("relPwd", "")
235 }
236}
237
Colin Cross3f40fa42015-01-30 17:27:36 -0800238type builderFlags struct {
Chih-Hung Hsieh9e88ba92018-08-22 14:18:04 -0700239 globalFlags string
240 arFlags string
241 asFlags string
242 cFlags string
243 toolingCFlags string // A separate set of cFlags for clang LibTooling tools
244 toolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
245 conlyFlags string
246 cppFlags string
247 ldFlags string
248 libFlags string
249 yaccFlags string
250 protoFlags string
251 protoOutParams string
252 tidyFlags string
253 sAbiFlags string
254 yasmFlags string
255 aidlFlags string
256 rsFlags string
257 toolchain config.Toolchain
258 clang bool
259 tidy bool
260 coverage bool
261 sAbiDump bool
262 protoRoot bool
Colin Cross665dce92016-04-28 14:50:03 -0700263
Colin Crossc3199482017-03-30 15:03:04 -0700264 systemIncludeFlags string
265
Colin Cross18c0c5a2016-12-01 14:45:23 -0800266 groupStaticLibs bool
Zhizhou Yang51be6322018-02-08 18:32:11 -0800267 arGoldPlugin bool
Colin Cross18c0c5a2016-12-01 14:45:23 -0800268
Colin Cross665dce92016-04-28 14:50:03 -0700269 stripKeepSymbols bool
270 stripKeepMiniDebugInfo bool
271 stripAddGnuDebuglink bool
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700272 stripUseLlvmStrip bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800273}
274
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700275type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800276 objFiles android.Paths
277 tidyFiles android.Paths
278 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800279 sAbiDumpFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700280}
281
282func (a Objects) Copy() Objects {
283 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800284 objFiles: append(android.Paths{}, a.objFiles...),
285 tidyFiles: append(android.Paths{}, a.tidyFiles...),
286 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800287 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700288 }
289}
290
291func (a Objects) Append(b Objects) Objects {
292 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800293 objFiles: append(a.objFiles, b.objFiles...),
294 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
295 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800296 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700297 }
298}
299
Colin Cross3f40fa42015-01-30 17:27:36 -0800300// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700301func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800302 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700303
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700304 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700305 var tidyFiles android.Paths
306 if flags.tidy && flags.clang {
307 tidyFiles = make(android.Paths, 0, len(srcFiles))
308 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800309 var coverageFiles android.Paths
310 if flags.coverage {
311 coverageFiles = make(android.Paths, 0, len(srcFiles))
312 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800313
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700314 commonFlags := strings.Join([]string{
Colin Crossc3199482017-03-30 15:03:04 -0700315 flags.globalFlags,
316 flags.systemIncludeFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700317 }, " ")
318
319 toolingCflags := strings.Join([]string{
320 commonFlags,
321 flags.toolingCFlags,
322 flags.conlyFlags,
323 }, " ")
324
325 cflags := strings.Join([]string{
326 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700327 flags.cFlags,
328 flags.conlyFlags,
329 }, " ")
330
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700331 toolingCppflags := strings.Join([]string{
332 commonFlags,
333 flags.toolingCFlags,
Chih-Hung Hsieh9e88ba92018-08-22 14:18:04 -0700334 flags.toolingCppFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700335 }, " ")
336
Colin Crossc3199482017-03-30 15:03:04 -0700337 cppflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700338 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700339 flags.cFlags,
340 flags.cppFlags,
341 }, " ")
342
343 asflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700344 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700345 flags.asFlags,
346 }, " ")
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700347
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800348 var sAbiDumpFiles android.Paths
349 if flags.sAbiDump && flags.clang {
350 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
351 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800352
Dan Willemsenbe03f342016-03-03 17:21:04 -0800353 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700354 cflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700355 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700356 cppflags += " ${config.NoOverrideClangGlobalCflags}"
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700357 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800358 } else {
Colin Crossb98c8b02016-07-29 13:44:28 -0700359 cflags += " ${config.NoOverrideGlobalCflags}"
360 cppflags += " ${config.NoOverrideGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800361 }
362
Colin Cross3f40fa42015-01-30 17:27:36 -0800363 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700364 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800365
366 objFiles[i] = objFile
367
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700368 switch srcFile.Ext() {
369 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700370 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700371 Rule: yasm,
372 Description: "yasm " + srcFile.Rel(),
373 Output: objFile,
374 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800375 Implicits: cFlagsDeps,
376 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800377 Args: map[string]string{
378 "asFlags": flags.yasmFlags,
379 },
380 })
381 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700382 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700383 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700384 Rule: windres,
385 Description: "windres " + srcFile.Rel(),
386 Output: objFile,
387 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800388 Implicits: cFlagsDeps,
389 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700390 Args: map[string]string{
391 "windresCmd": gccCmd(flags.toolchain, "windres"),
392 "flags": flags.toolchain.WindresFlags(),
393 },
394 })
395 continue
Colin Cross91e90042016-12-02 17:13:24 -0800396 }
397
Colin Cross3f40fa42015-01-30 17:27:36 -0800398 var moduleCflags string
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700399 var moduleToolingCflags string
Colin Cross3f40fa42015-01-30 17:27:36 -0800400 var ccCmd string
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700401 tidy := flags.tidy && flags.clang
Dan Willemsen581341d2017-02-09 16:16:31 -0800402 coverage := flags.coverage
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800403 dump := flags.sAbiDump && flags.clang
Colin Cross3f40fa42015-01-30 17:27:36 -0800404
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700405 switch srcFile.Ext() {
Colin Cross3f40fa42015-01-30 17:27:36 -0800406 case ".S", ".s":
407 ccCmd = "gcc"
408 moduleCflags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700409 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800410 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800411 dump = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800412 case ".c":
413 ccCmd = "gcc"
414 moduleCflags = cflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700415 moduleToolingCflags = toolingCflags
Colin Cross9978ffe2016-12-01 15:31:22 -0800416 case ".cpp", ".cc", ".mm":
Colin Cross3f40fa42015-01-30 17:27:36 -0800417 ccCmd = "g++"
418 moduleCflags = cppflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700419 moduleToolingCflags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800420 default:
421 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
422 continue
423 }
424
425 if flags.clang {
426 switch ccCmd {
427 case "gcc":
428 ccCmd = "clang"
429 case "g++":
430 ccCmd = "clang++"
431 default:
432 panic("unrecoginzied ccCmd")
433 }
Colin Cross67a5c132017-05-09 13:45:28 -0700434 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800435
Colin Cross67a5c132017-05-09 13:45:28 -0700436 ccDesc := ccCmd
437
438 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700439 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800440 } else {
441 ccCmd = gccCmd(flags.toolchain, ccCmd)
442 }
443
Dan Willemsen581341d2017-02-09 16:16:31 -0800444 var implicitOutputs android.WritablePaths
445 if coverage {
446 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
447 implicitOutputs = append(implicitOutputs, gcnoFile)
448 coverageFiles = append(coverageFiles, gcnoFile)
449 }
450
Colin Crossae887032017-10-23 17:16:14 -0700451 ctx.Build(pctx, android.BuildParams{
Dan Willemsen581341d2017-02-09 16:16:31 -0800452 Rule: cc,
Colin Cross67a5c132017-05-09 13:45:28 -0700453 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800454 Output: objFile,
455 ImplicitOutputs: implicitOutputs,
456 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800457 Implicits: cFlagsDeps,
458 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800459 Args: map[string]string{
Colin Cross28344522015-04-22 13:07:53 -0700460 "cFlags": moduleCflags,
461 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800462 },
463 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700464
465 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700466 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700467 tidyFiles = append(tidyFiles, tidyFile)
468
Colin Crossae887032017-10-23 17:16:14 -0700469 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700470 Rule: clangTidy,
471 Description: "clang-tidy " + srcFile.Rel(),
472 Output: tidyFile,
473 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700474 // We must depend on objFile, since clang-tidy doesn't
475 // support exporting dependencies.
476 Implicit: objFile,
477 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700478 "cFlags": moduleToolingCflags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700479 "tidyFlags": flags.tidyFlags,
480 },
481 })
482 }
483
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800484 if dump {
485 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
486 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
487
Colin Crossae887032017-10-23 17:16:14 -0700488 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700489 Rule: sAbiDump,
490 Description: "header-abi-dumper " + srcFile.Rel(),
491 Output: sAbiDumpFile,
492 Input: srcFile,
493 Implicit: objFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800494 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700495 "cFlags": moduleToolingCflags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800496 "exportDirs": flags.sAbiFlags,
497 },
498 })
499 }
500
Colin Cross3f40fa42015-01-30 17:27:36 -0800501 }
502
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700503 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800504 objFiles: objFiles,
505 tidyFiles: tidyFiles,
506 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800507 sAbiDumpFiles: sAbiDumpFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700508 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800509}
510
511// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700512func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700513 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800514
Dan Willemsen581341d2017-02-09 16:16:31 -0800515 if ctx.Darwin() {
516 transformDarwinObjToStaticLib(ctx, objFiles, flags, outputFile, deps)
517 return
518 }
519
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800520 arCmd := "${config.ClangBin}/llvm-ar"
521 arFlags := "crsD"
522 if !ctx.Darwin() {
523 arFlags += " -format=gnu"
524 }
Zhizhou Yang51be6322018-02-08 18:32:11 -0800525 if flags.arGoldPlugin {
526 arFlags += " --plugin ${config.LLVMGoldPlugin}"
527 }
Vishwath Mohan83d9f712017-03-16 11:01:23 -0700528 if flags.arFlags != "" {
529 arFlags += " " + flags.arFlags
530 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800531
Colin Crossae887032017-10-23 17:16:14 -0700532 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700533 Rule: ar,
534 Description: "static link " + outputFile.Base(),
535 Output: outputFile,
536 Inputs: objFiles,
537 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800538 Args: map[string]string{
539 "arFlags": arFlags,
540 "arCmd": arCmd,
541 },
542 })
543}
544
Colin Cross0af4b842015-04-30 16:36:18 -0700545// Generate a rule for compiling multiple .o files to a static library (.a) on
546// darwin. The darwin ar tool doesn't support @file for list files, and has a
547// very small command line length limit, so we have to split the ar into multiple
548// steps, each appending to the previous one.
Dan Willemsen581341d2017-02-09 16:16:31 -0800549func transformDarwinObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Colin Cross5b529592017-05-09 13:34:34 -0700550 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross0af4b842015-04-30 16:36:18 -0700551
Colin Cross0af4b842015-04-30 16:36:18 -0700552 arFlags := "cqs"
553
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700554 if len(objFiles) == 0 {
Colin Cross635c3b02016-05-18 15:37:25 -0700555 dummy := android.PathForModuleOut(ctx, "dummy"+objectExtension)
556 dummyAr := android.PathForModuleOut(ctx, "dummy"+staticLibraryExtension)
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700557
Colin Crossae887032017-10-23 17:16:14 -0700558 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700559 Rule: emptyFile,
560 Description: "empty object file",
561 Output: dummy,
562 Implicits: deps,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700563 })
564
Colin Crossae887032017-10-23 17:16:14 -0700565 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700566 Rule: darwinAr,
567 Description: "empty static archive",
568 Output: dummyAr,
569 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700570 Args: map[string]string{
571 "arFlags": arFlags,
572 },
573 })
574
Colin Crossae887032017-10-23 17:16:14 -0700575 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700576 Rule: darwinAppendAr,
577 Description: "static link " + outputFile.Base(),
578 Output: outputFile,
579 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700580 Args: map[string]string{
581 "arFlags": "d",
582 "inAr": dummyAr.String(),
583 },
584 })
585
586 return
587 }
588
Colin Cross0af4b842015-04-30 16:36:18 -0700589 // ARG_MAX on darwin is 262144, use half that to be safe
Colin Cross5b529592017-05-09 13:34:34 -0700590 objFilesLists, err := splitListForSize(objFiles, 131072)
Colin Cross0af4b842015-04-30 16:36:18 -0700591 if err != nil {
592 ctx.ModuleErrorf("%s", err.Error())
593 }
594
Colin Cross5b529592017-05-09 13:34:34 -0700595 var in, out android.WritablePath
Colin Cross0af4b842015-04-30 16:36:18 -0700596 for i, l := range objFilesLists {
597 in = out
598 out = outputFile
599 if i != len(objFilesLists)-1 {
Colin Cross5b529592017-05-09 13:34:34 -0700600 out = android.PathForModuleOut(ctx, outputFile.Base()+strconv.Itoa(i))
Colin Cross0af4b842015-04-30 16:36:18 -0700601 }
602
Colin Crossae887032017-10-23 17:16:14 -0700603 build := android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700604 Rule: darwinAr,
605 Description: "static link " + out.Base(),
606 Output: out,
607 Inputs: l,
608 Implicits: deps,
Colin Cross5b529592017-05-09 13:34:34 -0700609 Args: map[string]string{
610 "arFlags": arFlags,
611 },
Colin Cross0af4b842015-04-30 16:36:18 -0700612 }
Colin Cross5b529592017-05-09 13:34:34 -0700613 if i != 0 {
614 build.Rule = darwinAppendAr
615 build.Args["inAr"] = in.String()
616 }
Colin Crossae887032017-10-23 17:16:14 -0700617 ctx.Build(pctx, build)
Colin Cross0af4b842015-04-30 16:36:18 -0700618 }
619}
620
Colin Cross3f40fa42015-01-30 17:27:36 -0800621// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700622// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700623func TransformObjToDynamicBinary(ctx android.ModuleContext,
624 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
625 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800626
627 var ldCmd string
628 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700629 ldCmd = "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800630 } else {
631 ldCmd = gccCmd(flags.toolchain, "g++")
632 }
633
Colin Cross3f40fa42015-01-30 17:27:36 -0800634 var libFlagsList []string
635
Colin Cross16b23492016-01-06 14:41:07 -0800636 if len(flags.libFlags) > 0 {
637 libFlagsList = append(libFlagsList, flags.libFlags)
638 }
639
Colin Cross3f40fa42015-01-30 17:27:36 -0800640 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800641 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700642 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700643 } else {
644 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700645 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700646 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
647 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800648 }
649
Colin Cross7a7cf972016-12-05 18:47:39 -0800650 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800651 libFlagsList = append(libFlagsList, "-Wl,--start-group")
652 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700653 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800654 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800655 libFlagsList = append(libFlagsList, "-Wl,--end-group")
656 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800657
Stephen Hines10347862016-07-18 15:54:54 -0700658 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700659 libFlagsList = append(libFlagsList, "-Wl,--start-group")
660 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700661 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700662 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700663 libFlagsList = append(libFlagsList, "-Wl,--end-group")
664 }
665
Colin Cross3f40fa42015-01-30 17:27:36 -0800666 for _, lib := range sharedLibs {
Dan Albert9840e1b2016-07-21 08:47:33 -0700667 libFlagsList = append(libFlagsList, lib.String())
Colin Cross3f40fa42015-01-30 17:27:36 -0800668 }
669
Colin Cross3f40fa42015-01-30 17:27:36 -0800670 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700671 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800672 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700673 if crtBegin.Valid() {
674 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800675 }
676
Colin Crossae887032017-10-23 17:16:14 -0700677 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700678 Rule: ld,
679 Description: "link " + outputFile.Base(),
680 Output: outputFile,
681 Inputs: objFiles,
682 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800683 Args: map[string]string{
Dan Albertce2b8392016-07-21 13:16:49 -0700684 "ldCmd": ldCmd,
685 "crtBegin": crtBegin.String(),
686 "libFlags": strings.Join(libFlagsList, " "),
687 "ldFlags": flags.ldFlags,
688 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800689 },
690 })
691}
692
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800693// Generate a rule to combine .dump sAbi dump files from multiple source files
694// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700695func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800696 baseName, exportedHeaderFlags string) android.OptionalPath {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800697 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Jayant Chowdharydcd33b62018-02-23 16:43:23 -0800698 sabiLock.Lock()
699 lsdumpPaths = append(lsdumpPaths, outputFile.String())
700 sabiLock.Unlock()
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800701 symbolFilterStr := "-so " + soFile.String()
Colin Crossae887032017-10-23 17:16:14 -0700702 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700703 Rule: sAbiLink,
704 Description: "header-abi-linker " + outputFile.Base(),
705 Output: outputFile,
706 Inputs: sAbiDumps,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800707 Implicit: soFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800708 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800709 "symbolFilter": symbolFilterStr,
710 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800711 "exportedHeaderFlags": exportedHeaderFlags,
712 },
713 })
714 return android.OptionalPathForPath(outputFile)
715}
716
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700717func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
718 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700719 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700720 Rule: unzipRefSAbiDump,
721 Description: "gunzip" + outputFile.Base(),
722 Output: outputFile,
723 Input: zippedRefDump,
724 })
725 return outputFile
726}
727
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800728func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chienf3511742017-10-31 18:04:35 +0800729 baseName, exportedHeaderFlags string, isVndkExt bool) android.OptionalPath {
730
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800731 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700732 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Jayant Chowdharye4499502018-01-17 13:13:33 -0800733 localAbiCheckAllowFlags := append([]string(nil), abiCheckAllowFlags...)
734 if exportedHeaderFlags == "" {
735 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-advice-only")
736 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700737 if inList(libName, llndkLibraries) {
738 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-consider-opaque-types-different")
739 }
Logan Chienf3511742017-10-31 18:04:35 +0800740 if isVndkExt {
741 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-allow-extensions")
742 }
743
Colin Crossae887032017-10-23 17:16:14 -0700744 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700745 Rule: sAbiDiff,
746 Description: "header-abi-diff " + outputFile.Base(),
747 Output: outputFile,
748 Input: inputDump,
749 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800750 Args: map[string]string{
751 "referenceDump": referenceDump.String(),
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700752 "libName": libName,
Jayant Chowdharyf54e0a72017-05-22 10:53:24 -0700753 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdharye4499502018-01-17 13:13:33 -0800754 "allowFlags": strings.Join(localAbiCheckAllowFlags, " "),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800755 },
756 })
757 return android.OptionalPathForPath(outputFile)
758}
759
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700760// Generate a rule for extracting a table of contents from a shared library (.so)
761func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700762 outputFile android.WritablePath, flags builderFlags) {
763
764 crossCompile := gccCmd(flags.toolchain, "")
765
Colin Crossae887032017-10-23 17:16:14 -0700766 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700767 Rule: toc,
768 Description: "generate toc " + inputFile.Base(),
769 Output: outputFile,
770 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700771 Args: map[string]string{
772 "crossCompile": crossCompile,
773 },
774 })
775}
776
Colin Cross3f40fa42015-01-30 17:27:36 -0800777// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700778func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
779 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800780
Colin Cross41280a42015-11-23 14:01:42 -0800781 var ldCmd string
782 if flags.clang {
Colin Crossb98c8b02016-07-29 13:44:28 -0700783 ldCmd = "${config.ClangBin}/clang++"
Colin Cross41280a42015-11-23 14:01:42 -0800784 } else {
785 ldCmd = gccCmd(flags.toolchain, "g++")
786 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800787
Colin Crossae887032017-10-23 17:16:14 -0700788 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700789 Rule: partialLd,
790 Description: "link " + outputFile.Base(),
791 Output: outputFile,
792 Inputs: objFiles,
Colin Cross3f40fa42015-01-30 17:27:36 -0800793 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700794 "ldCmd": ldCmd,
Colin Cross41280a42015-11-23 14:01:42 -0800795 "ldFlags": flags.ldFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800796 },
797 })
798}
799
Colin Crossbfae8852015-03-26 14:44:11 -0700800// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700801func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
802 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700803
804 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
805
Colin Crossae887032017-10-23 17:16:14 -0700806 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700807 Rule: prefixSymbols,
808 Description: "prefix symbols " + outputFile.Base(),
809 Output: outputFile,
810 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700811 Args: map[string]string{
812 "objcopyCmd": objcopyCmd,
813 "prefix": prefix,
814 },
815 })
816}
817
Colin Cross635c3b02016-05-18 15:37:25 -0700818func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
819 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700820
821 crossCompile := gccCmd(flags.toolchain, "")
822 args := ""
823 if flags.stripAddGnuDebuglink {
824 args += " --add-gnu-debuglink"
825 }
826 if flags.stripKeepMiniDebugInfo {
827 args += " --keep-mini-debug-info"
828 }
829 if flags.stripKeepSymbols {
830 args += " --keep-symbols"
831 }
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700832 if flags.stripUseLlvmStrip {
833 args += " --use-llvm-strip"
834 }
Colin Cross665dce92016-04-28 14:50:03 -0700835
Colin Crossae887032017-10-23 17:16:14 -0700836 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700837 Rule: strip,
838 Description: "strip " + outputFile.Base(),
839 Output: outputFile,
840 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700841 Args: map[string]string{
842 "crossCompile": crossCompile,
843 "args": args,
844 },
845 })
846}
847
Colin Cross635c3b02016-05-18 15:37:25 -0700848func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
849 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700850
Colin Crossae887032017-10-23 17:16:14 -0700851 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700852 Rule: darwinStrip,
853 Description: "strip " + outputFile.Base(),
854 Output: outputFile,
855 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700856 })
857}
858
Dan Willemsen581341d2017-02-09 16:16:31 -0800859func TransformCoverageFilesToLib(ctx android.ModuleContext,
860 inputs Objects, flags builderFlags, baseName string) android.OptionalPath {
861
862 if len(inputs.coverageFiles) > 0 {
863 outputFile := android.PathForModuleOut(ctx, baseName+".gcnodir")
864
865 TransformObjToStaticLib(ctx, inputs.coverageFiles, flags, outputFile, nil)
866
867 return android.OptionalPathForPath(outputFile)
868 }
869
870 return android.OptionalPath{}
871}
872
Colin Cross635c3b02016-05-18 15:37:25 -0700873func CopyGccLib(ctx android.ModuleContext, libName string,
874 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800875
Colin Crossae887032017-10-23 17:16:14 -0700876 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700877 Rule: copyGccLib,
878 Description: "copy gcc library " + libName,
879 Output: outputFile,
Colin Cross3f40fa42015-01-30 17:27:36 -0800880 Args: map[string]string{
881 "ccCmd": gccCmd(flags.toolchain, "gcc"),
882 "cFlags": flags.globalFlags,
883 "libName": libName,
884 },
885 })
886}
887
Colin Crossb98c8b02016-07-29 13:44:28 -0700888func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800889 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
890}
Colin Cross0af4b842015-04-30 16:36:18 -0700891
Colin Cross5b529592017-05-09 13:34:34 -0700892func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700893 var i int
894
895 start := 0
896 bytes := 0
897 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700898 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700899 if l > limit {
900 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
901 }
902 if bytes+l > limit {
903 lists = append(lists, list[start:i])
904 start = i
905 bytes = 0
906 }
907 bytes += l + 1 // count a space between each list element
908 }
909
910 lists = append(lists, list[start:])
911
912 totalLen := 0
913 for _, l := range lists {
914 totalLen += len(l)
915 }
916 if totalLen != len(list) {
917 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
918 }
919 return lists, nil
920}