+ stdenv = if (cc != null) then overrideCC pkgs.stdenv pkgs."${cc}" else pkgs.stdenv;
+ mkEnableTargets = args: {
+ XON_NO_PKI = !args?pki;
+ XON_NO_DP = !args?dp;
+ XON_NO_DATA = !args?data;
+ XON_NO_QCC = !args?qcc;
+ XON_NO_RADIANT = !args?radiant;
+ };
+ mkDerivation = targets: {env ? {}, shellHook ? "", runtimeInputs ? [], ...}@args:
+ stdenv.mkDerivation (
+ (mkEnableTargets targets)
+ // { enableParallelBuilding = true; }
+ // (removeAttrs args ["env" "shellHook" "runtimeInputs"]) # passthru
+ // env
+ // {
+ shellHook = ''
+ ${shellHook}
+ ${lib.concatStringsSep "\n" (lib.mapAttrsToList (n: v: "export ${n}=${v}") env)}
+ export LD_LIBRARY_PATH=''${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}${lib.makeLibraryPath runtimeInputs}
+ '';
+ }
+ );
+ shell = let inputs = (lib.mapAttrsToList (n: v: v) targets); in stdenv.mkDerivation (rec {
+ name = "xon-shell";
+ XON_NO_DAEMON = true;
+ nativeBuildInputs = builtins.map (it: it.nativeBuildInputs) inputs;
+ buildInputs = builtins.map (it: it.buildInputs) inputs;
+ shellHook = builtins.map (it: it.shellHook) (builtins.filter (it: it?shellHook) inputs);
+ });
+in { inherit shell; } // targets