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