A new try from Dave Mitchell for [perl #23265].
[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
65cf46c7 1235my ($email,$author);
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
c0f8b9cd 1251my $revhist = '';
1252$revhist = <<EOT if $opt_C;
497711e7 1253#
1254#=head1 HISTORY
1255#
1256#=over 8
1257#
1258#=item $TEMPLATE_VERSION
1259#
1260#Original version; created by h2xs $H2XS_VERSION with options
1261#
1262# @ARGS
1263#
1264#=back
1265#
c0f8b9cd 1266EOT
1267
dcb5229a 1268my $exp_doc = $skip_exporter ? '' : <<EOD;
497711e7 1269#
1270#=head2 EXPORT
1271#
1272#None by default.
1273#
ddf6bed1 1274EOD
b7d5fa84 1275
5273d82d 1276if (@const_names and not $opt_P) {
dcb5229a 1277 $exp_doc .= <<EOD unless $skip_exporter;
497711e7 1278#=head2 Exportable constants
1279#
1280# @{[join "\n ", @const_names]}
1281#
5273d82d 1282EOD
1283}
b7d5fa84 1284
5273d82d 1285if (defined $fdecls and @$fdecls and not $opt_P) {
dcb5229a 1286 $exp_doc .= <<EOD unless $skip_exporter;
497711e7 1287#=head2 Exportable functions
1288#
3cb4da91 1289EOD
b7d5fa84 1290
497711e7 1291# $exp_doc .= <<EOD if $opt_p;
1292#When accessing these functions from Perl, prefix C<$opt_p> should be removed.
1293#
b7d5fa84 1294#EOD
dcb5229a 1295 $exp_doc .= <<EOD unless $skip_exporter;
497711e7 1296# @{[join "\n ", @known_fnames{@fnames}]}
1297#
5273d82d 1298EOD
1299}
1300
b7d5fa84 1301my $meth_doc = '';
1302
1303if ($opt_x && $opt_a) {
1304 my($name, $struct);
1305 $meth_doc .= accessor_docs($name, $struct)
1306 while ($name, $struct) = each %structs;
1307}
1308
3cb4da91 1309my $pod = <<"END" unless $opt_P;
973ae360 1310## Below is stub documentation for your module. You'd better edit it!
f508c652 1311#
1312#=head1 NAME
1313#
1314#$module - Perl extension for blah blah blah
1315#
1316#=head1 SYNOPSIS
1317#
1318# use $module;
1319# blah blah blah
1320#
1321#=head1 DESCRIPTION
1322#
7aff18a2 1323#Stub documentation for $module, created by h2xs. It looks like the
f508c652 1324#author of the extension was negligent enough to leave the stub
1325#unedited.
1326#
1327#Blah blah blah.
b7d5fa84 1328$exp_doc$meth_doc$revhist
f508c652 1329#
09c48e64 1330#=head1 SEE ALSO
f508c652 1331#
09c48e64 1332#Mention other useful documentation such as the documentation of
1333#related modules or operating system documentation (such as man pages
1334#in UNIX), or any relevant external documentation such as RFCs or
1335#standards.
e8f26592 1336#
1337#If you have a mailing list set up for your module, mention it here.
1338#
09c48e64 1339#If you have a web site set up for your module, mention it here.
1340#
1341#=head1 AUTHOR
1342#
1343#$author, E<lt>${email}E<gt>
1344#
e8f26592 1345#=head1 COPYRIGHT AND LICENSE
1346#
380e3302 1347#Copyright ${\(1900 + (localtime) [5])} by $author
e8f26592 1348#
1349#This library is free software; you can redistribute it and/or modify
1350#it under the same terms as Perl itself.
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;
1620 }
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";
1753 warn("Warning: ignoring non-text typemap file '$typemap'\n"), next
1754 unless -T $typemap ;
1755 open(TYPEMAP, $typemap)
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(?![^(,)]*\*)' : '');
ddf6bed1 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;
5273d82d 1801 $types_seen{$type}++
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',
1902 VERSION_FROM => '$modfname.pm', # finds \$VERSION
1903 PREREQ_PM => {$prereq_pm}, # e.g., Module::Name => 1.1
1904 (\$] >= 5.005 ? ## Add these new keywords supported since 5.005
1905 (ABSTRACT_FROM => '$modfname.pm', # retrieve abstract from module
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
ff1a6a48 2051Copyright (C) $thisyear $author
2052
2053This library is free software; you can redistribute it and/or modify
2054it under the same terms as Perl itself.
fcd67389 2055
2056_RMEND_
2057close(RM) || die "Can't close $ext$modpname/README: $!\n";
2058
1b99c731 2059my $testdir = "t";
2060my $testfile = "$testdir/1.t";
e42bd63e 2061unless (-d "$testdir") {
2062 mkdir "$testdir" or die "Cannot mkdir $testdir: $!\n";
2063}
1b99c731 2064warn "Writing $ext$modpname/$testfile\n";
d3837a33 2065my $tests = @const_names ? 2 : 1;
2066
1b99c731 2067open EX, ">$testfile" or die "Can't create $ext$modpname/$testfile: $!\n";
11946041 2068
d3837a33 2069print EX <<_END_;
f508c652 2070# Before `make install' is performed this script should be runnable with
1b99c731 2071# `make test'. After `make install' it should work as `perl 1.t'
f508c652 2072
452e8205 2073#########################
f508c652 2074
d3837a33 2075# change 'tests => $tests' to 'tests => last_test_to_print';
f508c652 2076
11946041 2077_END_
2078
2079my $test_mod = 'Test::More';
2080
2081if ( $old_test or ($compat_version < 5.007 and not $new_test ))
2082{
2083 my $test_mod = 'Test';
2084
2085 print EX <<_END_;
452e8205 2086use Test;
d3837a33 2087BEGIN { plan tests => $tests };
f508c652 2088use $module;
452e8205 2089ok(1); # If we made it this far, we're ok.
f508c652 2090
d3837a33 2091_END_
11946041 2092
2093 if (@const_names) {
2094 my $const_names = join " ", @const_names;
2095 print EX <<'_END_';
d3837a33 2096
af6c647e 2097my $fail;
2098foreach my $constname (qw(
2099_END_
11946041 2100
2101 print EX wrap ("\t", "\t", $const_names);
2102 print EX (")) {\n");
2103
2104 print EX <<_END_;
d3837a33 2105 next if (eval "my \\\$a = \$constname; 1");
2106 if (\$\@ =~ /^Your vendor has not defined $module macro \$constname/) {
2107 print "# pass: \$\@";
2108 } else {
2109 print "# fail: \$\@";
2110 \$fail = 1;
2111 }
2112}
2113if (\$fail) {
2114 print "not ok 2\\n";
2115} else {
2116 print "ok 2\\n";
2117}
2118
2119_END_
11946041 2120 }
2121}
2122else
2123{
2124 print EX <<_END_;
2125use Test::More tests => $tests;
2126BEGIN { use_ok('$module') };
2127
2128_END_
2129
2130 if (@const_names) {
2131 my $const_names = join " ", @const_names;
2132 print EX <<'_END_';
2133
2134my $fail = 0;
2135foreach my $constname (qw(
2136_END_
2137
2138 print EX wrap ("\t", "\t", $const_names);
2139 print EX (")) {\n");
2140
2141 print EX <<_END_;
2142 next if (eval "my \\\$a = \$constname; 1");
2143 if (\$\@ =~ /^Your vendor has not defined $module macro \$constname/) {
2144 print "# pass: \$\@";
2145 } else {
2146 print "# fail: \$\@";
2147 \$fail = 1;
2148 }
2149
2150}
2151
2152ok( \$fail == 0 , 'Constants' );
2153_END_
2154 }
d3837a33 2155}
11946041 2156
2157print EX <<_END_;
452e8205 2158#########################
f508c652 2159
11946041 2160# Insert your test code below, the $test_mod module is use()ed here so read
2161# its man page ( perldoc $test_mod ) for help writing this test script.
e1666bf5 2162
f508c652 2163_END_
11946041 2164
1b99c731 2165close(EX) || die "Can't close $ext$modpname/$testfile: $!\n";
a0d0e21e 2166
c0f8b9cd 2167unless ($opt_C) {
ddf6bed1 2168 warn "Writing $ext$modpname/Changes\n";
2169 $" = ' ';
2170 open(EX, ">Changes") || die "Can't create $ext$modpname/Changes: $!\n";
2171 @ARGS = map {/[\s\"\'\`\$*?^|&<>\[\]\{\}\(\)]/ ? "'$_'" : $_} @ARGS;
2172 print EX <<EOP;
2173Revision history for Perl extension $module.
2174
2175$TEMPLATE_VERSION @{[scalar localtime]}
2176\t- original version; created by h2xs $H2XS_VERSION with options
2177\t\t@ARGS
2178
2179EOP
2180 close(EX) || die "Can't close $ext$modpname/Changes: $!\n";
c0f8b9cd 2181}
c07a80fd 2182
2183warn "Writing $ext$modpname/MANIFEST\n";
5ae7f1db 2184open(MANI,'>MANIFEST') or die "Can't create MANIFEST: $!";
1cb0fb50 2185my @files = grep { -f } (<*>, <t/*>, <$fallbackdirname/*>);
5ae7f1db 2186if (!@files) {
2187 eval {opendir(D,'.');};
2188 unless ($@) { @files = readdir(D); closedir(D); }
2189}
2190if (!@files) { @files = map {chomp && $_} `ls`; }
55497cff 2191if ($^O eq 'VMS') {
2192 foreach (@files) {
2193 # Clip trailing '.' for portability -- non-VMS OSs don't expect it
2194 s%\.$%%;
2195 # Fix up for case-sensitive file systems
2196 s/$modfname/$modfname/i && next;
2197 $_ = "\U$_" if $_ eq 'manifest' or $_ eq 'changes';
bbce6d69 2198 $_ = 'Makefile.PL' if $_ eq 'makefile.pl';
55497cff 2199 }
2200}
3e3baf6d 2201print MANI join("\n",@files), "\n";
5ae7f1db 2202close MANI;
40000a8c 2203!NO!SUBS!
4633a7c4 2204
2205close OUT or die "Can't close $file: $!";
2206chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
2207exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
8a5546a1 2208chdir $origdir;