1package ExtUtils::MakeMaker::FAQ; 2 3(our $VERSION) = sprintf "%03d", q$Revision: 1.9 $ =~ /Revision:\s+(\S+)/; 4 51; 6__END__ 7 8=head1 NAME 9 10ExtUtils::MakeMaker::FAQ - Frequently Asked Questions About MakeMaker 11 12=head1 DESCRIPTION 13 14FAQs, tricks and tips for C<ExtUtils::MakeMaker>. 15 16=head2 Philosophy and History 17 18=over 4 19 20=item Why not just use <insert other build config tool here>? 21 22Why did MakeMaker reinvent the build configuration wheel? Why not 23just use autoconf or automake or ppm or Ant or ... 24 25There are many reasons, but the major one is cross-platform 26compatibility. 27 28Perl is one of the most ported pieces of software ever. It works on 29operating systems I've never even heard of (see perlport for details). 30It needs a build tool that can work on all those platforms and with 31any wacky C compilers they might have. 32 33No such build tool existed at the time and I only know of one now 34(Module::Build). 35 36 37=item What's Module::Build and how does it relate to MakeMaker? 38 39Module::Build is a project by Ken Williams to supplant MakeMaker. 40Its primary advantages are: 41 42=over 8 43 44=item * pure perl. no make, no shell commands 45 46=item * easier to customize 47 48=item * cleaner internals 49 50=item * less cruft 51 52=back 53 54Module::Build is the official heir apparent to MakeMaker and we 55encourage people to work on M::B rather than spending time improving 56MakeMaker. 57 58=back 59 60=head2 Module Writing 61 62=over 4 63 64=item How do I keep my $VERSION up to date without resetting it manually? 65 66Often you want to manually set the $VERSION in the main module 67distribution because this is the version that everybody sees on CPAN 68and maybe you want to customize it a bit. But for all the other 69modules in your dist, $VERSION is really just bookkeeping and all that's 70important is it goes up every time the module is changed. Doing this 71by hand is a pain and you often forget. 72 73Simplest way to do it automatically is to use your version control 74system's revision number (you are using version control, right?). 75 76In CVS and RCS you use $Z<>Revision$ writing it like so: 77 78 $VERSION = sprintf "%d.%03d", q$Revision: 1.9 $ =~ /(\d+)/g; 79 80Every time the file is checked in the $Z<>Revision$ will be updated, 81updating your $VERSION. 82 83In CVS version 1.9 is followed by 1.10. Since CPAN compares version 84numbers numerically we use a sprintf() to convert 1.9 to 1.009 and 851.10 to 1.010 which compare properly. 86 87If branches are involved (ie. $Z<>Revision: 1.5.3.4) its a little more 88complicated. 89 90 # must be all on one line or MakeMaker will get confused. 91 $VERSION = do { my @r = (q$Revision: 1.9 $ =~ /\d+/g); sprintf "%d."."%03d" x $#r, @r }; 92 93=item What's this F<META.yml> thing and how did it get in my F<MANIFEST>?! 94 95F<META.yml> is a module meta-data file pioneered by Module::Build and 96automatically generated as part of the 'distdir' target (and thus 97'dist'). See L<ExtUtils::MakeMaker/"Module Meta-Data">. 98 99To shut off its generation, pass the C<NO_META> flag to C<WriteMakefile()>. 100 101=back 102 103=head2 XS 104 105=over 4 106 107=item How to I prevent "object version X.XX does not match bootstrap parameter Y.YY" errors? 108 109XS code is very sensitive to the module version number and will 110complain if the version number in your Perl module doesn't match. If 111you change your module's version # without reruning Makefile.PL the old 112version number will remain in the Makefile causing the XS code to be built 113with the wrong number. 114 115To avoid this, you can force the Makefile to be rebuilt whenever you 116change the module containing the version number by adding this to your 117WriteMakefile() arguments. 118 119 depend => { '$(FIRST_MAKEFILE)' => '$(VERSION_FROM)' } 120 121 122=item How do I make two or more XS files coexist in the same directory? 123 124Sometimes you need to have two and more XS files in the same package. 125One way to go is to put them into separate directories, but sometimes 126this is not the most suitable solution. The following technique allows 127you to put two (and more) XS files in the same directory. 128 129Let's assume that we have a package C<Cool::Foo>, which includes 130C<Cool::Foo> and C<Cool::Bar> modules each having a separate XS 131file. First we use the following I<Makefile.PL>: 132 133 use ExtUtils::MakeMaker; 134 135 WriteMakefile( 136 NAME => 'Cool::Foo', 137 VERSION_FROM => 'Foo.pm', 138 OBJECT => q/$(O_FILES)/, 139 # ... other attrs ... 140 ); 141 142Notice the C<OBJECT> attribute. MakeMaker generates the following 143variables in I<Makefile>: 144 145 # Handy lists of source code files: 146 XS_FILES= Bar.xs \ 147 Foo.xs 148 C_FILES = Bar.c \ 149 Foo.c 150 O_FILES = Bar.o \ 151 Foo.o 152 153Therefore we can use the C<O_FILES> variable to tell MakeMaker to use 154these objects into the shared library. 155 156That's pretty much it. Now write I<Foo.pm> and I<Foo.xs>, I<Bar.pm> 157and I<Bar.xs>, where I<Foo.pm> bootstraps the shared library and 158I<Bar.pm> simply loading I<Foo.pm>. 159 160The only issue left is to how to bootstrap I<Bar.xs>. This is done 161from I<Foo.xs>: 162 163 MODULE = Cool::Foo PACKAGE = Cool::Foo 164 165 BOOT: 166 # boot the second XS file 167 boot_Cool__Bar(aTHX_ cv); 168 169If you have more than two files, this is the place where you should 170boot extra XS files from. 171 172The following four files sum up all the details discussed so far. 173 174 Foo.pm: 175 ------- 176 package Cool::Foo; 177 178 require DynaLoader; 179 180 our @ISA = qw(DynaLoader); 181 our $VERSION = '0.01'; 182 bootstrap Cool::Foo $VERSION; 183 184 1; 185 186 Bar.pm: 187 ------- 188 package Cool::Bar; 189 190 use Cool::Foo; # bootstraps Bar.xs 191 192 1; 193 194 Foo.xs: 195 ------- 196 #include "EXTERN.h" 197 #include "perl.h" 198 #include "XSUB.h" 199 200 MODULE = Cool::Foo PACKAGE = Cool::Foo 201 202 BOOT: 203 # boot the second XS file 204 boot_Cool__Bar(aTHX_ cv); 205 206 MODULE = Cool::Foo PACKAGE = Cool::Foo PREFIX = cool_foo_ 207 208 void 209 cool_foo_perl_rules() 210 211 CODE: 212 fprintf(stderr, "Cool::Foo says: Perl Rules\n"); 213 214 Bar.xs: 215 ------- 216 #include "EXTERN.h" 217 #include "perl.h" 218 #include "XSUB.h" 219 220 MODULE = Cool::Bar PACKAGE = Cool::Bar PREFIX = cool_bar_ 221 222 void 223 cool_bar_perl_rules() 224 225 CODE: 226 fprintf(stderr, "Cool::Bar says: Perl Rules\n"); 227 228And of course a very basic test: 229 230 test.pl: 231 -------- 232 use Test; 233 BEGIN { plan tests => 1 }; 234 use Cool::Foo; 235 use Cool::Bar; 236 Cool::Foo::perl_rules(); 237 Cool::Bar::perl_rules(); 238 ok 1; 239 240This tip has been brought to you by Nick Ing-Simmons and Stas Bekman. 241 242=back 243 244=head1 PATCHING 245 246If you have a question you'd like to see added to the FAQ (whether or 247not you have the answer) please send it to makemaker@perl.org. 248 249=head1 AUTHOR 250 251The denizens of makemaker@perl.org. 252 253=head1 SEE ALSO 254 255L<ExtUtils::MakeMaker> 256 257=cut 258