With this flake:
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = {
self,
nixpkgs,
flake-utils,
...
}:
flake-utils.lib.eachDefaultSystem
(
system: let
pkgs = import nixpkgs {
inherit system;
overlays = [
(final: prev: {
duckdb = prev.duckdb.overrideDerivation(old: {
cmakeFlags = old.cmakeFlags ++ ["-DSKIP_EXTENSIONS=jemalloc"];
});
})
];
};
python = pkgs.python311;
buildInputs = with pkgs; [
(python.withPackages (ps:
with ps; [
duckdb
]))
duckdb
];
in
with pkgs; {
devShells.default = mkShell {
inherit buildInputs;
};
}
);
}
I can successfully build duckdb without jemalloc, but the python package (python3Packages.duckdb
) is still using the version of duckdb from before the overlay. To test:
echo "SELECT installed FROM duckdb_extensions() WHERE extension_name='jemalloc';" | duckdb
Returns false, whereas:
import duckdb
assert not duckdb.connect().execute("SELECT installed FROM duckdb_extensions() WHERE extension_name='jemalloc';").fetchone()[0]
Fails.
Clearly, I don’t know how to override the input to python3Packages.duckdb
. I thought that setting an overlay would propagate across the whole of pkgs
(in the let bind) so that pkgs.python311.duckdb
would end up being passed the overlayed duckdb.
How ought I to go about this? And what have I got wrong about overlays?