Correct CODE block declaration
[p5sagit/p5-mst-13.2.git] / utils / h2xs.PL
index 535ec41..f9868dc 100644 (file)
@@ -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<h2xs> [B<-APcf>] [B<-v> version] [B<-n> module_name] [headerfile [extra_libraries]]
+B<h2xs> [B<-AOPXcf>] [B<-v> version] [B<-n> module_name] [headerfile [extra_libraries]]
 
 B<h2xs> 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<C<require AutoLoader>> 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: $!";