X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=configpm;h=a83e8661fba9a28212dfd7fc0fc8188e9c6bcfbe;hb=41d39f3045c8f89e3965ec33f17acd39dcfa09eb;hp=6216f85ae094727de011cdbf5106a224f2c10d03;hpb=cb551bf945dbea50db7071001928adfecb0d1bfc;p=p5sagit%2Fp5-mst-13.2.git diff --git a/configpm b/configpm index 6216f85..a83e866 100755 --- a/configpm +++ b/configpm @@ -1,7 +1,36 @@ #!./miniperl -w -my $config_pm = $ARGV[0] || 'lib/Config.pm'; +# following options are recognized: +# --no-glossary - no glossary file inclusion, for compactness +# --cross=PALTFORM - crosscompiling for PLATFORM +my %opts = ( + # %known_opts enumerates allowed opts as well as specifies default and initial values + my %known_opts = ( + 'cross' => '', + 'glossary' => 1, + ), + # options itself + my %specified_opts = ( + (map {/^--([\-_\w]+)=(.*)$/} @ARGV), # --opt=smth + (map {/^no-?(.*)$/i?($1=>0):($_=>1)} map {/^--([\-_\w]+)$/} @ARGV), # --opt --no-opt --noopt + ), +); +die "option '$_' is not recognized" for grep {!exists $known_opts{$_}} keys %specified_opts; +@ARGV = grep {!/^--/} @ARGV; + +my $config_pm; my $glossary = $ARGV[1] || 'Porting/Glossary'; + +if ($opts{cross}) { + # creating cross-platform config file + mkdir "xlib"; + mkdir "xlib/$opts{cross}"; + $config_pm = $ARGV[0] || "xlib/$opts{cross}/Config.pm"; +} +else { + $config_pm = $ARGV[0] || 'lib/Config.pm'; +} + @ARGV = "./config.sh"; # list names to put first (and hence lookup fastest) @@ -277,6 +306,17 @@ if ($OS2::is_aout) { $preconfig{d_fork} = undef unless $OS2::can_fork; # Some funny cases can't sub TIEHASH { bless {%preconfig} } ENDOFSET + # Extract the name of the DLL from the makefile to avoid duplication + my ($f) = grep -r, qw(GNUMakefile Makefile); + my $dll; + if (open my $fh, '<', $f) { + while (<$fh>) { + $dll = $1, last if /^PERL_DLL_BASE\s*=\s*(\S*)\s*$/; + } + } + print CONFIG <\n\nFrom F<$2>:\n\n/m; - my $c = substr $1, 0, 1; - unless ($seen{$c}++) { - print CONFIG <\n\nFrom F<$2>:\n\n/m) { + my $c = substr $1, 0, 1; + unless ($seen{$c}++) { + print CONFIG < paragraphs + s/^\t\s+(.*)/\n$1/gm; # Indented lines ===> new paragraph s/^(? text s{([\'\"])(?=[^\'\"\s]*[./][^\'\"\s]*\1)([^\'\"\s]+)\1}(F<$2>)g; # '.o' s{([\'\"])([^\'\"\s]+)\1}(C<$2>)g; # "date" command @@ -435,8 +482,14 @@ EOF (?! e \. g \. ) # Not e.g. (?! \. \. \. ) # Not ... (?! \d ) # Not 5.004 - ( [\w./]* [./] [\w./]* ) # Require . or / inside - (?)xg; # /usr/local @@ -446,10 +499,13 @@ EOF s/n[\0]t/n't/g; # undo can't, won't damage } -; # Skip the preamble -while () { - process; - print CONFIG; +if ($opts{glossary}) { + ; # Skip the "DO NOT EDIT" + ; # Skip the preamble + while () { + process; + print CONFIG; + } } print CONFIG <<'ENDOFTAIL'; @@ -469,6 +525,34 @@ ENDOFTAIL close(CONFIG); close(GLOS); +# Now create Cross.pm if needed +if ($opts{cross}) { + open CROSS, ">lib/Cross.pm" or die "Can not open >lib/Cross.pm: $!"; + my $cross = <<'EOS'; +# typical invocation: +# perl -MCross Makefile.PL +# perl -MCross=wince -V:cc +package Cross; + +sub import { + my ($package,$platform) = @_; + unless (defined $platform) { + # if $platform is not specified, then use last one when + # 'configpm; was invoked with --cross option + $platform = '***replace-marker***'; + } + @INC = map {/\blib\b/?(do{local $_=$_;s/\blib\b/xlib\/$platform/;$_},$_):($_)} @INC; + $::Cross::platform = $platform; +} + +1; +EOS + $cross =~ s/\*\*\*replace-marker\*\*\*/$opts{cross}/g; + print CROSS $cross; + close CROSS; +} + + # Now do some simple tests on the Config.pm file we have created unshift(@INC,'lib'); require $config_pm;