Index: build/buildflag_header.gni |
diff --git a/build/buildflag_header.gni b/build/buildflag_header.gni |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9054d07237d281cfc96a3919bcb71f518c03e4af |
--- /dev/null |
+++ b/build/buildflag_header.gni |
@@ -0,0 +1,138 @@ |
+# Copyright 2015 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+# Generates a header with preprocessor defines specified by the build file. |
+# The GYP version of this (with instructions) is build/buildflag_header.gypi. |
+# |
+# The flags are converted to function-style defines with mangled names and |
+# code uses an accessor macro to access the values. This is to try to |
+# minimize bugs where code checks whether something is defined or not, and |
+# the proper header isn't included, meaning the answer will always be silently |
+# false or might vary across the code base. |
+# |
+# In the GN template, specify build flags in the template as a list |
+# of strings that encode key/value pairs like this: |
+# |
+# flags = [ "ENABLE_FOO=1", "ENABLE_BAR=$enable_bar" ] |
+# |
+# The GN values "true" and "false" will be mapped to 0 and 1 for boolean |
+# #if flags to be expressed naturally. This means you can't directly make a |
+# define that generates C++ value of true or false for use in code. If you |
+# REALLY need this, you can also use the string "(true)" and "(false)" to |
+# prevent the rewriting. |
+ |
+# To check the value of the flag in C code: |
+# |
+# #include "path/to/here/header_file.h" |
+# |
+# #if BUILDFLAG(ENABLE_FOO) |
+# ... |
+# #endif |
+# |
+# const char kSpamServerUrl[] = BUILDFLAG(SPAM_SERVER_URL); |
+# |
+# There will no #define called ENABLE_FOO so if you accidentally test for that |
+# in an ifdef it will always be negative. |
+# |
+# |
+# Template parameters |
+# |
+# flags [required, list of strings] |
+# Flag values as described above. |
+# |
+# header [required, string] |
+# File name for generated header. By default, this will go in the |
+# generated file directory for this target, and you would include it |
+# with: |
+# #include "<path_to_this_BUILD_file>/<header>" |
+# |
+# header_dir [optional, string] |
+# Override the default location of the generated header. The string will |
+# be treated as a subdirectory of the root_gen_dir. For example: |
+# header_dir = "foo/bar" |
+# Then you can include the header as: |
+# #include "foo/bar/baz.h" |
+# |
+# deps, public_deps, testonly, visibility |
+# Normal meaning. |
+# |
+# |
+# Grit defines |
+# |
+# If one .grd file uses a flag, just add to the grit target: |
+# |
+# defines = [ |
+# "enable_doom_melon=$enable_doom_melon", |
+# ] |
+# |
+# If multiple .grd files use it, you'll want to put the defines in a .gni file |
+# so it can be shared. Generally this .gni file should include all grit defines |
+# for a given module (for some definition of "module"). Then do: |
+# |
+# defines = ui_grit_defines |
+# |
+# If you forget to do this, the flag will be implicitly false in the .grd file |
+# and those resources won't be compiled. You'll know because the resource |
+# #define won't be generated and any code that uses it won't compile. If you |
+# see a missing IDS_* string, this is probably the reason. |
+# |
+# |
+# Example |
+# |
+# buildflag_header("foo_features") { |
+# header = "foo_features.h" |
+# |
+# flags = [ |
+# # This uses the GN build flag enable_doom_melon as the definition. |
+# "ENABLE_DOOM_MELON=$enable_doom_melon", |
+# |
+# # This force-enables the flag. |
+# "ENABLE_SPACE_LASER=true", |
+# |
+# # This will expand to the quoted C string when used in source code. |
+# "SPAM_SERVER_URL=\"http://www.example.com/\"", |
+# ] |
+# } |
+template("buildflag_header") { |
+ action(target_name) { |
+ script = "//build/write_buildflag_header.py" |
+ |
+ if (defined(invoker.header_dir)) { |
+ header_file = "${invoker.header_dir}/${invoker.header}" |
+ } else { |
+ # Compute the path from the root to this file. |
+ header_file = rebase_path(".", "//") + "/${invoker.header}" |
+ } |
+ |
+ outputs = [ |
+ "$root_gen_dir/$header_file", |
+ ] |
+ |
+ # Always write --flags to the file so it's not empty. Empty will confuse GN |
+ # into thinking the response file isn't used. |
+ response_file_contents = [ "--flags" ] |
+ if (defined(invoker.flags)) { |
+ response_file_contents += invoker.flags |
+ } |
+ |
+ args = [ |
+ "--output", |
+ header_file, # Not rebased, Python script puts it inside gen-dir. |
+ "--rulename", |
+ get_label_info(":$target_name", "label_no_toolchain"), |
+ "--gen-dir", |
+ rebase_path(root_gen_dir, root_out_dir), |
+ "--definitions", |
+ "{{response_file_name}}", |
+ ] |
+ |
+ forward_variables_from(invoker, |
+ [ |
+ "deps", |
+ "public_deps", |
+ "testonly", |
+ "visibility", |
+ ]) |
+ } |
+} |