home *** CD-ROM | disk | FTP | other *** search
- package ExtUtils::MakeMaker::FAQ;
-
- (our $VERSION) = sprintf "%03d", q$Revision: 1.9 $ =~ /Revision:\s+(\S+)/;
-
- 1;
- __END__
-
- =head1 NAME
-
- ExtUtils::MakeMaker::FAQ - Frequently Asked Questions About MakeMaker
-
- =head1 DESCRIPTION
-
- FAQs, tricks and tips for C<ExtUtils::MakeMaker>.
-
- =head2 Philosophy and History
-
- =over 4
-
- =item Why not just use <insert other build config tool here>?
-
- Why did MakeMaker reinvent the build configuration wheel? Why not
- just use autoconf or automake or ppm or Ant or ...
-
- There are many reasons, but the major one is cross-platform
- compatibility.
-
- Perl is one of the most ported pieces of software ever. It works on
- operating systems I've never even heard of (see perlport for details).
- It needs a build tool that can work on all those platforms and with
- any wacky C compilers they might have.
-
- No such build tool existed at the time and I only know of one now
- (Module::Build).
-
-
- =item What's Module::Build and how does it relate to MakeMaker?
-
- Module::Build is a project by Ken Williams to supplant MakeMaker.
- Its primary advantages are:
-
- =over 8
-
- =item * pure perl. no make, no shell commands
-
- =item * easier to customize
-
- =item * cleaner internals
-
- =item * less cruft
-
- =back
-
- Module::Build is the official heir apparent to MakeMaker and we
- encourage people to work on M::B rather than spending time improving
- MakeMaker.
-
- =back
-
- =head2 Module Writing
-
- =over 4
-
- =item How do I keep my $VERSION up to date without resetting it manually?
-
- Often you want to manually set the $VERSION in the main module
- distribution because this is the version that everybody sees on CPAN
- and maybe you want to customize it a bit. But for all the other
- modules in your dist, $VERSION is really just bookkeeping and all that's
- important is it goes up every time the module is changed. Doing this
- by hand is a pain and you often forget.
-
- Simplest way to do it automatically is to use your version control
- system's revision number (you are using version control, right?).
-
- In CVS and RCS you use $Z<>Revision$ writing it like so:
-
- $VERSION = sprintf "%d.%03d", q$Revision: 1.9 $ =~ /(\d+)/g;
-
- Every time the file is checked in the $Z<>Revision$ will be updated,
- updating your $VERSION.
-
- In CVS version 1.9 is followed by 1.10. Since CPAN compares version
- numbers numerically we use a sprintf() to convert 1.9 to 1.009 and
- 1.10 to 1.010 which compare properly.
-
- If branches are involved (ie. $Z<>Revision: 1.5.3.4) its a little more
- complicated.
-
- # must be all on one line or MakeMaker will get confused.
- $VERSION = do { my @r = (q$Revision: 1.9 $ =~ /\d+/g); sprintf "%d."."%03d" x $#r, @r };
-
- =item What's this F<META.yml> thing and how did it get in my F<MANIFEST>?!
-
- F<META.yml> is a module meta-data file pioneered by Module::Build and
- automatically generated as part of the 'distdir' target (and thus
- 'dist'). See L<ExtUtils::MakeMaker/"Module Meta-Data">.
-
- To shut off its generation, pass the C<NO_META> flag to C<WriteMakefile()>.
-
- =back
-
- =head2 XS
-
- =over 4
-
- =item How to I prevent "object version X.XX does not match bootstrap parameter Y.YY" errors?
-
- XS code is very sensitive to the module version number and will
- complain if the version number in your Perl module doesn't match. If
- you change your module's version # without reruning Makefile.PL the old
- version number will remain in the Makefile causing the XS code to be built
- with the wrong number.
-
- To avoid this, you can force the Makefile to be rebuilt whenever you
- change the module containing the version number by adding this to your
- WriteMakefile() arguments.
-
- depend => { '$(FIRST_MAKEFILE)' => '$(VERSION_FROM)' }
-
-
- =item How do I make two or more XS files coexist in the same directory?
-
- Sometimes you need to have two and more XS files in the same package.
- One way to go is to put them into separate directories, but sometimes
- this is not the most suitable solution. The following technique allows
- you to put two (and more) XS files in the same directory.
-
- Let's assume that we have a package C<Cool::Foo>, which includes
- C<Cool::Foo> and C<Cool::Bar> modules each having a separate XS
- file. First we use the following I<Makefile.PL>:
-
- use ExtUtils::MakeMaker;
-
- WriteMakefile(
- NAME => 'Cool::Foo',
- VERSION_FROM => 'Foo.pm',
- OBJECT => q/$(O_FILES)/,
- # ... other attrs ...
- );
-
- Notice the C<OBJECT> attribute. MakeMaker generates the following
- variables in I<Makefile>:
-
- # Handy lists of source code files:
- XS_FILES= Bar.xs \
- Foo.xs
- C_FILES = Bar.c \
- Foo.c
- O_FILES = Bar.o \
- Foo.o
-
- Therefore we can use the C<O_FILES> variable to tell MakeMaker to use
- these objects into the shared library.
-
- That's pretty much it. Now write I<Foo.pm> and I<Foo.xs>, I<Bar.pm>
- and I<Bar.xs>, where I<Foo.pm> bootstraps the shared library and
- I<Bar.pm> simply loading I<Foo.pm>.
-
- The only issue left is to how to bootstrap I<Bar.xs>. This is done
- from I<Foo.xs>:
-
- MODULE = Cool::Foo PACKAGE = Cool::Foo
-
- BOOT:
- # boot the second XS file
- boot_Cool__Bar(aTHX_ cv);
-
- If you have more than two files, this is the place where you should
- boot extra XS files from.
-
- The following four files sum up all the details discussed so far.
-
- Foo.pm:
- -------
- package Cool::Foo;
-
- require DynaLoader;
-
- our @ISA = qw(DynaLoader);
- our $VERSION = '0.01';
- bootstrap Cool::Foo $VERSION;
-
- 1;
-
- Bar.pm:
- -------
- package Cool::Bar;
-
- use Cool::Foo; # bootstraps Bar.xs
-
- 1;
-
- Foo.xs:
- -------
- #include "EXTERN.h"
- #include "perl.h"
- #include "XSUB.h"
-
- MODULE = Cool::Foo PACKAGE = Cool::Foo
-
- BOOT:
- # boot the second XS file
- boot_Cool__Bar(aTHX_ cv);
-
- MODULE = Cool::Foo PACKAGE = Cool::Foo PREFIX = cool_foo_
-
- void
- cool_foo_perl_rules()
-
- CODE:
- fprintf(stderr, "Cool::Foo says: Perl Rules\n");
-
- Bar.xs:
- -------
- #include "EXTERN.h"
- #include "perl.h"
- #include "XSUB.h"
-
- MODULE = Cool::Bar PACKAGE = Cool::Bar PREFIX = cool_bar_
-
- void
- cool_bar_perl_rules()
-
- CODE:
- fprintf(stderr, "Cool::Bar says: Perl Rules\n");
-
- And of course a very basic test:
-
- test.pl:
- --------
- use Test;
- BEGIN { plan tests => 1 };
- use Cool::Foo;
- use Cool::Bar;
- Cool::Foo::perl_rules();
- Cool::Bar::perl_rules();
- ok 1;
-
- This tip has been brought to you by Nick Ing-Simmons and Stas Bekman.
-
- =back
-
- =head1 PATCHING
-
- If you have a question you'd like to see added to the FAQ (whether or
- not you have the answer) please send it to makemaker@perl.org.
-
- =head1 AUTHOR
-
- The denizens of makemaker@perl.org.
-
- =head1 SEE ALSO
-
- L<ExtUtils::MakeMaker>
-
- =cut
-