source: trunk/third/perl/utils/h2xs.PL @ 14545

Revision 14545, 39.6 KB checked in by ghudson, 24 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r14544, which included commits to RCS files with non-trunk default branches.
Line 
1#!/usr/local/bin/perl
2
3use Config;
4use File::Basename qw(&basename &dirname);
5use Cwd;
6
7# List explicitly here the variables you want Configure to
8# generate.  Metaconfig only looks for shell variables, so you
9# have to mention them as if they were shell variables, not
10# %Config entries.  Thus you write
11#  $startperl
12# to ensure Configure will look for $Config{startperl}.
13
14# This forces PL files to create target in same directory as PL file.
15# This is so that make depend always knows where to find PL derivatives.
16$origdir = cwd;
17chdir dirname($0);
18$file = basename($0, '.PL');
19$file .= '.com' if $^O eq 'VMS';
20
21open OUT,">$file" or die "Can't create $file: $!";
22
23print "Extracting $file (with variable substitutions)\n";
24
25# In this section, perl variables will be expanded during extraction.
26# You can use $Config{...} to use Configure variables.
27
28print OUT <<"!GROK!THIS!";
29$Config{startperl}
30    eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
31        if \$running_under_some_shell;
32!GROK!THIS!
33
34# In the following, perl variables are not expanded during extraction.
35
36print OUT <<'!NO!SUBS!';
37
38=head1 NAME
39
40h2xs - convert .h C header files to Perl extensions
41
42=head1 SYNOPSIS
43
44B<h2xs> [B<-ACOPXcdf>] [B<-v> version] [B<-n> module_name] [B<-p> prefix] [B<-s> sub] [headerfile ... [extra_libraries]]
45
46B<h2xs> B<-h>
47
48=head1 DESCRIPTION
49
50I<h2xs> builds a Perl extension from C header files.  The extension
51will include functions which can be used to retrieve the value of any
52#define statement which was in the C header files.
53
54The I<module_name> will be used for the name of the extension.  If
55module_name is not supplied then the name of the first header file
56will be used, with the first character capitalized.
57
58If the extension might need extra libraries, they should be included
59here.  The extension Makefile.PL will take care of checking whether
60the libraries actually exist and how they should be loaded.
61The extra libraries should be specified in the form -lm -lposix, etc,
62just as on the cc command line.  By default, the Makefile.PL will
63search through the library path determined by Configure.  That path
64can be augmented by including arguments of the form B<-L/another/library/path>
65in the extra-libraries argument.
66
67=head1 OPTIONS
68
69=over 5
70
71=item B<-A>
72
73Omit all autoload facilities.  This is the same as B<-c> but also removes the
74S<C<use AutoLoader>> statement from the .pm file.
75
76=item B<-C>
77
78Omits creation of the F<Changes> file, and adds a HISTORY section to
79the POD template.
80
81=item B<-F>
82
83Additional flags to specify to C preprocessor when scanning header for
84function declarations.  Should not be used without B<-x>.
85
86=item B<-M> I<regular expression>
87
88selects functions/macros to process.
89
90=item B<-O>
91
92Allows a pre-existing extension directory to be overwritten.
93
94=item B<-P>
95
96Omit the autogenerated stub POD section.
97
98=item B<-X>
99
100Omit the XS portion.  Used to generate templates for a module which is not
101XS-based.  C<-c> and C<-f> are implicitly enabled.
102
103=item B<-a>
104
105Generate an accessor method for each element of structs and unions. The
106generated methods are named after the element name; will return the current
107value of the element if called without additional arguments; and will set
108the element to the supplied value (and return the new value) if called with
109an additional argument. Embedded structures and unions are returned as a
110pointer rather than the complete structure, to facilitate chained calls.
111
112These methods all apply to the Ptr type for the structure; additionally
113two methods are constructed for the structure type itself, C<_to_ptr>
114which returns a Ptr type pointing to the same structure, and a C<new>
115method to construct and return a new structure, initialised to zeroes.
116
117=item B<-c>
118
119Omit C<constant()> from the .xs file and corresponding specialised
120C<AUTOLOAD> from the .pm file.
121
122=item B<-d>
123
124Turn on debugging messages.
125
126=item B<-f>
127
128Allows an extension to be created for a header even if that header is
129not found in standard include directories.
130
131=item B<-h>
132
133Print the usage, help and version for this h2xs and exit.
134
135=item B<-k>
136
137For function arguments declared as C<const>, omit the const attribute in the
138generated XS code.
139
140=item B<-m>
141
142B<Experimental>: for each variable declared in the header file(s), declare
143a perl variable of the same name magically tied to the C variable.
144
145=item B<-n> I<module_name>
146
147Specifies a name to be used for the extension, e.g., S<-n RPC::DCE>
148
149=item B<-o> I<regular expression>
150
151Use "opaque" data type for the C types matched by the regular
152expression, even if these types are C<typedef>-equivalent to types
153from typemaps.  Should not be used without B<-x>.
154
155This may be useful since, say, types which are C<typedef>-equivalent
156to integers may represent OS-related handles, and one may want to work
157with these handles in OO-way, as in C<$handle-E<gt>do_something()>.
158Use C<-o .> if you want to handle all the C<typedef>ed types as opaque types.
159
160The type-to-match is whitewashed (except for commas, which have no
161whitespace before them, and multiple C<*> which have no whitespace
162between them).
163
164=item B<-p> I<prefix>
165
166Specify a prefix which should be removed from the Perl function names, e.g., S<-p sec_rgy_>
167This sets up the XS B<PREFIX> keyword and removes the prefix from functions that are
168autoloaded via the C<constant()> mechanism.
169
170=item B<-s> I<sub1,sub2>
171
172Create a perl subroutine for the specified macros rather than autoload with the constant() subroutine.
173These macros are assumed to have a return type of B<char *>, e.g., S<-s sec_rgy_wildcard_name,sec_rgy_wildcard_sid>.
174
175=item B<-v> I<version>
176
177Specify a version number for this extension.  This version number is added
178to the templates.  The default is 0.01.
179
180=item B<-x>
181
182Automatically generate XSUBs basing on function declarations in the
183header file.  The package C<C::Scan> should be installed. If this
184option is specified, the name of the header file may look like
185C<NAME1,NAME2>. In this case NAME1 is used instead of the specified string,
186but XSUBs are emitted only for the declarations included from file NAME2.
187
188Note that some types of arguments/return-values for functions may
189result in XSUB-declarations/typemap-entries which need
190hand-editing. Such may be objects which cannot be converted from/to a
191pointer (like C<long long>), pointers to functions, or arrays.  See
192also the section on L<LIMITATIONS of B<-x>>.
193
194=back
195
196=head1 EXAMPLES
197
198
199        # Default behavior, extension is Rusers
200        h2xs rpcsvc/rusers
201
202        # Same, but extension is RUSERS
203        h2xs -n RUSERS rpcsvc/rusers
204
205        # Extension is rpcsvc::rusers. Still finds <rpcsvc/rusers.h>
206        h2xs rpcsvc::rusers
207
208        # Extension is ONC::RPC.  Still finds <rpcsvc/rusers.h>
209        h2xs -n ONC::RPC rpcsvc/rusers
210
211        # Without constant() or AUTOLOAD
212        h2xs -c rpcsvc/rusers
213
214        # Creates templates for an extension named RPC
215        h2xs -cfn RPC
216
217        # Extension is ONC::RPC.
218        h2xs -cfn ONC::RPC
219
220        # Makefile.PL will look for library -lrpc in
221        # additional directory /opt/net/lib
222        h2xs rpcsvc/rusers -L/opt/net/lib -lrpc
223
224        # Extension is DCE::rgynbase
225        # prefix "sec_rgy_" is dropped from perl function names
226        h2xs -n DCE::rgynbase -p sec_rgy_ dce/rgynbase
227
228        # Extension is DCE::rgynbase
229        # prefix "sec_rgy_" is dropped from perl function names
230        # subroutines are created for sec_rgy_wildcard_name and sec_rgy_wildcard_sid
231        h2xs -n DCE::rgynbase -p sec_rgy_ \
232        -s sec_rgy_wildcard_name,sec_rgy_wildcard_sid dce/rgynbase
233
234        # Make XS without defines in perl.h, but with function declarations
235        # visible from perl.h. Name of the extension is perl1.
236        # When scanning perl.h, define -DEXT=extern -DdEXT= -DINIT(x)=
237        # Extra backslashes below because the string is passed to shell.
238        # Note that a directory with perl header files would
239        #  be added automatically to include path.
240        h2xs -xAn perl1 -F "-DEXT=extern -DdEXT= -DINIT\(x\)=" perl.h
241
242        # Same with function declaration in proto.h as visible from perl.h.
243        h2xs -xAn perl2 perl.h,proto.h
244
245        # Same but select only functions which match /^av_/
246        h2xs -M '^av_' -xAn perl2 perl.h,proto.h
247
248        # Same but treat SV* etc as "opaque" types
249        h2xs -o '^[S]V \*$' -M '^av_' -xAn perl2 perl.h,proto.h
250
251=head1 ENVIRONMENT
252
253No environment variables are used.
254
255=head1 AUTHOR
256
257Larry Wall and others
258
259=head1 SEE ALSO
260
261L<perl>, L<perlxstut>, L<ExtUtils::MakeMaker>, and L<AutoLoader>.
262
263=head1 DIAGNOSTICS
264
265The usual warnings if it cannot read or write the files involved.
266
267=head1 LIMITATIONS of B<-x>
268
269F<h2xs> would not distinguish whether an argument to a C function
270which is of the form, say, C<int *>, is an input, output, or
271input/output parameter.  In particular, argument declarations of the
272form
273
274    int
275    foo(n)
276        int *n
277
278should be better rewritten as
279
280    int
281    foo(n)
282        int &n
283
284if C<n> is an input parameter.
285
286Additionally, F<h2xs> has no facilities to intuit that a function
287
288   int
289   foo(addr,l)
290        char *addr
291        int   l
292
293takes a pair of address and length of data at this address, so it is better
294to rewrite this function as
295
296    int
297    foo(sv)
298            SV *addr
299        PREINIT:
300            STRLEN len;
301            char *s;
302        CODE:
303            s = SvPV(sv,len);
304            RETVAL = foo(s, len);
305        OUTPUT:
306            RETVAL
307
308or alternately
309
310    static int
311    my_foo(SV *sv)
312    {
313        STRLEN len;
314        char *s = SvPV(sv,len);
315
316        return foo(s, len);
317    }
318
319    MODULE = foo        PACKAGE = foo   PREFIX = my_
320
321    int
322    foo(sv)
323        SV *sv
324
325See L<perlxs> and L<perlxstut> for additional details.
326
327=cut
328
329use strict;
330
331
332my( $H2XS_VERSION ) = ' $Revision: 1.1.1.2 $ ' =~ /\$Revision:\s+([^\s]+)/;
333my $TEMPLATE_VERSION = '0.01';
334my @ARGS = @ARGV;
335
336use Getopt::Std;
337
338sub usage{
339        warn "@_\n" if @_;
340    die "h2xs [-ACOPXcdfh] [-v version] [-n module_name] [-p prefix] [-s subs] [headerfile [extra_libraries]]
341version: $H2XS_VERSION
342    -A   Omit all autoloading facilities (implies -c).
343    -C   Omit creating the Changes file, add HISTORY heading to stub POD.
344    -F   Additional flags for C preprocessor (used with -x).
345    -M   Mask to select C functions/macros (default is select all).
346    -O   Allow overwriting of a pre-existing extension directory.
347    -P   Omit the stub POD section.
348    -X   Omit the XS portion (implies both -c and -f).
349    -a   Generate get/set accessors for struct and union members (used with -x).
350    -c   Omit the constant() function and specialised AUTOLOAD from the XS file.
351    -d   Turn on debugging messages.
352    -f   Force creation of the extension even if the C header does not exist.
353    -h   Display this help message
354    -k   Omit 'const' attribute on function arguments (used with -x).
355    -m   Generate tied variables for access to declared variables.
356    -n   Specify a name to use for the extension (recommended).
357    -o   Regular expression for \"opaque\" types.
358    -p   Specify a prefix which should be removed from the Perl function names.
359    -s   Create subroutines for specified macros.
360    -v   Specify a version number for this extension.
361    -x   Autogenerate XSUBs using C::Scan.
362extra_libraries
363         are any libraries that might be needed for loading the
364         extension, e.g. -lm would try to link in the math library.
365";
366}
367
368
369getopts("ACF:M:OPXacdfhkmn:o:p:s:v:x") || usage;
370use vars qw($opt_A $opt_C $opt_F $opt_M $opt_O $opt_P $opt_X $opt_a $opt_c $opt_d
371            $opt_f $opt_h $opt_k $opt_m $opt_n $opt_o $opt_p $opt_s $opt_v $opt_x);
372
373usage if $opt_h;
374
375if( $opt_v ){
376        $TEMPLATE_VERSION = $opt_v;
377}
378
379# -A implies -c.
380$opt_c = 1 if $opt_A;
381
382# -X implies -c and -f
383$opt_c = $opt_f = 1 if $opt_X;
384
385my %const_xsub = map { $_,1 } split(/,+/, $opt_s) if $opt_s;
386my $extralibs;
387my @path_h;
388
389while (my $arg = shift) {
390    if ($arg =~ /^-l/i) {
391        $extralibs = "$arg @ARGV";
392        last;
393    }
394    push(@path_h, $arg);
395}
396
397usage "Must supply header file or module name\n"
398        unless (@path_h or $opt_n);
399
400my $fmask;
401my $tmask;
402
403$fmask = qr{$opt_M} if defined $opt_M;
404$tmask = qr{$opt_o} if defined $opt_o;
405my $tmask_all = $tmask && $opt_o eq '.';
406
407if ($opt_x) {
408  eval {require C::Scan; 1}
409    or die <<EOD;
410C::Scan required if you use -x option.
411To install C::Scan, execute
412   perl -MCPAN -e "install C::Scan"
413EOD
414  unless ($tmask_all) {
415    $C::Scan::VERSION >= 0.70
416      or die <<EOD;
417C::Scan v. 0.70 or later required unless you use -o . option.
418You have version $C::Scan::VERSION installed as $INC{'C/Scan.pm'}.
419To install C::Scan, execute
420   perl -MCPAN -e "install C::Scan"
421EOD
422  }
423  if (($opt_m || $opt_a) && $C::Scan::VERSION < 0.73) {
424    die <<EOD;
425C::Scan v. 0.73 or later required to use -m or -a options.
426You have version $C::Scan::VERSION installed as $INC{'C/Scan.pm'}.
427To install C::Scan, execute
428   perl -MCPAN -e "install C::Scan"
429EOD
430  }
431}
432elsif ($opt_o or $opt_F) {
433  warn <<EOD;
434Options -o and -F do not make sense without -x.
435EOD
436}
437
438my @path_h_ini = @path_h;
439my ($name, %fullpath, %prefix, %seen_define, %prefixless, %const_names);
440
441if( @path_h ){
442    use Config;
443    use File::Spec;
444    my @paths;
445    if ($^O eq 'VMS') {  # Consider overrides of default location
446      # XXXX This is not equivalent to what the older version did:
447      #         it was looking at $hadsys header-file per header-file...
448      my($hadsys) = grep s!^sys/!!i , @path_h;
449      @paths = qw( Sys$Library VAXC$Include );
450      push @paths, ($hadsys ? 'GNU_CC_Include[vms]' : 'GNU_CC_Include[000000]');
451      push @paths, qw( DECC$Library_Include DECC$System_Include );
452    }
453    else {
454      @paths = (File::Spec->curdir(), $Config{usrinc},
455                (split ' ', $Config{locincpth}), '/usr/include');
456    }
457    foreach my $path_h (@path_h) {
458        $name ||= $path_h;
459    if( $path_h =~ s#::#/#g && $opt_n ){
460        warn "Nesting of headerfile ignored with -n\n";
461    }
462    $path_h .= ".h" unless $path_h =~ /\.h$/;
463    my $fullpath = $path_h;
464    $path_h =~ s/,.*$// if $opt_x;
465    $fullpath{$path_h} = $fullpath;
466
467    if (not -f $path_h) {
468      my $tmp_path_h = $path_h;
469      for my $dir (@paths) {
470        last if -f ($path_h = File::Spec->catfile($dir, $tmp_path_h));
471      }
472    }
473
474    if (!$opt_c) {
475      die "Can't find $path_h\n" if ( ! $opt_f && ! -f $path_h );
476      # Scan the header file (we should deal with nested header files)
477      # Record the names of simple #define constants into const_names
478            # Function prototypes are processed below.
479      open(CH, "<$path_h") || die "Can't open $path_h: $!\n";
480    defines:
481      while (<CH>) {
482        if (/^[ \t]*#[ \t]*define\s+([\$\w]+)\b(?!\()\s*(?=[^" \t])(.*)/) {
483            my $def = $1;
484            my $rest = $2;
485            $rest =~ s!/\*.*?(\*/|\n)|//.*!!g; # Remove comments
486            $rest =~ s/^\s+//;
487            $rest =~ s/\s+$//;
488            # Cannot do: (-1) and ((LHANDLE)3) are OK:
489            #print("Skip non-wordy $def => $rest\n"),
490            #  next defines if $rest =~ /[^\w\$]/;
491            if ($rest =~ /"/) {
492              print("Skip stringy $def => $rest\n") if $opt_d;
493              next defines;
494            }
495            print "Matched $_ ($def)\n" if $opt_d;
496            $seen_define{$def} = $rest;
497            $_ = $def;
498            next if /^_.*_h_*$/i; # special case, but for what?
499            if (defined $opt_p) {
500              if (!/^$opt_p(\d)/) {
501                ++$prefix{$_} if s/^$opt_p//;
502              }
503              else {
504                warn "can't remove $opt_p prefix from '$_'!\n";
505              }
506            }
507            $prefixless{$def} = $_;
508            if (!$fmask or /$fmask/) {
509                print "... Passes mask of -M.\n" if $opt_d and $fmask;
510                $const_names{$_}++;
511            }
512          }
513      }
514      close(CH);
515    }
516    }
517}
518
519
520my $module = $opt_n || do {
521        $name =~ s/\.h$//;
522        if( $name !~ /::/ ){
523                $name =~ s#^.*/##;
524                $name = "\u$name";
525        }
526        $name;
527};
528
529my ($ext, $nested, @modparts, $modfname, $modpname);
530(chdir 'ext', $ext = 'ext/') if -d 'ext';
531
532if( $module =~ /::/ ){
533        $nested = 1;
534        @modparts = split(/::/,$module);
535        $modfname = $modparts[-1];
536        $modpname = join('/',@modparts);
537}
538else {
539        $nested = 0;
540        @modparts = ();
541        $modfname = $modpname = $module;
542}
543
544
545if ($opt_O) {
546        warn "Overwriting existing $ext$modpname!!!\n" if -e $modpname;
547}
548else {
549        die "Won't overwrite existing $ext$modpname\n" if -e $modpname;
550}
551if( $nested ){
552        my $modpath = "";
553        foreach (@modparts){
554                mkdir("$modpath$_", 0777);
555                $modpath .= "$_/";
556        }
557}
558mkdir($modpname, 0777);
559chdir($modpname) || die "Can't chdir $ext$modpname: $!\n";
560
561my %types_seen;
562my %std_types;
563my $fdecls = [];
564my $fdecls_parsed = [];
565my $typedef_rex;
566my %typedefs_pre;
567my %known_fnames;
568my %structs;
569
570my @fnames;
571my @fnames_no_prefix;
572my %vdecl_hash;
573my @vdecls;
574
575if( ! $opt_X ){  # use XS, unless it was disabled
576  open(XS, ">$modfname.xs") || die "Can't create $ext$modpname/$modfname.xs: $!\n";
577  if ($opt_x) {
578    require Config;             # Run-time directive
579    warn "Scanning typemaps...\n";
580    get_typemap();
581    my @td;
582    my @good_td;
583    my $addflags = $opt_F || '';
584
585    foreach my $filename (@path_h) {
586      my $c;
587      my $filter;
588
589      if ($fullpath{$filename} =~ /,/) {
590        $filename = $`;
591        $filter = $';
592      }
593      warn "Scanning $filename for functions...\n";
594      $c = new C::Scan 'filename' => $filename, 'filename_filter' => $filter,
595        'add_cppflags' => $addflags, 'c_styles' => [qw(C++ C9X)];
596      $c->set('includeDirs' => ["$Config::Config{archlib}/CORE"]);
597
598      push @$fdecls_parsed, @{ $c->get('parsed_fdecls') };
599      push(@$fdecls, @{$c->get('fdecls')});
600
601      push @td, @{$c->get('typedefs_maybe')};
602      if ($opt_a) {
603        my $structs = $c->get('typedef_structs');
604        @structs{keys %$structs} = values %$structs;
605      }
606
607      if ($opt_m) {
608        %vdecl_hash = %{ $c->get('vdecl_hash') };
609        @vdecls = sort keys %vdecl_hash;
610        for (local $_ = 0; $_ < @vdecls; ++$_) {
611          my $var = $vdecls[$_];
612          my($type, $post) = @{ $vdecl_hash{$var} };
613          if (defined $post) {
614            warn "Can't handle variable '$type $var $post', skipping.\n";
615            splice @vdecls, $_, 1;
616            redo;
617          }
618          $type = normalize_type($type);
619          $vdecl_hash{$var} = $type;
620        }
621      }
622
623      unless ($tmask_all) {
624        warn "Scanning $filename for typedefs...\n";
625        my $td = $c->get('typedef_hash');
626        # eval {require 'dumpvar.pl'; ::dumpValue($td)} or warn $@ if $opt_d;
627        my @f_good_td = grep $td->{$_}[1] eq '', keys %$td;
628        push @good_td, @f_good_td;
629        @typedefs_pre{@f_good_td}  = map $_->[0], @$td{@f_good_td};
630      }
631    }
632    { local $" = '|';
633      $typedef_rex = qr(\b(?<!struct )(?:@good_td)\b) if @good_td;
634    }
635    %known_fnames = map @$_[1,3], @$fdecls_parsed; # [1,3] is NAME, FULLTEXT
636    if ($fmask) {
637      my @good;
638      for my $i (0..$#$fdecls_parsed) {
639        next unless $fdecls_parsed->[$i][1] =~ /$fmask/; # [1] is NAME
640        push @good, $i;
641        print "... Function $fdecls_parsed->[$i][1] passes -M mask.\n"
642          if $opt_d;
643      }
644      $fdecls = [@$fdecls[@good]];
645      $fdecls_parsed = [@$fdecls_parsed[@good]];
646    }
647    @fnames = sort map $_->[1], @$fdecls_parsed; # 1 is NAME
648    # Sort declarations:
649    {
650      my %h = map( ($_->[1], $_), @$fdecls_parsed);
651      $fdecls_parsed = [ @h{@fnames} ];
652    }
653    @fnames_no_prefix = @fnames;
654    @fnames_no_prefix
655      = sort map { ++$prefix{$_} if s/^$opt_p(?!\d)//; $_ } @fnames_no_prefix;
656    # Remove macros which expand to typedefs
657    print "Typedefs are @td.\n" if $opt_d;
658    my %td = map {($_, $_)} @td;
659    # Add some other possible but meaningless values for macros
660    for my $k (qw(char double float int long short unsigned signed void)) {
661      $td{"$_$k"} = "$_$k" for ('', 'signed ', 'unsigned ');
662    }
663    # eval {require 'dumpvar.pl'; ::dumpValue( [\@td, \%td] ); 1} or warn $@;
664    my $n = 0;
665    my %bad_macs;
666    while (keys %td > $n) {
667      $n = keys %td;
668      my ($k, $v);
669      while (($k, $v) = each %seen_define) {
670        # print("found '$k'=>'$v'\n"),
671        $bad_macs{$k} = $td{$k} = $td{$v} if exists $td{$v};
672      }
673    }
674    # Now %bad_macs contains names of bad macros
675    for my $k (keys %bad_macs) {
676      delete $const_names{$prefixless{$k}};
677      print "Ignoring macro $k which expands to a typedef name '$bad_macs{$k}'\n" if $opt_d;
678    }
679  }
680}
681my @const_names = sort keys %const_names;
682
683open(PM, ">$modfname.pm") || die "Can't create $ext$modpname/$modfname.pm: $!\n";
684
685$" = "\n\t";
686warn "Writing $ext$modpname/$modfname.pm\n";
687
688print PM <<"END";
689package $module;
690
691require 5.005_62;
692use strict;
693use warnings;
694END
695
696unless( $opt_X || $opt_c || $opt_A ){
697        # we'll have an AUTOLOAD(), and it will have $AUTOLOAD and
698        # will want Carp.
699        print PM <<'END';
700use Carp;
701END
702}
703
704print PM <<'END';
705
706require Exporter;
707END
708
709print PM <<"END" if ! $opt_X;  # use DynaLoader, unless XS was disabled
710require DynaLoader;
711END
712
713
714# Are we using AutoLoader or not?
715unless ($opt_A) { # no autoloader whatsoever.
716        unless ($opt_c) { # we're doing the AUTOLOAD
717                print PM "use AutoLoader;\n";
718        }
719        else {
720                print PM "use AutoLoader qw(AUTOLOAD);\n"
721        }
722}
723
724# Determine @ISA.
725my $myISA = 'our @ISA = qw(Exporter';   # We seem to always want this.
726$myISA .= ' DynaLoader'         unless $opt_X;  # no XS
727$myISA .= ');';
728print PM "\n$myISA\n\n";
729
730my @exported_names = (@const_names, @fnames_no_prefix, map '$'.$_, @vdecls);
731
732print PM<<"END";
733# Items to export into callers namespace by default. Note: do not export
734# names by default without a very good reason. Use EXPORT_OK instead.
735# Do not simply export all your public functions/methods/constants.
736
737# This allows declaration       use $module ':all';
738# If you do not need this, moving things directly into \@EXPORT or \@EXPORT_OK
739# will save memory.
740our %EXPORT_TAGS = ( 'all' => [ qw(
741        @exported_names
742) ] );
743
744our \@EXPORT_OK = ( \@{ \$EXPORT_TAGS{'all'} } );
745
746our \@EXPORT = qw(
747        @const_names
748);
749our \$VERSION = '$TEMPLATE_VERSION';
750
751END
752
753if (@vdecls) {
754    printf PM "our(@{[ join ', ', map '$'.$_, @vdecls ]});\n\n";
755}
756
757print PM <<"END" unless $opt_c or $opt_X;
758sub AUTOLOAD {
759    # This AUTOLOAD is used to 'autoload' constants from the constant()
760    # XS function.  If a constant is not found then control is passed
761    # to the AUTOLOAD in AutoLoader.
762
763    my \$constname;
764    our \$AUTOLOAD;
765    (\$constname = \$AUTOLOAD) =~ s/.*:://;
766    croak "&$module::constant not defined" if \$constname eq 'constant';
767    my \$val = constant(\$constname, \@_ ? \$_[0] : 0);
768    if (\$! != 0) {
769        if (\$! =~ /Invalid/ || \$!{EINVAL}) {
770            \$AutoLoader::AUTOLOAD = \$AUTOLOAD;
771            goto &AutoLoader::AUTOLOAD;
772        }
773        else {
774            croak "Your vendor has not defined $module macro \$constname";
775        }
776    }
777    {
778        no strict 'refs';
779        # Fixed between 5.005_53 and 5.005_61
780        if (\$] >= 5.00561) {
781            *\$AUTOLOAD = sub () { \$val };
782        }
783        else {
784            *\$AUTOLOAD = sub { \$val };
785        }
786    }
787    goto &\$AUTOLOAD;
788}
789
790END
791
792if( ! $opt_X ){ # print bootstrap, unless XS is disabled
793        print PM <<"END";
794bootstrap $module \$VERSION;
795END
796}
797
798# tying the variables can happen only after bootstrap
799if (@vdecls) {
800    printf PM <<END;
801{
802@{[ join "\n", map "    _tievar_$_(\$$_);", @vdecls ]}
803}
804
805END
806}
807
808my $after;
809if( $opt_P ){ # if POD is disabled
810        $after = '__END__';
811}
812else {
813        $after = '=cut';
814}
815
816print PM <<"END";
817
818# Preloaded methods go here.
819END
820
821print PM <<"END" unless $opt_A;
822
823# Autoload methods go after $after, and are processed by the autosplit program.
824END
825
826print PM <<"END";
827
8281;
829__END__
830END
831
832my $author = "A. U. Thor";
833my $email = 'a.u.thor@a.galaxy.far.far.away';
834
835my $revhist = '';
836$revhist = <<EOT if $opt_C;
837
838=head1 HISTORY
839
840=over 8
841
842=item $TEMPLATE_VERSION
843
844Original version; created by h2xs $H2XS_VERSION with options
845
846  @ARGS
847
848=back
849
850EOT
851
852my $exp_doc = <<EOD;
853
854=head2 EXPORT
855
856None by default.
857
858EOD
859if (@const_names and not $opt_P) {
860  $exp_doc .= <<EOD;
861=head2 Exportable constants
862
863  @{[join "\n  ", @const_names]}
864
865EOD
866}
867if (defined $fdecls and @$fdecls and not $opt_P) {
868  $exp_doc .= <<EOD;
869=head2 Exportable functions
870
871EOD
872  $exp_doc .= <<EOD if $opt_p;
873When accessing these functions from Perl, prefix C<$opt_p> should be removed.
874
875EOD
876  $exp_doc .= <<EOD;
877  @{[join "\n  ", @known_fnames{@fnames}]}
878
879EOD
880}
881
882my $pod = <<"END" unless $opt_P;
883## Below is stub documentation for your module. You better edit it!
884#
885#=head1 NAME
886#
887#$module - Perl extension for blah blah blah
888#
889#=head1 SYNOPSIS
890#
891#  use $module;
892#  blah blah blah
893#
894#=head1 DESCRIPTION
895#
896#Stub documentation for $module, created by h2xs. It looks like the
897#author of the extension was negligent enough to leave the stub
898#unedited.
899#
900#Blah blah blah.
901#$exp_doc$revhist
902#=head1 AUTHOR
903#
904#$author, $email
905#
906#=head1 SEE ALSO
907#
908#perl(1).
909#
910#=cut
911END
912
913$pod =~ s/^\#//gm unless $opt_P;
914print PM $pod unless $opt_P;
915
916close PM;
917
918
919if( ! $opt_X ){ # print XS, unless it is disabled
920warn "Writing $ext$modpname/$modfname.xs\n";
921
922print XS <<"END";
923#include "EXTERN.h"
924#include "perl.h"
925#include "XSUB.h"
926
927END
928if( @path_h ){
929    foreach my $path_h (@path_h_ini) {
930        my($h) = $path_h;
931        $h =~ s#^/usr/include/##;
932        if ($^O eq 'VMS') { $h =~ s#.*vms\]#sys/# or $h =~ s#.*[:>\]]##; }
933        print XS qq{#include <$h>\n};
934    }
935    print XS "\n";
936}
937
938my %pointer_typedefs;
939my %struct_typedefs;
940
941sub td_is_pointer {
942  my $type = shift;
943  my $out = $pointer_typedefs{$type};
944  return $out if defined $out;
945  my $otype = $type;
946  $out = ($type =~ /\*$/);
947  # This converts only the guys which do not have trailing part in the typedef
948  if (not $out
949      and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
950    $type = normalize_type($type);
951    print "Is-Pointer: Type mutation via typedefs: $otype ==> $type\n"
952      if $opt_d;
953    $out = td_is_pointer($type);
954  }
955  return ($pointer_typedefs{$otype} = $out);
956}
957
958sub td_is_struct {
959  my $type = shift;
960  my $out = $struct_typedefs{$type};
961  return $out if defined $out;
962  my $otype = $type;
963  $out = ($type =~ /^(struct|union)\b/) && !td_is_pointer($type);
964  # This converts only the guys which do not have trailing part in the typedef
965  if (not $out
966      and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
967    $type = normalize_type($type);
968    print "Is-Struct: Type mutation via typedefs: $otype ==> $type\n"
969      if $opt_d;
970    $out = td_is_struct($type);
971  }
972  return ($struct_typedefs{$otype} = $out);
973}
974
975# Some macros will bomb if you try to return them from a double-returning func.
976# Say, ((char *)0), or strlen (if somebody #define STRLEN strlen).
977# Fortunately, we can detect both these cases...
978sub protect_convert_to_double {
979  my $in = shift;
980  my $val;
981  return '' unless defined ($val = $seen_define{$in});
982  return '(IV)' if $known_fnames{$val};
983  # OUT_t of ((OUT_t)-1):
984  return '' unless $val =~ /^\s*(\(\s*)?\(\s*([^()]*?)\s*\)/;
985  td_is_pointer($2) ? '(IV)' : '';
986}
987
988# For each of the generated functions, length($pref) leading
989# letters are already checked.  Moreover, it is recommended that
990# the generated functions uses switch on letter at offset at least
991# $off + length($pref).
992#
993# The given list has length($pref) chars removed at front, it is
994# guarantied that $off leading chars in the rest are the same for all
995# elts of the list.
996#
997# Returns: how at which offset it was decided to make a switch, or -1 if none.
998
999sub write_const;
1000
1001sub write_const {
1002  my ($fh, $pref, $off, $list) = (shift,shift,shift,shift);
1003  my %leading;
1004  my $offarg = length $pref;
1005
1006  if (@$list == 0) {            # Can happen on the initial iteration only
1007    print $fh <<"END";
1008static double
1009constant(char *name, int len, int arg)
1010{
1011    errno = EINVAL;
1012    return 0;
1013}
1014END
1015    return -1;
1016  }
1017
1018  if (@$list == 1) {            # Can happen on the initial iteration only
1019    my $protect = protect_convert_to_double("$pref$list->[0]");
1020
1021    print $fh <<"END";
1022static double
1023constant(char *name, int len, int arg)
1024{
1025    errno = 0;
1026    if (strEQ(name + $offarg, "$list->[0]")) {  /* $pref removed */
1027#ifdef $pref$list->[0]
1028        return $protect$pref$list->[0];
1029#else
1030        errno = ENOENT;
1031        return 0;
1032#endif
1033    }
1034    errno = EINVAL;
1035    return 0;
1036}
1037END
1038    return -1;
1039  }
1040
1041  for my $n (@$list) {
1042    my $c = substr $n, $off, 1;
1043    $leading{$c} = [] unless exists $leading{$c};
1044    push @{$leading{$c}}, substr $n, $off + 1;
1045  }
1046
1047  if (keys(%leading) == 1) {
1048    return 1 + write_const $fh, $pref, $off + 1, $list;
1049  }
1050
1051  my $leader = substr $list->[0], 0, $off;
1052  foreach my $letter (keys %leading) {
1053    write_const $fh, "$pref$leader$letter", 0, $leading{$letter}
1054      if @{$leading{$letter}} > 1;
1055  }
1056
1057  my $npref = "_$pref";
1058  $npref = '' if $pref eq '';
1059
1060  print $fh <<"END";
1061static double
1062constant$npref(char *name, int len, int arg)
1063{
1064END
1065
1066  print $fh <<"END" if $npref eq '';
1067    errno = 0;
1068END
1069
1070  print $fh <<"END" if $off;
1071    if ($offarg + $off >= len ) {
1072        errno = EINVAL;
1073        return 0;
1074    }
1075END
1076
1077  print $fh <<"END";
1078    switch (name[$offarg + $off]) {
1079END
1080
1081  foreach my $letter (sort keys %leading) {
1082    my $let = $letter;
1083    $let = '\0' if $letter eq '';
1084
1085    print $fh <<EOP;
1086    case '$let':
1087EOP
1088    if (@{$leading{$letter}} > 1) {
1089      # It makes sense to call a function
1090      if ($off) {
1091        print $fh <<EOP;
1092        if (!strnEQ(name + $offarg,"$leader", $off))
1093            break;
1094EOP
1095      }
1096      print $fh <<EOP;
1097        return constant_$pref$leader$letter(name, len, arg);
1098EOP
1099    }
1100    else {
1101      # Do it ourselves
1102      my $protect
1103        = protect_convert_to_double("$pref$leader$letter$leading{$letter}[0]");
1104
1105      print $fh <<EOP;
1106        if (strEQ(name + $offarg, "$leader$letter$leading{$letter}[0]")) {      /* $pref removed */
1107#ifdef $pref$leader$letter$leading{$letter}[0]
1108            return $protect$pref$leader$letter$leading{$letter}[0];
1109#else
1110            goto not_there;
1111#endif
1112        }
1113EOP
1114    }
1115  }
1116  print $fh <<"END";
1117    }
1118    errno = EINVAL;
1119    return 0;
1120
1121not_there:
1122    errno = ENOENT;
1123    return 0;
1124}
1125
1126END
1127
1128}
1129
1130if( ! $opt_c ) {
1131  print XS <<"END";
1132static int
1133not_here(char *s)
1134{
1135    croak("$module::%s not implemented on this architecture", s);
1136    return -1;
1137}
1138
1139END
1140
1141  write_const(\*XS, '', 0, \@const_names);
1142}
1143
1144print_tievar_subs(\*XS, $_, $vdecl_hash{$_}) for @vdecls;
1145
1146my $prefix;
1147$prefix = "PREFIX = $opt_p" if defined $opt_p;
1148
1149# Now switch from C to XS by issuing the first MODULE declaration:
1150print XS <<"END";
1151
1152MODULE = $module                PACKAGE = $module               $prefix
1153
1154END
1155
1156foreach (sort keys %const_xsub) {
1157    print XS <<"END";
1158char *
1159$_()
1160
1161    CODE:
1162#ifdef $_
1163        RETVAL = $_;
1164#else
1165        croak("Your vendor has not defined the $module macro $_");
1166#endif
1167
1168    OUTPUT:
1169        RETVAL
1170
1171END
1172}
1173
1174# If a constant() function was written then output a corresponding
1175# XS declaration:
1176print XS <<"END" unless $opt_c;
1177
1178double
1179constant(sv,arg)
1180    PREINIT:
1181        STRLEN          len;
1182    INPUT:
1183        SV *            sv
1184        char *          s = SvPV(sv, len);
1185        int             arg
1186    CODE:
1187        RETVAL = constant(s,len,arg);
1188    OUTPUT:
1189        RETVAL
1190
1191END
1192
1193my %seen_decl;
1194my %typemap;
1195
1196sub print_decl {
1197  my $fh = shift;
1198  my $decl = shift;
1199  my ($type, $name, $args) = @$decl;
1200  return if $seen_decl{$name}++; # Need to do the same for docs as well?
1201
1202  my @argnames = map {$_->[1]} @$args;
1203  my @argtypes = map { normalize_type( $_->[0], 1 ) } @$args;
1204  if ($opt_k) {
1205    s/^\s*const\b\s*// for @argtypes;
1206  }
1207  my @argarrays = map { $_->[4] || '' } @$args;
1208  my $numargs = @$args;
1209  if ($numargs and $argtypes[-1] eq '...') {
1210    $numargs--;
1211    $argnames[-1] = '...';
1212  }
1213  local $" = ', ';
1214  $type = normalize_type($type, 1);
1215
1216  print $fh <<"EOP";
1217
1218$type
1219$name(@argnames)
1220EOP
1221
1222  for my $arg (0 .. $numargs - 1) {
1223    print $fh <<"EOP";
1224        $argtypes[$arg] $argnames[$arg]$argarrays[$arg]
1225EOP
1226  }
1227}
1228
1229sub print_tievar_subs {
1230  my($fh, $name, $type) = @_;
1231  print $fh <<END;
1232I32
1233_get_$name(IV index, SV *sv) {
1234    dSP;
1235    PUSHMARK(SP);
1236    XPUSHs(sv);
1237    PUTBACK;
1238    (void)call_pv("$module\::_get_$name", G_DISCARD);
1239    return (I32)0;
1240}
1241
1242I32
1243_set_$name(IV index, SV *sv) {
1244    dSP;
1245    PUSHMARK(SP);
1246    XPUSHs(sv);
1247    PUTBACK;
1248    (void)call_pv("$module\::_set_$name", G_DISCARD);
1249    return (I32)0;
1250}
1251
1252END
1253}
1254
1255sub print_tievar_xsubs {
1256  my($fh, $name, $type) = @_;
1257  print $fh <<END;
1258void
1259_tievar_$name(sv)
1260        SV* sv
1261    PREINIT:
1262        struct ufuncs uf;
1263    CODE:
1264        uf.uf_val = &_get_$name;
1265        uf.uf_set = &_set_$name;
1266        uf.uf_index = (IV)&_get_$name;
1267        sv_magic(sv, 0, 'U', (char*)&uf, sizeof(uf));
1268
1269void
1270_get_$name(THIS)
1271        $type THIS = NO_INIT
1272    CODE:
1273        THIS = $name;
1274    OUTPUT:
1275        SETMAGIC: DISABLE
1276        THIS
1277
1278void
1279_set_$name(THIS)
1280        $type THIS
1281    CODE:
1282        $name = THIS;
1283
1284END
1285}
1286
1287sub print_accessors {
1288  my($fh, $name, $struct) = @_;
1289  return unless defined $struct && $name !~ /\s|_ANON/;
1290  $name = normalize_type($name);
1291  my $ptrname = normalize_type("$name *");
1292  print $fh <<"EOF";
1293
1294MODULE = $module                PACKAGE = ${name}               $prefix
1295
1296$name *
1297_to_ptr(THIS)
1298        $name THIS = NO_INIT
1299    PROTOTYPE: \$
1300    CODE:
1301        if (sv_derived_from(ST(0), "$name")) {
1302            STRLEN len;
1303            char *s = SvPV((SV*)SvRV(ST(0)), len);
1304            if (len != sizeof(THIS))
1305                croak("Size \%d of packed data != expected \%d",
1306                        len, sizeof(THIS));
1307            RETVAL = ($name *)s;
1308        }   
1309        else
1310            croak("THIS is not of type $name");
1311    OUTPUT:
1312        RETVAL
1313
1314$name
1315new(CLASS)
1316        char *CLASS = NO_INIT
1317    PROTOTYPE: \$
1318    CODE:
1319        Zero((void*)&RETVAL, sizeof(RETVAL), char);
1320    OUTPUT:
1321        RETVAL
1322
1323MODULE = $module                PACKAGE = ${name}Ptr            $prefix
1324
1325EOF
1326  my @items = @$struct;
1327  while (@items) {
1328    my $item = shift @items;
1329    if ($item->[0] =~ /_ANON/) {
1330      if (defined $item->[2]) {
1331        push @items, map [
1332          @$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]",
1333        ], @{ $structs{$item->[0]} };
1334      } else {
1335        push @items, @{ $structs{$item->[0]} };
1336      }
1337    } else {
1338      my $type = normalize_type($item->[0]);
1339      my $ttype = $structs{$type} ? normalize_type("$type *") : $type;
1340      print $fh <<"EOF";
1341$ttype
1342$item->[2](THIS, __value = NO_INIT)
1343        $ptrname THIS
1344        $type __value
1345    PROTOTYPE: \$;\$
1346    CODE:
1347        if (items > 1)
1348            THIS->$item->[-1] = __value;
1349        RETVAL = @{[
1350            $type eq $ttype ? "THIS->$item->[-1]" : "&(THIS->$item->[-1])"
1351        ]};
1352    OUTPUT:
1353        RETVAL
1354
1355EOF
1356    }
1357  }
1358}
1359
1360# Should be called before any actual call to normalize_type().
1361sub get_typemap {
1362  # We do not want to read ./typemap by obvios reasons.
1363  my @tm =  qw(../../../typemap ../../typemap ../typemap);
1364  my $stdtypemap =  "$Config::Config{privlib}/ExtUtils/typemap";
1365  unshift @tm, $stdtypemap;
1366  my $proto_re = "[" . quotemeta('\$%&*@;') . "]" ;
1367
1368  # Start with useful default values
1369  $typemap{float} = 'T_DOUBLE';
1370
1371  foreach my $typemap (@tm) {
1372    next unless -e $typemap ;
1373    # skip directories, binary files etc.
1374    warn " Scanning $typemap\n";
1375    warn("Warning: ignoring non-text typemap file '$typemap'\n"), next
1376      unless -T $typemap ;
1377    open(TYPEMAP, $typemap)
1378      or warn ("Warning: could not open typemap file '$typemap': $!\n"), next;
1379    my $mode = 'Typemap';
1380    while (<TYPEMAP>) {
1381      next if /^\s*\#/;
1382      if (/^INPUT\s*$/)   { $mode = 'Input'; next; }
1383      elsif (/^OUTPUT\s*$/)  { $mode = 'Output'; next; }
1384      elsif (/^TYPEMAP\s*$/) { $mode = 'Typemap'; next; }
1385      elsif ($mode eq 'Typemap') {
1386        next if /^\s*($|\#)/ ;
1387        my ($type, $image);
1388        if ( ($type, $image) =
1389             /^\s*(.*?\S)\s+(\S+)\s*($proto_re*)\s*$/o
1390             # This may reference undefined functions:
1391             and not ($image eq 'T_PACKED' and $typemap eq $stdtypemap)) {
1392          $typemap{normalize_type($type)} = $image;
1393        }
1394      }
1395    }
1396    close(TYPEMAP) or die "Cannot close $typemap: $!";
1397  }
1398  %std_types = %types_seen;
1399  %types_seen = ();
1400}
1401
1402
1403sub normalize_type {            # Second arg: do not strip const's before \*
1404  my $type = shift;
1405  my $do_keep_deep_const = shift;
1406  # If $do_keep_deep_const this is heuristical only
1407  my $keep_deep_const = ($do_keep_deep_const ? '\b(?![^(,)]*\*)' : '');
1408  my $ignore_mods
1409    = "(?:\\b(?:(?:__const__|const)$keep_deep_const|static|inline|__inline__)\\b\\s*)*";
1410  if ($do_keep_deep_const) {    # Keep different compiled /RExen/o separately!
1411    $type =~ s/$ignore_mods//go;
1412  }
1413  else {
1414    $type =~ s/$ignore_mods//go;
1415  }
1416  $type =~ s/([^\s\w])/ \1 /g;
1417  $type =~ s/\s+$//;
1418  $type =~ s/^\s+//;
1419  $type =~ s/\s+/ /g;
1420  $type =~ s/\* (?=\*)/*/g;
1421  $type =~ s/\. \. \./.../g;
1422  $type =~ s/ ,/,/g;
1423  $types_seen{$type}++
1424    unless $type eq '...' or $type eq 'void' or $std_types{$type};
1425  $type;
1426}
1427
1428my $need_opaque;
1429
1430sub assign_typemap_entry {
1431  my $type = shift;
1432  my $otype = $type;
1433  my $entry;
1434  if ($tmask and $type =~ /$tmask/) {
1435    print "Type $type matches -o mask\n" if $opt_d;
1436    $entry = (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ");
1437  }
1438  elsif ($typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1439    $type = normalize_type $type;
1440    print "Type mutation via typedefs: $otype ==> $type\n" if $opt_d;
1441    $entry = assign_typemap_entry($type);
1442  }
1443  $entry ||= $typemap{$otype}
1444    || (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ");
1445  $typemap{$otype} = $entry;
1446  $need_opaque = 1 if $entry eq "T_OPAQUE_STRUCT";
1447  return $entry;
1448}
1449
1450for (@vdecls) {
1451  print_tievar_xsubs(\*XS, $_, $vdecl_hash{$_});
1452}
1453
1454if ($opt_x) {
1455  for my $decl (@$fdecls_parsed) { print_decl(\*XS, $decl) }
1456  if ($opt_a) {
1457    while (my($name, $struct) = each %structs) {
1458      print_accessors(\*XS, $name, $struct);
1459    }
1460  }
1461}
1462
1463close XS;
1464
1465if (%types_seen) {
1466  my $type;
1467  warn "Writing $ext$modpname/typemap\n";
1468  open TM, ">typemap" or die "Cannot open typemap file for write: $!";
1469
1470  for $type (sort keys %types_seen) {
1471    my $entry = assign_typemap_entry $type;
1472    print TM $type, "\t" x (5 - int((length $type)/8)), "\t$entry\n"
1473  }
1474
1475  print TM <<'EOP' if $need_opaque; # Older Perls do not have correct entry
1476#############################################################################
1477INPUT
1478T_OPAQUE_STRUCT
1479        if (sv_derived_from($arg, \"${ntype}\")) {
1480            STRLEN len;
1481            char  *s = SvPV((SV*)SvRV($arg), len);
1482
1483            if (len != sizeof($var))
1484                croak(\"Size %d of packed data != expected %d\",
1485                        len, sizeof($var));
1486            $var = *($type *)s;
1487        }
1488        else
1489            croak(\"$var is not of type ${ntype}\")
1490#############################################################################
1491OUTPUT
1492T_OPAQUE_STRUCT
1493        sv_setref_pvn($arg, \"${ntype}\", (char *)&$var, sizeof($var));
1494EOP
1495
1496  close TM or die "Cannot close typemap file for write: $!";
1497}
1498
1499} # if( ! $opt_X )
1500
1501warn "Writing $ext$modpname/Makefile.PL\n";
1502open(PL, ">Makefile.PL") || die "Can't create $ext$modpname/Makefile.PL: $!\n";
1503
1504print PL <<END;
1505use ExtUtils::MakeMaker;
1506# See lib/ExtUtils/MakeMaker.pm for details of how to influence
1507# the contents of the Makefile that is written.
1508WriteMakefile(
1509    'NAME'              => '$module',
1510    'VERSION_FROM'      => '$modfname.pm', # finds \$VERSION
1511    'PREREQ_PM'         => {}, # e.g., Module::Name => 1.1
1512END
1513if (!$opt_X) { # print C stuff, unless XS is disabled
1514  $opt_F = '' unless defined $opt_F;
1515  print PL <<END;
1516    'LIBS'              => ['$extralibs'], # e.g., '-lm'
1517    'DEFINE'            => '$opt_F', # e.g., '-DHAVE_SOMETHING'
1518    'INC'               => '', # e.g., '-I/usr/include/other'
1519END
1520}
1521print PL ");\n";
1522close(PL) || die "Can't close $ext$modpname/Makefile.PL: $!\n";
1523
1524warn "Writing $ext$modpname/test.pl\n";
1525open(EX, ">test.pl") || die "Can't create $ext$modpname/test.pl: $!\n";
1526print EX <<'_END_';
1527# Before `make install' is performed this script should be runnable with
1528# `make test'. After `make install' it should work as `perl test.pl'
1529
1530######################### We start with some black magic to print on failure.
1531
1532# Change 1..1 below to 1..last_test_to_print .
1533# (It may become useful if the test is moved to ./t subdirectory.)
1534
1535BEGIN { $| = 1; print "1..1\n"; }
1536END {print "not ok 1\n" unless $loaded;}
1537_END_
1538print EX <<_END_;
1539use $module;
1540_END_
1541print EX <<'_END_';
1542$loaded = 1;
1543print "ok 1\n";
1544
1545######################### End of black magic.
1546
1547# Insert your test code below (better if it prints "ok 13"
1548# (correspondingly "not ok 13") depending on the success of chunk 13
1549# of the test code):
1550
1551_END_
1552close(EX) || die "Can't close $ext$modpname/test.pl: $!\n";
1553
1554unless ($opt_C) {
1555  warn "Writing $ext$modpname/Changes\n";
1556  $" = ' ';
1557  open(EX, ">Changes") || die "Can't create $ext$modpname/Changes: $!\n";
1558  @ARGS = map {/[\s\"\'\`\$*?^|&<>\[\]\{\}\(\)]/ ? "'$_'" : $_} @ARGS;
1559  print EX <<EOP;
1560Revision history for Perl extension $module.
1561
1562$TEMPLATE_VERSION  @{[scalar localtime]}
1563\t- original version; created by h2xs $H2XS_VERSION with options
1564\t\t@ARGS
1565
1566EOP
1567  close(EX) || die "Can't close $ext$modpname/Changes: $!\n";
1568}
1569
1570warn "Writing $ext$modpname/MANIFEST\n";
1571open(MANI,'>MANIFEST') or die "Can't create MANIFEST: $!";
1572my @files = <*>;
1573if (!@files) {
1574  eval {opendir(D,'.');};
1575  unless ($@) { @files = readdir(D); closedir(D); }
1576}
1577if (!@files) { @files = map {chomp && $_} `ls`; }
1578if ($^O eq 'VMS') {
1579  foreach (@files) {
1580    # Clip trailing '.' for portability -- non-VMS OSs don't expect it
1581    s%\.$%%;
1582    # Fix up for case-sensitive file systems
1583    s/$modfname/$modfname/i && next;
1584    $_ = "\U$_" if $_ eq 'manifest' or $_ eq 'changes';
1585    $_ = 'Makefile.PL' if $_ eq 'makefile.pl';
1586  }
1587}
1588print MANI join("\n",@files), "\n";
1589close MANI;
1590!NO!SUBS!
1591
1592close OUT or die "Can't close $file: $!";
1593chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
1594exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
1595chdir $origdir;
Note: See TracBrowser for help on using the repository browser.