2017-02-09 2 views
1

Comment puis-je remplacer compiler des drapeaux (comme dans CFLAGS) pour un seul paquet dans des environnements Nixos/Nix?Comment remplacer les indicateurs de compilation pour un seul paquet dans nixos?

Voici ce que j'ai maintenant:

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

dans mon configuration.nix, bien que cela ne fonctionne pas avec

error: attribute ‘phaseNames’ missing 

Répondre

1

j'ai réussi à écrire une fonction que je peux appliquer aux paquets que je veux compiler avec des drapeaux personnalisés:

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

Cette fonction prend un paquet et une liste de chaînes (qui sont les drapeaux) et builds un nouveau paquet avec le paquet existant, mais avec les drapeaux additionnels du compilateur.

Pour plus de commodité, j'ai écrit une autre série de fonctions d'aide:

optimizeForThisHost = pkg: 
    optimizeWithFlags pkg [ "-O3" "-march=native" "-fPIC" ]; 

    withDebuggingCompiled = pkg: 
    optimizeWithFlags pkg [ "-DDEBUG" ]; 

Maintenant, je peux passer outre les paquets (ici mutt et 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 ]; 
    }); 

Dans le utils ci-dessus est utils = pkgs: import ./util.nix { pkgs = pkgs; }; et le fichier util.nix retourne une fonction qui recrache un ensemble de fonctions.

1

Voici un exemple de travail qui construit (et court) une copie de GNU bonjour avec des drapeaux de compilateur personnalisés:

nix-shell -p 'hello.overrideDerivation (old: { NIX_CFLAGS_COMPILE = "-Ofoo"; })' --run "hello --version" 

Si vous voulez vous convaincre si cela fonctionne vraiment , essayez de passer un indicateur inexistant au compilateur, comme -Ofoo, et vérifiez que les générations échouent comme prévu.

Plus d'informations sur la fonction overrideDerivation (et alternatives similaires) peut trouver dans le manuel Nixpkgs à http://nixos.org/nixpkgs/manual/index.html#sec-pkg-overrideDerivation.