Add a `module_name` flag to source_set. This overrides the default module name, allowing you to have targets //foo:baz and //bar:baz not clash on their module names. Fixed: chromium:465206266 Change-Id: Ibb916df2889a2294b181acb9d35710576a6a6964 Reviewed-on: https://gn-review.googlesource.com/c/gn/+/20502 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 fd24565..d5dfa0f 100644 --- a/docs/reference.md +++ b/docs/reference.md
@@ -4138,6 +4138,7 @@ 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" @@ -6270,7 +6271,7 @@ ### <a name="var_module_name"></a>**module_name**: [string] The name for the compiled module. [Back to Top](#gn-reference) ``` - Valid for binary targets that contain Swift sources. + Valid for binary targets that contain Swift sources, and for C++ modules. If module_name is not set, then this rule will use the target name. ```
diff --git a/src/gn/binary_target_generator.cc b/src/gn/binary_target_generator.cc index a738dc9..1517734 100644 --- a/src/gn/binary_target_generator.cc +++ b/src/gn/binary_target_generator.cc
@@ -70,6 +70,9 @@ if (!ValidateSources()) return; + if (!FillModuleName()) + return; + if (target_->source_types_used().RustSourceUsed()) { RustValuesGenerator rustgen(target_, scope_, function_call_, err_); rustgen.Run(); @@ -271,3 +274,13 @@ } return true; } + +bool BinaryTargetGenerator::FillModuleName() { + const Value* value = scope_->GetValue(variables::kModuleName, true); + if (!value) + return true; + if (!value->VerifyTypeIs(Value::STRING, err_)) + return false; + target_->set_module_name(value->string_value()); + return true; +}
diff --git a/src/gn/binary_target_generator.h b/src/gn/binary_target_generator.h index 0bafd68..b6d4c2e 100644 --- a/src/gn/binary_target_generator.h +++ b/src/gn/binary_target_generator.h
@@ -32,6 +32,7 @@ bool FillAllowCircularIncludesFrom(); bool FillPool(); bool ValidateSources(); + bool FillModuleName(); Target::OutputType output_type_;
diff --git a/src/gn/ninja_c_binary_target_writer_unittest.cc b/src/gn/ninja_c_binary_target_writer_unittest.cc index 2072142..f324d53 100644 --- a/src/gn/ninja_c_binary_target_writer_unittest.cc +++ b/src/gn/ninja_c_binary_target_writer_unittest.cc
@@ -2565,6 +2565,7 @@ Target target(&module_settings, Label(SourceDir("//blah/"), "a")); target.set_output_type(Target::STATIC_LIBRARY); + target.set_module_name("blah_a"); target.visibility().SetPublic(); target.sources().push_back(SourceFile("//blah/a.modulemap")); target.sources().push_back(SourceFile("//blah/a.cc")); @@ -2584,8 +2585,8 @@ include_dirs = cflags = cflags_cc = -cc_module_name = a -module_deps = -fmodule-file=a=obj/blah/liba.a.pcm +cc_module_name = blah_a +module_deps = -fmodule-file=blah_a=obj/blah/liba.a.pcm module_deps_no_self = root_out_dir = withmodules target_out_dir = obj/blah @@ -2631,8 +2632,8 @@ 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 +module_deps = -fmodule-file=blah_a=obj/blah/liba.a.pcm -fmodule-file=b=obj/stuff/libb.b.pcm +module_deps_no_self = -fmodule-file=blah_a=obj/blah/liba.a.pcm root_out_dir = withmodules target_out_dir = obj/stuff target_output_name = libb @@ -2675,8 +2676,8 @@ 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 +module_deps = -fmodule-file=blah_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=blah_a=obj/blah/liba.a.pcm -fmodule-file=b=obj/stuff/libb.b.pcm root_out_dir = withmodules target_out_dir = obj/things target_output_name = libc @@ -2715,8 +2716,8 @@ 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 +module_deps = -fmodule-file=blah_a=obj/blah/liba.a.pcm -fmodule-file=b=obj/stuff/libb.b.pcm +module_deps_no_self = -fmodule-file=blah_a=obj/blah/liba.a.pcm -fmodule-file=b=obj/stuff/libb.b.pcm root_out_dir = withmodules target_out_dir = obj/zap target_output_name = c
diff --git a/src/gn/target.h b/src/gn/target.h index 63a52ee..c8c4933 100644 --- a/src/gn/target.h +++ b/src/gn/target.h
@@ -7,6 +7,7 @@ #include <set> #include <string> +#include <utility> #include <vector> #include "base/gtest_prod_util.h" @@ -411,7 +412,13 @@ } // The module name for the target. - std::string module_name() const { return label().name(); } + std::string module_name() const { + return module_name_override_.empty() ? label().name() + : module_name_override_; + } + void set_module_name(std::string module_name) { + module_name_override_ = std::move(module_name); + } // Computes and returns the outputs of this target expressed as SourceFiles. // @@ -500,6 +507,8 @@ std::string output_extension_; bool output_extension_set_ = false; + std::string module_name_override_; + FileList sources_; SourceFileTypeSet source_types_used_; bool all_headers_public_ = true;
diff --git a/src/gn/variables.cc b/src/gn/variables.cc index 2c6f8e4..4573279 100644 --- a/src/gn/variables.cc +++ b/src/gn/variables.cc
@@ -1476,6 +1476,17 @@ } )"; +const char kModuleName[] = "module_name"; +const char kModuleName_HelpShort[] = + "module_name: [string] The name for the compiled module."; +const char kModuleName_Help[] = + R"(module_name: [string] The name for the compiled module. + + Valid for binary targets that contain Swift sources, and for C++ modules. + + If module_name is not set, then this rule will use the target name. +)"; + const char kOutputExtension[] = "output_extension"; const char kOutputExtension_HelpShort[] = "output_extension: [string] Value to use for the output's file extension."; @@ -2450,6 +2461,7 @@ INSERT_VARIABLE(Libs) INSERT_VARIABLE(LibDirs) INSERT_VARIABLE(Metadata) + INSERT_VARIABLE(ModuleName) INSERT_VARIABLE(OutputDir) INSERT_VARIABLE(OutputExtension) INSERT_VARIABLE(OutputName)
diff --git a/src/gn/variables.h b/src/gn/variables.h index 1f3c7fe..2d46db4 100644 --- a/src/gn/variables.h +++ b/src/gn/variables.h
@@ -230,6 +230,10 @@ extern const char kMetadata_HelpShort[]; extern const char kMetadata_Help[]; +extern const char kModuleName[]; +extern const char kModuleName_HelpShort[]; +extern const char kModuleName_Help[]; + extern const char kOutputDir[]; extern const char kOutputDir_HelpShort[]; extern const char kOutputDir_Help[];