perldoc diffs: don't search auto - much faster
[p5sagit/p5-mst-13.2.git] / Porting / pumpkin.pod
CommitLineData
aa689395 1=head1 NAME
2
3Pumpkin - Notes on handling the Perl Patch Pumpkin
4
5=head1 SYNOPSIS
6
7There is no simple synopsis, yet.
8
9=head1 DESCRIPTION
10
11This document attempts to begin to describe some of the
12considerations involved in patching and maintaining perl.
13
14This document is still under construction, and still subject to
15significant changes. Still, I hope parts of it will be useful,
16so I'm releasing it even though it's not done.
17
18For the most part, it's a collection of anecdotal information that
19already assumes some familiarity with the Perl sources. I really need
20an introductory section that describes the organization of the sources
21and all the various auxiliary files that are part of the distribution.
22
23=head1 Where Do I Get Perl Sources and Related Material?
24
25The Comprehensive Perl Archive Network (or CPAN) is the place to go.
26There are many mirrors, but the easiest thing to use is probably
7b5757d1 27http://www.perl.com/CPAN/README.html , which automatically points you to a
aa689395 28mirror site "close" to you.
29
30=head2 Perl5-porters mailing list
31
32The mailing list perl5-porters@perl.org
33is the main group working with the development of perl. If you're
34interested in all the latest developments, you should definitely
35subscribe. The list is high volume, but generally has a
36fairly low noise level.
37
38Subscribe by sending the message (in the body of your letter)
39
40 subscribe perl5-porters
41
42to perl5-porters-request@perl.org .
43
44=head1 How are Perl Releases Numbered?
45
7b5757d1 46Perl version numbers are floating point numbers, such as 5.004.
47(Observations about the imprecision of floating point numbers for
48representing reality probably have more relevance than you might
49imagine :-) The major version number is 5 and the '004' is the
50patchlevel. (Questions such as whether or not '004' is really a minor
51version number can safely be ignored.:)
52
53The version number is available as the magic variable $],
aa689395 54and can be used in comparisons, e.g.
55
56 print "You've got an old perl\n" if $] < 5.002;
57
aa689395 58You can also require particular version (or later) with
59
60 use 5.002;
61
7b5757d1 62At some point in the future, we may need to decide what to call the
63next big revision. In the .package file used by metaconfig to
64generate Configure, there are two variables that might be relevant:
65$baserev=5.0 and $package=perl5. At various times, I have suggested
66we might change them to $baserev=5.1 and $package=perl5.1 if want
67to signify a fairly major update. Or, we might want to jump to perl6.
68Let's worry about that problem when we get there.
69
aa689395 70=head2 Subversions
71
72In addition, there may be "developer" sub-versions available. These
73are not official releases. They may contain unstable experimental
74features, and are subject to rapid change. Such developer
75sub-versions are numbered with sub-version numbers. For example,
76version 5.004_04 is the 4'th developer version built on top of
775.004. It might include the _01, _02, and _03 changes, but it
78also might not. Sub-versions are allowed to be subversive.
79
80These sub-versions can also be used as floating point numbers, so
81you can do things such as
82
7b5757d1 83 print "You've got an unstable perl\n" if $] == 5.00303;
aa689395 84
85You can also require particular version (or later) with
86
7b5757d1 87 use 5.003_03; # the "_" is optional
aa689395 88
89Sub-versions produced by the members of perl5-porters are usually
90available on CPAN in the F<src/5.0/unsupported> directory.
91
7b5757d1 92=head2 Maintenance and Development Subversions
93
94As an experiment, starting with version 5.004, subversions _01 through
95_49 will be reserved for bug-fix maintenance releases, and subversions
96_50 through _99 will be available for unstable development versions.
97
98The separate bug-fix track is being established to allow us an easy
99way to distribute important bug fixes without waiting for the
100developers to untangle all the other problems in the current
101developer's release.
102
103Watch for announcements of maintenance subversions in
104comp.lang.perl.announce.
105
aa689395 106=head2 Why such a complicated scheme?
107
108Two reasons, really. At least.
109
7b5757d1 110First, we need some way to identify and release collections of patches
111that are known to have new features that need testing and exploration. The
aa689395 112subversion scheme does that nicely while fitting into the
113C<use 5.004;> mold.
114
115Second, since most of the folks who help maintain perl do so on a
116free-time voluntary basis, perl development does not proceed at a
117precise pace, though it always seems to be moving ahead quickly.
118We needed some way to pass around the "patch pumpkin" to allow
119different people chances to work on different aspects of the
120distribution without getting in each other's way. It wouldn't be
121constructive to have multiple people working on incompatible
122implementations of the same idea. Instead what was needed was
123some kind of "baton" or "token" to pass around so everyone knew
124whose turn was next.
125
126=head2 Why is it called the patch pumpkin?
127
128Chip Salzenberg gets credit for that, with a nod to his cow orker,
129David Croy. We had passed around various names (baton, token, hot
130potato) but none caught on. Then, Chip asked:
131
132[begin quote]
133
134 Who has the patch pumpkin?
135
136To explain: David Croy once told me once that at a previous job,
137there was one tape drive and multiple systems that used it for backups.
138But instead of some high-tech exclusion software, they used a low-tech
139method to prevent multiple simultaneous backups: a stuffed pumpkin.
140No one was allowed to make backups unless they had the "backup pumpkin".
141
142[end quote]
143
144The name has stuck.
145
146=head1 Philosophical Issues in Patching Perl
147
148There are no absolute rules, but there are some general guidelines I
149have tried to follow as I apply patches to the perl sources.
150(This section is still under construction.)
151
152=head2 Solve problems as generally as possible
153
7b5757d1 154Never implement a specific restricted solution to a problem when you
155can solve the same problem in a more general, flexible way.
156
157For example, for dynamic loading to work on some SVR4 systems, we had
158to build a shared libperl.so library. In order to build "FAT" binaries
159on NeXT 4.0 systems, we had to build a special libperl library. Rather
160than continuing to build a contorted nest of special cases, I
161generalized the process of building libperl so that NeXT and SVR4 users
162could still get their work done, but others could build a shared
163libperl if they wanted to as well.
aa689395 164
165=head2 Seek consensus on major changes
166
167If you are making big changes, don't do it in secret. Discuss the
168ideas in advance on perl5-porters.
169
170=head2 Keep the documentation up-to-date
171
172If your changes may affect how users use perl, then check to be sure
173that the documentation is in sync with your changes. Be sure to
174check all the files F<pod/*.pod> and also the F<INSTALL> document.
175
176Consider writing the appropriate documentation first and then
7b5757d1 177implementing your change to correspond to the documentation.
aa689395 178
179=head2 Avoid machine-specific #ifdef's
180
181To the extent reasonable, try to avoid machine-specific #ifdef's in
182the sources. Instead, use feature-specific #ifdef's. The reason is
183that the machine-specific #ifdef's may not be valid across major
184releases of the operating system. Further, the feature-specific tests
185may help out folks on another platform who have the same problem.
186
187=head2 Allow for lots of testing
188
189We should never release a main version without testing it as a
190subversion first.
191
6877a1cf 192=head2 Test popular applications and modules.
193
194We should never release a main version without testing whether or not
195it breaks various popular modules and applications. A partial list of
196such things would include majordomo, metaconfig, apache, Tk, CGI,
197libnet, and libwww, to name just a few. Of course it's quite possible
198that some of those things will be just plain broken and need to be fixed,
199but, in general, we ought to try to avoid breaking widely-installed
200things.
201
7b5757d1 202=head2 Automate generation of derivative files
aa689395 203
204The F<embed.h>, F<keywords.h>, F<opcode.h>, and F<perltoc.pod> files
205are all automatically generated by perl scripts. In general, don't
206patch these directly; patch the data files instead.
207
208F<Configure> and F<config_h.SH> are also automatically generated by
209B<metaconfig>. In general, you should patch the metaconfig units
210instead of patching these files directly. However, minor changes to
211F<Configure> may be made in between major sync-ups with the metaconfig
212units, which tends to be complicated operations.
213
214=head1 How to Make a Distribution
215
216There really ought to be a 'make dist' target, but there isn't.
217The 'dist' suite of tools also contains a number of tools that I haven't
218learned how to use yet. Some of them may make this all a bit easier.
219
220Here are the steps I go through to prepare a patch & distribution.
221
3e3baf6d 222Lots of it could doubtless be automated but isn't. The Porting/makerel
223(make release) perl script does now help automate some parts of it.
aa689395 224
225=head2 Announce your intentions
226
227First, you should volunteer out loud to take the patch pumpkin. It's
228generally counter-productive to have multiple people working in secret
229on the same thing.
230
231At the same time, announce what you plan to do with the patch pumpkin,
232to allow folks a chance to object or suggest alternatives, or do it for
233you. Naturally, the patch pumpkin holder ought to incorporate various
234bug fixes and documentation improvements that are posted while he or
235she has the pumpkin, but there might also be larger issues at stake.
236
237One of the precepts of the subversion idea is that we shouldn't give
7b5757d1 238the patch pumpkin to anyone unless we have some idea what he or she
239is going to do with it.
aa689395 240
241=head2 refresh pod/perltoc.pod
242
243Presumably, you have done a full C<make> in your working source
244directory. Before you C<make spotless> (if you do), and if you have
245changed any documentation in any module or pod file, change to the
246F<pod> directory and run C<make toc>.
247
3e3baf6d 248=head2 run installhtml to check the validity of the pod files
249
aa689395 250=head2 update patchlevel.h
251
252Don't be shy about using the subversion number, even for a relatively
253modest patch. We've never even come close to using all 99 subversions,
254and it's better to have a distinctive number for your patch. If you
255need feedback on your patch, go ahead and issue it and promise to
256incorporate that feedback quickly (e.g. within 1 week) and send out a
257second patch.
258
259=head2 run metaconfig
260
261If you need to make changes to Configure or config_h.SH, it may be best to
262change the appropriate metaconfig units instead, and regenerate Configure.
263
264 metaconfig -m
265
266will regenerate Configure and config_h.SH. More information on
267obtaining and running metaconfig is in the F<U/README> file that comes
268with Perl's metaconfig units. Perl's metaconfig units should be
269available the same place you found this file. On CPAN, look under my
3e3baf6d 270directory F<authors/id/ANDYD/> for a file such as F<5.003_07-02.U.tar.gz>.
aa689395 271That file should be unpacked in your main perl source directory. It
272contains the files needed to run B<metaconfig> to reproduce Perl's
7b5757d1 273Configure script. (Those units are for 5.003_07. There have been
274changes since then; please contact me if you want more recent
275versions, and I will try to point you in the right direction.)
aa689395 276
277Alternatively, do consider if the F<*ish.h> files might be a better
278place for your changes.
279
280=head2 MANIFEST
281
282Make sure the MANIFEST is up-to-date. You can use dist's B<manicheck>
283program for this. You can also use
284
3e3baf6d 285 perl -w -MExtUtils::Manifest=fullcheck -e fullcheck
aa689395 286
3e3baf6d 287Both commands will also list extra files in the directory that are not
288listed in MANIFEST.
aa689395 289
290The MANIFEST is normally sorted, with one exception. Perl includes
291both a F<Configure> script and a F<configure> script. The
292F<configure> script is a front-end to the main F<Configure>, but
293is there to aid folks who use autoconf-generated F<configure> files
294for other software. The problem is that F<Configure> and F<configure>
295are the same on case-insensitive file systems, so I deliberately put
296F<configure> first in the MANIFEST so that the extraction of
297F<Configure> will overwrite F<configure> and leave you with the
298correct script. (The F<configure> script must also have write
299permission for this to work, so it's the only file in the distribution
300I normally have with write permission.)
301
302If you are using metaconfig to regenerate Configure, then you should note
303that metaconfig actually uses MANIFEST.new, so you want to be sure
304MANIFEST.new is up-to-date too. I haven't found the MANIFEST/MANIFEST.new
305distinction particularly useful, but that's probably because I still haven't
306learned how to use the full suite of tools in the dist distribution.
307
308=head2 Check permissions
309
310All the tests in the t/ directory ought to be executable. The
311main makefile used to do a 'chmod t/*/*.t', but that resulted in
312a self-modifying distribution--something some users would strongly
313prefer to avoid. Probably, the F<t/TEST> script should check for this
314and do the chmod if needed, but it doesn't currently.
315
316In all, the following files should probably be executable:
317
318 Configure
319 configpm
320 configure
321 embed.pl
322 installperl
323 installman
324 keywords.pl
aa689395 325 myconfig
326 opcode.pl
327 perly.fixer
328 t/TEST
329 t/*/*.t
330 *.SH
331 vms/ext/Stdio/test.pl
332 vms/ext/filespec.t
333 vms/fndvers.com
334 x2p/*.SH
335
336Other things ought to be readable, at least :-).
337
338Probably, the permissions for the files could be encoded in MANIFEST
339somehow, but I'm reluctant to change MANIFEST itself because that
340could break old scripts that use MANIFEST.
341
342I seem to recall that some SVR3 systems kept some sort of file that listed
343permissions for system files; something like that might be appropriate.
344
345=head2 Run Configure
346
347This will build a config.sh and config.h. You can skip this if you haven't
348changed Configure or config_h.SH at all.
349
350=head2 Update config_H
351
352The config_H file is provided to help those folks who can't run Configure.
353It is important to keep it up-to-date. If you have changed config_h.SH,
354those changes must be reflected in config_H as well. (The name config_H was
355chosen to distinguish the file from config.h even on case-insensitive file
356systems.) Simply edit the existing config_H file; keep the first few
357explanatory lines and then copy your new config.h below.
358
359It may also be necessary to update vms/config.vms and
360plan9/config.plan9, though you should be quite careful in doing so if
361you are not familiar with those systems. You might want to issue your
362patch with a promise to quickly issue a follow-up that handles those
363directories.
364
365=head2 make run_byacc
366
367If you have byacc-1.8.2 (available from CPAN), and if there have been
368changes to F<perly.y>, you can regenerate the F<perly.c> file. The
369run_byacc makefile target does this by running byacc and then applying
370some patches so that byacc dynamically allocates space, rather than
371having fixed limits. This patch is handled by the F<perly.fixer>
372script. Depending on the nature of the changes to F<perly.y>, you may
373or may not have to hand-edit the patch to apply correctly. If you do,
374you should include the edited patch in the new distribution. If you
375have byacc-1.9, the patch won't apply cleanly. Changes to the printf
376output statements mean the patch won't apply cleanly. Long ago I
377started to fix F<perly.fixer> to detect this, but I never completed the
378task.
379
380Some additional notes from Larry on this:
381
382Don't forget to regenerate perly.c.diff.
383
7b5757d1 384 byacc -d perly.y
aa689395 385 mv y.tab.c perly.c
386 patch perly.c <perly.c.diff
387 # manually apply any failed hunks
388 diff -c2 perly.c.orig perly.c >perly.c.diff
389
390One chunk of lines that often fails begins with
391
392 #line 29 "perly.y"
393
394and ends one line before
395
396 #define YYERRCODE 256
397
398This only happens when you add or remove a token type. I suppose this
399could be automated, but it doesn't happen very often nowadays.
400
401Larry
402
403=head2 make regen_headers
404
405The F<embed.h>, F<keywords.h>, and F<opcode.h> files are all automatically
406generated by perl scripts. Since the user isn't guaranteed to have a
407working perl, we can't require the user to generate them. Hence you have
408to, if you're making a distribution.
409
410I used to include rules like the following in the makefile:
411
412 # The following three header files are generated automatically
413 # The correct versions should be already supplied with the perl kit,
414 # in case you don't have perl or 'sh' available.
415 # The - is to ignore error return codes in case you have the source
416 # installed read-only or you don't have perl yet.
417 keywords.h: keywords.pl
418 @echo "Don't worry if this fails."
419 - perl keywords.pl
420
421
7b5757d1 422However, I got B<lots> of mail consisting of people worrying because the
aa689395 423command failed. I eventually decided that I would save myself time
424and effort by manually running C<make regen_headers> myself rather
425than answering all the questions and complaints about the failing
426command.
427
3e3baf6d 428=head2 global.sym, interp.sym and perlio.sym
aa689395 429
430Make sure these files are up-to-date. Read the comments in these
431files and in perl_exp.SH to see what to do.
432
433=head2 Binary compatibility
434
435If you do change F<global.sym> or F<interp.sym>, think carefully about
436what you are doing. To the extent reasonable, we'd like to maintain
437souce and binary compatibility with older releases of perl. That way,
438extensions built under one version of perl will continue to work with
439new versions of perl.
440
441Of course, some incompatible changes may well be necessary. I'm just
442suggesting that we not make any such changes without thinking carefully
443about them first. If possible, we should provide
444backwards-compatibility stubs. There's a lot of XS code out there.
445Let's not force people to keep changing it.
446
447=head2 Changes
448
449Be sure to update the F<Changes> file. Try to include both an overall
450summary as well as detailed descriptions of the changes. Your
3e3baf6d 451audience will include other developers and users, so describe
aa689395 452user-visible changes (if any) in terms they will understand, not in
453code like "initialize foo variable in bar function".
454
455There are differing opinions on whether the detailed descriptions
456ought to go in the Changes file or whether they ought to be available
457separately in the patch file (or both). There is no disagreement that
458detailed descriptions ought to be easily available somewhere.
459
460=head2 OS/2-specific updates
461
462In the os2 directory is F<diff.configure>, a set of OS/2-specific
463diffs against B<Configure>. If you make changes to Configure, you may
464want to consider regenerating this diff file to save trouble for the
465OS/2 maintainer.
466
7b5757d1 467You can also consider the OS/2 diffs as reminders of portability
468things that need to be fixed in Configure.
469
aa689395 470=head2 VMS-specific updates
471
472If you have changed F<perly.y>, then you may want to update
473F<vms/perly_{h,c}.vms> by running C<perl vms/vms_yfix.pl>.
474
475The Perl version number appears in several places under F<vms>.
476It is courteous to update these versions. For example, if you are
477making 5.004_42, replace "5.00441" with "5.00442".
478
479=head2 Making the new distribution
480
481Suppose, for example, that you want to make version 5.004_08. Then you can
482do something like the following
483
484 mkdir ../perl5.004_08
485 awk '{print $1}' MANIFEST | cpio -pdm ../perl5.004_08
486 cd ../
487 tar cf perl5.004_08.tar perl5.004_08
488 gzip --best perl5.004_08.tar
489
3e3baf6d 490These steps, with extra checks, are automated by the Porting/makerel
491script.
492
aa689395 493=head2 Making a new patch
494
495I find the F<makepatch> utility quite handy for making patches.
496You can obtain it from any CPAN archive under
3e3baf6d 497http://www.perl.com/CPAN/authors/Johan_Vromans/ . There are a couple
498of differences between my version and the standard one. I have mine do
499a
aa689395 500
501 # Print a reassuring "End of Patch" note so people won't
502 # wonder if their mailer truncated patches.
503 print "\n\nEnd of Patch.\n";
504
3e3baf6d 505at the end. That's because I used to get questions from people asking
506if their mail was truncated.
507
508It also writes Index: lines which include the new directory prefix
509(change Index: print, approx line 294 or 310 depending on the version,
510to read: print PATCH ("Index: $newdir$new\n");). That helps patches
511work with more POSIX conformant patch programs.
aa689395 512
513Here's how I generate a new patch. I'll use the hypothetical
5145.004_07 to 5.004_08 patch as an example.
515
516 # unpack perl5.004_07/
517 gzip -d -c perl5.004_07.tar.gz | tar -xof -
518 # unpack perl5.004_08/
519 gzip -d -c perl5.004_08.tar.gz | tar -xof -
520 makepatch perl5.004_07 perl5.004_08 > perl5.004_08.pat
521
522Makepatch will automatically generate appropriate B<rm> commands to remove
523deleted files. Unfortunately, it will not correctly set permissions
524for newly created files, so you may have to do so manually. For example,
525patch 5.003_04 created a new test F<t/op/gv.t> which needs to be executable,
526so at the top of the patch, I inserted the following lines:
527
528 # Make a new test
529 touch t/op/gv.t
530 chmod +x t/opt/gv.t
531
532Now, of course, my patch is now wrong because makepatch didn't know I
533was going to do that command, and it patched against /dev/null.
534
535So, what I do is sort out all such shell commands that need to be in the
536patch (including possible mv-ing of files, if needed) and put that in the
537shell commands at the top of the patch. Next, I delete all the patch parts
538of perl5.004_08.pat, leaving just the shell commands. Then, I do the
539following:
540
7b5757d1 541 cd perl5.004_07
542 sh ../perl5.004_08.pat
aa689395 543 cd ..
7b5757d1 544 makepatch perl5.004_07 perl5.004_08 >> perl5.004_08.pat
aa689395 545
546(Note the append to preserve my shell commands.)
547Now, my patch will line up with what the end users are going to do.
548
549=head2 Testing your patch
550
551It seems obvious, but be sure to test your patch. That is, verify that
552it produces exactly the same thing as your full distribution.
553
7b5757d1 554 rm -rf perl5.004_07
555 gzip -d -c perl5.004_07.tar.gz | tar -xf -
556 cd perl5.004_07
557 sh ../perl5.004_08.pat
558 patch -p1 -N < ../perl5.004_08.pat
aa689395 559 cd ..
7b5757d1 560 gdiff -r perl5.004_07 perl5.004_08
aa689395 561
562where B<gdiff> is GNU diff. Other diff's may also do recursive checking.
563
564=head2 More testing
565
566Again, it's obvious, but you should test your new version as widely as you
567can. You can be sure you'll hear about it quickly if your version doesn't
568work on both ANSI and pre-ANSI compilers, and on common systems such as
569SunOS 4.1.[34], Solaris, and Linux.
570
571If your changes include conditional code, try to test the different
572branches as thoroughly as you can. For example, if your system
573supports dynamic loading, you can also test static loading with
574
575 sh Configure -Uusedl
576
577You can also hand-tweak your config.h to try out different #ifdef
578branches.
579
580=head1 Common Gotcha's
581
582=over 4
583
584=item #elif
585
586The '#elif' preprocessor directive is not understood on all systems.
587Specifically, I know that Pyramids don't understand it. Thus instead of the
588simple
589
590 #if defined(I_FOO)
591 # include <foo.h>
592 #elif defined(I_BAR)
593 # include <bar.h>
594 #else
595 # include <fubar.h>
596 #endif
597
598You have to do the more Byzantine
599
600 #if defined(I_FOO)
601 # include <foo.h>
602 #else
603 # if defined(I_BAR)
604 # include <bar.h>
605 # else
606 # include <fubar.h>
607 # endif
608 #endif
609
610Incidentally, whitespace between the leading '#' and the preprocessor
611command is not guaranteed, but is very portable and you may use it freely.
612I think it makes things a bit more readable, especially once things get
613rather deeply nested. I also think that things should almost never get
614too deeply nested, so it ought to be a moot point :-)
615
616=item Probably Prefer POSIX
617
618It's often the case that you'll need to choose whether to do
619something the BSD-ish way or the POSIX-ish way. It's usually not
620a big problem when the two systems use different names for similar
621functions, such as memcmp() and bcmp(). The perl.h header file
622handles these by appropriate #defines, selecting the POSIX mem*()
623functions if available, but falling back on the b*() functions, if
624need be.
625
626More serious is the case where some brilliant person decided to
627use the same function name but give it a different meaning or
628calling sequence :-). getpgrp() and setpgrp() come to mind.
629These are a real problem on systems that aim for conformance to
630one standard (e.g. POSIX), but still try to support the other way
631of doing things (e.g. BSD). My general advice (still not really
632implemented in the source) is to do something like the following.
633Suppose there are two alternative versions, fooPOSIX() and
634fooBSD().
635
636 #ifdef HAS_FOOPOSIX
637 /* use fooPOSIX(); */
638 #else
639 # ifdef HAS_FOOBSD
640 /* try to emulate fooPOSIX() with fooBSD();
641 perhaps with the following: */
642 # define fooPOSIX fooBSD
643 # else
644 # /* Uh, oh. We have to supply our own. */
645 # define fooPOSIX Perl_fooPOSIX
646 # endif
647 #endif
648
649=item Think positively
650
651If you need to add an #ifdef test, it is usually easier to follow if you
652think positively, e.g.
653
654 #ifdef HAS_NEATO_FEATURE
655 /* use neato feature */
656 #else
657 /* use some fallback mechanism */
658 #endif
659
660rather than the more impenetrable
661
662 #ifndef MISSING_NEATO_FEATURE
663 /* Not missing it, so we must have it, so use it */
664 #else
665 /* Are missing it, so fall back on something else. */
666 #endif
667
668Of course for this toy example, there's not much difference. But when
669the #ifdef's start spanning a couple of screen fulls, and the #else's
670are marked something like
671
672 #else /* !MISSING_NEATO_FEATURE */
673
674I find it easy to get lost.
675
676=item Providing Missing Functions -- Problem
677
678Not all systems have all the neat functions you might want or need, so
679you might decide to be helpful and provide an emulation. This is
680sound in theory and very kind of you, but please be careful about what
681you name the function. Let me use the C<pause()> function as an
682illustration.
683
684Perl5.003 has the following in F<perl.h>
685
686 #ifndef HAS_PAUSE
687 #define pause() sleep((32767<<16)+32767)
688 #endif
689
690Configure sets HAS_PAUSE if the system has the pause() function, so
691this #define only kicks in if the pause() function is missing.
692Nice idea, right?
693
694Unfortunately, some systems apparently have a prototype for pause()
695in F<unistd.h>, but don't actually have the function in the library.
696(Or maybe they do have it in a library we're not using.)
697
698Thus, the compiler sees something like
699
700 extern int pause(void);
701 /* . . . */
702 #define pause() sleep((32767<<16)+32767)
703
704and dies with an error message. (Some compilers don't mind this;
705others apparently do.)
706
707To work around this, 5.003_03 and later have the following in perl.h:
708
709 /* Some unistd.h's give a prototype for pause() even though
710 HAS_PAUSE ends up undefined. This causes the #define
711 below to be rejected by the compiler. Sigh.
712 */
713 #ifdef HAS_PAUSE
714 # define Pause pause
715 #else
716 # define Pause() sleep((32767<<16)+32767)
717 #endif
718
719This works.
720
721The curious reader may wonder why I didn't do the following in
722F<util.c> instead:
723
724 #ifndef HAS_PAUSE
725 void pause()
726 {
727 sleep((32767<<16)+32767);
728 }
729 #endif
730
731That is, since the function is missing, just provide it.
732Then things would probably be been alright, it would seem.
733
734Well, almost. It could be made to work. The problem arises from the
735conflicting needs of dynamic loading and namespace protection.
736
737For dynamic loading to work on AIX (and VMS) we need to provide a list
738of symbols to be exported. This is done by the script F<perl_exp.SH>,
739which reads F<global.sym> and F<interp.sym>. Thus, the C<pause>
740symbol would have to be added to F<global.sym> So far, so good.
741
742On the other hand, one of the goals of Perl5 is to make it easy to
743either extend or embed perl and link it with other libraries. This
744means we have to be careful to keep the visible namespace "clean".
745That is, we don't want perl's global variables to conflict with
746those in the other application library. Although this work is still
747in progress, the way it is currently done is via the F<embed.h> file.
748This file is built from the F<global.sym> and F<interp.sym> files,
749since those files already list the globally visible symbols. If we
750had added C<pause> to global.sym, then F<embed.h> would contain the
751line
752
753 #define pause Perl_pause
754
755and calls to C<pause> in the perl sources would now point to
756C<Perl_pause>. Now, when B<ld> is run to build the F<perl> executable,
757it will go looking for C<perl_pause>, which probably won't exist in any
758of the standard libraries. Thus the build of perl will fail.
759
760Those systems where C<HAS_PAUSE> is not defined would be ok, however,
761since they would get a C<Perl_pause> function in util.c. The rest of
762the world would be in trouble.
763
764And yes, this scenario has happened. On SCO, the function C<chsize>
765is available. (I think it's in F<-lx>, the Xenix compatibility
766library.) Since the perl4 days (and possibly before), Perl has
767included a C<chsize> function that gets called something akin to
768
769 #ifndef HAS_CHSIZE
770 I32 chsize(fd, length)
771 /* . . . */
772 #endif
773
774When 5.003 added
775
776 #define chsize Perl_chsize
777
778to F<embed.h>, the compile started failing on SCO systems.
779
780The "fix" is to give the function a different name. The one
781implemented in 5.003_05 isn't optimal, but here's what was done:
782
783 #ifdef HAS_CHSIZE
784 # ifdef my_chsize /* Probably #defined to Perl_my_chsize in embed.h */
785 # undef my_chsize
786 # endif
787 # define my_chsize chsize
788 #endif
789
790My explanatory comment in patch 5.003_05 said:
791
792 Undef and then re-define my_chsize from Perl_my_chsize to
793 just plain chsize if this system HAS_CHSIZE. This probably only
794 applies to SCO. This shows the perils of having internal
795 functions with the same name as external library functions :-).
796
797Now, we can safely put C<my_chsize> in F<global.sym>, export it, and
798hide it with F<embed.h>.
799
800To be consistent with what I did for C<pause>, I probably should have
801called the new function C<Chsize>, rather than C<my_chsize>.
802However, the perl sources are quite inconsistent on this (Consider
803New, Mymalloc, and Myremalloc, to name just a few.)
804
805There is a problem with this fix, however, in that C<Perl_chsize>
806was available as a F<libperl.a> library function in 5.003, but it
807isn't available any more (as of 5.003_07). This means that we've
808broken binary compatibility. This is not good.
809
810=item Providing missing functions -- some ideas
811
812We currently don't have a standard way of handling such missing
813function names. Right now, I'm effectively thinking aloud about a
814solution. Some day, I'll try to formally propose a solution.
815
816Part of the problem is that we want to have some functions listed as
817exported but not have their names mangled by embed.h or possibly
818conflict with names in standard system headers. We actually already
819have such a list at the end of F<perl_exp.SH> (though that list is
820out-of-date):
821
822 # extra globals not included above.
823 cat <<END >> perl.exp
824 perl_init_ext
825 perl_init_fold
826 perl_init_i18nl14n
827 perl_alloc
828 perl_construct
829 perl_destruct
830 perl_free
831 perl_parse
832 perl_run
833 perl_get_sv
834 perl_get_av
835 perl_get_hv
836 perl_get_cv
837 perl_call_argv
838 perl_call_pv
839 perl_call_method
840 perl_call_sv
841 perl_requirepv
842 safecalloc
843 safemalloc
844 saferealloc
845 safefree
846
847This still needs much thought, but I'm inclined to think that one
848possible solution is to prefix all such functions with C<perl_> in the
849source and list them along with the other C<perl_*> functions in
850F<perl_exp.SH>.
851
852Thus, for C<chsize>, we'd do something like the following:
853
854 /* in perl.h */
855 #ifdef HAS_CHSIZE
856 # define perl_chsize chsize
857 #endif
858
859then in some file (e.g. F<util.c> or F<doio.c>) do
860
861 #ifndef HAS_CHSIZE
862 I32 perl_chsize(fd, length)
863 /* implement the function here . . . */
864 #endif
865
866Alternatively, we could just always use C<chsize> everywhere and move
867C<chsize> from F<global.sym> to the end of F<perl_exp.SH>. That would
868probably be fine as long as our C<chsize> function agreed with all the
869C<chsize> function prototypes in the various systems we'll be using.
870As long as the prototypes in actual use don't vary that much, this is
871probably a good alternative. (As a counter-example, note how Configure
872and perl have to go through hoops to find and use get Malloc_t and
873Free_t for C<malloc> and C<free>.)
874
875At the moment, this latter option is what I tend to prefer.
876
877=item All the world's a VAX
878
879Sorry, showing my age:-). Still, all the world is not BSD 4.[34],
880SVR4, or POSIX. Be aware that SVR3-derived systems are still quite
881common (do you have any idea how many systems run SCO?) If you don't
882have a bunch of v7 manuals handy, the metaconfig units (by default
883installed in F</usr/local/lib/dist/U>) are a good resource to look at
884for portability.
885
886=back
887
888=head1 Miscellaneous Topics
889
890=head2 Autoconf
891
892Why does perl use a metaconfig-generated Configure script instead of an
893autoconf-generated configure script?
894
895Metaconfig and autoconf are two tools with very similar purposes.
896Metaconfig is actually the older of the two, and was originally written
897by Larry Wall, while autoconf is probably now used in a wider variety of
898packages. The autoconf info file discusses the history of autoconf and
899how it came to be. The curious reader is referred there for further
900information.
901
902Overall, both tools are quite good, I think, and the choice of which one
903to use could be argued either way. In March, 1994, when I was just
904starting to work on Configure support for Perl5, I considered both
905autoconf and metaconfig, and eventually decided to use metaconfig for the
906following reasons:
907
908=over 4
909
910=item Compatibility with Perl4
911
912Perl4 used metaconfig, so many of the #ifdef's were already set up for
913metaconfig. Of course metaconfig had evolved some since Perl4's days,
914but not so much that it posed any serious problems.
915
916=item Metaconfig worked for me
917
918My system at the time was Interactive 2.2, a SVR3.2/386 derivative that
919also had some POSIX support. Metaconfig-generated Configure scripts
920worked fine for me on that system. On the other hand, autoconf-generated
921scripts usually didn't. (They did come quite close, though, in some
922cases.) At the time, I actually fetched a large number of GNU packages
923and checked. Not a single one configured and compiled correctly
924out-of-the-box with the system's cc compiler.
925
926=item Configure can be interactive
927
928With both autoconf and metaconfig, if the script works, everything is
929fine. However, one of my main problems with autoconf-generated scripts
930was that if it guessed wrong about something, it could be B<very> hard to
931go back and fix it. For example, autoconf always insisted on passing the
932-Xp flag to cc (to turn on POSIX behavior), even when that wasn't what I
933wanted or needed for that package. There was no way short of editing the
934configure script to turn this off. You couldn't just edit the resulting
935Makefile at the end because the -Xp flag influenced a number of other
936configure tests.
937
938Metaconfig's Configure scripts, on the other hand, can be interactive.
939Thus if Configure is guessing things incorrectly, you can go back and fix
940them. This isn't as important now as it was when we were actively
941developing Configure support for new features such as dynamic loading,
942but it's still useful occasionally.
943
944=item GPL
945
946At the time, autoconf-generated scripts were covered under the GNU Public
947License, and hence weren't suitable for inclusion with Perl, which has a
948different licensing policy. (Autoconf's licensing has since changed.)
949
950=item Modularity
951
952Metaconfig builds up Configure from a collection of discrete pieces
953called "units". You can override the standard behavior by supplying your
954own unit. With autoconf, you have to patch the standard files instead.
955I find the metaconfig "unit" method easier to work with. Others
956may find metaconfig's units clumsy to work with.
957
958=back
959
960=head2 @INC search order
961
962By default, the list of perl library directories in @INC is the
963following:
964
965 $archlib
966 $privlib
967 $sitearch
968 $sitelib
969
970Specifically, on my Solaris/x86 system, I run
971B<sh Configure -Dprefix=/opt/perl> and I have the following
972directories:
973
974 /opt/perl/lib/i86pc-solaris/5.00307
975 /opt/perl/lib
976 /opt/perl/lib/site_perl/i86pc-solaris
977 /opt/perl/lib/site_perl
978
979That is, perl's directories come first, followed by the site-specific
980directories.
981
982The site libraries come second to support the usage of extensions
983across perl versions. Read the relevant section in F<INSTALL> for
984more information. If we ever make $sitearch version-specific, this
985topic could be revisited.
986
987=head2 Why isn't there a directory to override Perl's library?
988
989Mainly because no one's gotten around to making one. Note that
990"making one" involves changing perl.c, Configure, config_h.SH (and
991associated files, see above), and I<documenting> it all in the
992INSTALL file.
993
994Apparently, most folks who want to override one of the standard library
995files simply do it by overwriting the standard library files.
996
997=head2 APPLLIB
998
999In the perl.c sources, you'll find an undocumented APPLLIB_EXP
1000variable, sort of like PRIVLIB_EXP and ARCHLIB_EXP (which are
1001documented in config_h.SH). Here's what APPLLIB_EXP is for, from
1002a mail message from Larry:
1003
1004 The main intent of APPLLIB_EXP is for folks who want to send out a
1005 version of Perl embedded in their product. They would set the symbol
1006 to be the name of the library containing the files needed to run or to
1007 support their particular application. This works at the "override"
1008 level to make sure they get their own versions of any library code that
1009 they absolutely must have configuration control over.
1010
1011 As such, I don't see any conflict with a sysadmin using it for a
1012 override-ish sort of thing, when installing a generic Perl. It should
1013 probably have been named something to do with overriding though. Since
1014 it's undocumented we could still change it... :-)
1015
1016Given that it's already there, you can use it to override
1017distribution modules. If you do
1018
1019 sh Configure -Dccflags='-DAPPLLIB_EXP=/my/override'
1020
1021then perl.c will put /my/override ahead of ARCHLIB and PRIVLIB.
1022
1023=head1 Upload Your Work to CPAN
1024
1025You can upload your work to CPAN if you have a CPAN id. Check out
1026http://www.perl.com/CPAN/modules/04pause.html for information on
1027_PAUSE_, the Perl Author's Upload Server.
1028
1029I typically upload both the patch file, e.g. F<perl5.004_08.pat.gz>
1030and the full tar file, e.g. F<perl5.004_08.tar.gz>.
1031
1032If you want your patch to appear in the F<src/5.0/unsupported>
1033directory on CPAN, send e-mail to the CPAN master librarian. (Check
7b5757d1 1034out http://www.perl.com/CPAN/CPAN.html ).
aa689395 1035
1036=head1 Help Save the World
1037
1038You should definitely announce your patch on the perl5-porters list.
1039You should also consider announcing your patch on
1040comp.lang.perl.announce, though you should make it quite clear that a
1041subversion is not a production release, and be prepared to deal with
1042people who will not read your disclaimer.
1043
1044=head1 Todo
1045
1046Here, in no particular order, are some Configure and build-related
1047items that merit consideration. This list isn't exhaustive, it's just
1048what I came up with off the top of my head.
1049
1050=head2 Good ideas waiting for round tuits
1051
1052=over 4
1053
1054=item installprefix
1055
1056I think we ought to support
1057
1058 Configure -Dinstallprefix=/blah/blah
1059
1060Currently, we support B<-Dprefix=/blah/blah>, but the changing the install
1061location has to be handled by something like the F<config.over> trick
1062described in F<INSTALL>. AFS users also are treated specially.
1063We should probably duplicate the metaconfig prefix stuff for an
1064install prefix.
1065
1066=item Configure -Dsrcdir=/blah/blah
1067
1068We should be able to emulate B<configure --srcdir>. Tom Tromey
1069tromey@creche.cygnus.com has submitted some patches to
1070the dist-users mailing list along these lines. Eventually, they ought
1071to get folded back into the main distribution.
1072
1073=item Hint file fixes
1074
1075Various hint files work around Configure problems. We ought to fix
1076Configure so that most of them aren't needed.
1077
1078=item Hint file information
1079
1080Some of the hint file information (particularly dynamic loading stuff)
1081ought to be fed back into the main metaconfig distribution.
1082
1083=back
1084
1085=head2 Probably good ideas waiting for round tuits
1086
1087=over 4
1088
1089=item GNU configure --options
1090
1091I've received sensible suggestions for --exec_prefix and other
1092GNU configure --options. It's not always obvious exactly what is
1093intended, but this merits investigation.
1094
1095=item make clean
1096
1097Currently, B<make clean> isn't all that useful, though
1098B<make realclean> and B<make distclean> are. This needs a bit of
1099thought and documentation before it gets cleaned up.
1100
1101=item Try gcc if cc fails
1102
1103Currently, we just give up.
1104
1105=item bypassing safe*alloc wrappers
1106
1107On some systems, it may be safe to call the system malloc directly
1108without going through the util.c safe* layers. (Such systems would
1109accept free(0), for example.) This might be a time-saver for systems
1110that already have a good malloc. (Recent Linux libc's apparently have
1111a nice malloc that is well-tuned for the system.)
1112
1113=back
1114
1115=head2 Vague possibilities
1116
1117=over 4
1118
aa689395 1119=item MacPerl
1120
3e3baf6d 1121Get some of the Macintosh stuff folded back into the main distribution.
aa689395 1122
1123=item gconvert replacement
1124
1125Maybe include a replacement function that doesn't lose data in rare
1126cases of coercion between string and numerical values.
1127
1128=item long long
1129
1130Can we support C<long long> on systems where C<long long> is larger
1131than what we've been using for C<IV>? What if you can't C<sprintf>
1132a C<long long>?
1133
1134=item Improve makedepend
1135
1136The current makedepend process is clunky and annoyingly slow, but it
1137works for most folks. Alas, it assumes that there is a filename
1138$firstmakefile that the B<make> command will try to use before it uses
1139F<Makefile>. Such may not be the case for all B<make> commands,
1140particularly those on non-Unix systems.
1141
1142Probably some variant of the BSD F<.depend> file will be useful.
1143We ought to check how other packages do this, if they do it at all.
1144We could probably pre-generate the dependencies (with the exception of
1145malloc.o, which could probably be determined at F<Makefile.SH>
1146extraction time.
1147
1148=item GNU Makefile standard targets
1149
1150GNU software generally has standardized Makefile targets. Unless we
1151have good reason to do otherwise, I see no reason not to support them.
1152
1153=item File locking
1154
1155Somehow, straighten out, document, and implement lockf(), flock(),
1156and/or fcntl() file locking. It's a mess.
1157
1158=back
1159
1160=head1 AUTHOR
1161
1162Andy Dougherty <doughera@lafcol.lafayette.edu>.
1163
6877a1cf 1164Additions by Chip Salzenberg <chip@perl.com>.
aa689395 1165
1166All opinions expressed herein are those of the authorZ<>(s).
1167
1168=head1 LAST MODIFIED
1169
3e3baf6d 1170$Id: pumpkin.pod,v 1.10.1.1 1997/06/10 20:46:47 timbo Exp $