nixpkgs/pkgs/tools/filesystems/ceph/generic.nix
Daniel Kuehn 987cad84ce ceph: Modify ceph package so that it compiles and runs fine on nixos
With adding a patch that makes 2 absolute paths into 2 relative paths, ensuring the third-party libraries are available
in the python environment used and wrapping the python tools with wrapPrograms does so that the fixed ceph pkg can
compile and run as intended on NixOS.
2018-02-24 18:56:25 +01:00

178 lines
4.5 KiB
Nix

{ stdenv, ensureNewerSourcesHook, cmake, pkgconfig
, which, git
, boost, python2Packages
, libxml2, zlib
, openldap, lttngUst
, babeltrace, gperf
, cunit, snappy
, rocksdb
# Optional Dependencies
, yasm ? null, fcgi ? null, expat ? null
, curl ? null, fuse ? null, libibverbs ? null, librdmacm ? null
, libedit ? null, libatomic_ops ? null, kinetic-cpp-client ? null
, libs3 ? null
# Mallocs
, jemalloc ? null, gperftools ? null
# Crypto Dependencies
, cryptopp ? null
, nss ? null, nspr ? null
# Linux Only Dependencies
, linuxHeaders, libuuid, udev, keyutils, libaio ? null, libxfs ? null
, zfs ? null
# Version specific arguments
, version, src, patches ? [], buildInputs ? []
, ...
}:
# We must have one crypto library
assert cryptopp != null || (nss != null && nspr != null);
with stdenv;
with stdenv.lib;
let
shouldUsePkg = pkg_: let pkg = (builtins.tryEval pkg_).value;
in if lib.any (x: x == system) (pkg.meta.platforms or [])
then pkg else null;
optYasm = shouldUsePkg yasm;
optFcgi = shouldUsePkg fcgi;
optExpat = shouldUsePkg expat;
optCurl = shouldUsePkg curl;
optFuse = shouldUsePkg fuse;
optLibibverbs = shouldUsePkg libibverbs;
optLibrdmacm = shouldUsePkg librdmacm;
optLibedit = shouldUsePkg libedit;
optLibatomic_ops = shouldUsePkg libatomic_ops;
optKinetic-cpp-client = shouldUsePkg kinetic-cpp-client;
optLibs3 = if versionAtLeast version "10.0.0" then null else shouldUsePkg libs3;
optJemalloc = shouldUsePkg jemalloc;
optGperftools = shouldUsePkg gperftools;
optCryptopp = shouldUsePkg cryptopp;
optNss = shouldUsePkg nss;
optNspr = shouldUsePkg nspr;
optLibaio = shouldUsePkg libaio;
optLibxfs = shouldUsePkg libxfs;
optZfs = shouldUsePkg zfs;
hasMon = true;
hasMds = true;
hasOsd = true;
hasRadosgw = optFcgi != null && optExpat != null && optCurl != null && optLibedit != null;
# TODO: Reenable when kinetic support is fixed
#hasKinetic = versionAtLeast version "9.0.0" && optKinetic-cpp-client != null;
hasKinetic = false;
# Malloc implementation (can be jemalloc, tcmalloc or null)
malloc = if optJemalloc != null then optJemalloc else optGperftools;
# We prefer nss over cryptopp
cryptoStr = if optNss != null && optNspr != null then "nss" else
if optCryptopp != null then "cryptopp" else "none";
cryptoLibsMap = {
nss = [ optNss optNspr ];
cryptopp = [ optCryptopp ];
none = [ ];
};
ceph-python-env = python2Packages.python.withPackages (ps: [
ps.sphinx
ps.flask
ps.argparse
ps.cython
ps.setuptools
ps.pip
# Libraries needed by the python tools
ps.Mako
ps.pecan
ps.prettytable
ps.webob
]);
in
stdenv.mkDerivation {
name="ceph-${version}";
inherit src;
patches = [
# ./ceph-patch-cmake-path.patch
./0001-kv-RocksDBStore-API-break-additional.patch
] ++ optionals stdenv.isLinux [
./0002-fix-absolute-include-path.patch
];
nativeBuildInputs = [
cmake
pkgconfig which git python2Packages.wrapPython
(ensureNewerSourcesHook { year = "1980"; })
];
buildInputs = buildInputs ++ cryptoLibsMap.${cryptoStr} ++ [
boost ceph-python-env libxml2 optYasm optLibatomic_ops optLibs3
malloc zlib openldap lttngUst babeltrace gperf cunit
snappy rocksdb
] ++ optionals stdenv.isLinux [
linuxHeaders libuuid udev keyutils optLibaio optLibxfs optZfs
] ++ optionals hasRadosgw [
optFcgi optExpat optCurl optFuse optLibedit
] ++ optionals hasKinetic [
optKinetic-cpp-client
];
preConfigure =''
# rip off submodule that interfer with system libs
rm -rf src/boost
rm -rf src/rocksdb
# require LD_LIBRARY_PATH for cython to find internal dep
export LD_LIBRARY_PATH="$PWD/build/lib:$LD_LIBRARY_PATH"
# requires setuptools due to embedded in-cmake setup.py usage
export PYTHONPATH="${python2Packages.setuptools}/lib/python2.7/site-packages/:$PYTHONPATH"
'';
cmakeFlags = [
"-DENABLE_GIT_VERSION=OFF"
"-DWITH_SYSTEM_BOOST=ON"
"-DWITH_SYSTEM_ROCKSDB=ON"
"-DWITH_LEVELDB=OFF"
# enforce shared lib
"-DBUILD_SHARED_LIBS=ON"
# disable cephfs, cmake build broken for now
"-DWITH_CEPHFS=OFF"
"-DWITH_LIBCEPHFS=OFF"
];
postFixup = ''
wrapPythonPrograms
'';
enableParallelBuilding = true;
outputs = [ "dev" "lib" "out" "doc" ];
meta = {
homepage = http://ceph.com/;
description = "Distributed storage system";
license = licenses.lgpl21;
maintainers = with maintainers; [ adev ak wkennington ];
platforms = platforms.unix;
};
passthru.version = version;
}