# 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 canonical documentation is in build/buildflag_header.gni. You should # write the GN build, get it working, and then transform it into GYP. # # In every target that uses your generated header you must include a dependency # on the GYP target that generates the header (this is implicit in GN). # Otherwise, clean builds may not necessarily create the header before the # source code is compiled. # # Assuming your GN code looks like this: # # buildflag_header("foo_features") { # header = "foo_features.h" # flags = [ # "ENABLE_DOOM_MELON=$enable_doom_melon", # "ENABLE_SPACE_LASER=true", # "SPAM_SERVER_URL=\"http://www.example.com/\"", # ] # } # # Write a GYP target like this: # # { # # GN version: //foo:foo_features # 'target_name': 'foo_foo_features', # 'includes': [ '../build/buildflag_header.gypi' ], # 'variables': { # 'buildflag_header_path': 'foo/foo_features.h', # 'buildflag_flags': [ # 'ENABLE_DOOM_MELON=<(enable_doom_melon)', # 'ENABLE_SPACE_LASER=true', # 'SPAM_SERVER_URL="http://www.example.com/"', # ], # }, # } # # Variables # # target_name # Base this on the GN label, replacing / and : with _ to make it globally # unique. # # buildflag_header_path # This must be the full path to the header from the source root. In GN # you only say "features.h" and it uses the BUILD file's path implicitly. # Use the path to BUILD.gn followed by your header name to produce the # same output file. # # buildflag_flags (optional) # List of the same format as GN's "flags". To expand variables, use # "<(foo)" where GN would have used "$foo". # # includes # List the relative path to build/buildflag_header.gypi from the .gyp # file including this code, Note: If your code is in a .gypi file in a # different directory, this must be relative to the .gyp including your # file. # # # Grit defines # # Follow the same advice as in the buildflag_header.gni, except on the grit # action use the variable name 'grit_additional_defines' and explicitly add a # '-D' in front: # # 'grit_grd_file': 'foo.grd', # 'grit_additional_defines': [ # '-D', 'enable_doom_melon=<(enable_doom_melon)', # ], # # Put shared lists of defines in a .gypi. { 'type': 'none', 'hard_dependency': 1, 'actions': [ { 'action_name': 'buildflag_header', 'variables': { # Default these values to empty if they're not defined. 'variables': { 'buildflag_flags%': [], }, # Writes the flags to a response file with a name based on the name of # this target. 'response_file_name': '<|(<(_target_name)_buildflag_header.rsp --flags <@(buildflag_flags))', 'build_header_script': '<(DEPTH)/build/write_buildflag_header.py', }, 'message': 'Generating build header.', 'inputs': [ '<(build_header_script)', '<(response_file_name)', ], 'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/<(buildflag_header_path)', ], 'action': [ 'python', '<(build_header_script)', '--output', '<(buildflag_header_path)', '--rulename', '<(_target_name)', '--gen-dir', '<(SHARED_INTERMEDIATE_DIR)', '--definitions', '<(response_file_name)', ], } ], # Allow the file to be included based on the given buildflag_header_path. 'direct_dependent_settings': { 'include_dirs': [ '<(SHARED_INTERMEDIATE_DIR)' ], }, }