Suppose that you have some C files implementing some functionality,
and the corresponding header files. How to create an extension which
-makes this functionality accessable in Perl? The example below
+makes this functionality accessible in Perl? The example below
assumes that the header files are F<interface_simple.h> and
I<interface_hairy.h>, and you want the perl module be named as
C<Ext::Ension>. If you need some preprocessor directives and/or
--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;
if( $opt_b ){
usage "You cannot use -b and -m at the same time.\n" if ($opt_b && $opt_m);
- $opt_b =~ /^\d+\.\d+\.\d+/ ||
+ $opt_b =~ /^v?(\d+)\.(\d+)\.(\d+)/ ||
usage "You must provide the backwards compatibility version in X.Y.Z form. "
. "(i.e. 5.5.0)\n";
- my ($maj,$min,$sub) = split(/\./,$opt_b,3);
+ my ($maj,$min,$sub) = ($1,$2,$3);
if ($maj < 5 || ($maj == 5 && $min < 6)) {
$compat_version =
$sub ? sprintf("%d.%03d%02d",$maj,$min,$sub) :
# Remove C and C++ comments
$src =~ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#$2#gs;
- while ($src =~ /(\benum\s*([\w_]*)\s*\{\s([\s\w=,]+)\})/gsc) {
- my ($enum_name, $enum_body) =
- $1 =~ /enum\s*([\w_]*)\s*\{\s([\s\w=,]+)\}/gs;
+ while ($src =~ /\benum\s*([\w_]*)\s*\{\s([^}]+)\}/gsc) {
+ my ($enum_name, $enum_body) = ($1, $2);
# skip enums matching $opt_e
next if $opt_e && $enum_name =~ /$opt_e/;
my $val = 0;
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
warn "Writing $ext$modpname/Makefile.PL\n";
open(PL, ">Makefile.PL") || die "Can't create $ext$modpname/Makefile.PL: $!\n";
-my $prereq_pm;
+my $prereq_pm = '';
if ( $compat_version < 5.00702 and $new_test )
{
- $prereq_pm = q%'Test::More' => 0%;
+ $prereq_pm .= q%'Test::More' => 0, %;
}
-else
+
+if ( $compat_version < 5.00600 and !$opt_X and $use_xsloader)
{
- $prereq_pm = '';
+ $prereq_pm .= q%'XSLoader' => 0, %;
}
print PL <<"END";