| set -euo pipefail | |
| source "$(rlocation rules_cc/tests/test_utils.sh)" | |
| source "$(rlocation rules_cc/tests/unittest.bash)" | |
| function test_cc_shared_library_doesnt_link_libs_unnecessarily() { | |
| mkdir -p foo/bar | |
| cat > foo/baz.cc << EOF | |
| #include "foo/baz.h" | |
| int baz() { return 0; } | |
| EOF | |
| cat > foo/baz.h << EOF | |
| int baz(); | |
| EOF | |
| cat > foo/foo2.cc << EOF | |
| #include "foo/foo2.h" | |
| int foo2() { return 0; } | |
| EOF | |
| cat > foo/foo2.h << EOF | |
| int foo2(); | |
| EOF | |
| cat > foo/foo.cc << EOF | |
| #include "foo/bar/bar.h" | |
| // Included but symbol not used. | |
| #include "foo/baz.h" | |
| #include "foo/foo2.h" | |
| int foo() { return foo2() + bar() + 0; } | |
| EOF | |
| cat > foo/BUILD << EOF | |
| load("@rules_cc//cc:cc_library.bzl", "cc_library") | |
| load("@rules_cc//cc:cc_shared_library.bzl", "cc_shared_library") | |
| cc_library( | |
| name = "foo2", | |
| srcs = ["foo2.cc"], | |
| hdrs = ["foo2.h"], | |
| ) | |
| cc_library( | |
| name = "foo", | |
| srcs = ["foo.cc",], | |
| deps = [ | |
| ":baz", | |
| ":foo2", | |
| "//foo/bar", | |
| ], | |
| ) | |
| cc_library( | |
| name = "baz", | |
| srcs = ["baz.cc",], | |
| hdrs = ["baz.h",], | |
| ) | |
| cc_shared_library( | |
| name = "foo_shared", | |
| dynamic_deps = [ | |
| "//foo/bar:bar_shared", | |
| ], | |
| deps = [ | |
| ":foo", | |
| ], | |
| ) | |
| EOF | |
| cat > foo/bar/bar2.cc << EOF | |
| #include "foo/bar/bar2.h" | |
| int bar2() { return 0; } | |
| EOF | |
| echo "int bar2();" > foo/bar/bar2.h | |
| cat > foo/bar/bar.cc << EOF | |
| #include "foo/bar/bar.h" | |
| #include "foo/bar/bar2.h" | |
| int bar() { return bar2() + 0; } | |
| EOF | |
| echo "int bar();" > foo/bar/bar.h | |
| cat > foo/bar/BUILD << EOF | |
| load("@rules_cc//cc:cc_library.bzl", "cc_library") | |
| load("@rules_cc//cc:cc_shared_library.bzl", "cc_shared_library") | |
| package( | |
| default_visibility = [ | |
| "//visibility:public", | |
| ], | |
| ) | |
| cc_library( | |
| name = "bar2", | |
| srcs = ["bar2.cc"], | |
| hdrs = ["bar2.h"], | |
| ) | |
| cc_library( | |
| name = "bar", | |
| srcs = ["bar.cc"], | |
| hdrs = ["bar.h"], | |
| deps = [":bar2"], | |
| ) | |
| cc_shared_library( | |
| name = "bar_shared", | |
| deps = [":bar"], | |
| ) | |
| EOF | |
| bazel build \ | |
| --noincompatible_remove_legacy_whole_archive \ | |
| --experimental_cc_shared_library \ | |
| //foo:foo_shared >& "${TEST_log}" || fail "Expected build to succeed" | |
| so_file="bazel-bin/foo/libfoo_shared.so" | |
| nm -D "$so_file" | grep -q "T _Z3foov" || fail "_Z3foov not linked statically" | |
| nm -D "$so_file" | grep -q "T _Z4foo2v" || fail "_Z4foo2v not linked statically" | |
| nm -D "$so_file" | grep -q "U _Z3barv" || fail "_Z3barv not linked dynamically" | |
| nm -D "$so_file" | grep -q "baz" && fail "baz shoulod not be linked in anyway" | |
| nm -D "$so_file" | grep -q "bar2" && fail "bar2 shoulod not be linked in anyway" | |
| return 0 | |
| } | |
| run_suite "Integration tests for cc_shared_library" |