diff options
author | Kristina Chodorow <kchodorow@google.com> | 2015-11-11 17:24:14 +0000 |
---|---|---|
committer | Laszlo Csomor <laszlocsomor@google.com> | 2015-11-12 09:00:15 +0000 |
commit | d4c953f1a987ecde294a586c5c09955d87473100 (patch) | |
tree | 1c0ed4a5fd30c5e43f41c93412a2d96d8582385d /src | |
parent | 3c0af3d90df4e8c3dc1ae8ac2189adb4a019a129 (diff) |
C++ libraries in remote repos don't need to set include paths
Fixes #445, based on https://github.com/bazelbuild/bazel/compare/master...ulfjack:cpp-include-path.
RELNOTES: C++ libraries no longer need includes = ["."] (or similar copts) to include paths relative to a remote repository's root.
--
MOS_MIGRATED_REVID=107593486
Diffstat (limited to 'src')
3 files changed, 55 insertions, 2 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java index 0b5fb442cd..cce02514eb 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java @@ -743,8 +743,11 @@ public final class CcLibraryHelper { // generated files. It is important that the execRoot (EMPTY_FRAGMENT) comes // before the genfilesFragment to preferably pick up source files. Otherwise // we might pick up stale generated files. - contextBuilder.addQuoteIncludeDir(PathFragment.EMPTY_FRAGMENT); - contextBuilder.addQuoteIncludeDir(ruleContext.getConfiguration().getGenfilesFragment()); + PathFragment repositoryPath = + ruleContext.getLabel().getPackageIdentifier().getRepository().getPathFragment(); + contextBuilder.addQuoteIncludeDir(repositoryPath); + contextBuilder.addQuoteIncludeDir( + ruleContext.getConfiguration().getGenfilesFragment().getRelative(repositoryPath)); for (PathFragment systemIncludeDir : systemIncludeDirs) { contextBuilder.addSystemIncludeDir(systemIncludeDir); diff --git a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java index 434cdcfc2c..97221abf6f 100644 --- a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java +++ b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java @@ -379,6 +379,9 @@ public final class PathFragment implements Comparable<PathFragment>, Serializabl * with no path normalization or I/O performed. */ public PathFragment getRelative(PathFragment otherFragment) { + if (otherFragment == EMPTY_FRAGMENT) { + return this; + } return otherFragment.isAbsolute() ? otherFragment : new PathFragment(this, otherFragment); diff --git a/src/test/shell/bazel/local_repository_test.sh b/src/test/shell/bazel/local_repository_test.sh index c0c8cb5de0..8506569d34 100755 --- a/src/test/shell/bazel/local_repository_test.sh +++ b/src/test/shell/bazel/local_repository_test.sh @@ -924,4 +924,51 @@ EOF expect_log "workspace names may contain only A-Z, a-z, 0-9, '-', '_' and '.'" } +function test_remote_includes() { + local remote=$TEST_TMPDIR/r + rm -fr $remote + mkdir -p $remote/inc + + touch $remote/WORKSPACE + cat > $remote/BUILD <<EOF +cc_library( + name = "bar", + srcs = ["bar.cc"], + hdrs = ["inc/bar.h"], + visibility = ["//visibility:public"], +) +EOF + cat > $remote/bar.cc <<EOF +#include "inc/bar.h" +int getNum() { + return 42; +} +EOF + cat > $remote/inc/bar.h <<EOF +int getNum(); +EOF + + cat > WORKSPACE <<EOF +local_repository( + name = "r", + path = "$remote", +) +EOF +cat > BUILD <<EOF +cc_binary( + name = "foo", + srcs = ["foo.cc"], + deps = ["@r//:bar"], +) +EOF + cat > foo.cc <<EOF +#include <stdio.h> +#include "inc/bar.h" +int main() { printf("%d\n", getNum()); return 0; }; +EOF + + bazel run :foo &> $TEST_log || fail "build failed" + expect_log "42" +} + run_suite "local repository tests" |