【问题标题】:How to override compile flags for a single package in nixos?如何覆盖nixos中单个包的编译标志?
【发布时间】:2017-02-09 12:00:50
【问题描述】:

如何在 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

【问题讨论】:

    标签: package compiler-optimization nix nixos cflags


    【解决方案1】:

    这是一个使用自定义编译器标志构建(并运行)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

    【讨论】:

      【解决方案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" ];
      

      现在,我可以覆盖包(这里是 muttdmenu):

        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 ];
          });
      

      在上面的utilsutils = pkgs: import ./util.nix { pkgs = pkgs; }; 并且util.nix 文件返回一个函数,该函数吐出一组函数。

      【讨论】:

        猜你喜欢
        • 2012-11-18
        • 2016-06-30
        • 2021-05-26
        • 1970-01-01
        • 2010-12-08
        • 2015-04-26
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        相关资源
        最近更新 更多