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