55 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{lib, pkgs} :
 | 
						|
let inherit (lib) nv nvs; in
 | 
						|
{
 | 
						|
  # see for example:
 | 
						|
  # - development/interpreters/php_configurable/default.nix
 | 
						|
  # - .. search composableDerivation in all-packages.nix ..
 | 
						|
  #
 | 
						|
  # You should be able to override anything you like easily
 | 
						|
  # grep the mailinglist by title "python proposal" (dec 08)
 | 
						|
  # -> http://mail.cs.uu.nl/pipermail/nix-dev/2008-December/001571.html
 | 
						|
  # to see why this got complicated when using all its features
 | 
						|
  # TODO add newer example using new syntax (kernel derivation proposal -> mailinglist)
 | 
						|
  composableDerivation = {
 | 
						|
        mkDerivation ? pkgs.stdenv.mkDerivation,
 | 
						|
 | 
						|
        # list of functions to be applied before defaultOverridableDelayableArgs removes removeAttrs names
 | 
						|
        # prepareDerivationArgs handles derivation configurations
 | 
						|
        applyPreTidy ? [ lib.prepareDerivationArgs ],
 | 
						|
 | 
						|
        # consider adding addtional elements by derivation.merge { removeAttrs = ["elem"]; };
 | 
						|
        removeAttrs ? ["cfg" "flags"]
 | 
						|
 | 
						|
      }: (lib.defaultOverridableDelayableArgs ( a: mkDerivation a) 
 | 
						|
         {
 | 
						|
           inherit applyPreTidy removeAttrs;
 | 
						|
         }).merge;
 | 
						|
 | 
						|
  # some utility functions
 | 
						|
  # use this function to generate flag attrs for prepareDerivationArgs
 | 
						|
  # E nable  D isable F eature
 | 
						|
  edf = {name, feat ? name, enable ? {}, disable ? {} , value ? ""}:
 | 
						|
    nvs name {
 | 
						|
    set = {
 | 
						|
      configureFlags = ["--enable-${feat}${if value == "" then "" else "="}${value}"];
 | 
						|
    } // enable;
 | 
						|
    unset = {
 | 
						|
      configureFlags = ["--disable-${feat}"];
 | 
						|
    } // disable;
 | 
						|
  };
 | 
						|
 | 
						|
  # same for --with and --without-
 | 
						|
  # W ith or W ithout F eature
 | 
						|
  wwf = {name, feat ? name, enable ? {}, disable ? {}, value ? ""}:
 | 
						|
    nvs name {
 | 
						|
    set = enable // {
 | 
						|
      configureFlags = ["--with-${feat}${if value == "" then "" else "="}${value}"]
 | 
						|
                       ++ lib.maybeAttr "configureFlags" [] enable;
 | 
						|
    };
 | 
						|
    unset = disable // {
 | 
						|
      configureFlags = ["--without-${feat}"]
 | 
						|
                       ++ lib.maybeAttr "configureFlags" [] disable;
 | 
						|
    };
 | 
						|
  };
 | 
						|
}
 |