1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
|
{ lib
, stdenv
, fetchFromGitHub
, buildPackages
, boost
, gperftools
, pcre-cpp
, snappy
, zlib
, yaml-cpp
, sasl
, net-snmp
, openldap
, openssl
, libpcap
, curl
, Security
, CoreFoundation
, 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
] ++ lib.optionals (lib.versionAtLeast version "6.0") [
packaging
pymongo
]);
mozjsVersion = "60";
mozjsReplace = "defined(HAVE___SINCOS)";
system-libraries = [
"boost"
"pcre"
"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" ];
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
pcre-cpp
sasl
snappy
zlib
] ++ lib.optionals stdenv.hostPlatform.isDarwin [ Security CoreFoundation 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 <string>' '#include <optional>
#include <string>'
substituteInPlace src/mongo/db/exec/plan_stats.h --replace '#include <string>' '#include <optional>
#include <string>'
'' + lib.optionalString (stdenv.hostPlatform.isDarwin && lib.versionOlder version "6.0") ''
substituteInPlace src/third_party/mozjs-${mozjsVersion}/extract/js/src/jsmath.cpp --replace '${mozjsReplace}' 0
'' + lib.optionalString stdenv.hostPlatform.isi686 ''
# don't fail by default on i686
substituteInPlace src/mongo/db/storage/storage_options.h \
--replace 'engine("wiredTiger")' 'engine("mmapv1")'
'' + 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 = ''
sconsFlags+=" CC=$CC"
sconsFlags+=" CXX=$CXX"
'' + lib.optionalString (!stdenv.hostPlatform.isDarwin) ''
sconsFlags+=" AR=$AR"
'' + lib.optionalString stdenv.hostPlatform.isAarch64 ''
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 =
if (lib.versionAtLeast version "6.0") then "install-devcore"
else "install-core";
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; [ bluescreen303 offline ];
platforms = subtractLists systems.doubles.i686 systems.doubles.unix;
broken = (versionOlder version "6.0" && stdenv.system == "aarch64-darwin");
};
}
|