Fix C++20 module compilation The merge of C++20 module support in 5c3e987e81a1331714014fc133664e1f7a7582f9 wasn't covered by tests and requires a number of fixes so that the test case in Bazel's `cc_integration_test` can pass. Closes #511 COPYBARA_INTEGRATE_REVIEW=https://github.com/bazelbuild/rules_cc/pull/511 from fmeum:c++20-modules 716b9bea37fc6aead69cb6fb812826f192611d71 PiperOrigin-RevId: 827424640 Change-Id: Iff433f2a9ec0b8ad9585805f7df7a86297731b92
diff --git a/cc/common/cc_helper_internal.bzl b/cc/common/cc_helper_internal.bzl index 968aac0..946b160 100644 --- a/cc/common/cc_helper_internal.bzl +++ b/cc/common/cc_helper_internal.bzl
@@ -180,9 +180,7 @@ _ArtifactCategoryInfo("SERIALIZED_DIAGNOSTICS_FILE", "", ".dia"), _ArtifactCategoryInfo("OBJECT_FILE", "", ".o", ".obj"), _ArtifactCategoryInfo("PIC_OBJECT_FILE", "", ".pic.o"), - _ArtifactCategoryInfo("CPP_MODULE", "", ".pcm"), - _ArtifactCategoryInfo("CPP_MODULE_GCM", "", ".gcm"), - _ArtifactCategoryInfo("CPP_MODULE_IFC", "", ".ifc"), + _ArtifactCategoryInfo("CPP_MODULE", "", ".pcm", ".gcm", ".ifc"), _ArtifactCategoryInfo("CPP_MODULES_INFO", "", ".CXXModules.json"), _ArtifactCategoryInfo("CPP_MODULES_DDI", "", ".ddi"), _ArtifactCategoryInfo("CPP_MODULES_MODMAP", "", ".modmap"),
diff --git a/cc/private/cc_info.bzl b/cc/private/cc_info.bzl index 1703406..5ab8d73 100644 --- a/cc/private/cc_info.bzl +++ b/cc/private/cc_info.bzl
@@ -54,6 +54,10 @@ "_transitive_pic_modules": "Internal", "_module_map": "Internal", "_virtual_to_original_headers": "Internal", + "_modules_info_files": "Internal", + "_pic_modules_info_files": "Internal", + "_module_files": "Internal", + "_pic_module_files": "Internal", # duplicated HeaderInfo fields "direct_headers": "Returns the list of modular headers that are declared by this target. " + "This includes both public headers (such as those listed in \"hdrs\") " + @@ -122,6 +126,10 @@ _transitive_modules = depset(), _transitive_pic_modules = depset(), _direct_module_maps = depset(), + _modules_info_files = depset(), + _pic_modules_info_files = depset(), + _module_files = depset(), + _pic_module_files = depset(), _header_info = _cc_internal.create_header_info(), ) @@ -366,6 +374,10 @@ _transitive_pic_modules = depset(), _direct_module_maps = depset(), _header_info = header_info, + _modules_info_files = depset(), + _pic_modules_info_files = depset(), + _module_files = depset(), + _pic_module_files = depset(), ) return _merge_compilation_contexts( @@ -485,6 +497,18 @@ transitive_pic_modules_artifacts, transitive = [dep._transitive_pic_modules for dep in all_deps], ), + _modules_info_files = depset( + transitive = [compilation_context._modules_info_files] + [dep._modules_info_files for dep in all_deps], + ), + _pic_modules_info_files = depset( + transitive = [compilation_context._pic_modules_info_files] + [dep._pic_modules_info_files for dep in all_deps], + ), + _module_files = depset( + transitive = [compilation_context._module_files] + [dep._module_files for dep in all_deps], + ), + _pic_module_files = depset( + transitive = [compilation_context._pic_module_files] + [dep._pic_module_files for dep in all_deps], + ), ) def merge_compilation_contexts(*, compilation_contexts = []): @@ -536,6 +560,10 @@ _transitive_pic_modules = cc_compilation_context._transitive_pic_modules, _direct_module_maps = cc_compilation_context._direct_module_maps, _header_info = cc_compilation_context._header_info, + _modules_info_files = cc_compilation_context._modules_info_files, + _pic_modules_info_files = cc_compilation_context._pic_modules_info_files, + _module_files = cc_compilation_context._module_files, + _pic_module_files = cc_compilation_context._pic_module_files, ) def create_cc_compilation_context_with_cpp20_modules( @@ -583,8 +611,8 @@ _header_info = cc_compilation_context._header_info, _module_files = depset(cpp_module_files, transitive = [cc_compilation_context._module_files]), _pic_module_files = depset(pic_cpp_module_files, transitive = [cc_compilation_context._pic_module_files]), - _module_info_files = depset(cpp_modules_info_file, transitive = [cc_compilation_context._module_info_files]), - _pic_module_info_files = depset(pic_cpp_modules_info_file, transitive = [cc_compilation_context._pic_module_info_files]), + _modules_info_files = depset([cpp_modules_info_file], transitive = [cc_compilation_context._modules_info_files]), + _pic_modules_info_files = depset([pic_cpp_modules_info_file], transitive = [cc_compilation_context._pic_modules_info_files]), ) def merge_cc_infos(*, direct_cc_infos = [], cc_infos = []):
diff --git a/cc/private/compile/compile.bzl b/cc/private/compile/compile.bzl index 6ff5524..95ecb13 100644 --- a/cc/private/compile/compile.bzl +++ b/cc/private/compile/compile.bzl
@@ -30,7 +30,12 @@ artifact_category = "artifact_category_names", ) load("//cc/common:semantics.bzl", _starlark_cc_semantics = "semantics") -load("//cc/private:cc_info.bzl", "create_compilation_context_with_extra_header_tokens", "create_separate_module_map") +load( + "//cc/private:cc_info.bzl", + "create_cc_compilation_context_with_cpp20_modules", + "create_compilation_context_with_extra_header_tokens", + "create_separate_module_map", +) load("//cc/private:cc_internal.bzl", _cc_internal = "cc_internal") load("//cc/private/compile:cc_compilation_helper.bzl", "cc_compilation_helper", "dotd_files_enabled", "serialized_diagnostics_file_enabled") load("//cc/private/compile:cc_compilation_outputs.bzl", "create_compilation_outputs_internal") @@ -43,7 +48,6 @@ "setup_common_compile_build_variables", ) load("//cc/private/compile:lto_compilation_context.bzl", "create_lto_compilation_context") -load("//cc/private/rules_impl:native.bzl", _cc_common_internal = "native_cc_common") _VALID_CPP_SOURCE_TYPES = set([CPP_SOURCE_TYPE_SOURCE, CPP_SOURCE_TYPE_HEADER, CPP_SOURCE_TYPE_CLIF_INPUT_PROTO]) @@ -390,7 +394,7 @@ ) compilation_outputs = create_compilation_outputs_internal(**compilation_outputs_dict) if feature_configuration.is_enabled("cpp_modules"): - public_compilation_context = _cc_internal.create_cc_compilation_context_with_cpp20_modules( + public_compilation_context = create_cc_compilation_context_with_cpp20_modules( cc_compilation_context = public_compilation_context, cpp_module_files = compilation_outputs.cpp_module_files, pic_cpp_module_files = compilation_outputs.pic_cpp_module_files, @@ -520,7 +524,6 @@ label, common_toolchain_variables, language, - native_cc_semantics, source_artifact, source_label, use_pic, @@ -528,7 +531,7 @@ ddi_output_name): dotd_file = None if ( - dotd_files_enabled(native_cc_semantics, configuration, feature_configuration) and + dotd_files_enabled(language, cpp_configuration, feature_configuration) and _use_dotd_file(feature_configuration, source_artifact) ): dotd_file = _get_compile_output_file( @@ -563,20 +566,20 @@ common_toolchain_variables, specific_compile_build_variables, ) - _cc_internal.create_cpp_compile_action( + _cc_internal.create_cc_compile_action( action_construction_context = action_construction_context, cc_compilation_context = cc_compilation_context, cc_toolchain = cc_toolchain, configuration = configuration, copts_filter = copts_filter, feature_configuration = feature_configuration, - cpp_semantics = native_cc_semantics, - source_artifact = source_artifact, + source = source_artifact, additional_compilation_inputs = additional_compilation_inputs, output_file = ddi_file, dotd_file = dotd_file, compile_build_variables = compile_variables, action_name = ACTION_NAMES.cpp_module_deps_scanning, + toolchain_type = _starlark_cc_semantics.toolchain, ) def _create_aggregate_ddi_action( @@ -683,7 +686,6 @@ else: outputs["cpp_modules_info_file"] = modules_info_file - native_cc_semantics = _cc_common_internal.get_cpp_semantics(language = language) for cpp_source in module_interfaces_sources.values(): source_artifact = cpp_source.file output_name = output_name_map[source_artifact] @@ -741,7 +743,6 @@ label = label, common_toolchain_variables = common_compile_build_variables, language = language, - native_cc_semantics = native_cc_semantics, source_artifact = source_artifact, source_label = source_label, use_pic = use_pic, @@ -825,7 +826,6 @@ feature_configuration = feature_configuration, configuration = configuration, cpp_configuration = cpp_configuration, - cpp_semantics = native_cc_semantics, language = language, conlyopts = conlyopts, copts = copts, @@ -925,7 +925,6 @@ label = label, common_toolchain_variables = common_compile_build_variables, language = language, - native_cc_semantics = native_cc_semantics, source_artifact = source_artifact, source_label = source_label, use_pic = use_pic, @@ -974,7 +973,6 @@ feature_configuration = feature_configuration, configuration = configuration, cpp_configuration = cpp_configuration, - cpp_semantics = native_cc_semantics, language = language, conlyopts = conlyopts, copts = copts, @@ -1541,25 +1539,8 @@ category = artifact_category.PIC_FILE, output_name = output_name, ) - cpp20_module_compile_enabled = False - if not action_name: - if output_category == artifact_category.CPP_MODULE: - action_name = "c++-module-compile" - cpp20_module_compile_enabled = True - else: - ext = "." + source_artifact.extension - if ext in extensions.C_SOURCE: - action_name = "c-compile" - elif ext in extensions.OBJC_SOURCE: - action_name = "objc-compile" - elif ext in extensions.OBJCPP_SOURCE: - action_name = "objc++-compile" - elif ext in extensions.ASSESMBLER_WITH_C_PREPROCESSOR: - action_name = "preprocess-assemble" - elif ext in extensions.ASSEMBLER: - action_name = "assemble" - else: - action_name = "c++-compile" + if not action_name and output_category == artifact_category.CPP_MODULE: + action_name = "c++-module-compile" object_file = _get_compile_output_file( ctx = action_construction_context, @@ -1685,8 +1666,8 @@ if add_object and fdo_context_has_artifacts: additional_inputs = additional_compilation_inputs + auxiliary_fdo_inputs.to_list() - # Until a new enough Bazel supports C++20 Modules, these argument names are invalid. - if cpp20_module_compile_enabled: + # Provide these args conditionally as they require a recent version of Bazel. + if modmap_file: module_args = { "additional_outputs": additional_outputs, "module_files": module_files,