blob: 24471cd705f835b2270954a40e7679b0f0de0951 [file]
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"
local so_file="bazel-bin/foo/libfoo_shared.so"
local nm_flag="-D"
local symbol_prefix="_Z"
if is_darwin; then
so_file="bazel-bin/foo/libfoo_shared.dylib"
symbol_prefix="__Z"
# nm -g reads global symbols rather than the Mach-O export trie. This test
# assumes that defined global symbols are also exported.
nm_flag="-g"
fi
nm "$nm_flag" "$so_file" | grep -q "T ${symbol_prefix}3foov" || fail "${symbol_prefix}3foov not linked statically"
nm "$nm_flag" "$so_file" | grep -q "T ${symbol_prefix}4foo2v" || fail "${symbol_prefix}4foo2v not linked statically"
nm "$nm_flag" "$so_file" | grep -q "U ${symbol_prefix}3barv" || fail "${symbol_prefix}3barv not linked dynamically"
nm "$nm_flag" "$so_file" | grep -q "baz" && fail "baz shoulod not be linked in anyway"
nm "$nm_flag" "$so_file" | grep -q "bar2" && fail "bar2 shoulod not be linked in anyway"
return 0
}
run_suite "Integration tests for cc_shared_library"