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