{ pkgs ? import {} }: with pkgs; let repositoryPath = "lib/chicken/${toString chicken.binaryVersion}"; in { eggCache = { name ? "eggs", eggs, hash, includeDependencies ? true, includeTestDependencies ? false, }: runCommand name { buildInputs = [ chicken ]; outputHash = hash; outputHashMode = "recursive"; CHICKEN_EGG_CACHE = "eggs"; } '' chicken-install -retrieve \ ${lib.optionalString (includeDependencies) "-recursive"} \ ${lib.optionalString (includeTestDependencies) "-test"} \ ${if builtins.typeOf eggs == "path" then "-from-list ${eggs}" else if builtins.typeOf eggs == "list" then lib.concatStringsSep " " (map (egg: "${egg.name}:${egg.version}") eggs) else ""} mv -T $CHICKEN_EGG_CACHE $out rm -f $out/*/STATUS rm -f $out/*/TIMESTAMP ''; eggProgram = { buildInputs ? [], eggCache ? "eggs", preBuild ? "", ... } @ args: let buildEnvironment = '' export CHICKEN_EGG_CACHE=$TMPDIR/eggs export CHICKEN_INSTALL_PREFIX=$TMPDIR/build export CHICKEN_INSTALL_REPOSITORY=$TMPDIR/build/${repositoryPath} export CHICKEN_REPOSITORY_PATH=$TMPDIR/build/${repositoryPath}:$CHICKEN_REPOSITORY_PATH ''; offlineDefaults = writeText "setup.defaults" '' (version 2) (location "${eggCache}") (map (srfi-4 ->)) ''; offlineChickenInstall = writeShellScriptBin "chicken-install" '' exec ${chicken}/bin/chicken-install -defaults ${offlineDefaults} "$@" ''; offlineChicken = symlinkJoin { name = "chicken"; paths = [ offlineChickenInstall chicken ]; }; in stdenv.mkDerivation ({ buildInputs = [ offlineChicken makeWrapper ] ++ buildInputs; shellHook = buildEnvironment; preBuild = buildEnvironment + preBuild; buildPhase = '' runHook preBuild chicken-install runHook postBuild ''; installPhase = '' runHook preInstall mv -T $CHICKEN_INSTALL_PREFIX $out if [ -d $out/lib ]; then find $out/lib -type f -not -name \*.so -delete fi if [ -d $out/bin ]; then for bin in $out/bin/*; do wrapProgram $bin \ --prefix CHICKEN_INCLUDE_PATH : $out/share \ --prefix CHICKEN_REPOSITORY_PATH : $out/${repositoryPath} \ --prefix LD_LIBRARY_PATH : ${chicken}/lib done fi runHook postInstall ''; } // removeAttrs args [ "buildInputs" "eggCache" "preBuild" ]); }