=head1 NAME Installing mod_perl 2.0 =head1 Description This chapter provides an in-depth mod_perl 2.0 installation coverage. =head1 Prerequisites Before building mod_perl 2.0 you need to have its prerequisites installed. If you don't have them, download and install them first, using the information in the following sections. Otherwise proceed directly to the mod_perl building instructions. The mod_perl 2.0 prerequisites are: =over =item * Apache Apache 2.0 is required. mod_perl 2.0 B work with Apache 1.3. L (DSO) mod_perl build requires Apache 2.0.47 or higher. L build requires Apache 2.0.51 or higher. =item * Perl =over =item Prefork MPM Requires at least Perl version 5.6.1. You don't need to have threads-support enabled in Perl. If you do have it, it B be I and not I<5005threads>! If you have: % perl5.8.0 -V:use5005threads use5005threads='define'; you must rebuild Perl without threads enabled or with C<-Dusethreads>. Remember that threads-support slows things down and on some platforms it's unstable (e.g., FreeBSD), so don't enable it unless you really need it. =item 64 bit Linux If while running C while building mod_perl 2 you get an error like this: /usr/bin/ld: /usr/local/lib/perl5/5.10.1/x86_64-linux/CORE/libperl.a(op.o): \ relocation R_X86_64_32S against `PL_sv_yes' can not be used when making a shared \ object; recompile with -fPIC /usr/local/lib/perl5/5.10.1/x86_64-linux/CORE/libperl.a: could not read symbols: Bad \ value You're likely on 64 bit Linux and will need to build Perl for that platform. You can do so by running Perl's C with the C<$CFLAGS> environment variable and the C<-A> and C options. So if you normally build Perl with: % ./Configure -des You would instead configure with: % CFLAGS='-m64 -mtune=nocona' ./Configure -des -A ccflags=-fPIC =item Threaded MPMs Require at least Perl version 5.8.0 with ithreads support built-in. That means that it should report: % perl5.8.0 -V:useithreads -V:usemultiplicity useithreads='define'; usemultiplicity='define'; If that's not what you see rebuild Perl with C<-Dusethreads>. =item Static prefork build Perl with ithreads support version 5.6.1 or higher Perl without ithreads support version 5.8.2 or higher =item Static non-prefork build Perl with ithreads support version 5.8.0 or higher =item threads.pm If you want to run applications that take benefit of Perl's I Perl version 5.8.1 or higher w/ithreads enabled is required. Perl 5.8.0's I doesn't work with mod_perl 2.0. =back =item * CPAN Perl Modules The mod_perl 2.0 test suite has several requirements on its own. If you don't satisfy them, the tests depending on these requirements will be skipped, which is OK, but you won't get to run these tests and potential problems, which may exhibit themselves in your own code, could be missed. We don't require them from C, which could have been automated the requirements installation, in order to have less dependencies to get mod_perl 2.0 installed. Also if your code uses any of these modules, chances are that you will need to use at least the version numbers listed here. =over =item CGI.pm 3.11 =item Compress::Zlib 1.09 =back Though the easiest way to satisfy all the dependencies is to install C available from CPAN. =back =head2 Downloading Stable Release Sources If you are going to install mod_perl on a production site, you want to use the officially released stable components. Since the latest stable versions change all the time you should check for the latest stable version at the listed below URLs: =over =item Perl Download from: I This direct link which symlinks to the latest release should work too: I. For the purpose of examples in this chapter we will use the package named I, where I should be replaced with the real version number. =item Apache Download from: I For the purpose of examples in this chapter we will use the package named I, where I should be replaced with the real version number. =back =head2 Getting Bleeding Edge Sources If you really know what you are doing you can use the cvs/svn versions of the components. Chances are that you don't want to them on a production site. You have been warned! =over =item Perl The cutting edge version of Perl (aka bleadperl or bleedperl) is only generally available through an rsync repository maintained by ActiveState: # (--delete to ensure a clean state) % rsync -acvz --delete --force \ rsync://public.activestate.com/perl-current/ perl-current If you are re-building Perl after rsync-ing, make sure to cleanup first: % make distclean before running C<./Configure>. You'll also want to install (at least) LWP if you want to fully test mod_perl. You can install LWP with C shell: % perl -MCPAN -e 'install("LWP")' For more details on bleadperl, see I. =item Apache See L. =back =head2 Configuring and Installing Prerequisites If you don't have the prerequisites installed yet, install them now. =head3 Perl % cd perl-5.8.x % ./Configure -des If you L, run: % ./Configure -des -Dusethreads Most likely you don't want perl-support for threads enabled, in which case pass: C<-Uusethreads> instead of C<-Dusethreads>. If you want to debug mod_perl segmentation faults, add the following I<./Configure> options: -Doptimize='-g' -Dusedevel Now build it: % make && make test && make install =head3 Apache You need to have Apache built and installed prior to building mod_perl, only if you intend build a DSO mod_perl. If you intend to build a statically linked Apache+mod_perl, you only need to have the Apache source available (mod_perl will build and install Apache for you), you should skip this step. % cd httpd-2.x.xx % ./configure --prefix=$HOME/httpd/prefork --with-mpm=prefork % make && make install Starting from 2.0.49, the Apache logging API escapes everything that goes to F, therefore if you're annoyed by this feature during the development phase (as your error messages will be all messed up) you can disable the escaping during the Apache build time: % CFLAGS="-DAP_UNSAFE_ERROR_LOG_UNESCAPED" ./configure ... Do B use that CFLAGS in production unless you know what you are doing. =head1 Installing mod_perl from Binary Packages As of this writing only the binaries for the Win32 platform are available, kindly prepared and maintained by Randy Kobes. See the documentation on L for details. Some RPM packages can be found using rpmfind services, e.g.: http://www.rpmfind.net/linux/rpm2html/search.php?query=mod_perl&submit=Search+... However if you have problems using them, you have to contact those who have created them. =head1 Installing mod_perl from Source Building from source is the best option, because it ensures a binary compatibility with Apache and Perl. However it's possible that your distribution provides a solid binary mod_perl 2.0 package. For Win32 specific details, see the documentation on L. =head2 Downloading the mod_perl Source First download the mod_perl source. =over =item Stable Release Download from I or your favorite CPAN mirror. This direct link which symlinks to the latest release should work too: I. For the purpose of examples in this chapter we will use the package named I, where I should be replaced with the real version number. Open the package with: % tar -xvzf mod_perl-2.x.x.tar.gz or an equivalent command. =item Development Version See L. =back =head2 Configuring mod_perl To build mod_perl, you B also use the same compiler that Perl was built with. You can find that out by running C and looking at the C section. Like any other Perl module, mod_perl is configured via the I file, but requires one or more configuration options: % cd modperl-2.x.x % perl Makefile.PL where I is an optional list of key/value pairs. These options can include all the usual options supported by C (e.g., C, C, etc.). The following sections give the details about all the available options, but let's mention first an important one. Configuration options are discussed in L. =head3 Dynamic mod_perl Before you proceed, make sure that Apache 2.0 has been built and installed. mod_perl B be built before that. It seems that most users use pre-packaged Apache installation, most of which tend to spread the Apache files across many directories (i.e. not using --enable-layout=Apache, which puts all the files under the same directory). If Apache 2.0 files are spread under different directories, you need to use at least the C> option, which should be set to a full path to the C executable. For example: % perl Makefile.PL MP_APXS=/path/to/apxs For example RedHat Linux system installs the C binary, the C and C scripts (the latter two are needed to build mod_perl) all in different locations, therefore they configure mod_perl 2.0 as: % perl Makefile.PL MP_APXS=/path/to/apxs \ MP_APR_CONFIG=/another/path/to/apr-config However a correctly built Apache shouldn't require the C> option, since C> should provide the location of this script. If however all Apache 2.0 files were installed under the same directory, mod_perl 2.0's build only needs to know the path to that directory, passed via the C> option: % perl Makefile.PL MP_AP_PREFIX=$HOME/httpd/prefork =head3 Static mod_perl Before you proceed make sure that Apache 2.0 has been downloaded and extracted. mod_perl B be built before that. If this is an svn checkout and not an official distribution tarball, you need to first run: % cd httpd-2.0 % ./buildconf To enable statically linking mod_perl into Apache, use the C> flag like this: % perl Makefile.PL MP_USE_STATIC=1 \ MP_AP_PREFIX=$HOME/src/httpd-2.x \ MP_AP_CONFIGURE="--with-mpm=prefork" C> B point to an extracted Apache 2.0 source tree. This will configure Apache by passing C> to Apache's F<./configure> script. Here is an example: % cd ~/src % tar -xvzf perl-5.8.x.tar.gz % cd perl-5.8.x % ./Configure -des % make install % cd .. % tar -xvzf httpd-2.0.xx.tar.gz % tar -xvzf mod_perl-2.x.x.tar.gz % perl5.8.x Makefile.PL \ MP_USE_STATIC=1 \ MP_AP_PREFIX="$HOME/src/httpd-2.0.xx" \ MP_AP_CONFIGURE="--with-mpm=prefork" % make % make test % make install % ./httpd -l | grep perl mod_perl.c =head2 mod_perl Build Options =head3 Boolean Build Options The following options are boolean and can be set with C or unset with C, where XXX is the name of the option. =head4 MP_PROMPT_DEFAULT Accept default values for all would-be prompts. =head4 MP_GENERATE_XS Generate XS code from parsed source headers in I. Default is 1, set to 0 to disable. =head4 MP_USE_DSO Build mod_perl as a DSO (I). This is the default. =head4 MP_USE_STATIC Build static mod_perl (I). =head4 MP_STATIC_EXTS Build C as static extensions. =head4 MP_USE_GTOP Link with I and enable I reporting. =head4 MP_COMPAT_1X C or a lack of it enables several mod_perl 1.0 back-compatibility features, which are deprecated in mod_perl 2.0. It's enabled by default, but can be disabled with C during the build process. When this option is disabled, the following things will happen: =over =item * Deprecated special variable, C<$Apache2::__T> won't be available. Use C<${^TAINT}> instead. =item * I<$ServerRoot> and I<$ServerRoot/lib/perl> won't be appended to C<@INC>. Instead use: PerlSwitches -I/path/to/server -I/path/to/server/lib/perl in I or: use Apache2::ServerUtil (); use File::Spec::Functions qw(catfile); push @INC, catfile Apache2::ServerUtil::server_root, ""; push @INC, catfile Apache2::ServerUtil::server_root, "lib/perl"; in I. =item * The following deprecated configuration directives won't be recognized by Apache: PerlSendHeader PerlSetupEnv PerlHandler PerlTaintCheck PerlWarn Use L instead. =back =head4 MP_DEBUG Turn on debugging (C<-g -lperld>) and tracing. =head4 MP_MAINTAINER Enable maintainer compile mode, which sets C and adds the following C flags: -DAP_DEBUG -Wall -Wmissing-prototypes -Wstrict-prototypes \ -Wmissing-declarations \ If gcc version 3.3.2+ is found, not compiling on OpenBSD, and C<-Wdeclaration-after-statement> is not already part of the C flags add it. To use this mode Apache must be build with C<--enable-maintainer-mode>. =head4 MP_TRACE Enable tracing =head3 Non-Boolean Build Options set the non-boolean options with MP_XXX=value. =head4 MP_APXS Path to C. For example if you've installed Apache 2.0 under I as DSO, the default location would be I. =head4 MP_AP_CONFIGURE The command-line arguments to pass to httpd's configure script. =head4 MP_AP_PREFIX Apache installation prefix, under which the I directory with Apache C header files can be found. For example if you've installed Apache 2.0 in directory I<\Apache2> on Win32, you should use: MP_AP_PREFIX=\Apache2 If Apache is not installed yet, you can point to the Apache 2.0 source directory, but only after you've built or configured Apache in it. For example: MP_AP_PREFIX=/home/stas/apache.org/httpd-2.0 Though in this case C won't automatically find C, therefore you should run C instead and pass the location of C or C, e.g.: % t/TEST -apxs /home/stas/httpd/prefork/bin/apxs or % t/TEST -httpd /home/stas/httpd/prefork/bin/httpd =head4 MP_AP_DESTDIR This option exists to make the lives of package maintainers easier. If you aren't a package manager you should not need to use this option. Apache installation destination directory. This path will be prefixed to the installation paths for all Apache-specific files during C. For instance, if Apache modules are normally installed into I and C is set to I, the I will be installed in: /tmp/foo/path/to/httpd-2.0/modules/mod_perl.so =head4 MP_APR_CONFIG If APR wasn't installed under the same file tree as httpd, you may need to tell the build process where it can find the executable C, which can then be used to figure out where the apr and aprutil I and I directories can be found. =head4 MP_CCOPTS Add to compiler flags, e.g.: MP_CCOPTS=-Werror (Notice that C<-Werror> will work only with the Perl version 5.7 and higher.) =head4 MP_OPTIONS_FILE Read build options from given file. e.g.: MP_OPTIONS_FILE=~/.my_mod_perl2_opts =head4 MP_APR_LIB On Win32, in order to build the APR and APR::* modules so as to be independent of mod_perl.so, a static library is first built containing the needed functions these modules link into. The option MP_APR_LIB=aprext specifies the name that this library has. The default used is C. This option has no effect on platforms other than Win32, as they use a different mechanism to accomplish the decoupling of APR and APR::* from mod_perl.so. =head3 mod_perl-specific Compiler Options =head4 -DMP_IOBUFSIZE Change the default mod_perl's 8K IO buffer size, e.g. to 16K: MP_CCOPTS=-DMP_IOBUFSIZE=16384 =head3 mod_perl Options File Options can also be specified in the file I or I<.makepl_args.mod_perl2>. The file can be placed under C<$ENV{HOME}>, the root of the source package or its parent directory. So if you unpack the mod_perl source into I and your home is I, the file will be searched in: /tmp/mod_perl-2.x/makepl_args.mod_perl2 /tmp/makepl_args.mod_perl2 /home/foo/makepl_args.mod_perl2 /tmp/mod_perl-2.x/.makepl_args.mod_perl2 /tmp/.makepl_args.mod_perl2 /home/foo/.makepl_args.mod_perl2 If the file specified in C is found the I will be ignored. Options specified on the command line override those from I and those from C. If your terminal supports colored text you may want to set the environment variable C to 1 to enable the colored tracing which makes it easier to tell the reported errors and warnings, from the rest of the notifications. =head2 Re-using Configure Options Since mod_perl remembers what build options were used to build it if first place, you can use this knowledge to rebuild itself using the same options. Simply C to the mod_perl source directory and run: % cd modperl-2.x. % perl -MApache2::Build -e rebuild =head2 Compiling mod_perl Next stage is to build mod_perl: % make =head2 Testing mod_perl When mod_perl has been built, it's very important to test that everything works on your machine: % make test If something goes wrong with the test phase and want to figure out how to run individual tests and pass various options to the test suite, see the corresponding sections of L or the L tutorial. =head2 Installing mod_perl Once the test suite has passed, it's a time to install mod_perl. % make install If you install mod_perl system wide, you probably need to become I prior to doing the installation: % su # make install =head1 If Something Goes Wrong If something goes wrong during the installation, try to repeat the installation process from scratch, while verifying all the steps with this document. If the problem persists L. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Stas Bekman [http://stason.org/] =back =head1 Authors =over =item * Stas Bekman [http://stason.org/] =item * Doug MacEachern Edougm (at) covalent.netE =back Only the major authors are listed above. For contributors see the Changes file. =cut