288
288
289
289
fixedProject = replaceSourceRepos rawCabalProject ;
290
290
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 ;
292
294
293
295
# Dummy `ghc` that uses the captured output
294
296
dummy-ghc = evalPackages . writeTextFile {
@@ -299,30 +301,54 @@ let
299
301
#!${ evalPackages . runtimeShell }
300
302
case "$*" in
301
303
--version*)
302
- cat ${ dummy- ghc-data } /ghc/ version
304
+ echo "The Glorious Glasgow Haskell Compilation System, version ${ ghc . version } "
303
305
;;
304
306
--numeric-version*)
305
- cat ${ dummy- ghc-data } /ghc/numeric- version
307
+ echo " ${ ghc . version } "
306
308
;;
307
309
${ pkgs . lib . optionalString ( ghc . targetPrefix == "js-unknown-ghcjs-" ) ''
308
310
--numeric-ghc-version*)
309
- cat ${ dummy- ghc-data } /ghc/numeric-ghc- version
311
+ echo " ${ ghc . version } "
310
312
;;
311
313
--numeric-ghcjs-version*)
312
- cat ${ dummy- ghc-data } /ghc/numeric-ghcjs- version
314
+ echo " ${ ghc . version } "
313
315
;;
314
316
'' }
315
317
--supported-languages*)
316
- cat ${ dummy-ghc-data } /ghc/ supported-languages
318
+ cat ${ import ./ supported-languages.nix { inherit pkgs evalPackages ghc ; } }
317
319
;;
318
320
--print-global-package-db*)
319
321
echo "$out/dumby-db"
320
322
;;
321
323
--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 ']'
323
349
;;
324
350
--print-libdir*)
325
- echo ${ dummy-ghc-data } /ghc/libdir
351
+ echo $out /ghc/libdir
326
352
;;
327
353
*)
328
354
echo "Unknown argument '$*'" >&2
@@ -333,6 +359,117 @@ let
333
359
'' ;
334
360
} ;
335
361
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
+ '' ) ;
336
473
# Dummy `ghc-pkg` that uses the captured output
337
474
dummy-ghc-pkg = evalPackages . writeTextFile {
338
475
name = "dummy-pkg-" + ghc . name ;
@@ -342,15 +479,15 @@ let
342
479
#!${ evalPackages . runtimeShell }
343
480
case "$*" in
344
481
--version)
345
- cat ${ dummy- ghc-data } /ghc-pkg/ version
482
+ echo "GHC package manager version ${ ghc . version } "
346
483
;;
347
484
${ pkgs . lib . optionalString ( ghc . targetPrefix == "js-unknown-ghcjs-" ) ''
348
485
--numeric-ghcjs-version)
349
- cat ${ dummy- ghc-data } /ghc-pkg/numeric-ghcjs- version
486
+ echo " ${ ghc . version } "
350
487
;;
351
488
'' }
352
489
'dump --global -v0')
353
- cat ${ dummy-ghc-data } /ghc- pkg/dump-global
490
+ cat ${ dummy-ghc-pkg-dump }
354
491
;;
355
492
*)
356
493
echo "Unknown argument '$*'. " >&2
0 commit comments