nixpkgs/pkgs/servers/foundationdb/cmake.nix
2023-04-26 16:35:10 +03:00

152 lines
6.0 KiB
Nix

# This builder is for FoundationDB CMake build system.
{ lib, fetchFromGitHub
, cmake, ninja, python3, openjdk, mono, pkg-config
, msgpack, toml11
, gccStdenv, llvmPackages
, useClang ? false
, ...
}:
let
stdenv = if useClang then llvmPackages.libcxxStdenv else gccStdenv;
tests = builtins.replaceStrings [ "\n" ] [ " " ] (lib.fileContents ./test-list.txt);
# Only even numbered versions compile on aarch64; odd numbered versions have avx enabled.
avxEnabled = version:
let
isOdd = n: lib.trivial.mod n 2 != 0;
patch = lib.toInt (lib.versions.patch version);
in isOdd patch;
makeFdb =
{ version
, sha256
, rev ? "refs/tags/${version}"
, officialRelease ? true
, patches ? []
, boost
, ssl
}: stdenv.mkDerivation {
pname = "foundationdb";
inherit version;
src = fetchFromGitHub {
owner = "apple";
repo = "foundationdb";
inherit rev sha256;
};
buildInputs = [ ssl boost ]
++ lib.optionals (lib.versionAtLeast version "7.1.0") [ msgpack toml11 ];
nativeBuildInputs = [ pkg-config cmake ninja python3 openjdk mono ]
++ lib.optionals useClang [ llvmPackages.lld ];
separateDebugInfo = true;
dontFixCmake = true;
cmakeFlags =
[ (lib.optionalString officialRelease "-DFDB_RELEASE=TRUE")
# Disable CMake warnings for project developers.
"-Wno-dev"
# CMake Error at fdbserver/CMakeLists.txt:332 (find_library):
# > Could not find lz4_STATIC_LIBRARIES using the following names: liblz4.a
"-DSSD_ROCKSDB_EXPERIMENTAL=FALSE"
# FoundationDB's CMake is hardcoded to pull in jemalloc as an external
# project at build time.
"-DUSE_JEMALLOC=FALSE"
# LTO brings up overall build time, but results in much smaller
# binaries for all users and the cache.
(lib.optionalString (!useClang) "-DUSE_LTO=ON")
# Gold helps alleviate the link time, especially when LTO is
# enabled. But even then, it still takes a majority of the time.
# Same with LLD when Clang is available.
(lib.optionalString useClang "-DUSE_LD=LLD")
(lib.optionalString (!useClang) "-DUSE_LD=GOLD")
] ++ lib.optionals (lib.versionOlder version "7.0.0")
[ # FIXME: why can't libressl be found automatically?
"-DLIBRESSL_USE_STATIC_LIBS=FALSE"
"-DLIBRESSL_INCLUDE_DIR=${ssl.dev}"
"-DLIBRESSL_CRYPTO_LIBRARY=${ssl.out}/lib/libcrypto.so"
"-DLIBRESSL_SSL_LIBRARY=${ssl.out}/lib/libssl.so"
"-DLIBRESSL_TLS_LIBRARY=${ssl.out}/lib/libtls.so"
] ++ lib.optionals (lib.versionAtLeast version "7.1.0" && lib.versionOlder version "7.2.0")
[ # FIXME: why can't openssl be found automatically?
"-DOPENSSL_USE_STATIC_LIBS=FALSE"
"-DOPENSSL_CRYPTO_LIBRARY=${ssl.out}/lib/libcrypto.so"
"-DOPENSSL_SSL_LIBRARY=${ssl.out}/lib/libssl.so"
];
hardeningDisable = [ "fortify" ];
env.NIX_CFLAGS_COMPILE = toString [
# Needed with GCC 12
"-Wno-error=missing-template-keyword"
# Needed to compile on aarch64
(lib.optionalString stdenv.isAarch64 "-march=armv8-a+crc")
];
inherit patches;
# the install phase for cmake is pretty wonky right now since it's not designed to
# coherently install packages as most linux distros expect -- it's designed to build
# packaged artifacts that are shipped in RPMs, etc. we need to add some extra code to
# cmake upstream to fix this, and if we do, i think most of this can go away.
postInstall = lib.optionalString (lib.versionOlder version "7.0.0") ''
mv $out/fdbmonitor/fdbmonitor $out/bin/fdbmonitor && rm -rf $out/fdbmonitor
mkdir $out/libexec && ln -sfv $out/bin/fdbbackup $out/libexec/backup_agent
rm -rf $out/Library
rm -rf $out/lib/foundationdb/
mkdir $out/include/foundationdb && \
mv $out/include/*.h $out/include/*.options $out/include/foundationdb
'' + lib.optionalString (lib.versionAtLeast version "7.0.0") ''
mv $out/sbin/fdbmonitor $out/bin/fdbmonitor
mkdir $out/libexec && mv $out/usr/lib/foundationdb/backup_agent/backup_agent $out/libexec/backup_agent
'' + ''
mv $out/sbin/fdbserver $out/bin/fdbserver
rm -rf $out/etc $out/lib/foundationdb $out/lib/systemd $out/log $out/sbin $out/usr $out/var
# move results into multi outputs
mkdir -p $dev $lib
mv $out/include $dev/include
mv $out/lib $lib/lib
# python bindings
# NB: use the original setup.py.in, so we can substitute VERSION correctly
cp ../LICENSE ./bindings/python
substitute ../bindings/python/setup.py.in ./bindings/python/setup.py \
--replace 'VERSION' "${version}"
rm -f ./bindings/python/setup.py.* ./bindings/python/CMakeLists.txt
rm -f ./bindings/python/fdb/*.pth # remove useless files
rm -f ./bindings/python/*.rst ./bindings/python/*.mk
cp -R ./bindings/python/ tmp-pythonsrc/
tar -zcf $pythonsrc --transform s/tmp-pythonsrc/python-foundationdb/ ./tmp-pythonsrc/
# java bindings
mkdir -p $lib/share/java
mv lib/fdb-java-*.jar $lib/share/java/fdb-java.jar
'';
outputs = [ "out" "dev" "lib" "pythonsrc" ];
meta = with lib; {
description = "Open source, distributed, transactional key-value store";
homepage = "https://www.foundationdb.org";
license = licenses.asl20;
platforms = [ "x86_64-linux" ]
++ lib.optionals (lib.versionAtLeast version "7.1.0" && !(avxEnabled version)) [ "aarch64-linux" ];
maintainers = with maintainers; [ thoughtpolice lostnet ];
};
};
in makeFdb