load(
"@io_tweag_rules_haskell//haskell:haskell.bzl",
"haskell_library",
)
load("//tests:inline_tests.bzl", "sh_inline_test")
load(":get_library_files.bzl", "get_libraries_as_runfiles")
# test whether `linkstatic` works as expected
package(default_testonly = 1)
# only .a files
haskell_library(
name = "library-static-only",
srcs = ["Lib.hs"],
linkstatic = True, # <--
visibility = ["//visibility:public"],
deps = [
"//tests/hackage:base",
"//tests/hackage:bytestring",
],
)
# both .a and .so files
haskell_library(
name = "library-static-and-dynamic",
srcs = ["Lib.hs"],
linkstatic = False, # <--
visibility = ["//visibility:public"],
deps = [
"//tests/hackage:base",
"//tests/hackage:bytestring",
],
)
# extract all libraries from the haskell_library
get_libraries_as_runfiles(
name = "library-static-only-libraries",
library = ":library-static-only",
)
get_libraries_as_runfiles(
name = "library-static-and-dynamic-libraries",
library = ":library-static-and-dynamic",
)
# sh_test’s `data` doesn’t add stuff to runfiles :(
# sh_library can bundle different targets as runfiles for sh_test
# TODO(Profpatsch): add functionality to sh_inline_test by default?
sh_library(
name = "bundled-dependency-files-static-only",
data = [":library-static-only-libraries"],
)
sh_library(
name = "bundled-dependency-files-static-and-dynamic",
data = [":library-static-and-dynamic-libraries"],
)
# ensure that linkstatic=True only creates only .a, no .so
sh_inline_test(
name = "library-linkstatic-flag",
size = "small",
# pass the file names as arguments
args = ["$(rootpaths :library-static-only-libraries)"],
data = [
# for rootpaths
":library-static-only-libraries",
# to actually get the files …
":bundled-dependency-files-static-only",
],
script = """
set -euo pipefail
for f in "$@"; do
if ! [[ "$f" =~ .a$ ]]; then
echo "not a static library: $f"
exit 1
fi
done
""",
)
# test whether .so is linked dynamically and .a statically
sh_inline_test(
name = "test-libraries-static-and-dynamic",
size = "small",
# pass the file names as arguments
args = ["$(rootpaths :library-static-and-dynamic-libraries)"],
data = [
# for rootpaths
":library-static-and-dynamic-libraries",
# to actually get the files …
":bundled-dependency-files-static-and-dynamic",
],
script = """
set -euo pipefail
is_dynamic () {
# taken from https://github.com/NixOS/nixpkgs/blob/0b3f50f844e2a6b507b18d7c5259bb850b382f87/pkgs/build-support/setup-hooks/auto-patchelf.sh#L167-L170
readelf -l -- "$1" | grep -q "^ *INTERP\\>"
}
for f in "$@"; do
if [[ "$f" =~ .a$ ]] && is_dynamic "$f"; then
echo "should be a static executable: $f"
exit 1
fi
if [[ "$f" =~ .so$ ]] && ! is_dynamic "$f"; then
echo "should be a dynamic executable: $f"
exit 1
fi
done
""",
)