load(
"@io_tweag_rules_haskell//haskell:haskell.bzl",
"haskell_library",
"haskell_test",
)
load("//tests:inline_tests.bzl", "sh_inline_test")
# test whether `linkstatic` works as expected
package(default_testonly = 1)
cc_library(
name = "c-lib",
srcs = ["c-lib.c"],
)
haskell_library(
name = "HsLib",
srcs = ["HsLib.hs"],
deps = [
"//tests/hackage:base",
],
)
haskell_test(
name = "binary-static",
srcs = ["Main.hs"],
linkstatic = True,
deps = [
":HsLib",
":c-lib",
"//tests/hackage:base",
],
)
haskell_test(
name = "binary-dynamic",
srcs = ["Main.hs"],
linkstatic = False,
deps = [
":HsLib",
":c-lib",
"//tests/hackage:base",
],
)
config_setting(
name = "debug_build",
values = {
"compilation_mode": "dbg",
},
)
# Ensure that linkstatic=True only links to static library targets.
sh_inline_test(
name = "test-binary-static-symbols",
size = "small",
args = [
"$(rootpath :binary-static)",
],
data = [
":binary-static",
],
script = """
set -eo pipefail
binary="$1"
# Symbols are prefixed with underscore on MacOS but not on Linux.
if nm -u "$binary" | grep -q "\<_\?value"; then
echo "C library dependency not linked statically: ${binary}"
exit 1
fi
if nm -u "$binary" | grep -q HsLib_value_closure; then
echo "Haskell library dependency not linked statically ${binary}"
exit 1
fi
""",
)
# Ensure that linkstatic=False only links to dynamic library targets.
sh_inline_test(
name = "test-binary-dynamic-symbols",
size = "small",
args = [
"$(rootpath :binary-dynamic)",
] + select({
":debug_build": ["dbg"],
"//conditions:default": ["rls"],
}),
data = [
":binary-dynamic",
],
script = """
set -eo pipefail
binary="$1"
mode="$2"
if [[ $mode = dbg ]]; then
# Skip test in debug builds. Debug mode forces static linking.
exit 0
fi
# Symbols are prefixed with underscore on MacOS but not on Linux.
if ! nm -u "$binary" | grep -q "\<_\?value"; then
echo "C library dependency not linked dynamically"
exit 1
fi
if ! nm -u "$binary" | grep -q HsLib_value_closure; then
echo "Haskell library dependency not linked dynamically"
exit 1
fi
""",
)
test_suite(
name = "binary-linkstatic-flag",
tests = [
":test-binary-dynamic-symbols",
":test-binary-static-symbols",
],
visibility = ["//visibility:public"],
)