![]() |
ExtUtils::MakeMaker under Win32 - problem - missing double-quotes
I have a problem with "ExtUtils::MakeMaker" under Win32.
(I am running Activestate Perl v 5.8.7 under Windows XP) "ExtUtils::MakeMaker" generates a Makefile where spaces can be found in the filenames, but it does not put double-quotes around the filename, so the Makefile fails. I searched the docs and the sourcecode for hours and hours to make "ExtUtils::MakeMaker" put double-quotes around its components, but I could not find anything. I was becoming desperate, so I had to apply drastic measures and intervene in the program which calls the "WriteMakefile(%options);" subroutine and artificially modify the Makefile after it had been generated. This works, but I am hoping that someone in comp.lang.perl.misc can point me to a better solution where "ExtUtils::MakeMaker" generates a correct Makefile in the first place. ********************************** Here is the background-story: ********************************** I tried to install "Inline::C" (Inline-0.44.zip) directly from the Activestate website. (see my other post "Inline::CPP for Windows ActiveState" on comp.lang.perl.misc) when I tested "Inline::C", it failed with: ================================================ Use of uninitialized value in -d at C:/Perl/lib/File/Path.pm line 144. fileparse(): need a valid pathname at C:/Perl/lib/File/Path.pm line 145 NMAKE : fatal error U1077: 'C:\Perl\bin\perl.exe' : return code '0x2' Stop. ================================================ I inspected the 'Makefile' and I began to understand what was wrong: Makefile: ================================================ pure_site_install :: $(NOECHO) $(MOD_INSTALL) \ read $(SITEARCHEXP)\auto\$(FULLEXT)\.packlist \ write $(DESTINSTALLSITEARCH)\auto\$(FULLEXT)\.packlist \ $(INST_LIB) $(DESTINSTALLSITELIB) \ $(INST_ARCHLIB) $(DESTINSTALLSITEARCH) \ $(INST_BIN) $(DESTINSTALLSITEBIN) \ $(INST_SCRIPT) $(DESTINSTALLSCRIPT) \ $(INST_MAN1DIR) $(DESTINSTALLSITEMAN1DIR) \ $(INST_MAN3DIR) $(DESTINSTALLSITEMAN3DIR) \ $(INST_HTMLDIR) $(DESTINSTALLSITEHTMLDIR) $(NOECHO) $(WARN_IF_OLD_PACKLIST) \ $(PERL_ARCHLIB)\auto\$(FULLEXT) ================================================ In fact, my current path ("C:\Documents and Settings\....") was stored in "$(DESTINSTALLSITELIB)", but it was not surrounded by double-quotes (as it should have been under Win32 where spaces are involved), and that's what 'Makefile' choked on. I could easily see that "Makefile" was generated by "ExtUtils::MakeMaker" and I searched for an option in "ExtUtils::MakeMaker" to make it put double-quotes around its components, but I could not find any solution. I was becoming desperate, so I had to apply drastic measures and intervene in C:\Perl\site\lib\Inline\C.pm (starting at line 640) to artificially modify the Makefile after it had been generated: ================================================ sub write_Makefile_PL { [...] open MF, "> ".File::Spec->catfile($o->{API}{build_dir},"Makefile.PL") or croak; print MF <<'END'; use ExtUtils::MakeMaker; my %options = %{ END local $Data::Dumper::Terse = 1; local $Data::Dumper::Indent = 1; print MF Data::Dumper::Dumper(\ %options); print MF <<'END'; }; WriteMakefile(%options); # Help !!! can someone please tell "ExtUtils::MakeMaker" # to put some quotes around parameters for "pure_*_install" # under Win32 ??? (not putting quotes around parameters # breaks the Makefile under Win32) # ---------------------------------------------------------- # ...if "ExtUtils::MakeMaker" can't be bothered, then I will # have to put the quotes myself... # Update 'Makefile' on a temporary 'Makefile.tmp' open MAKFILE, '<', 'Makefile' or die "Error 0010 - open input 'Makefile', $!"; open TMPFILE, '>', 'Makefile.tmp' or die "Error 0020 - open output 'Makefile.tmp', $!"; my $update = 0; while (<MAKFILE>) { chomp; if (/^(\w+)/) { my $keyword = $1; $update = $keyword =~ /^pure_[a-z]+_install$/; } if ($update and /^\t\t(.+)$/) { my @words = split(/\s+/, $1); for my $w (@words) { $w = qq{"$w"} unless $w eq '\\' or $w eq 'read' or $w eq 'write'; } $_ = "\t\t".join(' ', @words); } print TMPFILE "$_\n"; } close TMPFILE; close MAKFILE; # now commit the update back to 'Makefile' open TMPFILE, '<', 'Makefile.tmp' or die "Error 0030 - open input 'Makefile.tmp', $!"; open MAKFILE, '>', 'Makefile' or die "Error 0040 - open output 'Makefile', $!"; while (<TMPFILE>) { print MAKFILE; } close MAKFILE; close TMPFILE; ********************************** End of background-story ********************************** This works, but again, I am hoping that someone in comp.lang.perl.misc can point me to a better solution where "ExtUtils::MakeMaker" generates a correct Makefile in the first place. |
| All times are GMT. The time now is 10:18 AM. |
Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.