Add a target in GN that generates a last_change.h file for the SVN revision. This is GN-only so the GYP build currently sets this to 0. This adds the root generated file directory to all targets, so you can do #include "foo/bar.h" and get a generated file "bar.h" generated in directory "foo". This basically matches the internal Google build, and I use it here. BUG= R=viettrungluu@chromium.org Review URL: https://codereview.chromium.org/46003002 Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src Cr-Mirrored-Commit: 9af0b83e7ce94d9e5c61623ab76634f97374c517
diff --git a/tools/gn/BUILD.gn b/tools/gn/BUILD.gn index 6195ff3..c5cc1cb 100644 --- a/tools/gn/BUILD.gn +++ b/tools/gn/BUILD.gn
@@ -4,6 +4,10 @@ gyp_file = "gn.gyp" +# Not defined when doing a pure GYP build, this lets the code key off of +# GN-specific features (the last change target). +defines = [ "GN_BUILD" ] + static_library("gn_lib") { sources = [ "args.cc", @@ -151,9 +155,11 @@ "variables.cc", "variables.h", ] + deps = [ "//base", "//base/third_party/dynamic_annotations", + "//build/util:last_change", ] } @@ -161,6 +167,7 @@ sources = [ "gn_main.cc", ] + deps = [ ":gn_lib", ]
diff --git a/tools/gn/command_help.cc b/tools/gn/command_help.cc index 954db12..8f8611e 100644 --- a/tools/gn/command_help.cc +++ b/tools/gn/command_help.cc
@@ -51,6 +51,8 @@ "--tracelog: Writes a Chrome-compatible trace log to the given file."); PrintShortHelp( "-v: Verbose mode, print lots of logging."); + PrintShortHelp( + "--version: Print the GN binary's version and exit."); // Functions. OutputString("\nBuildfile functions (type \"gn help <function>\" for more "
diff --git a/tools/gn/gn_main.cc b/tools/gn/gn_main.cc index 9c86ab5..bfd5010 100644 --- a/tools/gn/gn_main.cc +++ b/tools/gn/gn_main.cc
@@ -8,6 +8,15 @@ #include "tools/gn/commands.h" #include "tools/gn/err.h" #include "tools/gn/location.h" +#include "tools/gn/standard_out.h" + +// Only the GN-generated build makes this header for now. +// TODO(brettw) consider adding this if we need it in GYP. +#if defined(GN_BUILD) +#include "build/util/last_change.h" +#else +#define LAST_CHANGE "UNKNOWN" +#endif namespace { @@ -39,6 +48,10 @@ if (cmdline.HasSwitch("help")) { // Make "--help" default to help command. command = commands::kHelp; + } else if (cmdline.HasSwitch("version")) { + // Make "--version" print the version and exit. + OutputString(std::string(LAST_CHANGE) + "\n"); + exit(0); } else if (args.empty()) { command = commands::kGen; } else {
diff --git a/tools/gn/secondary/build/config/compiler/BUILD.gn b/tools/gn/secondary/build/config/compiler/BUILD.gn index ef9d61f..20ffbb5 100644 --- a/tools/gn/secondary/build/config/compiler/BUILD.gn +++ b/tools/gn/secondary/build/config/compiler/BUILD.gn
@@ -4,7 +4,7 @@ # Base compiler configuration. config("compiler") { - include_dirs = [ "//" ] + include_dirs = [ "//", root_gen_dir ] if (is_win) { cflags = [ "/Gy", # Enable function-level linking.
diff --git a/tools/gn/secondary/build/util/BUILD.gn b/tools/gn/secondary/build/util/BUILD.gn new file mode 100644 index 0000000..d43cc49 --- /dev/null +++ b/tools/gn/secondary/build/util/BUILD.gn
@@ -0,0 +1,35 @@ +# Copyright (c) 2013 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. + +# This target generates a "last_change.h" header file in the generated files +# directory that contains a define of the last revision of the source tree +# of the form: +# #define LAST_CHANGE "123456" +# +# The version is a string rather than an integer for extra flexibility (for +# example, we may require git hashes in the future). +# +# All you nede to do is depend on this target, and then from your source code: +# #include "build/util/last_change.h" +custom("last_change") { + script = "//build/util/lastchange.py" + + # This script must be run before targets depending on us. + hard_dep = true + + # Rerun the script any time this file changes. + source_prereqs = [ "//build/util/LASTCHANGE" ] + + output_header = "$target_gen_dir/last_change.h" + outputs = [ output_header ] + + build_relative_src = rebase_path("//", ".", root_build_dir) + build_relative_outputs = rebase_path(output_header, ".", root_build_dir) + + args = [ + "--source-dir=$build_relative_src", + "--header=$build_relative_outputs", + "--version-macro=LAST_CHANGE", + ] +}