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