2 eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
3 if $running_under_some_shell;
9 h2xs - convert .h C header files to Perl extensions
13 B<h2xs> [B<OPTIONS> ...] [headerfile ... [extra_libraries]]
15 B<h2xs> B<-h>|B<-?>|B<--help>
19 I<h2xs> builds a Perl extension from C header files. The extension
20 will include functions which can be used to retrieve the value of any
21 #define statement which was in the C header files.
23 The I<module_name> will be used for the name of the extension. If
24 module_name is not supplied then the name of the first header file
25 will be used, with the first character capitalized.
27 If the extension might need extra libraries, they should be included
28 here. The extension Makefile.PL will take care of checking whether
29 the libraries actually exist and how they should be loaded. The extra
30 libraries should be specified in the form -lm -lposix, etc, just as on
31 the cc command line. By default, the Makefile.PL will search through
32 the library path determined by Configure. That path can be augmented
33 by including arguments of the form B<-L/another/library/path> in the
34 extra-libraries argument.
40 =item B<-A>, B<--omit-autoload>
42 Omit all autoload facilities. This is the same as B<-c> but also
43 removes the S<C<use AutoLoader>> statement from the .pm file.
45 =item B<-B>, B<--beta-version>
47 Use an alpha/beta style version number. Causes version number to
48 be "0.00_01" unless B<-v> is specified.
50 =item B<-C>, B<--omit-changes>
52 Omits creation of the F<Changes> file, and adds a HISTORY section to
55 =item B<-F>, B<--cpp-flags>=I<addflags>
57 Additional flags to specify to C preprocessor when scanning header for
58 function declarations. Writes these options in the generated F<Makefile.PL>
61 =item B<-M>, B<--func-mask>=I<regular expression>
63 selects functions/macros to process.
65 =item B<-O>, B<--overwrite-ok>
67 Allows a pre-existing extension directory to be overwritten.
69 =item B<-P>, B<--omit-pod>
71 Omit the autogenerated stub POD section.
73 =item B<-X>, B<--omit-XS>
75 Omit the XS portion. Used to generate templates for a module which is not
76 XS-based. C<-c> and C<-f> are implicitly enabled.
78 =item B<-a>, B<--gen-accessors>
80 Generate an accessor method for each element of structs and unions. The
81 generated methods are named after the element name; will return the current
82 value of the element if called without additional arguments; and will set
83 the element to the supplied value (and return the new value) if called with
84 an additional argument. Embedded structures and unions are returned as a
85 pointer rather than the complete structure, to facilitate chained calls.
87 These methods all apply to the Ptr type for the structure; additionally
88 two methods are constructed for the structure type itself, C<_to_ptr>
89 which returns a Ptr type pointing to the same structure, and a C<new>
90 method to construct and return a new structure, initialised to zeroes.
92 =item B<-b>, B<--compat-version>=I<version>
94 Generates a .pm file which is backwards compatible with the specified
97 For versions < 5.6.0, the changes are.
98 - no use of 'our' (uses 'use vars' instead)
101 Specifying a compatibility version higher than the version of perl you
102 are using to run h2xs will have no effect. If unspecified h2xs will default
103 to compatibility with the version of perl you are using to run h2xs.
105 =item B<-c>, B<--omit-constant>
107 Omit C<constant()> from the .xs file and corresponding specialised
108 C<AUTOLOAD> from the .pm file.
110 =item B<-d>, B<--debugging>
112 Turn on debugging messages.
114 =item B<-e>, B<--omit-enums>=[I<regular expression>]
116 If I<regular expression> is not given, skip all constants that are defined in
117 a C enumeration. Otherwise skip only those constants that are defined in an
118 enum whose name matches I<regular expression>.
120 Since I<regular expression> is optional, make sure that this switch is followed
121 by at least one other switch if you omit I<regular expression> and have some
122 pending arguments such as header-file names. This is ok:
124 h2xs -e -n Module::Foo foo.h
128 h2xs -n Module::Foo -e foo.h
130 In the latter, foo.h is taken as I<regular expression>.
132 =item B<-f>, B<--force>
134 Allows an extension to be created for a header even if that header is
135 not found in standard include directories.
137 =item B<-g>, B<--global>
139 Include code for safely storing static data in the .xs file.
140 Extensions that do no make use of static data can ignore this option.
142 =item B<-h>, B<-?>, B<--help>
144 Print the usage, help and version for this h2xs and exit.
146 =item B<-k>, B<--omit-const-func>
148 For function arguments declared as C<const>, omit the const attribute in the
151 =item B<-m>, B<--gen-tied-var>
153 B<Experimental>: for each variable declared in the header file(s), declare
154 a perl variable of the same name magically tied to the C variable.
156 =item B<-n>, B<--name>=I<module_name>
158 Specifies a name to be used for the extension, e.g., S<-n RPC::DCE>
160 =item B<-o>, B<--opaque-re>=I<regular expression>
162 Use "opaque" data type for the C types matched by the regular
163 expression, even if these types are C<typedef>-equivalent to types
164 from typemaps. Should not be used without B<-x>.
166 This may be useful since, say, types which are C<typedef>-equivalent
167 to integers may represent OS-related handles, and one may want to work
168 with these handles in OO-way, as in C<$handle-E<gt>do_something()>.
169 Use C<-o .> if you want to handle all the C<typedef>ed types as opaque
172 The type-to-match is whitewashed (except for commas, which have no
173 whitespace before them, and multiple C<*> which have no whitespace
176 =item B<-p>, B<--remove-prefix>=I<prefix>
178 Specify a prefix which should be removed from the Perl function names,
179 e.g., S<-p sec_rgy_> This sets up the XS B<PREFIX> keyword and removes
180 the prefix from functions that are autoloaded via the C<constant()>
183 =item B<-s>, B<--const-subs>=I<sub1,sub2>
185 Create a perl subroutine for the specified macros rather than autoload
186 with the constant() subroutine. These macros are assumed to have a
187 return type of B<char *>, e.g.,
188 S<-s sec_rgy_wildcard_name,sec_rgy_wildcard_sid>.
190 =item B<-t>, B<--default-type>=I<type>
192 Specify the internal type that the constant() mechanism uses for macros.
193 The default is IV (signed integer). Currently all macros found during the
194 header scanning process will be assumed to have this type. Future versions
195 of C<h2xs> may gain the ability to make educated guesses.
197 =item B<--use-new-tests>
199 When B<--compat-version> (B<-b>) is present the generated tests will use
200 C<Test::More> rather than C<Test> which is the default for versions before
201 5.7.2 . C<Test::More> will be added to PREREQ_PM in the generated
204 =item B<--use-old-tests>
206 Will force the generation of test code that uses the older C<Test> module.
208 =item B<--skip-exporter>
210 Do not use C<Exporter> and/or export any symbol.
212 =item B<--skip-ppport>
214 Do not use C<Devel::PPPort>: no portability to older version.
216 =item B<--skip-autoloader>
218 Do not use the module C<AutoLoader>; but keep the constant() function
219 and C<sub AUTOLOAD> for constants.
221 =item B<--skip-strict>
223 Do not use the pragma C<strict>.
225 =item B<--skip-warnings>
227 Do not use the pragma C<warnings>.
229 =item B<-v>, B<--version>=I<version>
231 Specify a version number for this extension. This version number is added
232 to the templates. The default is 0.01, or 0.00_01 if C<-B> is specified.
233 The version specified should be numeric.
235 =item B<-x>, B<--autogen-xsubs>
237 Automatically generate XSUBs basing on function declarations in the
238 header file. The package C<C::Scan> should be installed. If this
239 option is specified, the name of the header file may look like
240 C<NAME1,NAME2>. In this case NAME1 is used instead of the specified
241 string, but XSUBs are emitted only for the declarations included from
244 Note that some types of arguments/return-values for functions may
245 result in XSUB-declarations/typemap-entries which need
246 hand-editing. Such may be objects which cannot be converted from/to a
247 pointer (like C<long long>), pointers to functions, or arrays. See
248 also the section on L<LIMITATIONS of B<-x>>.
255 # Default behavior, extension is Rusers
258 # Same, but extension is RUSERS
259 h2xs -n RUSERS rpcsvc/rusers
261 # Extension is rpcsvc::rusers. Still finds <rpcsvc/rusers.h>
264 # Extension is ONC::RPC. Still finds <rpcsvc/rusers.h>
265 h2xs -n ONC::RPC rpcsvc/rusers
267 # Without constant() or AUTOLOAD
268 h2xs -c rpcsvc/rusers
270 # Creates templates for an extension named RPC
273 # Extension is ONC::RPC.
276 # Extension is Lib::Foo which works at least with Perl5.005_03.
277 # Constants are created for all #defines and enums h2xs can find
279 h2xs -b 5.5.3 -n Lib::Foo foo.h
281 # Extension is Lib::Foo which works at least with Perl5.005_03.
282 # Constants are created for all #defines but only for enums
283 # whose names do not start with 'bar_'.
284 h2xs -b 5.5.3 -e '^bar_' -n Lib::Foo foo.h
286 # Makefile.PL will look for library -lrpc in
287 # additional directory /opt/net/lib
288 h2xs rpcsvc/rusers -L/opt/net/lib -lrpc
290 # Extension is DCE::rgynbase
291 # prefix "sec_rgy_" is dropped from perl function names
292 h2xs -n DCE::rgynbase -p sec_rgy_ dce/rgynbase
294 # Extension is DCE::rgynbase
295 # prefix "sec_rgy_" is dropped from perl function names
296 # subroutines are created for sec_rgy_wildcard_name and
297 # sec_rgy_wildcard_sid
298 h2xs -n DCE::rgynbase -p sec_rgy_ \
299 -s sec_rgy_wildcard_name,sec_rgy_wildcard_sid dce/rgynbase
301 # Make XS without defines in perl.h, but with function declarations
302 # visible from perl.h. Name of the extension is perl1.
303 # When scanning perl.h, define -DEXT=extern -DdEXT= -DINIT(x)=
304 # Extra backslashes below because the string is passed to shell.
305 # Note that a directory with perl header files would
306 # be added automatically to include path.
307 h2xs -xAn perl1 -F "-DEXT=extern -DdEXT= -DINIT\(x\)=" perl.h
309 # Same with function declaration in proto.h as visible from perl.h.
310 h2xs -xAn perl2 perl.h,proto.h
312 # Same but select only functions which match /^av_/
313 h2xs -M '^av_' -xAn perl2 perl.h,proto.h
315 # Same but treat SV* etc as "opaque" types
316 h2xs -o '^[S]V \*$' -M '^av_' -xAn perl2 perl.h,proto.h
318 =head2 Extension based on F<.h> and F<.c> files
320 Suppose that you have some C files implementing some functionality,
321 and the corresponding header files. How to create an extension which
322 makes this functionality accessible in Perl? The example below
323 assumes that the header files are F<interface_simple.h> and
324 I<interface_hairy.h>, and you want the perl module be named as
325 C<Ext::Ension>. If you need some preprocessor directives and/or
326 linking with external libraries, see the flags C<-F>, C<-L> and C<-l>
331 =item Find the directory name
333 Start with a dummy run of h2xs:
335 h2xs -Afn Ext::Ension
337 The only purpose of this step is to create the needed directories, and
338 let you know the names of these directories. From the output you can
339 see that the directory for the extension is F<Ext/Ension>.
343 Copy your header files and C files to this directory F<Ext/Ension>.
345 =item Create the extension
347 Run h2xs, overwriting older autogenerated files:
349 h2xs -Oxan Ext::Ension interface_simple.h interface_hairy.h
351 h2xs looks for header files I<after> changing to the extension
352 directory, so it will find your header files OK.
354 =item Archive and test
366 It is important to do C<make dist> as early as possible. This way you
367 can easily merge(1) your changes to autogenerated files if you decide
368 to edit your C<.h> files and rerun h2xs.
370 Do not forget to edit the documentation in the generated F<.pm> file.
372 Consider the autogenerated files as skeletons only, you may invent
373 better interfaces than what h2xs could guess.
375 Consider this section as a guideline only, some other options of h2xs
376 may better suit your needs.
382 No environment variables are used.
386 Larry Wall and others
390 L<perl>, L<perlxstut>, L<ExtUtils::MakeMaker>, and L<AutoLoader>.
394 The usual warnings if it cannot read or write the files involved.
396 =head1 LIMITATIONS of B<-x>
398 F<h2xs> would not distinguish whether an argument to a C function
399 which is of the form, say, C<int *>, is an input, output, or
400 input/output parameter. In particular, argument declarations of the
407 should be better rewritten as
413 if C<n> is an input parameter.
415 Additionally, F<h2xs> has no facilities to intuit that a function
422 takes a pair of address and length of data at this address, so it is better
423 to rewrite this function as
433 RETVAL = foo(s, len);
443 char *s = SvPV(sv,len);
448 MODULE = foo PACKAGE = foo PREFIX = my_
454 See L<perlxs> and L<perlxstut> for additional details.
462 my( $H2XS_VERSION ) = ' $Revision: 1.23 $ ' =~ /\$Revision:\s+([^\s]+)/;
463 my $TEMPLATE_VERSION = '0.01';
465 my $compat_version = $];
470 $Text::Wrap
::huge
= 'overflow';
471 $Text::Wrap
::columns
= 80;
472 use ExtUtils
::Constant qw
(WriteConstants WriteMakefileSnippet autoload
);
479 h2xs [OPTIONS ... ] [headerfile [extra_libraries]]
480 version: $H2XS_VERSION
482 -A, --omit-autoload Omit all autoloading facilities (implies -c).
483 -B, --beta-version Use beta \$VERSION of 0.00_01 (ignored if -v).
484 -C, --omit-changes Omit creating the Changes file, add HISTORY heading
486 -F, --cpp-flags Additional flags for C preprocessor/compile.
487 -M, --func-mask Mask to select C functions/macros
488 (default is select all).
489 -O, --overwrite-ok Allow overwriting of a pre-existing extension directory.
490 -P, --omit-pod Omit the stub POD section.
491 -X, --omit-XS Omit the XS portion (implies both -c and -f).
492 -a, --gen-accessors Generate get/set accessors for struct and union members
494 -b, --compat-version Specify a perl version to be backwards compatibile with.
495 -c, --omit-constant Omit the constant() function and specialised AUTOLOAD
497 -d, --debugging Turn on debugging messages.
498 -e, --omit-enums Omit constants from enums in the constant() function.
499 If a pattern is given, only the matching enums are
501 -f, --force Force creation of the extension even if the C header
503 -g, --global Include code for safely storing static data in the .xs file.
504 -h, -?, --help Display this help message.
505 -k, --omit-const-func Omit 'const' attribute on function arguments
507 -m, --gen-tied-var Generate tied variables for access to declared
509 -n, --name Specify a name to use for the extension (recommended).
510 -o, --opaque-re Regular expression for \"opaque\" types.
511 -p, --remove-prefix Specify a prefix which should be removed from the
513 -s, --const-subs Create subroutines for specified macros.
514 -t, --default-type Default type for autoloaded constants (default is IV).
515 --use-new-tests Use Test::More in backward compatible modules.
516 --use-old-tests Use the module Test rather than Test::More.
517 --skip-exporter Do not export symbols.
518 --skip-ppport Do not use portability layer.
519 --skip-autoloader Do not use the module C<AutoLoader>.
520 --skip-strict Do not use the pragma C<strict>.
521 --skip-warnings Do not use the pragma C<warnings>.
522 -v, --version Specify a version number for this extension.
523 -x, --autogen-xsubs Autogenerate XSUBs using C::Scan.
524 --use-xsloader Use XSLoader in backward compatible modules (ignored
528 are any libraries that might be needed for loading the
529 extension, e.g. -lm would try to link in the math library.
568 Getopt
::Long
::Configure
('bundling');
569 Getopt
::Long
::Configure
('pass_through');
572 'omit-autoload|A' => \
$opt_A,
573 'beta-version|B' => \
$opt_B,
574 'omit-changes|C' => \
$opt_C,
575 'cpp-flags|F=s' => \
$opt_F,
576 'func-mask|M=s' => \
$opt_M,
577 'overwrite_ok|O' => \
$opt_O,
578 'omit-pod|P' => \
$opt_P,
579 'omit-XS|X' => \
$opt_X,
580 'gen-accessors|a' => \
$opt_a,
581 'compat-version|b=s' => \
$opt_b,
582 'omit-constant|c' => \
$opt_c,
583 'debugging|d' => \
$opt_d,
584 'omit-enums|e:s' => \
$opt_e,
585 'force|f' => \
$opt_f,
586 'global|g' => \
$opt_g,
587 'help|h|?' => \
$opt_h,
588 'omit-const-func|k' => \
$opt_k,
589 'gen-tied-var|m' => \
$opt_m,
590 'name|n=s' => \
$opt_n,
591 'opaque-re|o=s' => \
$opt_o,
592 'remove-prefix|p=s' => \
$opt_p,
593 'const-subs|s=s' => \
$opt_s,
594 'default-type|t=s' => \
$opt_t,
595 'version|v=s' => \
$opt_v,
596 'autogen-xsubs|x' => \
$opt_x,
597 'use-new-tests' => \
$new_test,
598 'use-old-tests' => \
$old_test,
599 'skip-exporter' => \
$skip_exporter,
600 'skip-ppport' => \
$skip_ppport,
601 'skip-autoloader' => \
$skip_autoloader,
602 'skip-warnings' => \
$skip_warnings,
603 'skip-strict' => \
$skip_strict,
604 'use-xsloader' => \
$use_xsloader,
607 GetOptions
(%options) || usage
;
612 usage
"You cannot use -b and -m at the same time.\n" if ($opt_b && $opt_m);
613 $opt_b =~ /^\d+\.\d+\.\d+/ ||
614 usage
"You must provide the backwards compatibility version in X.Y.Z form. "
616 my ($maj,$min,$sub) = split(/\./,$opt_b,3);
617 if ($maj < 5 || ($maj == 5 && $min < 6)) {
619 $sub ?
sprintf("%d.%03d%02d",$maj,$min,$sub) :
620 sprintf("%d.%03d", $maj,$min);
623 $sub ?
sprintf("%d.%03d%03d",$maj,$min,$sub) :
624 sprintf("%d.%03d", $maj,$min);
627 my ($maj,$min,$sub) = $compat_version =~ /(\d+)\.(\d\d\d)(\d*)/;
629 warn sprintf <<'EOF', $maj,$min,$sub;
630 Defaulting to backwards compatibility with perl %d.%d.%d
631 If you intend this module to be compatible with earlier perl versions, please
632 specify a minimum perl version with the -b option.
638 $TEMPLATE_VERSION = '0.00_01';
642 $TEMPLATE_VERSION = $opt_v;
644 # check if it is numeric
645 my $temp_version = $TEMPLATE_VERSION;
646 my $beta_version = $temp_version =~ s/(\d)_(\d\d)/$1$2/;
649 local $SIG{__WARN__
} = sub { $notnum = 1 };
650 use warnings
'numeric';
651 $temp_version = 0+$temp_version;
655 my $module = $opt_n || 'Your::Module';
657 You have specified a non-numeric version. Unless you supply an
658 appropriate VERSION class method, users may not be able to specify a
659 minimum required version with C<use $module versionnum>.
664 $opt_B = $beta_version;
669 $skip_autoloader = $opt_c = 1 if $opt_A;
671 # -X implies -c and -f
672 $opt_c = $opt_f = 1 if $opt_X;
677 %const_xsub = map { $_,1 } split(/,+/, $opt_s) if $opt_s;
683 while (my $arg = shift) {
684 if ($arg =~ /^-l/i) {
685 $extralibs .= "$arg ";
692 usage
"Must supply header file or module name\n"
693 unless (@path_h or $opt_n);
698 $fmask = qr{$opt_M} if defined $opt_M;
699 $tmask = qr{$opt_o} if defined $opt_o;
700 my $tmask_all = $tmask && $opt_o eq '.';
703 eval {require C
::Scan
; 1}
705 C::Scan required if you use -x option.
706 To install C::Scan, execute
707 perl -MCPAN -e "install C::Scan"
709 unless ($tmask_all) {
710 $C::Scan
::VERSION
>= 0.70
712 C::Scan v. 0.70 or later required unless you use -o . option.
713 You have version $C::Scan::VERSION installed as $INC{'C/Scan.pm'}.
714 To install C::Scan, execute
715 perl -MCPAN -e "install C::Scan"
718 if (($opt_m || $opt_a) && $C::Scan
::VERSION
< 0.73) {
720 C::Scan v. 0.73 or later required to use -m or -a options.
721 You have version $C::Scan::VERSION installed as $INC{'C/Scan.pm'}.
722 To install C::Scan, execute
723 perl -MCPAN -e "install C::Scan"
727 elsif ($opt_o or $opt_F) {
728 warn <<EOD if $opt_o;
729 Option -o does not make sense without -x.
731 warn <<EOD if $opt_F and $opt_X ;
732 Option -F does not make sense with -X.
736 my @path_h_ini = @path_h;
737 my ($name, %fullpath, %prefix, %seen_define, %prefixless, %const_names);
744 my $pre_sub_tri_graphs = 1;
745 if ($^O
eq 'VMS') { # Consider overrides of default location
746 # XXXX This is not equivalent to what the older version did:
747 # it was looking at $hadsys header-file per header-file...
748 my($hadsys) = grep s!^sys/!!i , @path_h;
749 @paths = qw( Sys$Library VAXC$Include );
750 push @paths, ($hadsys ? 'GNU_CC_Include[vms]' : 'GNU_CC_Include[000000]');
751 push @paths, qw( DECC$Library_Include DECC$System_Include );
754 @paths = (File::Spec->curdir(), $Config{usrinc},
755 (split ' ', $Config{locincpth}), '/usr/include');
757 foreach my $path_h (@path_h) {
761 if ( $name !~ /::/ ) {
768 if( $path_h =~ s#::#/#g && $opt_n ){
769 warn "Nesting of headerfile ignored with -n\n";
771 $path_h .= ".h" unless $path_h =~ /\.h$/;
772 my $fullpath = $path_h;
773 $path_h =~ s/,.*$// if $opt_x;
774 $fullpath{$path_h} = $fullpath;
776 # Minor trickery: we can't chdir() before we processed the headers
777 # (so know the name of the extension), but the header may be in the
778 # extension directory...
779 my $tmp_path_h = $path_h;
780 my $rel_path_h = $path_h;
782 if (not -f $path_h) {
784 for my $dir (@paths) {
786 if -f ($path_h = File::Spec->catfile($dir, $tmp_path_h));
789 $rel_path_h = $path_h;
790 $fullpath{$path_h} = $fullpath;
792 (my $epath = $module) =~ s,::,/,g;
793 $epath = File::Spec->catdir('ext', $epath) if -d 'ext';
794 $rel_path_h = File::Spec->catfile($epath, $tmp_path_h);
795 $path_h = $tmp_path_h; # Used during -x
801 die "Can't find $tmp_path_h in @dirs\n"
802 if ( ! $opt_f && ! -f "$rel_path_h" );
803 # Scan the header file (we should deal with nested header files)
804 # Record the names of simple #define constants into const_names
805 # Function prototypes are processed below.
806 open(CH, "<$rel_path_h") || die "Can't open $rel_path_h: $!\n";
809 if ($pre_sub_tri_graphs) {
810 # Preprocess all tri-graphs
811 # including things stuck in quoted string constants.
812 s/\?\?=/#/g; # | ??=| #|
813 s/\?\?\!/|/g; # | ??!| ||
814 s/\?\?'/^/g; # | ??'| ^|
815 s/\?\?\(/[/g; # | ??(| [|
816 s/\?\?\)/]/g; # | ??)| ]|
817 s/\?\?\-/~/g; # | ??-| ~|
818 s/\?\?\//\\/g; # | ??/| \|
819 s/\?\?</{/g; # | ??<| {|
820 s/\?\?>/}/g; # | ??>| }|
822 if (/^[ \t]*#[ \t]*define\s+([\$\w]+)\b(?!\()\s*(?=[^"\s])(.*)/) {
825 $rest =~ s!/\*.*?(\*/|\n)|//.*!!g; # Remove comments
828 # Cannot do: (-1) and ((LHANDLE)3) are OK:
829 #print("Skip non-wordy $def => $rest\n"),
830 # next defines if $rest =~ /[^\w\$]/;
832 print("Skip stringy $def => $rest\n") if $opt_d;
835 print "Matched $_ ($def)\n" if $opt_d;
836 $seen_define{$def} = $rest;
838 next if /^_.*_h_*$/i; # special case, but for what?
839 if (defined $opt_p) {
840 if (!/^$opt_p(\d)/) {
841 ++$prefix{$_} if s/^$opt_p//;
844 warn "can't remove $opt_p prefix from '$_'!\n";
847 $prefixless{$def} = $_;
848 if (!$fmask or /$fmask/) {
849 print "... Passes mask of -M.\n" if $opt_d and $fmask;
854 if (defined $opt_e and !$opt_e) {
858 # Work from miniperl too - on "normal" systems
859 my $SEEK_SET = eval 'use Fcntl qw/SEEK_SET/; SEEK_SET' or 0;
860 seek CH, 0, $SEEK_SET;
861 my $src = do { local $/; <CH> };
863 no warnings 'uninitialized';
865 # Remove C and C++ comments
866 $src =~ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#$2#gs;
868 while ($src =~ /\benum\s*([\w_]*)\s*\{\s([^}]+)\}/gsc) {
869 my ($enum_name, $enum_body) = ($1, $2);
870 # skip enums matching $opt_e
871 next if $opt_e && $enum_name =~ /$opt_e/;
873 for my $item (split /,/, $enum_body) {
874 my ($key, $declared_val) = $item =~ /(\w+)\s*(?:=\s*(.*))?/;
875 $val = defined($declared_val) && length($declared_val) ? $declared_val : 1 + $val;
876 $seen_define{$key} = $val;
877 $const_names{$key}++;
880 } # if (!defined $opt_e or $opt_e)
885 # Save current directory so that C::Scan can use it
886 my $cwd = File::Spec->rel2abs( File::Spec->curdir );
888 # As Ilya suggested, use a name that contains - and then it can't clash with
889 # the names of any packages. A directory 'fallback' will clash with any
890 # new pragmata down the fallback:: tree, but that seems unlikely.
891 my $constscfname = 'const-c.inc';
892 my $constsxsfname = 'const-xs.inc';
893 my $fallbackdirname = 'fallback';
895 my $ext = chdir 'ext' ? 'ext/' : '';
897 my @modparts = split(/::/,$module);
898 my $modpname = join('-', @modparts);
899 my $modfname = pop @modparts;
900 my $modpmdir = join '/', 'lib', @modparts;
901 my $modpmname = join '/', $modpmdir, $modfname.'.pm';
904 warn "Overwriting existing $ext$modpname!!!\n" if -e $modpname;
907 die "Won't overwrite existing $ext$modpname\n" if -e $modpname;
909 -d "$modpname" || mkpath([$modpname], 0, 0775);
910 chdir($modpname) || die "Can't chdir $ext$modpname: $!\n";
915 my $fdecls_parsed = [];
922 my @fnames_no_prefix;
926 if( ! $opt_X ){ # use XS, unless it was disabled
927 unless ($skip_ppport) {
928 require Devel::PPPort;
929 warn "Writing $ext$modpname/ppport.h\n";
930 Devel::PPPort::WriteFile('ppport.h')
931 || die "Can't create $ext$modpname/ppport.h: $!\n";
933 open(XS, ">$modfname.xs") || die "Can't create $ext$modpname/$modfname.xs: $!\n";
935 warn "Scanning typemaps...\n";
939 my $addflags = $opt_F || '';
941 foreach my $filename (@path_h) {
945 if ($fullpath{$filename} =~ /,/) {
949 warn "Scanning $filename for functions...\n";
950 my @styles = $Config{gccversion} ? qw(C++ C9X GNU) : qw(C++ C9X);
951 $c = new C
::Scan
'filename' => $filename, 'filename_filter' => $filter,
952 'add_cppflags' => $addflags, 'c_styles' => \
@styles;
953 $c->set('includeDirs' => ["$Config::Config{archlib}/CORE", $cwd]);
955 $c->get('keywords')->{'__restrict'} = 1;
957 push @
$fdecls_parsed, @
{ $c->get('parsed_fdecls') };
958 push(@
$fdecls, @
{$c->get('fdecls')});
960 push @td, @
{$c->get('typedefs_maybe')};
962 my $structs = $c->get('typedef_structs');
963 @structs{keys %$structs} = values %$structs;
967 %vdecl_hash = %{ $c->get('vdecl_hash') };
968 @vdecls = sort keys %vdecl_hash;
969 for (local $_ = 0; $_ < @vdecls; ++$_) {
970 my $var = $vdecls[$_];
971 my($type, $post) = @
{ $vdecl_hash{$var} };
973 warn "Can't handle variable '$type $var $post', skipping.\n";
974 splice @vdecls, $_, 1;
977 $type = normalize_type
($type);
978 $vdecl_hash{$var} = $type;
982 unless ($tmask_all) {
983 warn "Scanning $filename for typedefs...\n";
984 my $td = $c->get('typedef_hash');
985 # eval {require 'dumpvar.pl'; ::dumpValue($td)} or warn $@ if $opt_d;
986 my @f_good_td = grep $td->{$_}[1] eq '', keys %$td;
987 push @good_td, @f_good_td;
988 @typedefs_pre{@f_good_td} = map $_->[0], @
$td{@f_good_td};
992 $typedef_rex = qr(\b(?<!struct )(?:@good_td)\b) if @good_td;
994 %known_fnames = map @$_[1,3], @$fdecls_parsed; # [1,3] is NAME, FULLTEXT
997 for my $i (0..$#$fdecls_parsed) {
998 next unless $fdecls_parsed->[$i][1] =~ /$fmask/; # [1] is NAME
1000 print "... Function
$fdecls_parsed->[$i][1] passes
-M mask
.\n"
1003 $fdecls = [@$fdecls[@good]];
1004 $fdecls_parsed = [@$fdecls_parsed[@good]];
1006 @fnames = sort map $_->[1], @$fdecls_parsed; # 1 is NAME
1007 # Sort declarations:
1009 my %h = map( ($_->[1], $_), @$fdecls_parsed);
1010 $fdecls_parsed = [ @h{@fnames} ];
1012 @fnames_no_prefix = @fnames;
1014 = sort map { ++$prefix{$_} if s/^$opt_p(?!\d)//; $_ } @fnames_no_prefix
1016 # Remove macros which expand to typedefs
1017 print "Typedefs are
@td.\n" if $opt_d;
1018 my %td = map {($_, $_)} @td;
1019 # Add some other possible but meaningless values for macros
1020 for my $k (qw(char double float int long short unsigned signed void)) {
1021 $td{"$_$k"} = "$_$k" for ('', 'signed ', 'unsigned ');
1023 # eval {require 'dumpvar.pl'; ::dumpValue( [\@td, \%td] ); 1} or warn $@;
1026 while (keys %td > $n) {
1029 while (($k, $v) = each %seen_define) {
1030 # print("found '$k'=>'$v'\n"),
1031 $bad_macs{$k} = $td{$k} = $td{$v} if exists $td{$v};
1034 # Now %bad_macs contains names of bad macros
1035 for my $k (keys %bad_macs) {
1036 delete $const_names{$prefixless{$k}};
1037 print "Ignoring macro $k which expands to a typedef name '$bad_macs{$k}'\n" if $opt_d;
1041 my @const_names = sort keys %const_names;
1043 -d
$modpmdir || mkpath
([$modpmdir], 0, 0775);
1044 open(PM
, ">$modpmname") || die "Can't create $ext$modpname/$modpmname: $!\n";
1047 warn "Writing
$ext$modpname/$modpmname\n";
1052 use $compat_version;
1055 print PM
<<"END" unless $skip_strict;
1059 print PM
"use warnings;\n" unless $skip_warnings or $compat_version < 5.006;
1061 unless( $opt_X || $opt_c || $opt_A ){
1062 # we'll have an AUTOLOAD(), and it will have $AUTOLOAD and
1069 print PM
<<'END' unless $skip_exporter;
1074 my $use_Dyna = (not $opt_X and $compat_version < 5.006 and not $use_xsloader);
1075 print PM
<<"END" if $use_Dyna; # use DynaLoader, unless XS was disabled
1080 # Are we using AutoLoader or not?
1081 unless ($skip_autoloader) { # no autoloader whatsoever.
1082 unless ($opt_c) { # we're doing the AUTOLOAD
1083 print PM
"use AutoLoader;\n";
1086 print PM
"use AutoLoader qw(AUTOLOAD);\n"
1090 if ( $compat_version < 5.006 ) {
1091 my $vars = '$VERSION @ISA';
1092 $vars .= ' @EXPORT @EXPORT_OK %EXPORT_TAGS' unless $skip_exporter;
1093 $vars .= ' $AUTOLOAD' unless $opt_X || $opt_c || $opt_A;
1094 $vars .= ' $XS_VERSION' if $opt_B && !$opt_X;
1095 print PM "use vars
qw($vars);";
1100 push @modISA, 'Exporter' unless $skip_exporter;
1101 push @modISA, 'DynaLoader' if $use_Dyna; # no XS
1102 my $myISA = "our \@ISA = qw(@modISA);";
1103 $myISA =~ s/^our // if $compat_version < 5.006;
1105 print PM "\n$myISA\n\n";
1107 my @exported_names = (@const_names, @fnames_no_prefix, map '$'.$_, @vdecls);
1110 $tmp .= <<"END" unless $skip_exporter;
1111 # Items to export into callers namespace by default. Note: do not export
1112 # names by default without a very good reason. Use EXPORT_OK instead.
1113 # Do not simply export all your public functions/methods/constants.
1115 # This allows declaration use $module ':all';
1116 # If you do not need this, moving things directly into \@EXPORT or \@EXPORT_OK
1118 our %EXPORT_TAGS = ( 'all' => [ qw(
1122 our \
@EXPORT_OK = ( \@
{ \
$EXPORT_TAGS{'all'} } );
1130 $tmp .= "our \$VERSION = '$TEMPLATE_VERSION';\n";
1132 $tmp .= "our \$XS_VERSION = \$VERSION;\n" unless $opt_X;
1133 $tmp .= "\$VERSION = eval \$VERSION; # see L<perlmodstyle>\n";
1137 $tmp =~ s/^our //mg if $compat_version < 5.006;
1141 printf PM
"our(@{[ join ', ', map '$'.$_, @vdecls ]});\n\n";
1145 print PM autoload
($module, $compat_version) unless $opt_c or $opt_X;
1147 if( ! $opt_X ){ # print bootstrap, unless XS is disabled
1150 bootstrap $module \$VERSION;
1155 XSLoader::load('$module', \$VERSION);
1158 $tmp =~ s
:\
$VERSION:\
$XS_VERSION:g
if $opt_B;
1162 # tying the variables can happen only after bootstrap
1166 @{[ join "\n", map " _tievar_$_(\$$_);", @vdecls ]}
1173 if( $opt_P ){ # if POD is disabled
1182 # Preloaded methods go here.
1185 print PM
<<"END" unless $opt_A;
1187 # Autoload methods go after $after, and are processed by the autosplit program.
1196 my ($email,$author,$licence);
1200 ($username,$author) = (getpwuid($>))[0,6];
1201 if (defined $username && defined $author) {
1202 $author =~ s/,.*$//; # in case of sub fields
1203 my $domain = $Config{'mydomain'};
1205 $email = "$username\@$domain";
1209 $author =~ s/'/\\'/g if defined $author;
1210 $author ||= "A. U. Thor";
1211 $email ||= 'a.u.thor@a.galaxy.far.far.away';
1213 $licence = sprintf << "DEFAULT", $^V
;
1214 Copyright
(C
) ${\
(1900 + (localtime) [5])} by
$author
1216 This library is free software
; you can redistribute it
and/or modify
1217 it under the same terms as Perl itself
, either Perl version
%vd or,
1218 at your option
, any later version of Perl
5 you may have available
.
1222 $revhist = <<EOT if $opt_C;
1228 #=item $TEMPLATE_VERSION
1230 #Original version; created by h2xs $H2XS_VERSION with options
1238 my $exp_doc = $skip_exporter ?
'' : <<EOD;
1246 if (@const_names and not $opt_P) {
1247 $exp_doc .= <<EOD unless $skip_exporter;
1248 #=head2 Exportable constants
1250 # @{[join "\n ", @const_names]}
1255 if (defined $fdecls and @
$fdecls and not $opt_P) {
1256 $exp_doc .= <<EOD unless $skip_exporter;
1257 #=head2 Exportable functions
1261 # $exp_doc .= <<EOD if $opt_p;
1262 #When accessing these functions from Perl, prefix C<$opt_p> should be removed.
1265 $exp_doc .= <<EOD unless $skip_exporter;
1266 # @{[join "\n ", @known_fnames{@fnames}]}
1273 if ($opt_x && $opt_a) {
1275 $meth_doc .= accessor_docs
($name, $struct)
1276 while ($name, $struct) = each %structs;
1279 # Prefix the default licence with hash symbols.
1280 # Is this just cargo cult - it seems that the first thing that happens to this
1281 # block is that all the hashes are then s///g out.
1282 my $licence_hash = $licence;
1283 $licence_hash =~ s/^/#/gm;
1286 $pod = <<"END" unless $opt_P;
1287 ## Below is stub documentation for your module. You'd better edit it!
1291 #$module - Perl extension for blah blah blah
1300 #Stub documentation for $module, created by h2xs. It looks like the
1301 #author of the extension was negligent enough to leave the stub
1305 $exp_doc$meth_doc$revhist
1309 #Mention other useful documentation such as the documentation of
1310 #related modules or operating system documentation (such as man pages
1311 #in UNIX), or any relevant external documentation such as RFCs or
1314 #If you have a mailing list set up for your module, mention it here.
1316 #If you have a web site set up for your module, mention it here.
1320 #$author, E<lt>${email}E<gt>
1322 #=head1 COPYRIGHT AND LICENSE
1329 $pod =~ s/^\#//gm unless $opt_P;
1330 print PM
$pod unless $opt_P;
1335 if( ! $opt_X ){ # print XS, unless it is disabled
1336 warn "Writing $ext$modpname/$modfname.xs\n";
1345 print XS
<<"END" unless $skip_ppport;
1351 foreach my $path_h (@path_h_ini) {
1353 $h =~ s
#^/usr/include/##;
1354 if ($^O
eq 'VMS') { $h =~ s
#.*vms\]#sys/# or $h =~ s#.*[:>\]]##; }
1355 print XS
qq{#include <$h>\n};
1360 print XS
<<"END" if $opt_g;
1364 #define MY_CXT_KEY "${module}::_guts" XS_VERSION
1367 /* Put Global Data in here */
1368 int dummy; /* you can access this elsewhere as MY_CXT.dummy */
1375 my %pointer_typedefs;
1376 my %struct_typedefs;
1380 my $out = $pointer_typedefs{$type};
1381 return $out if defined $out;
1383 $out = ($type =~ /\*$/);
1384 # This converts only the guys which do not have trailing part in the typedef
1386 and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1387 $type = normalize_type
($type);
1388 print "Is-Pointer: Type mutation via typedefs: $otype ==> $type\n"
1390 $out = td_is_pointer
($type);
1392 return ($pointer_typedefs{$otype} = $out);
1397 my $out = $struct_typedefs{$type};
1398 return $out if defined $out;
1400 $out = ($type =~ /^(struct|union)\b/) && !td_is_pointer
($type);
1401 # This converts only the guys which do not have trailing part in the typedef
1403 and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1404 $type = normalize_type
($type);
1405 print "Is-Struct: Type mutation via typedefs: $otype ==> $type\n"
1407 $out = td_is_struct
($type);
1409 return ($struct_typedefs{$otype} = $out);
1412 print_tievar_subs
(\
*XS
, $_, $vdecl_hash{$_}) for @vdecls;
1415 # We write the "sample" files used when this module is built by perl without
1416 # ExtUtils::Constant.
1417 # h2xs will later check that these are the same as those generated by the
1418 # code embedded into Makefile.PL
1419 unless (-d
$fallbackdirname) {
1420 mkdir "$fallbackdirname" or die "Cannot mkdir $fallbackdirname: $!\n";
1422 warn "Writing $ext$modpname/$fallbackdirname/$constscfname\n";
1423 warn "Writing $ext$modpname/$fallbackdirname/$constsxsfname\n";
1424 my $cfallback = File
::Spec
->catfile($fallbackdirname, $constscfname);
1425 my $xsfallback = File
::Spec
->catfile($fallbackdirname, $constsxsfname);
1426 WriteConstants
( C_FILE
=> $cfallback,
1427 XS_FILE
=> $xsfallback,
1428 DEFAULT_TYPE
=> $opt_t,
1430 NAMES
=> \
@const_names,
1432 print XS
"#include \"$constscfname\"\n";
1436 my $prefix = defined $opt_p ?
"PREFIX = $opt_p" : '';
1438 # Now switch from C to XS by issuing the first MODULE declaration:
1441 MODULE = $module PACKAGE = $module $prefix
1445 # If a constant() function was #included then output a corresponding
1447 print XS
"INCLUDE: $constsxsfname\n" unless $opt_c;
1449 print XS
<<"END" if $opt_g;
1454 /* If any of the fields in the my_cxt_t struct need
1455 to be initialised, do it here.
1461 foreach (sort keys %const_xsub) {
1470 croak("Your vendor has not defined the $module macro $_");
1485 my ($type, $name, $args) = @
$decl;
1486 return if $seen_decl{$name}++; # Need to do the same for docs as well?
1488 my @argnames = map {$_->[1]} @
$args;
1489 my @argtypes = map { normalize_type
( $_->[0], 1 ) } @
$args;
1491 s/^\s*const\b\s*// for @argtypes;
1493 my @argarrays = map { $_->[4] || '' } @
$args;
1494 my $numargs = @
$args;
1495 if ($numargs and $argtypes[-1] eq '...') {
1497 $argnames[-1] = '...';
1500 $type = normalize_type($type, 1);
1508 for my $arg (0 .. $numargs - 1) {
1510 $argtypes[$arg] $argnames[$arg]$argarrays[$arg]
1515 sub print_tievar_subs
{
1516 my($fh, $name, $type) = @_;
1519 _get_$name(IV index, SV *sv) {
1524 (void)call_pv("$module\::_get_$name", G_DISCARD);
1529 _set_$name(IV index, SV *sv) {
1534 (void)call_pv("$module\::_set_$name", G_DISCARD);
1541 sub print_tievar_xsubs
{
1542 my($fh, $name, $type) = @_;
1550 uf.uf_val = &_get_$name;
1551 uf.uf_set = &_set_$name;
1552 uf.uf_index = (IV)&_get_$name;
1553 sv_magic(sv, 0, 'U', (char*)&uf, sizeof(uf));
1557 $type THIS = NO_INIT
1573 sub print_accessors
{
1574 my($fh, $name, $struct) = @_;
1575 return unless defined $struct && $name !~ /\s|_ANON/;
1576 $name = normalize_type
($name);
1577 my $ptrname = normalize_type
("$name *");
1580 MODULE = $module PACKAGE = ${name} $prefix
1584 $name THIS = NO_INIT
1587 if (sv_derived_from(ST(0), "$name")) {
1589 char *s = SvPV((SV*)SvRV(ST(0)), len);
1590 if (len != sizeof(THIS))
1591 croak("Size \%d of packed data != expected \%d",
1593 RETVAL = ($name *)s;
1596 croak("THIS is not of type $name");
1602 char *CLASS = NO_INIT
1605 Zero((void*)&RETVAL, sizeof(RETVAL), char);
1609 MODULE = $module PACKAGE = ${name}Ptr $prefix
1612 my @items = @
$struct;
1614 my $item = shift @items;
1615 if ($item->[0] =~ /_ANON/) {
1616 if (defined $item->[2]) {
1618 @
$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]",
1619 ], @
{ $structs{$item->[0]} };
1621 push @items, @
{ $structs{$item->[0]} };
1624 my $type = normalize_type
($item->[0]);
1625 my $ttype = $structs{$type} ? normalize_type
("$type *") : $type;
1628 $item->[2](THIS, __value = NO_INIT)
1634 THIS->$item->[-1] = __value;
1636 $type eq $ttype ? "THIS->$item->[-1]" : "&(THIS->$item->[-1])"
1647 my($name, $struct) = @_;
1648 return unless defined $struct && $name !~ /\s|_ANON/;
1649 $name = normalize_type
($name);
1650 my $ptrname = $name . 'Ptr';
1651 my @items = @
$struct;
1654 my $item = shift @items;
1655 if ($item->[0] =~ /_ANON/) {
1656 if (defined $item->[2]) {
1658 @
$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]",
1659 ], @
{ $structs{$item->[0]} };
1661 push @items, @
{ $structs{$item->[0]} };
1664 push @list, $item->[2];
1667 my $methods = (join '(...)>, C<', @list) . '(...)';
1671 #=head2 Object and class methods for C<$name>/C<$ptrname>
1673 #The principal Perl representation of a C object of type C<$name> is an
1674 #object of class C<$ptrname> which is a reference to an integer
1675 #representation of a C pointer. To create such an object, one may use
1678 # my \$buffer = $name->new();
1679 # my \$obj = \$buffer->_to_ptr();
1681 #This exersizes the following two methods, and an additional class
1682 #C<$name>, the internal representation of which is a reference to a
1683 #packed string with the C structure. Keep in mind that \$buffer should
1684 #better survive longer than \$obj.
1688 #=item C<\$object_of_type_$name-E<gt>_to_ptr()>
1690 #Converts an object of type C<$name> to an object of type C<$ptrname>.
1692 #=item C<$name-E<gt>new()>
1694 #Creates an empty object of type C<$name>. The corresponding packed
1695 #string is zeroed out.
1699 #return the current value of the corresponding element if called
1700 #without additional arguments. Set the element to the supplied value
1701 #(and return the new value) if called with an additional argument.
1703 #Applicable to objects of type C<$ptrname>.
1712 # Should be called before any actual call to normalize_type().
1714 # We do not want to read ./typemap by obvios reasons.
1715 my @tm = qw(../../../typemap ../../typemap ../typemap);
1716 my $stdtypemap = "$Config::Config{privlib}/ExtUtils/typemap";
1717 unshift @tm, $stdtypemap;
1718 my $proto_re = "[" . quotemeta('\$%&*@;') . "]" ;
1720 # Start with useful default values
1721 $typemap{float
} = 'T_NV';
1723 foreach my $typemap (@tm) {
1724 next unless -e
$typemap ;
1725 # skip directories, binary files etc.
1726 warn " Scanning $typemap\n";
1727 warn("Warning: ignoring non-text typemap file '$typemap'\n"), next
1728 unless -T
$typemap ;
1729 open(TYPEMAP
, $typemap)
1730 or warn ("Warning: could not open typemap file '$typemap': $!\n"), next;
1731 my $mode = 'Typemap';
1734 if (/^INPUT\s*$/) { $mode = 'Input'; next; }
1735 elsif (/^OUTPUT\s*$/) { $mode = 'Output'; next; }
1736 elsif (/^TYPEMAP\s*$/) { $mode = 'Typemap'; next; }
1737 elsif ($mode eq 'Typemap') {
1738 next if /^\s*($|\#)/ ;
1740 if ( ($type, $image) =
1741 /^\s*(.*?\S)\s+(\S+)\s*($proto_re*)\s*$/o
1742 # This may reference undefined functions:
1743 and not ($image eq 'T_PACKED' and $typemap eq $stdtypemap)) {
1744 $typemap{normalize_type
($type)} = $image;
1748 close(TYPEMAP
) or die "Cannot close $typemap: $!";
1750 %std_types = %types_seen;
1755 sub normalize_type
{ # Second arg: do not strip const's before \*
1757 my $do_keep_deep_const = shift;
1758 # If $do_keep_deep_const this is heuristical only
1759 my $keep_deep_const = ($do_keep_deep_const ?
'\b(?![^(,)]*\*)' : '');
1761 = "(?:\\b(?:(?:__const__|const)$keep_deep_const|static|inline|__inline__)\\b\\s*)*";
1762 if ($do_keep_deep_const) { # Keep different compiled /RExen/o separately!
1763 $type =~ s/$ignore_mods//go;
1766 $type =~ s/$ignore_mods//go;
1768 $type =~ s/([^\s\w])/ $1 /g;
1772 $type =~ s/\* (?=\*)/*/g;
1773 $type =~ s/\. \. \./.../g;
1775 $types_seen{$type}++
1776 unless $type eq '...' or $type eq 'void' or $std_types{$type};
1782 sub assign_typemap_entry
{
1786 if ($tmask and $type =~ /$tmask/) {
1787 print "Type $type matches -o mask\n" if $opt_d;
1788 $entry = (td_is_struct
($type) ?
"T_OPAQUE_STRUCT" : "T_PTROBJ");
1790 elsif ($typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1791 $type = normalize_type
$type;
1792 print "Type mutation via typedefs: $otype ==> $type\n" if $opt_d;
1793 $entry = assign_typemap_entry
($type);
1795 # XXX good do better if our UV happens to be long long
1796 return "T_NV" if $type =~ /^(unsigned\s+)?long\s+(long|double)\z/;
1797 $entry ||= $typemap{$otype}
1798 || (td_is_struct
($type) ?
"T_OPAQUE_STRUCT" : "T_PTROBJ");
1799 $typemap{$otype} = $entry;
1800 $need_opaque = 1 if $entry eq "T_OPAQUE_STRUCT";
1805 print_tievar_xsubs
(\
*XS
, $_, $vdecl_hash{$_});
1809 for my $decl (@
$fdecls_parsed) { print_decl
(\
*XS
, $decl) }
1811 while (my($name, $struct) = each %structs) {
1812 print_accessors
(\
*XS
, $name, $struct);
1821 warn "Writing $ext$modpname/typemap\n";
1822 open TM
, ">typemap" or die "Cannot open typemap file for write: $!";
1824 for $type (sort keys %types_seen) {
1825 my $entry = assign_typemap_entry
$type;
1826 print TM
$type, "\t" x
(5 - int((length $type)/8)), "\t$entry\n"
1829 print TM
<<'EOP' if $need_opaque; # Older Perls do not have correct entry
1830 #############################################################################
1833 if (sv_derived_from($arg, \"${ntype}\")) {
1835 char *s = SvPV((SV*)SvRV($arg), len);
1837 if (len != sizeof($var))
1838 croak(\"Size %d of packed data != expected %d\",
1843 croak(\"$var is not of type ${ntype}\")
1844 #############################################################################
1847 sv_setref_pvn($arg, \"${ntype}\", (char *)&$var, sizeof($var));
1850 close TM
or die "Cannot close typemap file for write: $!";
1855 warn "Writing $ext$modpname/Makefile.PL\n";
1856 open(PL
, ">Makefile.PL") || die "Can't create $ext$modpname/Makefile.PL: $!\n";
1860 if ( $compat_version < 5.00702 and $new_test )
1862 $prereq_pm .= q
%'Test::More' => 0, %;
1865 if ( $compat_version < 5.00600 and !$opt_X and $use_xsloader)
1867 $prereq_pm .= q
%'XSLoader' => 0, %;
1871 use $compat_version;
1872 use ExtUtils::MakeMaker;
1873 # See lib/ExtUtils/MakeMaker.pm for details of how to influence
1874 # the contents of the Makefile that is written.
1877 VERSION_FROM => '$modpmname', # finds \$VERSION
1878 PREREQ_PM => {$prereq_pm}, # e.g., Module::Name => 1.1
1879 (\$] >= 5.005 ? ## Add these new keywords supported since 5.005
1880 (ABSTRACT_FROM => '$modpmname', # retrieve abstract from module
1881 AUTHOR => '$author <$email>') : ()),
1883 if (!$opt_X) { # print C stuff, unless XS is disabled
1884 $opt_F = '' unless defined $opt_F;
1885 my $I = (((glob '*.h') || (glob '*.hh')) ?
'-I.' : '');
1886 my $Ihelp = ($I ?
'-I. ' : '');
1887 my $Icomment = ($I ?
'' : <<EOC);
1888 # Insert -I. if you add *.h files later:
1892 LIBS => ['$extralibs'], # e.g., '-lm'
1893 DEFINE => '$opt_F', # e.g., '-DHAVE_SOMETHING'
1894 $Icomment INC => '$I', # e.g., '${Ihelp}-I/usr/include/other'
1897 my $C = grep {$_ ne "$modfname.c"}
1898 (glob '*.c'), (glob '*.cc'), (glob '*.C');
1899 my $Cpre = ($C ?
'' : '# ');
1900 my $Ccomment = ($C ?
'' : <<EOC);
1901 # Un-comment this if you add C files to link with later:
1905 $Ccomment ${Cpre}OBJECT => '\$(O_FILES)', # link all the C files too
1911 WriteMakefileSnippet
( C_FILE
=> $constscfname,
1912 XS_FILE
=> $constsxsfname,
1913 DEFAULT_TYPE
=> $opt_t,
1915 NAMES
=> \
@const_names,
1918 if (eval {require ExtUtils::Constant; 1}) {
1919 # If you edit these definitions to change the constants used by this module,
1920 # you will need to use the generated $constscfname and $constsxsfname
1921 # files to replace their "fallback" counterparts before distributing your
1928 foreach my \$file ('$constscfname', '$constsxsfname') {
1929 my \$fallback = File::Spec->catfile('$fallbackdirname', \$file);
1930 copy (\$fallback, \$file) or die "Can't copy \$fallback to \$file: \$!";
1935 eval $generate_code;
1938 Attempting to test constant code in $ext$modpname/Makefile.PL:
1941 gave unexpected error $@
1942 Please report the circumstances of this bug in h2xs version $H2XS_VERSION
1943 using the perlbug script.
1948 foreach my $file ($constscfname, $constsxsfname) {
1949 my $fallback = File
::Spec
->catfile($fallbackdirname, $file);
1950 if (compare
($file, $fallback)) {
1952 Files
"$ext$modpname/$fallbackdirname/$file" and "$ext$modpname/$file" differ
.
1958 warn fill
('','', <<"EOM") . "\n";
1959 It appears that the code in $ext$modpname/Makefile.PL does not autogenerate
1960 the files $ext$modpname/$constscfname and $ext$modpname/$constsxsfname
1963 Please report the circumstances of this bug in h2xs version $H2XS_VERSION
1964 using the perlbug script.
1967 unlink $constscfname, $constsxsfname;
1971 close(PL
) || die "Can't close $ext$modpname/Makefile.PL: $!\n";
1973 # Create a simple README since this is a CPAN requirement
1974 # and it doesnt hurt to have one
1975 warn "Writing $ext$modpname/README\n";
1976 open(RM
, ">README") || die "Can't create $ext$modpname/README:$!\n";
1977 my $thisyear = (gmtime)[5] + 1900;
1978 my $rmhead = "$modpname version $TEMPLATE_VERSION";
1979 my $rmheadeq = "=" x
length($rmhead);
1983 if ( $compat_version < 5.00702 and $new_test )
1985 $rm_prereq = 'Test::More';
1989 $rm_prereq = 'blah blah blah';
1996 The README is used to introduce the module
and provide instructions on
1997 how to install the module
, any machine dependencies it may have
(for
1998 example C compilers
and installed libraries
) and any other information
1999 that should be provided before the module is installed
.
2001 A README file is required
for CPAN modules since CPAN extracts the
2002 README file from a module distribution so that people browsing the
2003 archive can
use it get an idea of the modules uses
. It is usually a
2004 good idea to provide version information here so that people can
2005 decide whether fixes
for the module are worth downloading
.
2009 To install this module type the following
:
2018 This module requires these other modules
and libraries
:
2022 COPYRIGHT AND LICENCE
2024 Put the correct copyright
and licence information here
.
2029 close(RM
) || die "Can't close $ext$modpname/README: $!\n";
2032 my $testfile = "$testdir/$modpname.t";
2033 unless (-d
"$testdir") {
2034 mkdir "$testdir" or die "Cannot mkdir $testdir: $!\n";
2036 warn "Writing $ext$modpname/$testfile\n";
2037 my $tests = @const_names ?
2 : 1;
2039 open EX
, ">$testfile" or die "Can't create $ext$modpname/$testfile: $!\n";
2042 # Before `make install' is performed this script should be runnable with
2043 # `make test'. After `make install' it should work as `perl $modpname.t'
2045 #########################
2047 # change 'tests => $tests' to 'tests => last_test_to_print';
2051 my $test_mod = 'Test::More';
2053 if ( $old_test or ($compat_version < 5.007 and not $new_test ))
2055 my $test_mod = 'Test';
2059 BEGIN { plan tests
=> $tests };
2061 ok
(1); # If we made it this far, we're ok.
2066 my $const_names = join " ", @const_names;
2070 foreach my $constname (qw(
2073 print EX wrap ("\t", "\t", $const_names);
2074 print EX (")) {\n");
2077 next if (eval "my \\\$a = \$constname; 1");
2078 if (\$\@ =~ /^Your vendor has not defined $module macro \$constname/) {
2079 print "# pass: \$\@";
2081 print "# fail: \$\@";
2086 print "not ok 2\\n";
2097 use Test::More tests => $tests;
2098 BEGIN { use_ok('$module') };
2103 my $const_names = join " ", @const_names;
2107 foreach my $constname (qw(
2110 print EX wrap ("\t", "\t", $const_names);
2111 print EX (")) {\n");
2114 next if (eval "my \\\$a = \$constname; 1");
2115 if (\$\@ =~ /^Your vendor has not defined $module macro \$constname/) {
2116 print "# pass: \$\@";
2118 print "# fail: \$\@";
2124 ok( \$fail == 0 , 'Constants' );
2130 #########################
2132 # Insert your test code below, the $test_mod module is use()ed here so read
2133 # its man page ( perldoc $test_mod ) for help writing this test script.
2137 close(EX) || die "Can't close $ext$modpname/$testfile: $!\n";
2140 warn "Writing $ext$modpname/Changes\n";
2142 open(EX, ">Changes") || die "Can't create $ext$modpname/Changes: $!\n";
2143 @ARGS = map {/[\s\"\'\`\$*?^|&<>\[\]\{\}\(\)]/ ? "'$_'" : $_} @ARGS;
2145 Revision history for Perl extension $module.
2147 $TEMPLATE_VERSION @{[scalar localtime]}
2148 \t- original version; created by h2xs $H2XS_VERSION with options
2152 close(EX
) || die "Can't close $ext$modpname/Changes: $!\n";
2155 warn "Writing $ext$modpname/MANIFEST\n";
2156 open(MANI
,'>MANIFEST') or die "Can't create MANIFEST: $!";
2157 my @files = grep { -f
} (<*>, <t
/*>, <$fallbackdirname/*>, <$modpmdir/*>);
2159 eval {opendir(D
,'.');};
2160 unless ($@
) { @files = readdir(D
); closedir(D
); }
2162 if (!@files) { @files = map {chomp && $_} `ls`; }
2165 # Clip trailing '.' for portability -- non-VMS OSs don't expect it
2167 # Fix up for case-sensitive file systems
2168 s/$modfname/$modfname/i && next;
2169 $_ = "\U$_" if $_ eq 'manifest' or $_ eq 'changes';
2170 $_ = 'Makefile.PL' if $_ eq 'makefile.pl';
2173 print MANI
join("\n",@files), "\n";