blob: 0b26f191588115b14c166adf808c76e02c65420e [file] [edit]
set -euo pipefail
source "$(rlocation rules_cc/tests/test_utils.sh)"
source "$(rlocation rules_cc/tests/unittest.bash)"
function set_up() {
if is_bazel; then
local -r clang="$(which clang || true)"
if [[ ! -x "$clang" ]]; then
echo "clang not installed. Skipping test."
return 1
fi
add_to_bazelrc "common --repo_env=CC=$clang"
else
add_to_bazelrc "common --compiler=llvm"
fi
}
function test_thin_lto() {
mkdir -p hello
cat > hello/BUILD << EOF
load("@rules_cc//cc:cc_binary.bzl", "cc_binary")
cc_binary(name = "hello",
srcs = ["hello1.cc", "hello2.cc", "hello.h"],
)
EOF
cat > hello/hello.h << EOF
#include <string>
using namespace std;
string x = "Hello World!";
EOF
cat > hello/hello1.cc << EOF
extern void foo();
int main() {
foo();
}
EOF
cat > hello/hello2.cc << EOF
#include <iostream>
#include "hello/hello.h"
void foo() {
cout << x << endl;
}
EOF
bazel build \
--experimental_ui_debug_all_events \
-c opt \
--features=thin_lto \
--features=nonhost \
hello:hello >& "${TEST_log}" || fail "Build failed"
expect_log "LTO indexing hello/hello"
expect_log "Linking hello/hello"
}
function test_thin_lto_only_dep_has_source() {
mkdir -p hello
cat > hello/BUILD << EOF
load("@rules_cc//cc:cc_binary.bzl", "cc_binary")
load("@rules_cc//cc:cc_library.bzl", "cc_library")
cc_binary(name = "dep_has_source.so",
deps = [":foo.so"],
linkshared = 1,
)
cc_library(name = "foo.so",
srcs = ["foo.cc"],
)
EOF
touch hello/foo.cc
bazel build \
--experimental_ui_debug_all_events \
-c opt \
--features=thin_lto \
--features=nonhost \
hello:dep_has_source.so >& "${TEST_log}" || fail "Build failed"
expect_log "LTO indexing hello/dep_has_source.so"
expect_log "Linking hello/dep_has_source.so"
}
run_suite "Integration tests for LTO with rules_cc"