Rust substitutions and config values
Initial support for Rust-specific substitutions and config values.
Change-Id: Iefa9c12056d9ed792ebe1fcb6822636604058747
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/4881
Commit-Queue: Julie Hockett <juliehockett@google.com>
Reviewed-by: Brett Wilson <brettw@google.com>
diff --git a/build/gen.py b/build/gen.py
index 766969f..943f2e8 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -515,6 +515,7 @@
'tools/gn/pool.cc',
'tools/gn/qt_creator_writer.cc',
'tools/gn/runtime_deps.cc',
+ 'tools/gn/rust_substitution_type.cc',
'tools/gn/scheduler.cc',
'tools/gn/scope.cc',
'tools/gn/scope_per_file_provider.cc',
diff --git a/tools/gn/config_values.cc b/tools/gn/config_values.cc
index 5cdfa7a..85de7e4 100644
--- a/tools/gn/config_values.cc
+++ b/tools/gn/config_values.cc
@@ -34,6 +34,8 @@
VectorAppend(&ldflags_, append.ldflags_);
VectorAppend(&lib_dirs_, append.lib_dirs_);
VectorAppend(&libs_, append.libs_);
+ VectorAppend(&rustflags_, append.rustflags_);
+ VectorAppend(&rustenv_, append.rustenv_);
// Only append precompiled header if there isn't one. It might be nice to
// throw an error if there are conflicting precompiled headers, but that
diff --git a/tools/gn/config_values.h b/tools/gn/config_values.h
index bcab53c..86eea6c 100644
--- a/tools/gn/config_values.h
+++ b/tools/gn/config_values.h
@@ -45,6 +45,8 @@
DIR_VALUES_ACCESSOR(include_dirs)
STRING_VALUES_ACCESSOR(ldflags)
DIR_VALUES_ACCESSOR(lib_dirs)
+ STRING_VALUES_ACCESSOR(rustflags)
+ STRING_VALUES_ACCESSOR(rustenv)
// =================================================================
// IMPORTANT: If you add a new one, be sure to update AppendValues()
// and command_desc.cc.
@@ -81,6 +83,8 @@
std::vector<std::string> ldflags_;
std::vector<SourceDir> lib_dirs_;
std::vector<LibFile> libs_;
+ std::vector<std::string> rustflags_;
+ std::vector<std::string> rustenv_;
// If you add a new one, be sure to update AppendValues().
std::string precompiled_header_;
diff --git a/tools/gn/rust_substitution_type.cc b/tools/gn/rust_substitution_type.cc
new file mode 100644
index 0000000..83ddbf5
--- /dev/null
+++ b/tools/gn/rust_substitution_type.cc
@@ -0,0 +1,47 @@
+// Copyright 2019 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/rust_substitution_type.h"
+
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "tools/gn/err.h"
+#include "tools/gn/substitution_type.h"
+
+const SubstitutionTypes RustSubstitutions = {
+ &kRustSubstitutionCrateName, &kRustSubstitutionCrateType,
+ &kRustSubstitutionEdition, &kRustSubstitutionExterns,
+ &kRustSubstitutionOutputExtension, &kRustSubstitutionOutputPrefix,
+ &kRustSubstitutionRustDeps, &kRustSubstitutionRustFlags,
+ &kRustSubstitutionRustEnv,
+};
+
+// Valid for Rust tools.
+const Substitution kRustSubstitutionCrateName = {"{{crate_name}}",
+ "crate_name"};
+const Substitution kRustSubstitutionCrateType = {"{{crate_type}}",
+ "crate_type"};
+const Substitution kRustSubstitutionEdition = {"{{edition}}", "edition"};
+const Substitution kRustSubstitutionExterns = {"{{externs}}", "externs"};
+const Substitution kRustSubstitutionOutputExtension = {
+ "{{rustc_output_extension}}", "rustc_output_extension"};
+const Substitution kRustSubstitutionOutputPrefix = {"{{rustc_output_prefix}}",
+ "rustc_output_prefix"};
+const Substitution kRustSubstitutionRustDeps = {"{{rustdeps}}", "rustdeps"};
+const Substitution kRustSubstitutionRustEnv = {"{{rustenv}}", "rustenv"};
+const Substitution kRustSubstitutionRustFlags = {"{{rustflags}}", "rustflags"};
+
+bool IsValidRustSubstitution(const Substitution* type) {
+ return IsValidToolSubstitution(type) || IsValidSourceSubstitution(type) ||
+ type == &kRustSubstitutionCrateName ||
+ type == &kRustSubstitutionCrateType ||
+ type == &kRustSubstitutionEdition ||
+ type == &kRustSubstitutionExterns ||
+ type == &kRustSubstitutionOutputExtension ||
+ type == &kRustSubstitutionOutputPrefix ||
+ type == &kRustSubstitutionRustDeps ||
+ type == &kRustSubstitutionRustEnv ||
+ type == &kRustSubstitutionRustFlags;
+}
\ No newline at end of file
diff --git a/tools/gn/rust_substitution_type.h b/tools/gn/rust_substitution_type.h
new file mode 100644
index 0000000..827f5d6
--- /dev/null
+++ b/tools/gn/rust_substitution_type.h
@@ -0,0 +1,29 @@
+// Copyright 2019 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.
+
+#ifndef TOOLS_GN_RUST_SUBSTITUTION_TYPE_H_
+#define TOOLS_GN_RUST_SUBSTITUTION_TYPE_H_
+
+#include <set>
+#include <vector>
+
+#include "tools/gn/substitution_type.h"
+
+// The set of substitutions available to Rust tools.
+extern const SubstitutionTypes RustSubstitutions;
+
+// Valid for Rust tools.
+extern const Substitution kRustSubstitutionCrateName;
+extern const Substitution kRustSubstitutionCrateType;
+extern const Substitution kRustSubstitutionEdition;
+extern const Substitution kRustSubstitutionExterns;
+extern const Substitution kRustSubstitutionOutputExtension;
+extern const Substitution kRustSubstitutionOutputPrefix;
+extern const Substitution kRustSubstitutionRustDeps;
+extern const Substitution kRustSubstitutionRustEnv;
+extern const Substitution kRustSubstitutionRustFlags;
+
+bool IsValidRustSubstitution(const Substitution* type);
+
+#endif // TOOLS_GN_RUST_SUBSTITUTION_TYPE_H_
diff --git a/tools/gn/substitution_pattern_unittest.cc b/tools/gn/substitution_pattern_unittest.cc
index 59c057f..1a6498f 100644
--- a/tools/gn/substitution_pattern_unittest.cc
+++ b/tools/gn/substitution_pattern_unittest.cc
@@ -3,7 +3,9 @@
// found in the LICENSE file.
#include "tools/gn/substitution_pattern.h"
+
#include "tools/gn/err.h"
+#include "tools/gn/rust_substitution_type.h"
#include "util/test/test.h"
TEST(SubstitutionPattern, ParseLiteral) {
@@ -47,3 +49,25 @@
EXPECT_FALSE(pattern.Parse("{{source{{source}}", nullptr, &err));
EXPECT_TRUE(err.has_error());
}
+
+TEST(SubstitutionPattern, ParseRust) {
+ SubstitutionPattern pattern;
+ Err err;
+ EXPECT_TRUE(pattern.Parse(
+ "AA{{rustflags}}{{rustenv}}BB{{crate_name}}{{rustdeps}}CC{{externs}}",
+ nullptr, &err));
+ EXPECT_FALSE(err.has_error());
+ ASSERT_EQ(8u, pattern.ranges().size());
+
+ EXPECT_EQ(&SubstitutionLiteral, pattern.ranges()[0].type);
+ EXPECT_EQ("AA", pattern.ranges()[0].literal);
+ EXPECT_EQ(&kRustSubstitutionRustFlags, pattern.ranges()[1].type);
+ EXPECT_EQ(&kRustSubstitutionRustEnv, pattern.ranges()[2].type);
+ EXPECT_EQ(&SubstitutionLiteral, pattern.ranges()[3].type);
+ EXPECT_EQ("BB", pattern.ranges()[3].literal);
+ EXPECT_EQ(&kRustSubstitutionCrateName, pattern.ranges()[4].type);
+ EXPECT_EQ(&kRustSubstitutionRustDeps, pattern.ranges()[5].type);
+ EXPECT_EQ(&SubstitutionLiteral, pattern.ranges()[6].type);
+ EXPECT_EQ("CC", pattern.ranges()[6].literal);
+ EXPECT_EQ(&kRustSubstitutionExterns, pattern.ranges()[7].type);
+}
\ No newline at end of file
diff --git a/tools/gn/substitution_type.cc b/tools/gn/substitution_type.cc
index ae680c9..6972beb 100644
--- a/tools/gn/substitution_type.cc
+++ b/tools/gn/substitution_type.cc
@@ -9,9 +9,10 @@
#include "tools/gn/c_substitution_type.h"
#include "tools/gn/err.h"
+#include "tools/gn/rust_substitution_type.h"
-const std::vector<SubstitutionTypes*> AllSubstitutions = {&GeneralSubstitutions,
- &CSubstitutions};
+const std::vector<SubstitutionTypes*> AllSubstitutions = {
+ &GeneralSubstitutions, &CSubstitutions, &RustSubstitutions};
const SubstitutionTypes GeneralSubstitutions = {
&SubstitutionLiteral,