123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- # 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 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 be 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_buildflags") {
- # header = "foo_buildflags.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_build_dir),
- "--definitions",
- "{{response_file_name}}",
- ]
- forward_variables_from(invoker,
- [
- "deps",
- "public_deps",
- "testonly",
- "visibility",
- ])
- public_deps = [ "//build:buildflag_header_h" ]
- }
- }
|