| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 1 | // 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 |  | 
|  | 15 | package 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 |  | 
|  | 21 | import ( | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 22 | "fmt" | 
| Colin Cross | b98c8b0 | 2016-07-29 13:44:28 -0700 | [diff] [blame] | 23 | "path/filepath" | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 24 | "runtime" | 
|  | 25 | "strconv" | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 26 | "strings" | 
| Colin Cross | ed4cf0b | 2015-03-26 14:43:45 -0700 | [diff] [blame] | 27 |  | 
|  | 28 | "github.com/google/blueprint" | 
| Colin Cross | b98c8b0 | 2016-07-29 13:44:28 -0700 | [diff] [blame] | 29 |  | 
|  | 30 | "android/soong/android" | 
|  | 31 | "android/soong/cc/config" | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 32 | ) | 
|  | 33 |  | 
|  | 34 | const ( | 
| Dan Albert | c3144b1 | 2015-04-28 18:17:56 -0700 | [diff] [blame] | 35 | objectExtension        = ".o" | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 36 | staticLibraryExtension = ".a" | 
|  | 37 | ) | 
|  | 38 |  | 
|  | 39 | var ( | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 40 | pctx = android.NewPackageContext("android/soong/cc") | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 41 |  | 
| Colin Cross | 9d45bb7 | 2016-08-29 16:14:13 -0700 | [diff] [blame] | 42 | cc = pctx.AndroidGomaStaticRule("cc", | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 43 | blueprint.RuleParams{ | 
|  | 44 | Depfile:     "${out}.d", | 
|  | 45 | Deps:        blueprint.DepsGCC, | 
| Alistair Strachan | 777475c | 2016-08-26 12:55:49 -0700 | [diff] [blame] | 46 | Command:     "$relPwd ${config.CcWrapper}$ccCmd -c $cFlags -MD -MF ${out}.d -o $out $in", | 
| Dan Willemsen | c94a768 | 2015-11-17 15:27:28 -0800 | [diff] [blame] | 47 | CommandDeps: []string{"$ccCmd"}, | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 48 | Description: "cc $out", | 
|  | 49 | }, | 
| Dan Willemsen | 322a0a6 | 2015-11-17 15:19:46 -0800 | [diff] [blame] | 50 | "ccCmd", "cFlags") | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 51 |  | 
| Colin Cross | 9d45bb7 | 2016-08-29 16:14:13 -0700 | [diff] [blame] | 52 | ld = pctx.AndroidStaticRule("ld", | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 53 | blueprint.RuleParams{ | 
| Dan Albert | ce2b839 | 2016-07-21 13:16:49 -0700 | [diff] [blame] | 54 | Command: "$ldCmd ${crtBegin} @${out}.rsp " + | 
| Colin Cross | 2834452 | 2015-04-22 13:07:53 -0700 | [diff] [blame] | 55 | "${libFlags} ${crtEnd} -o ${out} ${ldFlags}", | 
| Dan Willemsen | c94a768 | 2015-11-17 15:27:28 -0800 | [diff] [blame] | 56 | CommandDeps:    []string{"$ldCmd"}, | 
| Colin Cross | 7d21c44 | 2015-03-30 17:47:53 -0700 | [diff] [blame] | 57 | Description:    "ld $out", | 
|  | 58 | Rspfile:        "${out}.rsp", | 
|  | 59 | RspfileContent: "${in}", | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 60 | }, | 
| Dan Albert | ce2b839 | 2016-07-21 13:16:49 -0700 | [diff] [blame] | 61 | "ldCmd", "crtBegin", "libFlags", "crtEnd", "ldFlags") | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 62 |  | 
| Colin Cross | 9d45bb7 | 2016-08-29 16:14:13 -0700 | [diff] [blame] | 63 | partialLd = pctx.AndroidStaticRule("partialLd", | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 64 | blueprint.RuleParams{ | 
| Colin Cross | 41280a4 | 2015-11-23 14:01:42 -0800 | [diff] [blame] | 65 | Command:     "$ldCmd -nostdlib -Wl,-r ${in} -o ${out} ${ldFlags}", | 
| Dan Willemsen | c94a768 | 2015-11-17 15:27:28 -0800 | [diff] [blame] | 66 | CommandDeps: []string{"$ldCmd"}, | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 67 | Description: "partialLd $out", | 
|  | 68 | }, | 
| Colin Cross | 41280a4 | 2015-11-23 14:01:42 -0800 | [diff] [blame] | 69 | "ldCmd", "ldFlags") | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 70 |  | 
| Colin Cross | 9d45bb7 | 2016-08-29 16:14:13 -0700 | [diff] [blame] | 71 | ar = pctx.AndroidStaticRule("ar", | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 72 | blueprint.RuleParams{ | 
| Colin Cross | 7d21c44 | 2015-03-30 17:47:53 -0700 | [diff] [blame] | 73 | Command:        "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp", | 
| Dan Willemsen | c94a768 | 2015-11-17 15:27:28 -0800 | [diff] [blame] | 74 | CommandDeps:    []string{"$arCmd"}, | 
| Colin Cross | 7d21c44 | 2015-03-30 17:47:53 -0700 | [diff] [blame] | 75 | Description:    "ar $out", | 
|  | 76 | Rspfile:        "${out}.rsp", | 
|  | 77 | RspfileContent: "${in}", | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 78 | }, | 
|  | 79 | "arCmd", "arFlags") | 
|  | 80 |  | 
| Colin Cross | 9d45bb7 | 2016-08-29 16:14:13 -0700 | [diff] [blame] | 81 | darwinAr = pctx.AndroidStaticRule("darwinAr", | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 82 | blueprint.RuleParams{ | 
| Colin Cross | b98c8b0 | 2016-07-29 13:44:28 -0700 | [diff] [blame] | 83 | Command:     "rm -f ${out} && ${config.MacArPath} $arFlags $out $in", | 
|  | 84 | CommandDeps: []string{"${config.MacArPath}"}, | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 85 | Description: "ar $out", | 
|  | 86 | }, | 
| Colin Cross | b8ecdfe | 2016-05-03 15:10:29 -0700 | [diff] [blame] | 87 | "arFlags") | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 88 |  | 
| Colin Cross | 9d45bb7 | 2016-08-29 16:14:13 -0700 | [diff] [blame] | 89 | darwinAppendAr = pctx.AndroidStaticRule("darwinAppendAr", | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 90 | blueprint.RuleParams{ | 
| Colin Cross | b98c8b0 | 2016-07-29 13:44:28 -0700 | [diff] [blame] | 91 | Command:     "cp -f ${inAr} ${out}.tmp && ${config.MacArPath} $arFlags ${out}.tmp $in && mv ${out}.tmp ${out}", | 
|  | 92 | CommandDeps: []string{"${config.MacArPath}", "${inAr}"}, | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 93 | Description: "ar $out", | 
|  | 94 | }, | 
| Colin Cross | b8ecdfe | 2016-05-03 15:10:29 -0700 | [diff] [blame] | 95 | "arFlags", "inAr") | 
|  | 96 |  | 
| Colin Cross | 9d45bb7 | 2016-08-29 16:14:13 -0700 | [diff] [blame] | 97 | darwinStrip = pctx.AndroidStaticRule("darwinStrip", | 
| Colin Cross | b8ecdfe | 2016-05-03 15:10:29 -0700 | [diff] [blame] | 98 | blueprint.RuleParams{ | 
| Colin Cross | a24166b | 2016-08-01 15:42:38 -0700 | [diff] [blame] | 99 | Command:     "${config.MacStripPath} -u -r -o $out $in", | 
|  | 100 | CommandDeps: []string{"${config.MacStripPath}"}, | 
| Colin Cross | b8ecdfe | 2016-05-03 15:10:29 -0700 | [diff] [blame] | 101 | Description: "strip $out", | 
|  | 102 | }) | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 103 |  | 
| Colin Cross | 9d45bb7 | 2016-08-29 16:14:13 -0700 | [diff] [blame] | 104 | prefixSymbols = pctx.AndroidStaticRule("prefixSymbols", | 
| Colin Cross | bfae885 | 2015-03-26 14:44:11 -0700 | [diff] [blame] | 105 | blueprint.RuleParams{ | 
|  | 106 | Command:     "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}", | 
| Dan Willemsen | c94a768 | 2015-11-17 15:27:28 -0800 | [diff] [blame] | 107 | CommandDeps: []string{"$objcopyCmd"}, | 
| Colin Cross | bfae885 | 2015-03-26 14:44:11 -0700 | [diff] [blame] | 108 | Description: "prefixSymbols $out", | 
|  | 109 | }, | 
|  | 110 | "objcopyCmd", "prefix") | 
|  | 111 |  | 
| Nan Zhang | 43a485c | 2017-03-27 14:27:58 -0700 | [diff] [blame] | 112 | _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh") | 
| Colin Cross | 665dce9 | 2016-04-28 14:50:03 -0700 | [diff] [blame] | 113 |  | 
| Colin Cross | 9d45bb7 | 2016-08-29 16:14:13 -0700 | [diff] [blame] | 114 | strip = pctx.AndroidStaticRule("strip", | 
| Colin Cross | 665dce9 | 2016-04-28 14:50:03 -0700 | [diff] [blame] | 115 | blueprint.RuleParams{ | 
|  | 116 | Depfile:     "${out}.d", | 
|  | 117 | Deps:        blueprint.DepsGCC, | 
|  | 118 | Command:     "CROSS_COMPILE=$crossCompile $stripPath ${args} -i ${in} -o ${out} -d ${out}.d", | 
|  | 119 | CommandDeps: []string{"$stripPath"}, | 
|  | 120 | Description: "strip $out", | 
|  | 121 | }, | 
|  | 122 | "args", "crossCompile") | 
|  | 123 |  | 
| Colin Cross | 9d45bb7 | 2016-08-29 16:14:13 -0700 | [diff] [blame] | 124 | emptyFile = pctx.AndroidStaticRule("emptyFile", | 
| Dan Willemsen | 9f0b550 | 2016-05-13 14:05:09 -0700 | [diff] [blame] | 125 | blueprint.RuleParams{ | 
|  | 126 | Command:     "rm -f $out && touch $out", | 
|  | 127 | Description: "empty file $out", | 
|  | 128 | }) | 
|  | 129 |  | 
| Nan Zhang | 43a485c | 2017-03-27 14:27:58 -0700 | [diff] [blame] | 130 | _ = pctx.SourcePathVariable("copyGccLibPath", "build/soong/scripts/copygcclib.sh") | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 131 |  | 
| Colin Cross | 9d45bb7 | 2016-08-29 16:14:13 -0700 | [diff] [blame] | 132 | copyGccLib = pctx.AndroidStaticRule("copyGccLib", | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 133 | blueprint.RuleParams{ | 
|  | 134 | Depfile:     "${out}.d", | 
|  | 135 | Deps:        blueprint.DepsGCC, | 
|  | 136 | Command:     "$copyGccLibPath $out $ccCmd $cFlags -print-file-name=${libName}", | 
| Dan Willemsen | c94a768 | 2015-11-17 15:27:28 -0800 | [diff] [blame] | 137 | CommandDeps: []string{"$copyGccLibPath", "$ccCmd"}, | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 138 | Description: "copy gcc $out", | 
|  | 139 | }, | 
|  | 140 | "ccCmd", "cFlags", "libName") | 
| Colin Cross | 26c34ed | 2016-09-30 17:10:16 -0700 | [diff] [blame] | 141 |  | 
| Nan Zhang | 43a485c | 2017-03-27 14:27:58 -0700 | [diff] [blame] | 142 | _ = pctx.SourcePathVariable("tocPath", "build/soong/scripts/toc.sh") | 
| Colin Cross | 26c34ed | 2016-09-30 17:10:16 -0700 | [diff] [blame] | 143 |  | 
|  | 144 | toc = pctx.AndroidStaticRule("toc", | 
|  | 145 | blueprint.RuleParams{ | 
|  | 146 | Depfile:     "${out}.d", | 
|  | 147 | Deps:        blueprint.DepsGCC, | 
|  | 148 | Command:     "CROSS_COMPILE=$crossCompile $tocPath -i ${in} -o ${out} -d ${out}.d", | 
|  | 149 | CommandDeps: []string{"$tocPath"}, | 
|  | 150 | Restat:      true, | 
|  | 151 | }, | 
|  | 152 | "crossCompile") | 
| Dan Willemsen | a03cf6d | 2016-09-26 15:45:04 -0700 | [diff] [blame] | 153 |  | 
|  | 154 | clangTidy = pctx.AndroidStaticRule("clangTidy", | 
|  | 155 | blueprint.RuleParams{ | 
|  | 156 | Command:     "rm -f $out && ${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out", | 
|  | 157 | CommandDeps: []string{"${config.ClangBin}/clang-tidy"}, | 
|  | 158 | Description: "tidy $out", | 
|  | 159 | }, | 
|  | 160 | "cFlags", "tidyFlags") | 
| Colin Cross | 91e9004 | 2016-12-02 17:13:24 -0800 | [diff] [blame] | 161 |  | 
| Nan Zhang | 43a485c | 2017-03-27 14:27:58 -0700 | [diff] [blame] | 162 | _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm") | 
| Colin Cross | 91e9004 | 2016-12-02 17:13:24 -0800 | [diff] [blame] | 163 |  | 
|  | 164 | yasm = pctx.AndroidStaticRule("yasm", | 
|  | 165 | blueprint.RuleParams{ | 
|  | 166 | Command:     "$yasmCmd $asFlags -o $out $in", | 
|  | 167 | CommandDeps: []string{"$yasmCmd"}, | 
|  | 168 | Description: "yasm $out", | 
|  | 169 | }, | 
|  | 170 | "asFlags") | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 171 | ) | 
|  | 172 |  | 
| Dan Willemsen | 322a0a6 | 2015-11-17 15:19:46 -0800 | [diff] [blame] | 173 | func init() { | 
|  | 174 | // We run gcc/clang with PWD=/proc/self/cwd to remove $TOP from the | 
|  | 175 | // debug output. That way two builds in two different directories will | 
|  | 176 | // create the same output. | 
|  | 177 | if runtime.GOOS != "darwin" { | 
|  | 178 | pctx.StaticVariable("relPwd", "PWD=/proc/self/cwd") | 
|  | 179 | } else { | 
|  | 180 | // Darwin doesn't have /proc | 
|  | 181 | pctx.StaticVariable("relPwd", "") | 
|  | 182 | } | 
|  | 183 | } | 
|  | 184 |  | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 185 | type builderFlags struct { | 
|  | 186 | globalFlags string | 
| Vishwath Mohan | 83d9f71 | 2017-03-16 11:01:23 -0700 | [diff] [blame] | 187 | arFlags     string | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 188 | asFlags     string | 
|  | 189 | cFlags      string | 
|  | 190 | conlyFlags  string | 
|  | 191 | cppFlags    string | 
|  | 192 | ldFlags     string | 
| Colin Cross | 16b2349 | 2016-01-06 14:41:07 -0800 | [diff] [blame] | 193 | libFlags    string | 
| Colin Cross | 581c189 | 2015-04-07 16:50:10 -0700 | [diff] [blame] | 194 | yaccFlags   string | 
| Colin Cross | 0c461f1 | 2016-10-20 16:11:43 -0700 | [diff] [blame] | 195 | protoFlags  string | 
| Dan Willemsen | a03cf6d | 2016-09-26 15:45:04 -0700 | [diff] [blame] | 196 | tidyFlags   string | 
| Colin Cross | 91e9004 | 2016-12-02 17:13:24 -0800 | [diff] [blame] | 197 | yasmFlags   string | 
| Dan Willemsen | e1240db | 2016-11-03 14:28:51 -0700 | [diff] [blame] | 198 | aidlFlags   string | 
| Colin Cross | b98c8b0 | 2016-07-29 13:44:28 -0700 | [diff] [blame] | 199 | toolchain   config.Toolchain | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 200 | clang       bool | 
| Dan Willemsen | a03cf6d | 2016-09-26 15:45:04 -0700 | [diff] [blame] | 201 | tidy        bool | 
| Dan Willemsen | 581341d | 2017-02-09 16:16:31 -0800 | [diff] [blame] | 202 | coverage    bool | 
| Colin Cross | 665dce9 | 2016-04-28 14:50:03 -0700 | [diff] [blame] | 203 |  | 
| Colin Cross | c319948 | 2017-03-30 15:03:04 -0700 | [diff] [blame] | 204 | systemIncludeFlags string | 
|  | 205 |  | 
| Colin Cross | 18c0c5a | 2016-12-01 14:45:23 -0800 | [diff] [blame] | 206 | groupStaticLibs bool | 
|  | 207 |  | 
| Colin Cross | 665dce9 | 2016-04-28 14:50:03 -0700 | [diff] [blame] | 208 | stripKeepSymbols       bool | 
|  | 209 | stripKeepMiniDebugInfo bool | 
|  | 210 | stripAddGnuDebuglink   bool | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 211 | } | 
|  | 212 |  | 
| Dan Willemsen | 5cb580f | 2016-09-26 17:33:01 -0700 | [diff] [blame] | 213 | type Objects struct { | 
| Dan Willemsen | 581341d | 2017-02-09 16:16:31 -0800 | [diff] [blame] | 214 | objFiles      android.Paths | 
|  | 215 | tidyFiles     android.Paths | 
|  | 216 | coverageFiles android.Paths | 
| Dan Willemsen | 5cb580f | 2016-09-26 17:33:01 -0700 | [diff] [blame] | 217 | } | 
|  | 218 |  | 
|  | 219 | func (a Objects) Copy() Objects { | 
|  | 220 | return Objects{ | 
| Dan Willemsen | 581341d | 2017-02-09 16:16:31 -0800 | [diff] [blame] | 221 | objFiles:      append(android.Paths{}, a.objFiles...), | 
|  | 222 | tidyFiles:     append(android.Paths{}, a.tidyFiles...), | 
|  | 223 | coverageFiles: append(android.Paths{}, a.coverageFiles...), | 
| Dan Willemsen | 5cb580f | 2016-09-26 17:33:01 -0700 | [diff] [blame] | 224 | } | 
|  | 225 | } | 
|  | 226 |  | 
|  | 227 | func (a Objects) Append(b Objects) Objects { | 
|  | 228 | return Objects{ | 
| Dan Willemsen | 581341d | 2017-02-09 16:16:31 -0800 | [diff] [blame] | 229 | objFiles:      append(a.objFiles, b.objFiles...), | 
|  | 230 | tidyFiles:     append(a.tidyFiles, b.tidyFiles...), | 
|  | 231 | coverageFiles: append(a.coverageFiles, b.coverageFiles...), | 
| Dan Willemsen | 5cb580f | 2016-09-26 17:33:01 -0700 | [diff] [blame] | 232 | } | 
|  | 233 | } | 
|  | 234 |  | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 235 | // Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 236 | func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths, | 
| Dan Willemsen | 5cb580f | 2016-09-26 17:33:01 -0700 | [diff] [blame] | 237 | flags builderFlags, deps android.Paths) Objects { | 
| Colin Cross | 581c189 | 2015-04-07 16:50:10 -0700 | [diff] [blame] | 238 |  | 
| Dan Willemsen | 5cb580f | 2016-09-26 17:33:01 -0700 | [diff] [blame] | 239 | objFiles := make(android.Paths, len(srcFiles)) | 
| Dan Willemsen | a03cf6d | 2016-09-26 15:45:04 -0700 | [diff] [blame] | 240 | var tidyFiles android.Paths | 
|  | 241 | if flags.tidy && flags.clang { | 
|  | 242 | tidyFiles = make(android.Paths, 0, len(srcFiles)) | 
|  | 243 | } | 
| Dan Willemsen | 581341d | 2017-02-09 16:16:31 -0800 | [diff] [blame] | 244 | var coverageFiles android.Paths | 
|  | 245 | if flags.coverage { | 
|  | 246 | coverageFiles = make(android.Paths, 0, len(srcFiles)) | 
|  | 247 | } | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 248 |  | 
| Colin Cross | c319948 | 2017-03-30 15:03:04 -0700 | [diff] [blame] | 249 | cflags := strings.Join([]string{ | 
|  | 250 | flags.globalFlags, | 
|  | 251 | flags.systemIncludeFlags, | 
|  | 252 | flags.cFlags, | 
|  | 253 | flags.conlyFlags, | 
|  | 254 | }, " ") | 
|  | 255 |  | 
|  | 256 | cppflags := strings.Join([]string{ | 
|  | 257 | flags.globalFlags, | 
|  | 258 | flags.systemIncludeFlags, | 
|  | 259 | flags.cFlags, | 
|  | 260 | flags.cppFlags, | 
|  | 261 | }, " ") | 
|  | 262 |  | 
|  | 263 | asflags := strings.Join([]string{ | 
|  | 264 | flags.globalFlags, | 
|  | 265 | flags.systemIncludeFlags, | 
|  | 266 | flags.asFlags, | 
|  | 267 | }, " ") | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 268 |  | 
| Dan Willemsen | be03f34 | 2016-03-03 17:21:04 -0800 | [diff] [blame] | 269 | if flags.clang { | 
| Colin Cross | b98c8b0 | 2016-07-29 13:44:28 -0700 | [diff] [blame] | 270 | cflags += " ${config.NoOverrideClangGlobalCflags}" | 
|  | 271 | cppflags += " ${config.NoOverrideClangGlobalCflags}" | 
| Dan Willemsen | be03f34 | 2016-03-03 17:21:04 -0800 | [diff] [blame] | 272 | } else { | 
| Colin Cross | b98c8b0 | 2016-07-29 13:44:28 -0700 | [diff] [blame] | 273 | cflags += " ${config.NoOverrideGlobalCflags}" | 
|  | 274 | cppflags += " ${config.NoOverrideGlobalCflags}" | 
| Dan Willemsen | be03f34 | 2016-03-03 17:21:04 -0800 | [diff] [blame] | 275 | } | 
|  | 276 |  | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 277 | for i, srcFile := range srcFiles { | 
| Dan Willemsen | 21ec490 | 2016-11-02 20:43:13 -0700 | [diff] [blame] | 278 | objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o") | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 279 |  | 
|  | 280 | objFiles[i] = objFile | 
|  | 281 |  | 
| Colin Cross | 91e9004 | 2016-12-02 17:13:24 -0800 | [diff] [blame] | 282 | if srcFile.Ext() == ".asm" { | 
|  | 283 | ctx.ModuleBuild(pctx, android.ModuleBuildParams{ | 
|  | 284 | Rule:      yasm, | 
|  | 285 | Output:    objFile, | 
|  | 286 | Input:     srcFile, | 
|  | 287 | OrderOnly: deps, | 
|  | 288 | Args: map[string]string{ | 
|  | 289 | "asFlags": flags.yasmFlags, | 
|  | 290 | }, | 
|  | 291 | }) | 
|  | 292 | continue | 
|  | 293 | } | 
|  | 294 |  | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 295 | var moduleCflags string | 
|  | 296 | var ccCmd string | 
| Dan Willemsen | a03cf6d | 2016-09-26 15:45:04 -0700 | [diff] [blame] | 297 | tidy := flags.tidy && flags.clang | 
| Dan Willemsen | 581341d | 2017-02-09 16:16:31 -0800 | [diff] [blame] | 298 | coverage := flags.coverage | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 299 |  | 
| Dan Willemsen | 34cc69e | 2015-09-23 15:26:20 -0700 | [diff] [blame] | 300 | switch srcFile.Ext() { | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 301 | case ".S", ".s": | 
|  | 302 | ccCmd = "gcc" | 
|  | 303 | moduleCflags = asflags | 
| Dan Willemsen | a03cf6d | 2016-09-26 15:45:04 -0700 | [diff] [blame] | 304 | tidy = false | 
| Dan Willemsen | 581341d | 2017-02-09 16:16:31 -0800 | [diff] [blame] | 305 | coverage = false | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 306 | case ".c": | 
|  | 307 | ccCmd = "gcc" | 
|  | 308 | moduleCflags = cflags | 
| Colin Cross | 9978ffe | 2016-12-01 15:31:22 -0800 | [diff] [blame] | 309 | case ".cpp", ".cc", ".mm": | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 310 | ccCmd = "g++" | 
|  | 311 | moduleCflags = cppflags | 
|  | 312 | default: | 
|  | 313 | ctx.ModuleErrorf("File %s has unknown extension", srcFile) | 
|  | 314 | continue | 
|  | 315 | } | 
|  | 316 |  | 
|  | 317 | if flags.clang { | 
|  | 318 | switch ccCmd { | 
|  | 319 | case "gcc": | 
|  | 320 | ccCmd = "clang" | 
|  | 321 | case "g++": | 
|  | 322 | ccCmd = "clang++" | 
|  | 323 | default: | 
|  | 324 | panic("unrecoginzied ccCmd") | 
|  | 325 | } | 
|  | 326 |  | 
| Colin Cross | b98c8b0 | 2016-07-29 13:44:28 -0700 | [diff] [blame] | 327 | ccCmd = "${config.ClangBin}/" + ccCmd | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 328 | } else { | 
|  | 329 | ccCmd = gccCmd(flags.toolchain, ccCmd) | 
|  | 330 | } | 
|  | 331 |  | 
| Dan Willemsen | 581341d | 2017-02-09 16:16:31 -0800 | [diff] [blame] | 332 | var implicitOutputs android.WritablePaths | 
|  | 333 | if coverage { | 
|  | 334 | gcnoFile := android.ObjPathWithExt(ctx, subdir, srcFile, "gcno") | 
|  | 335 | implicitOutputs = append(implicitOutputs, gcnoFile) | 
|  | 336 | coverageFiles = append(coverageFiles, gcnoFile) | 
|  | 337 | } | 
|  | 338 |  | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 339 | ctx.ModuleBuild(pctx, android.ModuleBuildParams{ | 
| Dan Willemsen | 581341d | 2017-02-09 16:16:31 -0800 | [diff] [blame] | 340 | Rule:            cc, | 
|  | 341 | Output:          objFile, | 
|  | 342 | ImplicitOutputs: implicitOutputs, | 
|  | 343 | Input:           srcFile, | 
|  | 344 | OrderOnly:       deps, | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 345 | Args: map[string]string{ | 
| Colin Cross | 2834452 | 2015-04-22 13:07:53 -0700 | [diff] [blame] | 346 | "cFlags": moduleCflags, | 
|  | 347 | "ccCmd":  ccCmd, | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 348 | }, | 
|  | 349 | }) | 
| Dan Willemsen | a03cf6d | 2016-09-26 15:45:04 -0700 | [diff] [blame] | 350 |  | 
|  | 351 | if tidy { | 
| Dan Willemsen | 21ec490 | 2016-11-02 20:43:13 -0700 | [diff] [blame] | 352 | tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy") | 
| Dan Willemsen | a03cf6d | 2016-09-26 15:45:04 -0700 | [diff] [blame] | 353 | tidyFiles = append(tidyFiles, tidyFile) | 
|  | 354 |  | 
|  | 355 | ctx.ModuleBuild(pctx, android.ModuleBuildParams{ | 
|  | 356 | Rule:   clangTidy, | 
|  | 357 | Output: tidyFile, | 
|  | 358 | Input:  srcFile, | 
|  | 359 | // We must depend on objFile, since clang-tidy doesn't | 
|  | 360 | // support exporting dependencies. | 
|  | 361 | Implicit: objFile, | 
|  | 362 | Args: map[string]string{ | 
|  | 363 | "cFlags":    moduleCflags, | 
|  | 364 | "tidyFlags": flags.tidyFlags, | 
|  | 365 | }, | 
|  | 366 | }) | 
|  | 367 | } | 
|  | 368 |  | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 369 | } | 
|  | 370 |  | 
| Dan Willemsen | 5cb580f | 2016-09-26 17:33:01 -0700 | [diff] [blame] | 371 | return Objects{ | 
| Dan Willemsen | 581341d | 2017-02-09 16:16:31 -0800 | [diff] [blame] | 372 | objFiles:      objFiles, | 
|  | 373 | tidyFiles:     tidyFiles, | 
|  | 374 | coverageFiles: coverageFiles, | 
| Dan Willemsen | 5cb580f | 2016-09-26 17:33:01 -0700 | [diff] [blame] | 375 | } | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 376 | } | 
|  | 377 |  | 
|  | 378 | // Generate a rule for compiling multiple .o files to a static library (.a) | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 379 | func TransformObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths, | 
| Dan Willemsen | a03cf6d | 2016-09-26 15:45:04 -0700 | [diff] [blame] | 380 | flags builderFlags, outputFile android.ModuleOutPath, deps android.Paths) { | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 381 |  | 
| Dan Willemsen | 581341d | 2017-02-09 16:16:31 -0800 | [diff] [blame] | 382 | if ctx.Darwin() { | 
|  | 383 | transformDarwinObjToStaticLib(ctx, objFiles, flags, outputFile, deps) | 
|  | 384 | return | 
|  | 385 | } | 
|  | 386 |  | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 387 | arCmd := gccCmd(flags.toolchain, "ar") | 
|  | 388 | arFlags := "crsPD" | 
| Vishwath Mohan | 83d9f71 | 2017-03-16 11:01:23 -0700 | [diff] [blame] | 389 | if flags.arFlags != "" { | 
|  | 390 | arFlags += " " + flags.arFlags | 
|  | 391 | } | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 392 |  | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 393 | ctx.ModuleBuild(pctx, android.ModuleBuildParams{ | 
| Dan Willemsen | a03cf6d | 2016-09-26 15:45:04 -0700 | [diff] [blame] | 394 | Rule:      ar, | 
|  | 395 | Output:    outputFile, | 
|  | 396 | Inputs:    objFiles, | 
|  | 397 | Implicits: deps, | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 398 | Args: map[string]string{ | 
|  | 399 | "arFlags": arFlags, | 
|  | 400 | "arCmd":   arCmd, | 
|  | 401 | }, | 
|  | 402 | }) | 
|  | 403 | } | 
|  | 404 |  | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 405 | // Generate a rule for compiling multiple .o files to a static library (.a) on | 
|  | 406 | // darwin.  The darwin ar tool doesn't support @file for list files, and has a | 
|  | 407 | // very small command line length limit, so we have to split the ar into multiple | 
|  | 408 | // steps, each appending to the previous one. | 
| Dan Willemsen | 581341d | 2017-02-09 16:16:31 -0800 | [diff] [blame] | 409 | func transformDarwinObjToStaticLib(ctx android.ModuleContext, objFiles android.Paths, | 
| Dan Willemsen | a03cf6d | 2016-09-26 15:45:04 -0700 | [diff] [blame] | 410 | flags builderFlags, outputPath android.ModuleOutPath, deps android.Paths) { | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 411 |  | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 412 | arFlags := "cqs" | 
|  | 413 |  | 
| Dan Willemsen | 9f0b550 | 2016-05-13 14:05:09 -0700 | [diff] [blame] | 414 | if len(objFiles) == 0 { | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 415 | dummy := android.PathForModuleOut(ctx, "dummy"+objectExtension) | 
|  | 416 | dummyAr := android.PathForModuleOut(ctx, "dummy"+staticLibraryExtension) | 
| Dan Willemsen | 9f0b550 | 2016-05-13 14:05:09 -0700 | [diff] [blame] | 417 |  | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 418 | ctx.ModuleBuild(pctx, android.ModuleBuildParams{ | 
| Dan Willemsen | a03cf6d | 2016-09-26 15:45:04 -0700 | [diff] [blame] | 419 | Rule:      emptyFile, | 
|  | 420 | Output:    dummy, | 
|  | 421 | Implicits: deps, | 
| Dan Willemsen | 9f0b550 | 2016-05-13 14:05:09 -0700 | [diff] [blame] | 422 | }) | 
|  | 423 |  | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 424 | ctx.ModuleBuild(pctx, android.ModuleBuildParams{ | 
| Dan Willemsen | 9f0b550 | 2016-05-13 14:05:09 -0700 | [diff] [blame] | 425 | Rule:   darwinAr, | 
|  | 426 | Output: dummyAr, | 
|  | 427 | Input:  dummy, | 
|  | 428 | Args: map[string]string{ | 
|  | 429 | "arFlags": arFlags, | 
|  | 430 | }, | 
|  | 431 | }) | 
|  | 432 |  | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 433 | ctx.ModuleBuild(pctx, android.ModuleBuildParams{ | 
| Dan Willemsen | 9f0b550 | 2016-05-13 14:05:09 -0700 | [diff] [blame] | 434 | Rule:   darwinAppendAr, | 
|  | 435 | Output: outputPath, | 
|  | 436 | Input:  dummy, | 
|  | 437 | Args: map[string]string{ | 
|  | 438 | "arFlags": "d", | 
|  | 439 | "inAr":    dummyAr.String(), | 
|  | 440 | }, | 
|  | 441 | }) | 
|  | 442 |  | 
|  | 443 | return | 
|  | 444 | } | 
|  | 445 |  | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 446 | // ARG_MAX on darwin is 262144, use half that to be safe | 
| Dan Willemsen | 34cc69e | 2015-09-23 15:26:20 -0700 | [diff] [blame] | 447 | objFilesLists, err := splitListForSize(objFiles.Strings(), 131072) | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 448 | if err != nil { | 
|  | 449 | ctx.ModuleErrorf("%s", err.Error()) | 
|  | 450 | } | 
|  | 451 |  | 
| Dan Willemsen | 34cc69e | 2015-09-23 15:26:20 -0700 | [diff] [blame] | 452 | outputFile := outputPath.String() | 
|  | 453 |  | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 454 | var in, out string | 
|  | 455 | for i, l := range objFilesLists { | 
|  | 456 | in = out | 
|  | 457 | out = outputFile | 
|  | 458 | if i != len(objFilesLists)-1 { | 
|  | 459 | out += "." + strconv.Itoa(i) | 
|  | 460 | } | 
|  | 461 |  | 
|  | 462 | if in == "" { | 
|  | 463 | ctx.Build(pctx, blueprint.BuildParams{ | 
| Dan Willemsen | a03cf6d | 2016-09-26 15:45:04 -0700 | [diff] [blame] | 464 | Rule:      darwinAr, | 
|  | 465 | Outputs:   []string{out}, | 
|  | 466 | Inputs:    l, | 
|  | 467 | Implicits: deps.Strings(), | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 468 | Args: map[string]string{ | 
|  | 469 | "arFlags": arFlags, | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 470 | }, | 
|  | 471 | }) | 
|  | 472 | } else { | 
|  | 473 | ctx.Build(pctx, blueprint.BuildParams{ | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 474 | Rule:    darwinAppendAr, | 
|  | 475 | Outputs: []string{out}, | 
|  | 476 | Inputs:  l, | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 477 | Args: map[string]string{ | 
|  | 478 | "arFlags": arFlags, | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 479 | "inAr":    in, | 
|  | 480 | }, | 
|  | 481 | }) | 
|  | 482 | } | 
|  | 483 | } | 
|  | 484 | } | 
|  | 485 |  | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 486 | // Generate a rule for compiling multiple .o files, plus static libraries, whole static libraries, | 
|  | 487 | // and shared libraires, to a shared library (.so) or dynamic executable | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 488 | func TransformObjToDynamicBinary(ctx android.ModuleContext, | 
|  | 489 | objFiles, sharedLibs, staticLibs, lateStaticLibs, wholeStaticLibs, deps android.Paths, | 
|  | 490 | crtBegin, crtEnd android.OptionalPath, groupLate bool, flags builderFlags, outputFile android.WritablePath) { | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 491 |  | 
|  | 492 | var ldCmd string | 
|  | 493 | if flags.clang { | 
| Colin Cross | b98c8b0 | 2016-07-29 13:44:28 -0700 | [diff] [blame] | 494 | ldCmd = "${config.ClangBin}/clang++" | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 495 | } else { | 
|  | 496 | ldCmd = gccCmd(flags.toolchain, "g++") | 
|  | 497 | } | 
|  | 498 |  | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 499 | var libFlagsList []string | 
|  | 500 |  | 
| Colin Cross | 16b2349 | 2016-01-06 14:41:07 -0800 | [diff] [blame] | 501 | if len(flags.libFlags) > 0 { | 
|  | 502 | libFlagsList = append(libFlagsList, flags.libFlags) | 
|  | 503 | } | 
|  | 504 |  | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 505 | if len(wholeStaticLibs) > 0 { | 
| Dan Willemsen | 490fd49 | 2015-11-24 17:53:15 -0800 | [diff] [blame] | 506 | if ctx.Host() && ctx.Darwin() { | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 507 | libFlagsList = append(libFlagsList, android.JoinWithPrefix(wholeStaticLibs.Strings(), "-force_load ")) | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 508 | } else { | 
|  | 509 | libFlagsList = append(libFlagsList, "-Wl,--whole-archive ") | 
| Dan Willemsen | 34cc69e | 2015-09-23 15:26:20 -0700 | [diff] [blame] | 510 | libFlagsList = append(libFlagsList, wholeStaticLibs.Strings()...) | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 511 | libFlagsList = append(libFlagsList, "-Wl,--no-whole-archive ") | 
|  | 512 | } | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 513 | } | 
|  | 514 |  | 
| Colin Cross | 7a7cf97 | 2016-12-05 18:47:39 -0800 | [diff] [blame] | 515 | if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 { | 
| Colin Cross | 18c0c5a | 2016-12-01 14:45:23 -0800 | [diff] [blame] | 516 | libFlagsList = append(libFlagsList, "-Wl,--start-group") | 
|  | 517 | } | 
| Dan Willemsen | 34cc69e | 2015-09-23 15:26:20 -0700 | [diff] [blame] | 518 | libFlagsList = append(libFlagsList, staticLibs.Strings()...) | 
| Colin Cross | 7a7cf97 | 2016-12-05 18:47:39 -0800 | [diff] [blame] | 519 | if flags.groupStaticLibs && !ctx.Darwin() && len(staticLibs) > 0 { | 
| Colin Cross | 18c0c5a | 2016-12-01 14:45:23 -0800 | [diff] [blame] | 520 | libFlagsList = append(libFlagsList, "-Wl,--end-group") | 
|  | 521 | } | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 522 |  | 
| Stephen Hines | 1034786 | 2016-07-18 15:54:54 -0700 | [diff] [blame] | 523 | if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 { | 
| Dan Willemsen | edc385f | 2015-07-08 13:02:23 -0700 | [diff] [blame] | 524 | libFlagsList = append(libFlagsList, "-Wl,--start-group") | 
|  | 525 | } | 
| Dan Willemsen | 34cc69e | 2015-09-23 15:26:20 -0700 | [diff] [blame] | 526 | libFlagsList = append(libFlagsList, lateStaticLibs.Strings()...) | 
| Stephen Hines | 1034786 | 2016-07-18 15:54:54 -0700 | [diff] [blame] | 527 | if groupLate && !ctx.Darwin() && len(lateStaticLibs) > 0 { | 
| Dan Willemsen | edc385f | 2015-07-08 13:02:23 -0700 | [diff] [blame] | 528 | libFlagsList = append(libFlagsList, "-Wl,--end-group") | 
|  | 529 | } | 
|  | 530 |  | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 531 | for _, lib := range sharedLibs { | 
| Dan Albert | 9840e1b | 2016-07-21 08:47:33 -0700 | [diff] [blame] | 532 | libFlagsList = append(libFlagsList, lib.String()) | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 533 | } | 
|  | 534 |  | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 535 | deps = append(deps, staticLibs...) | 
| Colin Cross | 3075ad0 | 2015-03-17 10:47:08 -0700 | [diff] [blame] | 536 | deps = append(deps, lateStaticLibs...) | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 537 | deps = append(deps, wholeStaticLibs...) | 
| Dan Willemsen | 34cc69e | 2015-09-23 15:26:20 -0700 | [diff] [blame] | 538 | if crtBegin.Valid() { | 
|  | 539 | deps = append(deps, crtBegin.Path(), crtEnd.Path()) | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 540 | } | 
|  | 541 |  | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 542 | ctx.ModuleBuild(pctx, android.ModuleBuildParams{ | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 543 | Rule:      ld, | 
| Dan Willemsen | 34cc69e | 2015-09-23 15:26:20 -0700 | [diff] [blame] | 544 | Output:    outputFile, | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 545 | Inputs:    objFiles, | 
|  | 546 | Implicits: deps, | 
|  | 547 | Args: map[string]string{ | 
| Dan Albert | ce2b839 | 2016-07-21 13:16:49 -0700 | [diff] [blame] | 548 | "ldCmd":    ldCmd, | 
|  | 549 | "crtBegin": crtBegin.String(), | 
|  | 550 | "libFlags": strings.Join(libFlagsList, " "), | 
|  | 551 | "ldFlags":  flags.ldFlags, | 
|  | 552 | "crtEnd":   crtEnd.String(), | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 553 | }, | 
|  | 554 | }) | 
|  | 555 | } | 
|  | 556 |  | 
| Colin Cross | 26c34ed | 2016-09-30 17:10:16 -0700 | [diff] [blame] | 557 | // Generate a rule for extract a table of contents from a shared library (.so) | 
|  | 558 | func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.WritablePath, | 
|  | 559 | outputFile android.WritablePath, flags builderFlags) { | 
|  | 560 |  | 
|  | 561 | crossCompile := gccCmd(flags.toolchain, "") | 
|  | 562 |  | 
|  | 563 | ctx.ModuleBuild(pctx, android.ModuleBuildParams{ | 
|  | 564 | Rule:   toc, | 
|  | 565 | Output: outputFile, | 
|  | 566 | Input:  inputFile, | 
|  | 567 | Args: map[string]string{ | 
|  | 568 | "crossCompile": crossCompile, | 
|  | 569 | }, | 
|  | 570 | }) | 
|  | 571 | } | 
|  | 572 |  | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 573 | // Generate a rule for compiling multiple .o files to a .o using ld partial linking | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 574 | func TransformObjsToObj(ctx android.ModuleContext, objFiles android.Paths, | 
|  | 575 | flags builderFlags, outputFile android.WritablePath) { | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 576 |  | 
| Colin Cross | 41280a4 | 2015-11-23 14:01:42 -0800 | [diff] [blame] | 577 | var ldCmd string | 
|  | 578 | if flags.clang { | 
| Colin Cross | b98c8b0 | 2016-07-29 13:44:28 -0700 | [diff] [blame] | 579 | ldCmd = "${config.ClangBin}/clang++" | 
| Colin Cross | 41280a4 | 2015-11-23 14:01:42 -0800 | [diff] [blame] | 580 | } else { | 
|  | 581 | ldCmd = gccCmd(flags.toolchain, "g++") | 
|  | 582 | } | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 583 |  | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 584 | ctx.ModuleBuild(pctx, android.ModuleBuildParams{ | 
| Dan Willemsen | 34cc69e | 2015-09-23 15:26:20 -0700 | [diff] [blame] | 585 | Rule:   partialLd, | 
|  | 586 | Output: outputFile, | 
|  | 587 | Inputs: objFiles, | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 588 | Args: map[string]string{ | 
| Dan Willemsen | 34cc69e | 2015-09-23 15:26:20 -0700 | [diff] [blame] | 589 | "ldCmd":   ldCmd, | 
| Colin Cross | 41280a4 | 2015-11-23 14:01:42 -0800 | [diff] [blame] | 590 | "ldFlags": flags.ldFlags, | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 591 | }, | 
|  | 592 | }) | 
|  | 593 | } | 
|  | 594 |  | 
| Colin Cross | bfae885 | 2015-03-26 14:44:11 -0700 | [diff] [blame] | 595 | // Generate a rule for runing objcopy --prefix-symbols on a binary | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 596 | func TransformBinaryPrefixSymbols(ctx android.ModuleContext, prefix string, inputFile android.Path, | 
|  | 597 | flags builderFlags, outputFile android.WritablePath) { | 
| Colin Cross | bfae885 | 2015-03-26 14:44:11 -0700 | [diff] [blame] | 598 |  | 
|  | 599 | objcopyCmd := gccCmd(flags.toolchain, "objcopy") | 
|  | 600 |  | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 601 | ctx.ModuleBuild(pctx, android.ModuleBuildParams{ | 
| Dan Willemsen | 34cc69e | 2015-09-23 15:26:20 -0700 | [diff] [blame] | 602 | Rule:   prefixSymbols, | 
|  | 603 | Output: outputFile, | 
|  | 604 | Input:  inputFile, | 
| Colin Cross | bfae885 | 2015-03-26 14:44:11 -0700 | [diff] [blame] | 605 | Args: map[string]string{ | 
|  | 606 | "objcopyCmd": objcopyCmd, | 
|  | 607 | "prefix":     prefix, | 
|  | 608 | }, | 
|  | 609 | }) | 
|  | 610 | } | 
|  | 611 |  | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 612 | func TransformStrip(ctx android.ModuleContext, inputFile android.Path, | 
|  | 613 | outputFile android.WritablePath, flags builderFlags) { | 
| Colin Cross | 665dce9 | 2016-04-28 14:50:03 -0700 | [diff] [blame] | 614 |  | 
|  | 615 | crossCompile := gccCmd(flags.toolchain, "") | 
|  | 616 | args := "" | 
|  | 617 | if flags.stripAddGnuDebuglink { | 
|  | 618 | args += " --add-gnu-debuglink" | 
|  | 619 | } | 
|  | 620 | if flags.stripKeepMiniDebugInfo { | 
|  | 621 | args += " --keep-mini-debug-info" | 
|  | 622 | } | 
|  | 623 | if flags.stripKeepSymbols { | 
|  | 624 | args += " --keep-symbols" | 
|  | 625 | } | 
|  | 626 |  | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 627 | ctx.ModuleBuild(pctx, android.ModuleBuildParams{ | 
| Colin Cross | 665dce9 | 2016-04-28 14:50:03 -0700 | [diff] [blame] | 628 | Rule:   strip, | 
|  | 629 | Output: outputFile, | 
|  | 630 | Input:  inputFile, | 
|  | 631 | Args: map[string]string{ | 
|  | 632 | "crossCompile": crossCompile, | 
|  | 633 | "args":         args, | 
|  | 634 | }, | 
|  | 635 | }) | 
|  | 636 | } | 
|  | 637 |  | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 638 | func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path, | 
|  | 639 | outputFile android.WritablePath) { | 
| Colin Cross | b8ecdfe | 2016-05-03 15:10:29 -0700 | [diff] [blame] | 640 |  | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 641 | ctx.ModuleBuild(pctx, android.ModuleBuildParams{ | 
| Colin Cross | b8ecdfe | 2016-05-03 15:10:29 -0700 | [diff] [blame] | 642 | Rule:   darwinStrip, | 
|  | 643 | Output: outputFile, | 
|  | 644 | Input:  inputFile, | 
|  | 645 | }) | 
|  | 646 | } | 
|  | 647 |  | 
| Dan Willemsen | 581341d | 2017-02-09 16:16:31 -0800 | [diff] [blame] | 648 | func TransformCoverageFilesToLib(ctx android.ModuleContext, | 
|  | 649 | inputs Objects, flags builderFlags, baseName string) android.OptionalPath { | 
|  | 650 |  | 
|  | 651 | if len(inputs.coverageFiles) > 0 { | 
|  | 652 | outputFile := android.PathForModuleOut(ctx, baseName+".gcnodir") | 
|  | 653 |  | 
|  | 654 | TransformObjToStaticLib(ctx, inputs.coverageFiles, flags, outputFile, nil) | 
|  | 655 |  | 
|  | 656 | return android.OptionalPathForPath(outputFile) | 
|  | 657 | } | 
|  | 658 |  | 
|  | 659 | return android.OptionalPath{} | 
|  | 660 | } | 
|  | 661 |  | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 662 | func CopyGccLib(ctx android.ModuleContext, libName string, | 
|  | 663 | flags builderFlags, outputFile android.WritablePath) { | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 664 |  | 
| Colin Cross | 635c3b0 | 2016-05-18 15:37:25 -0700 | [diff] [blame] | 665 | ctx.ModuleBuild(pctx, android.ModuleBuildParams{ | 
| Dan Willemsen | 34cc69e | 2015-09-23 15:26:20 -0700 | [diff] [blame] | 666 | Rule:   copyGccLib, | 
|  | 667 | Output: outputFile, | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 668 | Args: map[string]string{ | 
|  | 669 | "ccCmd":   gccCmd(flags.toolchain, "gcc"), | 
|  | 670 | "cFlags":  flags.globalFlags, | 
|  | 671 | "libName": libName, | 
|  | 672 | }, | 
|  | 673 | }) | 
|  | 674 | } | 
|  | 675 |  | 
| Colin Cross | b98c8b0 | 2016-07-29 13:44:28 -0700 | [diff] [blame] | 676 | func gccCmd(toolchain config.Toolchain, cmd string) string { | 
| Colin Cross | 3f40fa4 | 2015-01-30 17:27:36 -0800 | [diff] [blame] | 677 | return filepath.Join(toolchain.GccRoot(), "bin", toolchain.GccTriple()+"-"+cmd) | 
|  | 678 | } | 
| Colin Cross | 0af4b84 | 2015-04-30 16:36:18 -0700 | [diff] [blame] | 679 |  | 
|  | 680 | func splitListForSize(list []string, limit int) (lists [][]string, err error) { | 
|  | 681 | var i int | 
|  | 682 |  | 
|  | 683 | start := 0 | 
|  | 684 | bytes := 0 | 
|  | 685 | for i = range list { | 
|  | 686 | l := len(list[i]) | 
|  | 687 | if l > limit { | 
|  | 688 | return nil, fmt.Errorf("list element greater than size limit (%d)", limit) | 
|  | 689 | } | 
|  | 690 | if bytes+l > limit { | 
|  | 691 | lists = append(lists, list[start:i]) | 
|  | 692 | start = i | 
|  | 693 | bytes = 0 | 
|  | 694 | } | 
|  | 695 | bytes += l + 1 // count a space between each list element | 
|  | 696 | } | 
|  | 697 |  | 
|  | 698 | lists = append(lists, list[start:]) | 
|  | 699 |  | 
|  | 700 | totalLen := 0 | 
|  | 701 | for _, l := range lists { | 
|  | 702 | totalLen += len(l) | 
|  | 703 | } | 
|  | 704 | if totalLen != len(list) { | 
|  | 705 | panic(fmt.Errorf("Failed breaking up list, %d != %d", len(list), totalLen)) | 
|  | 706 | } | 
|  | 707 | return lists, nil | 
|  | 708 | } |