Something went wrong. Try again.
lol
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421{ buildHaskellPackages, buildPackages, fetchurl, ghc, jailbreak-cabal, lib, MicroCabal, cpphs, ghc-compat, pkg-config, runCommandCC, stdenv, wrapMhs,}:
let # make-package-set always names the compiler ghc compiler = ghc;
isCross = stdenv.buildPlatform != stdenv.hostPlatform;
in{ pname, version, revision ? null, sha256 ? null, src ? fetchurl { url = "mirror://hackage/${pname}-${version}.tar.gz"; inherit sha256; }, # Extra environment variables to set during the build. # See: `../../../doc/languages-frameworks/haskell.section.md` env ? { }, buildDepends ? [ ], setupHaskellDepends ? [ ], libraryHaskellDepends ? [ ], executableHaskellDepends ? [ ], buildTools ? [ ], libraryToolDepends ? [ ], executableToolDepends ? [ ], testToolDepends ? [ ], benchmarkToolDepends ? [ ], configureFlags ? [ ], description ? null, doCheck ? !isCross, doBenchmark ? false, editedCabalFile ? null, extraLibraries ? [ ], librarySystemDepends ? [ ], executableSystemDepends ? [ ], # On macOS, statically linking against system frameworks is not supported; # see https://developer.apple.com/library/content/qa/qa1118/_index.html # They must be propagated to the environment of any executable linking with the library libraryFrameworkDepends ? [ ], executableFrameworkDepends ? [ ], homepage ? "https://hackage.haskell.org/package/${pname}", platforms ? with lib.platforms; all, # GHC can cross-compile badPlatforms ? lib.platforms.none, hydraPlatforms ? null, isExecutable ? false, isLibrary ? !isExecutable, jailbreak ? false, license, maintainers ? null, teams ? null, changelog ? null, mainProgram ? null, passthru ? { }, pkg-configDepends ? [ ], libraryPkgconfigDepends ? [ ], executablePkgconfigDepends ? [ ], testPkgconfigDepends ? [ ], benchmarkPkgconfigDepends ? [ ], testDepends ? [ ], testHaskellDepends ? [ ], testSystemDepends ? [ ], testFrameworkDepends ? [ ], benchmarkDepends ? [ ], benchmarkHaskellDepends ? [ ], benchmarkSystemDepends ? [ ], benchmarkFrameworkDepends ? [ ], broken ? false, preCompileBuildDriver ? null, postCompileBuildDriver ? null, preUnpack ? null, postUnpack ? null, patches ? null, patchPhase ? null, prePatch ? "", postPatch ? "", preConfigure ? null, postConfigure ? null, preBuild ? null, postBuild ? null, preHaddock ? null, postHaddock ? null, installPhase ? null, preInstall ? null, postInstall ? null, checkPhase ? null, preCheck ? null, postCheck ? null, preFixup ? null, postFixup ? null, shellHook ? "", ...}@args:
assert editedCabalFile != null -> revision != null;
let allPkgconfigDepends = pkg-configDepends ++ libraryPkgconfigDepends ++ executablePkgconfigDepends ++ lib.optionals doCheck testPkgconfigDepends ++ lib.optionals doBenchmark benchmarkPkgconfigDepends;
# MicroCabal adds a dependency on ghc-compat unless the package name is one of the following isCorePkg = pname == "base" || pname == "ghc-compat" || pname == "MicroHs" || pname == "MicroCabal"; buildDepends' = buildDepends ++ lib.optional (!isCorePkg) ghc-compat;
depsBuildBuild = lib.optionals (!stdenv.hasCC) [ buildPackages.stdenv.cc ]; collectedToolDepends = buildTools ++ libraryToolDepends ++ executableToolDepends ++ lib.optionals doCheck testToolDepends ++ lib.optionals doBenchmark benchmarkToolDepends; nativeBuildInputs = [ MicroCabal cpphs compilerWithPkgs buildPackages.removeReferencesTo ]; propagatedBuildInputs = buildDepends' ++ libraryHaskellDepends ++ executableHaskellDepends ++ libraryFrameworkDepends; otherBuildInputsHaskell = lib.optionals doCheck (testDepends ++ testHaskellDepends) ++ lib.optionals doBenchmark (benchmarkDepends ++ benchmarkHaskellDepends); otherBuildInputsSystem = extraLibraries ++ librarySystemDepends ++ executableSystemDepends ++ executableFrameworkDepends ++ allPkgconfigDepends ++ lib.optionals doCheck (testSystemDepends ++ testFrameworkDepends) ++ lib.optionals doBenchmark (benchmarkSystemDepends ++ benchmarkFrameworkDepends); otherBuildInputs = otherBuildInputsHaskell ++ otherBuildInputsSystem;
newCabalFileUrl = "mirror://hackage/${pname}-${version}/revision/${revision}.cabal"; newCabalFile = fetchurl { url = newCabalFileUrl; sha256 = editedCabalFile; name = "${pname}-${version}-r${revision}.cabal"; };
hsLibBuildInputs = lib.filter (p: p ? isHaskellLibrary && p.isHaskellLibrary) propagatedBuildInputs; compilerWithPkgs = wrapMhs { microhs = compiler; packages = hsLibBuildInputs; };
compilerCommand' = "mhs"; compilerCommand = "${compiler.targetPrefix}${compilerCommand'}";
compilerLibdir = "lib/mcabal/${compiler.haskellCompilerName}";
env' = { CABALDIR = "${placeholder "out"}/lib/mcabal"; } // env;
instdenv.mkDerivation { inherit pname version;
pos = builtins.unsafeGetAttrPos "pname" args;
prePhases = [ "setupCompilerEnvironmentPhase" ]; preConfigurePhases = [ "compileBuildDriverPhase" ]; preInstallPhases = [ "haddockPhase" ];
inherit src patches;
inherit depsBuildBuild nativeBuildInputs; buildInputs = lib.optionals (!isLibrary) propagatedBuildInputs; propagatedBuildInputs = lib.optionals isLibrary propagatedBuildInputs;
env = env';
prePatch = lib.optionalString (editedCabalFile != null) '' echo "Replace Cabal file with edited version from ${newCabalFileUrl}." cp ${newCabalFile} ${pname}.cabal '' + prePatch;
postPatch = lib.optionalString jailbreak '' echo "Run jailbreak-cabal to lift version restrictions on build inputs." ${jailbreak-cabal}/bin/jailbreak-cabal ${pname}.cabal '' + postPatch;
setupCompilerEnvironmentPhase = '' runHook preSetupCompilerEnvironment
echo "Building with ${compilerWithPkgs}" mkdir -p "$CABALDIR/${compiler.haskellCompilerName}/packages" ${lib.concatMapStrings (p: '' ln -s ${p}/${compilerLibdir}/packages/${p.name}.pkg $CABALDIR/${compiler.haskellCompilerName}/packages/${p.name}.pkg '') (lib.closePropagation hsLibBuildInputs)}
runHook postSetupCompilerEnvironment '';
compileBuildDriverPhase = '' runHook preCompileBuildDriver
runHook postCompileBuildDriver '';
buildPhase = '' runHook preBuild
echo "Skipping buildPhase because MicroCabal always builds on install"
runHook postBuild '';
inherit doCheck;
checkPhase = '' runHook preCheck
echo "Skipping checkPhase because MicroCabal doesn't support test suites"
runHook postCheck '';
haddockPhase = '' runHook preHaddock
echo "Skipping haddockPhase because MicroCabal doesn't support Haddock"
runHook postHaddock '';
installPhase = '' runHook preInstall
mcabal -v ${lib.concatStringsSep " " configureFlags} install mkdir -p $out/bin find "$CABALDIR/bin" -type f -exec ln -s '{}' "$out/bin/" \; || true find "$CABALDIR/${compiler.haskellCompilerName}/packages" -type l -delete
runHook postInstall '';
inherit preCompileBuildDriver postCompileBuildDriver preUnpack postUnpack preConfigure postConfigure preBuild postBuild preHaddock postHaddock preInstall postInstall preCheck postCheck preFixup postFixup ;
passthru = passthru // rec { inherit pname version;
compiler = ghc;
# All this information is intended just for `shellFor`. It should be # considered unstable and indeed we knew how to keep it private we would. getCabalDeps = { inherit buildDepends' buildTools executableFrameworkDepends executableHaskellDepends executablePkgconfigDepends executableSystemDepends executableToolDepends extraLibraries libraryFrameworkDepends libraryHaskellDepends libraryPkgconfigDepends librarySystemDepends libraryToolDepends pkg-configDepends setupHaskellDepends ; } // lib.optionalAttrs doCheck { inherit testDepends testFrameworkDepends testHaskellDepends testPkgconfigDepends testSystemDepends testToolDepends ; } // lib.optionalAttrs doBenchmark { inherit benchmarkDepends benchmarkFrameworkDepends benchmarkHaskellDepends benchmarkPkgconfigDepends benchmarkSystemDepends benchmarkToolDepends ; };
# Attributes for the old definition of `shellFor`. Should be removed but # this predates the warning at the top of `getCabalDeps`. getBuildInputs = rec { inherit propagatedBuildInputs otherBuildInputs allPkgconfigDepends; haskellBuildInputs = isHaskellPartition.right; systemBuildInputs = isHaskellPartition.wrong; isHaskellPartition = lib.partition (x: x ? isHaskellLibrary) ( propagatedBuildInputs ++ otherBuildInputs ++ depsBuildBuild ++ nativeBuildInputs ); };
isHaskellLibrary = isLibrary;
haddockDir = null;
# Creates a derivation containing all of the necessary dependencies for building the # parent derivation. The attribute set that it takes as input can be viewed as: # # { withHoogle } # # The derivation that it builds contains no outpaths because it is meant for use # as an environment # # # Example use # # Creates a shell with all of the dependencies required to build the "hello" package, # # and with python: # # > nix-shell -E 'with (import <nixpkgs> {}); \ # > haskellPackages.hello.envFunc { buildInputs = [ python ]; }' envFunc = { # Unsupported withHoogle ? false, }: let name = "microhs-shell-for-${pname}";
compilerCommandCaps = lib.toUpper compilerCommand'; in runCommandCC name { inherit shellHook;
nativeBuildInputs = [ compilerWithPkgs ] ++ lib.optional (allPkgconfigDepends != [ ]) pkg-config ++ collectedToolDepends; buildInputs = otherBuildInputsSystem;
env = { "NIX_${compilerCommandCaps}" = "${compiler}/bin/${compilerCommand}"; # TODO: is this still valid? "NIX_${compilerCommandCaps}_LIBDIR" = "${compiler}/${compilerLibdir}"; } // lib.optionalAttrs (stdenv.buildPlatform.libc == "glibc") { # TODO: Why is this written in terms of `buildPackages`, unlike # the outer `env`? # # According to @sternenseemann [1]: # # > The condition is based on `buildPlatform`, so it needs to # > match. `LOCALE_ARCHIVE` is set to accompany `LANG` which # > concerns things we execute on the build platform like # > `haddock`. # > # > Arguably the outer non `buildPackages` one is incorrect and # > probably works by accident in most cases since the locale # > archive is not platform specific (the trouble is that it # > may sometimes be impossible to cross-compile). At least # > that would be my assumption. # # [1]: https://github.com/NixOS/nixpkgs/pull/424368#discussion_r2202683378 LOCALE_ARCHIVE = "${buildPackages.glibcLocales}/lib/locale/locale-archive"; } // env'; } "echo $nativeBuildInputs $buildInputs > $out";
env = envFunc { }; };
meta = { inherit homepage license platforms; } // lib.optionalAttrs (args ? broken) { inherit broken; } // lib.optionalAttrs (args ? description) { inherit description; } // lib.optionalAttrs (args ? maintainers) { inherit maintainers; } // lib.optionalAttrs (args ? teams) { inherit teams; } // lib.optionalAttrs (args ? hydraPlatforms) { inherit hydraPlatforms; } // lib.optionalAttrs (args ? badPlatforms) { inherit badPlatforms; } // lib.optionalAttrs (args ? changelog) { inherit changelog; } // lib.optionalAttrs (args ? mainProgram) { inherit mainProgram; };}