Index: build/toolchain/gcc_toolchain.gni |
diff --git a/build/toolchain/gcc_toolchain.gni b/build/toolchain/gcc_toolchain.gni |
index 14a66e40f2771860589c1a828c56fbc98976f301..bb3846c3bb6bd817cd9b00ab770142c909203ca6 100644 |
--- a/build/toolchain/gcc_toolchain.gni |
+++ b/build/toolchain/gcc_toolchain.gni |
@@ -30,13 +30,34 @@ concurrent_links = exec_script("get_concurrent_links.py", [], "value") |
# - solink_libs_section_prefix |
# - solink_libs_section_postfix |
# Same as libs_section_{pre,post}fix except used for solink instead of link. |
-# - post_solink |
-# The content of this string, if specified, will be appended to the solink |
-# command. |
+# - link_outputs |
+# The content of this array, if specified, will be added to the list of |
+# outputs from the link command. This can be useful in conjunction with |
+# the post_link parameter. |
+# - post_link |
+# The content of this string, if specified, will be run as a separate |
+# command following the the link command. |
# - deps |
# Just forwarded to the toolchain definition. |
+# - executable_extension |
+# If this string is specified it will be used for the file extension |
+# for an executable, rather than using no extension; targets will |
+# still be able to override the extension using the output_extension |
+# variable. |
# - is_clang |
# Whether to use clang instead of gcc. |
+# - is_component_build |
+# Whether to forcibly enable or disable component builds for this |
+# toolchain; if not specified, the toolchain will inherit the |
+# default setting. |
+# - rebuild_define |
+# The contents of this string, if specified, will be passed as a #define |
+# to the toolchain. It can be used to force recompiles whenever a |
+# toolchain is updated. |
+# - shlib_extension |
+# If this string is specified it will be used for the file extension |
+# for a shared library, rather than default value specified in |
+# toolchain.gni |
# - strip |
# Location of the strip executable. When specified, strip will be run on |
# all shared libraries and executables as they are built. The pre-stripped |
@@ -52,6 +73,14 @@ template("gcc_toolchain") { |
assert(defined(invoker.toolchain_os), |
"gcc_toolchain() must specify a \"toolchain_os\"") |
+ # This define changes when the toolchain changes, forcing a rebuild. |
+ # Nothing should ever use this define. |
+ if (defined(invoker.rebuild_define)) { |
+ rebuild_string = "-D" + invoker.rebuild_define + " " |
+ } else { |
+ rebuild_string = "" |
+ } |
+ |
# We can't do string interpolation ($ in strings) on things with dots in |
# them. To allow us to use $cc below, for example, we create copies of |
# these values in our scope. |
@@ -70,6 +99,18 @@ template("gcc_toolchain") { |
nm = "nm" |
} |
+ if (defined(invoker.shlib_extension)) { |
+ default_shlib_extension = invoker.shlib_extension |
+ } else { |
+ default_shlib_extension = shlib_extension |
+ } |
+ |
+ if (defined(invoker.executable_extension)) { |
+ default_executable_extension = invoker.executable_extension |
+ } else { |
+ default_executable_extension = "" |
+ } |
+ |
# Bring these into our scope for string interpolation with default values. |
if (defined(invoker.libs_section_prefix)) { |
libs_section_prefix = invoker.libs_section_prefix |
@@ -101,7 +142,7 @@ template("gcc_toolchain") { |
tool("cc") { |
depfile = "{{output}}.d" |
- command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}" |
+ command = "$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}" |
depsformat = "gcc" |
description = "CC {{output}}" |
outputs = [ |
@@ -111,7 +152,7 @@ template("gcc_toolchain") { |
tool("cxx") { |
depfile = "{{output}}.d" |
- command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}" |
+ command = "$cxx -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}" |
depsformat = "gcc" |
description = "CXX {{output}}" |
outputs = [ |
@@ -122,7 +163,7 @@ template("gcc_toolchain") { |
tool("asm") { |
# For GCC we can just use the C compiler to compile assembly. |
depfile = "{{output}}.d" |
- command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}" |
+ command = "$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}" |
depsformat = "gcc" |
description = "ASM {{output}}" |
outputs = [ |
@@ -181,10 +222,7 @@ template("gcc_toolchain") { |
# Use this for {{output_extension}} expansions unless a target manually |
# overrides it (in which case {{output_extension}} will be what the target |
# specifies). |
- default_output_extension = shlib_extension |
- if (defined(invoker.default_output_extension)) { |
- default_output_extension = invoker.default_output_extension |
- } |
+ default_output_extension = default_shlib_extension |
output_prefix = "lib" |
@@ -211,6 +249,12 @@ template("gcc_toolchain") { |
outfile = "{{root_out_dir}}/$exename" |
rspfile = "$outfile.rsp" |
unstripped_outfile = outfile |
+ |
+ # Use this for {{output_extension}} expansions unless a target manually |
+ # overrides it (in which case {{output_extension}} will be what the target |
+ # specifies). |
+ default_output_extension = default_executable_extension |
+ |
if (defined(invoker.strip)) { |
unstripped_outfile = "{{root_out_dir}}/exe.unstripped/$exename" |
} |
@@ -221,6 +265,9 @@ template("gcc_toolchain") { |
"${invoker.strip} --strip-unneeded -o $outfile $unstripped_outfile" |
command += " && " + strip_command |
} |
+ if (defined(invoker.postlink)) { |
+ command += " && " + invoker.postlink |
+ } |
description = "LINK $outfile" |
rspfile_content = "{{inputs}}" |
outputs = [ |
@@ -229,6 +276,9 @@ template("gcc_toolchain") { |
if (outfile != unstripped_outfile) { |
outputs += [ unstripped_outfile ] |
} |
+ if (defined(invoker.link_outputs)) { |
+ outputs += invoker.link_outputs |
+ } |
} |
tool("stamp") { |
@@ -254,6 +304,9 @@ template("gcc_toolchain") { |
if (defined(invoker.is_clang)) { |
is_clang = invoker.is_clang |
} |
+ if (defined(invoker.is_component_build)) { |
+ is_component_build = invoker.is_component_build |
+ } |
} |
if (defined(invoker.deps)) { |