=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>
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.
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
=cut
-my( $H2XS_VERSION ) = '$Revision: 1.14 $' =~ /\$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
}
-getopts("APcfhv:n:") || usage;
+getopts("AOPXcfhv:n:") || usage;
usage if $opt_h;
}
-die "Won't overwrite existing $ext$modpname\n" if -e $modpname;
+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($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";
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";
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 }";
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__
close PM;
+if( ! $opt_X ){ # print XS, unless it is disabled
warn "Writing $ext$modpname/$modfname.xs\n";
print XS <<"END";
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";
print PL "WriteMakefile(\n";
print PL " 'NAME' => '$module',\n";
print PL " 'VERSION_FROM' => '$modfname.pm', # finds \$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";
+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";