haskell infra: Fix cross compilation to work with new system#26799
haskell infra: Fix cross compilation to work with new system#26799Ericson2314 merged 16 commits intoNixOS:masterfrom
Conversation
|
@Ericson2314, thanks for your PR! By analyzing the history of the files in this pull request, we identified @peti, @kosmikus and @pikajude to be potential reviewers. |
shlevy
left a comment
There was a problem hiding this comment.
In addition to in-line comments, any way we can reduce duplication here?
| # | ||
| # We generally want the latest llvm package set, which would normally be | ||
| # `llvmPackages` on most platforms. But on Darwin, the default is the version | ||
| # released with OSX, so we force 3.9, which is the correct version at this |
There was a problem hiding this comment.
nixpkgs convention is to override versions like this at the callPackage site, not here.
There was a problem hiding this comment.
Now overridden in pkgs/top-level/haskell-packags,nix.
|
|
||
| # If enabled GHC will be build with the GPL-free but slower integer-simple | ||
| , ncurses, gmp, libffi | ||
| , __targetPackages |
There was a problem hiding this comment.
Can you document this and other non-package non-obvious arguments?
There was a problem hiding this comment.
This is technically something bound in all-packages, rather than a ghc-specific "configuration argument", but sure. Do note that in #26805 I add __targetInputs and __propagatedTargetInputs so there is no need for this parameter.
There was a problem hiding this comment.
Now documented in manual
| , # If enabled, GHC will be build with the GPL-free but slower integer-simple | ||
| # library instead of the faster but GPLed integer-gmp library. | ||
| , enableIntegerSimple ? false, gmp | ||
| enableIntegerSimple ? targetPlatform != hostPlatform |
There was a problem hiding this comment.
Why? Is it hard to build cross-gmp?
There was a problem hiding this comment.
Honestly, I probably skipped it at first issue before, and never returned. Good catch.
| , # If enabled, use -fPIC when compiling static libs. | ||
| enableRelocatedStaticLibs ? targetPlatform != hostPlatform | ||
|
|
||
| , # TODO: Make false by default |
There was a problem hiding this comment.
Why is this a todo instead of just... doing it? 😁
There was a problem hiding this comment.
Not sure what this is anymore, but there's no more TODO 😁
| , # Whether to build dynamic libs for the standard library (on the target | ||
| # platform). Static libs are always built. | ||
| dynamic ? let triple = targetPlatform.config; | ||
| # On iOS, dynamic linking is not supported |
There was a problem hiding this comment.
Not supported by ghc or by the target? Because iOS does allow dynamic linking these days.
| "--with-iconv-libraries=${__targetPackages.libiconv}/lib" | ||
| ] ++ stdenv.lib.optionals (targetPlatform != hostPlatform) [ | ||
|
|
||
| # TODO: next rebuild make these unconditional |
There was a problem hiding this comment.
Just open this against staging and do it now IMO
|
@Ericson2314 Your call if you want to delay this until that is in, no rush on my end |
| preConfigure = commonPreConfigure; | ||
| #v p dyn | ||
| preConfigure = stdenv.lib.optionalString (targetPlatform != hostPlatform)'' | ||
| sed 's|#BuildFlavour = quick-cross|BuildFlavour = perf-cross|' mk/build.mk.sample > mk/build.mk |
There was a problem hiding this comment.
This whole section of writing to mk/build.mk can be done with just one I/O operation using sed just as a stream editor, and the HEREDOC feature of bash. I know we all have fast I/O devices, but it would make the code shorter too.
| preConfigure = commonPreConfigure; | ||
| #v p dyn | ||
| preConfigure = stdenv.lib.optionalString (targetPlatform != hostPlatform)'' | ||
| sed 's|#BuildFlavour = quick-cross|BuildFlavour = perf-cross|' mk/build.mk.sample > mk/build.mk |
59249b9 to
23eea08
Compare
8dcbb41 to
fff31cb
Compare
|
@Ericson2314 Don't you want |
|
Test builds are running at https://hydra.nixos.org/jobset/nixpkgs/pr-26799. |
|
#34023 added GHC 8.4.1. It may be necessary to massage that Nix expression a bit, too, to conform to the new schema. |
|
@ElvishJerricco actually I do not. See how buildHaskellPackages != bootPkgs in general. |
|
Ah! I was hoping to get 8.4 in time, but somehow knew I wouldn't get lucky. |
These changes will affect the final derivation
Rather than just sticking it on the PATH
That way the next commit can apply a similar diff to each GHC.
GHC currently handles this stuff in a quite non-standard way, basically taking prog var `FOO` to mean `FOO_FROM_TARGET`. It's because it (wrongly) thinks from stage 2's perspective.
There's no reason to wait for non-binary native to *build* cross ghc, but we want a nix-built GHC for Setup.hs or things won't work.
Hello World with ghcHEAD. ghc822 to come after some patches. Android will be turned into real Android...later.
Cabal2nix expects a --compiler flag that contains a Cabal Compiler description. We used to use the compiler's derivation name for this, but this breaks when cross-compiling due to the target suffix. Instead we add an explicit haskellCompilerName attribute to Haskell compiler derivations.
|
@peti just rebased to fix a conflict. Do the changes look good to you? Builds passed decently before; hope to merge imminently! |
|
Yay!!!!! |
|
Woo, congratulations! 🎉
…On Mon, 22 Jan 2018, 20:33 John Ericson, ***@***.***> wrote:
Yay!!!!!
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#26799 (comment)>, or mute
the thread
<https://github.com/notifications/unsubscribe-auth/AA0U3J2NaUtikAyMBdNyqcBLoh-GxMe7ks5tNPCDgaJpZM4OD-Qa>
.
|
|
/me wonders what the purpose of that |
|
Eh, no real reason. I guess I was diffing things maybe I dunno. |
Motivation for this change
This is a re-doing of the Haskell support for cross compilation to fit in with my other cross refactoring. As a cheat sheet, with the new system:
haskell.packages.ghc{HEAD,821}.ghc, orbuildPackages.haskell.compiler.ghc{HEAD,821}.ghchaskell.packages.ghc{HEAD,821}.fooBarBazThere's other PRs that need to be merged first, but I am opening this now so people can get a flavor for what's to come.
Fixes #21874
Things to do
Optional changes
Get rid ofActually, the--withflags.--withflags are needed for GHC's own dynamic linker, long story short.Add tests (for both Linux and Darwin) in
pkgs/top-level/release-cross.nix. Linux should work right now, and darwin Later. Done for GHC 8.2.2 and GHC HEAD from x86_64 linux to 32-bit and 64-bit arm.Update to a newer GHC commit with @bgamari's and @angerman's fixes (thanks!) so this actually builds. GHC HEAD is good to go, but GHC 822 needs one more patch to land to I have a more permanent URL: https://phabricator.haskell.org/D4287
Misc simple things
configurePlatformsto control passing of--build,--host, and--target.hackage2nix.targetPrefixis bound on GHC, so we don't need to recompute it all over the place.crossPrefixorprefix, from earlier versions, are goneCC @expipiplus1 @dtzWill @dhess