meaning the parens are optional. Even subroutines may be called as
list operators if they've already been declared.
- More embeddible. See main.c and embed_h.SH. Multiple interpreters
+ More embeddible. See main.c and embed_h.sh. Multiple interpreters
in the same process are supported (though not with interleaved
execution yet).
$cc $ccflags -c bar2.c >/dev/null 2>&1
$cc $ccflags -c foo.c >/dev/null 2>&1
ar rc bar.a bar2.o bar1.o >/dev/null 2>&1
-if $cc $ccflags $ldflags -o foobar foo.o bar.a $libs > /dev/null 2>&1 &&
+if test -n "$ranlib" ; then
+ orderlib=false
+elif $cc $ccflags $ldflags -o foobar foo.o bar.a $libs > /dev/null 2>&1 &&
./foobar >/dev/null 2>&1; then
echo "ar appears to generate random libraries itself."
orderlib=false
emacs/perldb.pl Emacs debugging
emacs/tedstuff Some optional patches
embed.h Maps symbols to safer names
-embed_h.SH Produces embed.h
+embed_h.sh Produces embed.h
ext/DB_File/DB_File.pm Berkeley DB extension Perl module
ext/DB_File/DB_File.xs Berkeley DB extension external subroutines
ext/DB_File/DB_File_BS Berkeley DB extension mkbootstrap fodder
ext/Socket/Makefile.PL Socket extension makefile writer
ext/Socket/Socket.pm Socket extension Perl module
ext/Socket/Socket.xs Socket extension external subroutines
-ext/typemap Extension interface types
ext/util/extliblist Used by extension Makefile.PL to make lib lists
ext/util/make_ext Used by Makefile to execute extension Makefiles
ext/util/mkbootstrap Turns ext/*/*_BS into bootstrap info
-ext/xsubpp External subroutine preprocessor
form.h Public declarations for the above
global.sym Symbols that need hiding when embedded
gv.c Glob value code
lib/Env.pm Map environment into ordinary variables
lib/Exporter.pm Exporter base class
lib/ExtUtils/MakeMaker.pm Write Makefiles for extensions
+lib/ExtUtils/typemap Extension interface types
+lib/ExtUtils/xsubpp External subroutine preprocessor
lib/File/Basename.pm A module to emulate the basename program
lib/File/CheckTree.pm Perl module supporting wholesale file mode validation
lib/File/Find.pm Routines to do a find
x2p/handy.h Handy definitions
x2p/hash.c Associative arrays again
x2p/hash.h Public declarations for the above
-x2p/malloc.c Malloc code
x2p/s2p.SH Sed to perl translator
x2p/s2p.man Manual page for sed to perl translator
x2p/str.c String handling package
util =
-sh = Makefile.SH cflags.SH embed_h.SH makedepend.SH makedir.SH writemain.SH
+sh = Makefile.SH cflags.SH makedepend.SH makedir.SH writemain.SH
h1 = EXTERN.h INTERN.h XSUB.h av.h config.h cop.h cv.h dosish.h
h2 = embed.h form.h gv.h handy.h hv.h keywords.h mg.h op.h
opcode.h: opcode.pl
- perl opcode.pl
-embed.h: embed_h.SH global.sym interp.sym
- sh embed_h.SH
+embed.h: embed_h.sh global.sym interp.sym
+ sh embed_h.sh
preplibrary: miniperl lib/Config.pm
@test -d lib/auto || mkdir lib/auto
require Exporter;
require AutoLoader;
require DynaLoader;
-@ISA = (TieHash, Exporter, AutoLoader, DynaLoader);
+@ISA = (TieHash, Exporter, DynaLoader);
@EXPORT = qw(
$DB_BTREE $DB_HASH $DB_RECNO
BTREEMAGIC
require Exporter;
require AutoLoader;
require DynaLoader;
-@ISA = (Exporter, AutoLoader, DynaLoader);
+@ISA = (Exporter, DynaLoader);
# Items to export into callers namespace by default
# (move infrequently used names to @EXPORT_OK below)
@EXPORT =
require Exporter;
require AutoLoader;
require DynaLoader;
-@ISA = (TieHash, Exporter, AutoLoader, DynaLoader);
+@ISA = (TieHash, Exporter, DynaLoader);
@EXPORT = qw(
GDBM_CACHESIZE
GDBM_FAST
require AutoLoader;
require DynaLoader;
require Config;
-@ISA = (Exporter, AutoLoader, DynaLoader);
+@ISA = (Exporter, DynaLoader);
$H{assert_h} = [qw(assert NDEBUG)];
require Exporter;
require AutoLoader;
require DynaLoader;
-@ISA = (Exporter, AutoLoader, DynaLoader);
+@ISA = (Exporter, DynaLoader);
@EXPORT = qw(
AF_802
AF_APPLETALK
#!/usr/bin/perl
-'di ';
-'ds 00 \"';
-'ig 00 ';
+
+=head1 NAME
+
+h2xs - convert .h C header files to Perl extensions
+
+=head1 SYNOPSIS
+
+B<h2xs> [B<-Acfh>] [B<-n> module_name] [headerfile [extra_libraries]]
+
+=head1 DESCRIPTION
+
+I<h2xs> builds a Perl extension from any C header file. The extension will
+include functions which can be used to retrieve the value of any #define
+statement which was in the C header.
+
+The I<module_name> will be used for the name of the extension. If
+module_name is not supplied then the name of the header file will be used,
+with the first character capitalized.
+
+If the extension might need extra libraries, they should be included
+here. The extension Makefile.PL will take care of checking whether
+the libraries actually exist and how they should be loaded.
+The extra libraries should be specified in the form -lm -lposix, etc,
+just as on the cc command line. By default, the Makefile.PL will
+search through the library path determined by Configure. That path
+can be augmented by including arguments of the form B<-L/another/library/path>
+in the extra-libraries argument.
+
+=head1 OPTIONS
+
+=over 5
+
+=item B<-n> I<module_name>
+
+Specifies a name to be used for the extension, e.g., S<-n RPC::DCE>
+
+=item B<-f>
+
+Allows an extension to be created for a header even if that header is
+not found in /usr/include.
+
+=item B<-c>
+
+Omit C<constant()> from the .xs file and corresponding specialised
+C<AUTOLOAD> from the .pm file.
+
+=item B<-A>
+
+Omit all autoload facilities. This is the same as B<-c> but also removes the
+S<C<require AutoLoader>> statement from the .pm file.
+
+=back
+
+=head1 EXAMPLES
+
+
+ # Default behavior, extension is Rusers
+ h2xs rpcsvc/rusers
+
+ # Same, but extension is RUSERS
+ h2xs -n RUSERS rpcsvc/rusers
+
+ # Extension is rpcsvc::rusers. Still finds <rpcsvc/rusers.h>
+ h2xs rpcsvc::rusers
+
+ # Extension is ONC::RPC. Still finds <rpcsvc/rusers.h>
+ h2xs -n ONC::RPC rpcsvc/rusers
+
+ # Without constant() or AUTOLOAD
+ h2xs -c rpcsvc/rusers
+
+ # Creates templates for an extension named RPC
+ h2xs -cfn RPC
+
+ # Extension is ONC::RPC.
+ h2xs -cfn ONC::RPC
+
+ # Makefile.PL will look for library -lrpc in
+ # additional directory /opt/net/lib
+ h2xs rpcsvc/rusers -L/opt/net/lib -lrpc
+
+
+=head1 ENVIRONMENT
+
+No environment variables are used.
+
+=head1 AUTHOR
+
+Larry Wall and others
+
+=head1 SEE ALSO
+
+L<perl>, L<ExtUtils::MakeMaker>, L<AutoLoader>
+
+=head1 DIAGNOSTICS
+
+The usual warnings if it can't read or write the files involved.
+
+=cut
+
use Getopt::Std;
sub usage{
warn "@_\n" if @_;
- die 'h2xs [-fnch] [-n module_name] [headerfile [extra_libraries]]
+ die 'h2xs [-Acfh] [-n module_name] [headerfile [extra_libraries]]
-f Force creation of the extension even if the C header does not exist.
-n Specify a name to use for the extension (recommended).
-c Omit the constant() function and specialised AUTOLOAD from the XS file.
+ -A Omit all autoloading facilities (implies -c).
-h Display this help message
extra_libraries
are any libraries that might be needed for loading the
}
-getopts("fhcAn:") || usage;
+getopts("Acfhn:") || usage;
usage if $opt_h;
$opt_c = 1 if $opt_A;
package $module;
require Exporter;
-require AutoLoader;
require DynaLoader;
+END
+
+if( ! $opt_A ){
+ print PM <<"END";
+require AutoLoader;
+END
+}
+
+if( $opt_c && ! $opt_A ){
+ # we won't have our own AUTOLOAD(), so we'll inherit it.
+ print PM <<"END";
\@ISA = qw(Exporter AutoLoader DynaLoader);
+END
+}
+else{
+ # 1) we have our own AUTOLOAD(), so don't need to inherit it.
+ # or
+ # 2) we don't want autoloading mentioned.
+ print PM <<"END";
+
+\@ISA = qw(Exporter DynaLoader);
+END
+}
+print PM<<"END";
# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.
print PM <<"END" unless $opt_c;
sub AUTOLOAD {
- # This AUTOLOAD function overrides the one inherited from AutoLoader.
- # It is used to 'autoload' constants from the constant() XS function.
+ # This AUTOLOAD is used to 'autoload' constants from the constant()
+ # XS function. If a constant is not found then control is passed
+ # to the AUTOLOAD in AutoLoader.
# NOTE: THIS AUTOLOAD FUNCTION IS FLAWED (but is the best we can do for now).
# Avoid old-style ``&CONST'' usage. Either remove the ``&'' or add ``()''.
system '/bin/ls > MANIFEST';
-
-
-##############################################################################
-
- # These next few lines are legal in both Perl and nroff.
-
-.00 ; # finish .ig
-
-'di \" finish diversion--previous line must be blank
-.nr nl 0-1 \" fake up transition to first page again
-.nr % 0 \" start at page 1
-'; __END__ ############# From here on it's a standard manual page ############
-.TH H2XS 1 "August 9, 1994"
-.AT 3
-.SH NAME
-h2xs \- convert .h C header files to Perl extensions
-.SH SYNOPSIS
-.B h2xs [-Aachfm] [-n module_name] [headerfile [extra_libraries]]
-.SH DESCRIPTION
-.I h2xs
-builds a Perl extension from any C header file. The extension will include
-functions which can be used to retrieve the value of any #define statement
-which was in the C header.
-.PP
-The
-.I module_name
-will be used for the name of the extension. If module_name is not supplied
-then the name of the header file will be used, with the first character
-capitalized.
-.PP
-If the extension might need extra libraries, they should be included
-here. The extension Makefile.PL will take care of checking whether
-the libraries actually exist and how they should be loaded.
-The extra libraries should be specified in the form -lm -lposix, etc,
-just as on the cc command line. By default, the Makefile.PL will
-search through the library path determined by Configure. That path
-can be augmented by including arguments of the form -L/another/library/path
-in the extra-libraries argument.
-.SH OPTIONS
-.TP
-.B \-n module_name
-Specifies a name to be used for the extension, e.g., -n RPC::DCE
-.TP
-.B \-f
-Allows an extension to be created for a header even if that header is
-not found in /usr/include.
-.TP
-.B \-c
-Omit constant() from the .xs file and corresponding specialised AUTOLOAD from
-the .pm file.
-.TP
-.B \-A
-Deprecated synonym for -c.
-.SH EXAMPLES
-.nf
-
- # Default behavior, extension is Rusers
- h2xs rpcsvc/rusers
-
- # Same, but extension is RUSERS
- h2xs -n RUSERS rpcsvc/rusers
-
- # Extension is rpcsvc::rusers. Still finds <rpcsvc/rusers.h>
- h2xs rpcsvc::rusers
-
- # Extension is ONC::RPC. Still finds <rpcsvc/rusers.h>
- h2xs -n ONC::RPC rpcsvc/rusers
-
- # Without constant() or AUTOLOAD
- h2xs -c rpcsvc/rusers
-
- # Creates templates for an extension named RPC
- h2xs -cfn RPC
-
- # Extension is ONC::RPC.
- h2xs -cfn ONC::RPC
-
- # Makefile.PL will look for library -lrpc in
- # additional directory /opt/net/lib
- h2xs rpcsvc/rusers -L/opt/net/lib -lrpc
-
-.fi
-.SH ENVIRONMENT
-No environment variables are used.
-.SH AUTHOR
-Larry Wall and others
-.SH "SEE ALSO"
-perl(1) ExtUtils::MakeMaker
-.SH DIAGNOSTICS
-The usual warnings if it can't read or write the files involved.
-.ex
$installbin || die "No installbin directory in config.sh\n";
-d $installbin || die "$installbin is not a directory\n";
-w $installbin || die "$installbin is not writable by you\n"
- unless $installbin =~ m#^/afs/#;
+ unless $installbin =~ m#^/afs/# || $nonono;
-x 'perl' || die "perl isn't executable!\n";
-x 'suidperl' || die "suidperl isn't executable!\n" if $d_dosuid;
warn "Can't cd to lib to install lib files: $!\n";
}
+# Install header files
+makedir("$installarchlib/CORE");
+foreach $file (<*.h libperl*.a>) {
+ cp_if_diff($file,"$installarchlib/CORE/$file");
+}
+
# Offer to install perl in a "standard" location
($udev,$uino) = stat($mainperldir);
return unless $do_installprivlib;
}
- &makedir("$installlib/$dir");
-
if (-f $_) {
+ if (/\.al$/ || /\.ix$/) {
+ $installlib = $installprivlib;
+ #We're installing *.al and *.ix files into $installprivlib,
+ #but we have to delete old *.al and *.ix files from the 5.000
+ #distribution:
+ &unlink("$installarchlib/$name");
+ }
system "cmp", "-s", $_, "$installlib/$name";
if ($?) {
&unlink("$installlib/$name");
+ &makedir("$installlib/$dir");
&cmd("cp $_ $installlib/$dir");
&chmod(0644, "$installlib/$name");
}
&makedir("$installlib/$name");
}
}
+
+sub cp_if_diff {
+ my($from,$to)=@_;
+ -f $from || die "$0: $from not found";
+ system "cmp", "-s", $from, $to;
+ if ($?) {
+ cmd("cp $from $to");
+ }
+}
@ISA = qw(Exporter);
@EXPORT = qw(&autosplit &autosplit_lib_modules);
-@EXPORT_OK = qw($Verbose $Keep);
+@EXPORT_OK = qw($Verbose $Keep $Maxlen $CheckForAutoloader $CheckModTime);
# for portability warn about names longer than $maxlen
$Maxlen = 8; # 8 for dos, 11 (14-".al") for SYSVR3
$Verbose = 1; # 0=none, 1=minimal, 2=list .al files
$Keep = 0;
-$IndexFile = "autosplit.ix"; # file also serves as timestamp
+$CheckForAutoloader = 1;
+$CheckModTime = 1;
+$IndexFile = "autosplit.ix"; # file also serves as timestamp
$maxflen = 255;
$maxflen = 14 if $Config{'d_flexfnam'} ne 'define';
$vms = ($Config{'osname'} eq 'VMS');
+
sub autosplit{
my($file, $autodir) = @_;
- autosplit_file($file, $autodir, $Keep, 1, 0);
+ autosplit_file($file, $autodir, $Keep, $CheckForAutoloader, $CheckModTime);
}
-
# This function is used during perl building/installation
# ./miniperl -e 'use AutoSplit; autosplit_modules(@ARGV)' ...
$dir =~ s#[\.\]]#/#g;
$_ = $dir . $name;
}
- autosplit_file("lib/$_", "lib/auto", $Keep, 1, 1);
+ autosplit_file("lib/$_", "lib/auto", $Keep, $CheckForAutoloader, $CheckModTime);
}
0;
}
# where to write output files
$autodir = "lib/auto" unless $autodir;
- die "autosplit directory $autodir does not exist" unless -d $autodir;
+ unless (-d $autodir){
+ local($", @p)="/";
+ foreach(split(/\//,$autodir)){
+ push(@p, $_);
+ next if -d "@p/";
+ mkdir("@p",0755) or die "AutoSplit unable to mkdir @p: $!";
+ }
+ # We should never need to create the auto dir here. installperl
+ # (or similar) should have done it. Expecting it to exist is a valuable
+ # sanity check against autosplitting into some random directory by mistake.
+ print "Warning: AutoSplit had to create top-level $autodir unexpectedly.\n";
+ }
# allow just a package name to be used
$filename .= ".pm" unless ($filename =~ m/\.pm$/);
while (<IN>) {
# record last package name seen
$package = $1 if (m/^\s*package\s+([\w:]+)\s*;/);
- ++$autoloader_seen if m/^\s*use\s+AutoLoader\b/;
+ ++$autoloader_seen if m/^\s*(use|require)\s+AutoLoader\b/;
++$autoloader_seen if m/\bISA\s*=.*\bAutoLoader\b/;
+ ++$autoloader_seen if m/^\s*sub\s+AUTOLOAD\b/;
last if /^__END__/;
}
- return 0 if ($check_for_autoloader && !$autoloader_seen);
+ if ($check_for_autoloader && !$autoloader_seen){
+ print "AutoSplit skipped $filename: no AutoLoader used\n" if ($Verbose>=2);
+ return 0
+ }
$_ or die "Can't find __END__ in $filename\n";
$package or die "Can't find 'package Name;' in $filename\n";
{
do
{
- unless ($dir = readdir(PARENT))
- {
+ unless (defined ($dir = readdir(PARENT)))
+ {
warn "readdir($dotdots): $!";
closedir(PARENT);
return '';
$cwd = "$dir/$cwd";
closedir(PARENT);
} while ($dir);
- chop($cwd);
+ chop($cwd); # drop the trailing /
$cwd;
}
next if $_ eq '.';
next if $_ eq '..';
- last unless $_;
+ last unless defined;
($tdev, $tino) = lstat($_);
last unless $tdev != $odev || $tino != $oino;
}
package ExtUtils::MakeMaker;
-$Version = 3.7; # Last edited 19th Dec 1994 by Tim Bunce
+$Version = 3.8; # Last edited 17th Jan 1995 by Andreas Koenig
use Config;
use Carp;
require Exporter;
@ISA = qw(Exporter);
-@EXPORT = qw(&WriteMakefile &mkbootstrap $Verbose &writeMakefile);
-@EXPORT_OK = qw($Version %att %skip %Recognized_Att_Keys @MM_Sections %MM_Sections);
+@EXPORT = qw(&WriteMakefile &mkbootstrap $Verbose);
+@EXPORT_OK = qw($Version %att %skip %Recognized_Att_Keys
+ @MM_Sections %MM_Sections
+ &help &lsdir);
$Is_VMS = $Config{'osname'} eq 'VMS';
require ExtUtils::MM_VMS if $Is_VMS;
=head1 SYNOPSIS
use ExtUtils::MakeMaker;
+
WriteMakefile( ATTRIBUTE => VALUE [, ...] );
=head1 DESCRIPTION
=head2 Default Makefile Behaviour
-This section (not yet written) will describe how a default Makefile will behave.
+The automatically generated Makefile enables the user of the extension
+to invoke
+
+ perl Makefile.PL
+ make
+ make test
+ make install
+
+(This section is yet to be completed ...)
=head2 Determination of Perl Library and Installation Locations
MakeMaker needs to know, or to guess, where certain things are located.
Especially INST_LIB, INST_ARCHLIB, PERL_LIB, PERL_ARCHLIB and PERL_SRC.
-Because installperl does not currently install header files (etc) into
-the library the Perl source code must be available when building
-extensions. Currently MakeMaker will default PERL_LIB and PERL_ARCHLIB
-to PERL_SRC/lib. Later, once installperl does install header files
-(etc) into the library, PERL_*LIB will only default to PERL_SRC/lib if
-the extension is in PERL_SRC/ext/* (e.g., a standard extension).
-Otherwise PERL_*LIB and PERL_SRC will default to the public library
-locations.
+Extensions may be built anywhere within the file system after perl has
+been installed correctly. Before perl is installed extensions have to
+be built below the C<ext/> directory within the tree of the perl
+source, i.e. where all the standard extensions are being built. The
+generated Makefile will recognize, which of the two is the current
+configuration and will set some variables accordingly.
+
+Only if the extension is being built in PERL_SRC/ext, the variable
+PERL_SRC is defined, otherwise it is undefined. Consequently
+MakeMaker will default PERL_LIB and PERL_ARCHLIB to PERL_SRC/lib only
+if PERL_SRC is defined, otherwise PERL_*LIB will default to the public
+library locations.
-INST_LIB and INST_ARCHLIB default to PERL_LIB and PERL_ARCHLIB.
+INST_LIB and INST_ARCHLIB default to PERL_LIB and PERL_ARCHLIB if we
+are building below the PERL_SRC/ext directory. Else they default to
+./blib.
=head2 Useful Default Makefile Macros
ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD)
-PERL_LIB
+PERL_LIB = Directory where we read the perl library files
-PERL_ARCHLIB
+PERL_ARCHLIB = Same as above for architecture dependent files
-INST_LIB
+INST_LIB = Directory where we put library files of this extension
+ while building it. If we are building below PERL_SRC/ext
+ we default to PERL_SRC/lib, else we default to ./blib.
-INST_ARCHLIB
+INST_ARCHLIB = Same as above for architecture dependent files
-INST_LIBDIR = $(INST_LIB)$(ROOTEXT) (and INST_ARCHLIBDIR)
+INST_LIBDIR = $(INST_LIB)$(ROOTEXT)
-INST_AUTODIR = $(INST_LIB)/auto/$(FULLEXT) (and INST_ARCHAUTODIR)
+INST_AUTODIR = $(INST_LIB)/auto/$(FULLEXT)
+
+INST_ARCHAUTODIR = $(INST_ARCHLIB)/auto/$(FULLEXT)
=head2 Customizing The Generated Makefile
The following attributes can be specified as arguments to WriteMakefile()
or as NAME=VALUE pairs on the command line:
-(not yet complete)
+This description is not yet documented; you can get at the description
+with the command
+ perl -e 'use ExtUtils::MakeMaker qw(&help); &help;'
=head2 Overriding MakeMaker Methods
If you still need a different solution, try to develop another
subroutine, that fits your needs and submit the diffs to
-perl5-porters@isu.edu or comp.lang.perl as appropriate.
+perl5-porters@nicoh.com or comp.lang.perl as appropriate.
=head1 AUTHORS
=head1 MODIFICATION HISTORY
-v1, August 1994; by Andreas Koenig.
-
-Initial version. Based on Andy Dougherty's Makefile.SH work.
-
-v2, September 1994; by Tim Bunce.
-
-Use inheritance to implement overriding. Methods return text so
-derived methods can edit it before it's output. mkbootstrap() now
-executes the *_BS file in the DynaLoader package and automatically adds
-dl_findfile() if required. More support for nested modules.
-
-v3.0, October/November 1994; by Tim Bunce.
-
-Major reorganisation. Fixed perl binary locating code. Replaced single
-$(TOP) with $(PERL_SRC), $(PERL_LIB) and $(INST_LIB). Restructured
-code. Consolidated and/or eliminated several attributes and added
-argument name checking. Added initial pod documentation. Made generated
-Makefile easier to read. Added generic mechanism for passing parameters
-to specific sections of the Makefile. Merged in Andreas's perl version
-of Andy's extliblist.
-
-v3.1 November 11th 1994 by Tim Bunce
-
-Fixed AIX dynamic loading problem for nested modules. Fixed perl
-extliblist to give paths not names for libs so that cross-check works.
-Converted the .xs to .c translation to a suffix rule. Added a .xs.o
-rule for dumb makes. Added very useful PM, XS and DIR attributes. Used
-new attributes to make other sections smarter (especially clean and
-realclean). Make clean no longer deletes Makefile so that a later make
-realclean can still work. Fixed all known problems. Write temporary
-Makefile as Makefile.new and rename once complete.
-
-v3.2 November 18th 1994 By Tim Bunce
-
-Fixed typos, added makefile section (split out of a flattened
-perldepend section). Added subdirectories to test section. Added -lm
-fix for NeXT in extliblist. Added clean of *~ files. Tidied up clean
-and realclean sections to produce fewer lines. Major revision to the
-const_loadlibs comments for EXTRALIBS, LDLOADLIBS and BSLOADLIBS.
-Added LINKTYPE=\$(LINKTYPE) to subdirectory make invocations.
-Write temporary Makefile as MakeMaker.tmp. Write temporary xsubpp
-output files as xstmp.c instead of tmp. Now installs multiple PM files.
-Improved parsing of NAME=VALUE args. $(BOOTSTRAP) is now a dependency
-of $(INST_DYNAMIC). Improved init of PERL_LIB, INST_LIB and PERL_SRC.
-Reinstated $(TOP) for transition period. Removed CONFIG_SH attribute
-(no longer used). Put INST_PM back and include .pm and .pl files in
-current and lib directory. Allow OBJECT to contain newlines. ROOTEXT
-now has leading slash. Added INST_LIBDIR (containing ROOTEXT) and
-renamed AUTOEXT to INST_AUTO. Assorted other cosmetic changes.
-All known problems fixed.
-
-v3.3 November 27th 1994 By Andreas Koenig
-
-Bug fixes submitted by Michael Peppler and Wayne Scott. Changed the
-order how @libpath is constructed in C<new_extliblist()>. Improved
-pod-structure. Relative paths in C<-L> switches to LIBS are turned into
-absolute ones now. Included VMS support thanks to submissions by
-Charles Bailey. Added warnings for switches other than C<-L> or C<-l>
-in new_extliblist() and if a library is not found at all. Changed
-dependency distclean:clean to distclean:realclean. Added dependency
-all->config. ext.libs is now written without duplicates and empty
-lines. As old_extliblist() and new_extliblist() do not produce the
-same anymore, the default becomes new_extliblist(), though the warning
-remains, whenever they differ. The use of cflags is accompanied by a
-replacement: there will be a warning when the two routines lead to
-different results, but still the output of cflags will be used.
-Cosmetic changes (Capitalize globals, uncapitalize others, insert a
-C<:> as default for $postop). Added some verbosity.
-
-v3.4 December 7th 1994 By Andreas Koenig and Tim Bunce
-
-Introduced ARCH_LIB and required other perl files to be patched.
-
-v3.5 December 15th 1994 By Tim Bunce
-
-Based primarily on v3.3. Replaced ARCH_LIB with INST_ARCHLIB, which
-defaults to INST_LIB, because the rest of perl assumes that ./lib
-includes architecture dependent files. Ideally an ./archlib should
-exist, that would be more consistent and simplify installperl.
-Added linkext and $(INST_PM) dependencies to all: target. The linkext
-target (and subroutine) exists solely to depend on $(LINKTYPE). Any
-Makefile.PLs using LINKTYPE => '...' where '...' is not 'static' or
-'dynamic' should be changed to use 'linkext' => { LINKTYPE => '...' }.
-
-Automatic determination of PERL_* and INST_* has been revised. The
-INST_* macros have INST_ARCH* and INST_*DIR variants. The ARCH variants
-point to the architecture specific directory and the *DIR variants
-include the module specific subdirectory path. So INST_AUTO is now
-INST_AUTODIR and an INST_ARCHAUTODIR has also been defined.
-
-An AUTOSPLITFILE tool macro has been defined which will AutoSplit any
-named file into any named auto directory. This replaces AUTOSPLITLIB.
-MKPATH now accepts multiple paths. The paths INST_LIBDIR,
-INST_ARCHLIBDIR, INST_AUTODIR and INST_ARCHAUTODIR are made by the
-config: target. A new ext.libs mechanism has been added. installpm has
-been split and now calls installpm_x per file. A section attribute
-mechanism has been added and skip cross-checking has been moved into a
-skipcheck function. MakeMaker now uses Cwd and File::Basename modules.
-
-v3.6 December 15th 1994 By Tim Bunce
+v1, August 1994; by Andreas Koenig. Based on Andy Dougherty's Makefile.SH.
+v2, September 1994 by Tim Bunce.
+v3.0 October 1994 by Tim Bunce.
+v3.1 November 11th 1994 by Tim Bunce.
+v3.2 November 18th 1994 by Tim Bunce.
+v3.3 November 27th 1994 by Andreas Koenig.
+v3.4 December 7th 1994 by Andreas Koenig and Tim Bunce.
+v3.5 December 15th 1994 by Tim Bunce.
+v3.6 December 15th 1994 by Tim Bunce.
Added C and H attributes and corresponding macros. These default to the
list of *.c and *.h files in the directory. C also includes *.c file
been improved. The .c files produced from .xs files now depend on
XSUBPPDEPS (the typemaps).
+v3.7 December 30th By Tim Bunce
+
+Most, if not all, the MakeMaker support for no perl source is now
+included. Recent ld and mkbootstrap patches applied. -lX11_s suffix
+fix applied.
+
+Also contained patches to Makefile.SH, ext/DynaLoader/DynaLoader.pm,
+ext/util/make_ext, and h2xs
+
+v3.8 January 9th By Andreas Koenig and Tim Bunce
+
+- Introduces ./blib as the directory, where the ready-to-use module
+will live for the time of the building process if PERL_SRC/lib is not
+available. ./blib is turned into an absolute pathname and gets passed
+to subdirectories when writing the Makefile.
+
+- INST_ARCHLIB will now be set equal to INST_LIB if we cannot
+determine it with the methods near line 620 (in the intialize
+subroutine).
+
+- Introduced the install subroutine, that calls another make
+recursively with INST_LIB, and INST_ARCHLIB set according to the local
+conventions.
+
+- Since version 3.6 all *.al and *.ix files are installed into
+$installprivlib. In perl5.000 they were installed into
+$installarchlib. Version 3.8 takes precautions to delete old *.{al,ix}
+files that are left over in $installarchlib. Installperl is also
+patched to both delete old *.al and *.ix files, that were put into
+$installarchlib, and to install them properly from now on.
+
+- h2xs is patched by Dean Roehrich to reintroduce the C<-A> option and
+reconsiders the use of the AutoLoader. Also podifies h2xs.
+
+- Patches to {DB_File,Fcntl,GDBM_File,POSIX,Socket}.pm, eliminating
+AutoLoader from @ISA (by Dean Roehrich).
+
+- A patch to AutoSplit.pm makes sure, the target directory of the
+split exists.
+
+- installperl now installs all *.h files into $installarchlib/CORE.
+
+- added a simple help function
+
+- AutoSplit:
+
+ Turned two constants into package variables.
+ Modified the default for &autosplit to be $CheckModTime=1.
+ Added warning and comment if auto dir does not exist.
+ Enhanced AutoLoader check (POSIX.pm was not getting AutoSplit!)
+ Improved logging if $Verbose>=2.
+
+- MakeMaker:
+
+ EXPORT_OK lsdir(), it's very handy.
+ Deleted much of the early revision history.
+ Changed LDTARGET (bad name) to LDFROM (better, but not great :)
+ INST_ARCHLIB for ./blib found via mapping from INST_LIB ./blib
+ (this allows error message if INST_ARCHLIB still undefined)
+ Added optional regex filter to &lsdir.
+ Added cute auto handling of a ./$(BASEEXT)/*.pm directory as
+ per recent messages with Nick re ext/nTk/nTk/Text.pm
+ Added NOOP, RM_F, RM_RF, TOUCH, CP to %att.
+ NOOP is now "" on Unix, "<tab>" caused problems (see makefile section)
+ RM_F etc now expanded when Makefile written.
+ Old AUTOSPLITLIB definition deleted.
+ See new dynamic_lib section for new ARMAYBE handling.
+ install section now uses $(INSTALLPRIVLIB) because on some
+ systems INSTALLPRIVLIB != PRIVLIB (ditto for archlib)
=head1 NOTES
Needs more complete documentation.
-Replace use of cflags with %Config (taking note of hints etc)
-
-Move xsubpp and typemap into lib/ExtUtils/...
-
The ext.libs file mechanism will need to be revised to allow a
make-a-perl [list-of-static-extensions] script to work.
-Eventually eliminate use of $(PERL_SRC). This must wait until
-MakeMaker is the standard and Larry makes the required changes
-elsewhere.
-
Add method to take a list of files and wrap it in a Makefile
compatible way (<space><backslash><newline><tab>).
'LIBS' => "-ltcl -ltk -lX11"
MakeMaker will turn it into an array with one element.
- LDTARGET: defaults to "$(OBJECT)" and is used in the ld command
- (some machines need additional switches for bigger projects)
+ LDFROM: defaults to "$(OBJECT)" and is used in the ld command
+ to specify what files to link/load from
+ (also see dynamic_lib below for how to specify ld flags)
DIR: Ref to array of subdirectories containing Makefile.PLs
e.g. [ 'sdbm' ] in ext/SDBM_File
linkext: {LINKTYPE => 'static', 'dynamic' or ''}
dynamic_lib {ARMAYBE => 'ar', OTHERLDFLAGS => '...'}
clean: {FILES => "*.xyz foo"}
- realclean: {FILES => '$(INST_AUTODIR)/*.xyz'}
+ realclean: {FILES => '$(INST_ARCHAUTODIR)/*.xyz'}
distclean: {TARNAME=>'MyTarFile', TARFLAGS=>'cvfF', COMPRESS=>'gzip'}
tool_autosplit: {MAXLEN => 8}
END
+sub help {print $Attrib_Help;}
+
@MM_Sections_spec = (
'post_initialize' => {},
'constants' => {},
# PERL_SRC ../.. (undefined)
# INST Macro: Locally Publically
- # INST_LIB ../../lib /usr/local/lib/perl5
- # INST_ARCHLIB ../../lib /usr/local/lib/perl5/sun4-sunos
-
- # This code will need to be reworked to deal with having no perl
- # source. PERL_LIB should become the primary focus.
+ # INST_LIB ../../lib ./blib
+ # INST_ARCHLIB ../../lib ./blib
unless ($att{PERL_SRC}){
foreach(qw(../.. ../../.. ../../../..)){
# INST_LIB typically pre-set if building an extension after
# perl has been built and installed. Setting INST_LIB allows
- # You to build directly into privlib and avoid installperl.
- $att{INST_LIB} = $att{PERL_LIB} unless $att{INST_LIB};
-
+ # you to build directly into privlib and avoid installperl.
+ unless ($att{INST_LIB}){
+ if (defined $att{PERL_SRC}) {
+ $att{INST_LIB} = $att{PERL_LIB};
+ } else {
+ $att{INST_LIB} = "$pwd/blib";
+ }
+ }
# Try to work out what INST_ARCHLIB should be if not set:
unless ($att{INST_ARCHLIB}){
my(%archmap) = (
+ "$pwd/blib" => "$pwd/blib", # our private build lib
$att{PERL_LIB} => $att{PERL_ARCHLIB},
$Config{'privlib'} => $Config{'archlib'},
$Config{'installprivlib'} => $Config{'installarchlib'},
# then add in any .pm and .pl files in that directory.
# This makes it easy and tidy to ship a number of perl files.
if (-d "lib" and !$dir{'lib'}){
- foreach $name (lsdir("lib")){
- next unless ($name =~ /\.p[ml]$/);
+ foreach $name (lsdir("lib", '\.p[ml]$')){
+ # next unless ($name =~ /\.p[ml]$/);
$pm{"lib/$name"} = "\$(INST_LIBDIR)/$name";
}
}
+ # Similarly, if we have a ./$(BASEEXT) dir without a Makefile.PL
+ # we treat it as a directory containing *.pm files for modules
+ # which are nested below this one. E.g., ./Tk.pm & ./Tk/Text.pm
+ if (-d $att{BASEEXT} and !$dir{$att{BASEEXT}}){
+ foreach $name (lsdir($att{BASEEXT}, '\.p[ml]$')){
+ # next unless ($name =~ /\.p[ml]$/);
+ $pm{"$att{BASEEXT}/$name"} = "\$(INST_LIBDIR)/$att{BASEEXT}/$name";
+ }
+ }
+
$att{DIR} = [sort keys %dir] unless $att{DIRS};
$att{XS} = \%xs unless $att{XS};
$att{PM} = \%pm unless $att{PM};
}
$att{BOOTDEP} = (-f "$att{BASEEXT}_BS") ? "$att{BASEEXT}_BS" : "";
$att{LD} = ($Config{'ld'} || 'ld') unless $att{LD};
- $att{LDTARGET} = '$(OBJECT)' unless $att{LDTARGET};
+ $att{LDFROM} = '$(OBJECT)' unless $att{LDFROM};
$att{LINKTYPE} = ($Config{'usedl'}) ? 'dynamic' : 'static'
unless $att{LINKTYPE};
+ # These get overridden for VMS and maybe some other systems
+ $att{NOOP} = "";
+ $att{RM_F} = "rm -f";
+ $att{RM_RF} = "rm -rf";
+ $att{TOUCH} = "touch";
+ $att{CP} = "cp";
}
sub lsdir{
+ my($dir, $regex) = @_;
local(*DIR, @ls);
opendir(DIR, $_[0] || ".") or die "opendir: $!";
@ls = readdir(DIR);
closedir(DIR);
+ @ls = grep(/$regex/, @ls) if $regex;
@ls;
}
print "Looking for perl $ver by these names: @$names, in these dirs: @$dirs\n"
if ($trace);
foreach $dir (@$dirs){
+ next unless defined $dir; # $att{PERL_SRC} may be undefined
foreach $name (@$names){
print "checking $dir/$name\n" if ($trace >= 2);
if ($Is_VMS) {
INC = $att{INC}
DEFINE = $att{DEFINE}
OBJECT = $att{OBJECT}
-LDTARGET = $att{LDTARGET}
+LDFROM = $att{LDFROM}
LINKTYPE = $att{LINKTYPE}
# Source code:
INST_LIBDIR = $(INST_LIB)$(ROOTEXT)
INST_ARCHLIBDIR = $(INST_ARCHLIB)$(ROOTEXT)
-INST_AUTODIR = $(INST_LIB)/auto/$(FULLEXT)
-INST_ARCHAUTODIR = $(INST_ARCHLIB)/auto/$(FULLEXT)
+';
+
+ push @m, '
+INST_AUTODIR = $(INST_LIB)/auto/$(FULLEXT)
+INST_ARCHAUTODIR = $(INST_ARCHLIB)/auto/$(FULLEXT)
+';
+ push @m, '
INST_BOOT = $(INST_ARCHAUTODIR)/$(BASEEXT).bs
INST_DYNAMIC = $(INST_ARCHAUTODIR)/$(BASEEXT).$(DLEXT)
INST_STATIC = $(BASEEXT).a
." old: $old\n"
." new: $new\n"
." Using 'old' set.\n"
- ."Please notify perl5-porters\@isu.edu\n";
+ ."Please notify perl5-porters\@nicoh.com\n";
}
my($cccmd)=($old) ? $old : $new;
"CCCMD = $cccmd\n";
my($asl) = "";
$asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
q{
-AUTOSPLITLIB = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use AutoSplit; chdir("$(INST_LIB)/..") or die $$!; $$AutoSplit::Maxlen=}.$asl.q{; autosplit_lib_modules(@ARGV) ;'
-
# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
-AUTOSPLITFILE = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use AutoSplit;}.$asl.q{ AutoSplit::autosplit_file($$ARGV[0], $$ARGV[1], 0, 1, 1) ;'
+# Remark: the "" around the -I switches are helpful for the VMS support
+AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e 'use AutoSplit;}.$asl.q{ AutoSplit::autosplit_file($$ARGV[0], $$ARGV[1], 0, 1, 1) ;'
};
}
"
SHELL = /bin/sh
LD = $att{LD}
+TOUCH = $att{TOUCH}
+CP = $att{CP}
+RM_F = $att{RM_F}
+RM_RF = $att{RM_RF}
".q{
# The following is a portable way to say mkdir -p
MKPATH = $(PERL) -wle '$$"="/"; foreach $$p (@ARGV){ my(@p); foreach(split(/\//,$$p)){ push(@p,$$_); next if -d "@p/"; print "mkdir @p"; mkdir("@p",0777)||die $$! }} exit 0;'
sub top_targets{
'
all :: config linkext $(INST_PM)
+'.$att{NOOP}.'
config :: Makefile
- @$(MKPATH) $(INST_LIBDIR) $(INST_ARCHLIBDIR)
- @$(MKPATH) $(INST_AUTODIR) $(INST_ARCHAUTODIR)
-
-install :: all
+ @$(MKPATH) $(INST_LIBDIR)
+ @$(MKPATH) $(INST_ARCHAUTODIR)
';
}
my($linktype) = $attribs{LINKTYPE} || '$(LINKTYPE)';
"
linkext :: $linktype
+$att{NOOP}
";
}
# $(INST_PM) has been moved to the all: target.
# It remains here for awhile to allow for old usage: "make dynamic"
dynamic :: $(INST_DYNAMIC) $(INST_BOOT) $(INST_PM)
+'.$att{NOOP}.'
';
}
# As MakeMaker mkbootstrap might not write a file (if none is required)
# we use touch to prevent make continually trying to remake it.
# The DynaLoader only reads a non-empty file.
-$(BOOTSTRAP): '.$att{BOOTDEP}.' $(CONFIGDEP)
- $(PERL) -I$(PERL_LIB) -e \'use ExtUtils::MakeMaker; &mkbootstrap("$(BSLOADLIBS)");\' \
+$(BOOTSTRAP): '.$att{BOOTDEP}.' $(CONFIGDEP) Makefile.PL
+ $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
+ -e \'use ExtUtils::MakeMaker; &mkbootstrap("$(BSLOADLIBS)");\' \
INST_LIB=$(INST_LIB) INST_ARCHLIB=$(INST_ARCHLIB) PERL_SRC=$(PERL_SRC) NAME=$(NAME)
- @touch $(BOOTSTRAP)
+ @$(TOUCH) $(BOOTSTRAP)
$(INST_BOOT): $(BOOTSTRAP)
- @rm -f $(INST_BOOT)
- cp $(BOOTSTRAP) $(INST_BOOT)
+ @'.$att{RM_RF}.' $(INST_BOOT)
+ '.$att{CP}.' $(BOOTSTRAP) $(INST_BOOT)
';
}
my($self, %attribs) = @_;
my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
my($armaybe) = $attribs{ARMAYBE} || $att{ARMAYBE} || ":";
- '
+ my($ldfrom) = '$(LDFROM)';
+ my(@m);
+ push(@m,'
ARMAYBE = '.$armaybe.'
OTHERLDFLAGS = '.$otherldflags.'
$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP)
- @$(MKPATH) $(INST_AUTODIR)
- $(ARMAYBE) cr $(BASEEXT).a $(OBJECT)
- $(LD) $(LDDLFLAGS) -o $@ $(LDTARGET) $(OTHERLDFLAGS) $(MYEXTLIB) $(LDLOADLIBS)
-';
+ @$(MKPATH) $(INST_ARCHAUTODIR)
+');
+ if ($armaybe ne ':'){
+ $ldfrom = "tmp.a";
+ push(@m,' $(ARMAYBE) cr '.$ldfrom.' $(OBJECT)'."\n");
+ push(@m,' $(RANLIB) '."$ldfrom\n");
+ }
+ push(@m,' $(LD) $(LDDLFLAGS) -o $@ '.$ldfrom.
+ ' $(OTHERLDFLAGS) $(MYEXTLIB) $(LDLOADLIBS)'."\n");
+ join('',@m);
}
# $(INST_PM) has been moved to the all: target.
# It remains here for awhile to allow for old usage: "make static"
static :: $(INST_STATIC) $(INST_PM)
+'.$att{NOOP}.'
';
}
END
# If this extension has it's own library (eg SDBM_File)
# then copy that to $(INST_STATIC) and add $(OBJECT) into it.
- push(@m, ' cp $(MYEXTLIB) $@'."\n") if $att{MYEXTLIB};
+ push(@m, " $att{CP} \$(MYEXTLIB) \$\@\n") if $att{MYEXTLIB};
push(@m, <<'END');
ar cr $@ $(OBJECT) && $(RANLIB) $@
@: New mechanism - not yet used:
@echo $(EXTRALIBS) > $(INST_ARCHAUTODIR)/extralibs.ld
- cp $@ $(INST_ARCHAUTODIR)/
+ $(CP) $@ $(INST_ARCHAUTODIR)/
END
push(@m, <<'END') if $att{PERL_SRC};
@: Old mechanism - still needed:
my(@m);
push(@m,"
$inst: $dist
-".' @rm -f $@
+".' @'.$att{RM_F}.' $@
@$(MKPATH) '.$instdir.'
- cp $? $@
+ '.$att{CP}.' $? $@
');
push(@m, "\t\$(AUTOSPLITFILE) \$@ $splitlib/auto\n")
if ($splitlib and $inst =~ m/\.pm$/);
# MY::subdir_x() method to override this one.
qq{
config :: $subdir/Makefile
- cd $subdir ; \$(MAKE) config LINKTYPE=\$(LINKTYPE)
+ cd $subdir ; \$(MAKE) config INST_LIB=\$(INST_LIB) INST_ARCHLIB=\$(INST_ARCHLIB) LINKTYPE=\$(LINKTYPE)
$subdir/Makefile: $subdir/Makefile.PL \$(CONFIGDEP)
}.' @echo "Rebuilding $@ ..."
$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \\
-e "use ExtUtils::MakeMaker; MM->runsubdirpl(qw('.$subdir.'))" \\
+ INST_LIB=$(INST_LIB) INST_ARCHLIB=$(INST_ARCHLIB) \\
$(SUBDIR_MAKEFILE_PL_ARGS)
@echo "Rebuild of $@ complete."
'.qq{
');
# clean subdirectories first
push(@m, map("\t-cd $_ && test -f Makefile && \$(MAKE) clean\n",@{$att{DIR}}));
- push(@m, " rm -f *~ t/*~ *.o *.a mon.out core so_locations \$(BOOTSTRAP) \$(BASEEXT).bso\n");
+ push(@m, " $att{RM_F} *~ t/*~ *.o *.a mon.out core so_locations \$(BOOTSTRAP) \$(BASEEXT).bso\n");
my(@otherfiles);
# Automatically delete the .c files generated from *.xs files:
push(@otherfiles, values %{$att{XS}});
push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
- push(@m, " rm -rf @otherfiles\n") if @otherfiles;
+ push(@m, " $att{RM_RF} @otherfiles\n") if @otherfiles;
push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
join("", @m);
}
');
# clean subdirectories first
push(@m, map("\t-cd $_ && test -f Makefile && \$(MAKE) realclean\n",@{$att{DIR}}));
- push(@m, ' rm -f Makefile $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(INST_PM)'."\n");
- push(@m, ' rm -rf $(INST_AUTODIR) $(INST_ARCHAUTODIR)'."\n");
+ # try to clean those files first, where we might have no permissions, so Makefile won't be lost
+ push(@m, " $att{RM_RF} \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n");
+ push(@m, " $att{RM_F} \$(INST_DYNAMIC) \$(INST_BOOT) \$(INST_PM)\n");
+ push(@m, " $att{RM_F} Makefile \$(INST_STATIC)\n");
my(@otherfiles);
push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
- push(@m, " rm -rf @otherfiles\n") if @otherfiles;
+ push(@m, " $att{RM_RF} @otherfiles\n") if @otherfiles;
push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
join("", @m);
}
"
distclean: clean
$preop
- rm -f $mkfiles
+ $att{RM_F} $mkfiles
cd ..; tar $tarflags $tarname.tar \$(BASEEXT)
cd ..; $compress $tarname.tar
$postop
test :: all
");
push(@m, <<"END") if $tests;
- \$(FULLPERL) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) -e 'use Test::Harness; runtests \@ARGV;' $tests
+ \$(FULLPERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) -e 'use Test::Harness; runtests \@ARGV;' $tests
END
push(@m, <<'END') if -f "test.pl";
- $(FULLPERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) test.pl
+ $(FULLPERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) test.pl
END
push(@m, map("\tcd $_ && test -f Makefile && \$(MAKE) test LINKTYPE=\$(LINKTYPE)\n",@{$att{DIR}}));
push(@m, "\t\@echo 'No tests defined for \$(NAME) extension.'\n") unless @m > 1;
sub install {
- '
+ my($self, %attribs) = @_;
+ my(@m);
+ push(@m, "
install :: all
- # install is not defined. Makefile, by default, builds the extension
- # directly into $(INST_LIB) so "installing" does not make much sense.
- # If INST_LIB is in the perl source tree then installperl will install
- # the extension when it installs perl.
-';
-}
+");
+ # install subdirectories first
+ push(@m, map("\tcd $_ && test -f Makefile && \$(MAKE) install\n",@{$att{DIR}}));
+
+ push(@m, "\t: perl5.000 used to autosplit into INST_ARCHLIB, we delete these old files here
+ $att{RM_F} \$(INSTALLARCHLIB)/auto/\$(FULLEXT)/*.al \$(INSTALLARCHLIB)/auto/\$(FULLEXT)/*.ix
+ make INST_LIB=\$(INSTALLPRIVLIB) INST_ARCHLIB=\$(INSTALLARCHLIB)
+");
+ join("",@m);
+}
sub force {
'# Phony target to force checking subdirectories.
push(@m,'
$(PERL_INC)/config.h: $(PERL_SRC)/config.sh; cd $(PERL_SRC); /bin/sh config_h.SH
-$(PERL_INC)/embed.h: $(PERL_SRC)/config.sh; cd $(PERL_SRC); /bin/sh embed_h.SH
') if $att{PERL_SRC};
# This needs a better home:
# We do not know what target was originally specified so we
# must force a manual rerun to be sure. But as it would only
# happen very rarely it is not a significant problem.
- '
-$(OBJECT) : Makefile
+# This dependency, with no_op, causes problems. Make tries to build OBJECT via no_op!
+# So we'll just drop it for now.
+#$(OBJECT) : Makefile
+#'.$att{NOOP}.'
+
+ '
Makefile: Makefile.PL $(CONFIGDEP)
$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) Makefile.PL
@echo "Now you must rerun make."; false
warn "Warning (non-fatal): $att{NAME} extliblist consistency check failed:\n".
" old: $oldlibs\n".
" new: $newlibs\n".
- "Using 'new' set. Please notify perl5-porters\@isu.edu.\n"
+ "Using 'new' set. Please notify perl5-porters\@nicoh.com.\n"
if ("$newlibs" ne "$oldlibs");
}
@new;
1;
__END__
-
rm -f a2p *.o a2p.c
realclean: clean
- rm -f *.orig */*.orig core $(addedbyconf) a2p.c all
+ rm -f *.orig */*.orig core $(addedbyconf) a2p.c all malloc.c
rm -f Makefile cflags find2perl s2p makefile makefile.old
# The following lint has practically everything turned on. Unfortunately,
+++ /dev/null
-/* $RCSfile: malloc.c,v $$Revision: 4.1 $$Date: 92/08/07 18:24:25 $
- *
- * $Log: malloc.c,v $
- */
-
-#ifndef lint
-#ifdef DEBUGGING
-#define RCHECK
-#endif
-/*
- * malloc.c (Caltech) 2/21/82
- * Chris Kingsley, kingsley@cit-20.
- *
- * This is a very fast storage allocator. It allocates blocks of a small
- * number of different sizes, and keeps free lists of each size. Blocks that
- * don't exactly fit are passed up to the next larger size. In this
- * implementation, the available sizes are 2^n-4 (or 2^n-12) bytes long.
- * This is designed for use in a program that uses vast quantities of memory,
- * but bombs when it runs out.
- */
-
-#include "EXTERN.h"
-#include "../perl.h"
-
-/* I don't much care whether these are defined in sys/types.h--LAW */
-
-#define u_char unsigned char
-#define u_int unsigned int
-#define u_short unsigned short
-
-/*
- * The overhead on a block is at least 4 bytes. When free, this space
- * contains a pointer to the next free block, and the bottom two bits must
- * be zero. When in use, the first byte is set to MAGIC, and the second
- * byte is the size index. The remaining bytes are for alignment.
- * If range checking is enabled and the size of the block fits
- * in two bytes, then the top two bytes hold the size of the requested block
- * plus the range checking words, and the header word MINUS ONE.
- */
-union overhead {
- union overhead *ov_next; /* when free */
-#if MEM_ALIGNBYTES > 4
- double strut; /* alignment problems */
-#endif
- struct {
- u_char ovu_magic; /* magic number */
- u_char ovu_index; /* bucket # */
-#ifdef RCHECK
- u_short ovu_size; /* actual block size */
- u_int ovu_rmagic; /* range magic number */
-#endif
- } ovu;
-#define ov_magic ovu.ovu_magic
-#define ov_index ovu.ovu_index
-#define ov_size ovu.ovu_size
-#define ov_rmagic ovu.ovu_rmagic
-};
-
-#ifdef debug
-static void botch _((char *s));
-#endif
-static void morecore _((int bucket));
-static int findbucket _((union overhead *freep, int srchlen));
-
-#define MAGIC 0xff /* magic # on accounting info */
-#define RMAGIC 0x55555555 /* magic # on range info */
-#ifdef RCHECK
-#define RSLOP sizeof (u_int)
-#else
-#define RSLOP 0
-#endif
-
-/*
- * nextf[i] is the pointer to the next free block of size 2^(i+3). The
- * smallest allocatable block is 8 bytes. The overhead information
- * precedes the data area returned to the user.
- */
-#define NBUCKETS 30
-static union overhead *nextf[NBUCKETS];
-extern char *sbrk();
-
-#ifdef MSTATS
-/*
- * nmalloc[i] is the difference between the number of mallocs and frees
- * for a given block size.
- */
-static u_int nmalloc[NBUCKETS];
-#include <stdio.h>
-#endif
-
-#ifdef debug
-#define ASSERT(p) if (!(p)) botch("p"); else
-static void
-botch(s)
- char *s;
-{
-
- printf("assertion botched: %s\n", s);
- abort();
-}
-#else
-#define ASSERT(p)
-#endif
-
-Malloc_t
-malloc(nbytes)
- register MEM_SIZE nbytes;
-{
- register union overhead *p;
- register int bucket = 0;
- register MEM_SIZE shiftr;
-
-#ifdef safemalloc
-#ifdef DEBUGGING
- MEM_SIZE size = nbytes;
-#endif
-
-#ifdef MSDOS
- if (nbytes > 0xffff) {
- fprintf(stderr, "Allocation too large: %lx\n", (long)nbytes);
- exit(1);
- }
-#endif /* MSDOS */
-#ifdef DEBUGGING
- if ((long)nbytes < 0)
- croak("panic: malloc");
-#endif
-#endif /* safemalloc */
-
- /*
- * Convert amount of memory requested into
- * closest block size stored in hash buckets
- * which satisfies request. Account for
- * space used per block for accounting.
- */
- nbytes += sizeof (union overhead) + RSLOP;
- nbytes = (nbytes + 3) &~ 3;
- shiftr = (nbytes - 1) >> 2;
- /* apart from this loop, this is O(1) */
- while (shiftr >>= 1)
- bucket++;
- /*
- * If nothing in hash bucket right now,
- * request more memory from the system.
- */
- if (nextf[bucket] == NULL)
- morecore(bucket);
- if ((p = (union overhead *)nextf[bucket]) == NULL) {
-#ifdef safemalloc
- if (!nomemok) {
- fputs("Out of memory!\n", stderr);
- exit(1);
- }
-#else
- return (NULL);
-#endif
- }
-
-#ifdef safemalloc
- DEBUG_m(fprintf(stderr,"0x%lx: (%05d) malloc %ld bytes\n",
- (unsigned long)(p+1),an++,(long)size));
-#endif /* safemalloc */
-
- /* remove from linked list */
-#ifdef RCHECK
- if (*((int*)p) & (sizeof(union overhead) - 1))
- fprintf(stderr,"Corrupt malloc ptr 0x%lx at 0x%lx\n",
- (unsigned long)*((int*)p),(unsigned long)p);
-#endif
- nextf[bucket] = p->ov_next;
- p->ov_magic = MAGIC;
- p->ov_index= bucket;
-#ifdef MSTATS
- nmalloc[bucket]++;
-#endif
-#ifdef RCHECK
- /*
- * Record allocated size of block and
- * bound space with magic numbers.
- */
- if (nbytes <= 0x10000)
- p->ov_size = nbytes - 1;
- p->ov_rmagic = RMAGIC;
- *((u_int *)((caddr_t)p + nbytes - RSLOP)) = RMAGIC;
-#endif
- return ((Malloc_t)(p + 1));
-}
-
-/*
- * Allocate more memory to the indicated bucket.
- */
-static void
-morecore(bucket)
- register int bucket;
-{
- register union overhead *op;
- register int rnu; /* 2^rnu bytes will be requested */
- register int nblks; /* become nblks blocks of the desired size */
- register MEM_SIZE siz;
-
- if (nextf[bucket])
- return;
- /*
- * Insure memory is allocated
- * on a page boundary. Should
- * make getpageize call?
- */
-#ifndef atarist /* on the atari we dont have to worry about this */
- op = (union overhead *)sbrk(0);
-#ifndef I286
- if ((int)op & 0x3ff)
- (void)sbrk(1024 - ((int)op & 0x3ff));
-#else
- /* The sbrk(0) call on the I286 always returns the next segment */
-#endif
-#endif /* atarist */
-
-#if !(defined(I286) || defined(atarist))
- /* take 2k unless the block is bigger than that */
- rnu = (bucket <= 8) ? 11 : bucket + 3;
-#else
- /* take 16k unless the block is bigger than that
- (80286s like large segments!), probably good on the atari too */
- rnu = (bucket <= 11) ? 14 : bucket + 3;
-#endif
- nblks = 1 << (rnu - (bucket + 3)); /* how many blocks to get */
- if (rnu < bucket)
- rnu = bucket;
- op = (union overhead *)sbrk(1L << rnu);
- /* no more room! */
- if ((int)op == -1)
- return;
- /*
- * Round up to minimum allocation size boundary
- * and deduct from block count to reflect.
- */
-#ifndef I286
- if ((int)op & 7) {
- op = (union overhead *)(((MEM_SIZE)op + 8) &~ 7);
- nblks--;
- }
-#else
- /* Again, this should always be ok on an 80286 */
-#endif
- /*
- * Add new memory allocated to that on
- * free list for this hash bucket.
- */
- nextf[bucket] = op;
- siz = 1 << (bucket + 3);
- while (--nblks > 0) {
- op->ov_next = (union overhead *)((caddr_t)op + siz);
- op = (union overhead *)((caddr_t)op + siz);
- }
-}
-
-void
-free(mp)
- Malloc_t mp;
-{
- register MEM_SIZE size;
- register union overhead *op;
- char *cp = (char*)mp;
-
-#ifdef safemalloc
- DEBUG_m(fprintf(stderr,"0x%lx: (%05d) free\n",(unsigned long)cp,an++));
-#endif /* safemalloc */
-
- if (cp == NULL)
- return;
- op = (union overhead *)((caddr_t)cp - sizeof (union overhead));
-#ifdef debug
- ASSERT(op->ov_magic == MAGIC); /* make sure it was in use */
-#else
- if (op->ov_magic != MAGIC) {
-#ifdef RCHECK
- warn("%s free() ignored",
- op->ov_rmagic == RMAGIC - 1 ? "Duplicate" : "Bad");
-#else
- warn("Bad free() ignored");
-#endif
- return; /* sanity */
- }
-#endif
-#ifdef RCHECK
- ASSERT(op->ov_rmagic == RMAGIC);
- if (op->ov_index <= 13)
- ASSERT(*(u_int *)((caddr_t)op + op->ov_size + 1 - RSLOP) == RMAGIC);
- op->ov_rmagic = RMAGIC - 1;
-#endif
- ASSERT(op->ov_index < NBUCKETS);
- size = op->ov_index;
- op->ov_next = nextf[size];
- nextf[size] = op;
-#ifdef MSTATS
- nmalloc[size]--;
-#endif
-}
-
-/*
- * When a program attempts "storage compaction" as mentioned in the
- * old malloc man page, it realloc's an already freed block. Usually
- * this is the last block it freed; occasionally it might be farther
- * back. We have to search all the free lists for the block in order
- * to determine its bucket: 1st we make one pass thru the lists
- * checking only the first block in each; if that fails we search
- * ``reall_srchlen'' blocks in each list for a match (the variable
- * is extern so the caller can modify it). If that fails we just copy
- * however many bytes was given to realloc() and hope it's not huge.
- */
-int reall_srchlen = 4; /* 4 should be plenty, -1 =>'s whole list */
-
-Malloc_t
-realloc(mp, nbytes)
- Malloc_t mp;
- MEM_SIZE nbytes;
-{
- register MEM_SIZE onb;
- union overhead *op;
- char *res;
- register int i;
- int was_alloced = 0;
- char *cp = (char*)mp;
-
-#ifdef safemalloc
-#ifdef DEBUGGING
- MEM_SIZE size = nbytes;
-#endif
-
-#ifdef MSDOS
- if (nbytes > 0xffff) {
- fprintf(stderr, "Reallocation too large: %lx\n", size);
- exit(1);
- }
-#endif /* MSDOS */
- if (!cp)
- return malloc(nbytes);
-#ifdef DEBUGGING
- if ((long)nbytes < 0)
- croak("panic: realloc");
-#endif
-#endif /* safemalloc */
-
- op = (union overhead *)((caddr_t)cp - sizeof (union overhead));
- if (op->ov_magic == MAGIC) {
- was_alloced++;
- i = op->ov_index;
- } else {
- /*
- * Already free, doing "compaction".
- *
- * Search for the old block of memory on the
- * free list. First, check the most common
- * case (last element free'd), then (this failing)
- * the last ``reall_srchlen'' items free'd.
- * If all lookups fail, then assume the size of
- * the memory block being realloc'd is the
- * smallest possible.
- */
- if ((i = findbucket(op, 1)) < 0 &&
- (i = findbucket(op, reall_srchlen)) < 0)
- i = 0;
- }
- onb = (1L << (i + 3)) - sizeof (*op) - RSLOP;
- /* avoid the copy if same size block */
- if (was_alloced &&
- nbytes <= onb && nbytes > (onb >> 1) - sizeof(*op) - RSLOP) {
-#ifdef RCHECK
- /*
- * Record new allocated size of block and
- * bound space with magic numbers.
- */
- if (op->ov_index <= 13) {
- /*
- * Convert amount of memory requested into
- * closest block size stored in hash buckets
- * which satisfies request. Account for
- * space used per block for accounting.
- */
- nbytes += sizeof (union overhead) + RSLOP;
- nbytes = (nbytes + 3) &~ 3;
- op->ov_size = nbytes - 1;
- *((u_int *)((caddr_t)op + nbytes - RSLOP)) = RMAGIC;
- }
-#endif
- res = cp;
- }
- else {
- if ((res = (char*)malloc(nbytes)) == NULL)
- return (NULL);
- if (cp != res) /* common optimization */
- Copy(cp, res, (MEM_SIZE)(nbytes<onb?nbytes:onb), char);
- if (was_alloced)
- free(cp);
- }
-
-#ifdef safemalloc
-#ifdef DEBUGGING
- if (debug & 128) {
- fprintf(stderr,"0x%lx: (%05d) rfree\n",(unsigned long)res,an++);
- fprintf(stderr,"0x%lx: (%05d) realloc %ld bytes\n",
- (unsigned long)res,an++,(long)size);
- }
-#endif
-#endif /* safemalloc */
- return ((Malloc_t)res);
-}
-
-/*
- * Search ``srchlen'' elements of each free list for a block whose
- * header starts at ``freep''. If srchlen is -1 search the whole list.
- * Return bucket number, or -1 if not found.
- */
-static int
-findbucket(freep, srchlen)
- union overhead *freep;
- int srchlen;
-{
- register union overhead *p;
- register int i, j;
-
- for (i = 0; i < NBUCKETS; i++) {
- j = 0;
- for (p = nextf[i]; p && j != srchlen; p = p->ov_next) {
- if (p == freep)
- return (i);
- j++;
- }
- }
- return (-1);
-}
-
-#ifdef MSTATS
-/*
- * mstats - print out statistics about malloc
- *
- * Prints two lines of numbers, one showing the length of the free list
- * for each size category, the second showing the number of mallocs -
- * frees for each size category.
- */
-void
-mstats(s)
- char *s;
-{
- register int i, j;
- register union overhead *p;
- int totfree = 0,
- totused = 0;
-
- fprintf(stderr, "Memory allocation statistics %s\nfree:\t", s);
- for (i = 0; i < NBUCKETS; i++) {
- for (j = 0, p = nextf[i]; p; p = p->ov_next, j++)
- ;
- fprintf(stderr, " %d", j);
- totfree += j * (1 << (i + 3));
- }
- fprintf(stderr, "\nused:\t");
- for (i = 0; i < NBUCKETS; i++) {
- fprintf(stderr, " %d", nmalloc[i]);
- totused += nmalloc[i] * (1 << (i + 3));
- }
- fprintf(stderr, "\n\tTotal in use: %d, total free: %d\n",
- totused, totfree);
-}
-#endif
-#endif /* lint */