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