Skip to content

Commit dfd39f4

Browse files
authored
Generate dummy-ghc from raw ghc source (#2183)
* Generate dummy-ghc from raw ghc source This should be fast and will avoid us having to maintain the `materialized/dummy-ghc` files.
1 parent c893a36 commit dfd39f4

18 files changed

+521
-124
lines changed

ci.nix

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ dimension "Nixpkgs version" nixpkgsVersions (nixpkgsName: pinnedNixpkgsSrc:
149149
// pkgs.lib.optionalAttrs (ifdLevel >= 2 && crossSystemName != "ghcjs")
150150
pkgs.haskell-nix.iserv-proxy-exes.${compiler-nix-name}
151151
// pkgs.lib.optionalAttrs (ifdLevel >= 3) {
152-
hello = (pkgs.haskell-nix.hackage-package { name = "hello"; version = "1.0.0.2"; inherit compiler-nix-name; }).getComponent "exe:hello";
152+
hello = (pkgs.haskell-nix.hackage-package { name = "hello"; version = "1.0.0.2"; inherit evalPackages compiler-nix-name; }).getComponent "exe:hello";
153153
})
154154
))
155155
)

compiler/ghc/default.nix

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,17 @@ stdenv.mkDerivation (rec {
633633
# We could add `configured-src` as an output of the ghc derivation, but
634634
# having it as its own derivation means it can be accessed quickly without
635635
# building GHC.
636+
raw-src = stdenv.mkDerivation {
637+
name = name + "-raw-src";
638+
inherit
639+
version
640+
patches
641+
src;
642+
installPhase = ''
643+
cp -r . $out
644+
'';
645+
phases = [ "unpackPhase" "patchPhase" "installPhase"];
646+
};
636647
configured-src = stdenv.mkDerivation ({
637648
name = name + "-configured-src";
638649
inherit

flake.lock

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/call-cabal-project-to-nix.nix

Lines changed: 148 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,9 @@ let
288288

289289
fixedProject = replaceSourceRepos rawCabalProject;
290290

291-
inherit (ghc) dummy-ghc-data;
291+
ghcSrc = ghc.raw-src or ghc.buildGHC.raw-src;
292+
293+
fixPlatformString = x: builtins.replaceStrings ["-linux-gnu"] ["-linux"] x;
292294

293295
# Dummy `ghc` that uses the captured output
294296
dummy-ghc = evalPackages.writeTextFile {
@@ -299,30 +301,54 @@ let
299301
#!${evalPackages.runtimeShell}
300302
case "$*" in
301303
--version*)
302-
cat ${dummy-ghc-data}/ghc/version
304+
echo "The Glorious Glasgow Haskell Compilation System, version ${ghc.version}"
303305
;;
304306
--numeric-version*)
305-
cat ${dummy-ghc-data}/ghc/numeric-version
307+
echo "${ghc.version}"
306308
;;
307309
${pkgs.lib.optionalString (ghc.targetPrefix == "js-unknown-ghcjs-") ''
308310
--numeric-ghc-version*)
309-
cat ${dummy-ghc-data}/ghc/numeric-ghc-version
311+
echo "${ghc.version}"
310312
;;
311313
--numeric-ghcjs-version*)
312-
cat ${dummy-ghc-data}/ghc/numeric-ghcjs-version
314+
echo "${ghc.version}"
313315
;;
314316
''}
315317
--supported-languages*)
316-
cat ${dummy-ghc-data}/ghc/supported-languages
318+
cat ${import ./supported-languages.nix { inherit pkgs evalPackages ghc; }}
317319
;;
318320
--print-global-package-db*)
319321
echo "$out/dumby-db"
320322
;;
321323
--info*)
322-
cat ${dummy-ghc-data}/ghc/info
324+
echo '[("target os", "${
325+
if pkgs.stdenv.targetPlatform.isLinux
326+
then "OSLinux"
327+
else if pkgs.stdenv.targetPlatform.isDarwin
328+
then "OSDarwin"
329+
else if pkgs.stdenv.targetPlatform.isWindows
330+
then "OSMinGW32"
331+
else if pkgs.stdenv.targetPlatform.isGhcjs
332+
then "OSGhcjs"
333+
else throw "Unknown target os ${pkgs.stdenv.targetPlatform.config}"
334+
}")'
335+
echo ',("target arch","${
336+
if pkgs.stdenv.targetPlatform.isx86_64
337+
then "ArchX86_64"
338+
else if pkgs.stdenv.targetPlatform.isAarch64
339+
then "ArchAArch64"
340+
else if pkgs.stdenv.targetPlatform.isJavaScript
341+
then "ArchJavaScript"
342+
else throw "Unknown target arch ${pkgs.stdenv.targetPlatform.config}"
343+
}")'
344+
echo ',("target platform string","${fixPlatformString pkgs.stdenv.targetPlatform.config}")'
345+
echo ',("Build platform","${fixPlatformString pkgs.stdenv.buildPlatform.config}")'
346+
echo ',("Host platform","${fixPlatformString pkgs.stdenv.hostPlatform.config}")'
347+
echo ',("Target platform","${fixPlatformString pkgs.stdenv.targetPlatform.config}")'
348+
echo ']'
323349
;;
324350
--print-libdir*)
325-
echo ${dummy-ghc-data}/ghc/libdir
351+
echo $out/ghc/libdir
326352
;;
327353
*)
328354
echo "Unknown argument '$*'" >&2
@@ -333,6 +359,117 @@ let
333359
'';
334360
};
335361

362+
ghc-pkgs = [
363+
"Cabal"
364+
"Cabal-syntax"
365+
"array"
366+
"base"
367+
"binary"
368+
"bytestring"
369+
"containers"
370+
"deepseq"
371+
"directory"
372+
"exceptions"
373+
"filepath"
374+
"ghc"
375+
"ghc-bignum"
376+
"ghc-boot"
377+
"ghc-boot-th"
378+
"ghc-compact"
379+
"ghc-experimental"
380+
"ghc-heap"
381+
"ghc-internal"
382+
"ghc-platform"
383+
"ghc-prim"
384+
"ghc-toolchain"
385+
"ghci"
386+
"haskeline"
387+
"hpc"
388+
"integer-gmp"
389+
"mtl"
390+
"os-string"
391+
"parsec"
392+
"pretty"
393+
"process"
394+
"rts"
395+
"semaphore-compat"
396+
"stm"
397+
"template-haskell"
398+
"terminfo"
399+
"text"
400+
"time"
401+
"transformers"
402+
"xhtml"
403+
] ++ (if pkgs.stdenv.targetPlatform.isWindows
404+
then [ "Win32" ]
405+
else [ "unix" ]
406+
);
407+
408+
dummy-ghc-pkg-dump = evalPackages.runCommand "dummy-ghc-pkg-dump" {
409+
nativeBuildInputs = [
410+
evalPackages.haskell-nix.nix-tools-unchecked.exes.cabal2json
411+
evalPackages.jq
412+
];
413+
} (let varname = x: builtins.replaceStrings ["-"] ["_"] x; in ''
414+
PKGS=""
415+
${pkgs.lib.concatStrings
416+
(builtins.map (name: ''
417+
cabal_file=""
418+
if [ -f ${ghcSrc}/libraries/${name}/${name}.cabal ]; then
419+
cabal_file=${ghcSrc}/libraries/${name}/${name}.cabal
420+
elif [ -f ${ghcSrc}/libraries/Cabal/${name}/${name}.cabal ]; then
421+
cabal_file=${ghcSrc}/libraries/Cabal/${name}/${name}.cabal
422+
elif [ -f ${ghcSrc}/libraries/${name}/${name}/${name}.cabal ]; then
423+
cabal_file=${ghcSrc}/libraries/${name}/${name}/${name}.cabal
424+
elif [ -f ${ghcSrc}/compiler/${name}.cabal ]; then
425+
cabal_file=${ghcSrc}/compiler/${name}.cabal
426+
elif [ -f ${ghcSrc}/compiler/${name}.cabal.in ]; then
427+
cabal_file=${ghcSrc}/compiler/${name}.cabal.in
428+
elif [ -f ${ghcSrc}/libraries/${name}/${name}.cabal.in ]; then
429+
cabal_file=${ghcSrc}/libraries/${name}/${name}.cabal.in
430+
fi
431+
if [[ "$cabal_file" != "" ]]; then
432+
fixed_cabal_file=$(mktemp)
433+
cat $cabal_file | sed -e 's/@ProjectVersionMunged@/${ghc.version}/g' -e 's/default: *@[A-Za-z0-9]*@/default: False/g' -e 's/@Suffix@//g' > $fixed_cabal_file
434+
json_cabal_file=$(mktemp)
435+
cabal2json $fixed_cabal_file > $json_cabal_file
436+
EXPOSED_MODULES_${varname name}="$(jq -r '.library."exposed-modules"[]|select(type=="array")[]' $json_cabal_file | tr '\n' ' ')"
437+
DEPS_${varname name}="$(jq -r '.library."build-depends"[]|select(type=="array")[],select(type=="object").then[]' $json_cabal_file | sed 's/^\([A-Za-z0-9-]*\).*$/\1/g' | sort -u | tr '\n' ' ')"
438+
VER_${varname name}="$(jq -r '.version' $json_cabal_file)"
439+
PKGS+=" ${name}"
440+
LAST_PKG="${name}"
441+
fi
442+
'') ghc-pkgs)
443+
}
444+
${ # There is not .cabal file for system-cxx-std-lib
445+
pkgs.lib.optionalString (builtins.compareVersions ghc.version "9.2" >= 0) (
446+
let name="system-cxx-std-lib"; in ''
447+
EXPOSED_MODULES_${varname name}=""
448+
DEPS_${varname name}=""
449+
VER_${varname name}="1.0"
450+
PKGS+=" ${name}"
451+
LAST_PKG="${name}"
452+
'')}
453+
for pkg in $PKGS; do
454+
varname="$(echo $pkg | tr "-" "_")"
455+
ver="VER_$varname"
456+
exposed_mods="EXPOSED_MODULES_$varname"
457+
deps="DEPS_$varname"
458+
echo "name: $pkg" >> $out
459+
echo "version: ''${!ver}" >> $out
460+
echo "exposed-modules: ''${!exposed_mods}" >> $out
461+
echo "depends:" >> $out
462+
for dep in ''${!deps}; do
463+
ver_dep="VER_$(echo $dep | tr "-" "_")"
464+
if [[ "''${!ver_dep}" != "" ]]; then
465+
echo " $dep-''${!ver_dep}" >> $out
466+
fi
467+
done
468+
if [[ "$pkg" != "$LAST_PKG" ]]; then
469+
echo '---' >> $out
470+
fi
471+
done
472+
'');
336473
# Dummy `ghc-pkg` that uses the captured output
337474
dummy-ghc-pkg = evalPackages.writeTextFile {
338475
name = "dummy-pkg-" + ghc.name;
@@ -342,15 +479,15 @@ let
342479
#!${evalPackages.runtimeShell}
343480
case "$*" in
344481
--version)
345-
cat ${dummy-ghc-data}/ghc-pkg/version
482+
echo "GHC package manager version ${ghc.version}"
346483
;;
347484
${pkgs.lib.optionalString (ghc.targetPrefix == "js-unknown-ghcjs-") ''
348485
--numeric-ghcjs-version)
349-
cat ${dummy-ghc-data}/ghc-pkg/numeric-ghcjs-version
486+
echo "${ghc.version}"
350487
;;
351488
''}
352489
'dump --global -v0')
353-
cat ${dummy-ghc-data}/ghc-pkg/dump-global
490+
cat ${dummy-ghc-pkg-dump}
354491
;;
355492
*)
356493
echo "Unknown argument '$*'. " >&2

lib/default.nix

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -570,11 +570,6 @@ in {
570570
inherit (pkgs.buildPackages.buildPackages) lib runCommand;
571571
};
572572

573-
makeDummyGhcData = import ./make-dummy-ghc-data.nix {
574-
inherit pkgs;
575-
inherit (pkgs.buildPackages.buildPackages) runCommand;
576-
};
577-
578573
# Here we try to figure out which qemu to use based on the host platform.
579574
# This guess can be overridden by passing qemuSuffix
580575
qemuByHostPlatform = hostPlatform:

lib/make-dummy-ghc-data.nix

Lines changed: 0 additions & 78 deletions
This file was deleted.

0 commit comments

Comments
 (0)