diff --git a/src/main/starlark/builtins_bzl/common/cc/cc_binary.bzl b/src/main/starlark/builtins_bzl/common/cc/cc_binary.bzl index e132b5e58f94c5..da8a5c277d9e39 100644 --- a/src/main/starlark/builtins_bzl/common/cc/cc_binary.bzl +++ b/src/main/starlark/builtins_bzl/common/cc/cc_binary.bzl @@ -690,7 +690,7 @@ def cc_binary_impl(ctx, additional_linkopts): cc_toolchain = cc_toolchain, user_compile_flags = cc_helper.get_copts(ctx, common, feature_configuration, additional_make_variable_substitutions), defines = common.defines, - local_defines = common.local_defines, + local_defines = common.local_defines + cc_helper.get_local_defines_for_runfiles_libraries(ctx), loose_includes = common.loose_include_dirs, system_includes = common.system_include_dirs, private_hdrs = common.private_hdrs, diff --git a/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl b/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl index f4226daf0030d6..8dbd1ef4adfee8 100644 --- a/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl +++ b/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl @@ -916,6 +916,15 @@ def _is_stamping_enabled_for_aspect(ctx): stamp = ctx.rule.attr.stamp return stamp +_DEPS_ATTRS = ["deps", "implementation_deps"] + +def _get_local_defines_for_runfiles_libraries(ctx): + for attr in _DEPS_ATTRS: + for dep in getattr(ctx.attr, attr, []): + if RunfilesLibraryInfo in dep: + return ["BAZEL_CURRENT_REPOSITORY=\"{}\"".format(ctx.label.workspace_name)] + return [] + cc_helper = struct( merge_cc_debug_contexts = _merge_cc_debug_contexts, is_code_coverage_enabled = _is_code_coverage_enabled, @@ -960,4 +969,5 @@ cc_helper = struct( build_linking_context_from_libraries = _build_linking_context_from_libraries, is_stamping_enabled = _is_stamping_enabled, is_stamping_enabled_for_aspect = _is_stamping_enabled_for_aspect, + get_local_defines_for_runfiles_libraries = _get_local_defines_for_runfiles_libraries, ) diff --git a/src/main/starlark/builtins_bzl/common/cc/cc_library.bzl b/src/main/starlark/builtins_bzl/common/cc/cc_library.bzl index 3df80e994e34c3..1354ba8a399f31 100755 --- a/src/main/starlark/builtins_bzl/common/cc/cc_library.bzl +++ b/src/main/starlark/builtins_bzl/common/cc/cc_library.bzl @@ -58,7 +58,7 @@ def _cc_library_impl(ctx): feature_configuration = feature_configuration, user_compile_flags = cc_helper.get_copts(ctx, common, feature_configuration, additional_make_variable_substitutions), defines = common.defines, - local_defines = common.local_defines, + local_defines = common.local_defines + cc_helper.get_local_defines_for_runfiles_libraries(ctx), loose_includes = common.loose_include_dirs, system_includes = common.system_include_dirs, copts_filter = common.copts_filter, diff --git a/src/test/shell/bazel/cc_integration_test.sh b/src/test/shell/bazel/cc_integration_test.sh index 24d94b5cd33c93..fd5e887fcc70bc 100755 --- a/src/test/shell/bazel/cc_integration_test.sh +++ b/src/test/shell/bazel/cc_integration_test.sh @@ -1506,4 +1506,67 @@ EOF expect_log "\"PWD\": \"/proc/self/cwd\"" } +function test_bazel_current_repository_define() { + add_to_bazelrc "build --experimental_cc_implementation_deps" + + mkdir -p pkg + cat > pkg/BUILD.bazel <<'EOF' +cc_library( + name = "library", + srcs = ["define.cpp"], + deps = ["@bazel_tools//tools/cpp/runfiles"], +) +cc_library( + name = "library_implementation_deps", + srcs = ["define.cpp"], + implementation_deps = ["@bazel_tools//tools/cpp/runfiles"], +) +cc_library( + name = "library_fail", + srcs = ["define.cpp"], +) + +cc_binary( + name = "binary", + srcs = ["define.cpp"], + deps = ["@bazel_tools//tools/cpp/runfiles"], +) +cc_binary( + name = "binary_fail", + srcs = ["define.cpp"], + deps = [":library"], +) + +cc_test( + name = "test", + srcs = ["define.cpp"], + deps = ["@bazel_tools//tools/cpp/runfiles"], +) +cc_test( + name = "test_fail", + srcs = ["define.cpp"], + deps = [":library"], +) +EOF + + cat > pkg/define.cpp <<'EOF' +#include +int main() { + std::cout << BAZEL_CURRENT_REPOSITORY << std::endl; +} +EOF + + bazel build //pkg:library &>"$TEST_log" || fail "Build should succeed" + bazel build //pkg:library_implementation_deps &>"$TEST_log" || fail "Build should succeed" + bazel build //pkg:binary &>"$TEST_log" || fail "Build should succeed" + bazel build //pkg:test &>"$TEST_log" || fail "Build should succeed" + + bazel build //pkg:library_fail &>"$TEST_log" && fail "Build should fail" + expect_log "'BAZEL_CURRENT_REPOSITORY'" + bazel build //pkg:binary_fail &>"$TEST_log" && fail "Build should fail" + expect_log "'BAZEL_CURRENT_REPOSITORY'" + bazel build //pkg:test_fail &>"$TEST_log" && fail "Build should fail" + expect_log "'BAZEL_CURRENT_REPOSITORY'" +} + run_suite "cc_integration_test" diff --git a/tools/cpp/BUILD b/tools/cpp/BUILD index d3217b08e14ceb..854e2a0ded02f9 100644 --- a/tools/cpp/BUILD +++ b/tools/cpp/BUILD @@ -34,7 +34,9 @@ filegroup( filegroup( name = "bzl_srcs", - srcs = glob(["*.bzl"]), + srcs = glob(["*.bzl"]) + [ + "//tools/cpp/runfiles:bzl_srcs", + ], visibility = ["//tools:__pkg__"], ) diff --git a/tools/cpp/runfiles/BUILD b/tools/cpp/runfiles/BUILD index f58d8aaf65fead..3abaefd9ac426c 100644 --- a/tools/cpp/runfiles/BUILD +++ b/tools/cpp/runfiles/BUILD @@ -16,11 +16,18 @@ filegroup( name = "embedded_tools", srcs = [ "BUILD.tools", + "cc_runfiles_library.bzl", ":srcs_for_embedded_tools", ], visibility = ["//tools/cpp:__pkg__"], ) +filegroup( + name = "bzl_srcs", + srcs = glob(["*.bzl"]), + visibility = ["//tools/cpp:__pkg__"], +) + # Rewrite the include path for runfiles.h in runfiles_src.cc, and create # "generated_runfiles.{h,cc}". These files are renamed to "runfiles.{h,cc}" as # part of creating the embedded tools of Bazel. diff --git a/tools/cpp/runfiles/BUILD.tools b/tools/cpp/runfiles/BUILD.tools index ef9518c05b8b15..d7de79dab8277e 100644 --- a/tools/cpp/runfiles/BUILD.tools +++ b/tools/cpp/runfiles/BUILD.tools @@ -1,8 +1,13 @@ -# This package will host the C++ runfiles library when it's finally released. +load(":cc_runfiles_library.bzl", "cc_runfiles_library") -cc_library( +cc_runfiles_library( name = "runfiles", + exports = ":runfiles_impl", + visibility = ["//visibility:public"], +) + +cc_library( + name = "runfiles_impl", srcs = ["runfiles.cc"], hdrs = ["runfiles.h"], - visibility = ["//visibility:public"], ) diff --git a/tools/cpp/runfiles/cc_runfiles_library.bzl b/tools/cpp/runfiles/cc_runfiles_library.bzl new file mode 100644 index 00000000000000..4046511a7ba8d6 --- /dev/null +++ b/tools/cpp/runfiles/cc_runfiles_library.bzl @@ -0,0 +1,13 @@ +def _cc_runfiles_library_impl(ctx): + return [ + ctx.attr.exports[DefaultInfo], + ctx.attr.exports[CcInfo], + RunfilesLibraryInfo(), + ] + +cc_runfiles_library = rule( + implementation = _cc_runfiles_library_impl, + attrs = { + "exports": attr.label(), + }, +)