2017-02-09 26 views
1

Как я могу переопределить флаги компиляции (как в CFLAGS) для одного пакета в средах NixOS/Nix?Как переопределить флаги компиляции для одного пакета в nixos?

Вот что у меня сейчас:

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 

ответ

1

мне удалось написать функцию, которую я могу применить к пакетам, которые я хочу собрать с помощью пользовательских флагов:

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 возвращает функцию, которая выплевывает набор функций.

1

Вот рабочий пример, который строит (и работает) копию GNU привет с пользовательскими флагами компилятора:

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.

Смежные вопросы