diff options
Diffstat (limited to 'lib/ExtUtils/xsubpp')
-rwxr-xr-x | lib/ExtUtils/xsubpp | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/lib/ExtUtils/xsubpp b/lib/ExtUtils/xsubpp index 7ae8020e25..9be40e64ec 100755 --- a/lib/ExtUtils/xsubpp +++ b/lib/ExtUtils/xsubpp @@ -6,7 +6,7 @@ xsubpp - compiler to convert Perl XS code into C code =head1 SYNOPSIS -B<xsubpp> [B<-v>] [B<-C++>] [B<-except>] [B<-s pattern>] [B<-prototypes>] [B<-noversioncheck>] [B<-nolinenumbers>] [B<-nooptimize>] [B<-typemap typemap>] ... file.xs +B<xsubpp> [B<-v>] [B<-C++>] [B<-csuffix csuffix>] [B<-except>] [B<-s pattern>] [B<-prototypes>] [B<-noversioncheck>] [B<-nolinenumbers>] [B<-nooptimize>] [B<-typemap typemap>] ... file.xs =head1 DESCRIPTION @@ -34,6 +34,12 @@ any makefiles generated by MakeMaker. Adds ``extern "C"'' to the C code. +=item B<-csuffix csuffix> + +Set the suffix used for the generated C or C++ code. Defaults to '.c' +(even with B<-C++>), but some platforms might want to have e.g. '.cpp'. +Don't forget the '.' from the front. + =item B<-hiertype> Retains '::' in type names so that C++ hierachical types can be mapped. @@ -126,7 +132,7 @@ if ($^O eq 'VMS') { $FH = 'File0000' ; -$usage = "Usage: xsubpp [-v] [-C++] [-except] [-prototypes] [-noversioncheck] [-nolinenumbers] [-nooptimize] [-noinout] [-noargtypes] [-s pattern] [-typemap typemap]... file.xs\n"; +$usage = "Usage: xsubpp [-v] [-C++] [-csuffix csuffix] [-except] [-prototypes] [-noversioncheck] [-nolinenumbers] [-nooptimize] [-noinout] [-noargtypes] [-s pattern] [-typemap typemap]... file.xs\n"; $proto_re = "[" . quotemeta('\$%&*@;[]') . "]" ; @@ -141,12 +147,14 @@ $Fallback = 'PL_sv_undef'; my $process_inout = 1; my $process_argtypes = 1; +my $csuffix = '.c'; SWITCH: while (@ARGV and $ARGV[0] =~ /^-./) { $flag = shift @ARGV; $flag =~ s/^-// ; $spat = quotemeta shift, next SWITCH if $flag eq 's'; $cplusplus = 1, next SWITCH if $flag eq 'C++'; + $csuffix = shift, next SWITCH if $flag eq 'csuffix'; $hiertype = 1, next SWITCH if $flag eq 'hiertype'; $WantPrototypes = 0, next SWITCH if $flag eq 'noprototypes'; $WantPrototypes = 1, next SWITCH if $flag eq 'prototypes'; @@ -357,7 +365,7 @@ if ($WantLineNumbers) { } my $cfile = $filename; - $cfile =~ s/\.xs$/.c/i or $cfile .= ".c"; + $cfile =~ s/\.xs$/$csuffix/i or $cfile .= $csuffix; tie(*PSEUDO_STDOUT, 'xsubpp::counter', $cfile); select PSEUDO_STDOUT; } @@ -1059,6 +1067,7 @@ while (fetch_para()) { undef(%var_types); undef(%defaults); undef($class); + undef($externC); undef($static); undef($elipsis); undef($wantRETVAL) ; @@ -1112,7 +1121,8 @@ while (fetch_para()) { blurt ("Error: Function definition too short '$ret_type'"), next PARAGRAPH unless @line ; - $static = 1 if $ret_type =~ s/^static\s+//; + $externC = 1 if $ret_type =~ s/^extern "C"\s+//; + $static = 1 if $ret_type =~ s/^static\s+//; $func_header = shift(@line); blurt ("Error: Cannot parse function definition from '$func_header'"), next PARAGRAPH @@ -1251,8 +1261,11 @@ while (fetch_para()) { $xsreturn = 1 if $EXPLICIT_RETURN; + $externC = $externC ? qq[extern "C"] : ""; + # print function header print Q<<"EOF"; +#$externC #XS(XS_${Full_func_name}); /* prototype to pass -Wmissing-prototypes */ #XS(XS_${Full_func_name}) #[[ |