This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Comply with the 0x80th commandment
[perl5.git] / lib / ExtUtils / PATCHING
index 2170be2..e4b9cb2 100644 (file)
@@ -1,3 +1,8 @@
+"The easy way is always mined.
+ The important things are always simple.
+ The simple things are always hard."
+        -- Some of Murphy's Laws of Combat
+
 This is a short set of guidelines for those patching
 ExtUtils::MakeMaker.  Its not an iron-clad set of rules, but just
 things which make life easier when reading and integrating a patch.
@@ -10,6 +15,33 @@ avoid new features.  If you want to add something to MakeMaker,
 consider instead working on Module::Build, MakeMaker's heir apparent.
 
 
+Reporting bugs
+
+- Often the only information we have for fixing a bug is contained in your
+  report.  So...
+
+- Please report your bugs via http://rt.cpan.org or by mailing to
+  makemaker@perl.org.  RT is preferred.
+
+- Please report your bug immediately upon encountering it.  Do not wait
+  until you have a patch to fix the bug.  Patches are good, but not at
+  the expense of timely bug reports.
+
+- Please be as verbose as possible.  Include the complete output of
+  your 'make test' or even 'make test TEST_VERBOSE=1' and a copy of the 
+  generated Makefile.  Err on the side of verbosity.  The more data we
+  have to work with, the faster we can diagnose the problem.
+
+- If you find an undocumented feature, or if a feature has changed/been
+  added which causes a problem, report it.  Do not assume it was done
+  deliberately.  Even if it was done deliberately, we still want to hear
+  if it caused problems.
+
+- If you're testing MakeMaker against a development version of Perl,
+  please also check it against the latest stable version.  This makes it
+  easier to figure out if its MakeMaker or Perl at fault.
+
+
 Patching details
 
 - Please use unified diffs.  (diff -u)
@@ -42,25 +74,26 @@ Code formatting
   backwacking lots of dollar signs because you have one interpolated
   perl variable, like this:
 
-    return <<'EOT'
-
+    return <<EOT;
 subdirs ::
        \$(NOECHO)cd $subdir && \$(MAKE) -f \$(FIRST_MAKEFILE) all \$(PASTHRU)
+
 EOT
 
   or are switching quoting contexts:
 
-    return <<q{
+    return q{
 subdirs ::
        $(NOECHO)cd }.$subdir.q{ && $(MAKE) -f $(FIRST_MAKEFILE) all $(PASTHRU)
+
 };
 
   consider using sprintf instead.
 
     return sprintf <<'EOT', $subdir;
-
 subdirs ::
        $(NOECHO)cd %s && $(MAKE) -f $(FIRST_MAKEFILE) all $(PASTHRU)
+
 EOT
 
 
@@ -71,29 +104,55 @@ Refactoring and Cleanup
 
 Backwards Compatibility
 
-- MakeMaker must be backwards compatible to 5.5.3 (5.005_03).  Avoid any
+- MakeMaker must be backwards compatible to 5.5.4 (5.005_04).  Avoid any
   obvious 5.6-isms (threads, warnings.pm, Unicode, our, v1.2.3, attributes
   open my $fh, lvalue subroutines, any new core modules, etc...).
 
 - MakeMaker should avoid having module dependencies.  Avoid using modules
-  which didn't come with 5.5.3 and avoid using features from newer 
+  which didn't come with 5.5.4 and avoid using features from newer 
   versions.  Sometimes this is unavoidable.
 
 
 Cross-Platform Compatibility
 
-- MakeMaker must work on all architectures Perl works on (see perlport.pod)
-  and with many different versions of make.  This means all Unixen 
-  (including Cygwin and MacOS X), Windows (including DOS), MacOS Classic 
-  and VMS.  
+- With the exception of MacOS Classic, MakeMaker must work on all 
+  architectures Perl works on (see perlport.pod).  This means all Unixen 
+  (including Cygwin and MacOS X), Windows (including Win9x and DOS), and VMS.
+
+- Use the available macros rather than shell commands $(MV), $(CP),
+  $(TOUCH), etc...
+
+- MakeMaker must work on many makes.  GNU, BSD, Solaris, nmake, dmake, MMS
+  and MMK to name the most common.  Keep your make code as simple as 
+  possible.  
+
+- Avoid special variables (even $@).  
+
+- Format targets as "target : dependency", the spacing is important.  
+
+- Use $(NOECHO) instead of @.
+
+- Use - to tell make to ignore the exit code of a command.  (Unfortunately,
+  some make variants don't honor an $(IGNORE) macro).
+
+- Always put a space between $(NOECHO) and the command.
+
+- Always put a space between - (ignore) and the command.
+
+- Always put $(NOECHO) and - together, no space between them.
+
+        # Right
+        -$(NOECHO) command
+        $(NOECHO) command
+        - command
 
 - Often when you patch ExtUtils::MM_Unix, similar patches must be done
   to the other MM_* modules.  If you can, please do this extra work
   otherwise I have to.  If you can't, that's ok.  We can help.
 
 - If possible, please test your patch on two Very Different architectures.
-  Unix, Windows, MacOS Classic and VMS being Very Different.  Note: Cygwin
-  and OS X are Unixen for our purposes.
+  Unix, Windows and VMS being Very Different.  Note: Cygwin and OS X are 
+  Unixen for our purposes.
 
 - If nothing else, at least try it on two different Unixen or Windows
   machines (ie. Linux and IRIX or WinNT and Win95).
@@ -109,12 +168,10 @@ Cross-Platform Compatibility
   creating one.  Its ok to have an MM_* module with only one method.
 
 - Some shells have very small buffers.  This means command lines must
-  be as small as possible.  20K is the upper limit for Unixen, and 256
-  for VMS.  Not sure what Windows and DOS are limited to, probably 1K.
-  This limit *includes* any files passed into it.  Some modules (such as
-  bioperl) generate enourmous commands because of their large number of
-  files.  If your command is just too long, consider making it an
-  ExtUtils::Command::MM function.
+  be as small as possible.  If your command is just too long, consider
+  making it an ExtUtils::Command::MM function.  If your command might
+  receive many arguments (such as pod2man or pm_to_blib) consider
+  using split_command() to split it into several, shorter calls.
 
 - Most shells quote differently.  If you need to put a perl one-liner
   in the Makefile, please use oneliner() to generate it.
@@ -138,7 +195,7 @@ Documentation
 
     =begin private
 
-    =item _foo_bar
+    =head3 _foo_bar
 
        $mm->_foo_bar