Files
obx-pkgs/by-name/openzl/default.nix
T
2026-05-31 21:16:19 +02:00

103 lines
2.8 KiB
Nix

{
autoPatchelfHook,
pkg-config,
cmake,
fetchFromGitHub,
patchelf,
python3,
stdenv,
xgboost,
}:
stdenv.mkDerivation {
pname = "openzl";
version = "0.2.0";
src = fetchFromGitHub {
owner = "facebook";
repo = "openzl";
rev = "46e4826715ed31c9fe13922951f088f0af5b6a91";
sha256 = "sha256-ZMFoEjgKQPVF+u3gNtKpNwuql1X3wemg4ug/Qy+Js1o=";
fetchSubmodules = true;
};
nativeBuildInputs = [
autoPatchelfHook
cmake
patchelf
pkg-config
python3
];
buildInputs = [ xgboost ];
# Replace the ExternalProject_Add(xgboost_external ...) block in ml_selector
# with find_package calls and a stub INTERFACE target, so the nixpkgs xgboost
# is used instead of downloading from github (which is not allowed in the sandbox).
preConfigure = ''
python3 - <<'PYEOF'
import re, pathlib
p = pathlib.Path("tools/ml_selector/CMakeLists.txt")
src = p.read_text()
replacement = """\
find_package(xgboost REQUIRED)
# Stub target: downstream CMakeLists add_dependencies on xgboost_external
add_library(xgboost_external INTERFACE)
target_link_libraries(xgboost_external INTERFACE xgboost::xgboost)
add_library(xgboost ALIAS xgboost::xgboost)
"""
# Replace everything from include(ExternalProject) up to (and including)
# add_dependencies(dmlc xgboost_external)
src = re.sub(
r'include\(ExternalProject\).*?add_dependencies\(dmlc xgboost_external\)\n',
replacement,
src,
flags=re.DOTALL,
)
# Fix ml_selector include path: remove reference to XGBOOST_INSTALL_DIR
src = src.replace(
" ''${XGBOOST_INSTALL_DIR}/include\n",
"",
)
# Replace xgboost/dmlc link targets with xgboost::xgboost (dmlc is bundled in xgboost)
src = src.replace(
" openzl\n openzl_cpp\n xgboost\n dmlc\n",
" openzl\n openzl_cpp\n xgboost::xgboost\n",
)
p.write_text(src)
PYEOF
'';
postInstall = ''
# Install the zli CLI and all its internal shared libraries that CMake
# does not install by default (libcommands.so, libargs.so, etc.).
install -Dm755 cli/zli $out/bin/zli
find "$NIX_BUILD_TOP" \( -name '*.so' -o -name '*.so.*' \) \
-not -path "$out/*" \
-exec install -Dm755 {} -t $out/lib \;
# Fix rpaths: replace build-dir references with $out/lib
for f in $out/bin/* $out/lib/*.so $out/lib/*.so.*; do
[ -f "$f" ] || continue
patchelf --set-rpath "$out/lib" "$f" || true
done
'';
cmakeFlags = [
"-DBUILD_SHARED_LIBS=ON"
"-DOPENZL_BUILD_TESTS=OFF"
"-DOPENZL_BUILD_BENCHMARKS=OFF"
"-DOPENZL_BUILD_PYTHON_EXT=OFF"
"-DOPENZL_BUILD_EXAMPLES=OFF"
"-DOPENZL_ALLOW_INTROSPECTION=ON"
];
meta.mainProgram = "zli";
}