Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(226)

Side by Side Diff: build/toolchain/gcc_toolchain.gni

Issue 1413073005: GN: Avoid nontrivial shell commands in gcc_toolchain tools (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: pedantically correct os.remove error handling Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « build/toolchain/gcc_solink_wrapper.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 # Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import("//build/config/nacl/config.gni") 5 import("//build/config/nacl/config.gni")
6 import("//build/config/sanitizers/sanitizers.gni") 6 import("//build/config/sanitizers/sanitizers.gni")
7 import("//build/toolchain/ccache.gni") 7 import("//build/toolchain/ccache.gni")
8 import("//build/toolchain/goma.gni") 8 import("//build/toolchain/goma.gni")
9 import("//build/toolchain/toolchain.gni") 9 import("//build/toolchain/toolchain.gni")
10 10
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 207
208 tool("alink") { 208 tool("alink") {
209 rspfile = "{{output}}.rsp" 209 rspfile = "{{output}}.rsp"
210 arflags = "" 210 arflags = ""
211 if (is_cfi && invoker.toolchain_os != "nacl") { 211 if (is_cfi && invoker.toolchain_os != "nacl") {
212 gold_plugin_path = rebase_path( 212 gold_plugin_path = rebase_path(
213 "//third_party/llvm-build/Release+Asserts/lib/LLVMgold.so", 213 "//third_party/llvm-build/Release+Asserts/lib/LLVMgold.so",
214 root_build_dir) 214 root_build_dir)
215 arflags = "--plugin $gold_plugin_path" 215 arflags = "--plugin $gold_plugin_path"
216 } 216 }
217 command = "rm -f {{output}} && $ar rcs $arflags {{output}} @$rspfile" 217
218 # This needs a Python script to avoid using simple sh features in this
219 # command, in case the host does not use a POSIX shell (e.g. Windows).
220 ar_wrapper = rebase_path("//build/toolchain/gcc_ar_wrapper.py")
221 command = "$python_path $ar_wrapper --output={{output}} --ar=$ar $arflags rcs @$rspfile"
218 description = "AR {{output}}" 222 description = "AR {{output}}"
219 rspfile_content = "{{inputs}}" 223 rspfile_content = "{{inputs}}"
220 outputs = [ 224 outputs = [
221 "{{target_out_dir}}/{{target_output_name}}{{output_extension}}", 225 "{{target_out_dir}}/{{target_output_name}}{{output_extension}}",
222 ] 226 ]
223 default_output_extension = ".a" 227 default_output_extension = ".a"
224 output_prefix = "lib" 228 output_prefix = "lib"
225 } 229 }
226 230
227 tool("solink") { 231 tool("solink") {
228 soname = "{{target_output_name}}{{output_extension}}" # e.g. "libfoo.so". 232 soname = "{{target_output_name}}{{output_extension}}" # e.g. "libfoo.so".
229 sofile = "{{root_out_dir}}/$soname" # Possibly including toolchain dir. 233 sofile = "{{root_out_dir}}/$soname" # Possibly including toolchain dir.
230 if (shlib_subdir != ".") { 234 if (shlib_subdir != ".") {
231 sofile = "{{root_out_dir}}/$shlib_subdir/$soname" 235 sofile = "{{root_out_dir}}/$shlib_subdir/$soname"
232 } 236 }
233 rspfile = sofile + ".rsp" 237 rspfile = sofile + ".rsp"
234 238
235 unstripped_sofile = sofile 239 unstripped_sofile = sofile
236 if (defined(invoker.strip)) { 240 if (defined(invoker.strip)) {
237 unstripped_sofile = "{{root_out_dir}}/lib.unstripped/$soname" 241 unstripped_sofile = "{{root_out_dir}}/lib.unstripped/$soname"
238 } 242 }
239 243
240 # These variables are not built into GN but are helpers that implement 244 # These variables are not built into GN but are helpers that
241 # (1) linking to produce a .so, (2) extracting the symbols from that file 245 # implement (1) linking to produce a .so, (2) extracting the symbols
242 # to a temporary file, (3) if the temporary file has differences from the 246 # from that file (3) if the extracted list differs from the existing
243 # existing .TOC file, overwrite it, otherwise, don't change it. 247 # .TOC file, overwrite it, otherwise, don't change it.
244 tocfile = sofile + ".TOC" 248 tocfile = sofile + ".TOC"
245 temporary_tocname = sofile + ".tmp"
246 249
247 link_command = "$ld -shared {{ldflags}} -o $unstripped_sofile -Wl,-soname= $soname @$rspfile" 250 link_command = "$ld -shared {{ldflags}} -o $unstripped_sofile -Wl,-soname= $soname @$rspfile"
251
248 assert(defined(readelf), "to solink you must have a readelf") 252 assert(defined(readelf), "to solink you must have a readelf")
249 assert(defined(nm), "to solink you must have an nm") 253 assert(defined(nm), "to solink you must have an nm")
250 toc_command = "{ $readelf -d $unstripped_sofile | grep SONAME ; $nm -gD -f p $unstripped_sofile | cut -f1-2 -d' '; } > $temporary_tocname" 254 strip_switch = ""
251 replace_command = "if ! cmp -s $temporary_tocname $tocfile; then mv $tempo rary_tocname $tocfile; fi" 255 if (defined(invoker.strip)) {
256 strip_switch = "--strip=${invoker.strip}"
257 }
252 258
253 command = "$link_command && $toc_command && $replace_command" 259 # This needs a Python script to avoid using a complex shell command
254 if (defined(invoker.strip)) { 260 # requiring sh control structures, pipelines, and POSIX utilities.
255 strip_command = 261 # The host might not have a POSIX shell and utilities (e.g. Windows).
256 "${invoker.strip} --strip-unneeded -o $sofile $unstripped_sofile" 262 solink_wrapper = rebase_path("//build/toolchain/gcc_solink_wrapper.py")
257 command += " && " + strip_command 263 command = "$python_path $solink_wrapper --readelf=$readelf --nm=$nm $strip _switch --sofile=$unstripped_sofile --tocfile=$tocfile --output=$sofile -- $link _command"
258 } 264
259 rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whol e-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix" 265 rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whol e-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix"
260 266
261 description = "SOLINK $sofile" 267 description = "SOLINK $sofile"
262 268
263 # Use this for {{output_extension}} expansions unless a target manually 269 # Use this for {{output_extension}} expansions unless a target manually
264 # overrides it (in which case {{output_extension}} will be what the target 270 # overrides it (in which case {{output_extension}} will be what the target
265 # specifies). 271 # specifies).
266 default_output_extension = default_shlib_extension 272 default_output_extension = default_shlib_extension
267 273
268 output_prefix = "lib" 274 output_prefix = "lib"
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 nm = "${toolprefix}nm" 445 nm = "${toolprefix}nm"
440 446
441 forward_variables_from(invoker, 447 forward_variables_from(invoker,
442 [ 448 [
443 "toolchain_cpu", 449 "toolchain_cpu",
444 "toolchain_os", 450 "toolchain_os",
445 "use_gold", 451 "use_gold",
446 ]) 452 ])
447 } 453 }
448 } 454 }
OLDNEW
« no previous file with comments | « build/toolchain/gcc_solink_wrapper.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698