Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Unified Diff: tools/gn/substitution_type.cc

Issue 429423002: Refactor GN source expansions. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/gn/substitution_type.h ('k') | tools/gn/substitution_writer.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/substitution_type.cc
diff --git a/tools/gn/substitution_type.cc b/tools/gn/substitution_type.cc
new file mode 100644
index 0000000000000000000000000000000000000000..739208ac3787cef81310a43c20b04bf0087f6710
--- /dev/null
+++ b/tools/gn/substitution_type.cc
@@ -0,0 +1,149 @@
+// Copyright 2014 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.
+
+#include "tools/gn/substitution_type.h"
+
+#include <stdlib.h>
+
+#include "tools/gn/err.h"
+
+const char* kSubstitutionNames[SUBSTITUTION_NUM_TYPES] = {
+ NULL, // SUBSTITUTION_LITERAL
+
+ "{{source}}", // SUBSTITUTION_SOURCE
+ "{{source_name_part}}", // SUBSTITUTION_NAME_PART
+ "{{source_file_part}}", // SUBSTITUTION_FILE_PART
+ "{{source_dir}}", // SUBSTITUTION_SOURCE_DIR
+ "{{source_root_relative_dir}}", // SUBSTITUTION_SOURCE_ROOT_RELATIVE_DIR
+ "{{source_gen_dir}}", // SUBSTITUTION_SOURCE_GEN_DIR
+ "{{source_out_dir}}", // SUBSTITUTION_SOURCE_OUT_DIR
+
+ "{{output}}", // SUBSTITUTION_OUTPUT
+ "{{root_gen_dir}}", // SUBSTITUTION_ROOT_GEN_DIR
+ "{{root_out_dir}}", // SUBSTITUTION_ROOT_OUT_DIR
+ "{{target_gen_dir}}", // SUBSTITUTION_TARGET_GEN_DIR
+ "{{target_out_dir}}", // SUBSTITUTION_TARGET_OUT_DIR
+ "{{target_output_name}}", // SUBSTITUTION_TARGET_OUTPUT_NAME
+
+ "{{cflags}}", // SUBSTITUTION_CFLAGS
+ "{{cflags_c}}", // SUBSTITUTION_CFLAGS_C
+ "{{cflags_cc}}", // SUBSTITUTION_CFLAGS_CC
+ "{{cflags_objc}}", // SUBSTITUTION_CFLAGS_OBJC
+ "{{cflags_objcc}}", // SUBSTITUTION_CFLAGS_OBJCC
+ "{{defines}}", // SUBSTITUTION_DEFINES
+ "{{include_dirs}}", // SUBSTITUTION_INCLUDE_DIRS
+
+ "{{inputs}}", // SUBSTITUTION_LINKER_INPUTS
+ "{{ldflags}}", // SUBSTITUTION_LDFLAGS
+ "{{libs}}", // SUBSTITUTION_LIBS
+ "{{output_extension}}", // SUBSTITUTION_OUTPUT_EXTENSION
+ "{{solibs}}", // SUBSTITUTION_SOLIBS
+};
+
+const char* kSubstitutionNinjaNames[SUBSTITUTION_NUM_TYPES] = {
+ NULL, // SUBSTITUTION_LITERAL
+
+ // This isn't written by GN, the name here is referring to the Ninja variable
+ // since when we would use this would be for writing source rules.
+ "in", // SUBSTITUTION_SOURCE
+ "source_name_part", // SUBSTITUTION_NAME_PART
+ "source_file_part", // SUBSTITUTION_FILE_PART
+ "source_dir", // SUBSTITUTION_SOURCE_DIR
+ "source_root_relative_dir", // SUBSTITUTION_SOURCE_ROOT_RELATIVE_DIR
+ "source_gen_dir", // SUBSTITUTION_SOURCE_GEN_DIR
+ "source_out_dir", // SUBSTITUTION_SOURCE_OUT_DIR
+
+ "output", // SUBSTITUTION_OUTPUT
+ "root_gen_dir", // SUBSTITUTION_ROOT_GEN_DIR
+ "root_out_dir", // SUBSTITUTION_ROOT_OUT_DIR
+ "target_gen_dir", // SUBSTITUTION_TARGET_GEN_DIR
+ "target_out_dir", // SUBSTITUTION_TARGET_OUT_DIR
+ "target_output_name", // SUBSTITUTION_TARGET_OUTPUT_NAME
+
+ "cflags", // SUBSTITUTION_CFLAGS
+ "cflags_c", // SUBSTITUTION_CFLAGS_C
+ "cflags_cc", // SUBSTITUTION_CFLAGS_CC
+ "cflags_objc", // SUBSTITUTION_CFLAGS_OBJC
+ "cflags_objcc", // SUBSTITUTION_CFLAGS_OBJCC
+ "defines", // SUBSTITUTION_DEFINES
+ "include_dirs", // SUBSTITUTION_INCLUDE_DIRS
+
+ "inputs", // SUBSTITUTION_LINKER_INPUTS
+ "ldflags", // SUBSTITUTION_LDFLAGS
+ "libs", // SUBSTITUTION_LIBS
+ "output_extension", // SUBSTITUTION_OUTPUT_EXTENSION
+ "solibs", // SUBSTITUTION_SOLIBS
+};
+
+bool SubstitutionIsInOutputDir(SubstitutionType type) {
+ return type == SUBSTITUTION_SOURCE_GEN_DIR ||
+ type == SUBSTITUTION_SOURCE_OUT_DIR;
+}
+
+bool IsValidSourceSubstitution(SubstitutionType type) {
+ return type == SUBSTITUTION_SOURCE ||
+ type == SUBSTITUTION_SOURCE_NAME_PART ||
+ type == SUBSTITUTION_SOURCE_FILE_PART ||
+ type == SUBSTITUTION_SOURCE_DIR ||
+ type == SUBSTITUTION_SOURCE_ROOT_RELATIVE_DIR ||
+ type == SUBSTITUTION_SOURCE_GEN_DIR ||
+ type == SUBSTITUTION_SOURCE_OUT_DIR;
+}
+
+bool IsValidToolSubstutition(SubstitutionType type) {
+ return type == SUBSTITUTION_OUTPUT ||
+ type == SUBSTITUTION_ROOT_GEN_DIR ||
+ type == SUBSTITUTION_ROOT_OUT_DIR ||
+ type == SUBSTITUTION_TARGET_GEN_DIR ||
+ type == SUBSTITUTION_TARGET_OUT_DIR ||
+ type == SUBSTITUTION_TARGET_OUTPUT_NAME;
+}
+
+bool IsValidCompilerSubstitution(SubstitutionType type) {
+ return IsValidToolSubstutition(type) ||
+ type == SUBSTITUTION_CFLAGS ||
+ type == SUBSTITUTION_CFLAGS_C ||
+ type == SUBSTITUTION_CFLAGS_CC ||
+ type == SUBSTITUTION_CFLAGS_OBJC ||
+ type == SUBSTITUTION_CFLAGS_OBJCC ||
+ type == SUBSTITUTION_DEFINES ||
+ type == SUBSTITUTION_INCLUDE_DIRS;
+}
+
+bool IsValidCompilerOutputsSubstitution(SubstitutionType type) {
+ // All tool types except "output" (which would be infinitely recursive).
+ return IsValidToolSubstutition(type) &&
+ type != SUBSTITUTION_OUTPUT;
+}
+
+bool IsValidLinkerSubstitution(SubstitutionType type) {
+ return IsValidToolSubstutition(type) ||
+ type == SUBSTITUTION_LINKER_INPUTS ||
+ type == SUBSTITUTION_LDFLAGS ||
+ type == SUBSTITUTION_LIBS ||
+ type == SUBSTITUTION_OUTPUT_EXTENSION ||
+ type == SUBSTITUTION_SOLIBS;
+}
+
+bool IsValidLinkerOutputsSubstitution(SubstitutionType type) {
+ // All valid compiler outputs plus the output extension.
+ return IsValidCompilerOutputsSubstitution(type) ||
+ type == SUBSTITUTION_OUTPUT_EXTENSION;
+}
+
+bool EnsureValidSourcesSubstitutions(
+ const std::vector<SubstitutionType>& types,
+ const ParseNode* origin,
+ Err* err) {
+ for (size_t i = 0; i < types.size(); i++) {
+ if (!IsValidSourceSubstitution(types[i])) {
+ *err = Err(origin, "Invalid substitution type.",
+ "The substitution " + std::string(kSubstitutionNames[i]) +
+ " isn't valid for something\n"
+ "operating on a source file such as this.");
+ return false;
+ }
+ }
+ return true;
+}
« no previous file with comments | « tools/gn/substitution_type.h ('k') | tools/gn/substitution_writer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698