From b5ecdabfef7438cc12cb1fd5738f11a7a6a36f08 Mon Sep 17 00:00:00 2001 From: Kristina Chodorow Date: Mon, 16 Mar 2015 17:55:04 +0000 Subject: Make JDK not need tools/jdk/jdk symlinked -- MOS_MIGRATED_REVID=88742425 --- .../repository/NewLocalRepositoryFunction.java | 6 +++--- .../build/lib/packages/ExternalPackage.java | 21 +++++++++++++++++++++ .../lib/rules/java/JvmConfigurationLoader.java | 9 ++++++++- .../SkyframePackageLoaderWithValueEnvironment.java | 7 +++++++ .../build/lib/skyframe/WorkspaceFileFunction.java | 6 ++++++ 5 files changed, 45 insertions(+), 4 deletions(-) (limited to 'src/main/java/com/google/devtools') diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/NewLocalRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/NewLocalRepositoryFunction.java index 71d0059232..8f03ac4781 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/NewLocalRepositoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/NewLocalRepositoryFunction.java @@ -114,11 +114,11 @@ public class NewLocalRepositoryFunction extends RepositoryFunction { // Link x/BUILD to /x.BUILD. PathFragment buildFile = new PathFragment(mapper.get("build_file", Type.STRING)); Path buildFileTarget = getWorkspace().getRelative(buildFile); - if (buildFile.equals(PathFragment.EMPTY_FRAGMENT) || buildFile.isAbsolute() - || !buildFileTarget.exists()) { + if (!buildFileTarget.exists()) { throw new RepositoryFunctionException( new EvalException(rule.getLocation(), "In " + rule - + " the 'build_file' attribute must specify a relative path to an existing file"), + + " the 'build_file' attribute does not specify an existing file (" + + buildFile + " does not exist)"), Transience.PERSISTENT); } Path buildFilePath = repositoryDirectory.getRelative("BUILD"); diff --git a/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java b/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java index 572c163fff..3b702ce3ec 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java +++ b/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java @@ -33,7 +33,9 @@ import java.util.Map.Entry; * This creates the //external package, where targets not homed in this repository can be bound. */ public class ExternalPackage extends Package { + public static final String NAME = "external"; + private Map bindMap; private Map repositoryMap; ExternalPackage() { @@ -48,6 +50,24 @@ public class ExternalPackage extends Package { return repositoryMap.get(repositoryName); } + /** + * If the given label is bound, returns the (fully resolved) label it is bound to. Otherwise, + * returns null. + */ + public Label getActualLabel(Label label) { + if (bindMap.containsKey(label)) { + return bindMap.get(label).getActual(); + } + return null; + } + + /** + * Checks if the given package is //external. + */ + public static boolean isExternal(Package pkg) { + return pkg != null && pkg.getName().equals(NAME); + } + /** * Holder for a binding's actual label and location. */ @@ -97,6 +117,7 @@ public class ExternalPackage extends Package { @Override public ExternalPackage build() { + pkg.bindMap = ImmutableMap.copyOf(bindMap); pkg.repositoryMap = ImmutableMap.copyOf(repositoryMap); return super.build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java index 7483f8827e..ec7e926a79 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java @@ -109,7 +109,14 @@ public final class JvmConfigurationLoader implements ConfigurationFragmentFactor if (jvmTarget == null) { return null; } - PathFragment javaHomePath = jvmLabel.getPackageFragment(); + + PathFragment javaHomePath; + if (jvmTarget.getLabel().getPackageIdentifier().getRepository().isDefault()) { + javaHomePath = jvmLabel.getPackageFragment(); + } else { + javaHomePath = jvmTarget.getLabel().getPackageFragment(); + } + if ((jvmTarget instanceof Rule) && "filegroup".equals(((Rule) jvmTarget).getRuleClass())) { RawAttributeMapper jvmTargetAttributes = RawAttributeMapper.of((Rule) jvmTarget); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageLoaderWithValueEnvironment.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageLoaderWithValueEnvironment.java index e467ae09c8..9478dafd2b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageLoaderWithValueEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageLoaderWithValueEnvironment.java @@ -18,6 +18,7 @@ import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment import com.google.devtools.build.lib.analysis.config.BuildOptions; import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException; import com.google.devtools.build.lib.analysis.config.PackageProviderForConfigurations; +import com.google.devtools.build.lib.packages.ExternalPackage; import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.NoSuchTargetException; import com.google.devtools.build.lib.packages.Package; @@ -77,6 +78,12 @@ class SkyframePackageLoaderWithValueEnvironment implements public Target getLoadedTarget(Label label) throws NoSuchPackageException, NoSuchTargetException { Package pkg = getLoadedPackage(label.getPackageIdentifier()); + if (ExternalPackage.isExternal(pkg)) { + label = ((ExternalPackage) pkg).getActualLabel(label); + if (label != null) { + pkg = getLoadedPackage(label.getPackageIdentifier()); + } + } return pkg == null ? null : pkg.getTarget(label.getName()); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java index 839a9ea11b..5378af5808 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java @@ -48,6 +48,7 @@ import com.google.devtools.build.skyframe.SkyFunctionException.Transience; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; +import java.io.File; import java.io.IOException; import java.util.List; import java.util.Map; @@ -212,6 +213,11 @@ public class WorkspaceFileFunction implements SkyFunction { workspaceEnv.update(ruleClass, ruleFunction); } + workspaceEnv.update("__embedded_dir__", this.installDir.toString()); + // TODO(kchodorow): Get all the toolchain rules and load this from there. + File jreDirectory = new File(System.getProperty("java.home")); + workspaceEnv.update("DEFAULT_SERVER_JAVABASE", jreDirectory.getParentFile().toString()); + workspaceEnv.update(BIND, newBindFunction(builder)); workspaceEnv.update("workspace", newWorkspaceNameFunction(builder)); -- cgit v1.2.3