118 lines
2.6 KiB
Text
118 lines
2.6 KiB
Text
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"],
|
|
)
|