diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java index 07c52118dd8d4f..d6d9577f970a13 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java @@ -1103,7 +1103,7 @@ private static void checkDeprecated(String newApi, String oldApi, StarlarkSemant * @param knownLabels List of known labels * @return Immutable map with immutable collections as values */ - private static ImmutableMap> makeLabelMap( + public static ImmutableMap> makeLabelMap( Iterable knownLabels) { ImmutableMap.Builder> builder = ImmutableMap.builder(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcStarlarkInternal.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcStarlarkInternal.java index a6fb50770e2c2b..43765b96a56491 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcStarlarkInternal.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcStarlarkInternal.java @@ -18,8 +18,10 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Iterables; import com.google.devtools.build.docgen.annot.DocCategory; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.analysis.LocationExpander; import com.google.devtools.build.lib.analysis.TemplateVariableInfo; import com.google.devtools.build.lib.analysis.starlark.StarlarkRuleContext; import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo; @@ -116,7 +118,18 @@ public Sequence expandToolchainAndRuleContextVariables( ImmutableMap.builder().putAll(starlarkRuleContext.var()).build(); List expandedFlags = new ArrayList<>(); for (String flag : Sequence.cast(flags, String.class, "flags")) { - String expandedFlag = expandFlag(flag, toolchainMap, starlarkRuleContextMap); + @SuppressWarnings("unchecked") + String expandedFlag = + LocationExpander.withExecPaths( + starlarkRuleContext.getRuleContext(), + StarlarkRuleContext.makeLabelMap( + Iterables.concat( + starlarkRuleContext.getRuleContext().getPrerequisites("srcs"), + starlarkRuleContext.getRuleContext().getPrerequisites("non_arc_srcs"), + starlarkRuleContext.getRuleContext().getPrerequisites("hdrs"), + starlarkRuleContext.getRuleContext().getPrerequisites("data")))) + .expand(flag); + expandedFlag = expandFlag(expandedFlag, toolchainMap, starlarkRuleContextMap); try { ShellUtils.tokenize(expandedFlags, expandedFlag); } catch (TokenizationException e) { diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java index f6896f1cf8f28e..9a471f9587f6d5 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java @@ -2383,4 +2383,25 @@ public void testCompilationPrerequisitesHasHeaders() throws Exception { .getOutputGroup(OutputGroupInfo.COMPILATION_PREREQUISITES))) .contains("src bin/cc.h"); } + + @Test + public void testCoptsLocationIsExpanded() throws Exception { + scratch.file( + "bin/BUILD", + "objc_library(", + " name = 'lib',", + " copts = ['$(rootpath lib1.m) $(location lib2.m) $(location data.data) $(execpath" + + " header.h)'],", + " srcs = ['lib1.m'],", + " non_arc_srcs = ['lib2.m'],", + " data = ['data.data'],", + " hdrs = ['header.h'],", + ")"); + + useConfiguration("--apple_platform_type=ios", "--cpu=ios_x86_64"); + + CppCompileAction compileA = (CppCompileAction) compileAction("//bin:lib", "lib1.o"); + assertThat(compileA.compileCommandLine.getCopts()) + .containsAtLeast("bin/lib1.m", "bin/lib2.m", "bin/data.data", "bin/header.h"); + } }