--- toast 2006/12/14 04:25:03 1.439 +++ toast 2006/12/29 22:47:10 1.440 @@ -1603,7 +1603,7 @@ push(@vars, newenvvar("CPATH", "include")); push(@vars, newenvvar("LIBRARY_PATH", "lib")); push(@vars, newenvvar("XML_CATALOG_FILES", $x, "/$x", " ")) if xmlcatalog; - push(@vars, newenvvar("GHC_PKG_PATH", $hspkgdir)) if hspkg; + push(@vars, newenvvar("GHC_PACKAGE_PATH", $hspkgdir, "")) if hspkg; # there's also a LIBRARY_RUN_PATH or something that affects ld somehow... return @vars; } @@ -2901,62 +2901,6 @@ name=], time() . "-$$", q[ PATH=], quote($ENV{"PATH"}), q[ -wrapper="$rootdir/bin/ghc.wrapped" -cat > "$wrapper" << "EOF" -#!/bin/sh -exec perl -wx "$0" "$@" -#!perl - -$0 =~ m!([^/]+)$! or die; -my($me) = $1; - -my($wrap) = $ENV{"TOAST_HS_WRAPPER"} || ""; -$wrap .= ":" if $wrap; -$ENV{"TOAST_HS_WRAPPER"} = $wrap .= $0; - -my(@extra); -push(@extra, ($me =~ /-pkg/ ? "-" : "") . "-package-conf", $_) - for grep(-r, split(/:/, $ENV{"GHC_PKG_PATH"} || "")); - -DIR: for(split(/:/, $ENV{"PATH"})) -{ - for("$_/$me.unwrapped", "$_/$me") - { - if(-x) - { - my(@stats) = stat or die("stat $_: $!"); - my($skip); - for $skip (split(/:/, $wrap)) - { - my(@skipstats) = stat($skip) or die("stat $skip: $!"); - next DIR if "$skipstats[0] $skipstats[1]" eq "$stats[0] $stats[1]"; - } - if(exists($ENV{"TOAST_VERBOSE_HS_WRAPPER"})) - { - print("toast: not rewriting $0 @ARGV\n") unless @extra; - print("toast: rewriting $0 @ARGV -> $0 @extra @ARGV\n") if @extra; - } - exec $_ ($0, @extra, @ARGV); - die("exec $_ failed: $!"); - } - } -} - -die("can't find next $me in PATH"); -EOF - -chmod +x "$wrapper" -for i in ghc ghci ghc-pkg; do - path="$rootdir/bin/$i" - if [ -r "$path" -a ! -r "$path.unwrapped" ] && ! diff -q "$path" "$wrapper" - then - mv "$path" "$path.unwrapped" - fi - ln -sf ghc.wrapped "$rootdir/bin/$i" -done - -[ "$*" = "--toast-install-wrapper-only" ] && exit 0 - ghc-pkg "$@" --user # let --auto-ghci-libs do its thing for arg; do @@ -4117,28 +4061,12 @@ } } -sub wraphaskell($$$) -{ - my($srcdir, $rootdir, $helperdir) = @_; - return true unless -x(path($rootdir, qw(bin ghc))); - my($script) = path($helperdir, "ghc-pkg"); - if(!-x($script)) - { - optmd($helperdir); - helphspkg($rootdir, $helperdir, "wrap-ghc"); - $script = path($helperdir, "wrap-ghc"); - armhelpers($helperdir); - } - run($script, "--toast-install-wrapper-only"); -} - sub compile($$$) { my($srcdir, $rootdir, $helperdir) = @_; compiledata($srcdir, $rootdir) || compilebin($srcdir, $rootdir) || compilehelp($srcdir, $rootdir, $helperdir); - wraphaskell($srcdir, $rootdir, $helperdir) if hspkg; polishrootdir($rootdir, armdir); } @@ -7370,31 +7298,26 @@ C<share/xml> and C<etc/xml> subdirectories. If the catalog already exists, it may be overwritten or deleted. The B<toast env> command will set C<XML_CATALOG_FILES> to point to this file when this option is set, -which helpds things like DocBook operate correctly. If B<xmlcatalog> +which helps things like DocBook operate correctly. If B<xmlcatalog> is disabled, B<toast arm> and B<toast disarm> will delete the C<toast-xml-catalog> file, if present, instead of rebuilding it. Default: enabled. =item S<B<--hspkg> | B<--nohspkg>> -When B<hspkg> is enabled, B<toast build> will generate various terrible -wrapper scripts for ghc and related commands, and B<toast arm> and -B<toast disarm> will maintain a Haskell package database B<armdir> called -C<etc/xml/toast-hs-package.conf>, whose presence and contents depend on -the contents of B<armdir>'s C<hspkg> subdirectory, which in turn will be -automatically populated by a wrapper script whenever a Haskell library -built via B<toast build> tries to register itself in the package database. -If the package database already exists, it may be overwritten or deleted. -The B<toast env> command will set C<GHC_PKG_PATH> to point to this file -when this option is set, which will cause wrapper scripts installed with -ghc and/or Haskell libraries to insert a --package-conf argument into -the command lines of some of the appropriate programs. This approach -has many flaws and is not unlikely to cause more problems than it solves. -If B<hspkg> is disabled, B<toast build> will not attempt to generate any -Haskell-specific wrapper scripts (which may prevent Haskell libraries -from building, at least with GHC 6.4); B<toast arm> and B<toast disarm> -will delete the C<toast-hs-package.conf> file, if present, instead of -rebuilding it. Poorly tested against GHC 6.4 only. Default: disabled. +When B<hspkg> is enabled, B<toast build> will attempt to intercept +information about Haskell packages registered with C<ghc-pkg> and store +it in strangely-named files in a special C<hspkg> subdirectory; B<toast +arm> and B<toast disarm> will rebuild a Haskell package database in +B<armdir> called C<etc/xml/toast-hs-package.conf>, whose presence and +contents depend on the contents of B<armdir>'s C<hspkg> subdirectory; +and B<toast env> will add this package database to the C<GHC_PACKAGE_PATH> +environment variable used by GHC 6.6 and later. If B<hspkg> is disabled, +B<toast build> will not attempt to intercept calls to C<ghc-pkg>, which +may prevent Haskell libraries from building at all, at least with GHC +6.6 and earlier; and B<toast arm> and B<toast disarm> will delete the +C<toast-hs-package.conf> file, if present, instead of rebuilding it. +Essentially untested. Default: disabled. =item S<B<--protect> | B<--noprotect>>