Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Perl Misc (http://www.velocityreviews.com/forums/f67-perl-misc.html)
-   -   ExtUtils::MakeMaker under Win32 - problem - missing double-quotes (http://www.velocityreviews.com/forums/t897862-extutils-makemaker-under-win32-problem-missing-double-quotes.html)

tuser 05-08-2006 06:18 PM

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.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57