diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java index ed452f005dbe43..042867a9f9716b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java @@ -270,6 +270,8 @@ public CcCompilationContext getCcCompilationContext() { private final List additionalCppModuleMaps = new ArrayList<>(); private final LinkedHashMap compilationUnitSources = new LinkedHashMap<>(); private ImmutableList copts = ImmutableList.of(); + private ImmutableList conlyopts = ImmutableList.of(); + private ImmutableList cxxopts = ImmutableList.of(); private CoptsFilter coptsFilter = CoptsFilter.alwaysPasses(); private final Set defines = new LinkedHashSet<>(); private final Set localDefines = new LinkedHashSet<>(); @@ -594,6 +596,18 @@ public void setCoptsFilter(CoptsFilter coptsFilter) { this.coptsFilter = Preconditions.checkNotNull(coptsFilter); } + @CanIgnoreReturnValue + public CcCompilationHelper setConlyopts(ImmutableList copts) { + this.conlyopts = Preconditions.checkNotNull(copts); + return this; + } + + @CanIgnoreReturnValue + public CcCompilationHelper setCxxopts(ImmutableList copts) { + this.cxxopts = Preconditions.checkNotNull(copts); + return this; + } + /** * Adds the given defines to the compiler command line of this target as well as its dependent * targets. @@ -1247,9 +1261,21 @@ public static ImmutableList getCoptsFromOptions( private ImmutableList getCopts(Artifact sourceFile, Label sourceLabel) { ImmutableList.Builder coptsList = ImmutableList.builder(); - coptsList.addAll( - getCoptsFromOptions(cppConfiguration, semantics, sourceFile.getExecPathString())); + String sourceFilename = sourceFile.getExecPathString(); + coptsList.addAll(getCoptsFromOptions(cppConfiguration, semantics, sourceFilename)); coptsList.addAll(copts); + + if (CppFileTypes.C_SOURCE.matches(sourceFilename)) { + coptsList.addAll(conlyopts); + } + + if (CppFileTypes.CPP_SOURCE.matches(sourceFilename) + || CppFileTypes.CPP_HEADER.matches(sourceFilename) + || CppFileTypes.CPP_MODULE_MAP.matches(sourceFilename) + || CppFileTypes.CLIF_INPUT_PROTO.matches(sourceFilename)) { + coptsList.addAll(cxxopts); + } + if (sourceFile != null && sourceLabel != null) { coptsList.addAll(collectPerFileCopts(sourceFile, sourceLabel)); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java index 0672a59c857a89..4b403554529600 100755 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java @@ -2156,6 +2156,8 @@ public Tuple compile( String includePrefix, String stripIncludePrefix, Sequence userCompileFlags, // expected + Sequence conlyFlags, // expected + Sequence cxxFlags, // expected Sequence ccCompilationContexts, // expected Object implementationCcCompilationContextsObject, String name, @@ -2310,6 +2312,8 @@ public Tuple compile( .setCopts( ImmutableList.copyOf( Sequence.cast(userCompileFlags, String.class, "user_compile_flags"))) + .setConlyopts(ImmutableList.copyOf(Sequence.cast(conlyFlags, String.class, "conly_flags"))) + .setCxxopts(ImmutableList.copyOf(Sequence.cast(cxxFlags, String.class, "cxx_flags"))) .addAdditionalCompilationInputs( Sequence.cast(additionalInputs, Artifact.class, "additional_inputs")) .addAdditionalInputs(nonCompilationAdditionalInputs) diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java index d8bd7aa8847775..9a9fbc3873e3bb 100755 --- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java +++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java @@ -242,6 +242,18 @@ default void compilerFlagExists() {} positional = false, named = true, defaultValue = "[]"), + @Param( + name = "conly_flags", + doc = "Additional list of compilation options for C compiles.", + positional = false, + named = true, + defaultValue = "[]"), + @Param( + name = "cxx_flags", + doc = "Additional list of compilation options for C++ compiles.", + positional = false, + named = true, + defaultValue = "[]"), @Param( name = "compilation_contexts", doc = "Headers from dependencies used for compilation.", @@ -396,6 +408,8 @@ Tuple compile( String includePrefix, String stripIncludePrefix, Sequence userCompileFlags, // expected + Sequence conlyFlags, // expected + Sequence cxxFlags, // expected Sequence ccCompilationContexts, // expected Object implementationCcCompilationContextsObject, String name, diff --git a/src/main/starlark/builtins_bzl/common/cc/cc_binary.bzl b/src/main/starlark/builtins_bzl/common/cc/cc_binary.bzl index 211b59c4d402ae..4095af15af3441 100644 --- a/src/main/starlark/builtins_bzl/common/cc/cc_binary.bzl +++ b/src/main/starlark/builtins_bzl/common/cc/cc_binary.bzl @@ -633,7 +633,9 @@ def cc_binary_impl(ctx, additional_linkopts): actions = ctx.actions, feature_configuration = feature_configuration, cc_toolchain = cc_toolchain, - user_compile_flags = cc_helper.get_copts(ctx, feature_configuration, additional_make_variable_substitutions), + user_compile_flags = cc_helper.get_copts(ctx, feature_configuration, additional_make_variable_substitutions, attr = "copts"), + conly_flags = cc_helper.get_copts(ctx, feature_configuration, additional_make_variable_substitutions, attr = "conlyopts"), + cxx_flags = cc_helper.get_copts(ctx, feature_configuration, additional_make_variable_substitutions, attr = "cxxopts"), defines = cc_helper.defines(ctx, additional_make_variable_substitutions), local_defines = cc_helper.local_defines(ctx, additional_make_variable_substitutions) + cc_helper.get_local_defines_for_runfiles_lookup(ctx, ctx.attr.deps), system_includes = cc_helper.system_include_dirs(ctx, additional_make_variable_substitutions), diff --git a/src/main/starlark/builtins_bzl/common/cc/cc_binary_attrs.bzl b/src/main/starlark/builtins_bzl/common/cc/cc_binary_attrs.bzl index e75c0b606c0bab..90ab90c3a3057d 100644 --- a/src/main/starlark/builtins_bzl/common/cc/cc_binary_attrs.bzl +++ b/src/main/starlark/builtins_bzl/common/cc/cc_binary_attrs.bzl @@ -35,6 +35,8 @@ cc_binary_attrs = { ), "linkopts": attr.string_list(), "copts": attr.string_list(), + "conlyopts": attr.string_list(), + "cxxopts": attr.string_list(), "defines": attr.string_list(), "local_defines": attr.string_list(), "includes": attr.string_list(), diff --git a/src/main/starlark/builtins_bzl/common/cc/cc_common.bzl b/src/main/starlark/builtins_bzl/common/cc/cc_common.bzl index 2ac9f498506422..24ddebebfd94f8 100644 --- a/src/main/starlark/builtins_bzl/common/cc/cc_common.bzl +++ b/src/main/starlark/builtins_bzl/common/cc/cc_common.bzl @@ -705,6 +705,8 @@ def _compile( include_prefix = "", strip_include_prefix = "", user_compile_flags = [], + conly_flags = [], + cxx_flags = [], compilation_contexts = [], implementation_compilation_contexts = _UNBOUND, disallow_pic_outputs = False, @@ -785,6 +787,8 @@ def _compile( include_prefix = include_prefix, strip_include_prefix = strip_include_prefix, user_compile_flags = user_compile_flags, + conly_flags = conly_flags, + cxx_flags = cxx_flags, compilation_contexts = compilation_contexts, implementation_compilation_contexts = implementation_compilation_contexts, disallow_pic_outputs = disallow_pic_outputs, diff --git a/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl b/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl index fd4fd40d4387fa..64d176b974cb53 100644 --- a/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl +++ b/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl @@ -924,10 +924,10 @@ def _expand_make_variables_for_copts(ctx, tokenization, unexpanded_tokens, addit tokens.append(_expand(ctx, token, additional_make_variable_substitutions, targets = targets)) return tokens -def _get_copts(ctx, feature_configuration, additional_make_variable_substitutions): - if not hasattr(ctx.attr, "copts"): - fail("could not find rule attribute named: 'copts'") - attribute_copts = ctx.attr.copts +def _get_copts(ctx, feature_configuration, additional_make_variable_substitutions, attr = "copts"): + if not hasattr(ctx.attr, attr): + fail("could not find rule attribute named: '{}'".format(attr)) + attribute_copts = getattr(ctx.attr, attr) tokenization = not (cc_common.is_enabled(feature_configuration = feature_configuration, feature_name = "no_copts_tokenization") or "no_copts_tokenization" in ctx.features) expanded_attribute_copts = _expand_make_variables_for_copts(ctx, tokenization, attribute_copts, additional_make_variable_substitutions) return expanded_attribute_copts diff --git a/src/main/starlark/builtins_bzl/common/cc/cc_library.bzl b/src/main/starlark/builtins_bzl/common/cc/cc_library.bzl index 5902c0d0875328..edccb945be2a62 100755 --- a/src/main/starlark/builtins_bzl/common/cc/cc_library.bzl +++ b/src/main/starlark/builtins_bzl/common/cc/cc_library.bzl @@ -55,7 +55,9 @@ def _cc_library_impl(ctx): name = ctx.label.name, cc_toolchain = cc_toolchain, feature_configuration = feature_configuration, - user_compile_flags = cc_helper.get_copts(ctx, feature_configuration, additional_make_variable_substitutions), + user_compile_flags = cc_helper.get_copts(ctx, feature_configuration, additional_make_variable_substitutions, attr = "copts"), + conly_flags = cc_helper.get_copts(ctx, feature_configuration, additional_make_variable_substitutions, attr = "conlyopts"), + cxx_flags = cc_helper.get_copts(ctx, feature_configuration, additional_make_variable_substitutions, attr = "cxxopts"), defines = cc_helper.defines(ctx, additional_make_variable_substitutions), local_defines = cc_helper.local_defines(ctx, additional_make_variable_substitutions) + cc_helper.get_local_defines_for_runfiles_lookup(ctx, ctx.attr.deps + ctx.attr.implementation_deps), system_includes = cc_helper.system_include_dirs(ctx, additional_make_variable_substitutions), @@ -581,6 +583,8 @@ attrs = { "includes": attr.string_list(), "defines": attr.string_list(), "copts": attr.string_list(), + "conlyopts": attr.string_list(), + "cxxopts": attr.string_list(), "hdrs_check": attr.string(default = cc_internal.default_hdrs_check_computed_default()), "local_defines": attr.string_list(), "deps": attr.label_list( diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariablesTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariablesTest.java index bca4814470d09b..696ab81ae2b194 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariablesTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariablesTest.java @@ -102,6 +102,48 @@ public void testPresenceOfUserCompileFlags() throws Exception { assertThat(copts).contains("-foo"); } + @Test + public void testPresenceOfConlyFlags() throws Exception { + useConfiguration( + "--conlyopt=-foo", "--cxxopt=-not-passed", "--per_file_copt=//x:bin@-per-file"); + + scratch.file( + "x/BUILD", + "cc_binary(name = 'bin', srcs = ['bin.c'], copts = ['-bar'], conlyopts = ['-baz'], cxxopts" + + " = ['-not-passed'])"); + scratch.file("x/bin.c"); + + CcToolchainVariables variables = getCompileBuildVariables("//x:bin", "bin"); + + ImmutableList copts = + CcToolchainVariables.toStringList( + variables, CompileBuildVariables.USER_COMPILE_FLAGS.getVariableName(), PathMapper.NOOP); + assertThat(copts) + .containsExactlyElementsIn(ImmutableList.of("-foo", "-bar", "-baz", "-per-file")) + .inOrder(); + } + + @Test + public void testCxxFlagsOrder() throws Exception { + useConfiguration( + "--cxxopt=-foo", "--conlyopt=-not-passed", "--per_file_copt=//x:bin@-per-file"); + + scratch.file( + "x/BUILD", + "cc_binary(name = 'bin', srcs = ['bin.cc'], copts = ['-bar'], cxxopts = ['-baz'], conlyopts" + + " = ['-not-passed'])"); + scratch.file("x/bin.cc"); + + CcToolchainVariables variables = getCompileBuildVariables("//x:bin", "bin"); + + ImmutableList copts = + CcToolchainVariables.toStringList( + variables, CompileBuildVariables.USER_COMPILE_FLAGS.getVariableName(), PathMapper.NOOP); + assertThat(copts) + .containsExactlyElementsIn(ImmutableList.of("-foo", "-bar", "-baz", "-per-file")) + .inOrder(); + } + @Test public void testPerFileCoptsAreInUserCompileFlags() throws Exception { scratch.file("x/BUILD", "cc_binary(name = 'bin', srcs = ['bin.cc'])");