by including arguments of the form B<-L/another/library/path> in the
extra-libraries argument.
+In spite of its name, I<h2xs> may also be used to create a skeleton pure
+Perl module. See the B<-X> option.
+
=head1 OPTIONS
=over 5
=item B<-X>, B<--omit-XS>
-Omit the XS portion. Used to generate templates for a module which is not
-XS-based. C<-c> and C<-f> are implicitly enabled.
+Omit the XS portion. Used to generate a skeleton pure Perl module.
+C<-c> and C<-f> are implicitly enabled.
=item B<-a>, B<--gen-accessors>
# Extension is ONC::RPC.
h2xs -cfn ONC::RPC
+ # Extension is a pure Perl module with no XS code.
+ h2xs -X My::Module
+
# Extension is Lib::Foo which works at least with Perl5.005_03.
# Constants are created for all #defines and enums h2xs can find
# in foo.h.
--skip-warnings Do not use the pragma C<warnings>.
-v, --version Specify a version number for this extension.
-x, --autogen-xsubs Autogenerate XSUBs using C::Scan.
+ --use-xsloader Use XSLoader in backward compatible modules (ignored
+ when used with -X).
extra_libraries
are any libraries that might be needed for loading the
$skip_autoloader,
$skip_strict,
$skip_warnings,
+ $use_xsloader
);
Getopt::Long::Configure('bundling');
'skip-autoloader' => \$skip_autoloader,
'skip-warnings' => \$skip_warnings,
'skip-strict' => \$skip_strict,
+ 'use-xsloader' => \$use_xsloader,
);
GetOptions(%options) || usage;
$sub ? sprintf("%d.%03d%02d",$maj,$min,$sub) :
sprintf("%d.%03d", $maj,$min);
} else {
- $compat_version =
- $sub ? sprintf("%d.%03d%03d",$maj,$min,$sub) :
- sprintf("%d.%03d", $maj,$min);
+ $compat_version = sprintf("%d.%03d%03d",$maj,$min,$sub);
}
} else {
my ($maj,$min,$sub) = $compat_version =~ /(\d+)\.(\d\d\d)(\d*)/;
# Remove C and C++ comments
$src =~ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#$2#gs;
+ $src =~ s#//.*$##gm;
while ($src =~ /\benum\s*([\w_]*)\s*\{\s([^}]+)\}/gsc) {
my ($enum_name, $enum_body) = ($1, $2);
next if $opt_e && $enum_name =~ /$opt_e/;
my $val = 0;
for my $item (split /,/, $enum_body) {
+ next if $item =~ /\A\s*\Z/;
my ($key, $declared_val) = $item =~ /(\w+)\s*(?:=\s*(.*))?/;
$val = defined($declared_val) && length($declared_val) ? $declared_val : 1 + $val;
$seen_define{$key} = $val;
require Exporter;
END
-my $use_Dyna = (not $opt_X and $compat_version < 5.006);
+my $use_Dyna = (not $opt_X and $compat_version < 5.006 and not $use_xsloader);
print PM <<"END" if $use_Dyna; # use DynaLoader, unless XS was disabled
require DynaLoader;
END
}
};
+$author =~ s/'/\\'/g if defined $author;
$author ||= "A. U. Thor";
$email ||= 'a.u.thor@a.galaxy.far.far.away';
$prereq_pm .= q%'Test::More' => 0, %;
}
-if ( $compat_version < 5.00600 and !$opt_X)
+if ( $compat_version < 5.00600 and !$opt_X and $use_xsloader)
{
$prereq_pm .= q%'XSLoader' => 0, %;
}