[Encode] UTF-7 Support
[p5sagit/p5-mst-13.2.git] / lib / ExtUtils / PATCHING
1 This is a short set of guidelines for those patching
2 ExtUtils::MakeMaker.  Its not an iron-clad set of rules, but just
3 things which make life easier when reading and integrating a patch.
4
5 Lots of information can be found in makemaker.org.
6
7 MakerMaker is being maintained until something else can replace it.
8 Bugs will be fixed and compatibility improved, but I would like to
9 avoid new features.  If you want to add something to MakeMaker,
10 consider instead working on Module::Build, MakeMaker's heir apparent.
11
12
13 Reporting bugs
14
15 - Often the only information we have for fixing a bug is contained in your
16   report.  So...
17
18 - Please report your bugs via http://rt.cpan.org or by mailing to
19   makemaker@perl.org.  RT is preferred.
20
21 - Please report your bug immediately upon encountering it.  Do not wait
22   until you have a patch to fix the bug.  Patches are good, but not at
23   the expense of timely bug reports.
24
25 - Please be as verbose as possible.  Include the complete output of
26   your 'make test' or even 'make test TEST_VERBOSE=1' and a copy of the 
27   generated Makefile.  Err on the side of verbosity.  The more data we
28   have to work with, the faster we can diagnose the problem.
29
30 - If you find an undocumented feature, or if a feature has changed/been
31   added which causes a problem, report it.  Do not assume it was done
32   deliberately.  Even if it was done deliberately, we still want to hear
33   if it caused problems.
34
35
36 Patching details
37
38 - Please use unified diffs.  (diff -u)
39
40 - Patches against the latest development snapshot from makemaker.org are 
41   preferred.  Patches against the latest CPAN version are ok, too.
42
43 - Post your patch to makemaker@perl.org.
44
45
46 Code formatting
47
48 - No literal tabs (except where necessary inside Makefile code, obviously).
49
50 - 4 character indentation.
51
52 - this_style is prefered instead of studlyCaps.
53
54 - Private subroutine names (ie. those used only in the same package
55   they're declared in) should start with an underscore (_sekret_method).
56
57 - Protected subroutines (ie. ones intended to be used by other modules in
58   ExtUtils::*) should be named normally (no leading underscore) but
59   documented as protected (see Documentation below).
60
61 - Do not use indirect object syntax (ie. new Foo::Bar (@args))
62
63 - make variables use dollar signs like Perl scalars.  This causes problems
64   when you have to mix them both in a string.  If you find yourself
65   backwacking lots of dollar signs because you have one interpolated
66   perl variable, like this:
67
68     return <<'EOT'
69
70 subdirs ::
71         \$(NOECHO)cd $subdir && \$(MAKE) -f \$(FIRST_MAKEFILE) all \$(PASTHRU)
72 EOT
73
74   or are switching quoting contexts:
75
76     return <<q{
77 subdirs ::
78         $(NOECHO)cd }.$subdir.q{ && $(MAKE) -f $(FIRST_MAKEFILE) all $(PASTHRU)
79 };
80
81   consider using sprintf instead.
82
83     return sprintf <<'EOT', $subdir;
84
85 subdirs ::
86         $(NOECHO)cd %s && $(MAKE) -f $(FIRST_MAKEFILE) all $(PASTHRU)
87 EOT
88
89
90 Refactoring and Cleanup
91
92 - MakeMaker is a mess.  We like patches which clean things up.
93
94
95 Backwards Compatibility
96
97 - MakeMaker must be backwards compatible to 5.5.3 (5.005_03).  Avoid any
98   obvious 5.6-isms (threads, warnings.pm, Unicode, our, v1.2.3, attributes
99   open my $fh, lvalue subroutines, any new core modules, etc...).
100
101 - MakeMaker should avoid having module dependencies.  Avoid using modules
102   which didn't come with 5.5.3 and avoid using features from newer 
103   versions.  Sometimes this is unavoidable.
104
105
106 Cross-Platform Compatibility
107
108 - MakeMaker must work on all architectures Perl works on (see perlport.pod)
109   and with many different versions of make.  This means all Unixen 
110   (including Cygwin and MacOS X), Windows (including DOS), MacOS Classic 
111   and VMS.  
112
113 - Often when you patch ExtUtils::MM_Unix, similar patches must be done
114   to the other MM_* modules.  If you can, please do this extra work
115   otherwise I have to.  If you can't, that's ok.  We can help.
116
117 - If possible, please test your patch on two Very Different architectures.
118   Unix, Windows, MacOS Classic and VMS being Very Different.  Note: Cygwin
119   and OS X are Unixen for our purposes.
120
121 - If nothing else, at least try it on two different Unixen or Windows
122   machines (ie. Linux and IRIX or WinNT and Win95).
123
124 - HP's TestDrive (www.testdrive.compaq.com) and SourceForge's
125   compile farm (www.sourceforge.net) are good sources of testing
126   machines of many different architectures and platforms.  Accounts are 
127   free.
128
129 - If you find yourself writing "do_this if $^O eq 'That'" (ie. checks on
130   the OS type) perhaps your code belongs in one of the non-Unix MM_*
131   modules (ie. MM_Win32, MM_VMS, etc...).  If one does not exist, consider
132   creating one.  Its ok to have an MM_* module with only one method.
133
134 - Some shells have very small buffers.  This means command lines must
135   be as small as possible.  If your command is just too long, consider
136   making it an ExtUtils::Command::MM function.  If your command might
137   receive many arguments (such as pod2man or pm_to_blib) consider
138   using split_command() to split it into several, shorter calls.
139
140 - Most shells quote differently.  If you need to put a perl one-liner
141   in the Makefile, please use oneliner() to generate it.
142
143
144 Tests
145
146 - Tests would be nice, but I'm not going to pretend testing MakeMaker
147   is easy.  If nothing else, let us know how you tested your patch by
148   hand.
149
150
151 Documentation
152
153 - Documentation would be nice.
154
155 - If the new feature/method is private, please document it with POD
156   wrapped in "=begin/end private" tags.  That way it will be documented,
157   but won't be displayed (future versions of perldoc may have options
158   to display).
159
160     =begin private
161
162     =item _foo_bar
163
164        $mm->_foo_bar
165
166     Blah blah blah
167
168     =end private
169
170     =cut
171
172     sub _foo_bar {
173        ...
174
175 - If you're overriding a method, document that its an override and
176   *why* its being overridden.  Don't repeat the original documentation.