diff options
author | 2016-12-21 18:23:50 +0000 | |
---|---|---|
committer | 2016-12-22 09:55:15 +0000 | |
commit | cf582615487a3dd541f073479f2a26a9376887b2 (patch) | |
tree | 626c3962dd4501830ab2232e6b1321c7628f5ff3 /src | |
parent | 303e5bf9ae55dcb494b27d53a2bee30855d38949 (diff) |
cc_proto_library can build proto_library's from remote repos.
--
PiperOrigin-RevId: 142676227
MOS_MIGRATED_REVID=142676227
Diffstat (limited to 'src')
3 files changed, 61 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java index a0aaa5a2ce..da7e446bee 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java @@ -275,7 +275,17 @@ public class CcProtoAspect extends NativeAspectClass implements ConfiguredAspect } private void createProtoCompileAction(SupportData supportData, Collection<Artifact> outputs) { - String genfilesPath = ruleContext.getConfiguration().getGenfilesFragment().getPathString(); + String genfilesPath = + ruleContext + .getConfiguration() + .getGenfilesFragment() + .getRelative( + ruleContext + .getLabel() + .getPackageIdentifier() + .getRepository() + .getPathUnderExecRoot()) + .getPathString(); ImmutableList.Builder<ToolchainInvocation> invocations = ImmutableList.builder(); invocations.add( diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD index 1bae10ad1e..6761357d70 100644 --- a/src/test/java/com/google/devtools/build/lib/BUILD +++ b/src/test/java/com/google/devtools/build/lib/BUILD @@ -967,6 +967,7 @@ java_test( ":analysis_testutil", "//src/main/java/com/google/devtools/build/lib:build-base", "//src/main/java/com/google/devtools/build/lib:vfs", + "//src/main/java/com/google/devtools/build/lib/actions", "//src/main/java/com/google/devtools/build/lib/rules/cpp", "//src/main/java/com/google/devtools/build/lib/rules/cpp/proto:ProtoCcHeaderProvider", "//third_party:guava", diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryTest.java index 90a4a17578..b138480cc3 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryTest.java @@ -15,10 +15,13 @@ package com.google.devtools.build.lib.rules.cpp.proto; import static com.google.common.truth.Truth.assertThat; +import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.getFirstArtifactEndingWith; import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.prettyArtifactNames; import com.google.common.collect.ImmutableList; import com.google.common.eventbus.EventBus; +import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; import com.google.devtools.build.lib.rules.cpp.CppCompilationContext; import com.google.devtools.build.lib.vfs.FileSystemUtils; @@ -121,5 +124,51 @@ public class CcProtoLibraryTest extends BuildViewTestCase { .containsExactly("x/foo.pb.h", "x/bar.pb.h"); } + @Test + public void outputDirectoryForProtoCompileAction() throws Exception { + scratch.file( + "x/BUILD", + "cc_proto_library(name = 'foo_cc_proto', deps = [':bar_proto'])", + "proto_library(name = 'bar_proto', srcs = ['bar.proto'])"); + + Artifact hFile = + getFirstArtifactEndingWith( + getFilesToBuild(getConfiguredTarget("//x:foo_cc_proto")), "bar.pb.h"); + SpawnAction protoCompileAction = getGeneratingSpawnAction(hFile); + + assertThat(protoCompileAction.getArguments()) + .contains( + String.format( + "--cpp_out=%s", getTargetConfiguration().getGenfilesFragment().toString())); + } + + @Test + public void outputDirectoryForProtoCompileAction_externalRepos() throws Exception { + scratch.file( + "x/BUILD", "cc_proto_library(name = 'foo_cc_proto', deps = ['@bla//foo:bar_proto'])"); + + // Create the rule '@bla//foo:bar_proto'. + scratch.file( + "/bla/foo/BUILD", + "package(default_visibility=['//visibility:public'])", + "proto_library(name = 'bar_proto', srcs = ['bar.proto'])"); + String existingWorkspace = + new String(FileSystemUtils.readContentAsLatin1(rootDirectory.getRelative("WORKSPACE"))); + scratch.overwriteFile( + "WORKSPACE", "local_repository(name = 'bla', path = '/bla/')", existingWorkspace); + invalidatePackages(); // A dash of magic to re-evaluate the WORKSPACE file. + + Artifact hFile = + getFirstArtifactEndingWith( + getFilesToBuild(getConfiguredTarget("//x:foo_cc_proto")), "bar.pb.h"); + SpawnAction protoCompileAction = getGeneratingSpawnAction(hFile); + + assertThat(protoCompileAction.getArguments()) + .contains( + String.format( + "--cpp_out=%s/external/bla", + getTargetConfiguration().getGenfilesFragment().toString())); + } + // TODO(carmi): test blacklisted protos. I don't currently understand what's the wanted behavior. } |