Package overriding 1
A powerful feature if Nix is the option to override any packages inputs (docs).
Let's use this to compare multiple builds of our benchmark application. Create the following multibench_v1.nix
shell file:
{ pkgs ? import <nixpkgs> { }
, lib ? pkgs.lib
}:
let
args = lib.cartesianProductOfSets {
cxxstd = [ "11" "20" ];
stdenv = [ pkgs.gcc13Stdenv pkgs.llvmPackages_17.stdenv ];
};
overrideBoost = { cxxstd, stdenv }: {
name = "std${cxxstd}-${stdenv.cc.name}";
stdenv = stdenv;
boost = pkgs.boost.override {
extraB2Args = [ "cxxstd=${cxxstd}" ];
stdenv = stdenv;
};
};
boostList = map overrideBoost args;
customizeBench = { name, stdenv, boost }:
pkgs.writeShellApplication {
name = "bench-${name}";
runtimeInputs = [
(pkgs.callPackage ./bench.nix {
inherit stdenv boost;
})
];
text = "bench";
};
in
pkgs.mkShell rec {
packages = map customizeBench boostList;
shellHook =
let
runTest = test: ''
echo "Running ${test.name}:"
${test.name}
'';
in
lib.concatMapStringsSep "\n" runTest packages;
}
And test it:
nix-shell multibench_v1.nix
bench-std11-clang-wrapper-17.0.6
bench-std20-gcc-wrapper-13.2.0