如何在NixOS / Nix环境中覆盖单个包的编译标志(如CFLAGS
中所述)?
这是我现在所得到的:
let
optimizeForThisHost = pkg:
pkgs.lib.overrideDerivation pkg (old: {
exportOptimizations = ''
export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -fPIC -O3 -march=native"
'';
phaseNames = ["exportOptimizations"] ++ old.phaseNames;
});
in
muttWithoutThings = pkgs: (pkgs.mutt.override {
sslSupport = false;
saslSupport = false;
imapSupport = false;
withSidebar = false;
};
});
mutt = pkgs:
(optimizeForThisHost (muttWithoutThings pkgs));
在我的configuration.nix
中,但是
error: attribute ‘phaseNames’ missing
答案 0 :(得分:3)
这是一个使用自定义编译器标志构建(并运行)GNU hello副本的工作示例:
nix-shell -p 'hello.overrideDerivation (old: { NIX_CFLAGS_COMPILE = "-Ofoo"; })' --run "hello --version"
如果您想说服自己这是否真的有效,请尝试将不存在的标志传递给编译器,如-Ofoo
,并验证构建是否按预期失败。
有关overrideDerivation
功能(以及类似替代方案)的更多信息,请参见http://nixos.org/nixpkgs/manual/index.html#sec-pkg-overrideDerivation的Nixpkgs手册。
答案 1 :(得分:2)
我设法编写了一个函数,我可以将其应用于我想用自定义标志编译的包:
optimizeWithFlags = pkg: flags:
pkgs.lib.overrideDerivation pkg (old:
let
newflags = pkgs.lib.foldl' (acc: x: "${acc} ${x}") "" flags;
oldflags = if (pkgs.lib.hasAttr "NIX_CFLAGS_COMPILE" old)
then "${old.NIX_CFLAGS_COMPILE}"
else "";
in
{
NIX_CFLAGS_COMPILE = "${oldflags} ${newflags}";
});
此函数接受一个包和一个字符串列表(它们是标志),并使用现有的包构建一个新包,但带有额外的编译器标志。
为方便起见,我编写了另一组辅助函数:
optimizeForThisHost = pkg:
optimizeWithFlags pkg [ "-O3" "-march=native" "-fPIC" ];
withDebuggingCompiled = pkg:
optimizeWithFlags pkg [ "-DDEBUG" ];
现在,我可以覆盖包(此处mutt
和dmenu
):
muttWithoutThings = pkgs: (pkgs.mutt.override {
sslSupport = false;
saslSupport = false;
imapSupport = false;
withSidebar = false;
});
mutt = pkgs:
(utils pkgs).withoutConfigureFlag "--enable-debug"
((utils pkgs).optimizeForThisHost (muttWithoutThings pkgs)
);
dmenu = pkgs:
(utils pkgs).optimizeForThisHost
(pkgs.dmenu.override {
patches = [ ./patches/dmenu-fuzzymatch-4.6.diff ];
});
在上面的utils
是utils = pkgs: import ./util.nix { pkgs = pkgs; };
,util.nix
文件会返回一个函数,该函数会吐出一组函数。