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