This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate:
[perl5.git] / utils / h2xs.PL
CommitLineData
4633a7c4
LW
1#!/usr/local/bin/perl
2
3use Config;
4use File::Basename qw(&basename &dirname);
8a5546a1 5use Cwd;
4633a7c4
LW
6
7# List explicitly here the variables you want Configure to
8# generate. Metaconfig only looks for shell variables, so you
9# have to mention them as if they were shell variables, not
10# %Config entries. Thus you write
11# $startperl
12# to ensure Configure will look for $Config{startperl}.
13
14# This forces PL files to create target in same directory as PL file.
15# This is so that make depend always knows where to find PL derivatives.
be3174d2 16my $origdir = cwd;
44a8e56a 17chdir dirname($0);
be3174d2 18my $file = basename($0, '.PL');
774d564b 19$file .= '.com' if $^O eq 'VMS';
4633a7c4
LW
20
21open OUT,">$file" or die "Can't create $file: $!";
22
23print "Extracting $file (with variable substitutions)\n";
24
25# In this section, perl variables will be expanded during extraction.
26# You can use $Config{...} to use Configure variables.
27
28print OUT <<"!GROK!THIS!";
1dea8210 29$Config{startperl}
5f05dabc 30 eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
31 if \$running_under_some_shell;
40000a8c
AD
32!GROK!THIS!
33
4633a7c4
LW
34# In the following, perl variables are not expanded during extraction.
35
36print OUT <<'!NO!SUBS!';
cf35f3c1 37
1dea8210
JH
38use warnings;
39
3edbfbe5
TB
40=head1 NAME
41
42h2xs - convert .h C header files to Perl extensions
43
44=head1 SYNOPSIS
45
11946041 46B<h2xs> [B<OPTIONS> ...] [headerfile ... [extra_libraries]]
f508c652 47
11946041 48B<h2xs> B<-h>|B<-?>|B<--help>
3edbfbe5
TB
49
50=head1 DESCRIPTION
51
a887ff11
BS
52I<h2xs> builds a Perl extension from C header files. The extension
53will include functions which can be used to retrieve the value of any
54#define statement which was in the C header files.
3edbfbe5
TB
55
56The I<module_name> will be used for the name of the extension. If
a887ff11
BS
57module_name is not supplied then the name of the first header file
58will be used, with the first character capitalized.
3edbfbe5
TB
59
60If the extension might need extra libraries, they should be included
61here. The extension Makefile.PL will take care of checking whether
9cacc32e
JH
62the libraries actually exist and how they should be loaded. The extra
63libraries should be specified in the form -lm -lposix, etc, just as on
64the cc command line. By default, the Makefile.PL will search through
65the library path determined by Configure. That path can be augmented
66by including arguments of the form B<-L/another/library/path> in the
67extra-libraries argument.
3edbfbe5
TB
68
69=head1 OPTIONS
70
71=over 5
72
4d2d0db2 73=item B<-A>, B<--omit-autoload>
3edbfbe5 74
9cacc32e
JH
75Omit all autoload facilities. This is the same as B<-c> but also
76removes the S<C<use AutoLoader>> statement from the .pm file.
3edbfbe5 77
9e4509e4
YST
78=item B<-B>, B<--beta-version>
79
80Use an alpha/beta style version number. Causes version number to
81be "0.00_01" unless B<-v> is specified.
82
4d2d0db2 83=item B<-C>, B<--omit-changes>
c0f8b9cd
GS
84
85Omits creation of the F<Changes> file, and adds a HISTORY section to
86the POD template.
87
4d2d0db2 88=item B<-F>, B<--cpp-flags>=I<addflags>
b73edd97 89
90Additional flags to specify to C preprocessor when scanning header for
dcb5229a
IZ
91function declarations. Writes these options in the generated F<Makefile.PL>
92too.
ddf6bed1 93
4d2d0db2 94=item B<-M>, B<--func-mask>=I<regular expression>
ddf6bed1
IZ
95
96selects functions/macros to process.
b73edd97 97
4d2d0db2 98=item B<-O>, B<--overwrite-ok>
2920c5d2 99
100Allows a pre-existing extension directory to be overwritten.
101
4d2d0db2 102=item B<-P>, B<--omit-pod>
3edbfbe5 103
65843164 104Omit the autogenerated stub POD section.
3edbfbe5 105
4d2d0db2 106=item B<-X>, B<--omit-XS>
b73edd97 107
108Omit the XS portion. Used to generate templates for a module which is not
9ef261b5 109XS-based. C<-c> and C<-f> are implicitly enabled.
b73edd97 110
4d2d0db2 111=item B<-a>, B<--gen-accessors>
7c1d48a5
GS
112
113Generate an accessor method for each element of structs and unions. The
114generated methods are named after the element name; will return the current
115value of the element if called without additional arguments; and will set
32fb2b78
GS
116the element to the supplied value (and return the new value) if called with
117an additional argument. Embedded structures and unions are returned as a
118pointer rather than the complete structure, to facilitate chained calls.
119
120These methods all apply to the Ptr type for the structure; additionally
121two methods are constructed for the structure type itself, C<_to_ptr>
122which returns a Ptr type pointing to the same structure, and a C<new>
123method to construct and return a new structure, initialised to zeroes.
7c1d48a5 124
4d2d0db2 125=item B<-b>, B<--compat-version>=I<version>
af6c647e
NC
126
127Generates a .pm file which is backwards compatible with the specified
128perl version.
129
130For versions < 5.6.0, the changes are.
131 - no use of 'our' (uses 'use vars' instead)
132 - no 'use warnings'
133
134Specifying a compatibility version higher than the version of perl you
3e6e4ea8
NC
135are using to run h2xs will have no effect. If unspecified h2xs will default
136to compatibility with the version of perl you are using to run h2xs.
af6c647e 137
4d2d0db2 138=item B<-c>, B<--omit-constant>
3edbfbe5
TB
139
140Omit C<constant()> from the .xs file and corresponding specialised
141C<AUTOLOAD> from the .pm file.
142
4d2d0db2 143=item B<-d>, B<--debugging>
b73edd97 144
145Turn on debugging messages.
146
37c58f60
JH
147=item B<-e>, B<--omit-enums>=[I<regular expression>]
148
149If I<regular expression> is not given, skip all constants that are defined in
150a C enumeration. Otherwise skip only those constants that are defined in an
151enum whose name matches I<regular expression>.
152
153Since I<regular expression> is optional, make sure that this switch is followed
154by at least one other switch if you omit I<regular expression> and have some
155pending arguments such as header-file names. This is ok:
156
157 h2xs -e -n Module::Foo foo.h
158
159This is not ok:
160
161 h2xs -n Module::Foo -e foo.h
162
163In the latter, foo.h is taken as I<regular expression>.
164
4d2d0db2 165=item B<-f>, B<--force>
3edbfbe5 166
f508c652 167Allows an extension to be created for a header even if that header is
ddf6bed1 168not found in standard include directories.
f508c652 169
e255a1c9
PM
170=item B<-g>, B<--global>
171
65843164 172Include code for safely storing static data in the .xs file.
e255a1c9
PM
173Extensions that do no make use of static data can ignore this option.
174
4d2d0db2 175=item B<-h>, B<-?>, B<--help>
f508c652 176
177Print the usage, help and version for this h2xs and exit.
178
4d2d0db2 179=item B<-k>, B<--omit-const-func>
32fb2b78
GS
180
181For function arguments declared as C<const>, omit the const attribute in the
182generated XS code.
183
4d2d0db2 184=item B<-m>, B<--gen-tied-var>
32fb2b78
GS
185
186B<Experimental>: for each variable declared in the header file(s), declare
187a perl variable of the same name magically tied to the C variable.
188
4d2d0db2 189=item B<-n>, B<--name>=I<module_name>
f508c652 190
191Specifies a name to be used for the extension, e.g., S<-n RPC::DCE>
192
4d2d0db2 193=item B<-o>, B<--opaque-re>=I<regular expression>
ddf6bed1
IZ
194
195Use "opaque" data type for the C types matched by the regular
196expression, even if these types are C<typedef>-equivalent to types
197from typemaps. Should not be used without B<-x>.
198
199This may be useful since, say, types which are C<typedef>-equivalent
200to integers may represent OS-related handles, and one may want to work
201with these handles in OO-way, as in C<$handle-E<gt>do_something()>.
9cacc32e
JH
202Use C<-o .> if you want to handle all the C<typedef>ed types as opaque
203types.
ddf6bed1
IZ
204
205The type-to-match is whitewashed (except for commas, which have no
206whitespace before them, and multiple C<*> which have no whitespace
207between them).
208
4d2d0db2 209=item B<-p>, B<--remove-prefix>=I<prefix>
ead2a595 210
9cacc32e
JH
211Specify a prefix which should be removed from the Perl function names,
212e.g., S<-p sec_rgy_> This sets up the XS B<PREFIX> keyword and removes
213the prefix from functions that are autoloaded via the C<constant()>
214mechanism.
ead2a595 215
4d2d0db2 216=item B<-s>, B<--const-subs>=I<sub1,sub2>
ead2a595 217
9cacc32e
JH
218Create a perl subroutine for the specified macros rather than autoload
219with the constant() subroutine. These macros are assumed to have a
220return type of B<char *>, e.g.,
221S<-s sec_rgy_wildcard_name,sec_rgy_wildcard_sid>.
ead2a595 222
4d2d0db2 223=item B<-t>, B<--default-type>=I<type>
af6c647e
NC
224
225Specify the internal type that the constant() mechanism uses for macros.
226The default is IV (signed integer). Currently all macros found during the
227header scanning process will be assumed to have this type. Future versions
228of C<h2xs> may gain the ability to make educated guesses.
229
11946041
JS
230=item B<--use-new-tests>
231
232When B<--compat-version> (B<-b>) is present the generated tests will use
9e4509e4 233C<Test::More> rather than C<Test> which is the default for versions before
11946041
JS
2345.7.2 . C<Test::More> will be added to PREREQ_PM in the generated
235C<Makefile.PL>.
236
237=item B<--use-old-tests>
238
239Will force the generation of test code that uses the older C<Test> module.
240
dcb5229a
IZ
241=item B<--skip-exporter>
242
243Do not use C<Exporter> and/or export any symbol.
244
245=item B<--skip-ppport>
246
247Do not use C<Devel::PPPort>: no portability to older version.
248
249=item B<--skip-autoloader>
250
251Do not use the module C<AutoLoader>; but keep the constant() function
252and C<sub AUTOLOAD> for constants.
253
254=item B<--skip-strict>
255
256Do not use the pragma C<strict>.
257
258=item B<--skip-warnings>
259
260Do not use the pragma C<warnings>.
261
4d2d0db2 262=item B<-v>, B<--version>=I<version>
f508c652 263
264Specify a version number for this extension. This version number is added
9e4509e4
YST
265to the templates. The default is 0.01, or 0.00_01 if C<-B> is specified.
266The version specified should be numeric.
3edbfbe5 267
4d2d0db2 268=item B<-x>, B<--autogen-xsubs>
760ac839
LW
269
270Automatically generate XSUBs basing on function declarations in the
271header file. The package C<C::Scan> should be installed. If this
272option is specified, the name of the header file may look like
9cacc32e
JH
273C<NAME1,NAME2>. In this case NAME1 is used instead of the specified
274string, but XSUBs are emitted only for the declarations included from
275file NAME2.
760ac839 276
5273d82d
IZ
277Note that some types of arguments/return-values for functions may
278result in XSUB-declarations/typemap-entries which need
279hand-editing. Such may be objects which cannot be converted from/to a
ddf6bed1
IZ
280pointer (like C<long long>), pointers to functions, or arrays. See
281also the section on L<LIMITATIONS of B<-x>>.
5273d82d 282
3edbfbe5
TB
283=back
284
285=head1 EXAMPLES
286
287
37c58f60
JH
288 # Default behavior, extension is Rusers
289 h2xs rpcsvc/rusers
3edbfbe5 290
37c58f60
JH
291 # Same, but extension is RUSERS
292 h2xs -n RUSERS rpcsvc/rusers
3edbfbe5 293
37c58f60
JH
294 # Extension is rpcsvc::rusers. Still finds <rpcsvc/rusers.h>
295 h2xs rpcsvc::rusers
3edbfbe5 296
37c58f60
JH
297 # Extension is ONC::RPC. Still finds <rpcsvc/rusers.h>
298 h2xs -n ONC::RPC rpcsvc/rusers
3edbfbe5 299
37c58f60
JH
300 # Without constant() or AUTOLOAD
301 h2xs -c rpcsvc/rusers
3edbfbe5 302
37c58f60
JH
303 # Creates templates for an extension named RPC
304 h2xs -cfn RPC
3edbfbe5 305
37c58f60
JH
306 # Extension is ONC::RPC.
307 h2xs -cfn ONC::RPC
65843164 308
37c58f60
JH
309 # Extension is Lib::Foo which works at least with Perl5.005_03.
310 # Constants are created for all #defines and enums h2xs can find
311 # in foo.h.
312 h2xs -b 5.5.3 -n Lib::Foo foo.h
3edbfbe5 313
37c58f60
JH
314 # Extension is Lib::Foo which works at least with Perl5.005_03.
315 # Constants are created for all #defines but only for enums
316 # whose names do not start with 'bar_'.
317 h2xs -b 5.5.3 -e '^bar_' -n Lib::Foo foo.h
3edbfbe5 318
65843164 319 # Makefile.PL will look for library -lrpc in
37c58f60
JH
320 # additional directory /opt/net/lib
321 h2xs rpcsvc/rusers -L/opt/net/lib -lrpc
ead2a595 322
37c58f60
JH
323 # Extension is DCE::rgynbase
324 # prefix "sec_rgy_" is dropped from perl function names
325 h2xs -n DCE::rgynbase -p sec_rgy_ dce/rgynbase
3edbfbe5 326
37c58f60
JH
327 # Extension is DCE::rgynbase
328 # prefix "sec_rgy_" is dropped from perl function names
65843164 329 # subroutines are created for sec_rgy_wildcard_name and
37c58f60
JH
330 # sec_rgy_wildcard_sid
331 h2xs -n DCE::rgynbase -p sec_rgy_ \
332 -s sec_rgy_wildcard_name,sec_rgy_wildcard_sid dce/rgynbase
760ac839 333
37c58f60
JH
334 # Make XS without defines in perl.h, but with function declarations
335 # visible from perl.h. Name of the extension is perl1.
336 # When scanning perl.h, define -DEXT=extern -DdEXT= -DINIT(x)=
337 # Extra backslashes below because the string is passed to shell.
65843164 338 # Note that a directory with perl header files would
37c58f60
JH
339 # be added automatically to include path.
340 h2xs -xAn perl1 -F "-DEXT=extern -DdEXT= -DINIT\(x\)=" perl.h
760ac839 341
37c58f60
JH
342 # Same with function declaration in proto.h as visible from perl.h.
343 h2xs -xAn perl2 perl.h,proto.h
ddf6bed1 344
37c58f60
JH
345 # Same but select only functions which match /^av_/
346 h2xs -M '^av_' -xAn perl2 perl.h,proto.h
347
348 # Same but treat SV* etc as "opaque" types
349 h2xs -o '^[S]V \*$' -M '^av_' -xAn perl2 perl.h,proto.h
ddf6bed1 350
b68ece06
IZ
351=head2 Extension based on F<.h> and F<.c> files
352
353Suppose that you have some C files implementing some functionality,
354and the corresponding header files. How to create an extension which
355makes this functionality accessable in Perl? The example below
356assumes that the header files are F<interface_simple.h> and
357I<interface_hairy.h>, and you want the perl module be named as
358C<Ext::Ension>. If you need some preprocessor directives and/or
359linking with external libraries, see the flags C<-F>, C<-L> and C<-l>
360in L<"OPTIONS">.
361
362=over
363
364=item Find the directory name
365
366Start with a dummy run of h2xs:
367
368 h2xs -Afn Ext::Ension
369
370The only purpose of this step is to create the needed directories, and
371let you know the names of these directories. From the output you can
372see that the directory for the extension is F<Ext/Ension>.
373
374=item Copy C files
375
376Copy your header files and C files to this directory F<Ext/Ension>.
377
378=item Create the extension
379
380Run h2xs, overwriting older autogenerated files:
381
382 h2xs -Oxan Ext::Ension interface_simple.h interface_hairy.h
383
384h2xs looks for header files I<after> changing to the extension
385directory, so it will find your header files OK.
386
387=item Archive and test
388
389As usual, run
390
391 cd Ext/Ension
392 perl Makefile.PL
393 make dist
394 make
395 make test
396
397=item Hints
398
399It is important to do C<make dist> as early as possible. This way you
400can easily merge(1) your changes to autogenerated files if you decide
401to edit your C<.h> files and rerun h2xs.
402
403Do not forget to edit the documentation in the generated F<.pm> file.
404
405Consider the autogenerated files as skeletons only, you may invent
406better interfaces than what h2xs could guess.
407
408Consider this section as a guideline only, some other options of h2xs
409may better suit your needs.
410
411=back
412
3edbfbe5
TB
413=head1 ENVIRONMENT
414
415No environment variables are used.
416
417=head1 AUTHOR
418
419Larry Wall and others
420
421=head1 SEE ALSO
422
f508c652 423L<perl>, L<perlxstut>, L<ExtUtils::MakeMaker>, and L<AutoLoader>.
3edbfbe5
TB
424
425=head1 DIAGNOSTICS
426
760ac839 427The usual warnings if it cannot read or write the files involved.
3edbfbe5 428
ddf6bed1
IZ
429=head1 LIMITATIONS of B<-x>
430
431F<h2xs> would not distinguish whether an argument to a C function
432which is of the form, say, C<int *>, is an input, output, or
433input/output parameter. In particular, argument declarations of the
434form
435
436 int
437 foo(n)
438 int *n
439
440should be better rewritten as
441
442 int
443 foo(n)
444 int &n
445
446if C<n> is an input parameter.
447
448Additionally, F<h2xs> has no facilities to intuit that a function
449
450 int
451 foo(addr,l)
452 char *addr
453 int l
454
455takes a pair of address and length of data at this address, so it is better
456to rewrite this function as
457
458 int
459 foo(sv)
7aff18a2
GS
460 SV *addr
461 PREINIT:
462 STRLEN len;
463 char *s;
464 CODE:
465 s = SvPV(sv,len);
466 RETVAL = foo(s, len);
467 OUTPUT:
468 RETVAL
ddf6bed1
IZ
469
470or alternately
471
472 static int
473 my_foo(SV *sv)
474 {
475 STRLEN len;
476 char *s = SvPV(sv,len);
477
478 return foo(s, len);
479 }
480
481 MODULE = foo PACKAGE = foo PREFIX = my_
482
483 int
484 foo(sv)
485 SV *sv
486
487See L<perlxs> and L<perlxstut> for additional details.
488
3edbfbe5
TB
489=cut
490
9a7df4f2 491# ' # Grr
3cb4da91
IZ
492use strict;
493
494
919ea94a 495my( $H2XS_VERSION ) = ' $Revision: 1.23 $ ' =~ /\$Revision:\s+([^\s]+)/;
f508c652 496my $TEMPLATE_VERSION = '0.01';
ddf6bed1 497my @ARGS = @ARGV;
be3174d2 498my $compat_version = $];
a0d0e21e 499
4d2d0db2 500use Getopt::Long;
65cf46c7 501use Config;
af6c647e
NC
502use Text::Wrap;
503$Text::Wrap::huge = 'overflow';
504$Text::Wrap::columns = 80;
9a7df4f2
NC
505use ExtUtils::Constant qw (WriteConstants WriteMakefileSnippet autoload);
506use File::Compare;
d211ebfa 507use File::Path;
a0d0e21e 508
65cf46c7
JS
509sub usage {
510 warn "@_\n" if @_;
511 die <<EOFUSAGE;
4d2d0db2 512h2xs [OPTIONS ... ] [headerfile [extra_libraries]]
f508c652 513version: $H2XS_VERSION
4d2d0db2
JS
514OPTIONS:
515 -A, --omit-autoload Omit all autoloading facilities (implies -c).
9e4509e4 516 -B, --beta-version Use beta \$VERSION of 0.00_01 (ignored if -v).
4d2d0db2
JS
517 -C, --omit-changes Omit creating the Changes file, add HISTORY heading
518 to stub POD.
dcb5229a 519 -F, --cpp-flags Additional flags for C preprocessor/compile.
4d2d0db2
JS
520 -M, --func-mask Mask to select C functions/macros
521 (default is select all).
522 -O, --overwrite-ok Allow overwriting of a pre-existing extension directory.
523 -P, --omit-pod Omit the stub POD section.
524 -X, --omit-XS Omit the XS portion (implies both -c and -f).
525 -a, --gen-accessors Generate get/set accessors for struct and union members (used with -x).
526 -b, --compat-version Specify a perl version to be backwards compatibile with
527 -c, --omit-constant Omit the constant() function and specialised AUTOLOAD
528 from the XS file.
529 -d, --debugging Turn on debugging messages.
37c58f60 530 -e, --omit-enums Omit constants from enums in the constant() function.
65843164 531 If a pattern is given, only the matching enums are
37c58f60 532 ignored.
4d2d0db2
JS
533 -f, --force Force creation of the extension even if the C header
534 does not exist.
65843164 535 -g, --global Include code for safely storing static data in the .xs file.
4d2d0db2
JS
536 -h, -?, --help Display this help message
537 -k, --omit-const-func Omit 'const' attribute on function arguments
538 (used with -x).
539 -m, --gen-tied-var Generate tied variables for access to declared
540 variables.
541 -n, --name Specify a name to use for the extension (recommended).
542 -o, --opaque-re Regular expression for \"opaque\" types.
543 -p, --remove-prefix Specify a prefix which should be removed from the
544 Perl function names.
545 -s, --const-subs Create subroutines for specified macros.
9a7df4f2 546 -t, --default-type Default type for autoloaded constants (default is IV)
11946041
JS
547 --use-new-tests Use Test::More in backward compatible modules
548 --use-old-tests Use the module Test rather than Test::More
dcb5229a
IZ
549 --skip-exporter Do not export symbols
550 --skip-ppport Do not use portability layer
551 --skip-autoloader Do not use the module C<AutoLoader>
552 --skip-strict Do not use the pragma C<strict>
553 --skip-warnings Do not use the pragma C<warnings>
4d2d0db2
JS
554 -v, --version Specify a version number for this extension.
555 -x, --autogen-xsubs Autogenerate XSUBs using C::Scan.
556
e1666bf5
TB
557extra_libraries
558 are any libraries that might be needed for loading the
559 extension, e.g. -lm would try to link in the math library.
65cf46c7 560EOFUSAGE
e1666bf5 561}
a0d0e21e 562
4d2d0db2 563my ($opt_A,
9e4509e4 564 $opt_B,
4d2d0db2
JS
565 $opt_C,
566 $opt_F,
567 $opt_M,
568 $opt_O,
569 $opt_P,
570 $opt_X,
571 $opt_a,
572 $opt_c,
573 $opt_d,
37c58f60 574 $opt_e,
4d2d0db2 575 $opt_f,
e255a1c9 576 $opt_g,
4d2d0db2
JS
577 $opt_h,
578 $opt_k,
579 $opt_m,
580 $opt_n,
581 $opt_o,
582 $opt_p,
583 $opt_s,
584 $opt_v,
585 $opt_x,
586 $opt_b,
11946041
JS
587 $opt_t,
588 $new_test,
dcb5229a
IZ
589 $old_test,
590 $skip_exporter,
591 $skip_ppport,
592 $skip_autoloader,
593 $skip_strict,
594 $skip_warnings,
4d2d0db2
JS
595 );
596
597Getopt::Long::Configure('bundling');
4e58e0cf 598Getopt::Long::Configure('pass_through');
4d2d0db2
JS
599
600my %options = (
601 'omit-autoload|A' => \$opt_A,
9e4509e4 602 'beta-version|B' => \$opt_B,
4d2d0db2
JS
603 'omit-changes|C' => \$opt_C,
604 'cpp-flags|F=s' => \$opt_F,
605 'func-mask|M=s' => \$opt_M,
606 'overwrite_ok|O' => \$opt_O,
607 'omit-pod|P' => \$opt_P,
608 'omit-XS|X' => \$opt_X,
609 'gen-accessors|a' => \$opt_a,
610 'compat-version|b=s' => \$opt_b,
611 'omit-constant|c' => \$opt_c,
612 'debugging|d' => \$opt_d,
37c58f60 613 'omit-enums|e:s' => \$opt_e,
4d2d0db2 614 'force|f' => \$opt_f,
e255a1c9 615 'global|g' => \$opt_g,
4d2d0db2
JS
616 'help|h|?' => \$opt_h,
617 'omit-const-func|k' => \$opt_k,
618 'gen-tied-var|m' => \$opt_m,
619 'name|n=s' => \$opt_n,
620 'opaque-re|o=s' => \$opt_o,
621 'remove-prefix|p=s' => \$opt_p,
622 'const-subs|s=s' => \$opt_s,
623 'default-type|t=s' => \$opt_t,
624 'version|v=s' => \$opt_v,
9de3b7c3 625 'autogen-xsubs|x' => \$opt_x,
11946041 626 'use-new-tests' => \$new_test,
dcb5229a
IZ
627 'use-old-tests' => \$old_test,
628 'skip-exporter' => \$skip_exporter,
629 'skip-ppport' => \$skip_ppport,
630 'skip-autoloader' => \$skip_autoloader,
631 'skip-warnings' => \$skip_warnings,
632 'skip-strict' => \$skip_strict,
4d2d0db2
JS
633 );
634
635GetOptions(%options) || usage;
a0d0e21e 636
e1666bf5 637usage if $opt_h;
f508c652 638
be3174d2
GS
639if( $opt_b ){
640 usage "You cannot use -b and -m at the same time.\n" if ($opt_b && $opt_m);
641 $opt_b =~ /^\d+\.\d+\.\d+/ ||
11946041
JS
642 usage "You must provide the backwards compatibility version in X.Y.Z form. "
643 . "(i.e. 5.5.0)\n";
be3174d2 644 my ($maj,$min,$sub) = split(/\./,$opt_b,3);
3e6e4ea8 645 if ($maj < 5 || ($maj == 5 && $min < 6)) {
4282de36
JH
646 $compat_version =
647 $sub ? sprintf("%d.%03d%02d",$maj,$min,$sub) :
648 sprintf("%d.%03d", $maj,$min);
3e6e4ea8 649 } else {
4282de36
JH
650 $compat_version =
651 $sub ? sprintf("%d.%03d%03d",$maj,$min,$sub) :
652 sprintf("%d.%03d", $maj,$min);
3e6e4ea8
NC
653 }
654} else {
4282de36
JH
655 my ($maj,$min,$sub) = $compat_version =~ /(\d+)\.(\d\d\d)(\d*)/;
656 $sub ||= 0;
3e6e4ea8
NC
657 warn sprintf <<'EOF', $maj,$min,$sub;
658Defaulting to backwards compatibility with perl %d.%d.%d
659If you intend this module to be compatible with earlier perl versions, please
660specify a minimum perl version with the -b option.
661
662EOF
663}
be3174d2 664
9e4509e4
YST
665if( $opt_B ){
666 $TEMPLATE_VERSION = '0.00_01';
667}
668
f508c652 669if( $opt_v ){
670 $TEMPLATE_VERSION = $opt_v;
9e4509e4
YST
671
672 # check if it is numeric
673 my $temp_version = $TEMPLATE_VERSION;
674 my $beta_version = $temp_version =~ s/(\d)_(\d\d)/$1$2/;
675 my $notnum;
676 {
677 local $SIG{__WARN__} = sub { $notnum = 1 };
678 use warnings 'numeric';
679 $temp_version = 0+$temp_version;
680 }
681
682 if ($notnum) {
683 my $module = $opt_n || 'Your::Module';
684 warn <<"EOF";
685You have specified a non-numeric version. Unless you supply an
686appropriate VERSION class method, users may not be able to specify a
687minimum required version with C<use $module versionnum>.
688
689EOF
690 }
691 else {
692 $opt_B = $beta_version;
693 }
f508c652 694}
9ef261b5
MS
695
696# -A implies -c.
dcb5229a 697$skip_autoloader = $opt_c = 1 if $opt_A;
9ef261b5
MS
698
699# -X implies -c and -f
700$opt_c = $opt_f = 1 if $opt_X;
701
9a7df4f2
NC
702$opt_t ||= 'IV';
703
0299c00b
NC
704my %const_xsub;
705%const_xsub = map { $_,1 } split(/,+/, $opt_s) if $opt_s;
f1f595f5
JS
706
707my $extralibs = '';
708
3cb4da91 709my @path_h;
a0d0e21e 710
a887ff11
BS
711while (my $arg = shift) {
712 if ($arg =~ /^-l/i) {
4e58e0cf
JH
713 $extralibs .= "$arg ";
714 next;
a887ff11 715 }
4e58e0cf 716 last if $extralibs;
a887ff11
BS
717 push(@path_h, $arg);
718}
e1666bf5
TB
719
720usage "Must supply header file or module name\n"
a887ff11 721 unless (@path_h or $opt_n);
e1666bf5 722
ddf6bed1 723my $fmask;
3cb4da91 724my $tmask;
ddf6bed1
IZ
725
726$fmask = qr{$opt_M} if defined $opt_M;
727$tmask = qr{$opt_o} if defined $opt_o;
728my $tmask_all = $tmask && $opt_o eq '.';
729
730if ($opt_x) {
731 eval {require C::Scan; 1}
732 or die <<EOD;
733C::Scan required if you use -x option.
734To install C::Scan, execute
735 perl -MCPAN -e "install C::Scan"
736EOD
737 unless ($tmask_all) {
738 $C::Scan::VERSION >= 0.70
739 or die <<EOD;
740C::Scan v. 0.70 or later required unless you use -o . option.
741You have version $C::Scan::VERSION installed as $INC{'C/Scan.pm'}.
742To install C::Scan, execute
743 perl -MCPAN -e "install C::Scan"
744EOD
745 }
32fb2b78
GS
746 if (($opt_m || $opt_a) && $C::Scan::VERSION < 0.73) {
747 die <<EOD;
748C::Scan v. 0.73 or later required to use -m or -a options.
749You have version $C::Scan::VERSION installed as $INC{'C/Scan.pm'}.
750To install C::Scan, execute
751 perl -MCPAN -e "install C::Scan"
752EOD
753 }
7aff18a2
GS
754}
755elsif ($opt_o or $opt_F) {
dcb5229a
IZ
756 warn <<EOD if $opt_o;
757Option -o does not make sense without -x.
758EOD
759 warn <<EOD if $opt_F and $opt_X ;
760Option -F does not make sense with -X.
ddf6bed1
IZ
761EOD
762}
763
3cb4da91
IZ
764my @path_h_ini = @path_h;
765my ($name, %fullpath, %prefix, %seen_define, %prefixless, %const_names);
a0d0e21e 766
8a9d2888
IZ
767my $module = $opt_n;
768
a887ff11 769if( @path_h ){
ddf6bed1
IZ
770 use File::Spec;
771 my @paths;
3a9c887e 772 my $pre_sub_tri_graphs = 1;
ddf6bed1 773 if ($^O eq 'VMS') { # Consider overrides of default location
3cb4da91
IZ
774 # XXXX This is not equivalent to what the older version did:
775 # it was looking at $hadsys header-file per header-file...
776 my($hadsys) = grep s!^sys/!!i , @path_h;
7aff18a2 777 @paths = qw( Sys$Library VAXC$Include );
ddf6bed1
IZ
778 push @paths, ($hadsys ? 'GNU_CC_Include[vms]' : 'GNU_CC_Include[000000]');
779 push @paths, qw( DECC$Library_Include DECC$System_Include );
7aff18a2
GS
780 }
781 else {
ddf6bed1
IZ
782 @paths = (File::Spec->curdir(), $Config{usrinc},
783 (split ' ', $Config{locincpth}), '/usr/include');
784 }
a887ff11
BS
785 foreach my $path_h (@path_h) {
786 $name ||= $path_h;
8a9d2888
IZ
787 $module ||= do {
788 $name =~ s/\.h$//;
789 if ( $name !~ /::/ ) {
790 $name =~ s#^.*/##;
791 $name = "\u$name";
792 }
793 $name;
794 };
795
e1666bf5
TB
796 if( $path_h =~ s#::#/#g && $opt_n ){
797 warn "Nesting of headerfile ignored with -n\n";
798 }
799 $path_h .= ".h" unless $path_h =~ /\.h$/;
3cb4da91 800 my $fullpath = $path_h;
760ac839 801 $path_h =~ s/,.*$// if $opt_x;
3cb4da91 802 $fullpath{$path_h} = $fullpath;
ddf6bed1 803
8a9d2888
IZ
804 # Minor trickery: we can't chdir() before we processed the headers
805 # (so know the name of the extension), but the header may be in the
806 # extension directory...
807 my $tmp_path_h = $path_h;
808 my $rel_path_h = $path_h;
809 my @dirs = @paths;
ddf6bed1 810 if (not -f $path_h) {
8a9d2888 811 my $found;
ddf6bed1 812 for my $dir (@paths) {
8a9d2888
IZ
813 $found++, last
814 if -f ($path_h = File::Spec->catfile($dir, $tmp_path_h));
815 }
816 if ($found) {
817 $rel_path_h = $path_h;
9de3b7c3 818 $fullpath{$path_h} = $fullpath;
8a9d2888
IZ
819 } else {
820 (my $epath = $module) =~ s,::,/,g;
821 $epath = File::Spec->catdir('ext', $epath) if -d 'ext';
822 $rel_path_h = File::Spec->catfile($epath, $tmp_path_h);
823 $path_h = $tmp_path_h; # Used during -x
824 push @dirs, $epath;
ddf6bed1 825 }
ead2a595 826 }
5273d82d
IZ
827
828 if (!$opt_c) {
65843164 829 die "Can't find $tmp_path_h in @dirs\n"
8a9d2888 830 if ( ! $opt_f && ! -f "$rel_path_h" );
5273d82d
IZ
831 # Scan the header file (we should deal with nested header files)
832 # Record the names of simple #define constants into const_names
a887ff11 833 # Function prototypes are processed below.
8a9d2888 834 open(CH, "<$rel_path_h") || die "Can't open $rel_path_h: $!\n";
ddf6bed1 835 defines:
5273d82d 836 while (<CH>) {
3a9c887e 837 if ($pre_sub_tri_graphs) {
65843164 838 # Preprocess all tri-graphs
3a9c887e
PK
839 # including things stuck in quoted string constants.
840 s/\?\?=/#/g; # | ??=| #|
841 s/\?\?\!/|/g; # | ??!| ||
842 s/\?\?'/^/g; # | ??'| ^|
843 s/\?\?\(/[/g; # | ??(| [|
844 s/\?\?\)/]/g; # | ??)| ]|
845 s/\?\?\-/~/g; # | ??-| ~|
846 s/\?\?\//\\/g; # | ??/| \|
847 s/\?\?</{/g; # | ??<| {|
848 s/\?\?>/}/g; # | ??>| }|
849 }
9de3b7c3 850 if (/^[ \t]*#[ \t]*define\s+([\$\w]+)\b(?!\()\s*(?=[^"\s])(.*)/) {
ddf6bed1
IZ
851 my $def = $1;
852 my $rest = $2;
853 $rest =~ s!/\*.*?(\*/|\n)|//.*!!g; # Remove comments
854 $rest =~ s/^\s+//;
855 $rest =~ s/\s+$//;
856 # Cannot do: (-1) and ((LHANDLE)3) are OK:
857 #print("Skip non-wordy $def => $rest\n"),
858 # next defines if $rest =~ /[^\w\$]/;
859 if ($rest =~ /"/) {
860 print("Skip stringy $def => $rest\n") if $opt_d;
861 next defines;
862 }
863 print "Matched $_ ($def)\n" if $opt_d;
864 $seen_define{$def} = $rest;
865 $_ = $def;
e1666bf5 866 next if /^_.*_h_*$/i; # special case, but for what?
760ac839 867 if (defined $opt_p) {
5273d82d
IZ
868 if (!/^$opt_p(\d)/) {
869 ++$prefix{$_} if s/^$opt_p//;
870 }
871 else {
872 warn "can't remove $opt_p prefix from '$_'!\n";
873 }
ead2a595 874 }
ddf6bed1
IZ
875 $prefixless{$def} = $_;
876 if (!$fmask or /$fmask/) {
877 print "... Passes mask of -M.\n" if $opt_d and $fmask;
878 $const_names{$_}++;
879 }
5273d82d
IZ
880 }
881 }
37c58f60
JH
882 if (defined $opt_e and !$opt_e) {
883 close(CH);
884 }
885 else {
18729d3e
JH
886 # Work from miniperl too - on "normal" systems
887 my $SEEK_SET = eval 'use Fcntl qw/SEEK_SET/; SEEK_SET' or 0;
888 seek CH, 0, $SEEK_SET;
37c58f60
JH
889 my $src = do { local $/; <CH> };
890 close CH;
891 no warnings 'uninitialized';
65843164
SB
892
893 # Remove C and C++ comments
37c58f60 894 $src =~ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#$2#gs;
65843164 895
37c58f60 896 while ($src =~ /(\benum\s*([\w_]*)\s*\{\s([\s\w=,]+)\})/gsc) {
65843164 897 my ($enum_name, $enum_body) =
37c58f60
JH
898 $1 =~ /enum\s*([\w_]*)\s*\{\s([\s\w=,]+)\}/gs;
899 # skip enums matching $opt_e
900 next if $opt_e && $enum_name =~ /$opt_e/;
901 my $val = 0;
902 for my $item (split /,/, $enum_body) {
903 my ($key, $declared_val) = $item =~ /(\w*)\s*=\s*(.*)/;
904 $val = length($declared_val) ? $declared_val : 1 + $val;
905 $seen_define{$key} = $declared_val;
906 $const_names{$key}++;
907 }
908 } # while (...)
909 } # if (!defined $opt_e or $opt_e)
e1666bf5 910 }
a887ff11 911 }
a0d0e21e
LW
912}
913
869be497
TJ
914# Save current directory so that C::Scan can use it
915my $cwd = File::Spec->rel2abs( File::Spec->curdir );
a0d0e21e 916
1cb0fb50
NC
917# As Ilya suggested, use a name that contains - and then it can't clash with
918# the names of any packages. A directory 'fallback' will clash with any
919# new pragmata down the fallback:: tree, but that seems unlikely.
920my $constscfname = 'const-c.inc';
921my $constsxsfname = 'const-xs.inc';
922my $fallbackdirname = 'fallback';
f1f595f5 923
d211ebfa 924my $ext = chdir 'ext' ? 'ext/' : '';
65843164 925
d211ebfa
JH
926my @modparts = split(/::/,$module);
927my $modpname = join('-', @modparts);
928my $modfname = pop @modparts;
929my $modpmdir = join '/', 'lib', @modparts;
930my $modpmname = join '/', $modpmdir, $modfname.'.pm';
65843164 931
2920c5d2 932if ($opt_O) {
933 warn "Overwriting existing $ext$modpname!!!\n" if -e $modpname;
7aff18a2
GS
934}
935else {
2920c5d2 936 die "Won't overwrite existing $ext$modpname\n" if -e $modpname;
937}
d211ebfa 938-d "$modpname" || mkpath([$modpname], 0, 0775);
8e07c86e 939chdir($modpname) || die "Can't chdir $ext$modpname: $!\n";
a0d0e21e 940
5273d82d
IZ
941my %types_seen;
942my %std_types;
f4d63e4e
IZ
943my $fdecls = [];
944my $fdecls_parsed = [];
ddf6bed1
IZ
945my $typedef_rex;
946my %typedefs_pre;
947my %known_fnames;
7c1d48a5 948my %structs;
5273d82d 949
3cb4da91
IZ
950my @fnames;
951my @fnames_no_prefix;
32fb2b78
GS
952my %vdecl_hash;
953my @vdecls;
5273d82d 954
2920c5d2 955if( ! $opt_X ){ # use XS, unless it was disabled
dcb5229a
IZ
956 unless ($skip_ppport) {
957 require Devel::PPPort;
958 warn "Writing $ext$modpname/ppport.h\n";
959 Devel::PPPort::WriteFile('ppport.h')
960 || die "Can't create $ext$modpname/ppport.h: $!\n";
961 }
2920c5d2 962 open(XS, ">$modfname.xs") || die "Can't create $ext$modpname/$modfname.xs: $!\n";
5273d82d 963 if ($opt_x) {
5273d82d
IZ
964 warn "Scanning typemaps...\n";
965 get_typemap();
3cb4da91
IZ
966 my @td;
967 my @good_td;
968 my $addflags = $opt_F || '';
969
f4d63e4e 970 foreach my $filename (@path_h) {
3cb4da91
IZ
971 my $c;
972 my $filter;
973
974 if ($fullpath{$filename} =~ /,/) {
f4d63e4e
IZ
975 $filename = $`;
976 $filter = $';
977 }
978 warn "Scanning $filename for functions...\n";
5ce74a3d 979 my @styles = $Config{gccversion} ? qw(C++ C9X GNU) : qw(C++ C9X);
f4d63e4e 980 $c = new C::Scan 'filename' => $filename, 'filename_filter' => $filter,
5ce74a3d 981 'add_cppflags' => $addflags, 'c_styles' => \@styles;
869be497 982 $c->set('includeDirs' => ["$Config::Config{archlib}/CORE", $cwd]);
ddf6bed1 983
17906824
NC
984 $c->get('keywords')->{'__restrict'} = 1;
985
f4d63e4e
IZ
986 push @$fdecls_parsed, @{ $c->get('parsed_fdecls') };
987 push(@$fdecls, @{$c->get('fdecls')});
3cb4da91
IZ
988
989 push @td, @{$c->get('typedefs_maybe')};
7c1d48a5
GS
990 if ($opt_a) {
991 my $structs = $c->get('typedef_structs');
992 @structs{keys %$structs} = values %$structs;
993 }
3cb4da91 994
32fb2b78
GS
995 if ($opt_m) {
996 %vdecl_hash = %{ $c->get('vdecl_hash') };
997 @vdecls = sort keys %vdecl_hash;
998 for (local $_ = 0; $_ < @vdecls; ++$_) {
999 my $var = $vdecls[$_];
1000 my($type, $post) = @{ $vdecl_hash{$var} };
1001 if (defined $post) {
1002 warn "Can't handle variable '$type $var $post', skipping.\n";
1003 splice @vdecls, $_, 1;
1004 redo;
1005 }
1006 $type = normalize_type($type);
1007 $vdecl_hash{$var} = $type;
1008 }
1009 }
1010
3cb4da91
IZ
1011 unless ($tmask_all) {
1012 warn "Scanning $filename for typedefs...\n";
1013 my $td = $c->get('typedef_hash');
1014 # eval {require 'dumpvar.pl'; ::dumpValue($td)} or warn $@ if $opt_d;
1015 my @f_good_td = grep $td->{$_}[1] eq '', keys %$td;
1016 push @good_td, @f_good_td;
1017 @typedefs_pre{@f_good_td} = map $_->[0], @$td{@f_good_td};
1018 }
1019 }
1020 { local $" = '|';
6542b28e 1021 $typedef_rex = qr(\b(?<!struct )(?:@good_td)\b) if @good_td;
5273d82d 1022 }
ddf6bed1
IZ
1023 %known_fnames = map @$_[1,3], @$fdecls_parsed; # [1,3] is NAME, FULLTEXT
1024 if ($fmask) {
1025 my @good;
1026 for my $i (0..$#$fdecls_parsed) {
1027 next unless $fdecls_parsed->[$i][1] =~ /$fmask/; # [1] is NAME
1028 push @good, $i;
1029 print "... Function $fdecls_parsed->[$i][1] passes -M mask.\n"
1030 if $opt_d;
1031 }
1032 $fdecls = [@$fdecls[@good]];
1033 $fdecls_parsed = [@$fdecls_parsed[@good]];
1034 }
3cb4da91
IZ
1035 @fnames = sort map $_->[1], @$fdecls_parsed; # 1 is NAME
1036 # Sort declarations:
1037 {
1038 my %h = map( ($_->[1], $_), @$fdecls_parsed);
1039 $fdecls_parsed = [ @h{@fnames} ];
ddf6bed1 1040 }
3cb4da91
IZ
1041 @fnames_no_prefix = @fnames;
1042 @fnames_no_prefix
869be497
TJ
1043 = sort map { ++$prefix{$_} if s/^$opt_p(?!\d)//; $_ } @fnames_no_prefix
1044 if defined $opt_p;
ddf6bed1 1045 # Remove macros which expand to typedefs
ddf6bed1
IZ
1046 print "Typedefs are @td.\n" if $opt_d;
1047 my %td = map {($_, $_)} @td;
1048 # Add some other possible but meaningless values for macros
1049 for my $k (qw(char double float int long short unsigned signed void)) {
1050 $td{"$_$k"} = "$_$k" for ('', 'signed ', 'unsigned ');
1051 }
1052 # eval {require 'dumpvar.pl'; ::dumpValue( [\@td, \%td] ); 1} or warn $@;
1053 my $n = 0;
1054 my %bad_macs;
1055 while (keys %td > $n) {
1056 $n = keys %td;
1057 my ($k, $v);
1058 while (($k, $v) = each %seen_define) {
65843164 1059 # print("found '$k'=>'$v'\n"),
ddf6bed1
IZ
1060 $bad_macs{$k} = $td{$k} = $td{$v} if exists $td{$v};
1061 }
1062 }
1063 # Now %bad_macs contains names of bad macros
1064 for my $k (keys %bad_macs) {
1065 delete $const_names{$prefixless{$k}};
1066 print "Ignoring macro $k which expands to a typedef name '$bad_macs{$k}'\n" if $opt_d;
5273d82d 1067 }
5273d82d 1068 }
2920c5d2 1069}
3cb4da91 1070my @const_names = sort keys %const_names;
5273d82d 1071
d211ebfa
JH
1072-d $modpmdir || mkpath([$modpmdir], 0, 0775);
1073open(PM, ">$modpmname") || die "Can't create $ext$modpname/$modpmname: $!\n";
a0d0e21e 1074
a0d0e21e 1075$" = "\n\t";
d211ebfa 1076warn "Writing $ext$modpname/$modpmname\n";
a0d0e21e 1077
be3174d2
GS
1078print PM <<"END";
1079package $module;
1080
1081use $compat_version;
dcb5229a
IZ
1082END
1083
1084print PM <<"END" unless $skip_strict;
be3174d2
GS
1085use strict;
1086END
dcb5229a
IZ
1087
1088print PM "use warnings;\n" unless $skip_warnings or $compat_version < 5.006;
2920c5d2 1089
aba05478 1090unless( $opt_X || $opt_c || $opt_A ){
2920c5d2 1091 # we'll have an AUTOLOAD(), and it will have $AUTOLOAD and
1092 # will want Carp.
1093 print PM <<'END';
1094use Carp;
2920c5d2 1095END
1096}
1097
dcb5229a 1098print PM <<'END' unless $skip_exporter;
2920c5d2 1099
a0d0e21e 1100require Exporter;
2920c5d2 1101END
1102
dcb5229a
IZ
1103my $use_Dyna = (not $opt_X and $compat_version < 5.006);
1104print PM <<"END" if $use_Dyna; # use DynaLoader, unless XS was disabled
a0d0e21e 1105require DynaLoader;
3edbfbe5
TB
1106END
1107
e1666bf5 1108
9ef261b5 1109# Are we using AutoLoader or not?
dcb5229a 1110unless ($skip_autoloader) { # no autoloader whatsoever.
9ef261b5
MS
1111 unless ($opt_c) { # we're doing the AUTOLOAD
1112 print PM "use AutoLoader;\n";
2920c5d2 1113 }
9ef261b5
MS
1114 else {
1115 print PM "use AutoLoader qw(AUTOLOAD);\n"
2920c5d2 1116 }
3edbfbe5 1117}
3edbfbe5 1118
be3174d2 1119if ( $compat_version < 5.006 ) {
9e4509e4
YST
1120 my $vars = '$VERSION @ISA';
1121 $vars .= ' @EXPORT @EXPORT_OK %EXPORT_TAGS' unless $skip_exporter;
1122 $vars .= ' $AUTOLOAD' unless $opt_X || $opt_c || $opt_A;
1123 $vars .= ' $XS_VERSION' if $opt_B && !$opt_X;
1124 print PM "use vars qw($vars);";
be3174d2
GS
1125}
1126
9ef261b5 1127# Determine @ISA.
dcb5229a 1128my @modISA;
65843164 1129push @modISA, 'Exporter' unless $skip_exporter;
dcb5229a
IZ
1130push @modISA, 'DynaLoader' if $use_Dyna; # no XS
1131my $myISA = "our \@ISA = qw(@modISA);";
be3174d2
GS
1132$myISA =~ s/^our // if $compat_version < 5.006;
1133
9ef261b5 1134print PM "\n$myISA\n\n";
e1666bf5 1135
32fb2b78 1136my @exported_names = (@const_names, @fnames_no_prefix, map '$'.$_, @vdecls);
3cb4da91 1137
dcb5229a
IZ
1138my $tmp='';
1139$tmp .= <<"END" unless $skip_exporter;
e1666bf5
TB
1140# Items to export into callers namespace by default. Note: do not export
1141# names by default without a very good reason. Use EXPORT_OK instead.
1142# Do not simply export all your public functions/methods/constants.
ddf6bed1
IZ
1143
1144# This allows declaration use $module ':all';
1145# If you do not need this, moving things directly into \@EXPORT or \@EXPORT_OK
1146# will save memory.
51fac20b 1147our %EXPORT_TAGS = ( 'all' => [ qw(
3cb4da91 1148 @exported_names
ddf6bed1
IZ
1149) ] );
1150
51fac20b 1151our \@EXPORT_OK = ( \@{ \$EXPORT_TAGS{'all'} } );
ddf6bed1 1152
77ca0c92 1153our \@EXPORT = qw(
e1666bf5 1154 @const_names
a0d0e21e 1155);
dcb5229a
IZ
1156
1157END
1158
9e4509e4
YST
1159$tmp .= "our \$VERSION = '$TEMPLATE_VERSION';\n";
1160if ($opt_B) {
1161 $tmp .= "our \$XS_VERSION = \$VERSION;\n" unless $opt_X;
1162 $tmp .= "\$VERSION = eval \$VERSION; # see L<perlmodstyle>\n";
1163}
1164$tmp .= "\n";
e1666bf5 1165
be3174d2
GS
1166$tmp =~ s/^our //mg if $compat_version < 5.006;
1167print PM $tmp;
1168
32fb2b78
GS
1169if (@vdecls) {
1170 printf PM "our(@{[ join ', ', map '$'.$_, @vdecls ]});\n\n";
1171}
1172
be3174d2 1173
af6c647e 1174print PM autoload ($module, $compat_version) unless $opt_c or $opt_X;
a0d0e21e 1175
2920c5d2 1176if( ! $opt_X ){ # print bootstrap, unless XS is disabled
dcb5229a 1177 if ($use_Dyna) {
9e4509e4 1178 $tmp = <<"END";
f508c652 1179bootstrap $module \$VERSION;
2920c5d2 1180END
dcb5229a 1181 } else {
9e4509e4 1182 $tmp = <<"END";
dcb5229a
IZ
1183require XSLoader;
1184XSLoader::load('$module', \$VERSION);
1185END
1186 }
9e4509e4
YST
1187 $tmp =~ s:\$VERSION:\$XS_VERSION:g if $opt_B;
1188 print PM $tmp;
2920c5d2 1189}
1190
32fb2b78
GS
1191# tying the variables can happen only after bootstrap
1192if (@vdecls) {
1193 printf PM <<END;
1194{
1195@{[ join "\n", map " _tievar_$_(\$$_);", @vdecls ]}
1196}
1197
1198END
1199}
1200
3cb4da91 1201my $after;
2920c5d2 1202if( $opt_P ){ # if POD is disabled
1203 $after = '__END__';
1204}
1205else {
1206 $after = '=cut';
1207}
1208
1209print PM <<"END";
a0d0e21e 1210
e1666bf5 1211# Preloaded methods go here.
9ef261b5
MS
1212END
1213
1214print PM <<"END" unless $opt_A;
a0d0e21e 1215
2920c5d2 1216# Autoload methods go after $after, and are processed by the autosplit program.
9ef261b5
MS
1217END
1218
1219print PM <<"END";
a0d0e21e
LW
1220
12211;
e1666bf5 1222__END__
a0d0e21e 1223END
a0d0e21e 1224
d211ebfa 1225my ($email,$author,$licence);
65cf46c7
JS
1226
1227eval {
317fb126
JH
1228 my $username;
1229 ($username,$author) = (getpwuid($>))[0,6];
1230 if (defined $username && defined $author) {
1231 $author =~ s/,.*$//; # in case of sub fields
1232 my $domain = $Config{'mydomain'};
1233 $domain =~ s/^\.//;
1234 $email = "$username\@$domain";
1235 }
65cf46c7
JS
1236 };
1237
1238$author ||= "A. U. Thor";
1239$email ||= 'a.u.thor@a.galaxy.far.far.away';
f508c652 1240
d211ebfa
JH
1241$licence = sprintf << "DEFAULT", $^V;
1242Copyright (C) ${\(1900 + (localtime) [5])} by $author
1243
1244This library is free software; you can redistribute it and/or modify
1245it under the same terms as Perl itself, either Perl version %vd or,
1246at your option, any later version of Perl 5 you may have available.
1247DEFAULT
1248
c0f8b9cd
GS
1249my $revhist = '';
1250$revhist = <<EOT if $opt_C;
497711e7
GS
1251#
1252#=head1 HISTORY
1253#
1254#=over 8
1255#
1256#=item $TEMPLATE_VERSION
1257#
1258#Original version; created by h2xs $H2XS_VERSION with options
1259#
1260# @ARGS
1261#
1262#=back
1263#
c0f8b9cd
GS
1264EOT
1265
dcb5229a 1266my $exp_doc = $skip_exporter ? '' : <<EOD;
497711e7
GS
1267#
1268#=head2 EXPORT
1269#
1270#None by default.
1271#
ddf6bed1 1272EOD
b7d5fa84 1273
5273d82d 1274if (@const_names and not $opt_P) {
dcb5229a 1275 $exp_doc .= <<EOD unless $skip_exporter;
497711e7
GS
1276#=head2 Exportable constants
1277#
1278# @{[join "\n ", @const_names]}
1279#
5273d82d
IZ
1280EOD
1281}
b7d5fa84 1282
5273d82d 1283if (defined $fdecls and @$fdecls and not $opt_P) {
dcb5229a 1284 $exp_doc .= <<EOD unless $skip_exporter;
497711e7
GS
1285#=head2 Exportable functions
1286#
3cb4da91 1287EOD
b7d5fa84 1288
497711e7
GS
1289# $exp_doc .= <<EOD if $opt_p;
1290#When accessing these functions from Perl, prefix C<$opt_p> should be removed.
1291#
b7d5fa84 1292#EOD
dcb5229a 1293 $exp_doc .= <<EOD unless $skip_exporter;
497711e7
GS
1294# @{[join "\n ", @known_fnames{@fnames}]}
1295#
5273d82d
IZ
1296EOD
1297}
1298
b7d5fa84
IZ
1299my $meth_doc = '';
1300
1301if ($opt_x && $opt_a) {
1302 my($name, $struct);
1303 $meth_doc .= accessor_docs($name, $struct)
1304 while ($name, $struct) = each %structs;
1305}
1306
d211ebfa
JH
1307# Prefix the default licence with hash symbols.
1308# Is this just cargo cult - it seems that the first thing that happens to this
1309# block is that all the hashes are then s///g out.
1310my $licence_hash = $licence;
1311$licence_hash =~ s/^/#/gm;
1312
0299c00b
NC
1313my $pod;
1314$pod = <<"END" unless $opt_P;
973ae360 1315## Below is stub documentation for your module. You'd better edit it!
f508c652 1316#
1317#=head1 NAME
1318#
1319#$module - Perl extension for blah blah blah
1320#
1321#=head1 SYNOPSIS
1322#
1323# use $module;
1324# blah blah blah
1325#
1326#=head1 DESCRIPTION
1327#
7aff18a2 1328#Stub documentation for $module, created by h2xs. It looks like the
f508c652 1329#author of the extension was negligent enough to leave the stub
1330#unedited.
1331#
1332#Blah blah blah.
b7d5fa84 1333$exp_doc$meth_doc$revhist
f508c652 1334#
09c48e64 1335#=head1 SEE ALSO
f508c652 1336#
09c48e64
JH
1337#Mention other useful documentation such as the documentation of
1338#related modules or operating system documentation (such as man pages
1339#in UNIX), or any relevant external documentation such as RFCs or
1340#standards.
e8f26592
EHA
1341#
1342#If you have a mailing list set up for your module, mention it here.
1343#
09c48e64
JH
1344#If you have a web site set up for your module, mention it here.
1345#
1346#=head1 AUTHOR
1347#
1348#$author, E<lt>${email}E<gt>
1349#
e8f26592
EHA
1350#=head1 COPYRIGHT AND LICENSE
1351#
d211ebfa 1352$licence_hash
e8f26592 1353#
f508c652 1354#=cut
1355END
1356
1357$pod =~ s/^\#//gm unless $opt_P;
1358print PM $pod unless $opt_P;
1359
a0d0e21e
LW
1360close PM;
1361
e1666bf5 1362
2920c5d2 1363if( ! $opt_X ){ # print XS, unless it is disabled
8e07c86e 1364warn "Writing $ext$modpname/$modfname.xs\n";
e1666bf5 1365
a0d0e21e
LW
1366print XS <<"END";
1367#include "EXTERN.h"
1368#include "perl.h"
1369#include "XSUB.h"
dcb5229a
IZ
1370
1371END
1372
1373print XS <<"END" unless $skip_ppport;
0a7c7f4f 1374#include "ppport.h"
a0d0e21e
LW
1375
1376END
dcb5229a 1377
a887ff11 1378if( @path_h ){
3cb4da91 1379 foreach my $path_h (@path_h_ini) {
a0d0e21e
LW
1380 my($h) = $path_h;
1381 $h =~ s#^/usr/include/##;
ead2a595 1382 if ($^O eq 'VMS') { $h =~ s#.*vms\]#sys/# or $h =~ s#.*[:>\]]##; }
a887ff11
BS
1383 print XS qq{#include <$h>\n};
1384 }
1385 print XS "\n";
a0d0e21e
LW
1386}
1387
e255a1c9
PM
1388print XS <<"END" if $opt_g;
1389
1390/* Global Data */
1391
1392#define MY_CXT_KEY "${module}::_guts" XS_VERSION
1393
1394typedef struct {
1395 /* Put Global Data in here */
1396 int dummy; /* you can access this elsewhere as MY_CXT.dummy */
1397} my_cxt_t;
1398
1399START_MY_CXT
1400
1401END
1402
ddf6bed1
IZ
1403my %pointer_typedefs;
1404my %struct_typedefs;
1405
1406sub td_is_pointer {
1407 my $type = shift;
1408 my $out = $pointer_typedefs{$type};
1409 return $out if defined $out;
1410 my $otype = $type;
1411 $out = ($type =~ /\*$/);
1412 # This converts only the guys which do not have trailing part in the typedef
1413 if (not $out
1414 and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1415 $type = normalize_type($type);
1416 print "Is-Pointer: Type mutation via typedefs: $otype ==> $type\n"
1417 if $opt_d;
1418 $out = td_is_pointer($type);
1419 }
1420 return ($pointer_typedefs{$otype} = $out);
1421}
1422
1423sub td_is_struct {
1424 my $type = shift;
1425 my $out = $struct_typedefs{$type};
1426 return $out if defined $out;
1427 my $otype = $type;
32fb2b78 1428 $out = ($type =~ /^(struct|union)\b/) && !td_is_pointer($type);
ddf6bed1
IZ
1429 # This converts only the guys which do not have trailing part in the typedef
1430 if (not $out
1431 and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1432 $type = normalize_type($type);
1433 print "Is-Struct: Type mutation via typedefs: $otype ==> $type\n"
1434 if $opt_d;
1435 $out = td_is_struct($type);
1436 }
1437 return ($struct_typedefs{$otype} = $out);
1438}
1439
9a7df4f2 1440print_tievar_subs(\*XS, $_, $vdecl_hash{$_}) for @vdecls;
e1666bf5 1441
ddf6bed1 1442if( ! $opt_c ) {
9a7df4f2
NC
1443 # We write the "sample" files used when this module is built by perl without
1444 # ExtUtils::Constant.
1445 # h2xs will later check that these are the same as those generated by the
1446 # code embedded into Makefile.PL
1cb0fb50
NC
1447 unless (-d $fallbackdirname) {
1448 mkdir "$fallbackdirname" or die "Cannot mkdir $fallbackdirname: $!\n";
1449 }
1450 warn "Writing $ext$modpname/$fallbackdirname/$constscfname\n";
1451 warn "Writing $ext$modpname/$fallbackdirname/$constsxsfname\n";
1452 my $cfallback = File::Spec->catfile($fallbackdirname, $constscfname);
1453 my $xsfallback = File::Spec->catfile($fallbackdirname, $constsxsfname);
1454 WriteConstants ( C_FILE => $cfallback,
1455 XS_FILE => $xsfallback,
9a7df4f2
NC
1456 DEFAULT_TYPE => $opt_t,
1457 NAME => $module,
1458 NAMES => \@const_names,
1459 );
1cb0fb50 1460 print XS "#include \"$constscfname\"\n";
e1666bf5
TB
1461}
1462
32fb2b78 1463
f1f595f5 1464my $prefix = defined $opt_p ? "PREFIX = $opt_p" : '';
3cb4da91 1465
e1666bf5
TB
1466# Now switch from C to XS by issuing the first MODULE declaration:
1467print XS <<"END";
a0d0e21e 1468
ead2a595 1469MODULE = $module PACKAGE = $module $prefix
1470
1471END
1472
9a7df4f2
NC
1473# If a constant() function was #included then output a corresponding
1474# XS declaration:
1cb0fb50 1475print XS "INCLUDE: $constsxsfname\n" unless $opt_c;
9a7df4f2 1476
e255a1c9
PM
1477print XS <<"END" if $opt_g;
1478
1479BOOT:
1480{
1481 MY_CXT_INIT;
1482 /* If any of the fields in the my_cxt_t struct need
1483 to be initialised, do it here.
1484 */
1485}
1486
1487END
1488
ead2a595 1489foreach (sort keys %const_xsub) {
1490 print XS <<"END";
1491char *
1492$_()
1493
1494 CODE:
1495#ifdef $_
7aff18a2 1496 RETVAL = $_;
ead2a595 1497#else
7aff18a2 1498 croak("Your vendor has not defined the $module macro $_");
ead2a595 1499#endif
1500
1501 OUTPUT:
7aff18a2 1502 RETVAL
a0d0e21e 1503
e1666bf5 1504END
ead2a595 1505}
e1666bf5 1506
5273d82d 1507my %seen_decl;
ddf6bed1 1508my %typemap;
5273d82d 1509
ead2a595 1510sub print_decl {
1511 my $fh = shift;
1512 my $decl = shift;
1513 my ($type, $name, $args) = @$decl;
5273d82d
IZ
1514 return if $seen_decl{$name}++; # Need to do the same for docs as well?
1515
ead2a595 1516 my @argnames = map {$_->[1]} @$args;
ddf6bed1 1517 my @argtypes = map { normalize_type( $_->[0], 1 ) } @$args;
32fb2b78
GS
1518 if ($opt_k) {
1519 s/^\s*const\b\s*// for @argtypes;
1520 }
5273d82d 1521 my @argarrays = map { $_->[4] || '' } @$args;
ead2a595 1522 my $numargs = @$args;
1523 if ($numargs and $argtypes[-1] eq '...') {
1524 $numargs--;
1525 $argnames[-1] = '...';
1526 }
1527 local $" = ', ';
ddf6bed1
IZ
1528 $type = normalize_type($type, 1);
1529
ead2a595 1530 print $fh <<"EOP";
1531
1532$type
1533$name(@argnames)
1534EOP
1535
3cb4da91 1536 for my $arg (0 .. $numargs - 1) {
ead2a595 1537 print $fh <<"EOP";
5273d82d 1538 $argtypes[$arg] $argnames[$arg]$argarrays[$arg]
ead2a595 1539EOP
1540 }
1541}
1542
32fb2b78
GS
1543sub print_tievar_subs {
1544 my($fh, $name, $type) = @_;
1545 print $fh <<END;
1546I32
1547_get_$name(IV index, SV *sv) {
1548 dSP;
1549 PUSHMARK(SP);
1550 XPUSHs(sv);
1551 PUTBACK;
1552 (void)call_pv("$module\::_get_$name", G_DISCARD);
1553 return (I32)0;
1554}
1555
1556I32
1557_set_$name(IV index, SV *sv) {
1558 dSP;
1559 PUSHMARK(SP);
1560 XPUSHs(sv);
1561 PUTBACK;
1562 (void)call_pv("$module\::_set_$name", G_DISCARD);
1563 return (I32)0;
1564}
1565
1566END
1567}
1568
1569sub print_tievar_xsubs {
1570 my($fh, $name, $type) = @_;
1571 print $fh <<END;
1572void
1573_tievar_$name(sv)
1574 SV* sv
1575 PREINIT:
1576 struct ufuncs uf;
1577 CODE:
1578 uf.uf_val = &_get_$name;
1579 uf.uf_set = &_set_$name;
1580 uf.uf_index = (IV)&_get_$name;
1581 sv_magic(sv, 0, 'U', (char*)&uf, sizeof(uf));
1582
1583void
1584_get_$name(THIS)
1585 $type THIS = NO_INIT
1586 CODE:
1587 THIS = $name;
1588 OUTPUT:
1589 SETMAGIC: DISABLE
1590 THIS
1591
1592void
1593_set_$name(THIS)
1594 $type THIS
1595 CODE:
1596 $name = THIS;
1597
1598END
1599}
1600
7c1d48a5
GS
1601sub print_accessors {
1602 my($fh, $name, $struct) = @_;
1603 return unless defined $struct && $name !~ /\s|_ANON/;
1604 $name = normalize_type($name);
1605 my $ptrname = normalize_type("$name *");
32fb2b78
GS
1606 print $fh <<"EOF";
1607
1608MODULE = $module PACKAGE = ${name} $prefix
1609
1610$name *
1611_to_ptr(THIS)
1612 $name THIS = NO_INIT
1613 PROTOTYPE: \$
1614 CODE:
1615 if (sv_derived_from(ST(0), "$name")) {
1616 STRLEN len;
1617 char *s = SvPV((SV*)SvRV(ST(0)), len);
1618 if (len != sizeof(THIS))
1619 croak("Size \%d of packed data != expected \%d",
1620 len, sizeof(THIS));
1621 RETVAL = ($name *)s;
65843164 1622 }
32fb2b78
GS
1623 else
1624 croak("THIS is not of type $name");
1625 OUTPUT:
1626 RETVAL
1627
1628$name
1629new(CLASS)
1630 char *CLASS = NO_INIT
1631 PROTOTYPE: \$
1632 CODE:
1633 Zero((void*)&RETVAL, sizeof(RETVAL), char);
1634 OUTPUT:
1635 RETVAL
7c1d48a5
GS
1636
1637MODULE = $module PACKAGE = ${name}Ptr $prefix
1638
1639EOF
1640 my @items = @$struct;
1641 while (@items) {
1642 my $item = shift @items;
1643 if ($item->[0] =~ /_ANON/) {
32fb2b78 1644 if (defined $item->[2]) {
7c1d48a5 1645 push @items, map [
32fb2b78 1646 @$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]",
7c1d48a5
GS
1647 ], @{ $structs{$item->[0]} };
1648 } else {
1649 push @items, @{ $structs{$item->[0]} };
1650 }
1651 } else {
1652 my $type = normalize_type($item->[0]);
32fb2b78 1653 my $ttype = $structs{$type} ? normalize_type("$type *") : $type;
7c1d48a5 1654 print $fh <<"EOF";
32fb2b78
GS
1655$ttype
1656$item->[2](THIS, __value = NO_INIT)
7c1d48a5
GS
1657 $ptrname THIS
1658 $type __value
1659 PROTOTYPE: \$;\$
1660 CODE:
7c1d48a5
GS
1661 if (items > 1)
1662 THIS->$item->[-1] = __value;
32fb2b78
GS
1663 RETVAL = @{[
1664 $type eq $ttype ? "THIS->$item->[-1]" : "&(THIS->$item->[-1])"
1665 ]};
7c1d48a5
GS
1666 OUTPUT:
1667 RETVAL
1668
1669EOF
1670 }
1671 }
1672}
1673
b7d5fa84
IZ
1674sub accessor_docs {
1675 my($name, $struct) = @_;
1676 return unless defined $struct && $name !~ /\s|_ANON/;
1677 $name = normalize_type($name);
1678 my $ptrname = $name . 'Ptr';
1679 my @items = @$struct;
1680 my @list;
1681 while (@items) {
1682 my $item = shift @items;
1683 if ($item->[0] =~ /_ANON/) {
1684 if (defined $item->[2]) {
1685 push @items, map [
1686 @$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]",
1687 ], @{ $structs{$item->[0]} };
1688 } else {
1689 push @items, @{ $structs{$item->[0]} };
1690 }
1691 } else {
1692 push @list, $item->[2];
1693 }
1694 }
b68ece06 1695 my $methods = (join '(...)>, C<', @list) . '(...)';
b7d5fa84 1696
b68ece06
IZ
1697 my $pod = <<"EOF";
1698#
1699#=head2 Object and class methods for C<$name>/C<$ptrname>
1700#
1701#The principal Perl representation of a C object of type C<$name> is an
1702#object of class C<$ptrname> which is a reference to an integer
1703#representation of a C pointer. To create such an object, one may use
1704#a combination
1705#
1706# my \$buffer = $name->new();
1707# my \$obj = \$buffer->_to_ptr();
1708#
1709#This exersizes the following two methods, and an additional class
1710#C<$name>, the internal representation of which is a reference to a
1711#packed string with the C structure. Keep in mind that \$buffer should
1712#better survive longer than \$obj.
1713#
1714#=over
1715#
1716#=item C<\$object_of_type_$name-E<gt>_to_ptr()>
1717#
1718#Converts an object of type C<$name> to an object of type C<$ptrname>.
1719#
1720#=item C<$name-E<gt>new()>
1721#
1722#Creates an empty object of type C<$name>. The corresponding packed
1723#string is zeroed out.
1724#
1725#=item C<$methods>
1726#
1727#return the current value of the corresponding element if called
1728#without additional arguments. Set the element to the supplied value
1729#(and return the new value) if called with an additional argument.
1730#
1731#Applicable to objects of type C<$ptrname>.
1732#
1733#=back
1734#
b7d5fa84 1735EOF
b68ece06
IZ
1736 $pod =~ s/^\#//gm;
1737 return $pod;
b7d5fa84
IZ
1738}
1739
5273d82d
IZ
1740# Should be called before any actual call to normalize_type().
1741sub get_typemap {
1742 # We do not want to read ./typemap by obvios reasons.
1743 my @tm = qw(../../../typemap ../../typemap ../typemap);
1744 my $stdtypemap = "$Config::Config{privlib}/ExtUtils/typemap";
1745 unshift @tm, $stdtypemap;
1746 my $proto_re = "[" . quotemeta('\$%&*@;') . "]" ;
ddf6bed1
IZ
1747
1748 # Start with useful default values
9cacc32e 1749 $typemap{float} = 'T_NV';
ddf6bed1 1750
3cb4da91 1751 foreach my $typemap (@tm) {
5273d82d
IZ
1752 next unless -e $typemap ;
1753 # skip directories, binary files etc.
1754 warn " Scanning $typemap\n";
65843164 1755 warn("Warning: ignoring non-text typemap file '$typemap'\n"), next
5273d82d 1756 unless -T $typemap ;
65843164 1757 open(TYPEMAP, $typemap)
5273d82d
IZ
1758 or warn ("Warning: could not open typemap file '$typemap': $!\n"), next;
1759 my $mode = 'Typemap';
1760 while (<TYPEMAP>) {
1761 next if /^\s*\#/;
1762 if (/^INPUT\s*$/) { $mode = 'Input'; next; }
1763 elsif (/^OUTPUT\s*$/) { $mode = 'Output'; next; }
1764 elsif (/^TYPEMAP\s*$/) { $mode = 'Typemap'; next; }
1765 elsif ($mode eq 'Typemap') {
1766 next if /^\s*($|\#)/ ;
3cb4da91 1767 my ($type, $image);
ddf6bed1 1768 if ( ($type, $image) =
5273d82d
IZ
1769 /^\s*(.*?\S)\s+(\S+)\s*($proto_re*)\s*$/o
1770 # This may reference undefined functions:
1771 and not ($image eq 'T_PACKED' and $typemap eq $stdtypemap)) {
ddf6bed1 1772 $typemap{normalize_type($type)} = $image;
5273d82d
IZ
1773 }
1774 }
1775 }
1776 close(TYPEMAP) or die "Cannot close $typemap: $!";
1777 }
1778 %std_types = %types_seen;
1779 %types_seen = ();
1780}
1781
ead2a595 1782
ddf6bed1 1783sub normalize_type { # Second arg: do not strip const's before \*
ead2a595 1784 my $type = shift;
3cb4da91
IZ
1785 my $do_keep_deep_const = shift;
1786 # If $do_keep_deep_const this is heuristical only
1787 my $keep_deep_const = ($do_keep_deep_const ? '\b(?![^(,)]*\*)' : '');
65843164 1788 my $ignore_mods
3cb4da91
IZ
1789 = "(?:\\b(?:(?:__const__|const)$keep_deep_const|static|inline|__inline__)\\b\\s*)*";
1790 if ($do_keep_deep_const) { # Keep different compiled /RExen/o separately!
1791 $type =~ s/$ignore_mods//go;
7aff18a2
GS
1792 }
1793 else {
3cb4da91
IZ
1794 $type =~ s/$ignore_mods//go;
1795 }
f1f595f5 1796 $type =~ s/([^\s\w])/ $1 /g;
ead2a595 1797 $type =~ s/\s+$//;
1798 $type =~ s/^\s+//;
ddf6bed1
IZ
1799 $type =~ s/\s+/ /g;
1800 $type =~ s/\* (?=\*)/*/g;
1801 $type =~ s/\. \. \./.../g;
1802 $type =~ s/ ,/,/g;
65843164 1803 $types_seen{$type}++
5273d82d 1804 unless $type eq '...' or $type eq 'void' or $std_types{$type};
ead2a595 1805 $type;
1806}
1807
ddf6bed1
IZ
1808my $need_opaque;
1809
1810sub assign_typemap_entry {
1811 my $type = shift;
1812 my $otype = $type;
1813 my $entry;
1814 if ($tmask and $type =~ /$tmask/) {
1815 print "Type $type matches -o mask\n" if $opt_d;
1816 $entry = (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ");
1817 }
1818 elsif ($typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1819 $type = normalize_type $type;
1820 print "Type mutation via typedefs: $otype ==> $type\n" if $opt_d;
1821 $entry = assign_typemap_entry($type);
1822 }
40292913
IZ
1823 # XXX good do better if our UV happens to be long long
1824 return "T_NV" if $type =~ /^(unsigned\s+)?long\s+(long|double)\z/;
ddf6bed1
IZ
1825 $entry ||= $typemap{$otype}
1826 || (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ");
1827 $typemap{$otype} = $entry;
1828 $need_opaque = 1 if $entry eq "T_OPAQUE_STRUCT";
1829 return $entry;
1830}
1831
32fb2b78
GS
1832for (@vdecls) {
1833 print_tievar_xsubs(\*XS, $_, $vdecl_hash{$_});
1834}
1835
ead2a595 1836if ($opt_x) {
32fb2b78
GS
1837 for my $decl (@$fdecls_parsed) { print_decl(\*XS, $decl) }
1838 if ($opt_a) {
1839 while (my($name, $struct) = each %structs) {
1840 print_accessors(\*XS, $name, $struct);
7c1d48a5 1841 }
32fb2b78 1842 }
ead2a595 1843}
1844
a0d0e21e 1845close XS;
5273d82d
IZ
1846
1847if (%types_seen) {
1848 my $type;
1849 warn "Writing $ext$modpname/typemap\n";
1850 open TM, ">typemap" or die "Cannot open typemap file for write: $!";
1851
3cb4da91 1852 for $type (sort keys %types_seen) {
ddf6bed1
IZ
1853 my $entry = assign_typemap_entry $type;
1854 print TM $type, "\t" x (5 - int((length $type)/8)), "\t$entry\n"
5273d82d
IZ
1855 }
1856
ddf6bed1
IZ
1857 print TM <<'EOP' if $need_opaque; # Older Perls do not have correct entry
1858#############################################################################
1859INPUT
1860T_OPAQUE_STRUCT
1861 if (sv_derived_from($arg, \"${ntype}\")) {
1862 STRLEN len;
1863 char *s = SvPV((SV*)SvRV($arg), len);
1864
1865 if (len != sizeof($var))
1866 croak(\"Size %d of packed data != expected %d\",
1867 len, sizeof($var));
1868 $var = *($type *)s;
1869 }
1870 else
1871 croak(\"$var is not of type ${ntype}\")
1872#############################################################################
1873OUTPUT
1874T_OPAQUE_STRUCT
1875 sv_setref_pvn($arg, \"${ntype}\", (char *)&$var, sizeof($var));
1876EOP
1877
5273d82d
IZ
1878 close TM or die "Cannot close typemap file for write: $!";
1879}
1880
2920c5d2 1881} # if( ! $opt_X )
e1666bf5 1882
8e07c86e
AD
1883warn "Writing $ext$modpname/Makefile.PL\n";
1884open(PL, ">Makefile.PL") || die "Can't create $ext$modpname/Makefile.PL: $!\n";
a0d0e21e 1885
11946041
JS
1886my $prereq_pm;
1887
1888if ( $compat_version < 5.00702 and $new_test )
1889{
1890 $prereq_pm = q%'Test::More' => 0%;
1891}
1892else
1893{
1894 $prereq_pm = '';
1895}
1896
9a7df4f2
NC
1897print PL <<"END";
1898use $compat_version;
a0d0e21e
LW
1899use ExtUtils::MakeMaker;
1900# See lib/ExtUtils/MakeMaker.pm for details of how to influence
42793c05 1901# the contents of the Makefile that is written.
8bc03d0d 1902WriteMakefile(
3fe130af 1903 NAME => '$module',
d211ebfa 1904 VERSION_FROM => '$modpmname', # finds \$VERSION
3fe130af
JH
1905 PREREQ_PM => {$prereq_pm}, # e.g., Module::Name => 1.1
1906 (\$] >= 5.005 ? ## Add these new keywords supported since 5.005
d211ebfa 1907 (ABSTRACT_FROM => '$modpmname', # retrieve abstract from module
3fe130af 1908 AUTHOR => '$author <$email>') : ()),
a0d0e21e 1909END
8bc03d0d 1910if (!$opt_X) { # print C stuff, unless XS is disabled
ddf6bed1 1911 $opt_F = '' unless defined $opt_F;
b68ece06
IZ
1912 my $I = (((glob '*.h') || (glob '*.hh')) ? '-I.' : '');
1913 my $Ihelp = ($I ? '-I. ' : '');
1914 my $Icomment = ($I ? '' : <<EOC);
1915 # Insert -I. if you add *.h files later:
1916EOC
1917
8bc03d0d 1918 print PL <<END;
3fe130af
JH
1919 LIBS => ['$extralibs'], # e.g., '-lm'
1920 DEFINE => '$opt_F', # e.g., '-DHAVE_SOMETHING'
1921$Icomment INC => '$I', # e.g., '${Ihelp}-I/usr/include/other'
b68ece06
IZ
1922END
1923
1cb0fb50 1924 my $C = grep {$_ ne "$modfname.c"}
9a7df4f2 1925 (glob '*.c'), (glob '*.cc'), (glob '*.C');
b68ece06
IZ
1926 my $Cpre = ($C ? '' : '# ');
1927 my $Ccomment = ($C ? '' : <<EOC);
1928 # Un-comment this if you add C files to link with later:
1929EOC
1930
1931 print PL <<END;
3fe130af 1932$Ccomment ${Cpre}OBJECT => '\$(O_FILES)', # link all the C files too
8bc03d0d 1933END
9a7df4f2 1934} # ' # Grr
a0d0e21e 1935print PL ");\n";
9a7df4f2
NC
1936if (!$opt_c) {
1937 my $generate_code =
1cb0fb50
NC
1938 WriteMakefileSnippet ( C_FILE => $constscfname,
1939 XS_FILE => $constsxsfname,
9a7df4f2
NC
1940 DEFAULT_TYPE => $opt_t,
1941 NAME => $module,
1942 NAMES => \@const_names,
1943 );
1944 print PL <<"END";
1945if (eval {require ExtUtils::Constant; 1}) {
1946 # If you edit these definitions to change the constants used by this module,
1cb0fb50 1947 # you will need to use the generated $constscfname and $constsxsfname
9a7df4f2
NC
1948 # files to replace their "fallback" counterparts before distributing your
1949 # changes.
1950$generate_code
1951}
1952else {
1953 use File::Copy;
1cb0fb50
NC
1954 use File::Spec;
1955 foreach my \$file ('$constscfname', '$constsxsfname') {
1956 my \$fallback = File::Spec->catfile('$fallbackdirname', \$file);
1957 copy (\$fallback, \$file) or die "Can't copy \$fallback to \$file: \$!";
1958 }
9a7df4f2
NC
1959}
1960END
1961
1962 eval $generate_code;
1963 if ($@) {
1964 warn <<"EOM";
1965Attempting to test constant code in $ext$modpname/Makefile.PL:
1966$generate_code
1967__END__
1968gave unexpected error $@
1969Please report the circumstances of this bug in h2xs version $H2XS_VERSION
1970using the perlbug script.
1971EOM
1972 } else {
1973 my $fail;
1974
1cb0fb50
NC
1975 foreach my $file ($constscfname, $constsxsfname) {
1976 my $fallback = File::Spec->catfile($fallbackdirname, $file);
1977 if (compare($file, $fallback)) {
9a7df4f2 1978 warn << "EOM";
1cb0fb50 1979Files "$ext$modpname/$fallbackdirname/$file" and "$ext$modpname/$file" differ.
9a7df4f2
NC
1980EOM
1981 $fail++;
1982 }
1983 }
1984 if ($fail) {
1985 warn fill ('','', <<"EOM") . "\n";
1986It appears that the code in $ext$modpname/Makefile.PL does not autogenerate
1cb0fb50 1987the files $ext$modpname/$constscfname and $ext$modpname/$constsxsfname
9a7df4f2 1988correctly.
1cb0fb50 1989
9a7df4f2
NC
1990Please report the circumstances of this bug in h2xs version $H2XS_VERSION
1991using the perlbug script.
1992EOM
1993 } else {
1cb0fb50 1994 unlink $constscfname, $constsxsfname;
9a7df4f2
NC
1995 }
1996 }
1997}
f508c652 1998close(PL) || die "Can't close $ext$modpname/Makefile.PL: $!\n";
1999
fcd67389
TJ
2000# Create a simple README since this is a CPAN requirement
2001# and it doesnt hurt to have one
2002warn "Writing $ext$modpname/README\n";
2003open(RM, ">README") || die "Can't create $ext$modpname/README:$!\n";
2004my $thisyear = (gmtime)[5] + 1900;
2005my $rmhead = "$modpname version $TEMPLATE_VERSION";
2006my $rmheadeq = "=" x length($rmhead);
11946041
JS
2007
2008my $rm_prereq;
2009
2010if ( $compat_version < 5.00702 and $new_test )
2011{
2012 $rm_prereq = 'Test::More';
2013}
2014else
2015{
2016 $rm_prereq = 'blah blah blah';
2017}
2018
fcd67389
TJ
2019print RM <<_RMEND_;
2020$rmhead
2021$rmheadeq
2022
2023The README is used to introduce the module and provide instructions on
2024how to install the module, any machine dependencies it may have (for
2025example C compilers and installed libraries) and any other information
2026that should be provided before the module is installed.
2027
2028A README file is required for CPAN modules since CPAN extracts the
2029README file from a module distribution so that people browsing the
2030archive can use it get an idea of the modules uses. It is usually a
2031good idea to provide version information here so that people can
2032decide whether fixes for the module are worth downloading.
2033
2034INSTALLATION
2035
2036To install this module type the following:
2037
2038 perl Makefile.PL
2039 make
2040 make test
2041 make install
2042
2043DEPENDENCIES
2044
2045This module requires these other modules and libraries:
2046
11946041 2047 $rm_prereq
fcd67389
TJ
2048
2049COPYRIGHT AND LICENCE
2050
2051Put the correct copyright and licence information here.
2052
d211ebfa 2053$licence
fcd67389
TJ
2054
2055_RMEND_
2056close(RM) || die "Can't close $ext$modpname/README: $!\n";
2057
1b99c731 2058my $testdir = "t";
d211ebfa 2059my $testfile = "$testdir/$modpname.t";
e42bd63e
JH
2060unless (-d "$testdir") {
2061 mkdir "$testdir" or die "Cannot mkdir $testdir: $!\n";
2062}
1b99c731 2063warn "Writing $ext$modpname/$testfile\n";
d3837a33
NC
2064my $tests = @const_names ? 2 : 1;
2065
1b99c731 2066open EX, ">$testfile" or die "Can't create $ext$modpname/$testfile: $!\n";
11946041 2067
d3837a33 2068print EX <<_END_;
f508c652 2069# Before `make install' is performed this script should be runnable with
d211ebfa 2070# `make test'. After `make install' it should work as `perl $modpname.t'
f508c652 2071
452e8205 2072#########################
f508c652 2073
d3837a33 2074# change 'tests => $tests' to 'tests => last_test_to_print';
f508c652 2075
11946041
JS
2076_END_
2077
2078my $test_mod = 'Test::More';
2079
2080if ( $old_test or ($compat_version < 5.007 and not $new_test ))
2081{
2082 my $test_mod = 'Test';
2083
2084 print EX <<_END_;
452e8205 2085use Test;
d3837a33 2086BEGIN { plan tests => $tests };
f508c652 2087use $module;
452e8205 2088ok(1); # If we made it this far, we're ok.
f508c652 2089
d3837a33 2090_END_
11946041
JS
2091
2092 if (@const_names) {
2093 my $const_names = join " ", @const_names;
2094 print EX <<'_END_';
d3837a33 2095
af6c647e
NC
2096my $fail;
2097foreach my $constname (qw(
2098_END_
11946041
JS
2099
2100 print EX wrap ("\t", "\t", $const_names);
2101 print EX (")) {\n");
2102
2103 print EX <<_END_;
d3837a33
NC
2104 next if (eval "my \\\$a = \$constname; 1");
2105 if (\$\@ =~ /^Your vendor has not defined $module macro \$constname/) {
2106 print "# pass: \$\@";
2107 } else {
2108 print "# fail: \$\@";
65843164 2109 \$fail = 1;
d3837a33
NC
2110 }
2111}
2112if (\$fail) {
2113 print "not ok 2\\n";
2114} else {
2115 print "ok 2\\n";
2116}
2117
2118_END_
11946041
JS
2119 }
2120}
2121else
2122{
2123 print EX <<_END_;
2124use Test::More tests => $tests;
2125BEGIN { use_ok('$module') };
2126
2127_END_
2128
2129 if (@const_names) {
2130 my $const_names = join " ", @const_names;
2131 print EX <<'_END_';
2132
2133my $fail = 0;
2134foreach my $constname (qw(
2135_END_
2136
2137 print EX wrap ("\t", "\t", $const_names);
2138 print EX (")) {\n");
2139
2140 print EX <<_END_;
2141 next if (eval "my \\\$a = \$constname; 1");
2142 if (\$\@ =~ /^Your vendor has not defined $module macro \$constname/) {
2143 print "# pass: \$\@";
2144 } else {
2145 print "# fail: \$\@";
2146 \$fail = 1;
2147 }
2148
2149}
2150
2151ok( \$fail == 0 , 'Constants' );
2152_END_
2153 }
d3837a33 2154}
11946041
JS
2155
2156print EX <<_END_;
452e8205 2157#########################
f508c652 2158
11946041
JS
2159# Insert your test code below, the $test_mod module is use()ed here so read
2160# its man page ( perldoc $test_mod ) for help writing this test script.
e1666bf5 2161
f508c652 2162_END_
11946041 2163
1b99c731 2164close(EX) || die "Can't close $ext$modpname/$testfile: $!\n";
a0d0e21e 2165
c0f8b9cd 2166unless ($opt_C) {
ddf6bed1
IZ
2167 warn "Writing $ext$modpname/Changes\n";
2168 $" = ' ';
2169 open(EX, ">Changes") || die "Can't create $ext$modpname/Changes: $!\n";
2170 @ARGS = map {/[\s\"\'\`\$*?^|&<>\[\]\{\}\(\)]/ ? "'$_'" : $_} @ARGS;
2171 print EX <<EOP;
2172Revision history for Perl extension $module.
2173
2174$TEMPLATE_VERSION @{[scalar localtime]}
2175\t- original version; created by h2xs $H2XS_VERSION with options
2176\t\t@ARGS
2177
2178EOP
2179 close(EX) || die "Can't close $ext$modpname/Changes: $!\n";
c0f8b9cd 2180}
c07a80fd 2181
2182warn "Writing $ext$modpname/MANIFEST\n";
5ae7f1db 2183open(MANI,'>MANIFEST') or die "Can't create MANIFEST: $!";
d211ebfa 2184my @files = grep { -f } (<*>, <t/*>, <$fallbackdirname/*>, <$modpmdir/*>);
5ae7f1db 2185if (!@files) {
2186 eval {opendir(D,'.');};
2187 unless ($@) { @files = readdir(D); closedir(D); }
2188}
2189if (!@files) { @files = map {chomp && $_} `ls`; }
55497cff 2190if ($^O eq 'VMS') {
2191 foreach (@files) {
2192 # Clip trailing '.' for portability -- non-VMS OSs don't expect it
2193 s%\.$%%;
2194 # Fix up for case-sensitive file systems
2195 s/$modfname/$modfname/i && next;
2196 $_ = "\U$_" if $_ eq 'manifest' or $_ eq 'changes';
bbce6d69 2197 $_ = 'Makefile.PL' if $_ eq 'makefile.pl';
55497cff 2198 }
2199}
3e3baf6d 2200print MANI join("\n",@files), "\n";
5ae7f1db 2201close MANI;
40000a8c 2202!NO!SUBS!
4633a7c4
LW
2203
2204close OUT or die "Can't close $file: $!";
2205chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
2206exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
8a5546a1 2207chdir $origdir;