| OLD | NEW |
| 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/android/config.gni") | 5 import("//build/config/android/config.gni") |
| 6 import("//build/config/clang/clang.gni") | 6 import("//build/config/clang/clang.gni") |
| 7 import("//build/config/nacl/config.gni") | 7 import("//build/config/nacl/config.gni") |
| 8 import("//build/config/sanitizers/sanitizers.gni") | 8 import("//build/config/sanitizers/sanitizers.gni") |
| 9 import("//build/config/v8_target_cpu.gni") | 9 import("//build/config/v8_target_cpu.gni") |
| 10 import("//build/toolchain/cc_wrapper.gni") | 10 import("//build/toolchain/cc_wrapper.gni") |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 } else { | 207 } else { |
| 208 extra_cxxflags = "" | 208 extra_cxxflags = "" |
| 209 } | 209 } |
| 210 | 210 |
| 211 if (defined(invoker.extra_ldflags) && invoker.extra_ldflags != "") { | 211 if (defined(invoker.extra_ldflags) && invoker.extra_ldflags != "") { |
| 212 extra_ldflags = " " + invoker.extra_ldflags | 212 extra_ldflags = " " + invoker.extra_ldflags |
| 213 } else { | 213 } else { |
| 214 extra_ldflags = "" | 214 extra_ldflags = "" |
| 215 } | 215 } |
| 216 | 216 |
| 217 enable_linker_map = |
| 218 defined(invoker.enable_linker_map) && invoker.enable_linker_map |
| 219 |
| 217 # These library switches can apply to all tools below. | 220 # These library switches can apply to all tools below. |
| 218 lib_switch = "-l" | 221 lib_switch = "-l" |
| 219 lib_dir_switch = "-L" | 222 lib_dir_switch = "-L" |
| 220 | 223 |
| 221 # Object files go in this directory. | 224 # Object files go in this directory. |
| 222 object_subdir = "{{target_out_dir}}/{{label_name}}" | 225 object_subdir = "{{target_out_dir}}/{{label_name}}" |
| 223 | 226 |
| 224 tool("cc") { | 227 tool("cc") { |
| 225 depfile = "{{output}}.d" | 228 depfile = "{{output}}.d" |
| 226 command = "$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_di
rs}} {{cflags}} {{cflags_c}}${extra_cppflags}${extra_cflags} -c {{source}} -o {{
output}}" | 229 command = "$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_di
rs}} {{cflags}} {{cflags_c}}${extra_cppflags}${extra_cflags} -c {{source}} -o {{
output}}" |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 } | 315 } |
| 313 | 316 |
| 314 # These variables are not built into GN but are helpers that | 317 # These variables are not built into GN but are helpers that |
| 315 # implement (1) linking to produce a .so, (2) extracting the symbols | 318 # implement (1) linking to produce a .so, (2) extracting the symbols |
| 316 # from that file (3) if the extracted list differs from the existing | 319 # from that file (3) if the extracted list differs from the existing |
| 317 # .TOC file, overwrite it, otherwise, don't change it. | 320 # .TOC file, overwrite it, otherwise, don't change it. |
| 318 tocfile = sofile + ".TOC" | 321 tocfile = sofile + ".TOC" |
| 319 | 322 |
| 320 link_command = "$ld -shared {{ldflags}}${extra_ldflags} -o \"$unstripped_s
ofile\" -Wl,-soname=\"$soname\" @\"$rspfile\"" | 323 link_command = "$ld -shared {{ldflags}}${extra_ldflags} -o \"$unstripped_s
ofile\" -Wl,-soname=\"$soname\" @\"$rspfile\"" |
| 321 | 324 |
| 325 # Generate a map file to be used for binary size analysis. |
| 326 # Map file adds ~10% to the link time on a z620. |
| 327 # With target_os="android", libchrome.so.map.gz is ~20MB. |
| 328 map_switch = "" |
| 329 if (enable_linker_map && is_official_build) { |
| 330 map_file = "$unstripped_sofile.map.gz" |
| 331 map_switch = " --map-file \"$map_file\"" |
| 332 } |
| 333 |
| 322 assert(defined(readelf), "to solink you must have a readelf") | 334 assert(defined(readelf), "to solink you must have a readelf") |
| 323 assert(defined(nm), "to solink you must have an nm") | 335 assert(defined(nm), "to solink you must have an nm") |
| 324 strip_switch = "" | 336 strip_switch = "" |
| 325 if (defined(invoker.strip)) { | 337 if (defined(invoker.strip)) { |
| 326 strip_switch = "--strip=${invoker.strip}" | 338 strip_switch = "--strip=${invoker.strip} " |
| 327 } | 339 } |
| 328 | 340 |
| 329 # This needs a Python script to avoid using a complex shell command | 341 # This needs a Python script to avoid using a complex shell command |
| 330 # requiring sh control structures, pipelines, and POSIX utilities. | 342 # requiring sh control structures, pipelines, and POSIX utilities. |
| 331 # The host might not have a POSIX shell and utilities (e.g. Windows). | 343 # The host might not have a POSIX shell and utilities (e.g. Windows). |
| 332 solink_wrapper = rebase_path("//build/toolchain/gcc_solink_wrapper.py") | 344 solink_wrapper = rebase_path("//build/toolchain/gcc_solink_wrapper.py") |
| 333 command = "$python_path \"$solink_wrapper\" --readelf=\"$readelf\" --nm=\"
$nm\" $strip_switch --sofile=\"$unstripped_sofile\" --tocfile=\"$tocfile\" --out
put=\"$sofile\"$whitelist_flag -- $link_command" | 345 command = "$python_path \"$solink_wrapper\" --readelf=\"$readelf\" --nm=\"
$nm\" $strip_switch--sofile=\"$unstripped_sofile\" --tocfile=\"$tocfile\"$map_sw
itch --output=\"$sofile\"$whitelist_flag -- $link_command" |
| 334 | 346 |
| 335 rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whol
e-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix" | 347 rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whol
e-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix" |
| 336 | 348 |
| 337 description = "SOLINK $sofile" | 349 description = "SOLINK $sofile" |
| 338 | 350 |
| 339 # Use this for {{output_extension}} expansions unless a target manually | 351 # Use this for {{output_extension}} expansions unless a target manually |
| 340 # overrides it (in which case {{output_extension}} will be what the target | 352 # overrides it (in which case {{output_extension}} will be what the target |
| 341 # specifies). | 353 # specifies). |
| 342 default_output_extension = default_shlib_extension | 354 default_output_extension = default_shlib_extension |
| 343 | 355 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 358 outputs = [ | 370 outputs = [ |
| 359 sofile, | 371 sofile, |
| 360 tocfile, | 372 tocfile, |
| 361 ] | 373 ] |
| 362 if (enable_resource_whitelist_generation) { | 374 if (enable_resource_whitelist_generation) { |
| 363 outputs += [ whitelist_file ] | 375 outputs += [ whitelist_file ] |
| 364 } | 376 } |
| 365 if (sofile != unstripped_sofile) { | 377 if (sofile != unstripped_sofile) { |
| 366 outputs += [ unstripped_sofile ] | 378 outputs += [ unstripped_sofile ] |
| 367 } | 379 } |
| 380 if (defined(map_file)) { |
| 381 outputs += [ map_file ] |
| 382 } |
| 368 link_output = sofile | 383 link_output = sofile |
| 369 depend_output = tocfile | 384 depend_output = tocfile |
| 370 } | 385 } |
| 371 | 386 |
| 372 tool("solink_module") { | 387 tool("solink_module") { |
| 373 soname = "{{target_output_name}}{{output_extension}}" # e.g. "libfoo.so". | 388 soname = "{{target_output_name}}{{output_extension}}" # e.g. "libfoo.so". |
| 374 sofile = "{{output_dir}}/$soname" | 389 sofile = "{{output_dir}}/$soname" |
| 375 rspfile = sofile + ".rsp" | 390 rspfile = sofile + ".rsp" |
| 376 pool = "//build/toolchain:link_pool($default_toolchain)" | 391 pool = "//build/toolchain:link_pool($default_toolchain)" |
| 377 | 392 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 426 # overrides it (in which case {{output_extension}} will be what the target | 441 # overrides it (in which case {{output_extension}} will be what the target |
| 427 # specifies). | 442 # specifies). |
| 428 default_output_extension = default_executable_extension | 443 default_output_extension = default_executable_extension |
| 429 | 444 |
| 430 default_output_dir = "{{root_out_dir}}" | 445 default_output_dir = "{{root_out_dir}}" |
| 431 | 446 |
| 432 if (defined(invoker.strip)) { | 447 if (defined(invoker.strip)) { |
| 433 unstripped_outfile = "{{root_out_dir}}/exe.unstripped/$exename" | 448 unstripped_outfile = "{{root_out_dir}}/exe.unstripped/$exename" |
| 434 } | 449 } |
| 435 | 450 |
| 436 command = "$ld {{ldflags}}${extra_ldflags} -o \"$unstripped_outfile\" -Wl,
--start-group @\"$rspfile\" {{solibs}} -Wl,--end-group $libs_section_prefix {{li
bs}} $libs_section_postfix" | 451 # Generate a map file to be used for binary size analysis. |
| 452 # Map file adds ~10% to the link time on a z620. |
| 453 # With target_os="android", libchrome.so.map.gz is ~20MB. |
| 454 map_switch = "" |
| 455 if (enable_linker_map && is_official_build) { |
| 456 map_file = "$unstripped_outfile.map.gz" |
| 457 map_switch = " --map-file \"$map_file\"" |
| 458 } |
| 459 |
| 460 link_command = "$ld {{ldflags}}${extra_ldflags} -o \"$unstripped_outfile\"
-Wl,--start-group @\"$rspfile\" {{solibs}} -Wl,--end-group $libs_section_prefix
{{libs}} $libs_section_postfix" |
| 461 |
| 462 strip_switch = "" |
| 437 if (defined(invoker.strip)) { | 463 if (defined(invoker.strip)) { |
| 438 link_wrapper = | 464 strip_switch = " --strip=\"${invoker.strip}\" --unstripped-file=\"$unstr
ipped_outfile\"" |
| 439 rebase_path("//build/toolchain/gcc_link_wrapper.py", root_build_dir) | |
| 440 command = "$python_path \"$link_wrapper\" --strip=\"${invoker.strip}\" -
-unstripped-file=\"$unstripped_outfile\" --output=\"$outfile\" -- $command" | |
| 441 } | 465 } |
| 466 |
| 467 link_wrapper = |
| 468 rebase_path("//build/toolchain/gcc_link_wrapper.py", root_build_dir) |
| 469 command = "$python_path \"$link_wrapper\" --output=\"$outfile\"$strip_swit
ch$map_switch -- $link_command" |
| 442 description = "LINK $outfile" | 470 description = "LINK $outfile" |
| 443 rspfile_content = "{{inputs}}" | 471 rspfile_content = "{{inputs}}" |
| 444 outputs = [ | 472 outputs = [ |
| 445 outfile, | 473 outfile, |
| 446 ] | 474 ] |
| 447 if (outfile != unstripped_outfile) { | 475 if (outfile != unstripped_outfile) { |
| 448 outputs += [ unstripped_outfile ] | 476 outputs += [ unstripped_outfile ] |
| 449 } | 477 } |
| 450 if (defined(invoker.link_outputs)) { | 478 if (defined(invoker.link_outputs)) { |
| 451 outputs += invoker.link_outputs | 479 outputs += invoker.link_outputs |
| 452 } | 480 } |
| 481 if (defined(map_file)) { |
| 482 outputs += [ map_file ] |
| 483 } |
| 453 } | 484 } |
| 454 | 485 |
| 455 # These two are really entirely generic, but have to be repeated in | 486 # These two are really entirely generic, but have to be repeated in |
| 456 # each toolchain because GN doesn't allow a template to be used here. | 487 # each toolchain because GN doesn't allow a template to be used here. |
| 457 # See //build/toolchain/toolchain.gni for details. | 488 # See //build/toolchain/toolchain.gni for details. |
| 458 tool("stamp") { | 489 tool("stamp") { |
| 459 command = stamp_command | 490 command = stamp_command |
| 460 description = stamp_description | 491 description = stamp_description |
| 461 } | 492 } |
| 462 tool("copy") { | 493 tool("copy") { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 root_build_dir) | 535 root_build_dir) |
| 505 cxx = analyzer_wrapper + " --clang-cxx-path=${cxx} --analyzer=" + | 536 cxx = analyzer_wrapper + " --clang-cxx-path=${cxx} --analyzer=" + |
| 506 rebase_path("//third_party/scan-build/src/libexec/c++-analyzer", | 537 rebase_path("//third_party/scan-build/src/libexec/c++-analyzer", |
| 507 root_build_dir) | 538 root_build_dir) |
| 508 } | 539 } |
| 509 | 540 |
| 510 readelf = "${toolprefix}readelf" | 541 readelf = "${toolprefix}readelf" |
| 511 ar = "${toolprefix}ar" | 542 ar = "${toolprefix}ar" |
| 512 nm = "${toolprefix}nm" | 543 nm = "${toolprefix}nm" |
| 513 | 544 |
| 514 forward_variables_from(invoker, [ "strip" ]) | 545 forward_variables_from(invoker, |
| 546 [ |
| 547 "enable_linker_map", |
| 548 "strip", |
| 549 ]) |
| 515 | 550 |
| 516 toolchain_args = { | 551 toolchain_args = { |
| 517 if (defined(invoker.toolchain_args)) { | 552 if (defined(invoker.toolchain_args)) { |
| 518 forward_variables_from(invoker.toolchain_args, "*") | 553 forward_variables_from(invoker.toolchain_args, "*") |
| 519 } | 554 } |
| 520 is_clang = true | 555 is_clang = true |
| 521 } | 556 } |
| 522 } | 557 } |
| 523 } | 558 } |
| OLD | NEW |