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
pkgsHost.liburing
] else [])
++
scopeHost.main.nativeBuildInputs;
++ scopeHost.main.propagatedBuildInputs
++ scopeHost.main.nativeBuildInputs;
};
});
}

View file

@ -6,6 +6,7 @@
, pkgsBuildHost
, rocksdb
, rust
, rust-jemalloc-sys
, stdenv
# Options (keep sorted)
@ -15,10 +16,27 @@
}:
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 =
let
rocksdb' = rocksdb.override {
enableJemalloc = builtins.elem "jemalloc" features;
jemalloc = rust-jemalloc-sys';
enableJemalloc = featureEnabled "jemalloc";
};
in
{
@ -60,6 +78,8 @@ commonAttrs = {
];
};
buildInputs = lib.optional (featureEnabled "jemalloc") rust-jemalloc-sys';
nativeBuildInputs = [
# bindgen needs the build platform's libclang. Apparently due to "splicing
# weirdness", pkgs.rustPlatform.bindgenHook on its own doesn't quite do the