diff options
author | 2017-06-10 02:30:02 +0200 | |
---|---|---|
committer | 2017-06-12 11:22:28 +0200 | |
commit | b1b02d70a16f34955863d93f80698369203edded (patch) | |
tree | f76d300d0b4ea6b1e70d2daaa2fa51aaee81a529 /src | |
parent | 221c2b686ebaec4f80355f2966d7e4f6f859a0e1 (diff) |
Allow $(location) expansion to work with javac.jar in java_toolchain.jvm_opts
PiperOrigin-RevId: 158584197
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java index 255f0e156e..5ed85eec9d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java @@ -13,18 +13,23 @@ // limitations under the License. package com.google.devtools.build.lib.rules.java; +import com.google.common.collect.ImmutableCollection; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableListMultimap; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FileProvider; import com.google.devtools.build.lib.analysis.FilesToRunProvider; +import com.google.devtools.build.lib.analysis.LocationExpander; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.Runfiles; import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; +import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; @@ -48,10 +53,22 @@ public final class JavaToolchain implements RuleConfiguredTargetFactory { final String encoding = ruleContext.attributes().get("encoding", Type.STRING); final List<String> xlint = ruleContext.attributes().get("xlint", Type.STRING_LIST); final List<String> misc = ruleContext.getTokenizedStringListAttr("misc"); - final List<String> jvmOpts = ruleContext.attributes().get("jvm_opts", Type.STRING_LIST); final boolean javacSupportsWorkers = ruleContext.attributes().get("javac_supports_workers", Type.BOOLEAN); - Artifact javac = getArtifact("javac", ruleContext); + TransitiveInfoCollection javacDep = ruleContext.getPrerequisite("javac", Mode.HOST); + Artifact javac = null; + NestedSet<Artifact> javacJars = javacDep.getProvider(FileProvider.class).getFilesToBuild(); + if (Iterables.size(javacJars) == 1) { + javac = Iterables.getOnlyElement(javacJars); + } else { + ruleContext.attributeError("javac", javacDep.getLabel() + " expected a single artifact"); + return null; + } + final List<String> jvmOpts = + getJvmOpts( + ruleContext, + ImmutableMap.<Label, ImmutableCollection<Artifact>>of( + javacDep.getLabel(), ImmutableList.of(javac))); Artifact javabuilder = getArtifact("javabuilder", ruleContext); Artifact headerCompiler = getArtifact("header_compiler", ruleContext); boolean forciblyDisableHeaderCompilation = @@ -140,4 +157,17 @@ public final class JavaToolchain implements RuleConfiguredTargetFactory { } return prerequisite.getProvider(FileProvider.class).getFilesToBuild(); } + + private static ImmutableList<String> getJvmOpts( + RuleContext ruleContext, ImmutableMap<Label, ImmutableCollection<Artifact>> locations) { + // LocationExpander is used directly instead of e.g. getExpandedStringListAttr because the + // latter hard-codes list of attributes that can provide prerequisites. + LocationExpander expander = + new LocationExpander(ruleContext, locations, /*allowDataAttributeEntriesInLabel=*/ false); + ImmutableList.Builder<String> result = ImmutableList.builder(); + for (String option : ruleContext.attributes().get("jvm_opts", Type.STRING_LIST)) { + result.add(expander.expand(option)); + } + return result.build(); + } } |