X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=utils%2Fh2xs.PL;h=f9868dc37f010553440215dedc8a9ea6b7fbda58;hb=f13e1b2f9edd0ad9259bea67c343cb00d1d5e9e3;hp=535ec4108f8f55d6ee48262e7df785912ffc59ba;hpb=f508c6526654a0308ba4f35e40591236baa0a3c8;p=p5sagit%2Fp5-mst-13.2.git diff --git a/utils/h2xs.PL b/utils/h2xs.PL index 535ec41..f9868dc 100644 --- a/utils/h2xs.PL +++ b/utils/h2xs.PL @@ -15,8 +15,7 @@ use File::Basename qw(&basename &dirname); chdir(dirname($0)); ($file = basename($0)) =~ s/\.PL$//; $file =~ s/\.pl$// - if ($Config{'osname'} eq 'VMS' or - $Config{'osname'} eq 'OS2'); # "case-forgiving" + if ($^O eq 'VMS' or $^O eq 'os2'); # "case-forgiving" open OUT,">$file" or die "Can't create $file: $!"; @@ -41,7 +40,7 @@ h2xs - convert .h C header files to Perl extensions =head1 SYNOPSIS -B [B<-APcf>] [B<-v> version] [B<-n> module_name] [headerfile [extra_libraries]] +B [B<-AOPXcf>] [B<-v> version] [B<-n> module_name] [headerfile [extra_libraries]] B B<-h> @@ -73,6 +72,10 @@ in the extra-libraries argument. Omit all autoload facilities. This is the same as B<-c> but also removes the S> statement from the .pm file. +=item B<-O> + +Allows a pre-existing extension directory to be overwritten. + =item B<-P> Omit the autogenerated stub POD section. @@ -100,6 +103,11 @@ Specifies a name to be used for the extension, e.g., S<-n RPC::DCE> Specify a version number for this extension. This version number is added to the templates. The default is 0.01. +=item B<-X> + +Omit the XS portion. Used to generate templates for a module which is not +XS-based. + =back =head1 EXAMPLES @@ -149,20 +157,22 @@ The usual warnings if it can't read or write the files involved. =cut -my( $H2XS_VERSION ) = '$Revision: 1.12 $' =~ /\$Revision:\s+([^\s]+)/; +my( $H2XS_VERSION ) = '$Revision: 1.16 $' =~ /\$Revision:\s+([^\s]+)/; my $TEMPLATE_VERSION = '0.01'; use Getopt::Std; sub usage{ warn "@_\n" if @_; - die "h2xs [-APcfh] [-v version] [-n module_name] [headerfile [extra_libraries]] + die "h2xs [-AOPXcfh] [-v version] [-n module_name] [headerfile [extra_libraries]] version: $H2XS_VERSION -f Force creation of the extension even if the C header does not exist. -n Specify a name to use for the extension (recommended). -c Omit the constant() function and specialised AUTOLOAD from the XS file. -A Omit all autoloading facilities (implies -c). + -O Allow overwriting of a pre-existing extension directory. -P Omit the stub POD section. + -X Omit the XS portion. -v Specify a version number for this extension. -h Display this help message extra_libraries @@ -172,7 +182,7 @@ extra_libraries } -getopts("APcfhv:n:") || usage; +getopts("AOPXcfhv:n:") || usage; usage if $opt_h; @@ -237,13 +247,24 @@ else { } -die "Won't overwrite existing $ext$modpname\n" if -e $modpname; -# quick hack, should really loop over @modparts -mkdir($modparts[0], 0777) if $nested; +if ($opt_O) { + warn "Overwriting existing $ext$modpname!!!\n" if -e $modpname; +} else { + die "Won't overwrite existing $ext$modpname\n" if -e $modpname; +} +if( $nested ){ + $modpath = ""; + foreach (@modparts){ + mkdir("$modpath$_", 0777); + $modpath .= "$_/"; + } +} mkdir($modpname, 0777); chdir($modpname) || die "Can't chdir $ext$modpname: $!\n"; -open(XS, ">$modfname.xs") || die "Can't create $ext$modpname/$modfname.xs: $!\n"; +if( ! $opt_X ){ # use XS, unless it was disabled + open(XS, ">$modfname.xs") || die "Can't create $ext$modpname/$modfname.xs: $!\n"; +} open(PM, ">$modfname.pm") || die "Can't create $ext$modpname/$modfname.pm: $!\n"; $" = "\n\t"; @@ -252,31 +273,72 @@ warn "Writing $ext$modpname/$modfname.pm\n"; print PM <<"END"; package $module; +use strict; +END + +if( $opt_X || $opt_c || $opt_A ){ + # we won't have our own AUTOLOAD(), so won't have $AUTOLOAD + print PM <<'END'; +use vars qw($VERSION @ISA @EXPORT); +END +} +else{ + # we'll have an AUTOLOAD(), and it will have $AUTOLOAD and + # will want Carp. + print PM <<'END'; +use Carp; +use vars qw($VERSION @ISA @EXPORT $AUTOLOAD); +END +} + +print PM <<'END'; + require Exporter; +END + +print PM <<"END" if ! $opt_X; # use DynaLoader, unless XS was disabled require DynaLoader; END -if( ! $opt_A ){ +# require autoloader if XS is disabled. +# if XS is enabled, require autoloader unless autoloading is disabled. +if( $opt_X || (! $opt_A) ){ print PM <<"END"; require AutoLoader; END } -if( $opt_c && ! $opt_A ){ +if( $opt_X || ($opt_c && ! $opt_A) ){ # we won't have our own AUTOLOAD(), so we'll inherit it. - print PM <<"END"; + if( ! $opt_X ) { # use DynaLoader, unless XS was disabled + print PM <<"END"; \@ISA = qw(Exporter AutoLoader DynaLoader); END + } + else{ + print PM <<"END"; + +\@ISA = qw(Exporter AutoLoader); +END + } } else{ # 1) we have our own AUTOLOAD(), so don't need to inherit it. # or # 2) we don't want autoloading mentioned. - print PM <<"END"; + if( ! $opt_X ){ # use DynaLoader, unless XS was disabled + print PM <<"END"; \@ISA = qw(Exporter DynaLoader); END + } + else{ + print PM <<"END"; + +\@ISA = qw(Exporter); +END + } } print PM<<"END"; @@ -290,23 +352,22 @@ print PM<<"END"; END -print PM <<"END" unless $opt_c; +print PM <<"END" unless $opt_c or $opt_X; sub AUTOLOAD { # This AUTOLOAD is used to 'autoload' constants from the constant() # XS function. If a constant is not found then control is passed # to the AUTOLOAD in AutoLoader. - local(\$constname); + my \$constname; (\$constname = \$AUTOLOAD) =~ s/.*:://; - \$val = constant(\$constname, \@_ ? \$_[0] : 0); + my \$val = constant(\$constname, \@_ ? \$_[0] : 0); if (\$! != 0) { if (\$! =~ /Invalid/) { \$AutoLoader::AUTOLOAD = \$AUTOLOAD; goto &AutoLoader::AUTOLOAD; } else { - (\$pack,\$file,\$line) = caller; - die "Your vendor has not defined $module macro \$constname, used at \$file line \$line.\n"; + croak "Your vendor has not defined $module macro \$constname"; } } eval "sub \$AUTOLOAD { \$val }"; @@ -315,12 +376,24 @@ sub AUTOLOAD { END -print PM <<"END"; +if( ! $opt_X ){ # print bootstrap, unless XS is disabled + print PM <<"END"; bootstrap $module \$VERSION; +END +} + +if( $opt_P ){ # if POD is disabled + $after = '__END__'; +} +else { + $after = '=cut'; +} + +print PM <<"END"; # Preloaded methods go here. -# Autoload methods go after __END__, and are processed by the autosplit program. +# Autoload methods go after $after, and are processed by the autosplit program. 1; __END__ @@ -366,6 +439,7 @@ print PM $pod unless $opt_P; close PM; +if( ! $opt_X ){ # print XS, unless it is disabled warn "Writing $ext$modpname/$modfname.xs\n"; print XS <<"END"; @@ -469,7 +543,7 @@ constant(name,arg) END close XS; - +} # if( ! $opt_X ) warn "Writing $ext$modpname/Makefile.PL\n"; open(PL, ">Makefile.PL") || die "Can't create $ext$modpname/Makefile.PL: $!\n"; @@ -481,10 +555,12 @@ use ExtUtils::MakeMaker; END print PL "WriteMakefile(\n"; print PL " 'NAME' => '$module',\n"; -print PL " 'VERSION' => '$TEMPLATE_VERSION',\n"; -print PL " 'LIBS' => ['$extralibs'], # e.g., '-lm' \n"; -print PL " 'DEFINE' => '', # e.g., '-DHAVE_SOMETHING' \n"; -print PL " 'INC' => '', # e.g., '-I/usr/include/other' \n"; +print PL " 'VERSION_FROM' => '$modfname.pm', # finds \$VERSION\n"; +if( ! $opt_X ){ # print C stuff, unless XS is disabled + print PL " 'LIBS' => ['$extralibs'], # e.g., '-lm' \n"; + print PL " 'DEFINE' => '', # e.g., '-DHAVE_SOMETHING' \n"; + print PL " 'INC' => '', # e.g., '-I/usr/include/other' \n"; +} print PL ");\n"; close(PL) || die "Can't close $ext$modpname/Makefile.PL: $!\n"; @@ -499,7 +575,7 @@ print EX <<'_END_'; # Change 1..1 below to 1..last_test_to_print . # (It may become useful if the test is moved to ./t subdirectory.) -BEGIN {print "1..1\n";} +BEGIN { $| = 1; print "1..1\n"; } END {print "not ok 1\n" unless $loaded;} _END_ print EX <<_END_; @@ -518,7 +594,23 @@ print "ok 1\n"; _END_ close(EX) || die "Can't close $ext$modpname/test.pl: $!\n"; -system '/bin/ls > MANIFEST' or system 'ls > MANIFEST'; +warn "Writing $ext$modpname/Changes\n"; +open(EX, ">Changes") || die "Can't create $ext$modpname/Changes: $!\n"; +print EX "Revision history for Perl extension $module.\n\n"; +print EX "$TEMPLATE_VERSION ",scalar localtime,"\n"; +print EX "\t- original version; created by h2xs $H2XS_VERSION\n\n"; +close(EX) || die "Can't close $ext$modpname/Changes: $!\n"; + +warn "Writing $ext$modpname/MANIFEST\n"; +open(MANI,'>MANIFEST') or die "Can't create MANIFEST: $!"; +@files = <*>; +if (!@files) { + eval {opendir(D,'.');}; + unless ($@) { @files = readdir(D); closedir(D); } +} +if (!@files) { @files = map {chomp && $_} `ls`; } +print MANI join("\n",@files); +close MANI; !NO!SUBS! close OUT or die "Can't close $file: $!";