diff options
10 files changed, 76 insertions, 48 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java index 6c29411930..aee043ad5e 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java @@ -83,7 +83,8 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { * Builder for {@link ConfiguredRuleClassProvider}. */ public static class Builder implements RuleDefinitionEnvironment { - private final StringBuilder defaultWorkspaceFile = new StringBuilder(); + private final StringBuilder defaultWorkspaceFilePrefix = new StringBuilder(); + private final StringBuilder defaultWorkspaceFileSuffix = new StringBuilder(); private Label preludeLabel; private String runfilesPrefix; private String toolsRepository; @@ -109,8 +110,12 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { ImmutableList.<Class<?>>builder().addAll(SkylarkModules.MODULES); private final List<Class<? extends FragmentOptions>> buildOptions = Lists.newArrayList(); - public void addWorkspaceFile(String contents) { - defaultWorkspaceFile.append(contents); + public void addWorkspaceFilePrefix(String contents) { + defaultWorkspaceFilePrefix.append(contents); + } + + public void addWorkspaceFileSuffix(String contents) { + defaultWorkspaceFileSuffix.append(contents); } public Builder setPrelude(String preludeLabelString) { @@ -264,7 +269,8 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { ImmutableMap.copyOf(ruleClassMap), ImmutableMap.copyOf(ruleDefinitionMap), ImmutableMap.copyOf(aspectFactoryMap), - defaultWorkspaceFile.toString(), + defaultWorkspaceFilePrefix.toString(), + defaultWorkspaceFileSuffix.toString(), ImmutableList.copyOf(buildInfoFactories), ImmutableList.copyOf(configurationOptions), ImmutableList.copyOf(configurationFragments), @@ -304,10 +310,15 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { }); /** - * A list of relative paths to the WORKSPACE files needed to provide external dependencies for - * the rule classes. + * Default content that should be added at the beginning of the WORKSPACE file. + */ + private final String defaultWorkspaceFilePrefix; + + /** + * Default content that should be added at the end of the WORKSPACE file. */ - String defaultWorkspaceFile; + private final String defaultWorkspaceFileSuffix; + /** * Label for the prelude file. @@ -375,7 +386,8 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { ImmutableMap<String, RuleClass> ruleClassMap, ImmutableMap<String, Class<? extends RuleDefinition>> ruleDefinitionMap, ImmutableMap<String, Class<? extends NativeAspectFactory>> aspectFactoryMap, - String defaultWorkspaceFile, + String defaultWorkspaceFilePrefix, + String defaultWorkspaceFileSuffix, ImmutableList<BuildInfoFactory> buildInfoFactories, ImmutableList<Class<? extends FragmentOptions>> configurationOptions, ImmutableList<ConfigurationFragmentFactory> configurationFragments, @@ -391,7 +403,8 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { this.ruleClassMap = ruleClassMap; this.ruleDefinitionMap = ruleDefinitionMap; this.aspectFactoryMap = aspectFactoryMap; - this.defaultWorkspaceFile = defaultWorkspaceFile; + this.defaultWorkspaceFilePrefix = defaultWorkspaceFilePrefix; + this.defaultWorkspaceFileSuffix = defaultWorkspaceFileSuffix; this.buildInfoFactories = buildInfoFactories; this.configurationOptions = configurationOptions; this.configurationFragments = configurationFragments; @@ -540,9 +553,13 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { eventHandler, astFileContentHashCode, importMap); } + @Override + public String getDefaultWorkspacePrefix() { + return defaultWorkspaceFilePrefix; + } @Override - public String getDefaultWorkspaceFile() { - return defaultWorkspaceFile; + public String getDefaultWorkspaceSuffix() { + return defaultWorkspaceFileSuffix; } } diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java index a2592eac68..1fa4f8fce4 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java @@ -297,13 +297,13 @@ public class BazelRuleClassProvider { builder.addRuleDefinition(new BazelPyTestRule()); try { - builder.addWorkspaceFile( + builder.addWorkspaceFilePrefix( ResourceFileLoader.loadResource(BazelRuleClassProvider.class, "tools.WORKSPACE")); - builder.addWorkspaceFile( + builder.addWorkspaceFilePrefix( ResourceFileLoader.loadResource(BazelJavaRuleClasses.class, "jdk.WORKSPACE")); - builder.addWorkspaceFile( + builder.addWorkspaceFilePrefix( ResourceFileLoader.loadResource(BazelAndroidSemantics.class, "android.WORKSPACE")); - builder.addWorkspaceFile( + builder.addWorkspaceFilePrefix( ResourceFileLoader.loadResource(BazelJ2ObjcLibraryRule.class, "j2objc.WORKSPACE")); } catch (IOException e) { throw new IllegalStateException(e); diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java index 4327e676b6..2af2575ff9 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java @@ -26,6 +26,7 @@ import com.google.devtools.build.lib.actions.Executor.ActionContext; import com.google.devtools.build.lib.actions.SimpleActionContextProvider; import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; import com.google.devtools.build.lib.analysis.actions.FileWriteActionContext; +import com.google.devtools.build.lib.bazel.rules.cpp.BazelCppRuleClasses; import com.google.devtools.build.lib.query2.output.OutputFormatter; import com.google.devtools.build.lib.rules.android.WriteAdbArgsActionContext; import com.google.devtools.build.lib.rules.cpp.CppCompileActionContext; @@ -37,10 +38,12 @@ import com.google.devtools.build.lib.runtime.Command; import com.google.devtools.build.lib.runtime.CommandEnvironment; import com.google.devtools.build.lib.runtime.GotOptionsEvent; import com.google.devtools.build.lib.skyframe.PrecomputedValue; +import com.google.devtools.build.lib.util.ResourceFileLoader; import com.google.devtools.common.options.Converters.AssignmentConverter; import com.google.devtools.common.options.Option; import com.google.devtools.common.options.OptionsBase; +import java.io.IOException; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -170,6 +173,14 @@ public class BazelRulesModule extends BlazeModule { @Override public void initializeRuleClasses(ConfiguredRuleClassProvider.Builder builder) { BazelRuleClassProvider.setup(builder); + try { + // Load auto-configuration files, it is made outside of the rule class provider so that it + // will not be loaded for our Java tests. + builder.addWorkspaceFileSuffix( + ResourceFileLoader.loadResource(BazelCppRuleClasses.class, "cc_configure.WORKSPACE")); + } catch (IOException e) { + throw new IllegalStateException(e); + } } @Override diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/cc_configure.WORKSPACE b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/cc_configure.WORKSPACE new file mode 100644 index 0000000000..70ef8f750e --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/cc_configure.WORKSPACE @@ -0,0 +1,2 @@ +load("@bazel_tools//tools/cpp:cc_configure.bzl", "cc_configure") +cc_configure() diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java index 2f0988f575..7a3566a5eb 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java @@ -69,13 +69,21 @@ public interface RuleClassProvider { Map<String, Class<? extends NativeAspectFactory>> getAspectFactoryMap(); /** - * Returns the default content of the WORKSPACE file. + * Returns the default content that should be added at the beginning of the WORKSPACE file. * * <p>Used to provide external dependencies for built-in rules. Rules defined here can be * overwritten in the WORKSPACE file in the actual workspace. */ - String getDefaultWorkspaceFile(); - + String getDefaultWorkspacePrefix(); + + + /** + * Returns the default content that should be added at the end of the WORKSPACE file. + * + * <p>Used to load skylark repository in the bazel_tools repository. + */ + String getDefaultWorkspaceSuffix(); + /** * Returns the path to the tools repository */ diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java index 46f5d0d9d1..d101139028 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java @@ -52,10 +52,10 @@ public class WorkspaceASTFunction implements SkyFunction { } Path repoWorkspace = workspaceRoot.getRoot().getRelative(workspaceRoot.getRelativePath()); - PathFragment pathFragment = new PathFragment("/DEFAULT.WORKSPACE"); try { BuildFileAST ast = BuildFileAST.parseBuildFile( - ParserInputSource.create(ruleClassProvider.getDefaultWorkspaceFile(), pathFragment), + ParserInputSource.create(ruleClassProvider.getDefaultWorkspacePrefix(), + new PathFragment("/DEFAULT.WORKSPACE")), env.getListener(), false); if (ast.containsErrors()) { throw new WorkspaceASTFunctionException( @@ -69,6 +69,17 @@ public class WorkspaceASTFunction implements SkyFunction { new IOException("Failed to parse WORKSPACE file"), Transience.PERSISTENT); } } + ast = BuildFileAST.parseBuildFile( + ParserInputSource.create(ruleClassProvider.getDefaultWorkspaceSuffix(), + new PathFragment("/DEFAULT.WORKSPACE.SUFFIX")), + ast.getStatements(), + env.getListener(), + false); + if (ast.containsErrors()) { + throw new WorkspaceASTFunctionException( + new IOException("Failed to parse default WORKSPACE file suffix"), + Transience.PERSISTENT); + } return new WorkspaceASTValue(splitAST(ast)); } catch (IOException ex) { throw new WorkspaceASTFunctionException(ex, Transience.TRANSIENT); diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java index 784c3e0707..4d61274456 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java @@ -52,7 +52,8 @@ public class WorkspaceASTFunctionTest extends BuildViewTestCase { ConfiguredRuleClassProvider ruleClassProvider = TestRuleClassProvider.getRuleClassProvider(); ConfiguredRuleClassProvider ruleClassProviderSpy = Mockito.spy(ruleClassProvider); // Prevent returning default workspace file. - Mockito.when(ruleClassProviderSpy.getDefaultWorkspaceFile()).thenReturn(""); + Mockito.when(ruleClassProviderSpy.getDefaultWorkspacePrefix()).thenReturn(""); + Mockito.when(ruleClassProviderSpy.getDefaultWorkspaceSuffix()).thenReturn(""); astSkyFunc = new WorkspaceASTFunction(ruleClassProviderSpy); fakeWorkspaceFileValue = new FakeFileValue(); } diff --git a/src/test/shell/bazel/external_correctness_test.sh b/src/test/shell/bazel/external_correctness_test.sh index bb84579f78..4a70e16523 100755 --- a/src/test/shell/bazel/external_correctness_test.sh +++ b/src/test/shell/bazel/external_correctness_test.sh @@ -140,7 +140,7 @@ genrule( ) EOF bazel build @a//b/c:echo-d &> $TEST_log || fail "Build failed" - assert_contains "bazel-out/local_.*-fastbuild/genfiles/external/a/b/c" \ + assert_contains "bazel-out/local.*-fastbuild/genfiles/external/a/b/c" \ "bazel-genfiles/external/a/b/c/d" } diff --git a/src/test/shell/integration/testenv.sh b/src/test/shell/integration/testenv.sh index b9baa4aa29..9326abdd4a 100755 --- a/src/test/shell/integration/testenv.sh +++ b/src/test/shell/integration/testenv.sh @@ -37,6 +37,8 @@ function put_bazel_on_path() { } function write_default_bazelrc() { + # Our tests use the static crosstool, so make it the default. + EXTRA_BAZELRC="build --crosstool_top=@bazel_tools//tools/cpp:default-toolchain" setup_bazelrc } diff --git a/tools/cpp/test/BUILD b/tools/cpp/test/BUILD index 9f6163ab73..b0a66b7673 100644 --- a/tools/cpp/test/BUILD +++ b/tools/cpp/test/BUILD @@ -39,42 +39,18 @@ FLAVOURS = [f[f.find(".") + 1:] for f in glob(["Dockerfile.*"])] for flavour in FLAVOURS ] -genrule( - name = "gen_workspace", - srcs = ["//:workspace-file"], - outs = ["WORKSPACE"], - cmd = """ - cat <<EOF >$@ -load("@bazel_tools//tools/cpp:cc_configure.bzl", "cc_configure") -cc_configure() -EOF - cat $(location //:workspace-file) >>$@ -""", -) - -pkg_tar( - name = "cc_configure_ws", - files = [":WORKSPACE"], - package_dir = "/opt/workspace", - strip_prefix = ".", -) - pkg_tar( name = "bazel_cc_configure", package_dir = "/opt/workspace", strip_prefix = "/", - deps = [ - # Order matters. - ":cc_configure_ws", - "//:bazel-srcs", - ], + deps = ["//:bazel-srcs"], ) [ [docker_build( name = "bazel_cc_configure-%s-%s" % (flavour, mode), base = ":base-" + flavour, - entrypoint = "/opt/workspace/compile.sh", + entrypoint = "/opt/workspace/compile.sh && ./output/bazel test ${EXTRA_BAZEL_ARGS} //examples/cpp:hello-success_test", env = { "EXTRA_BAZEL_ARGS": "--spawn_strategy=standalone --genrule_strategy=standalone -c %s" % mode, }, |