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