This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Change 29753 messed up do_hv_dump() [my fault]
[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
66b6773e 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
069eb725
TP
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
66b6773e 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
069eb725
TP
288 # Default behavior, extension is Rusers
289 h2xs rpcsvc/rusers
3edbfbe5 290
069eb725
TP
291 # Same, but extension is RUSERS
292 h2xs -n RUSERS rpcsvc/rusers
3edbfbe5 293
069eb725
TP
294 # Extension is rpcsvc::rusers. Still finds <rpcsvc/rusers.h>
295 h2xs rpcsvc::rusers
3edbfbe5 296
069eb725
TP
297 # Extension is ONC::RPC. Still finds <rpcsvc/rusers.h>
298 h2xs -n ONC::RPC rpcsvc/rusers
3edbfbe5 299
069eb725
TP
300 # Without constant() or AUTOLOAD
301 h2xs -c rpcsvc/rusers
3edbfbe5 302
069eb725
TP
303 # Creates templates for an extension named RPC
304 h2xs -cfn RPC
3edbfbe5 305
069eb725
TP
306 # Extension is ONC::RPC.
307 h2xs -cfn ONC::RPC
66b6773e 308
069eb725
TP
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
069eb725
TP
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
66b6773e 319 # Makefile.PL will look for library -lrpc in
069eb725
TP
320 # additional directory /opt/net/lib
321 h2xs rpcsvc/rusers -L/opt/net/lib -lrpc
ead2a595 322
069eb725
TP
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
069eb725
TP
327 # Extension is DCE::rgynbase
328 # prefix "sec_rgy_" is dropped from perl function names
66b6773e 329 # subroutines are created for sec_rgy_wildcard_name and
069eb725
TP
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
069eb725
TP
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.
66b6773e 338 # Note that a directory with perl header files would
069eb725
TP
339 # be added automatically to include path.
340 h2xs -xAn perl1 -F "-DEXT=extern -DdEXT= -DINIT\(x\)=" perl.h
760ac839 341
069eb725
TP
342 # Same with function declaration in proto.h as visible from perl.h.
343 h2xs -xAn perl2 perl.h,proto.h
ddf6bed1 344
069eb725
TP
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
3c4b39be 355makes this functionality accessible in Perl? The example below
b68ece06
IZ
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
d1c9eea3 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;
4a660237 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).
23e47b7f
MHM
525 -a, --gen-accessors Generate get/set accessors for struct and union members
526 (used with -x).
527 -b, --compat-version Specify a perl version to be backwards compatibile with.
4d2d0db2
JS
528 -c, --omit-constant Omit the constant() function and specialised AUTOLOAD
529 from the XS file.
530 -d, --debugging Turn on debugging messages.
069eb725 531 -e, --omit-enums Omit constants from enums in the constant() function.
66b6773e 532 If a pattern is given, only the matching enums are
069eb725 533 ignored.
4d2d0db2
JS
534 -f, --force Force creation of the extension even if the C header
535 does not exist.
66b6773e 536 -g, --global Include code for safely storing static data in the .xs file.
23e47b7f 537 -h, -?, --help Display this help message.
4d2d0db2
JS
538 -k, --omit-const-func Omit 'const' attribute on function arguments
539 (used with -x).
540 -m, --gen-tied-var Generate tied variables for access to declared
541 variables.
542 -n, --name Specify a name to use for the extension (recommended).
543 -o, --opaque-re Regular expression for \"opaque\" types.
544 -p, --remove-prefix Specify a prefix which should be removed from the
545 Perl function names.
546 -s, --const-subs Create subroutines for specified macros.
23e47b7f
MHM
547 -t, --default-type Default type for autoloaded constants (default is IV).
548 --use-new-tests Use Test::More in backward compatible modules.
549 --use-old-tests Use the module Test rather than Test::More.
550 --skip-exporter Do not export symbols.
551 --skip-ppport Do not use portability layer.
552 --skip-autoloader Do not use the module C<AutoLoader>.
553 --skip-strict Do not use the pragma C<strict>.
554 --skip-warnings Do not use the pragma C<warnings>.
4d2d0db2
JS
555 -v, --version Specify a version number for this extension.
556 -x, --autogen-xsubs Autogenerate XSUBs using C::Scan.
a34e0dd0
SP
557 --use-xsloader Use XSLoader in backward compatible modules (ignored
558 when used with -X).
4d2d0db2 559
e1666bf5
TB
560extra_libraries
561 are any libraries that might be needed for loading the
562 extension, e.g. -lm would try to link in the math library.
65cf46c7 563EOFUSAGE
e1666bf5 564}
a0d0e21e 565
4d2d0db2 566my ($opt_A,
9e4509e4 567 $opt_B,
4d2d0db2
JS
568 $opt_C,
569 $opt_F,
570 $opt_M,
571 $opt_O,
572 $opt_P,
573 $opt_X,
574 $opt_a,
575 $opt_c,
576 $opt_d,
069eb725 577 $opt_e,
4d2d0db2 578 $opt_f,
e255a1c9 579 $opt_g,
4d2d0db2
JS
580 $opt_h,
581 $opt_k,
582 $opt_m,
583 $opt_n,
584 $opt_o,
585 $opt_p,
586 $opt_s,
587 $opt_v,
588 $opt_x,
589 $opt_b,
11946041
JS
590 $opt_t,
591 $new_test,
dcb5229a
IZ
592 $old_test,
593 $skip_exporter,
594 $skip_ppport,
595 $skip_autoloader,
596 $skip_strict,
597 $skip_warnings,
a34e0dd0 598 $use_xsloader
4d2d0db2
JS
599 );
600
601Getopt::Long::Configure('bundling');
cbca5cc3 602Getopt::Long::Configure('pass_through');
4d2d0db2
JS
603
604my %options = (
605 'omit-autoload|A' => \$opt_A,
9e4509e4 606 'beta-version|B' => \$opt_B,
4d2d0db2
JS
607 'omit-changes|C' => \$opt_C,
608 'cpp-flags|F=s' => \$opt_F,
609 'func-mask|M=s' => \$opt_M,
610 'overwrite_ok|O' => \$opt_O,
611 'omit-pod|P' => \$opt_P,
612 'omit-XS|X' => \$opt_X,
613 'gen-accessors|a' => \$opt_a,
614 'compat-version|b=s' => \$opt_b,
615 'omit-constant|c' => \$opt_c,
616 'debugging|d' => \$opt_d,
069eb725 617 'omit-enums|e:s' => \$opt_e,
4d2d0db2 618 'force|f' => \$opt_f,
e255a1c9 619 'global|g' => \$opt_g,
4d2d0db2
JS
620 'help|h|?' => \$opt_h,
621 'omit-const-func|k' => \$opt_k,
622 'gen-tied-var|m' => \$opt_m,
623 'name|n=s' => \$opt_n,
624 'opaque-re|o=s' => \$opt_o,
625 'remove-prefix|p=s' => \$opt_p,
626 'const-subs|s=s' => \$opt_s,
627 'default-type|t=s' => \$opt_t,
628 'version|v=s' => \$opt_v,
9de3b7c3 629 'autogen-xsubs|x' => \$opt_x,
11946041 630 'use-new-tests' => \$new_test,
dcb5229a
IZ
631 'use-old-tests' => \$old_test,
632 'skip-exporter' => \$skip_exporter,
633 'skip-ppport' => \$skip_ppport,
634 'skip-autoloader' => \$skip_autoloader,
635 'skip-warnings' => \$skip_warnings,
636 'skip-strict' => \$skip_strict,
a34e0dd0 637 'use-xsloader' => \$use_xsloader,
4d2d0db2
JS
638 );
639
640GetOptions(%options) || usage;
a0d0e21e 641
e1666bf5 642usage if $opt_h;
f508c652 643
be3174d2
GS
644if( $opt_b ){
645 usage "You cannot use -b and -m at the same time.\n" if ($opt_b && $opt_m);
9137345a 646 $opt_b =~ /^v?(\d+)\.(\d+)\.(\d+)/ ||
11946041
JS
647 usage "You must provide the backwards compatibility version in X.Y.Z form. "
648 . "(i.e. 5.5.0)\n";
9137345a 649 my ($maj,$min,$sub) = ($1,$2,$3);
3e6e4ea8 650 if ($maj < 5 || ($maj == 5 && $min < 6)) {
4282de36
JH
651 $compat_version =
652 $sub ? sprintf("%d.%03d%02d",$maj,$min,$sub) :
653 sprintf("%d.%03d", $maj,$min);
3e6e4ea8 654 } else {
4282de36
JH
655 $compat_version =
656 $sub ? sprintf("%d.%03d%03d",$maj,$min,$sub) :
657 sprintf("%d.%03d", $maj,$min);
3e6e4ea8
NC
658 }
659} else {
4282de36
JH
660 my ($maj,$min,$sub) = $compat_version =~ /(\d+)\.(\d\d\d)(\d*)/;
661 $sub ||= 0;
3e6e4ea8
NC
662 warn sprintf <<'EOF', $maj,$min,$sub;
663Defaulting to backwards compatibility with perl %d.%d.%d
664If you intend this module to be compatible with earlier perl versions, please
665specify a minimum perl version with the -b option.
666
667EOF
668}
be3174d2 669
9e4509e4
YST
670if( $opt_B ){
671 $TEMPLATE_VERSION = '0.00_01';
672}
673
f508c652 674if( $opt_v ){
675 $TEMPLATE_VERSION = $opt_v;
9e4509e4
YST
676
677 # check if it is numeric
678 my $temp_version = $TEMPLATE_VERSION;
679 my $beta_version = $temp_version =~ s/(\d)_(\d\d)/$1$2/;
680 my $notnum;
681 {
682 local $SIG{__WARN__} = sub { $notnum = 1 };
683 use warnings 'numeric';
684 $temp_version = 0+$temp_version;
685 }
686
687 if ($notnum) {
688 my $module = $opt_n || 'Your::Module';
689 warn <<"EOF";
690You have specified a non-numeric version. Unless you supply an
691appropriate VERSION class method, users may not be able to specify a
692minimum required version with C<use $module versionnum>.
693
694EOF
695 }
696 else {
697 $opt_B = $beta_version;
698 }
f508c652 699}
9ef261b5
MS
700
701# -A implies -c.
dcb5229a 702$skip_autoloader = $opt_c = 1 if $opt_A;
9ef261b5
MS
703
704# -X implies -c and -f
705$opt_c = $opt_f = 1 if $opt_X;
706
9a7df4f2
NC
707$opt_t ||= 'IV';
708
76df5e8f
DM
709my %const_xsub;
710%const_xsub = map { $_,1 } split(/,+/, $opt_s) if $opt_s;
f1f595f5
JS
711
712my $extralibs = '';
713
3cb4da91 714my @path_h;
a0d0e21e 715
a887ff11
BS
716while (my $arg = shift) {
717 if ($arg =~ /^-l/i) {
cbca5cc3
TP
718 $extralibs .= "$arg ";
719 next;
a887ff11 720 }
cbca5cc3 721 last if $extralibs;
a887ff11
BS
722 push(@path_h, $arg);
723}
e1666bf5
TB
724
725usage "Must supply header file or module name\n"
a887ff11 726 unless (@path_h or $opt_n);
e1666bf5 727
ddf6bed1 728my $fmask;
3cb4da91 729my $tmask;
ddf6bed1
IZ
730
731$fmask = qr{$opt_M} if defined $opt_M;
732$tmask = qr{$opt_o} if defined $opt_o;
733my $tmask_all = $tmask && $opt_o eq '.';
734
735if ($opt_x) {
736 eval {require C::Scan; 1}
737 or die <<EOD;
738C::Scan required if you use -x option.
739To install C::Scan, execute
740 perl -MCPAN -e "install C::Scan"
741EOD
742 unless ($tmask_all) {
743 $C::Scan::VERSION >= 0.70
744 or die <<EOD;
745C::Scan v. 0.70 or later required unless you use -o . option.
746You have version $C::Scan::VERSION installed as $INC{'C/Scan.pm'}.
747To install C::Scan, execute
748 perl -MCPAN -e "install C::Scan"
749EOD
750 }
32fb2b78
GS
751 if (($opt_m || $opt_a) && $C::Scan::VERSION < 0.73) {
752 die <<EOD;
753C::Scan v. 0.73 or later required to use -m or -a options.
754You have version $C::Scan::VERSION installed as $INC{'C/Scan.pm'}.
755To install C::Scan, execute
756 perl -MCPAN -e "install C::Scan"
757EOD
758 }
7aff18a2
GS
759}
760elsif ($opt_o or $opt_F) {
dcb5229a
IZ
761 warn <<EOD if $opt_o;
762Option -o does not make sense without -x.
763EOD
764 warn <<EOD if $opt_F and $opt_X ;
765Option -F does not make sense with -X.
ddf6bed1
IZ
766EOD
767}
768
3cb4da91
IZ
769my @path_h_ini = @path_h;
770my ($name, %fullpath, %prefix, %seen_define, %prefixless, %const_names);
a0d0e21e 771
8a9d2888
IZ
772my $module = $opt_n;
773
a887ff11 774if( @path_h ){
ddf6bed1
IZ
775 use File::Spec;
776 my @paths;
3a9c887e 777 my $pre_sub_tri_graphs = 1;
ddf6bed1 778 if ($^O eq 'VMS') { # Consider overrides of default location
3cb4da91
IZ
779 # XXXX This is not equivalent to what the older version did:
780 # it was looking at $hadsys header-file per header-file...
781 my($hadsys) = grep s!^sys/!!i , @path_h;
7aff18a2 782 @paths = qw( Sys$Library VAXC$Include );
ddf6bed1
IZ
783 push @paths, ($hadsys ? 'GNU_CC_Include[vms]' : 'GNU_CC_Include[000000]');
784 push @paths, qw( DECC$Library_Include DECC$System_Include );
7aff18a2
GS
785 }
786 else {
ddf6bed1
IZ
787 @paths = (File::Spec->curdir(), $Config{usrinc},
788 (split ' ', $Config{locincpth}), '/usr/include');
789 }
a887ff11
BS
790 foreach my $path_h (@path_h) {
791 $name ||= $path_h;
8a9d2888
IZ
792 $module ||= do {
793 $name =~ s/\.h$//;
794 if ( $name !~ /::/ ) {
795 $name =~ s#^.*/##;
796 $name = "\u$name";
797 }
798 $name;
799 };
800
e1666bf5
TB
801 if( $path_h =~ s#::#/#g && $opt_n ){
802 warn "Nesting of headerfile ignored with -n\n";
803 }
804 $path_h .= ".h" unless $path_h =~ /\.h$/;
3cb4da91 805 my $fullpath = $path_h;
760ac839 806 $path_h =~ s/,.*$// if $opt_x;
3cb4da91 807 $fullpath{$path_h} = $fullpath;
ddf6bed1 808
8a9d2888
IZ
809 # Minor trickery: we can't chdir() before we processed the headers
810 # (so know the name of the extension), but the header may be in the
811 # extension directory...
812 my $tmp_path_h = $path_h;
813 my $rel_path_h = $path_h;
814 my @dirs = @paths;
ddf6bed1 815 if (not -f $path_h) {
8a9d2888 816 my $found;
ddf6bed1 817 for my $dir (@paths) {
8a9d2888
IZ
818 $found++, last
819 if -f ($path_h = File::Spec->catfile($dir, $tmp_path_h));
820 }
821 if ($found) {
822 $rel_path_h = $path_h;
9de3b7c3 823 $fullpath{$path_h} = $fullpath;
8a9d2888
IZ
824 } else {
825 (my $epath = $module) =~ s,::,/,g;
826 $epath = File::Spec->catdir('ext', $epath) if -d 'ext';
827 $rel_path_h = File::Spec->catfile($epath, $tmp_path_h);
828 $path_h = $tmp_path_h; # Used during -x
829 push @dirs, $epath;
ddf6bed1 830 }
ead2a595 831 }
5273d82d
IZ
832
833 if (!$opt_c) {
66b6773e 834 die "Can't find $tmp_path_h in @dirs\n"
8a9d2888 835 if ( ! $opt_f && ! -f "$rel_path_h" );
5273d82d
IZ
836 # Scan the header file (we should deal with nested header files)
837 # Record the names of simple #define constants into const_names
a887ff11 838 # Function prototypes are processed below.
8a9d2888 839 open(CH, "<$rel_path_h") || die "Can't open $rel_path_h: $!\n";
ddf6bed1 840 defines:
5273d82d 841 while (<CH>) {
3a9c887e 842 if ($pre_sub_tri_graphs) {
66b6773e 843 # Preprocess all tri-graphs
3a9c887e
PK
844 # including things stuck in quoted string constants.
845 s/\?\?=/#/g; # | ??=| #|
846 s/\?\?\!/|/g; # | ??!| ||
847 s/\?\?'/^/g; # | ??'| ^|
848 s/\?\?\(/[/g; # | ??(| [|
849 s/\?\?\)/]/g; # | ??)| ]|
850 s/\?\?\-/~/g; # | ??-| ~|
851 s/\?\?\//\\/g; # | ??/| \|
852 s/\?\?</{/g; # | ??<| {|
853 s/\?\?>/}/g; # | ??>| }|
854 }
9de3b7c3 855 if (/^[ \t]*#[ \t]*define\s+([\$\w]+)\b(?!\()\s*(?=[^"\s])(.*)/) {
ddf6bed1
IZ
856 my $def = $1;
857 my $rest = $2;
858 $rest =~ s!/\*.*?(\*/|\n)|//.*!!g; # Remove comments
859 $rest =~ s/^\s+//;
860 $rest =~ s/\s+$//;
861 # Cannot do: (-1) and ((LHANDLE)3) are OK:
862 #print("Skip non-wordy $def => $rest\n"),
863 # next defines if $rest =~ /[^\w\$]/;
864 if ($rest =~ /"/) {
865 print("Skip stringy $def => $rest\n") if $opt_d;
866 next defines;
867 }
868 print "Matched $_ ($def)\n" if $opt_d;
869 $seen_define{$def} = $rest;
870 $_ = $def;
e1666bf5 871 next if /^_.*_h_*$/i; # special case, but for what?
760ac839 872 if (defined $opt_p) {
5273d82d
IZ
873 if (!/^$opt_p(\d)/) {
874 ++$prefix{$_} if s/^$opt_p//;
875 }
876 else {
877 warn "can't remove $opt_p prefix from '$_'!\n";
878 }
ead2a595 879 }
ddf6bed1
IZ
880 $prefixless{$def} = $_;
881 if (!$fmask or /$fmask/) {
882 print "... Passes mask of -M.\n" if $opt_d and $fmask;
883 $const_names{$_}++;
884 }
5273d82d
IZ
885 }
886 }
069eb725
TP
887 if (defined $opt_e and !$opt_e) {
888 close(CH);
889 }
890 else {
622913ab
IZ
891 # Work from miniperl too - on "normal" systems
892 my $SEEK_SET = eval 'use Fcntl qw/SEEK_SET/; SEEK_SET' or 0;
893 seek CH, 0, $SEEK_SET;
069eb725
TP
894 my $src = do { local $/; <CH> };
895 close CH;
896 no warnings 'uninitialized';
66b6773e
NC
897
898 # Remove C and C++ comments
069eb725 899 $src =~ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#$2#gs;
66b6773e 900
6329a6bc
AK
901 while ($src =~ /\benum\s*([\w_]*)\s*\{\s([^}]+)\}/gsc) {
902 my ($enum_name, $enum_body) = ($1, $2);
069eb725
TP
903 # skip enums matching $opt_e
904 next if $opt_e && $enum_name =~ /$opt_e/;
905 my $val = 0;
906 for my $item (split /,/, $enum_body) {
e78c7d95 907 next if $item =~ /\A\s*\Z/;
baf7177e
RGS
908 my ($key, $declared_val) = $item =~ /(\w+)\s*(?:=\s*(.*))?/;
909 $val = defined($declared_val) && length($declared_val) ? $declared_val : 1 + $val;
3e0a3558 910 $seen_define{$key} = $val;
069eb725
TP
911 $const_names{$key}++;
912 }
913 } # while (...)
914 } # if (!defined $opt_e or $opt_e)
e1666bf5 915 }
a887ff11 916 }
a0d0e21e
LW
917}
918
869be497
TJ
919# Save current directory so that C::Scan can use it
920my $cwd = File::Spec->rel2abs( File::Spec->curdir );
a0d0e21e 921
1cb0fb50
NC
922# As Ilya suggested, use a name that contains - and then it can't clash with
923# the names of any packages. A directory 'fallback' will clash with any
924# new pragmata down the fallback:: tree, but that seems unlikely.
925my $constscfname = 'const-c.inc';
926my $constsxsfname = 'const-xs.inc';
927my $fallbackdirname = 'fallback';
f1f595f5 928
4a660237 929my $ext = chdir 'ext' ? 'ext/' : '';
66b6773e 930
4a660237
MS
931my @modparts = split(/::/,$module);
932my $modpname = join('-', @modparts);
933my $modfname = pop @modparts;
934my $modpmdir = join '/', 'lib', @modparts;
935my $modpmname = join '/', $modpmdir, $modfname.'.pm';
66b6773e 936
2920c5d2 937if ($opt_O) {
938 warn "Overwriting existing $ext$modpname!!!\n" if -e $modpname;
7aff18a2
GS
939}
940else {
2920c5d2 941 die "Won't overwrite existing $ext$modpname\n" if -e $modpname;
942}
4a660237 943-d "$modpname" || mkpath([$modpname], 0, 0775);
8e07c86e 944chdir($modpname) || die "Can't chdir $ext$modpname: $!\n";
a0d0e21e 945
5273d82d
IZ
946my %types_seen;
947my %std_types;
f4d63e4e
IZ
948my $fdecls = [];
949my $fdecls_parsed = [];
ddf6bed1
IZ
950my $typedef_rex;
951my %typedefs_pre;
952my %known_fnames;
7c1d48a5 953my %structs;
5273d82d 954
3cb4da91
IZ
955my @fnames;
956my @fnames_no_prefix;
32fb2b78
GS
957my %vdecl_hash;
958my @vdecls;
5273d82d 959
2920c5d2 960if( ! $opt_X ){ # use XS, unless it was disabled
dcb5229a
IZ
961 unless ($skip_ppport) {
962 require Devel::PPPort;
963 warn "Writing $ext$modpname/ppport.h\n";
964 Devel::PPPort::WriteFile('ppport.h')
965 || die "Can't create $ext$modpname/ppport.h: $!\n";
966 }
2920c5d2 967 open(XS, ">$modfname.xs") || die "Can't create $ext$modpname/$modfname.xs: $!\n";
5273d82d 968 if ($opt_x) {
5273d82d
IZ
969 warn "Scanning typemaps...\n";
970 get_typemap();
3cb4da91
IZ
971 my @td;
972 my @good_td;
973 my $addflags = $opt_F || '';
974
f4d63e4e 975 foreach my $filename (@path_h) {
3cb4da91
IZ
976 my $c;
977 my $filter;
978
979 if ($fullpath{$filename} =~ /,/) {
f4d63e4e
IZ
980 $filename = $`;
981 $filter = $';
982 }
983 warn "Scanning $filename for functions...\n";
5ce74a3d 984 my @styles = $Config{gccversion} ? qw(C++ C9X GNU) : qw(C++ C9X);
f4d63e4e 985 $c = new C::Scan 'filename' => $filename, 'filename_filter' => $filter,
5ce74a3d 986 'add_cppflags' => $addflags, 'c_styles' => \@styles;
869be497 987 $c->set('includeDirs' => ["$Config::Config{archlib}/CORE", $cwd]);
ddf6bed1 988
5db8a8c2
DC
989 $c->get('keywords')->{'__restrict'} = 1;
990
f4d63e4e
IZ
991 push @$fdecls_parsed, @{ $c->get('parsed_fdecls') };
992 push(@$fdecls, @{$c->get('fdecls')});
3cb4da91
IZ
993
994 push @td, @{$c->get('typedefs_maybe')};
7c1d48a5
GS
995 if ($opt_a) {
996 my $structs = $c->get('typedef_structs');
997 @structs{keys %$structs} = values %$structs;
998 }
3cb4da91 999
32fb2b78
GS
1000 if ($opt_m) {
1001 %vdecl_hash = %{ $c->get('vdecl_hash') };
1002 @vdecls = sort keys %vdecl_hash;
1003 for (local $_ = 0; $_ < @vdecls; ++$_) {
1004 my $var = $vdecls[$_];
1005 my($type, $post) = @{ $vdecl_hash{$var} };
1006 if (defined $post) {
1007 warn "Can't handle variable '$type $var $post', skipping.\n";
1008 splice @vdecls, $_, 1;
1009 redo;
1010 }
1011 $type = normalize_type($type);
1012 $vdecl_hash{$var} = $type;
1013 }
1014 }
1015
3cb4da91
IZ
1016 unless ($tmask_all) {
1017 warn "Scanning $filename for typedefs...\n";
1018 my $td = $c->get('typedef_hash');
1019 # eval {require 'dumpvar.pl'; ::dumpValue($td)} or warn $@ if $opt_d;
1020 my @f_good_td = grep $td->{$_}[1] eq '', keys %$td;
1021 push @good_td, @f_good_td;
1022 @typedefs_pre{@f_good_td} = map $_->[0], @$td{@f_good_td};
1023 }
1024 }
1025 { local $" = '|';
6542b28e 1026 $typedef_rex = qr(\b(?<!struct )(?:@good_td)\b) if @good_td;
5273d82d 1027 }
ddf6bed1
IZ
1028 %known_fnames = map @$_[1,3], @$fdecls_parsed; # [1,3] is NAME, FULLTEXT
1029 if ($fmask) {
1030 my @good;
1031 for my $i (0..$#$fdecls_parsed) {
1032 next unless $fdecls_parsed->[$i][1] =~ /$fmask/; # [1] is NAME
1033 push @good, $i;
1034 print "... Function $fdecls_parsed->[$i][1] passes -M mask.\n"
1035 if $opt_d;
1036 }
1037 $fdecls = [@$fdecls[@good]];
1038 $fdecls_parsed = [@$fdecls_parsed[@good]];
1039 }
3cb4da91
IZ
1040 @fnames = sort map $_->[1], @$fdecls_parsed; # 1 is NAME
1041 # Sort declarations:
1042 {
1043 my %h = map( ($_->[1], $_), @$fdecls_parsed);
1044 $fdecls_parsed = [ @h{@fnames} ];
ddf6bed1 1045 }
3cb4da91
IZ
1046 @fnames_no_prefix = @fnames;
1047 @fnames_no_prefix
869be497
TJ
1048 = sort map { ++$prefix{$_} if s/^$opt_p(?!\d)//; $_ } @fnames_no_prefix
1049 if defined $opt_p;
ddf6bed1 1050 # Remove macros which expand to typedefs
ddf6bed1
IZ
1051 print "Typedefs are @td.\n" if $opt_d;
1052 my %td = map {($_, $_)} @td;
1053 # Add some other possible but meaningless values for macros
1054 for my $k (qw(char double float int long short unsigned signed void)) {
1055 $td{"$_$k"} = "$_$k" for ('', 'signed ', 'unsigned ');
1056 }
1057 # eval {require 'dumpvar.pl'; ::dumpValue( [\@td, \%td] ); 1} or warn $@;
1058 my $n = 0;
1059 my %bad_macs;
1060 while (keys %td > $n) {
1061 $n = keys %td;
1062 my ($k, $v);
1063 while (($k, $v) = each %seen_define) {
66b6773e 1064 # print("found '$k'=>'$v'\n"),
ddf6bed1
IZ
1065 $bad_macs{$k} = $td{$k} = $td{$v} if exists $td{$v};
1066 }
1067 }
1068 # Now %bad_macs contains names of bad macros
1069 for my $k (keys %bad_macs) {
1070 delete $const_names{$prefixless{$k}};
1071 print "Ignoring macro $k which expands to a typedef name '$bad_macs{$k}'\n" if $opt_d;
5273d82d 1072 }
5273d82d 1073 }
2920c5d2 1074}
3cb4da91 1075my @const_names = sort keys %const_names;
5273d82d 1076
4a660237
MS
1077-d $modpmdir || mkpath([$modpmdir], 0, 0775);
1078open(PM, ">$modpmname") || die "Can't create $ext$modpname/$modpmname: $!\n";
a0d0e21e 1079
a0d0e21e 1080$" = "\n\t";
4a660237 1081warn "Writing $ext$modpname/$modpmname\n";
a0d0e21e 1082
be3174d2
GS
1083print PM <<"END";
1084package $module;
1085
1086use $compat_version;
dcb5229a
IZ
1087END
1088
1089print PM <<"END" unless $skip_strict;
be3174d2
GS
1090use strict;
1091END
dcb5229a
IZ
1092
1093print PM "use warnings;\n" unless $skip_warnings or $compat_version < 5.006;
2920c5d2 1094
aba05478 1095unless( $opt_X || $opt_c || $opt_A ){
2920c5d2 1096 # we'll have an AUTOLOAD(), and it will have $AUTOLOAD and
1097 # will want Carp.
1098 print PM <<'END';
1099use Carp;
2920c5d2 1100END
1101}
1102
dcb5229a 1103print PM <<'END' unless $skip_exporter;
2920c5d2 1104
a0d0e21e 1105require Exporter;
2920c5d2 1106END
1107
a34e0dd0 1108my $use_Dyna = (not $opt_X and $compat_version < 5.006 and not $use_xsloader);
dcb5229a 1109print PM <<"END" if $use_Dyna; # use DynaLoader, unless XS was disabled
a0d0e21e 1110require DynaLoader;
3edbfbe5
TB
1111END
1112
e1666bf5 1113
9ef261b5 1114# Are we using AutoLoader or not?
dcb5229a 1115unless ($skip_autoloader) { # no autoloader whatsoever.
9ef261b5
MS
1116 unless ($opt_c) { # we're doing the AUTOLOAD
1117 print PM "use AutoLoader;\n";
2920c5d2 1118 }
9ef261b5
MS
1119 else {
1120 print PM "use AutoLoader qw(AUTOLOAD);\n"
2920c5d2 1121 }
3edbfbe5 1122}
3edbfbe5 1123
be3174d2 1124if ( $compat_version < 5.006 ) {
9e4509e4
YST
1125 my $vars = '$VERSION @ISA';
1126 $vars .= ' @EXPORT @EXPORT_OK %EXPORT_TAGS' unless $skip_exporter;
1127 $vars .= ' $AUTOLOAD' unless $opt_X || $opt_c || $opt_A;
1128 $vars .= ' $XS_VERSION' if $opt_B && !$opt_X;
1129 print PM "use vars qw($vars);";
be3174d2
GS
1130}
1131
9ef261b5 1132# Determine @ISA.
dcb5229a 1133my @modISA;
66b6773e 1134push @modISA, 'Exporter' unless $skip_exporter;
dcb5229a
IZ
1135push @modISA, 'DynaLoader' if $use_Dyna; # no XS
1136my $myISA = "our \@ISA = qw(@modISA);";
be3174d2
GS
1137$myISA =~ s/^our // if $compat_version < 5.006;
1138
9ef261b5 1139print PM "\n$myISA\n\n";
e1666bf5 1140
32fb2b78 1141my @exported_names = (@const_names, @fnames_no_prefix, map '$'.$_, @vdecls);
3cb4da91 1142
dcb5229a
IZ
1143my $tmp='';
1144$tmp .= <<"END" unless $skip_exporter;
e1666bf5
TB
1145# Items to export into callers namespace by default. Note: do not export
1146# names by default without a very good reason. Use EXPORT_OK instead.
1147# Do not simply export all your public functions/methods/constants.
ddf6bed1
IZ
1148
1149# This allows declaration use $module ':all';
1150# If you do not need this, moving things directly into \@EXPORT or \@EXPORT_OK
1151# will save memory.
51fac20b 1152our %EXPORT_TAGS = ( 'all' => [ qw(
3cb4da91 1153 @exported_names
ddf6bed1
IZ
1154) ] );
1155
51fac20b 1156our \@EXPORT_OK = ( \@{ \$EXPORT_TAGS{'all'} } );
ddf6bed1 1157
77ca0c92 1158our \@EXPORT = qw(
e1666bf5 1159 @const_names
a0d0e21e 1160);
dcb5229a
IZ
1161
1162END
1163
9e4509e4
YST
1164$tmp .= "our \$VERSION = '$TEMPLATE_VERSION';\n";
1165if ($opt_B) {
1166 $tmp .= "our \$XS_VERSION = \$VERSION;\n" unless $opt_X;
1167 $tmp .= "\$VERSION = eval \$VERSION; # see L<perlmodstyle>\n";
1168}
1169$tmp .= "\n";
e1666bf5 1170
be3174d2
GS
1171$tmp =~ s/^our //mg if $compat_version < 5.006;
1172print PM $tmp;
1173
32fb2b78
GS
1174if (@vdecls) {
1175 printf PM "our(@{[ join ', ', map '$'.$_, @vdecls ]});\n\n";
1176}
1177
be3174d2 1178
af6c647e 1179print PM autoload ($module, $compat_version) unless $opt_c or $opt_X;
a0d0e21e 1180
2920c5d2 1181if( ! $opt_X ){ # print bootstrap, unless XS is disabled
dcb5229a 1182 if ($use_Dyna) {
9e4509e4 1183 $tmp = <<"END";
f508c652 1184bootstrap $module \$VERSION;
2920c5d2 1185END
dcb5229a 1186 } else {
9e4509e4 1187 $tmp = <<"END";
dcb5229a
IZ
1188require XSLoader;
1189XSLoader::load('$module', \$VERSION);
1190END
1191 }
9e4509e4
YST
1192 $tmp =~ s:\$VERSION:\$XS_VERSION:g if $opt_B;
1193 print PM $tmp;
2920c5d2 1194}
1195
32fb2b78
GS
1196# tying the variables can happen only after bootstrap
1197if (@vdecls) {
1198 printf PM <<END;
1199{
1200@{[ join "\n", map " _tievar_$_(\$$_);", @vdecls ]}
1201}
1202
1203END
1204}
1205
3cb4da91 1206my $after;
2920c5d2 1207if( $opt_P ){ # if POD is disabled
1208 $after = '__END__';
1209}
1210else {
1211 $after = '=cut';
1212}
1213
1214print PM <<"END";
a0d0e21e 1215
e1666bf5 1216# Preloaded methods go here.
9ef261b5
MS
1217END
1218
1219print PM <<"END" unless $opt_A;
a0d0e21e 1220
2920c5d2 1221# Autoload methods go after $after, and are processed by the autosplit program.
9ef261b5
MS
1222END
1223
1224print PM <<"END";
a0d0e21e
LW
1225
12261;
e1666bf5 1227__END__
a0d0e21e 1228END
a0d0e21e 1229
a42b7cd7 1230my ($email,$author,$licence);
65cf46c7
JS
1231
1232eval {
317fb126
JH
1233 my $username;
1234 ($username,$author) = (getpwuid($>))[0,6];
1235 if (defined $username && defined $author) {
1236 $author =~ s/,.*$//; # in case of sub fields
1237 my $domain = $Config{'mydomain'};
1238 $domain =~ s/^\.//;
1239 $email = "$username\@$domain";
1240 }
65cf46c7
JS
1241 };
1242
5a4d6b2b 1243$author =~ s/'/\\'/g if defined $author;
65cf46c7
JS
1244$author ||= "A. U. Thor";
1245$email ||= 'a.u.thor@a.galaxy.far.far.away';
f508c652 1246
a42b7cd7
JH
1247$licence = sprintf << "DEFAULT", $^V;
1248Copyright (C) ${\(1900 + (localtime) [5])} by $author
1249
1250This library is free software; you can redistribute it and/or modify
1251it under the same terms as Perl itself, either Perl version %vd or,
1252at your option, any later version of Perl 5 you may have available.
1253DEFAULT
1254
c0f8b9cd
GS
1255my $revhist = '';
1256$revhist = <<EOT if $opt_C;
497711e7
GS
1257#
1258#=head1 HISTORY
1259#
1260#=over 8
1261#
1262#=item $TEMPLATE_VERSION
1263#
1264#Original version; created by h2xs $H2XS_VERSION with options
1265#
1266# @ARGS
1267#
1268#=back
1269#
c0f8b9cd
GS
1270EOT
1271
dcb5229a 1272my $exp_doc = $skip_exporter ? '' : <<EOD;
497711e7
GS
1273#
1274#=head2 EXPORT
1275#
1276#None by default.
1277#
ddf6bed1 1278EOD
b7d5fa84 1279
5273d82d 1280if (@const_names and not $opt_P) {
dcb5229a 1281 $exp_doc .= <<EOD unless $skip_exporter;
497711e7
GS
1282#=head2 Exportable constants
1283#
1284# @{[join "\n ", @const_names]}
1285#
5273d82d
IZ
1286EOD
1287}
b7d5fa84 1288
5273d82d 1289if (defined $fdecls and @$fdecls and not $opt_P) {
dcb5229a 1290 $exp_doc .= <<EOD unless $skip_exporter;
497711e7
GS
1291#=head2 Exportable functions
1292#
3cb4da91 1293EOD
b7d5fa84 1294
497711e7
GS
1295# $exp_doc .= <<EOD if $opt_p;
1296#When accessing these functions from Perl, prefix C<$opt_p> should be removed.
1297#
b7d5fa84 1298#EOD
dcb5229a 1299 $exp_doc .= <<EOD unless $skip_exporter;
497711e7
GS
1300# @{[join "\n ", @known_fnames{@fnames}]}
1301#
5273d82d
IZ
1302EOD
1303}
1304
b7d5fa84
IZ
1305my $meth_doc = '';
1306
1307if ($opt_x && $opt_a) {
1308 my($name, $struct);
1309 $meth_doc .= accessor_docs($name, $struct)
1310 while ($name, $struct) = each %structs;
1311}
1312
a42b7cd7
JH
1313# Prefix the default licence with hash symbols.
1314# Is this just cargo cult - it seems that the first thing that happens to this
1315# block is that all the hashes are then s///g out.
1316my $licence_hash = $licence;
1317$licence_hash =~ s/^/#/gm;
1318
76df5e8f
DM
1319my $pod;
1320$pod = <<"END" unless $opt_P;
973ae360 1321## Below is stub documentation for your module. You'd better edit it!
f508c652 1322#
1323#=head1 NAME
1324#
1325#$module - Perl extension for blah blah blah
1326#
1327#=head1 SYNOPSIS
1328#
1329# use $module;
1330# blah blah blah
1331#
1332#=head1 DESCRIPTION
1333#
7aff18a2 1334#Stub documentation for $module, created by h2xs. It looks like the
f508c652 1335#author of the extension was negligent enough to leave the stub
1336#unedited.
1337#
1338#Blah blah blah.
b7d5fa84 1339$exp_doc$meth_doc$revhist
f508c652 1340#
09c48e64 1341#=head1 SEE ALSO
f508c652 1342#
09c48e64
JH
1343#Mention other useful documentation such as the documentation of
1344#related modules or operating system documentation (such as man pages
1345#in UNIX), or any relevant external documentation such as RFCs or
1346#standards.
e8f26592
EHA
1347#
1348#If you have a mailing list set up for your module, mention it here.
1349#
09c48e64
JH
1350#If you have a web site set up for your module, mention it here.
1351#
1352#=head1 AUTHOR
1353#
1354#$author, E<lt>${email}E<gt>
1355#
e8f26592
EHA
1356#=head1 COPYRIGHT AND LICENSE
1357#
a42b7cd7 1358$licence_hash
e8f26592 1359#
f508c652 1360#=cut
1361END
1362
1363$pod =~ s/^\#//gm unless $opt_P;
1364print PM $pod unless $opt_P;
1365
a0d0e21e
LW
1366close PM;
1367
e1666bf5 1368
2920c5d2 1369if( ! $opt_X ){ # print XS, unless it is disabled
8e07c86e 1370warn "Writing $ext$modpname/$modfname.xs\n";
e1666bf5 1371
a0d0e21e
LW
1372print XS <<"END";
1373#include "EXTERN.h"
1374#include "perl.h"
1375#include "XSUB.h"
dcb5229a
IZ
1376
1377END
1378
1379print XS <<"END" unless $skip_ppport;
0a7c7f4f 1380#include "ppport.h"
a0d0e21e
LW
1381
1382END
dcb5229a 1383
a887ff11 1384if( @path_h ){
3cb4da91 1385 foreach my $path_h (@path_h_ini) {
a0d0e21e
LW
1386 my($h) = $path_h;
1387 $h =~ s#^/usr/include/##;
ead2a595 1388 if ($^O eq 'VMS') { $h =~ s#.*vms\]#sys/# or $h =~ s#.*[:>\]]##; }
a887ff11
BS
1389 print XS qq{#include <$h>\n};
1390 }
1391 print XS "\n";
a0d0e21e
LW
1392}
1393
e255a1c9
PM
1394print XS <<"END" if $opt_g;
1395
1396/* Global Data */
1397
1398#define MY_CXT_KEY "${module}::_guts" XS_VERSION
1399
1400typedef struct {
1401 /* Put Global Data in here */
1402 int dummy; /* you can access this elsewhere as MY_CXT.dummy */
1403} my_cxt_t;
1404
1405START_MY_CXT
1406
1407END
1408
ddf6bed1
IZ
1409my %pointer_typedefs;
1410my %struct_typedefs;
1411
1412sub td_is_pointer {
1413 my $type = shift;
1414 my $out = $pointer_typedefs{$type};
1415 return $out if defined $out;
1416 my $otype = $type;
1417 $out = ($type =~ /\*$/);
1418 # This converts only the guys which do not have trailing part in the typedef
1419 if (not $out
1420 and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1421 $type = normalize_type($type);
1422 print "Is-Pointer: Type mutation via typedefs: $otype ==> $type\n"
1423 if $opt_d;
1424 $out = td_is_pointer($type);
1425 }
1426 return ($pointer_typedefs{$otype} = $out);
1427}
1428
1429sub td_is_struct {
1430 my $type = shift;
1431 my $out = $struct_typedefs{$type};
1432 return $out if defined $out;
1433 my $otype = $type;
32fb2b78 1434 $out = ($type =~ /^(struct|union)\b/) && !td_is_pointer($type);
ddf6bed1
IZ
1435 # This converts only the guys which do not have trailing part in the typedef
1436 if (not $out
1437 and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1438 $type = normalize_type($type);
1439 print "Is-Struct: Type mutation via typedefs: $otype ==> $type\n"
1440 if $opt_d;
1441 $out = td_is_struct($type);
1442 }
1443 return ($struct_typedefs{$otype} = $out);
1444}
1445
9a7df4f2 1446print_tievar_subs(\*XS, $_, $vdecl_hash{$_}) for @vdecls;
e1666bf5 1447
ddf6bed1 1448if( ! $opt_c ) {
9a7df4f2
NC
1449 # We write the "sample" files used when this module is built by perl without
1450 # ExtUtils::Constant.
1451 # h2xs will later check that these are the same as those generated by the
1452 # code embedded into Makefile.PL
1cb0fb50
NC
1453 unless (-d $fallbackdirname) {
1454 mkdir "$fallbackdirname" or die "Cannot mkdir $fallbackdirname: $!\n";
1455 }
1456 warn "Writing $ext$modpname/$fallbackdirname/$constscfname\n";
1457 warn "Writing $ext$modpname/$fallbackdirname/$constsxsfname\n";
1458 my $cfallback = File::Spec->catfile($fallbackdirname, $constscfname);
1459 my $xsfallback = File::Spec->catfile($fallbackdirname, $constsxsfname);
1460 WriteConstants ( C_FILE => $cfallback,
1461 XS_FILE => $xsfallback,
9a7df4f2
NC
1462 DEFAULT_TYPE => $opt_t,
1463 NAME => $module,
1464 NAMES => \@const_names,
1465 );
1cb0fb50 1466 print XS "#include \"$constscfname\"\n";
e1666bf5
TB
1467}
1468
32fb2b78 1469
f1f595f5 1470my $prefix = defined $opt_p ? "PREFIX = $opt_p" : '';
3cb4da91 1471
e1666bf5
TB
1472# Now switch from C to XS by issuing the first MODULE declaration:
1473print XS <<"END";
a0d0e21e 1474
ead2a595 1475MODULE = $module PACKAGE = $module $prefix
1476
1477END
1478
9a7df4f2
NC
1479# If a constant() function was #included then output a corresponding
1480# XS declaration:
1cb0fb50 1481print XS "INCLUDE: $constsxsfname\n" unless $opt_c;
9a7df4f2 1482
e255a1c9
PM
1483print XS <<"END" if $opt_g;
1484
1485BOOT:
1486{
1487 MY_CXT_INIT;
1488 /* If any of the fields in the my_cxt_t struct need
1489 to be initialised, do it here.
1490 */
1491}
1492
1493END
1494
ead2a595 1495foreach (sort keys %const_xsub) {
1496 print XS <<"END";
1497char *
1498$_()
1499
1500 CODE:
1501#ifdef $_
7aff18a2 1502 RETVAL = $_;
ead2a595 1503#else
7aff18a2 1504 croak("Your vendor has not defined the $module macro $_");
ead2a595 1505#endif
1506
1507 OUTPUT:
7aff18a2 1508 RETVAL
a0d0e21e 1509
e1666bf5 1510END
ead2a595 1511}
e1666bf5 1512
5273d82d 1513my %seen_decl;
ddf6bed1 1514my %typemap;
5273d82d 1515
ead2a595 1516sub print_decl {
1517 my $fh = shift;
1518 my $decl = shift;
1519 my ($type, $name, $args) = @$decl;
5273d82d
IZ
1520 return if $seen_decl{$name}++; # Need to do the same for docs as well?
1521
ead2a595 1522 my @argnames = map {$_->[1]} @$args;
ddf6bed1 1523 my @argtypes = map { normalize_type( $_->[0], 1 ) } @$args;
32fb2b78
GS
1524 if ($opt_k) {
1525 s/^\s*const\b\s*// for @argtypes;
1526 }
5273d82d 1527 my @argarrays = map { $_->[4] || '' } @$args;
ead2a595 1528 my $numargs = @$args;
1529 if ($numargs and $argtypes[-1] eq '...') {
1530 $numargs--;
1531 $argnames[-1] = '...';
1532 }
1533 local $" = ', ';
ddf6bed1
IZ
1534 $type = normalize_type($type, 1);
1535
ead2a595 1536 print $fh <<"EOP";
1537
1538$type
1539$name(@argnames)
1540EOP
1541
3cb4da91 1542 for my $arg (0 .. $numargs - 1) {
ead2a595 1543 print $fh <<"EOP";
5273d82d 1544 $argtypes[$arg] $argnames[$arg]$argarrays[$arg]
ead2a595 1545EOP
1546 }
1547}
1548
32fb2b78
GS
1549sub print_tievar_subs {
1550 my($fh, $name, $type) = @_;
1551 print $fh <<END;
1552I32
1553_get_$name(IV index, SV *sv) {
1554 dSP;
1555 PUSHMARK(SP);
1556 XPUSHs(sv);
1557 PUTBACK;
1558 (void)call_pv("$module\::_get_$name", G_DISCARD);
1559 return (I32)0;
1560}
1561
1562I32
1563_set_$name(IV index, SV *sv) {
1564 dSP;
1565 PUSHMARK(SP);
1566 XPUSHs(sv);
1567 PUTBACK;
1568 (void)call_pv("$module\::_set_$name", G_DISCARD);
1569 return (I32)0;
1570}
1571
1572END
1573}
1574
1575sub print_tievar_xsubs {
1576 my($fh, $name, $type) = @_;
1577 print $fh <<END;
1578void
1579_tievar_$name(sv)
1580 SV* sv
1581 PREINIT:
1582 struct ufuncs uf;
1583 CODE:
1584 uf.uf_val = &_get_$name;
1585 uf.uf_set = &_set_$name;
1586 uf.uf_index = (IV)&_get_$name;
1587 sv_magic(sv, 0, 'U', (char*)&uf, sizeof(uf));
1588
1589void
1590_get_$name(THIS)
1591 $type THIS = NO_INIT
1592 CODE:
1593 THIS = $name;
1594 OUTPUT:
1595 SETMAGIC: DISABLE
1596 THIS
1597
1598void
1599_set_$name(THIS)
1600 $type THIS
1601 CODE:
1602 $name = THIS;
1603
1604END
1605}
1606
7c1d48a5
GS
1607sub print_accessors {
1608 my($fh, $name, $struct) = @_;
1609 return unless defined $struct && $name !~ /\s|_ANON/;
1610 $name = normalize_type($name);
1611 my $ptrname = normalize_type("$name *");
32fb2b78
GS
1612 print $fh <<"EOF";
1613
1614MODULE = $module PACKAGE = ${name} $prefix
1615
1616$name *
1617_to_ptr(THIS)
1618 $name THIS = NO_INIT
1619 PROTOTYPE: \$
1620 CODE:
1621 if (sv_derived_from(ST(0), "$name")) {
1622 STRLEN len;
1623 char *s = SvPV((SV*)SvRV(ST(0)), len);
1624 if (len != sizeof(THIS))
1625 croak("Size \%d of packed data != expected \%d",
1626 len, sizeof(THIS));
1627 RETVAL = ($name *)s;
66b6773e 1628 }
32fb2b78
GS
1629 else
1630 croak("THIS is not of type $name");
1631 OUTPUT:
1632 RETVAL
1633
1634$name
1635new(CLASS)
1636 char *CLASS = NO_INIT
1637 PROTOTYPE: \$
1638 CODE:
1639 Zero((void*)&RETVAL, sizeof(RETVAL), char);
1640 OUTPUT:
1641 RETVAL
7c1d48a5
GS
1642
1643MODULE = $module PACKAGE = ${name}Ptr $prefix
1644
1645EOF
1646 my @items = @$struct;
1647 while (@items) {
1648 my $item = shift @items;
1649 if ($item->[0] =~ /_ANON/) {
32fb2b78 1650 if (defined $item->[2]) {
7c1d48a5 1651 push @items, map [
32fb2b78 1652 @$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]",
7c1d48a5
GS
1653 ], @{ $structs{$item->[0]} };
1654 } else {
1655 push @items, @{ $structs{$item->[0]} };
1656 }
1657 } else {
1658 my $type = normalize_type($item->[0]);
32fb2b78 1659 my $ttype = $structs{$type} ? normalize_type("$type *") : $type;
7c1d48a5 1660 print $fh <<"EOF";
32fb2b78
GS
1661$ttype
1662$item->[2](THIS, __value = NO_INIT)
7c1d48a5
GS
1663 $ptrname THIS
1664 $type __value
1665 PROTOTYPE: \$;\$
1666 CODE:
7c1d48a5
GS
1667 if (items > 1)
1668 THIS->$item->[-1] = __value;
32fb2b78
GS
1669 RETVAL = @{[
1670 $type eq $ttype ? "THIS->$item->[-1]" : "&(THIS->$item->[-1])"
1671 ]};
7c1d48a5
GS
1672 OUTPUT:
1673 RETVAL
1674
1675EOF
1676 }
1677 }
1678}
1679
b7d5fa84
IZ
1680sub accessor_docs {
1681 my($name, $struct) = @_;
1682 return unless defined $struct && $name !~ /\s|_ANON/;
1683 $name = normalize_type($name);
1684 my $ptrname = $name . 'Ptr';
1685 my @items = @$struct;
1686 my @list;
1687 while (@items) {
1688 my $item = shift @items;
1689 if ($item->[0] =~ /_ANON/) {
1690 if (defined $item->[2]) {
1691 push @items, map [
1692 @$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]",
1693 ], @{ $structs{$item->[0]} };
1694 } else {
1695 push @items, @{ $structs{$item->[0]} };
1696 }
1697 } else {
1698 push @list, $item->[2];
1699 }
1700 }
b68ece06 1701 my $methods = (join '(...)>, C<', @list) . '(...)';
b7d5fa84 1702
b68ece06
IZ
1703 my $pod = <<"EOF";
1704#
1705#=head2 Object and class methods for C<$name>/C<$ptrname>
1706#
1707#The principal Perl representation of a C object of type C<$name> is an
1708#object of class C<$ptrname> which is a reference to an integer
1709#representation of a C pointer. To create such an object, one may use
1710#a combination
1711#
1712# my \$buffer = $name->new();
1713# my \$obj = \$buffer->_to_ptr();
1714#
1715#This exersizes the following two methods, and an additional class
1716#C<$name>, the internal representation of which is a reference to a
1717#packed string with the C structure. Keep in mind that \$buffer should
1718#better survive longer than \$obj.
1719#
1720#=over
1721#
1722#=item C<\$object_of_type_$name-E<gt>_to_ptr()>
1723#
1724#Converts an object of type C<$name> to an object of type C<$ptrname>.
1725#
1726#=item C<$name-E<gt>new()>
1727#
1728#Creates an empty object of type C<$name>. The corresponding packed
1729#string is zeroed out.
1730#
1731#=item C<$methods>
1732#
1733#return the current value of the corresponding element if called
1734#without additional arguments. Set the element to the supplied value
1735#(and return the new value) if called with an additional argument.
1736#
1737#Applicable to objects of type C<$ptrname>.
1738#
1739#=back
1740#
b7d5fa84 1741EOF
b68ece06
IZ
1742 $pod =~ s/^\#//gm;
1743 return $pod;
b7d5fa84
IZ
1744}
1745
5273d82d
IZ
1746# Should be called before any actual call to normalize_type().
1747sub get_typemap {
1748 # We do not want to read ./typemap by obvios reasons.
1749 my @tm = qw(../../../typemap ../../typemap ../typemap);
1750 my $stdtypemap = "$Config::Config{privlib}/ExtUtils/typemap";
1751 unshift @tm, $stdtypemap;
1752 my $proto_re = "[" . quotemeta('\$%&*@;') . "]" ;
ddf6bed1
IZ
1753
1754 # Start with useful default values
9cacc32e 1755 $typemap{float} = 'T_NV';
ddf6bed1 1756
3cb4da91 1757 foreach my $typemap (@tm) {
5273d82d
IZ
1758 next unless -e $typemap ;
1759 # skip directories, binary files etc.
1760 warn " Scanning $typemap\n";
66b6773e 1761 warn("Warning: ignoring non-text typemap file '$typemap'\n"), next
5273d82d 1762 unless -T $typemap ;
66b6773e 1763 open(TYPEMAP, $typemap)
5273d82d
IZ
1764 or warn ("Warning: could not open typemap file '$typemap': $!\n"), next;
1765 my $mode = 'Typemap';
1766 while (<TYPEMAP>) {
1767 next if /^\s*\#/;
1768 if (/^INPUT\s*$/) { $mode = 'Input'; next; }
1769 elsif (/^OUTPUT\s*$/) { $mode = 'Output'; next; }
1770 elsif (/^TYPEMAP\s*$/) { $mode = 'Typemap'; next; }
1771 elsif ($mode eq 'Typemap') {
1772 next if /^\s*($|\#)/ ;
3cb4da91 1773 my ($type, $image);
ddf6bed1 1774 if ( ($type, $image) =
5273d82d
IZ
1775 /^\s*(.*?\S)\s+(\S+)\s*($proto_re*)\s*$/o
1776 # This may reference undefined functions:
1777 and not ($image eq 'T_PACKED' and $typemap eq $stdtypemap)) {
ddf6bed1 1778 $typemap{normalize_type($type)} = $image;
5273d82d
IZ
1779 }
1780 }
1781 }
1782 close(TYPEMAP) or die "Cannot close $typemap: $!";
1783 }
1784 %std_types = %types_seen;
1785 %types_seen = ();
1786}
1787
ead2a595 1788
ddf6bed1 1789sub normalize_type { # Second arg: do not strip const's before \*
ead2a595 1790 my $type = shift;
3cb4da91
IZ
1791 my $do_keep_deep_const = shift;
1792 # If $do_keep_deep_const this is heuristical only
1793 my $keep_deep_const = ($do_keep_deep_const ? '\b(?![^(,)]*\*)' : '');
66b6773e 1794 my $ignore_mods
3cb4da91
IZ
1795 = "(?:\\b(?:(?:__const__|const)$keep_deep_const|static|inline|__inline__)\\b\\s*)*";
1796 if ($do_keep_deep_const) { # Keep different compiled /RExen/o separately!
1797 $type =~ s/$ignore_mods//go;
7aff18a2
GS
1798 }
1799 else {
3cb4da91
IZ
1800 $type =~ s/$ignore_mods//go;
1801 }
f1f595f5 1802 $type =~ s/([^\s\w])/ $1 /g;
ead2a595 1803 $type =~ s/\s+$//;
1804 $type =~ s/^\s+//;
ddf6bed1
IZ
1805 $type =~ s/\s+/ /g;
1806 $type =~ s/\* (?=\*)/*/g;
1807 $type =~ s/\. \. \./.../g;
1808 $type =~ s/ ,/,/g;
66b6773e 1809 $types_seen{$type}++
5273d82d 1810 unless $type eq '...' or $type eq 'void' or $std_types{$type};
ead2a595 1811 $type;
1812}
1813
ddf6bed1
IZ
1814my $need_opaque;
1815
1816sub assign_typemap_entry {
1817 my $type = shift;
1818 my $otype = $type;
1819 my $entry;
1820 if ($tmask and $type =~ /$tmask/) {
1821 print "Type $type matches -o mask\n" if $opt_d;
1822 $entry = (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ");
1823 }
1824 elsif ($typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1825 $type = normalize_type $type;
1826 print "Type mutation via typedefs: $otype ==> $type\n" if $opt_d;
1827 $entry = assign_typemap_entry($type);
1828 }
40292913
IZ
1829 # XXX good do better if our UV happens to be long long
1830 return "T_NV" if $type =~ /^(unsigned\s+)?long\s+(long|double)\z/;
ddf6bed1
IZ
1831 $entry ||= $typemap{$otype}
1832 || (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ");
1833 $typemap{$otype} = $entry;
1834 $need_opaque = 1 if $entry eq "T_OPAQUE_STRUCT";
1835 return $entry;
1836}
1837
32fb2b78
GS
1838for (@vdecls) {
1839 print_tievar_xsubs(\*XS, $_, $vdecl_hash{$_});
1840}
1841
ead2a595 1842if ($opt_x) {
32fb2b78
GS
1843 for my $decl (@$fdecls_parsed) { print_decl(\*XS, $decl) }
1844 if ($opt_a) {
1845 while (my($name, $struct) = each %structs) {
1846 print_accessors(\*XS, $name, $struct);
7c1d48a5 1847 }
32fb2b78 1848 }
ead2a595 1849}
1850
a0d0e21e 1851close XS;
5273d82d
IZ
1852
1853if (%types_seen) {
1854 my $type;
1855 warn "Writing $ext$modpname/typemap\n";
1856 open TM, ">typemap" or die "Cannot open typemap file for write: $!";
1857
3cb4da91 1858 for $type (sort keys %types_seen) {
ddf6bed1
IZ
1859 my $entry = assign_typemap_entry $type;
1860 print TM $type, "\t" x (5 - int((length $type)/8)), "\t$entry\n"
5273d82d
IZ
1861 }
1862
ddf6bed1
IZ
1863 print TM <<'EOP' if $need_opaque; # Older Perls do not have correct entry
1864#############################################################################
1865INPUT
1866T_OPAQUE_STRUCT
1867 if (sv_derived_from($arg, \"${ntype}\")) {
1868 STRLEN len;
1869 char *s = SvPV((SV*)SvRV($arg), len);
1870
1871 if (len != sizeof($var))
1872 croak(\"Size %d of packed data != expected %d\",
1873 len, sizeof($var));
1874 $var = *($type *)s;
1875 }
1876 else
1877 croak(\"$var is not of type ${ntype}\")
1878#############################################################################
1879OUTPUT
1880T_OPAQUE_STRUCT
1881 sv_setref_pvn($arg, \"${ntype}\", (char *)&$var, sizeof($var));
1882EOP
1883
5273d82d
IZ
1884 close TM or die "Cannot close typemap file for write: $!";
1885}
1886
2920c5d2 1887} # if( ! $opt_X )
e1666bf5 1888
8e07c86e
AD
1889warn "Writing $ext$modpname/Makefile.PL\n";
1890open(PL, ">Makefile.PL") || die "Can't create $ext$modpname/Makefile.PL: $!\n";
a0d0e21e 1891
fe0496b9 1892my $prereq_pm = '';
11946041
JS
1893
1894if ( $compat_version < 5.00702 and $new_test )
1895{
fe0496b9 1896 $prereq_pm .= q%'Test::More' => 0, %;
11946041 1897}
fe0496b9 1898
a34e0dd0 1899if ( $compat_version < 5.00600 and !$opt_X and $use_xsloader)
11946041 1900{
fe0496b9 1901 $prereq_pm .= q%'XSLoader' => 0, %;
11946041
JS
1902}
1903
9a7df4f2
NC
1904print PL <<"END";
1905use $compat_version;
a0d0e21e
LW
1906use ExtUtils::MakeMaker;
1907# See lib/ExtUtils/MakeMaker.pm for details of how to influence
42793c05 1908# the contents of the Makefile that is written.
8bc03d0d 1909WriteMakefile(
1dd73f27 1910 NAME => '$module',
4a660237 1911 VERSION_FROM => '$modpmname', # finds \$VERSION
1dd73f27
SB
1912 PREREQ_PM => {$prereq_pm}, # e.g., Module::Name => 1.1
1913 (\$] >= 5.005 ? ## Add these new keywords supported since 5.005
4a660237 1914 (ABSTRACT_FROM => '$modpmname', # retrieve abstract from module
1dd73f27 1915 AUTHOR => '$author <$email>') : ()),
a0d0e21e 1916END
8bc03d0d 1917if (!$opt_X) { # print C stuff, unless XS is disabled
ddf6bed1 1918 $opt_F = '' unless defined $opt_F;
b68ece06
IZ
1919 my $I = (((glob '*.h') || (glob '*.hh')) ? '-I.' : '');
1920 my $Ihelp = ($I ? '-I. ' : '');
1921 my $Icomment = ($I ? '' : <<EOC);
1922 # Insert -I. if you add *.h files later:
1923EOC
1924
8bc03d0d 1925 print PL <<END;
1dd73f27
SB
1926 LIBS => ['$extralibs'], # e.g., '-lm'
1927 DEFINE => '$opt_F', # e.g., '-DHAVE_SOMETHING'
1928$Icomment INC => '$I', # e.g., '${Ihelp}-I/usr/include/other'
b68ece06
IZ
1929END
1930
1cb0fb50 1931 my $C = grep {$_ ne "$modfname.c"}
9a7df4f2 1932 (glob '*.c'), (glob '*.cc'), (glob '*.C');
b68ece06
IZ
1933 my $Cpre = ($C ? '' : '# ');
1934 my $Ccomment = ($C ? '' : <<EOC);
1935 # Un-comment this if you add C files to link with later:
1936EOC
1937
1938 print PL <<END;
1dd73f27 1939$Ccomment ${Cpre}OBJECT => '\$(O_FILES)', # link all the C files too
8bc03d0d 1940END
9a7df4f2 1941} # ' # Grr
a0d0e21e 1942print PL ");\n";
9a7df4f2
NC
1943if (!$opt_c) {
1944 my $generate_code =
1cb0fb50
NC
1945 WriteMakefileSnippet ( C_FILE => $constscfname,
1946 XS_FILE => $constsxsfname,
9a7df4f2
NC
1947 DEFAULT_TYPE => $opt_t,
1948 NAME => $module,
1949 NAMES => \@const_names,
1950 );
1951 print PL <<"END";
1952if (eval {require ExtUtils::Constant; 1}) {
1953 # If you edit these definitions to change the constants used by this module,
1cb0fb50 1954 # you will need to use the generated $constscfname and $constsxsfname
9a7df4f2
NC
1955 # files to replace their "fallback" counterparts before distributing your
1956 # changes.
1957$generate_code
1958}
1959else {
1960 use File::Copy;
1cb0fb50
NC
1961 use File::Spec;
1962 foreach my \$file ('$constscfname', '$constsxsfname') {
1963 my \$fallback = File::Spec->catfile('$fallbackdirname', \$file);
1964 copy (\$fallback, \$file) or die "Can't copy \$fallback to \$file: \$!";
1965 }
9a7df4f2
NC
1966}
1967END
1968
1969 eval $generate_code;
1970 if ($@) {
1971 warn <<"EOM";
1972Attempting to test constant code in $ext$modpname/Makefile.PL:
1973$generate_code
1974__END__
1975gave unexpected error $@
1976Please report the circumstances of this bug in h2xs version $H2XS_VERSION
1977using the perlbug script.
1978EOM
1979 } else {
1980 my $fail;
1981
1cb0fb50
NC
1982 foreach my $file ($constscfname, $constsxsfname) {
1983 my $fallback = File::Spec->catfile($fallbackdirname, $file);
1984 if (compare($file, $fallback)) {
9a7df4f2 1985 warn << "EOM";
1cb0fb50 1986Files "$ext$modpname/$fallbackdirname/$file" and "$ext$modpname/$file" differ.
9a7df4f2
NC
1987EOM
1988 $fail++;
1989 }
1990 }
1991 if ($fail) {
1992 warn fill ('','', <<"EOM") . "\n";
1993It appears that the code in $ext$modpname/Makefile.PL does not autogenerate
1cb0fb50 1994the files $ext$modpname/$constscfname and $ext$modpname/$constsxsfname
9a7df4f2 1995correctly.
1cb0fb50 1996
9a7df4f2
NC
1997Please report the circumstances of this bug in h2xs version $H2XS_VERSION
1998using the perlbug script.
1999EOM
2000 } else {
1cb0fb50 2001 unlink $constscfname, $constsxsfname;
9a7df4f2
NC
2002 }
2003 }
2004}
f508c652 2005close(PL) || die "Can't close $ext$modpname/Makefile.PL: $!\n";
2006
fcd67389
TJ
2007# Create a simple README since this is a CPAN requirement
2008# and it doesnt hurt to have one
2009warn "Writing $ext$modpname/README\n";
2010open(RM, ">README") || die "Can't create $ext$modpname/README:$!\n";
2011my $thisyear = (gmtime)[5] + 1900;
2012my $rmhead = "$modpname version $TEMPLATE_VERSION";
2013my $rmheadeq = "=" x length($rmhead);
11946041
JS
2014
2015my $rm_prereq;
2016
2017if ( $compat_version < 5.00702 and $new_test )
2018{
2019 $rm_prereq = 'Test::More';
2020}
2021else
2022{
2023 $rm_prereq = 'blah blah blah';
2024}
2025
fcd67389
TJ
2026print RM <<_RMEND_;
2027$rmhead
2028$rmheadeq
2029
2030The README is used to introduce the module and provide instructions on
2031how to install the module, any machine dependencies it may have (for
2032example C compilers and installed libraries) and any other information
2033that should be provided before the module is installed.
2034
2035A README file is required for CPAN modules since CPAN extracts the
2036README file from a module distribution so that people browsing the
2037archive can use it get an idea of the modules uses. It is usually a
2038good idea to provide version information here so that people can
2039decide whether fixes for the module are worth downloading.
2040
2041INSTALLATION
2042
2043To install this module type the following:
2044
2045 perl Makefile.PL
2046 make
2047 make test
2048 make install
2049
2050DEPENDENCIES
2051
2052This module requires these other modules and libraries:
2053
11946041 2054 $rm_prereq
fcd67389
TJ
2055
2056COPYRIGHT AND LICENCE
2057
2058Put the correct copyright and licence information here.
2059
a42b7cd7 2060$licence
fcd67389
TJ
2061
2062_RMEND_
2063close(RM) || die "Can't close $ext$modpname/README: $!\n";
2064
1b99c731 2065my $testdir = "t";
4a660237 2066my $testfile = "$testdir/$modpname.t";
e42bd63e
JH
2067unless (-d "$testdir") {
2068 mkdir "$testdir" or die "Cannot mkdir $testdir: $!\n";
2069}
1b99c731 2070warn "Writing $ext$modpname/$testfile\n";
d3837a33
NC
2071my $tests = @const_names ? 2 : 1;
2072
1b99c731 2073open EX, ">$testfile" or die "Can't create $ext$modpname/$testfile: $!\n";
11946041 2074
d3837a33 2075print EX <<_END_;
f508c652 2076# Before `make install' is performed this script should be runnable with
4a660237 2077# `make test'. After `make install' it should work as `perl $modpname.t'
f508c652 2078
452e8205 2079#########################
f508c652 2080
d3837a33 2081# change 'tests => $tests' to 'tests => last_test_to_print';
f508c652 2082
11946041
JS
2083_END_
2084
2085my $test_mod = 'Test::More';
2086
2087if ( $old_test or ($compat_version < 5.007 and not $new_test ))
2088{
2089 my $test_mod = 'Test';
2090
2091 print EX <<_END_;
452e8205 2092use Test;
d3837a33 2093BEGIN { plan tests => $tests };
f508c652 2094use $module;
452e8205 2095ok(1); # If we made it this far, we're ok.
f508c652 2096
d3837a33 2097_END_
11946041
JS
2098
2099 if (@const_names) {
2100 my $const_names = join " ", @const_names;
2101 print EX <<'_END_';
d3837a33 2102
af6c647e
NC
2103my $fail;
2104foreach my $constname (qw(
2105_END_
11946041
JS
2106
2107 print EX wrap ("\t", "\t", $const_names);
2108 print EX (")) {\n");
2109
2110 print EX <<_END_;
d3837a33
NC
2111 next if (eval "my \\\$a = \$constname; 1");
2112 if (\$\@ =~ /^Your vendor has not defined $module macro \$constname/) {
2113 print "# pass: \$\@";
2114 } else {
2115 print "# fail: \$\@";
66b6773e 2116 \$fail = 1;
d3837a33
NC
2117 }
2118}
2119if (\$fail) {
2120 print "not ok 2\\n";
2121} else {
2122 print "ok 2\\n";
2123}
2124
2125_END_
11946041
JS
2126 }
2127}
2128else
2129{
2130 print EX <<_END_;
2131use Test::More tests => $tests;
2132BEGIN { use_ok('$module') };
2133
2134_END_
2135
2136 if (@const_names) {
2137 my $const_names = join " ", @const_names;
2138 print EX <<'_END_';
2139
2140my $fail = 0;
2141foreach my $constname (qw(
2142_END_
2143
2144 print EX wrap ("\t", "\t", $const_names);
2145 print EX (")) {\n");
2146
2147 print EX <<_END_;
2148 next if (eval "my \\\$a = \$constname; 1");
2149 if (\$\@ =~ /^Your vendor has not defined $module macro \$constname/) {
2150 print "# pass: \$\@";
2151 } else {
2152 print "# fail: \$\@";
2153 \$fail = 1;
2154 }
2155
2156}
2157
2158ok( \$fail == 0 , 'Constants' );
2159_END_
2160 }
d3837a33 2161}
11946041
JS
2162
2163print EX <<_END_;
452e8205 2164#########################
f508c652 2165
11946041
JS
2166# Insert your test code below, the $test_mod module is use()ed here so read
2167# its man page ( perldoc $test_mod ) for help writing this test script.
e1666bf5 2168
f508c652 2169_END_
11946041 2170
1b99c731 2171close(EX) || die "Can't close $ext$modpname/$testfile: $!\n";
a0d0e21e 2172
c0f8b9cd 2173unless ($opt_C) {
ddf6bed1
IZ
2174 warn "Writing $ext$modpname/Changes\n";
2175 $" = ' ';
2176 open(EX, ">Changes") || die "Can't create $ext$modpname/Changes: $!\n";
2177 @ARGS = map {/[\s\"\'\`\$*?^|&<>\[\]\{\}\(\)]/ ? "'$_'" : $_} @ARGS;
2178 print EX <<EOP;
2179Revision history for Perl extension $module.
2180
2181$TEMPLATE_VERSION @{[scalar localtime]}
2182\t- original version; created by h2xs $H2XS_VERSION with options
2183\t\t@ARGS
2184
2185EOP
2186 close(EX) || die "Can't close $ext$modpname/Changes: $!\n";
c0f8b9cd 2187}
c07a80fd 2188
2189warn "Writing $ext$modpname/MANIFEST\n";
5ae7f1db 2190open(MANI,'>MANIFEST') or die "Can't create MANIFEST: $!";
4a660237 2191my @files = grep { -f } (<*>, <t/*>, <$fallbackdirname/*>, <$modpmdir/*>);
5ae7f1db 2192if (!@files) {
2193 eval {opendir(D,'.');};
2194 unless ($@) { @files = readdir(D); closedir(D); }
2195}
2196if (!@files) { @files = map {chomp && $_} `ls`; }
55497cff 2197if ($^O eq 'VMS') {
2198 foreach (@files) {
2199 # Clip trailing '.' for portability -- non-VMS OSs don't expect it
2200 s%\.$%%;
2201 # Fix up for case-sensitive file systems
2202 s/$modfname/$modfname/i && next;
2203 $_ = "\U$_" if $_ eq 'manifest' or $_ eq 'changes';
bbce6d69 2204 $_ = 'Makefile.PL' if $_ eq 'makefile.pl';
55497cff 2205 }
2206}
3e3baf6d 2207print MANI join("\n",@files), "\n";
5ae7f1db 2208close MANI;
40000a8c 2209!NO!SUBS!
4633a7c4
LW
2210
2211close OUT or die "Can't close $file: $!";
2212chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
2213exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
8a5546a1 2214chdir $origdir;