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 5292b08cbfd9e9..55041afedf26e3 100644 --- a/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl +++ b/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl @@ -1142,11 +1142,11 @@ def _linkopts(ctx, additional_make_variable_substitutions, cc_toolchain): fail("in linkopts attribute of cc_library rule {}: Apple builds do not support statically linked binaries".format(ctx.label)) return tokens -def _defines_attribute(ctx, additional_make_variable_substitutions, attr_name): +def _defines_attribute(ctx, additional_make_variable_substitutions, attr_name, additional_targets): defines = getattr(ctx.attr, attr_name, []) if len(defines) == 0: return [] - targets = [] + targets = list(additional_targets) for dep in ctx.attr.deps: targets.append(dep) result = [] @@ -1164,10 +1164,10 @@ def _defines_attribute(ctx, additional_make_variable_substitutions, attr_name): return result def _defines(ctx, additional_make_variable_substitutions): - return _defines_attribute(ctx, additional_make_variable_substitutions, "defines") + return _defines_attribute(ctx, additional_make_variable_substitutions, "defines", []) def _local_defines(ctx, additional_make_variable_substitutions): - return _defines_attribute(ctx, additional_make_variable_substitutions, "local_defines") + return _defines_attribute(ctx, additional_make_variable_substitutions, "local_defines", getattr(ctx.attr, "additional_compiler_inputs", [])) def _linker_scripts(ctx): result = [] diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java index 707332af9fdcd7..122518411d4057 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java @@ -2502,4 +2502,26 @@ public void testAdditionalCompilerInputsArePassedToCompile() throws Exception { assertThat(action.getInputs().toList()).contains(getSourceArtifact("foo/compiler_input.txt")); assertThat(action.getArguments()).contains("foo/compiler_input.txt"); } + + @Test + public void testAdditionalCompilerInputsArePassedToCompileFromLocalDefines() throws Exception { + AnalysisMock.get().ccSupport().setupCcToolchainConfig(mockToolsConfig); + scratch.file( + "foo/BUILD", + """ + cc_library( + name = 'foo', + srcs = ['hello.cc'], + local_defines = ['FOO=$(location compiler_input.txt)'], + additional_compiler_inputs = ['compiler_input.txt'], + ) + """); + scratch.file("foo/compiler_input.txt", "hello world!"); + + ConfiguredTarget lib = getConfiguredTarget("//foo:foo"); + Artifact artifact = getBinArtifact("_objs/foo/hello.o", lib); + CppCompileAction action = (CppCompileAction) getGeneratingAction(artifact); + assertThat(action.getInputs().toList()).contains(getSourceArtifact("foo/compiler_input.txt")); + assertThat(action.getArguments()).contains("-DFOO=foo/compiler_input.txt"); + } }