如何覆盖 nixos 中单个包的编译标志?
How to override compile flags for a single package in nixos?
如何在 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
这是一个使用自定义编译器标志构建(并运行)GNU hello 副本的工作示例:
nix-shell -p 'hello.overrideDerivation (old: { NIX_CFLAGS_COMPILE = "-Ofoo"; })' --run "hello --version"
如果您想说服自己这是否真的有效,请尝试将一个不存在的标志传递给编译器,例如 -Ofoo
,并验证构建是否按预期失败。
有关 overrideDerivation
函数(和类似替代项)的更多信息,请参阅 Nixpkgs 手册,网址为 http://nixos.org/nixpkgs/manual/index.html#sec-pkg-overrideDerivation。
我设法编写了一个函数,我可以将其应用于我想使用自定义标志编译的包:
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
文件returns一个函数吐出一组函数
如何在 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
这是一个使用自定义编译器标志构建(并运行)GNU hello 副本的工作示例:
nix-shell -p 'hello.overrideDerivation (old: { NIX_CFLAGS_COMPILE = "-Ofoo"; })' --run "hello --version"
如果您想说服自己这是否真的有效,请尝试将一个不存在的标志传递给编译器,例如 -Ofoo
,并验证构建是否按预期失败。
有关 overrideDerivation
函数(和类似替代项)的更多信息,请参阅 Nixpkgs 手册,网址为 http://nixos.org/nixpkgs/manual/index.html#sec-pkg-overrideDerivation。
我设法编写了一个函数,我可以将其应用于我想使用自定义标志编译的包:
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
文件returns一个函数吐出一组函数