| # --- begin runfiles.bash initialization --- |
| set -euo pipefail |
| if [[ ! -d "${RUNFILES_DIR:-/dev/null}" && ! -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then |
| if [[ -f "$0.runfiles_manifest" ]]; then |
| export RUNFILES_MANIFEST_FILE="$0.runfiles_manifest" |
| elif [[ -f "$0.runfiles/MANIFEST" ]]; then |
| export RUNFILES_MANIFEST_FILE="$0.runfiles/MANIFEST" |
| elif [[ -f "$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then |
| export RUNFILES_DIR="$0.runfiles" |
| fi |
| fi |
| if [[ -f "${RUNFILES_DIR:-/dev/null}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then |
| source "${RUNFILES_DIR}/bazel_tools/tools/bash/runfiles/runfiles.bash" |
| elif [[ -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then |
| source "$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \ |
| "$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)" |
| else |
| echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash" |
| exit 1 |
| fi |
| # --- end runfiles.bash initialization --- |
| |
| source "$(rlocation rules_cc/tests/system_library/unittest.bash)" \ |
| || { echo "Could not rules_cc/source tests/system_library/unittest.bash" >&2; exit 1; } |
| |
| |
| function setup_system_library() { |
| mkdir -p systemlib |
| |
| cat << EOF > systemlib/foo.cc |
| int bar() { |
| return 42; |
| } |
| EOF |
| |
| cat << EOF > systemlib/foo.h |
| int bar(); |
| EOF |
| |
| cd systemlib |
| |
| g++ -c -fpic foo.cc || fail "Expected foo.o to build successfully" |
| g++ -shared -o libfoo.so foo.o || fail "Expected foo.so to build successfully" |
| g++ -c foo.cc || fail "Expected foo.o to build successfully" |
| ar rvs foo.a foo.o || fail "Expected foo.a to build successfully" |
| |
| cd .. |
| |
| cat << EOF > WORKSPACE |
| load("//:cc/system_library.bzl", "system_library") |
| system_library( |
| name = "foo", |
| hdrs = [ |
| "foo.h", |
| ], |
| static_lib_names = ["libfoo.a"], |
| shared_lib_names = ["libfoo.so"] |
| ) |
| |
| system_library( |
| name = "foo_hardcoded_path", |
| hdrs = [ |
| "foo.h", |
| ], |
| static_lib_names = ["libfoo.a"], |
| shared_lib_names = ["libfoo.so"], |
| lib_path_hints = ["${PWD}/systemlib"], |
| includes = ["${PWD}/systemlib"] |
| ) |
| EOF |
| |
| cat << EOF > BUILD |
| cc_binary( |
| name = "test", |
| srcs = ["test.cc"], |
| deps = ["@foo"] |
| ) |
| |
| cc_binary( |
| name = "test_static", |
| srcs = ["test.cc"], |
| deps = ["@foo"], |
| linkstatic = True |
| ) |
| |
| cc_binary( |
| name = "test_hardcoded_path", |
| srcs = ["test.cc"], |
| deps = ["@foo_hardcoded_path"] |
| ) |
| |
| cc_binary( |
| name = "test_static_hardcoded_path", |
| srcs = ["test.cc"], |
| deps = ["@foo_hardcoded_path"], |
| linkstatic = True |
| ) |
| |
| cc_binary( |
| name = "fake_rbe", |
| srcs = ["test.cc"], |
| deps = ["@foo_hardcoded_path"] |
| ) |
| EOF |
| |
| cat << EOF > test.cc |
| #include "foo.h" |
| |
| int main() { |
| return 42 - bar(); |
| } |
| EOF |
| } |
| #### TESTS ############################################################# |
| |
| # Make sure it fails with a correct message when no library is found |
| function test_system_library_not_found() { |
| setup_system_library |
| |
| bazel run //:test \ |
| --experimental_starlark_cc_import \ |
| --experimental_repo_remote_exec \ |
| &> $TEST_log \ |
| || true |
| expect_log "Library foo could not be found" |
| |
| bazel run //:test_static \ |
| --experimental_starlark_cc_import \ |
| --experimental_repo_remote_exec \ |
| &> $TEST_log \ |
| || true |
| expect_log "Library foo could not be found" |
| } |
| |
| function test_override_paths() { |
| setup_system_library |
| |
| bazel run //:test \ |
| --experimental_starlark_cc_import \ |
| --experimental_repo_remote_exec \ |
| --action_env=BAZEL_LIB_OVERRIDE_PATHS=foo="${PWD}"/systemlib \ |
| --action_env=BAZEL_INCLUDE_OVERRIDE_PATHS=foo="${PWD}"/systemlib \ |
| || fail "Expected test to run successfully" |
| |
| bazel run //:test_static \ |
| --experimental_starlark_cc_import \ |
| --experimental_repo_remote_exec \ |
| --action_env=BAZEL_LIB_OVERRIDE_PATHS=foo="${PWD}"/systemlib \ |
| --action_env=BAZEL_INCLUDE_OVERRIDE_PATHS=foo="${PWD}"/systemlib \ |
| || fail "Expected test_static to run successfully" |
| } |
| |
| function test_additional_paths() { |
| setup_system_library |
| |
| bazel run //:test \ |
| --experimental_starlark_cc_import \ |
| --experimental_repo_remote_exec \ |
| --action_env=BAZEL_LIB_ADDITIONAL_PATHS=foo="${PWD}"/systemlib \ |
| --action_env=BAZEL_INCLUDE_ADDITIONAL_PATHS=foo="${PWD}"/systemlib \ |
| || fail "Expected test to run successfully" |
| |
| bazel run //:test_static \ |
| --experimental_starlark_cc_import \ |
| --experimental_repo_remote_exec \ |
| --action_env=BAZEL_LIB_ADDITIONAL_PATHS=foo="${PWD}"/systemlib \ |
| --action_env=BAZEL_INCLUDE_ADDITIONAL_PATHS=foo="${PWD}"/systemlib \ |
| || fail "Expected test_static to run successfully" |
| } |
| |
| function test_hardcoded_paths() { |
| setup_system_library |
| |
| bazel run //:test_hardcoded_path \ |
| --experimental_starlark_cc_import \ |
| --experimental_repo_remote_exec \ |
| || fail "Expected test_hardcoded_path to run successfully" |
| |
| bazel run //:test_static_hardcoded_path \ |
| --experimental_starlark_cc_import \ |
| --experimental_repo_remote_exec \ |
| || fail "Expected test_static_hardcoded_path to run successfully" |
| } |
| |
| function test_system_library_no_lib_names() { |
| cat << EOF > WORKSPACE |
| load("//:cc/system_library.bzl", "system_library") |
| system_library( |
| name = "foo", |
| hdrs = [ |
| "foo.h", |
| ] |
| ) |
| EOF |
| |
| cat << EOF > BUILD |
| cc_binary( |
| name = "test", |
| srcs = ["test.cc"], |
| deps = ["@foo"] |
| ) |
| EOF |
| |
| # It should fail when no static_lib_names and static_lib_names are given |
| bazel run //:test \ |
| --experimental_starlark_cc_import \ |
| --experimental_repo_remote_exec \ |
| &> $TEST_log \ |
| || true |
| expect_log "Library foo could not be found" |
| } |
| |
| run_suite "Integration tests for system_library." |