blob: 6d5b59594d14993721d36f86f12fbb605dbecb74 [file] [log] [blame]
Colin Cross3f40fa42015-01-30 17:27:36 -08001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package cc
16
17// This file generates the final rules for compiling all C/C++. All properties related to
18// compiling should have been translated into builderFlags or another argument to the Transform*
19// functions.
20
21import (
Colin Cross0af4b842015-04-30 16:36:18 -070022 "fmt"
Colin Crossb98c8b02016-07-29 13:44:28 -070023 "path/filepath"
Colin Cross0af4b842015-04-30 16:36:18 -070024 "runtime"
25 "strconv"
Colin Cross3f40fa42015-01-30 17:27:36 -080026 "strings"
Colin Crossed4cf0b2015-03-26 14:43:45 -070027
28 "github.com/google/blueprint"
Colin Crossb98c8b02016-07-29 13:44:28 -070029
30 "android/soong/android"
31 "android/soong/cc/config"
Colin Cross3f40fa42015-01-30 17:27:36 -080032)
33
34const (
Dan Albertc3144b12015-04-28 18:17:56 -070035 objectExtension = ".o"
Colin Cross3f40fa42015-01-30 17:27:36 -080036 staticLibraryExtension = ".a"
37)
38
39var (
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -070040 abiCheckAllowFlags = []string{
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -070041 "-allow-unreferenced-changes",
42 "-allow-unreferenced-elf-symbol-changes",
43 }
44)
45
46var (
Colin Cross635c3b02016-05-18 15:37:25 -070047 pctx = android.NewPackageContext("android/soong/cc")
Colin Cross3f40fa42015-01-30 17:27:36 -080048
Colin Cross9d45bb72016-08-29 16:14:13 -070049 cc = pctx.AndroidGomaStaticRule("cc",
Colin Cross3f40fa42015-01-30 17:27:36 -080050 blueprint.RuleParams{
51 Depfile: "${out}.d",
52 Deps: blueprint.DepsGCC,
Alistair Strachan777475c2016-08-26 12:55:49 -070053 Command: "$relPwd ${config.CcWrapper}$ccCmd -c $cFlags -MD -MF ${out}.d -o $out $in",
Dan Willemsenc94a7682015-11-17 15:27:28 -080054 CommandDeps: []string{"$ccCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080055 },
Dan Willemsen322a0a62015-11-17 15:19:46 -080056 "ccCmd", "cFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080057
Colin Cross9d45bb72016-08-29 16:14:13 -070058 ld = pctx.AndroidStaticRule("ld",
Colin Cross3f40fa42015-01-30 17:27:36 -080059 blueprint.RuleParams{
Dan Albertce2b8392016-07-21 13:16:49 -070060 Command: "$ldCmd ${crtBegin} @${out}.rsp " +
Colin Cross28344522015-04-22 13:07:53 -070061 "${libFlags} ${crtEnd} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080062 CommandDeps: []string{"$ldCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070063 Rspfile: "${out}.rsp",
64 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080065 },
Dan Albertce2b8392016-07-21 13:16:49 -070066 "ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080067
Colin Cross9d45bb72016-08-29 16:14:13 -070068 partialLd = pctx.AndroidStaticRule("partialLd",
Colin Cross3f40fa42015-01-30 17:27:36 -080069 blueprint.RuleParams{
Chih-Hung Hsieh3ede2942018-01-10 14:30:44 -080070 // Without -no-pie, clang 7.0 adds -pie to link Android files,
71 // but -r and -pie cannot be used together.
72 Command: "$ldCmd -nostdlib -no-pie -Wl,-r ${in} -o ${out} ${ldFlags}",
Dan Willemsenc94a7682015-11-17 15:27:28 -080073 CommandDeps: []string{"$ldCmd"},
Colin Cross3f40fa42015-01-30 17:27:36 -080074 },
Colin Cross41280a42015-11-23 14:01:42 -080075 "ldCmd", "ldFlags")
Colin Cross3f40fa42015-01-30 17:27:36 -080076
Colin Cross9d45bb72016-08-29 16:14:13 -070077 ar = pctx.AndroidStaticRule("ar",
Colin Cross3f40fa42015-01-30 17:27:36 -080078 blueprint.RuleParams{
Colin Cross7d21c442015-03-30 17:47:53 -070079 Command: "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
Dan Willemsenc94a7682015-11-17 15:27:28 -080080 CommandDeps: []string{"$arCmd"},
Colin Cross7d21c442015-03-30 17:47:53 -070081 Rspfile: "${out}.rsp",
82 RspfileContent: "${in}",
Colin Cross3f40fa42015-01-30 17:27:36 -080083 },
84 "arCmd", "arFlags")
85
Colin Cross9d45bb72016-08-29 16:14:13 -070086 darwinAr = pctx.AndroidStaticRule("darwinAr",
Colin Cross0af4b842015-04-30 16:36:18 -070087 blueprint.RuleParams{
Colin Crossb98c8b02016-07-29 13:44:28 -070088 Command: "rm -f ${out} && ${config.MacArPath} $arFlags $out $in",
89 CommandDeps: []string{"${config.MacArPath}"},
Colin Cross0af4b842015-04-30 16:36:18 -070090 },
Colin Crossb8ecdfe2016-05-03 15:10:29 -070091 "arFlags")
Colin Cross0af4b842015-04-30 16:36:18 -070092
Colin Cross9d45bb72016-08-29 16:14:13 -070093 darwinAppendAr = pctx.AndroidStaticRule("darwinAppendAr",
Colin Cross0af4b842015-04-30 16:36:18 -070094 blueprint.RuleParams{
Colin Crossb98c8b02016-07-29 13:44:28 -070095 Command: "cp -f ${inAr} ${out}.tmp && ${config.MacArPath} $arFlags ${out}.tmp $in && mv ${out}.tmp ${out}",
96 CommandDeps: []string{"${config.MacArPath}", "${inAr}"},
Colin Cross0af4b842015-04-30 16:36:18 -070097 },
Colin Crossb8ecdfe2016-05-03 15:10:29 -070098 "arFlags", "inAr")
99
Colin Cross9d45bb72016-08-29 16:14:13 -0700100 darwinStrip = pctx.AndroidStaticRule("darwinStrip",
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700101 blueprint.RuleParams{
Colin Crossa24166b2016-08-01 15:42:38 -0700102 Command: "${config.MacStripPath} -u -r -o $out $in",
103 CommandDeps: []string{"${config.MacStripPath}"},
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700104 })
Colin Cross0af4b842015-04-30 16:36:18 -0700105
Colin Cross9d45bb72016-08-29 16:14:13 -0700106 prefixSymbols = pctx.AndroidStaticRule("prefixSymbols",
Colin Crossbfae8852015-03-26 14:44:11 -0700107 blueprint.RuleParams{
108 Command: "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
Dan Willemsenc94a7682015-11-17 15:27:28 -0800109 CommandDeps: []string{"$objcopyCmd"},
Colin Crossbfae8852015-03-26 14:44:11 -0700110 },
111 "objcopyCmd", "prefix")
112
Nan Zhang43a485c2017-03-27 14:27:58 -0700113 _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh")
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800114 _ = pctx.SourcePathVariable("xzCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/xz")
Colin Cross665dce92016-04-28 14:50:03 -0700115
Colin Cross9d45bb72016-08-29 16:14:13 -0700116 strip = pctx.AndroidStaticRule("strip",
Colin Cross665dce92016-04-28 14:50:03 -0700117 blueprint.RuleParams{
118 Depfile: "${out}.d",
119 Deps: blueprint.DepsGCC,
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700120 Command: "CROSS_COMPILE=$crossCompile XZ=$xzCmd CLANG_BIN=${config.ClangBin} $stripPath ${args} -i ${in} -o ${out} -d ${out}.d",
Dan Willemsen8fec83a2018-03-09 10:47:52 -0800121 CommandDeps: []string{"$stripPath", "$xzCmd"},
Colin Cross665dce92016-04-28 14:50:03 -0700122 },
123 "args", "crossCompile")
124
Colin Cross9d45bb72016-08-29 16:14:13 -0700125 emptyFile = pctx.AndroidStaticRule("emptyFile",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700126 blueprint.RuleParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700127 Command: "rm -f $out && touch $out",
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700128 })
129
Nan Zhang43a485c2017-03-27 14:27:58 -0700130 _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh")
Colin Cross26c34ed2016-09-30 17:10:16 -0700131
132 toc = pctx.AndroidStaticRule("toc",
133 blueprint.RuleParams{
134 Depfile: "${out}.d",
135 Deps: blueprint.DepsGCC,
Colin Crossb496cfd2018-09-10 16:50:05 -0700136 Command: "CROSS_COMPILE=$crossCompile $tocPath $format -i ${in} -o ${out} -d ${out}.d",
Colin Cross26c34ed2016-09-30 17:10:16 -0700137 CommandDeps: []string{"$tocPath"},
138 Restat: true,
139 },
Colin Crossb496cfd2018-09-10 16:50:05 -0700140 "crossCompile", "format")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700141
142 clangTidy = pctx.AndroidStaticRule("clangTidy",
143 blueprint.RuleParams{
Chih-Hung Hsiehb699c432018-08-27 16:19:59 -0700144 Command: "rm -f $out && CLANG_TIDY=${config.ClangBin}/clang-tidy ${config.ClangTidyShellPath} $tidyFlags $in -- $cFlags && touch $out",
145 CommandDeps: []string{"${config.ClangBin}/clang-tidy", "${config.ClangTidyShellPath}"},
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700146 },
147 "cFlags", "tidyFlags")
Colin Cross91e90042016-12-02 17:13:24 -0800148
Nan Zhang43a485c2017-03-27 14:27:58 -0700149 _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
Colin Cross91e90042016-12-02 17:13:24 -0800150
151 yasm = pctx.AndroidStaticRule("yasm",
152 blueprint.RuleParams{
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700153 Command: "$yasmCmd $asFlags -o $out $in && $yasmCmd $asFlags -M $in >$out.d",
Colin Cross91e90042016-12-02 17:13:24 -0800154 CommandDeps: []string{"$yasmCmd"},
Dan Willemsen1d3e5452017-08-22 20:53:45 -0700155 Depfile: "$out.d",
156 Deps: blueprint.DepsGCC,
Colin Cross91e90042016-12-02 17:13:24 -0800157 },
158 "asFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800159
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700160 windres = pctx.AndroidStaticRule("windres",
161 blueprint.RuleParams{
162 Command: "$windresCmd $flags -I$$(dirname $in) -i $in -o $out",
163 CommandDeps: []string{"$windresCmd"},
164 },
165 "windresCmd", "flags")
166
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800167 _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800168
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700169 // -w has been added since header-abi-dumper does not need to produce any sort of diagnostic information.
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800170 sAbiDump = pctx.AndroidStaticRule("sAbiDump",
171 blueprint.RuleParams{
Logan Chien3ff624f2018-10-08 11:49:32 +0800172 Command: "rm -f $out && $sAbiDumper -o ${out} $in $exportDirs -- $cFlags -w -isystem prebuilts/clang-tools/${config.HostPrebuiltTag}/clang-headers",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800173 CommandDeps: []string{"$sAbiDumper"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800174 },
175 "cFlags", "exportDirs")
176
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800177 _ = pctx.SourcePathVariable("sAbiLinker", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-linker")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800178
179 sAbiLink = pctx.AndroidStaticRule("sAbiLink",
180 blueprint.RuleParams{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800181 Command: "$sAbiLinker -o ${out} $symbolFilter -arch $arch $exportedHeaderFlags @${out}.rsp ",
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800182 CommandDeps: []string{"$sAbiLinker"},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800183 Rspfile: "${out}.rsp",
184 RspfileContent: "${in}",
185 },
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800186 "symbolFilter", "arch", "exportedHeaderFlags")
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800187
Jayant Chowdharya4c6df52018-02-20 12:36:51 -0800188 _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/clang-tools/${config.HostPrebuiltTag}/bin/header-abi-diff")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700189
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800190 sAbiDiff = pctx.AndroidRuleFunc("sAbiDiff",
Dan Willemsen54daaf02018-03-12 13:24:09 -0700191 func(ctx android.PackageRuleContext) blueprint.RuleParams {
Jayant Chowdhary39d167a2018-05-17 16:45:51 -0700192 // TODO(b/78139997): Add -check-all-apis back
193 commandStr := "($sAbiDiffer $allowFlags -lib $libName -arch $arch -o ${out} -new $in -old $referenceDump)"
Jiyong Parka5f11e42018-04-17 12:19:51 +0900194 commandStr += "|| (echo ' ---- Please update abi references by running $$ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py -l ${libName} ----'"
Dan Willemsen2d31a442018-10-20 21:33:41 -0700195 commandStr += " && (mkdir -p $$DIST_DIR/abidiffs && cp ${out} $$DIST_DIR/abidiff/)"
Jayant Chowdharyd8b70a32018-02-01 17:23:09 -0800196 commandStr += " && exit 1)"
Jayant Chowdhary219139d2017-11-27 14:52:21 -0800197 return blueprint.RuleParams{
198 Command: commandStr,
199 CommandDeps: []string{"$sAbiDiffer"},
Dan Willemsen54daaf02018-03-12 13:24:09 -0700200 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800201 },
Jayant Chowdharya3bb1b32017-11-01 11:12:15 -0700202 "allowFlags", "referenceDump", "libName", "arch")
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700203
204 unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump",
205 blueprint.RuleParams{
206 Command: "gunzip -c $in > $out",
207 })
Colin Cross3f40fa42015-01-30 17:27:36 -0800208)
209
Dan Willemsen322a0a62015-11-17 15:19:46 -0800210func init() {
211 // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the
212 // debug output. That way two builds in two different directories will
213 // create the same output.
214 if runtime.GOOS != "darwin" {
215 pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd")
216 } else {
217 // Darwin doesn't have /proc
218 pctx.StaticVariable("relPwd", "")
219 }
220}
221
Colin Cross3f40fa42015-01-30 17:27:36 -0800222type builderFlags struct {
Chih-Hung Hsieh9e88ba92018-08-22 14:18:04 -0700223 globalFlags string
224 arFlags string
225 asFlags string
226 cFlags string
227 toolingCFlags string // A separate set of cFlags for clang LibTooling tools
228 toolingCppFlags string // A separate set of cppFlags for clang LibTooling tools
229 conlyFlags string
230 cppFlags string
231 ldFlags string
232 libFlags string
233 yaccFlags string
234 protoFlags string
235 protoOutParams string
236 tidyFlags string
237 sAbiFlags string
238 yasmFlags string
239 aidlFlags string
240 rsFlags string
241 toolchain config.Toolchain
Chih-Hung Hsieh9e88ba92018-08-22 14:18:04 -0700242 tidy bool
243 coverage bool
244 sAbiDump bool
245 protoRoot bool
Colin Cross665dce92016-04-28 14:50:03 -0700246
Colin Crossc3199482017-03-30 15:03:04 -0700247 systemIncludeFlags string
248
Colin Cross18c0c5a2016-12-01 14:45:23 -0800249 groupStaticLibs bool
250
Colin Cross665dce92016-04-28 14:50:03 -0700251 stripKeepSymbols bool
252 stripKeepMiniDebugInfo bool
253 stripAddGnuDebuglink bool
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700254 stripUseLlvmStrip bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800255}
256
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700257type Objects struct {
Dan Willemsen581341d2017-02-09 16:16:31 -0800258 objFiles android.Paths
259 tidyFiles android.Paths
260 coverageFiles android.Paths
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800261 sAbiDumpFiles android.Paths
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700262}
263
264func (a Objects) Copy() Objects {
265 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800266 objFiles: append(android.Paths{}, a.objFiles...),
267 tidyFiles: append(android.Paths{}, a.tidyFiles...),
268 coverageFiles: append(android.Paths{}, a.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800269 sAbiDumpFiles: append(android.Paths{}, a.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700270 }
271}
272
273func (a Objects) Append(b Objects) Objects {
274 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800275 objFiles: append(a.objFiles, b.objFiles...),
276 tidyFiles: append(a.tidyFiles, b.tidyFiles...),
277 coverageFiles: append(a.coverageFiles, b.coverageFiles...),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800278 sAbiDumpFiles: append(a.sAbiDumpFiles, b.sAbiDumpFiles...),
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700279 }
280}
281
Colin Cross3f40fa42015-01-30 17:27:36 -0800282// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
Colin Cross635c3b02016-05-18 15:37:25 -0700283func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800284 flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
Colin Cross581c1892015-04-07 16:50:10 -0700285
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700286 objFiles := make(android.Paths, len(srcFiles))
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700287 var tidyFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700288 if flags.tidy {
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700289 tidyFiles = make(android.Paths, 0, len(srcFiles))
290 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800291 var coverageFiles android.Paths
292 if flags.coverage {
293 coverageFiles = make(android.Paths, 0, len(srcFiles))
294 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800295
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700296 commonFlags := strings.Join([]string{
Colin Crossc3199482017-03-30 15:03:04 -0700297 flags.globalFlags,
298 flags.systemIncludeFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700299 }, " ")
300
301 toolingCflags := strings.Join([]string{
302 commonFlags,
303 flags.toolingCFlags,
304 flags.conlyFlags,
305 }, " ")
306
307 cflags := strings.Join([]string{
308 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700309 flags.cFlags,
310 flags.conlyFlags,
311 }, " ")
312
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700313 toolingCppflags := strings.Join([]string{
314 commonFlags,
315 flags.toolingCFlags,
Chih-Hung Hsieh9e88ba92018-08-22 14:18:04 -0700316 flags.toolingCppFlags,
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700317 }, " ")
318
Colin Crossc3199482017-03-30 15:03:04 -0700319 cppflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700320 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700321 flags.cFlags,
322 flags.cppFlags,
323 }, " ")
324
325 asflags := strings.Join([]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700326 commonFlags,
Colin Crossc3199482017-03-30 15:03:04 -0700327 flags.asFlags,
328 }, " ")
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700329
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800330 var sAbiDumpFiles android.Paths
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700331 if flags.sAbiDump {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800332 sAbiDumpFiles = make(android.Paths, 0, len(srcFiles))
333 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800334
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700335 cflags += " ${config.NoOverrideClangGlobalCflags}"
336 toolingCflags += " ${config.NoOverrideClangGlobalCflags}"
337 cppflags += " ${config.NoOverrideClangGlobalCflags}"
338 toolingCppflags += " ${config.NoOverrideClangGlobalCflags}"
Dan Willemsenbe03f342016-03-03 17:21:04 -0800339
Colin Cross3f40fa42015-01-30 17:27:36 -0800340 for i, srcFile := range srcFiles {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700341 objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
Colin Cross3f40fa42015-01-30 17:27:36 -0800342
343 objFiles[i] = objFile
344
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700345 switch srcFile.Ext() {
346 case ".asm":
Colin Crossae887032017-10-23 17:16:14 -0700347 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700348 Rule: yasm,
349 Description: "yasm " + srcFile.Rel(),
350 Output: objFile,
351 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800352 Implicits: cFlagsDeps,
353 OrderOnly: pathDeps,
Colin Cross91e90042016-12-02 17:13:24 -0800354 Args: map[string]string{
355 "asFlags": flags.yasmFlags,
356 },
357 })
358 continue
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700359 case ".rc":
Colin Crossae887032017-10-23 17:16:14 -0700360 ctx.Build(pctx, android.BuildParams{
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700361 Rule: windres,
362 Description: "windres " + srcFile.Rel(),
363 Output: objFile,
364 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800365 Implicits: cFlagsDeps,
366 OrderOnly: pathDeps,
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700367 Args: map[string]string{
368 "windresCmd": gccCmd(flags.toolchain, "windres"),
369 "flags": flags.toolchain.WindresFlags(),
370 },
371 })
372 continue
Colin Cross91e90042016-12-02 17:13:24 -0800373 }
374
Colin Cross3f40fa42015-01-30 17:27:36 -0800375 var moduleCflags string
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700376 var moduleToolingCflags string
Colin Cross3f40fa42015-01-30 17:27:36 -0800377 var ccCmd string
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700378 tidy := flags.tidy
Dan Willemsen581341d2017-02-09 16:16:31 -0800379 coverage := flags.coverage
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700380 dump := flags.sAbiDump
Colin Cross3f40fa42015-01-30 17:27:36 -0800381
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700382 switch srcFile.Ext() {
Colin Cross3f40fa42015-01-30 17:27:36 -0800383 case ".S", ".s":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700384 ccCmd = "clang"
Colin Cross3f40fa42015-01-30 17:27:36 -0800385 moduleCflags = asflags
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700386 tidy = false
Dan Willemsen581341d2017-02-09 16:16:31 -0800387 coverage = false
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800388 dump = false
Colin Cross3f40fa42015-01-30 17:27:36 -0800389 case ".c":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700390 ccCmd = "clang"
Colin Cross3f40fa42015-01-30 17:27:36 -0800391 moduleCflags = cflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700392 moduleToolingCflags = toolingCflags
Colin Cross9978ffe2016-12-01 15:31:22 -0800393 case ".cpp", ".cc", ".mm":
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700394 ccCmd = "clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800395 moduleCflags = cppflags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700396 moduleToolingCflags = toolingCppflags
Colin Cross3f40fa42015-01-30 17:27:36 -0800397 default:
398 ctx.ModuleErrorf("File %s has unknown extension", srcFile)
399 continue
400 }
401
Colin Cross67a5c132017-05-09 13:45:28 -0700402 ccDesc := ccCmd
403
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700404 ccCmd = "${config.ClangBin}/" + ccCmd
Colin Cross3f40fa42015-01-30 17:27:36 -0800405
Dan Willemsen581341d2017-02-09 16:16:31 -0800406 var implicitOutputs android.WritablePaths
407 if coverage {
408 gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno")
409 implicitOutputs = append(implicitOutputs, gcnoFile)
410 coverageFiles = append(coverageFiles, gcnoFile)
411 }
412
Colin Crossae887032017-10-23 17:16:14 -0700413 ctx.Build(pctx, android.BuildParams{
Dan Willemsen581341d2017-02-09 16:16:31 -0800414 Rule: cc,
Colin Cross67a5c132017-05-09 13:45:28 -0700415 Description: ccDesc + " " + srcFile.Rel(),
Dan Willemsen581341d2017-02-09 16:16:31 -0800416 Output: objFile,
417 ImplicitOutputs: implicitOutputs,
418 Input: srcFile,
Pirama Arumuga Nainarf231b192018-01-23 10:49:04 -0800419 Implicits: cFlagsDeps,
420 OrderOnly: pathDeps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800421 Args: map[string]string{
Colin Cross28344522015-04-22 13:07:53 -0700422 "cFlags": moduleCflags,
423 "ccCmd": ccCmd,
Colin Cross3f40fa42015-01-30 17:27:36 -0800424 },
425 })
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700426
427 if tidy {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700428 tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700429 tidyFiles = append(tidyFiles, tidyFile)
430
Colin Crossae887032017-10-23 17:16:14 -0700431 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700432 Rule: clangTidy,
433 Description: "clang-tidy " + srcFile.Rel(),
434 Output: tidyFile,
435 Input: srcFile,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700436 // We must depend on objFile, since clang-tidy doesn't
437 // support exporting dependencies.
438 Implicit: objFile,
439 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700440 "cFlags": moduleToolingCflags,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700441 "tidyFlags": flags.tidyFlags,
442 },
443 })
444 }
445
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800446 if dump {
447 sAbiDumpFile := android.ObjPathWithExt(ctx, subdir, srcFile, "sdump")
448 sAbiDumpFiles = append(sAbiDumpFiles, sAbiDumpFile)
449
Colin Crossae887032017-10-23 17:16:14 -0700450 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700451 Rule: sAbiDump,
452 Description: "header-abi-dumper " + srcFile.Rel(),
453 Output: sAbiDumpFile,
454 Input: srcFile,
455 Implicit: objFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800456 Args: map[string]string{
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700457 "cFlags": moduleToolingCflags,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800458 "exportDirs": flags.sAbiFlags,
459 },
460 })
461 }
462
Colin Cross3f40fa42015-01-30 17:27:36 -0800463 }
464
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700465 return Objects{
Dan Willemsen581341d2017-02-09 16:16:31 -0800466 objFiles: objFiles,
467 tidyFiles: tidyFiles,
468 coverageFiles: coverageFiles,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800469 sAbiDumpFiles: sAbiDumpFiles,
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700470 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800471}
472
473// Generate a rule for compiling multiple .o files to a static library (.a)
Colin Cross635c3b02016-05-18 15:37:25 -0700474func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Dan Willemsena03cf6d2016-09-26 15:45:04 -0700475 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800476
Dan Willemsen581341d2017-02-09 16:16:31 -0800477 if ctx.Darwin() {
478 transformDarwinObjToStaticLib(ctx, objFiles, flags, outputFile, deps)
479 return
480 }
481
Stephen Hinesf1addeb2018-01-09 23:29:04 -0800482 arCmd := "${config.ClangBin}/llvm-ar"
483 arFlags := "crsD"
484 if !ctx.Darwin() {
485 arFlags += " -format=gnu"
486 }
Vishwath Mohan83d9f712017-03-16 11:01:23 -0700487 if flags.arFlags != "" {
488 arFlags += " " + flags.arFlags
489 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800490
Colin Crossae887032017-10-23 17:16:14 -0700491 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700492 Rule: ar,
493 Description: "static link " + outputFile.Base(),
494 Output: outputFile,
495 Inputs: objFiles,
496 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800497 Args: map[string]string{
498 "arFlags": arFlags,
499 "arCmd": arCmd,
500 },
501 })
502}
503
Colin Cross0af4b842015-04-30 16:36:18 -0700504// Generate a rule for compiling multiple .o files to a static library (.a) on
505// darwin. The darwin ar tool doesn't support @file for list files, and has a
506// very small command line length limit, so we have to split the ar into multiple
507// steps, each appending to the previous one.
Dan Willemsen581341d2017-02-09 16:16:31 -0800508func transformDarwinObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths,
Colin Cross5b529592017-05-09 13:34:34 -0700509 flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) {
Colin Cross0af4b842015-04-30 16:36:18 -0700510
Colin Cross0af4b842015-04-30 16:36:18 -0700511 arFlags := "cqs"
512
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700513 if len(objFiles) == 0 {
Colin Cross635c3b02016-05-18 15:37:25 -0700514 dummy := android.PathForModuleOut(ctx, "dummy"+objectExtension)
515 dummyAr := android.PathForModuleOut(ctx, "dummy"+staticLibraryExtension)
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700516
Colin Crossae887032017-10-23 17:16:14 -0700517 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700518 Rule: emptyFile,
519 Description: "empty object file",
520 Output: dummy,
521 Implicits: deps,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700522 })
523
Colin Crossae887032017-10-23 17:16:14 -0700524 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700525 Rule: darwinAr,
526 Description: "empty static archive",
527 Output: dummyAr,
528 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700529 Args: map[string]string{
530 "arFlags": arFlags,
531 },
532 })
533
Colin Crossae887032017-10-23 17:16:14 -0700534 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700535 Rule: darwinAppendAr,
536 Description: "static link " + outputFile.Base(),
537 Output: outputFile,
538 Input: dummy,
Dan Willemsen9f0b5502016-05-13 14:05:09 -0700539 Args: map[string]string{
540 "arFlags": "d",
541 "inAr": dummyAr.String(),
542 },
543 })
544
545 return
546 }
547
Colin Cross0af4b842015-04-30 16:36:18 -0700548 // ARG_MAX on darwin is 262144, use half that to be safe
Colin Cross5b529592017-05-09 13:34:34 -0700549 objFilesLists, err := splitListForSize(objFiles, 131072)
Colin Cross0af4b842015-04-30 16:36:18 -0700550 if err != nil {
551 ctx.ModuleErrorf("%s", err.Error())
552 }
553
Colin Cross5b529592017-05-09 13:34:34 -0700554 var in, out android.WritablePath
Colin Cross0af4b842015-04-30 16:36:18 -0700555 for i, l := range objFilesLists {
556 in = out
557 out = outputFile
558 if i != len(objFilesLists)-1 {
Colin Cross5b529592017-05-09 13:34:34 -0700559 out = android.PathForModuleOut(ctx, outputFile.Base()+strconv.Itoa(i))
Colin Cross0af4b842015-04-30 16:36:18 -0700560 }
561
Colin Crossae887032017-10-23 17:16:14 -0700562 build := android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700563 Rule: darwinAr,
564 Description: "static link " + out.Base(),
565 Output: out,
566 Inputs: l,
567 Implicits: deps,
Colin Cross5b529592017-05-09 13:34:34 -0700568 Args: map[string]string{
569 "arFlags": arFlags,
570 },
Colin Cross0af4b842015-04-30 16:36:18 -0700571 }
Colin Cross5b529592017-05-09 13:34:34 -0700572 if i != 0 {
573 build.Rule = darwinAppendAr
574 build.Args["inAr"] = in.String()
575 }
Colin Crossae887032017-10-23 17:16:14 -0700576 ctx.Build(pctx, build)
Colin Cross0af4b842015-04-30 16:36:18 -0700577 }
578}
579
Colin Cross3f40fa42015-01-30 17:27:36 -0800580// Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries,
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700581// and shared libraries, to a shared library (.so) or dynamic executable
Colin Cross635c3b02016-05-18 15:37:25 -0700582func TransformObjToDynamicBinary(ctx android.ModuleContext,
583 objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths,
584 crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800585
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700586 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800587
Colin Cross3f40fa42015-01-30 17:27:36 -0800588 var libFlagsList []string
589
Colin Cross16b23492016-01-06 14:41:07 -0800590 if len(flags.libFlags) > 0 {
591 libFlagsList = append(libFlagsList, flags.libFlags)
592 }
593
Colin Cross3f40fa42015-01-30 17:27:36 -0800594 if len(wholeStaticLibs) > 0 {
Dan Willemsen490fd492015-11-24 17:53:15 -0800595 if ctx.Host() && ctx.Darwin() {
Colin Cross635c3b02016-05-18 15:37:25 -0700596 libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load "))
Colin Cross0af4b842015-04-30 16:36:18 -0700597 } else {
598 libFlagsList = append(libFlagsList, "-Wl,--whole-archive ")
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700599 libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...)
Colin Cross0af4b842015-04-30 16:36:18 -0700600 libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ")
601 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800602 }
603
Colin Cross7a7cf972016-12-05 18:47:39 -0800604 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800605 libFlagsList = append(libFlagsList, "-Wl,--start-group")
606 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700607 libFlagsList = append(libFlagsList, staticLibs.Strings()...)
Colin Cross7a7cf972016-12-05 18:47:39 -0800608 if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 {
Colin Cross18c0c5a2016-12-01 14:45:23 -0800609 libFlagsList = append(libFlagsList, "-Wl,--end-group")
610 }
Colin Cross3f40fa42015-01-30 17:27:36 -0800611
Stephen Hines10347862016-07-18 15:54:54 -0700612 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700613 libFlagsList = append(libFlagsList, "-Wl,--start-group")
614 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700615 libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...)
Stephen Hines10347862016-07-18 15:54:54 -0700616 if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 {
Dan Willemsenedc385f2015-07-08 13:02:23 -0700617 libFlagsList = append(libFlagsList, "-Wl,--end-group")
618 }
619
Colin Cross3f40fa42015-01-30 17:27:36 -0800620 for _, lib := range sharedLibs {
Dan Albert9840e1b2016-07-21 08:47:33 -0700621 libFlagsList = append(libFlagsList, lib.String())
Colin Cross3f40fa42015-01-30 17:27:36 -0800622 }
623
Colin Cross3f40fa42015-01-30 17:27:36 -0800624 deps = append(deps, staticLibs...)
Colin Cross3075ad02015-03-17 10:47:08 -0700625 deps = append(deps, lateStaticLibs...)
Colin Cross3f40fa42015-01-30 17:27:36 -0800626 deps = append(deps, wholeStaticLibs...)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700627 if crtBegin.Valid() {
628 deps = append(deps, crtBegin.Path(), crtEnd.Path())
Colin Cross3f40fa42015-01-30 17:27:36 -0800629 }
630
Colin Crossae887032017-10-23 17:16:14 -0700631 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700632 Rule: ld,
633 Description: "link " + outputFile.Base(),
634 Output: outputFile,
635 Inputs: objFiles,
636 Implicits: deps,
Colin Cross3f40fa42015-01-30 17:27:36 -0800637 Args: map[string]string{
Dan Albertce2b8392016-07-21 13:16:49 -0700638 "ldCmd": ldCmd,
639 "crtBegin": crtBegin.String(),
640 "libFlags": strings.Join(libFlagsList, " "),
641 "ldFlags": flags.ldFlags,
642 "crtEnd": crtEnd.String(),
Colin Cross3f40fa42015-01-30 17:27:36 -0800643 },
644 })
645}
646
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800647// Generate a rule to combine .dump sAbi dump files from multiple source files
648// into a single .ldump sAbi dump file
Jayant Chowdhary6ab3d842017-06-26 12:52:58 -0700649func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800650 baseName, exportedHeaderFlags string) android.OptionalPath {
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800651 outputFile := android.PathForModuleOut(ctx, baseName+".lsdump")
Jayant Chowdharydcd33b62018-02-23 16:43:23 -0800652 sabiLock.Lock()
653 lsdumpPaths = append(lsdumpPaths, outputFile.String())
654 sabiLock.Unlock()
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800655 symbolFilterStr := "-so " + soFile.String()
Colin Crossae887032017-10-23 17:16:14 -0700656 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700657 Rule: sAbiLink,
658 Description: "header-abi-linker " + outputFile.Base(),
659 Output: outputFile,
660 Inputs: sAbiDumps,
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800661 Implicit: soFile,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800662 Args: map[string]string{
Jayant Chowdharydf344d52018-01-17 11:11:42 -0800663 "symbolFilter": symbolFilterStr,
664 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800665 "exportedHeaderFlags": exportedHeaderFlags,
666 },
667 })
668 return android.OptionalPathForPath(outputFile)
669}
670
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700671func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path {
672 outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump")
Colin Crossae887032017-10-23 17:16:14 -0700673 ctx.Build(pctx, android.BuildParams{
Jayant Chowdhary715cac32017-04-20 06:53:59 -0700674 Rule: unzipRefSAbiDump,
675 Description: "gunzip" + outputFile.Base(),
676 Output: outputFile,
677 Input: zippedRefDump,
678 })
679 return outputFile
680}
681
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800682func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
Logan Chienf3511742017-10-31 18:04:35 +0800683 baseName, exportedHeaderFlags string, isVndkExt bool) android.OptionalPath {
684
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800685 outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700686 libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
Jayant Chowdharye4499502018-01-17 13:13:33 -0800687 localAbiCheckAllowFlags := append([]string(nil), abiCheckAllowFlags...)
688 if exportedHeaderFlags == "" {
689 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-advice-only")
690 }
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700691 if inList(libName, llndkLibraries) {
692 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-consider-opaque-types-different")
693 }
Logan Chienf3511742017-10-31 18:04:35 +0800694 if isVndkExt {
695 localAbiCheckAllowFlags = append(localAbiCheckAllowFlags, "-allow-extensions")
696 }
697
Colin Crossae887032017-10-23 17:16:14 -0700698 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700699 Rule: sAbiDiff,
700 Description: "header-abi-diff " + outputFile.Base(),
701 Output: outputFile,
702 Input: inputDump,
703 Implicit: referenceDump,
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800704 Args: map[string]string{
705 "referenceDump": referenceDump.String(),
Jayant Chowdharyc7434e22018-05-31 15:42:26 -0700706 "libName": libName,
Jayant Chowdharyf54e0a72017-05-22 10:53:24 -0700707 "arch": ctx.Arch().ArchType.Name,
Jayant Chowdharye4499502018-01-17 13:13:33 -0800708 "allowFlags": strings.Join(localAbiCheckAllowFlags, " "),
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800709 },
710 })
711 return android.OptionalPathForPath(outputFile)
712}
713
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700714// Generate a rule for extracting a table of contents from a shared library (.so)
715func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path,
Colin Cross26c34ed2016-09-30 17:10:16 -0700716 outputFile android.WritablePath, flags builderFlags) {
717
Colin Crossb496cfd2018-09-10 16:50:05 -0700718 var format string
719 var crossCompile string
720 if ctx.Darwin() {
721 format = "--macho"
722 crossCompile = "${config.MacToolPath}"
723 } else if ctx.Windows() {
724 format = "--pe"
725 crossCompile = gccCmd(flags.toolchain, "")
726 } else {
727 format = "--elf"
728 crossCompile = gccCmd(flags.toolchain, "")
729 }
Colin Cross26c34ed2016-09-30 17:10:16 -0700730
Colin Crossae887032017-10-23 17:16:14 -0700731 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700732 Rule: toc,
733 Description: "generate toc " + inputFile.Base(),
734 Output: outputFile,
735 Input: inputFile,
Colin Cross26c34ed2016-09-30 17:10:16 -0700736 Args: map[string]string{
737 "crossCompile": crossCompile,
Colin Crossb496cfd2018-09-10 16:50:05 -0700738 "format": format,
Colin Cross26c34ed2016-09-30 17:10:16 -0700739 },
740 })
741}
742
Colin Cross3f40fa42015-01-30 17:27:36 -0800743// Generate a rule for compiling multiple .o files to a .o using ld partial linking
Colin Cross635c3b02016-05-18 15:37:25 -0700744func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths,
745 flags builderFlags, outputFile android.WritablePath) {
Colin Cross3f40fa42015-01-30 17:27:36 -0800746
Dan Willemsen8536d6b2018-10-07 20:54:34 -0700747 ldCmd := "${config.ClangBin}/clang++"
Colin Cross3f40fa42015-01-30 17:27:36 -0800748
Colin Crossae887032017-10-23 17:16:14 -0700749 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700750 Rule: partialLd,
751 Description: "link " + outputFile.Base(),
752 Output: outputFile,
753 Inputs: objFiles,
Colin Cross3f40fa42015-01-30 17:27:36 -0800754 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700755 "ldCmd": ldCmd,
Colin Cross41280a42015-11-23 14:01:42 -0800756 "ldFlags": flags.ldFlags,
Colin Cross3f40fa42015-01-30 17:27:36 -0800757 },
758 })
759}
760
Colin Crossbfae8852015-03-26 14:44:11 -0700761// Generate a rule for runing objcopy --prefix-symbols on a binary
Colin Cross635c3b02016-05-18 15:37:25 -0700762func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path,
763 flags builderFlags, outputFile android.WritablePath) {
Colin Crossbfae8852015-03-26 14:44:11 -0700764
765 objcopyCmd := gccCmd(flags.toolchain, "objcopy")
766
Colin Crossae887032017-10-23 17:16:14 -0700767 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700768 Rule: prefixSymbols,
769 Description: "prefix symbols " + outputFile.Base(),
770 Output: outputFile,
771 Input: inputFile,
Colin Crossbfae8852015-03-26 14:44:11 -0700772 Args: map[string]string{
773 "objcopyCmd": objcopyCmd,
774 "prefix": prefix,
775 },
776 })
777}
778
Colin Cross635c3b02016-05-18 15:37:25 -0700779func TransformStrip(ctx android.ModuleContext, inputFile android.Path,
780 outputFile android.WritablePath, flags builderFlags) {
Colin Cross665dce92016-04-28 14:50:03 -0700781
782 crossCompile := gccCmd(flags.toolchain, "")
783 args := ""
784 if flags.stripAddGnuDebuglink {
785 args += " --add-gnu-debuglink"
786 }
787 if flags.stripKeepMiniDebugInfo {
788 args += " --keep-mini-debug-info"
789 }
790 if flags.stripKeepSymbols {
791 args += " --keep-symbols"
792 }
Chih-Hung Hsieh30485c92018-06-04 10:37:43 -0700793 if flags.stripUseLlvmStrip {
794 args += " --use-llvm-strip"
795 }
Colin Cross665dce92016-04-28 14:50:03 -0700796
Colin Crossae887032017-10-23 17:16:14 -0700797 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700798 Rule: strip,
799 Description: "strip " + outputFile.Base(),
800 Output: outputFile,
801 Input: inputFile,
Colin Cross665dce92016-04-28 14:50:03 -0700802 Args: map[string]string{
803 "crossCompile": crossCompile,
804 "args": args,
805 },
806 })
807}
808
Colin Cross635c3b02016-05-18 15:37:25 -0700809func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path,
810 outputFile android.WritablePath) {
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700811
Colin Crossae887032017-10-23 17:16:14 -0700812 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700813 Rule: darwinStrip,
814 Description: "strip " + outputFile.Base(),
815 Output: outputFile,
816 Input: inputFile,
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700817 })
818}
819
Dan Willemsen581341d2017-02-09 16:16:31 -0800820func TransformCoverageFilesToLib(ctx android.ModuleContext,
821 inputs Objects, flags builderFlags, baseName string) android.OptionalPath {
822
823 if len(inputs.coverageFiles) > 0 {
824 outputFile := android.PathForModuleOut(ctx, baseName+".gcnodir")
825
826 TransformObjToStaticLib(ctx, inputs.coverageFiles, flags, outputFile, nil)
827
828 return android.OptionalPathForPath(outputFile)
829 }
830
831 return android.OptionalPath{}
832}
833
Colin Crossb98c8b02016-07-29 13:44:28 -0700834func gccCmd(toolchain config.Toolchain, cmd string) string {
Colin Cross3f40fa42015-01-30 17:27:36 -0800835 return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd)
836}
Colin Cross0af4b842015-04-30 16:36:18 -0700837
Colin Cross5b529592017-05-09 13:34:34 -0700838func splitListForSize(list android.Paths, limit int) (lists []android.Paths, err error) {
Colin Cross0af4b842015-04-30 16:36:18 -0700839 var i int
840
841 start := 0
842 bytes := 0
843 for i = range list {
Colin Cross5b529592017-05-09 13:34:34 -0700844 l := len(list[i].String())
Colin Cross0af4b842015-04-30 16:36:18 -0700845 if l > limit {
846 return nil, fmt.Errorf("list element greater than size limit (%d)", limit)
847 }
848 if bytes+l > limit {
849 lists = append(lists, list[start:i])
850 start = i
851 bytes = 0
852 }
853 bytes += l + 1 // count a space between each list element
854 }
855
856 lists = append(lists, list[start:])
857
858 totalLen := 0
859 for _, l := range lists {
860 totalLen += len(l)
861 }
862 if totalLen != len(list) {
863 panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen))
864 }
865 return lists, nil
866}