{ lib, stdenv, fetchFromGitHub, buildPackages, boost, gperftools, pcre2, pcre-cpp, snappy, zlib, yaml-cpp, sasl, net-snmp, openldap, openssl, libpcap, curl, cctools, xz, }: # Note: # The command line administrative tools are part of other packages: # see pkgs.mongodb-tools and pkgs.mongosh. { version, sha256, patches ? [ ], license ? lib.licenses.sspl, avxSupport ? stdenv.hostPlatform.avxSupport, passthru ? { }, }: let scons = buildPackages.scons; python = scons.python.withPackages ( ps: with ps; [ pyyaml cheetah3 psutil setuptools distutils packaging pymongo ] ); system-libraries = [ "boost" "snappy" "yaml" "zlib" #"asio" -- XXX use package? #"stemmer" -- not nice to package yet (no versioning, no makefile, no shared libs). #"valgrind" -- mongodb only requires valgrind.h, which is vendored in the source. #"wiredtiger" ] ++ lib.optionals stdenv.hostPlatform.isLinux [ "tcmalloc" ] ++ lib.optionals (lib.versionOlder version "7.0") [ "pcre" ] ++ lib.optionals (lib.versionAtLeast version "7.0") [ "pcre2" ]; inherit (lib) systems subtractLists; in stdenv.mkDerivation rec { inherit version passthru; pname = "mongodb"; src = fetchFromGitHub { owner = "mongodb"; repo = "mongo"; rev = "r${version}"; inherit sha256; }; nativeBuildInputs = [ scons python ] ++ lib.optional stdenv.hostPlatform.isLinux net-snmp; buildInputs = [ boost curl gperftools libpcap yaml-cpp openssl openldap pcre2 pcre-cpp sasl snappy zlib ] ++ lib.optionals stdenv.hostPlatform.isDarwin [ cctools ] ++ lib.optional stdenv.hostPlatform.isLinux net-snmp ++ [ xz ]; # MongoDB keeps track of its build parameters, which tricks nix into # keeping dependencies to build inputs in the final output. # We remove the build flags from buildInfo data. inherit patches; postPatch = '' # fix environment variable reading substituteInPlace SConstruct \ --replace "env = Environment(" "env = Environment(ENV = os.environ," '' + '' # Fix debug gcc 11 and clang 12 builds on Fedora # https://github.com/mongodb/mongo/commit/e78b2bf6eaa0c43bd76dbb841add167b443d2bb0.patch substituteInPlace src/mongo/db/query/plan_summary_stats.h --replace '#include ' '#include #include ' substituteInPlace src/mongo/db/exec/plan_stats.h --replace '#include ' '#include #include ' '' + lib.optionalString (!avxSupport) '' substituteInPlace SConstruct \ --replace-fail "default=['+sandybridge']," 'default=[],' ''; env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.cc.isClang "-Wno-unused-command-line-argument"; sconsFlags = [ "--release" "--ssl" #"--rocksdb" # Don't have this packaged yet "--wiredtiger=on" "--js-engine=mozjs" "--use-sasl-client" "--disable-warnings-as-errors" "VARIANT_DIR=nixos" # Needed so we don't produce argument lists that are too long for gcc / ld "--link-model=static" "MONGO_VERSION=${version}" ] ++ map (lib: "--use-system-${lib}") system-libraries; # This seems to fix mongodb not able to find OpenSSL's crypto.h during build hardeningDisable = [ "fortify3" ]; preBuild = '' appendToVar sconsFlags "CC=$CC" appendToVar sconsFlags "CXX=$CXX" '' + lib.optionalString (!stdenv.hostPlatform.isDarwin) '' appendToVar sconsFlags "AR=$AR" '' + lib.optionalString stdenv.hostPlatform.isAarch64 '' appendToVar sconsFlags "CCFLAGS=-march=armv8-a+crc" ''; preInstall = '' mkdir -p "$out/lib" ''; postInstall = '' rm -f "$out/bin/install_compass" || true ''; doInstallCheck = true; installCheckPhase = '' runHook preInstallCheck "$out/bin/mongo" --version runHook postInstallCheck ''; installTargets = "install-devcore"; prefixKey = "DESTDIR="; enableParallelBuilding = true; hardeningEnable = [ "pie" ]; meta = with lib; { description = "Scalable, high-performance, open source NoSQL database"; homepage = "http://www.mongodb.org"; inherit license; maintainers = with maintainers; [ offline ]; platforms = subtractLists systems.doubles.i686 systems.doubles.unix; }; }