From da88192f91398de4a683ed292ff22f287d63241f Mon Sep 17 00:00:00 2001 From: Damien Martin-Guillerez Date: Tue, 23 Feb 2016 15:20:59 +0000 Subject: Implements repository_ctx.os repository_ctx.os gives access to os related information: - .system returns the name of the current platform. - .environ returns the list of environment variables. Issue #893: Step 4 of http://goo.gl/OZV3o0. See http://goo.gl/fD4ZsY. -- MOS_MIGRATED_REVID=115337406 --- src/main/java/com/google/devtools/build/lib/BUILD | 1 + .../build/lib/bazel/BazelRepositoryModule.java | 12 ++++- .../lib/bazel/repository/skylark/SkylarkOS.java | 53 ++++++++++++++++++++++ .../skylark/SkylarkRepositoryContext.java | 17 +++++-- .../skylark/SkylarkRepositoryFunction.java | 17 ++++++- 5 files changed, 95 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkOS.java (limited to 'src/main/java/com/google/devtools/build') diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index c9ed05fb45..8a1eb0da79 100644 --- a/src/main/java/com/google/devtools/build/lib/BUILD +++ b/src/main/java/com/google/devtools/build/lib/BUILD @@ -601,6 +601,7 @@ java_library( ":concurrent", ":events", ":maven-connector", + ":runtime", ":util", "//src/java_tools/singlejar/java/com/google/devtools/build/zip", "//src/main/java/com/google/devtools/build/lib:build-base", diff --git a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java index dab80039c6..5e16483f6a 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java @@ -55,8 +55,11 @@ import com.google.devtools.build.lib.rules.repository.RepositoryFunction; import com.google.devtools.build.lib.rules.repository.RepositoryLoaderFunction; import com.google.devtools.build.lib.runtime.BlazeCommand; import com.google.devtools.build.lib.runtime.BlazeModule; +import com.google.devtools.build.lib.runtime.Command; +import com.google.devtools.build.lib.runtime.CommandEnvironment; import com.google.devtools.build.lib.skyframe.SkyFunctions; import com.google.devtools.build.lib.skyframe.SkyValueDirtinessChecker; +import com.google.devtools.build.lib.util.AbruptExitException; import com.google.devtools.build.lib.util.Clock; import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor; import com.google.devtools.build.skyframe.SkyFunction; @@ -79,6 +82,8 @@ public class BazelRepositoryModule extends BlazeModule { // A map of repository handlers that can be looked up by rule class name. private final ImmutableMap repositoryHandlers; private final AtomicBoolean isFetch = new AtomicBoolean(false); + private final SkylarkRepositoryFunction skylarkRepositoryFunction = + new SkylarkRepositoryFunction(); public BazelRepositoryModule() { repositoryHandlers = @@ -177,8 +182,13 @@ public class BazelRepositoryModule extends BlazeModule { builder.put( SkyFunctions.REPOSITORY_DIRECTORY, new RepositoryDelegatorFunction( - directories, repositoryHandlers, new SkylarkRepositoryFunction(), isFetch)); + directories, repositoryHandlers, skylarkRepositoryFunction, isFetch)); builder.put(MavenServerFunction.NAME, new MavenServerFunction(directories)); return builder.build(); } + + @Override + public void beforeCommand(Command command, CommandEnvironment env) throws AbruptExitException { + skylarkRepositoryFunction.setCommandEnvironment(env); + } } diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkOS.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkOS.java new file mode 100644 index 0000000000..fd51059137 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkOS.java @@ -0,0 +1,53 @@ +// Copyright 2016 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.bazel.repository.skylark; + +import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; + +import java.util.Map; + +/** + * A Skylark structure to deliver information about the system we are running on. + */ +@Immutable +@SkylarkModule( + name = "repository_os", + doc = "Various data about the current platform Bazel is running on." +) +final class SkylarkOS { + + private final ImmutableMap environ; + + SkylarkOS(Map environ) { + this.environ = ImmutableMap.copyOf(environ); + } + + @SkylarkCallable(name = "environ", structField = true, doc = "The list of environment variables.") + public ImmutableMap getEnviron() { + return environ; + } + + @SkylarkCallable( + name = "name", + structField = true, + doc = "A string identifying the current system Bazel is running on." + ) + public String getName() { + return System.getProperty("os.name").toLowerCase(); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java index b51b01c9cb..04a868b9d0 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java @@ -35,6 +35,7 @@ import com.google.devtools.build.skyframe.SkyFunctionException.Transience; import java.io.File; import java.io.IOException; import java.util.List; +import java.util.Map; /** * Skylark API for the repository_rule's context. @@ -52,6 +53,7 @@ public class SkylarkRepositoryContext { private final Rule rule; private final Path outputDirectory; private final SkylarkClassObject attrObject; + private final SkylarkOS osObject; /** * In native code, private values start with $. In Skylark, private values start with _, because @@ -65,12 +67,12 @@ public class SkylarkRepositoryContext { } /** - * Create a new context (ctx) object for a skylark repository rule ({@code rule} argument). The - * environment + * Create a new context (ctx) object for a skylark repository rule ({@code rule} argument). */ - SkylarkRepositoryContext(Rule rule, Path outputDirectory) { + SkylarkRepositoryContext(Rule rule, Path outputDirectory, Map env) { this.rule = rule; this.outputDirectory = outputDirectory; + this.osObject = new SkylarkOS(env); AggregatingAttributeMapper attrs = AggregatingAttributeMapper.of(rule); ImmutableMap.Builder attrBuilder = new ImmutableMap.Builder<>(); for (String name : attrs.getAttributeNames()) { @@ -131,6 +133,15 @@ public class SkylarkRepositoryContext { } } + @SkylarkCallable( + name = "os", + structField = true, + doc = "A struct to access information from the system " + ) + public SkylarkOS getOS() { + return osObject; + } + @SkylarkCallable( name = "execute", doc = diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java index 51bbe832f3..9c9a777610 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java @@ -20,6 +20,7 @@ import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue; import com.google.devtools.build.lib.rules.repository.RepositoryFunction; +import com.google.devtools.build.lib.runtime.CommandEnvironment; import com.google.devtools.build.lib.skyframe.FileValue; import com.google.devtools.build.lib.syntax.BaseFunction; import com.google.devtools.build.lib.syntax.EvalException; @@ -32,6 +33,7 @@ import com.google.devtools.build.skyframe.SkyFunctionException.Transience; import com.google.devtools.build.skyframe.SkyValue; import java.io.IOException; +import java.util.Map; import javax.annotation.Nullable; @@ -39,6 +41,19 @@ import javax.annotation.Nullable; * A repository function to delegate work done by skylark remote repositories. */ public class SkylarkRepositoryFunction extends RepositoryFunction { + + private CommandEnvironment commandEnvironment = null; + + public void setCommandEnvironment(CommandEnvironment commandEnvironment) { + this.commandEnvironment = commandEnvironment; + } + + private Map getClientEnvironment() { + return commandEnvironment != null + ? commandEnvironment.getClientEnv() + : ImmutableMap.of(); + } + @Nullable @Override public SkyValue fetch(Rule rule, Path outputDirectory, Environment env) @@ -52,7 +67,7 @@ public class SkylarkRepositoryFunction extends RepositoryFunction { .setEventHandler(env.getListener()) .build(); SkylarkRepositoryContext skylarkRepositoryContext = - new SkylarkRepositoryContext(rule, outputDirectory); + new SkylarkRepositoryContext(rule, outputDirectory, getClientEnvironment()); // This has side-effect, we don't care about the output. // Also we do a lot of stuff in there, maybe blocking operations and we should certainly make // it possible to return null and not block but it doesn't seem to be easy with Skylark -- cgit v1.2.3