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