Currently the configure script uses the presence of a perl module
(Term::ReadLine::Gnu) and a hard coded list of platforms to decide if
ghc has Readline and Posix support. This is fragile and often wrong.
This patch asks ghc-pkg which packages are supported and passes that
down to the script that generates config.h.
For now I'm passing the packages available to ghc on
util/config_h.pl's command line, but it probably makes more sense to
kill util/config_h.pl and move its functionality into Makefile.PL
since the new %ghc_packages hash is only easily available there.
With the following, Readline is now correctly detected on my machine.
It should work on other platforms, but I haven't tested them.
-Jim
Also, there seem to be a divergent copy of assert_ghc() in
ext/Pugs-MakeMaker/lib/Pugs/MakeMaker.pm
which I didn't patch.
Index: Makefile.PL
===================================================================
--- Makefile.PL (revision 1312)
+++ Makefile.PL (working copy)
@@ -47,7 +47,7 @@
my @srcfiles = grep !/MainCC/, map glob("$_/*.*hs"), @srcdirs;
# turning off unused imports and deprecations for GHC6.4.
- my ($ghc, $ghc_version, $ghc_flags) = assert_ghc();
+ my ($ghc, $ghc_version, $ghc_flags, $ghc_packages) = assert_ghc();
my $ghc_output = "-o pugs$Config{_exe} src/Main.hs";
my $pcre = "src/pcre/pcre.o";
@@ -62,7 +62,7 @@
postamble(fixpaths(<< "."));
$config_h : lib/Perl6/Pugs.pm util/config_h.pl
- \$(PERL) util/config_h.pl
+ \$(PERL) util/config_h.pl @{[keys %$ghc_packages]}
$version_h : .svn/entries util/version_h.pl
\$(PERL) util/version_h.pl
Index: inc/Module/Install/Pugs.pm
===================================================================
--- inc/Module/Install/Pugs.pm (revision 1312)
+++ inc/Module/Install/Pugs.pm (working copy)
@@ -156,7 +156,13 @@
if $ENV{PUGS_EMBED} and $ENV{PUGS_EMBED} =~ /perl5/i;
$ghc_flags .= " -fno-warn-deprecations -fno-warn-orphans"
if $ghc_version ge '6.4';
- return ($ghc, $ghc_version, $ghc_flags);
+
+ my $packages = `$ghc-pkg --list-packages`;
+ $packages =~ s/^.*://g; # remove the config filename:
+ $packages =~ s/[\n\s]+//g; # simplify for the split RE
+ my %ghc_packages = map { $_ => 1 } split /,/, $packages;
+
+ return ($ghc, $ghc_version, $ghc_flags, \%ghc_packages);
}
sub fixpaths {
Index: util/config_h.pl
===================================================================
--- util/config_h.pl (revision 1312)
+++ util/config_h.pl (working copy)
@@ -3,7 +3,8 @@
use warnings;
use Cwd;
-my $base = shift || Cwd::cwd();
+my $base = Cwd::cwd();
+my @packages = @ARGV;
open IN, "< $base/lib/Perl6/Pugs.pm" or die $!;
open OUT, "> $base/src/pugs_config.h" or die $!;
@@ -39,30 +40,22 @@
.
}
-if ($^O =~ /MSWin32|mingw|msys/i) {
- print OUT "#undef PUGS_HAVE_POSIX\n";
+if (grep /^unix$/, @packages) {
+ print OUT "#define PUGS_HAVE_POSIX 1\n";
}
else {
- print OUT "#define PUGS_HAVE_POSIX 1\n";
+ print OUT "#undef PUGS_HAVE_POSIX\n";
}
-my $has_readline = eval {
- require Term::ReadLine;
- require Term::ReadLine::Gnu;
- 1;
-};
-
-if ($has_readline) {
+if (grep /^readline$/, @packages) {
print OUT "#define PUGS_HAVE_READLINE 1\n";
}
else {
print OUT "#undef PUGS_HAVE_READLINE\n";
warn << '.';
-*** Readline support disabled. If you want readline support,
- please install Term::ReadLine::Gnu from CPAN, as well as
- the GNU Readline headers and shared library.
-
+*** Readline support disabled. ghc does not have
+ System.Console.Readline.
.
}
close OUT;