Update Changes.
[p5sagit/p5-mst-13.2.git] / Porting / pumpkin.pod
index 3bc9d09..141a60a 100644 (file)
@@ -1,6 +1,6 @@
 =head1 NAME
 
-Pumpkin - Notes on handling the Perl Patch Pumpkin
+Pumpkin - Notes on handling the Perl Patch Pumpkin And Porting Perl
 
 =head1 SYNOPSIS
 
@@ -24,7 +24,7 @@ and all the various auxiliary files that are part of the distribution.
 
 The Comprehensive Perl Archive Network (or CPAN) is the place to go.
 There are many mirrors, but the easiest thing to use is probably
-http://www.perl.com/CPAN/README.html , which automatically points you to a
+http://www.cpan.org/README.html , which automatically points you to a
 mirror site "close" to you.
 
 =head2 Perl5-porters mailing list
@@ -158,6 +158,7 @@ settled elsewhere.
 
 If feasible, try to keep filenames 8.3-compliant to humor those poor
 souls that get joy from running Perl under such dire limitations.
+There's a script, check83.pl, for keeping your nose 8.3-clean.
 
 =head2 Seek consensus on major changes
 
@@ -240,6 +241,9 @@ some or all of the modules File::Basename, File::Spec, File::Path, and
 File::Copy to become aware of your native filesystem syntax and
 peculiarities.
 
+Remember to have a $VERSION in the modules.  You can use the
+Porting/checkVERSION.pl script for checking this.
+
 =item documentation
 
 If your operating system comes from outside UNIX you almost certainly
@@ -346,6 +350,9 @@ need feedback on your patch, go ahead and issue it and promise to
 incorporate that feedback quickly (e.g. within 1 week) and send out a
 second patch.
 
+If you update the subversion number, you may need to change the version
+number near the top of the F<Changes> file.
+
 =head2 run metaconfig
 
 If you need to make changes to Configure or config_h.SH, it may be best to
@@ -358,7 +365,7 @@ on obtaining and running metaconfig is in the F<U/README> file
 that comes with Perl's metaconfig units.  Perl's metaconfig units
 should be available on CPAN.  A set of units that will work with
 perl5.005 is in the file F<mc_units-5.005_00-01.tar.gz> under
-http://www.perl.com/CPAN/authors/id/ANDYD/ .  The mc_units tar file
+http://www.cpan.org/authors/id/ANDYD/ .  The mc_units tar file
 should be unpacked in your main perl source directory.  Note: those
 units were for use with 5.005.  There may have been changes since then.
 Check for later versions or contact perl5-porters@perl.org to obtain a
@@ -497,7 +504,7 @@ Don't forget to regenerate perly_c.diff.
     mv y.tab.c perly.c
     patch perly.c <perly_c.diff
     # manually apply any failed hunks
-    diff -c2 perly.c.orig perly.c >perly_c.diff
+    diff -c perly.c.orig perly.c >perly_c.diff
 
 One chunk of lines that often fails begins with
 
@@ -578,6 +585,9 @@ ought to go in the Changes file or whether they ought to be available
 separately in the patch file (or both).  There is no disagreement that
 detailed descriptions ought to be easily available somewhere.
 
+If you update the subversion number in F<patchlevel.h>, you may need
+to change the version number near the top of the F<Changes> file.
+
 =head2 Todo
 
 The F<Todo> file contains a roughly-catgorized unordered list of
@@ -632,7 +642,7 @@ script.
 
 I find the F<makepatch> utility quite handy for making patches.
 You can obtain it from any CPAN archive under
-http://www.perl.com/CPAN/authors/Johan_Vromans/ .  There are a couple
+http://www.cpan.org/authors/Johan_Vromans/ .  There are a couple
 of differences between my version and the standard one. I have mine do
 a
 
@@ -729,15 +739,33 @@ produced by this process.
 
 A more accurate approach is the following commands:
 
-    sh Configure -des -Dccflags=-Wformat ...
-    make miniperl              # without -DCHECK_FORMAT
-    perl -i.orig -pwe 's/-Wformat/-DCHECK_FORMAT $&/' config.sh
-    sh Configure -S
-    make >& make.log           # build from correct miniperl
+=over 4
+
+=item *
+
+build miniperl with -DCHECK_FORMAT 
+
+    make clean
+    make miniperl OPTIMIZE=-DCHECK_FORMAT >& mini.log  
+
+=item *
+
+build a clean miniperl,
+and build everything else from that with -DCHECK_FORMAT
+
     make clean
-    make miniperl >& mini.log  # build miniperl with -DCHECK_FORMAT 
-    perl -nwe 'print if /^\S+:/ and not /^make\b/' mini.log make.log
+    make miniperl      
+    make all OPTIMIZE='-DCHECK_FORMAT -Wformat' >& make.log  
+               
+=item *
+
+clean up, and print warnings from the log files
+
     make clean
+    perl -nwe 'print if /^\S+:/ and not /^make\b/' \
+       mini.log make.log
+
+=back
 
 (-Wformat support by Robin Barker.)
 
@@ -757,7 +785,7 @@ Use the following commands to test perl with Purify:
        make all pureperl
        cd t
        ln -s ../pureperl perl
-       setenv PERL_DESTRUCT_LEVEL 5
+       setenv PERL_DESTRUCT_LEVEL 2
        ./perl TEST
 
 Disabling Perl's malloc allows Purify to monitor allocations and leaks
@@ -1117,7 +1145,7 @@ but not so much that it posed any serious problems.
 
 =item Metaconfig worked for me
 
-My system at the time was Interactive 2.2, a SVR3.2/386 derivative that
+My system at the time was Interactive 2.2, an SVR3.2/386 derivative that
 also had some POSIX support.  Metaconfig-generated Configure scripts
 worked fine for me on that system.  On the other hand, autoconf-generated
 scripts usually didn't.  (They did come quite close, though, in some
@@ -1254,7 +1282,7 @@ reflection, I'd say leave libperl.so in $archlib.
 =head1 Upload Your Work to CPAN
 
 You can upload your work to CPAN if you have a CPAN id.  Check out
-http://www.perl.com/CPAN/modules/04pause.html for information on
+http://www.cpan.org/modules/04pause.html for information on
 _PAUSE_, the Perl Author's Upload Server.
 
 I typically upload both the patch file, e.g. F<perl5.004_08.pat.gz>
@@ -1262,7 +1290,7 @@ and the full tar file, e.g. F<perl5.004_08.tar.gz>.
 
 If you want your patch to appear in the F<src/5.0/unsupported>
 directory on CPAN, send e-mail to the CPAN master librarian.  (Check
-out http://www.perl.com/CPAN/CPAN.html ).
+out http://www.cpan.org/CPAN.html ).
 
 =head1 Help Save the World
 
@@ -1278,6 +1306,97 @@ Here, in no particular order, are some Configure and build-related
 items that merit consideration.  This list isn't exhaustive, it's just
 what I came up with off the top of my head.
 
+=head2 Adding missing library functions to Perl
+
+The perl Configure script automatically determines which headers and
+functions you have available on your system and arranges for them to be
+included in the compilation and linking process.  Occasionally, when porting
+perl to an operating system for the first time, you may find that the
+operating system is missing a key function.  While perl may still build
+without this function, no perl program will be able to reference the missing
+function.  You may be able to write the missing function yourself, or you
+may be able to find the missing function in the distribution files for
+another software package.  In this case, you need to instruct the perl
+configure-and-build process to use your function.  Perform these steps.
+
+=over 3
+
+=item *
+
+Code and test the function you wish to add.  Test it carefully; you will
+have a much easier time debugging your code independently than when it is a
+part of perl.
+
+=item *
+
+Here is an implementation of the POSIX truncate function for an operating
+system (VOS) that does not supply one, but which does supply the ftruncate()
+function.
+
+  /* Beginning of modification history */
+  /* Written 02-01-02 by Nick Ing-Simmons (nick@ing-simmons.net) */
+  /* End of modification history */
+  
+  /* VOS doesn't supply a truncate function, so we build one up
+     from the available POSIX functions.  */
+  
+  #include <fcntl.h>
+  #include <sys/types.h>
+  #include <unistd.h>
+  
+  int
+  truncate(const char *path, off_t len)
+  {
+   int fd = open(path,O_WRONLY);
+   int code = -1;
+   if (fd >= 0) {
+     code = ftruncate(fd,len);
+     close(fd);
+   }
+   return code;
+  }
+
+Place this file into a subdirectory that has the same name as the operating
+system. This file is named perl/vos/vos.c
+
+=item *
+
+If your operating system has a hints file (in perl/hints/XXX.sh for an
+operating system named XXX), then start with it.  If your operating system
+has no hints file, then create one.  You can use a hints file for a similar
+operating system, if one exists, as a template.
+
+=item *
+
+Add lines like the following to your hints file. The first line
+(d_truncate="define") instructs Configure that the truncate() function
+exists. The second line (archobjs="vos.o") instructs the makefiles that the
+perl executable depends on the existence of a file named "vos.o".  (Make
+will automatically look for "vos.c" and compile it with the same options as
+the perl source code).  The final line ("test -h...") adds a symbolic link
+to the top-level directory so that make can find vos.c.  Of course, you
+should use your own operating system name for the source file of extensions,
+not "vos.c".
+
+  # VOS does not have truncate() but we supply one in vos.c
+  d_truncate="define"
+  archobjs="vos.o"
+  
+  # Help gmake find vos.c
+  test -h vos.c || ln -s vos/vos.c vos.c
+
+The hints file is a series of shell commands that are run in the top-level
+directory (the "perl" directory).  Thus, these commands are simply executed
+by Configure at an appropriate place during its execution.
+
+=item *
+
+At this point, you can run the Configure script and rebuild perl.  Carefully
+test the newly-built perl to ensure that normal paths, and error paths,
+behave as you expect.
+
+=back
+
 =head2 Good ideas waiting for round tuits
 
 =over 4