Commit Graph

117 Commits

Author SHA1 Message Date
sternenseemann
391a9612d8 haskellPackages: ghcWithPackages needs buildHaskellPackages scope
ghc and also ghcWithPackages (when taken from a haskell package set) are
a bit weird—in the same way stdenv is: ghc is actually from
buildPackages (pkgsBuildHost) wheras the main package set belongs to
pkgsHostTarget. ghc (and stdenv) is included in the package set due to
its special relation to the set: it is built by that ghc, so constituted
by the compiler in a manner of speaking.

For ghc this works in a straightforward way: It is packaged
independently from the haskell package sets and passed to
make-package-set.nix to create the different sets we expose.
With ghcWithPackages an error crept in, though: Since it needs to
receive the haskellPackages fix point (and thus can't be instantiated
before the package set), it is defined in make-package-set.nix. Here it
was neglected to make sure that it also has the same scope as ghc, i.e.
buildHaskellPackages/buildPackages: Otherwise the shell the wrapper
scripts use to invoke ghc (originally from buildPackages) would be from
pkgsHostTarget—in the cross case, the wrapper scripts would be
executable by neither host nor build platform. We want them to work on
the build platform, though.

Note that this creates a weird mismatch where it is hard to see which of
the alternatives would be more natural: ghcWithPackages and
ghcWithHoogle now use packages from the package set they are a member
of, but have *-ghc and hoogle executables that are executable on the
build platform. This works because ghc originates from buildPackages (as
discussed) and hoogleWithPackages is taken from buildHaskellPackages.
This does imply though that while set.ghcWithHoogle will be executable
on the build platform, set.hoogleWithPackages will be executable on the
host platform—both will use the fix point of set for the package
selector function. This is maybe a confusing asymmetry, but it seems
like a valid use case to cross-compile a hoogle instance. Most
development tools use ghcWithHoogle (or equivalent), so that use case is
covered as well in principle.
2023-05-05 18:58:08 +02:00
Felix Buehler
cdb39a86e0 treewide: use optionalString 2023-02-13 21:52:34 +01:00
github-actions[bot]
259fe227c8
Merge master into haskell-updates 2022-12-19 00:12:05 +00:00
figsoda
ec8cb34358 treewide: fix typos 2022-12-17 19:39:44 -05:00
Naïm Favier
264178657f
haskell.packages.ghc902.haskell-language-server: fix 2022-12-13 12:23:03 +01:00
Guillaume Bouchard
d1b6d2d0ab haskellPackages.callHackage: updating all-cabal-hashes do not invalidate callHackage
Packages built with `haskellPackages.callHackage` won't be rebuilt when
updating `all-cabal-hashes`.

The removed comment was keeping a reference to the `cabal2nix` call,
which itself depends on `all-cabal-hashes`, in order to keep this file
during a garbage collection.

The tradeoff is between:

- The current behavior: a mass rebuild, any change of `all-cabal-hashes`
  triggers a rebuild of all the packages built with `callHackage` and
  packages which depend on them. This can take hours, and may happen
  after a "small" unrelated change (i.e. an user is bumping
  `all-cabal-hashes` in order to use a new package from hackage). It
  also have global impacts in a project (long rebuild in CI, new entries
  in cache, developers need to fetch the new entries, ...). In this
  context, `cabal2nix` entries are not garbage collected.
- The new behavior: No mass rebuild, but `cabal2nix` derivations need to
  be recomputed after a garbage collection. This is usually fast (a few
  seconds by call), linear with the number of calls and should not
  happen a lot (i.e. users are not garbage collecting everyday).

See https://github.com/NixOS/nixpkgs/issues/194751 for details.
2022-11-26 19:00:56 +01:00
sternenseemann
ac1f1ad0e0 haskell: support cross in generateOptparseApplicativeCompletions
Deprecate haskell.lib{,.compose}.generateOptparseApplicativeCompletion*
in favor of the newly added
haskell.packages.*.generateOptparseApplicativeCompletions (plural!)
which takes into account whether we are cross-compiling or not. If we
are, generating completions is disabled, since we can't execute software
built for a different platform.

The move is necessary, so we can receive the /same/ stdenv as the
package we are overriding in order to accurately check whether we can
execute produced binaries.

Resolves #174040.
Resolves #49648.
2022-10-07 00:37:53 +02:00
github-actions[bot]
3aa744deb1
Merge master into haskell-updates 2022-08-26 00:15:32 +00:00
Alexander Vieth
f28ab51b54
haskell.lib.makePackageSet: all-cabal-hashes can be a directory (#188203)
* all-cabal-hahses can be a directory

Motivating problem: we want to use the flake.lock for all-cabal-hashes
as a github repository as our revision pin, and then import that to pass
as all-cabal-hashes. To do that we need it to accept a directory rather
than a tarball.

* all-cabal-hashes: add some comments
2022-08-24 20:57:52 -05:00
Robert Hensing
f89dd3dd4a haskellPackages.cabalSdist: Work around cabal#8413
See https://github.com/haskell/cabal/issues/8413
2022-08-22 12:12:09 +02:00
Martin Weinelt
d27e6f2d05
haskellPackages: Unalias RunCommandNoCCLocal 2022-06-29 21:26:45 +02:00
Robert Hensing
cf5e2d5103 haskellPackages: Add buildFromCabalSdist (faster, tested) 2022-05-23 22:28:57 +02:00
Robert Hensing
2e87d165f7 haskellPackages.shellFor: Add extraDependencies
An example use case is when you have Haskell scripts that use
libraries that don't occur in your packages' dependencies.
2022-03-15 20:38:22 +01:00
Robert Hensing
b4524d8eda haskellPackages.haskellSrc2nix: stdenvNoCC.mkDerivation -> runCommand
No need to fuss with phases.
2022-02-26 13:38:11 +01:00
Robert Hensing
46bb6a78db haskellPackages.callCabal2nix: Use stdenvNoCC
Delays C compiler realisation to the actual build, which is more
parallelizable; doesn't block the evaluator.
2022-02-26 13:28:12 +01:00
sternenseemann
fb075fab73 haskellPackages.{ghcWithPackages, ghcWithHoogle}: make overrideable
This is achieved by passing the entire package set to the respective
wrappers and passing the select function as a second attribute. Together
with the new support for callPackage-ing functions this allows for
things like `ghcWithPackages.override { useLLVM = true; } (p: [ … ])`.

To make this possible for `ghcWithHoogle` as well, we need to make the
wrapper a bit more bespoke and inline the hoogle feature as well. The
hoogle wrapper, however, can remain separate and is exposed as
`hoogleWithPackages` additionally, as it can also serve standalone use.
`hoogleLocal` is kept for backwards compatibility (including the old,
suboptimal API), but will inform users about the better alternative via
a warning.
2022-01-06 12:21:45 +01:00
sternenseemann
baaf9459d6 haskellPackages.callPackage: support returning functions
Overrideable functions are possible by wrapping them as functors in an
attribute set first and appending the overrideScope and override
attributes later.
2022-01-06 12:21:45 +01:00
Ellie Hermaszewska
2413ab9e72
haskellPackages.developPackage: Use haskell.lib.compose correctly 2021-11-08 18:34:00 +08:00
Ellie Hermaszewska
15ae25f36c
haskell: switch from haskell.lib to haskell.lib.compose 2021-11-07 20:18:45 +08:00
sternenseemann
5d53087f9b haskellPackages.callCabal2nixWithOptions: don't guess cabal filename
cabal only allows one cabal file per directory and cabal2nix will find
the correct file easily. Thus we don't need to know ahead of time which
cabal file to select. One downside of this is of course that we may
include unnecessary files in subdirectories, which could possibly be
fixed by enforcing depth.
2021-10-27 18:17:10 +02:00
Viacheslav Lotsmanov
707671dae2
haskellPackages.shellFor: Fix typo in the comments
“hpkgs” → “haskellPkgs”
2021-07-12 11:35:09 +09:00
Joe Hermaszewski
a3830da1aa haskell: default name to "" when root isn't a path in developPackage
See https://github.com/NixOS/nixpkgs/issues/103062
2021-05-08 18:22:54 +08:00
Dennis Gosnell
987b80a824
Merge pull request #109059 from jkachmar/haskell-generic-builder-args-modifier
Adds Haskell generic builder argument modifier
2021-01-27 22:37:41 +09:00
Ben Siraphob
2f78ee7e81 pkgs/development: stdenv.lib -> lib 2021-01-24 00:16:29 +07:00
Peter Simons
c3792f6cdd Consistently use 'lib' instead of 'stdenv.lib' in the Haskell infrastructure.
Part of https://github.com/NixOS/nixpkgs/issues/108938.
2021-01-22 20:34:21 +01:00
Joe Kachmar
95d0e6c1b8 Adds Haskell generic args builder documentation 2021-01-14 11:41:31 -05:00
Joe Kachmar
335f1fb25f Adds Haskell generic builder argument modifier
This is a new argument to the Haskell builder's 'shellFor' which allows
the caller to adjust the 'genericBuilderArgs' after they are built.

One immediate application for this is that it allows users to disable
tests, enable benchmarks, etc. for _all_ packages in a given Haskell
package set.

This is often useful when so many of the derivations in the
package set have changed that most of the cache has been invalidated,
and there is no need for the user to run tests on their dependencies,
but they still want these dependencies available in their 'nix-shell'
environment for some package-under-development.
2021-01-11 18:00:21 -05:00
Joe Hermaszewski
49e9758ef3 haskell: Add cabal2nixOptions to developPackage
Also neaten documentation slightly
2020-11-13 21:37:57 +01:00
Joe Hermaszewski
a32c231007 haskell: add withHoogle option to developPackage 2020-11-13 21:37:57 +01:00
Joe Hermaszewski
07e697d22d haskell: improve documentation on ghcWithHoogle and developPackage 2020-11-13 21:37:57 +01:00
(cdep)illabout
d3fb9a25b3 haskellPackages.shellFor: add a doBenchmark argument for enabling benchmarks deps 2020-11-06 21:37:06 +01:00
Dennis Gosnell
d26890fd15 haskellPackages.shellFor: fix spelling and grammar mistakes
Co-authored-by: maralorn <malte.brandy@maralorn.de>
2020-11-06 21:37:05 +01:00
(cdep)illabout
17eee57642 haskellPackages.shellFor: improve documentation 2020-11-06 21:37:05 +01:00
Georges Dubus
2645e1a1eb cabal2nix: split into a lightweight version and a wrapper
Current, the `cabal2nix` derivation contains both the executable, and a wrapper
that adds `nix` and `nix-prefetch-scripts`, which are required for some
features.

However, when calling `callCabal2nix` to create a derivation from a cabal file
at evaluation time,
these features are not actually used, but the huge closure of
`nix-prefetch-scripts` (which includes multiple vcs, as well as python and perl)
still needs to be fetched.

This commit splits cabal2nix into a lightweight version that is a standalone
static binary (`cabal2nix-unwrapped`), and a wrapper that includes the proper
dependencies in the path for full usage of the command line
utility (`cabal2nix`).

This commit also switches to the default ghc, to reduce the likelyhood of
building a different ghc when calling `callCabal2nix`.
2020-03-13 20:18:14 +01:00
John Ericson
196682b175 Merge remote-tracking branch 'upstream/master' into work-on-multi-shellFor 2020-02-22 17:34:08 -05:00
John Ericson
1c07ee7925 haskell shellFor: Fix hoogle 2020-02-22 13:10:30 -05:00
Matthew Bauer
07db0b248c Merge remote-tracking branch 'obsidiansystems/work-on-multi-shellFor' 2020-01-17 18:00:27 -05:00
Jacquin Mininger
7d67db3919 shellFor: Refactor for consistency and cross
This makes it work like work-on-multi from Reflex Platform. In
particular, rather than making `.env` from `shellFor`, we make `.env`
the primitive, and `shellFor` works by combining together the arguments
of all the packages to `generic-builder` and taking the `.env` of the
resulting mashup-package.

There are 2 benefits of this:

1. The dependency logic is deduplicated. generic builder just concatted
   lists, whereas all the envs until now would sieve apart haskell and
   system build inputs. Now, they both decide haskell vs system the same
   way: according to the argument list and without reflection.
   Consistency is good, especially because it mean that if the build
   works, the shell is more likely to work.

2. Cross is handled better. For native builds, because the
   `ghcWithPackages` calls would shadow, we through both the regular
   component (lib, exe, test, bench) haskell deps and Setup.hs haskell
   deps in the same `ghcWithPackages` call. But for cross builds we use
   `buildPackages.ghcWithPackages` to get the setup deps. This ensures
   everything works correctly.
2020-01-17 10:46:29 -05:00
Jack Kelly
9f41d8a9d0 callHackageDirect: correct type signature 2019-11-20 16:36:33 +10:00
John Ericson
66a9f39817 haskellSrc2nix
Since [1], cabal2nix has been able to parse full platform triples. We
need this for when the system doesn't say enough info (e.g. android).

[1]: 0bb88f0009 (diff-d9172aeec4039eef8cfcc8a2ab6c0677R143)
2019-10-15 11:23:33 -04:00
John Ericson
d6f1e70560 haskell: Speed up cross callHackage by using native source
The extract of code from hackage is the same on all platforms.
2019-10-01 12:46:50 -04:00
volth
f3282c8d1e treewide: remove unused variables (#63177)
* treewide: remove unused variables

* making ofborg happy
2019-06-16 19:59:05 +00:00
Robin Gloster
6cf583cf2f
Merge pull request #60406 from JohnAZoidberg/remove-isnull
treewide: Remove usage of isNull
2019-05-18 09:36:24 +00:00
Bryan Richter
6a74ba96fd
Add minimal docs for callHackage and friends
Specifically haskellSrc2nix, callHackage, and callHackageDirect. Other
functions should probably also be documented, but it's at least a start.
2019-05-14 08:18:02 +03:00
Daniel Schaefer
786f02f7a4 treewide: Remove usage of isNull
isNull "is deprecated; just write e == null instead" says the Nix manual
2019-04-29 14:05:50 +02:00
Matthew Bauer
eaa5e85b35 haskell: add more hackage mirrors, use mirrors in more places
Fixes #58971
2019-04-05 13:51:56 -04:00
Silvan Mosberger
2075b3715b Revert "shellFor: Don't suck in src to compare to deps. [Fixes #51079]" 2019-02-15 12:18:44 +01:00
Will Fancher
24ccaf65df shellFor: Don't suck in src to compare to deps. [Fixes #51079] 2019-01-29 16:29:18 -05:00
Doug Beardsley
0cb5b013c0 Overrides can be passed to callHackageDirect 2019-01-27 12:28:01 -05:00
Doug Beardsley
83624524e2 Add a callHackage variant that doesn't require all-cabal-hashes 2018-12-25 12:19:24 -05:00