Refactor module name to be dynamic.
The target //foo:baz and //bar:baz will both always share a module name of "baz", which is not allowed.
This lays the groundwork to allow custom module names via the
Target->module_name() method.
Bug: chromium:465206266
Change-Id: I1e8ecf135b48cc100e3fad75ce6876866a6a6964
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/20500
Reviewed-by: Takuto Ikuta <tikuta@google.com>
Commit-Queue: Matt Stark <msta@google.com>
diff --git a/docs/reference.md b/docs/reference.md
index 1b490c7..fd24565 100644
--- a/docs/reference.md
+++ b/docs/reference.md
@@ -571,6 +571,7 @@
visibility
walk_keys
weak_frameworks
+ weak_libraries
runtime_deps
Compute all runtime deps for the given target. This is a computed list
@@ -1329,6 +1330,7 @@
Restricts output to targets which refer to input files by a specific
relation. Defaults to any relation. Can be provided multiple times to
include multiple relations.
+
```
#### **Examples (target input)**
@@ -3478,7 +3480,7 @@
Directories and names of GN labels are usually considered trustworthy.
```
-#### **Examples**
+#### **Examples**:
```
string_hash("abc") --> "90015098"
@@ -4117,6 +4119,9 @@
{{cflags_cc}}
{{cflags_objc}}
{{cflags_objcc}}
+ {{cc_module_name}}
+ The C++ module name for the current target, if one is being built.
+ This is used when compiling C++ modules.
{{defines}}
{{include_dirs}}
Strings correspond that to the processed flags/defines/include
@@ -4133,7 +4138,6 @@
modules referenced by the current target. The "_no_self" version doesn't
include the module for the current target, and can be used to compile
the pcm itself.
-
{{source}}
The relative path and name of the current input file.
Example: "../../base/my_file.cc"
diff --git a/src/gn/c_substitution_type.cc b/src/gn/c_substitution_type.cc
index b5ca3cd..2c7c8ce 100644
--- a/src/gn/c_substitution_type.cc
+++ b/src/gn/c_substitution_type.cc
@@ -21,6 +21,7 @@
&CSubstitutionIncludeDirs,
&CSubstitutionModuleDeps,
&CSubstitutionModuleDepsNoSelf,
+ &CSubstitutionModuleName,
&CSubstitutionSwiftModules,
&CSubstitutionLinkerInputs,
@@ -55,6 +56,8 @@
const Substitution CSubstitutionModuleDeps = {"{{module_deps}}", "module_deps"};
const Substitution CSubstitutionModuleDepsNoSelf = {"{{module_deps_no_self}}",
"module_deps_no_self"};
+const Substitution CSubstitutionModuleName = {"{{cc_module_name}}",
+ "cc_module_name"};
// Valid for linker tools.
const Substitution CSubstitutionLinkerInputs = {"{{inputs}}", "in"};
@@ -89,7 +92,8 @@
type == &CSubstitutionFrameworkDirs ||
type == &CSubstitutionIncludeDirs ||
type == &CSubstitutionModuleDeps ||
- type == &CSubstitutionModuleDepsNoSelf;
+ type == &CSubstitutionModuleDepsNoSelf ||
+ type == &CSubstitutionModuleName;
}
bool IsValidCompilerScriptArgsSubstitution(const Substitution* type) {
diff --git a/src/gn/c_substitution_type.h b/src/gn/c_substitution_type.h
index d0d1f8c..163be01 100644
--- a/src/gn/c_substitution_type.h
+++ b/src/gn/c_substitution_type.h
@@ -25,6 +25,7 @@
extern const Substitution CSubstitutionIncludeDirs;
extern const Substitution CSubstitutionModuleDeps;
extern const Substitution CSubstitutionModuleDepsNoSelf;
+extern const Substitution CSubstitutionModuleName;
// Valid for linker tools.
extern const Substitution CSubstitutionLinkerInputs;
diff --git a/src/gn/function_toolchain.cc b/src/gn/function_toolchain.cc
index 794351b..2f9bf57 100644
--- a/src/gn/function_toolchain.cc
+++ b/src/gn/function_toolchain.cc
@@ -672,6 +672,9 @@
{{cflags_cc}}
{{cflags_objc}}
{{cflags_objcc}}
+ {{cc_module_name}}
+ The C++ module name for the current target, if one is being built.
+ This is used when compiling C++ modules.
{{defines}}
{{include_dirs}}
Strings correspond that to the processed flags/defines/include
diff --git a/src/gn/ninja_c_binary_target_writer.cc b/src/gn/ninja_c_binary_target_writer.cc
index 4d9d6e9..c864bc0 100644
--- a/src/gn/ninja_c_binary_target_writer.cc
+++ b/src/gn/ninja_c_binary_target_writer.cc
@@ -168,6 +168,8 @@
WriteCCompilerVars(subst, /*indent=*/false,
/*respect_source_types_used=*/true);
+ WriteModuleNameSubstitution();
+
if (!module_dep_info.empty()) {
// TODO(scottmg): Currently clang modules only working for C++.
if (target_->source_types_used().Get(SourceFile::SOURCE_CPP) ||
@@ -182,6 +184,17 @@
WriteSharedVars(subst);
}
+void NinjaCBinaryTargetWriter::WriteModuleNameSubstitution() {
+ if (target_->toolchain()->substitution_bits().used.count(
+ &CSubstitutionModuleName)) {
+ out_ << CSubstitutionModuleName.ninja_name << " = ";
+ EscapeOptions options;
+ options.mode = ESCAPE_NINJA_COMMAND;
+ EscapeStringToStream(out_, target_->module_name(), options);
+ out_ << std::endl;
+ }
+}
+
void NinjaCBinaryTargetWriter::WriteModuleDepsSubstitution(
const Substitution* substitution,
const std::vector<ClangModuleDep>& module_dep_info,
diff --git a/src/gn/ninja_c_binary_target_writer.h b/src/gn/ninja_c_binary_target_writer.h
index 39e8320..3707f0e 100644
--- a/src/gn/ninja_c_binary_target_writer.h
+++ b/src/gn/ninja_c_binary_target_writer.h
@@ -34,6 +34,9 @@
const std::vector<ClangModuleDep>& module_dep_info,
bool include_self);
+ // Writes module_name substitution for clang modulemaps.
+ void WriteModuleNameSubstitution();
+
// Writes build lines required for precompiled headers. Any generated
// object files will be appended to the |object_files|. Any generated
// non-object files (for instance, .gch files from a GCC toolchain, are
diff --git a/src/gn/ninja_c_binary_target_writer_unittest.cc b/src/gn/ninja_c_binary_target_writer_unittest.cc
index 97ddad0..2072142 100644
--- a/src/gn/ninja_c_binary_target_writer_unittest.cc
+++ b/src/gn/ninja_c_binary_target_writer_unittest.cc
@@ -2532,7 +2532,7 @@
Tool::CreateTool(CTool::kCToolCxxModule);
TestWithScope::SetCommandForTool(
"c++ {{source}} {{cflags}} {{cflags_cc}} {{module_deps_no_self}} "
- "{{defines}} {{include_dirs}} -fmodule-name={{label}} -c -x c++ "
+ "{{defines}} {{include_dirs}} -fmodule-name={{cc_module_name}} -c -x c++ "
"-Xclang -emit-module -o {{output}}",
cxx_module_tool.get());
cxx_module_tool->set_outputs(SubstitutionList::MakeForTest(
@@ -2584,9 +2584,9 @@
include_dirs =
cflags =
cflags_cc =
+cc_module_name = a
module_deps = -fmodule-file=a=obj/blah/liba.a.pcm
module_deps_no_self =
-label = //blah$:a
root_out_dir = withmodules
target_out_dir = obj/blah
target_output_name = liba
@@ -2630,9 +2630,9 @@
include_dirs =
cflags =
cflags_cc =
+cc_module_name = b
module_deps = -fmodule-file=a=obj/blah/liba.a.pcm -fmodule-file=b=obj/stuff/libb.b.pcm
module_deps_no_self = -fmodule-file=a=obj/blah/liba.a.pcm
-label = //stuff$:b
root_out_dir = withmodules
target_out_dir = obj/stuff
target_output_name = libb
@@ -2674,9 +2674,9 @@
include_dirs =
cflags =
cflags_cc =
+cc_module_name = c
module_deps = -fmodule-file=a=obj/blah/liba.a.pcm -fmodule-file=b=obj/stuff/libb.b.pcm -fmodule-file=c=obj/stuff/libc.c.pcm
module_deps_no_self = -fmodule-file=a=obj/blah/liba.a.pcm -fmodule-file=b=obj/stuff/libb.b.pcm
-label = //things$:c
root_out_dir = withmodules
target_out_dir = obj/things
target_output_name = libc
@@ -2714,9 +2714,9 @@
include_dirs =
cflags =
cflags_cc =
+cc_module_name = c
module_deps = -fmodule-file=a=obj/blah/liba.a.pcm -fmodule-file=b=obj/stuff/libb.b.pcm
module_deps_no_self = -fmodule-file=a=obj/blah/liba.a.pcm -fmodule-file=b=obj/stuff/libb.b.pcm
-label = //zap$:c
root_out_dir = withmodules
target_out_dir = obj/zap
target_output_name = c
diff --git a/src/gn/ninja_module_writer_util.cc b/src/gn/ninja_module_writer_util.cc
index 168895f..67b40eb 100644
--- a/src/gn/ninja_module_writer_util.cc
+++ b/src/gn/ninja_module_writer_util.cc
@@ -55,7 +55,7 @@
if (added_pcms.insert(pcm_file).second) {
// GN sets the module name to the name of the target.
- ret.emplace_back(modulemap, t->label().name(), pcm_file, is_self);
+ ret.emplace_back(modulemap, t->module_name(), pcm_file, is_self);
}
};
diff --git a/src/gn/ninja_module_writer_util.h b/src/gn/ninja_module_writer_util.h
index 19a6444..f6d007b 100644
--- a/src/gn/ninja_module_writer_util.h
+++ b/src/gn/ninja_module_writer_util.h
@@ -23,7 +23,7 @@
// The input module.modulemap source file.
const SourceFile* modulemap;
- // The internal module name, in GN this is the target's label.
+ // The internal module name.
std::string module_name;
// The compiled version of the module.
diff --git a/src/gn/target.h b/src/gn/target.h
index 4b0bed9..63a52ee 100644
--- a/src/gn/target.h
+++ b/src/gn/target.h
@@ -410,6 +410,9 @@
return runtime_outputs_;
}
+ // The module name for the target.
+ std::string module_name() const { return label().name(); }
+
// Computes and returns the outputs of this target expressed as SourceFiles.
//
// For binary target this depends on the tool for this target so the toolchain