only link to one jemalloc build

Without setting JEMALLOC_OVERRIDE, we end up linking to two different
jemalloc builds. Once dynamically, as a transitive dependency through
rocksdb, and a second time to the static jemalloc that tikv-jemalloc-sys
builds.
This commit is contained in:
Benjamin Lee 2024-05-23 13:32:43 -07:00 committed by June 🍓🦴
parent eb8dd9cb44
commit a7fe434086
2 changed files with 23 additions and 3 deletions

View file

@ -184,8 +184,8 @@
# Needed for building with io_uring # Needed for building with io_uring
pkgsHost.liburing pkgsHost.liburing
] else []) ] else [])
++ ++ scopeHost.main.propagatedBuildInputs
scopeHost.main.nativeBuildInputs; ++ scopeHost.main.nativeBuildInputs;
}; };
}); });
} }

View file

@ -6,6 +6,7 @@
, pkgsBuildHost , pkgsBuildHost
, rocksdb , rocksdb
, rust , rust
, rust-jemalloc-sys
, stdenv , stdenv
# Options (keep sorted) # Options (keep sorted)
@ -15,10 +16,27 @@
}: }:
let let
featureEnabled = feature : builtins.elem feature features;
# This derivation will set the JEMALLOC_OVERRIDE variable, causing the
# tikv-jemalloc-sys crate to use the nixpkgs jemalloc instead of building it's
# own. In order for this to work, we need to set flags on the build that match
# whatever flags tikv-jemalloc-sys was going to use. These are dependent on
# which features we enable in tikv-jemalloc-sys.
rust-jemalloc-sys' = (rust-jemalloc-sys.override {
# tikv-jemalloc-sys/unprefixed_malloc_on_supported_platforms feature
unprefixed = true;
}).overrideAttrs (old: {
configureFlags = old.configureFlags ++
# tikv-jemalloc-sys/profiling feature
lib.optional (featureEnabled "jemalloc_prof") "--enable-prof";
});
buildDepsOnlyEnv = buildDepsOnlyEnv =
let let
rocksdb' = rocksdb.override { rocksdb' = rocksdb.override {
enableJemalloc = builtins.elem "jemalloc" features; jemalloc = rust-jemalloc-sys';
enableJemalloc = featureEnabled "jemalloc";
}; };
in in
{ {
@ -60,6 +78,8 @@ commonAttrs = {
]; ];
}; };
buildInputs = lib.optional (featureEnabled "jemalloc") rust-jemalloc-sys';
nativeBuildInputs = [ nativeBuildInputs = [
# bindgen needs the build platform's libclang. Apparently due to "splicing # bindgen needs the build platform's libclang. Apparently due to "splicing
# weirdness", pkgs.rustPlatform.bindgenHook on its own doesn't quite do the # weirdness", pkgs.rustPlatform.bindgenHook on its own doesn't quite do the