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