=head1 NAME

INSTALL.apaci - Installing mod_perl under Unix with the new hybrid build environment for Apache 1.3

=head1 SUMMARY

This document describes how to build and install mod_perl as clean as possible
with Apache 1.3 under Unix platforms by making use of both the Apache 1.3
ConfigStart/End facility and the new Autoconf-style Interface (APACI). In
addition the Dynamic Shared Object (DSO) mechanism can be used to build
mod_perl as an Apache module which can be loaded on-demand under run-time.

=head1 ATTENTION

I<This currently is a pure Unix-based solution because the complete Apache 1.3
source configuration mechanism currently is only workable under Unix. It
doesn't work under the Win32 platform, so mod_perl cannot use it, too. For
Win32 installation instructions please read the INSTALL.win32 document.>

=head1 BACKGROUND

The source configuration mechanism in Apache 1.3 provides four major
highlights mod_perl can benefit from:

=over 3

=item B<Per-module configuration scripts (ConfigStart/End)>

This is a mechanism modules can use to link theirself into the configuration
processing. It is useful for automatically adjusting configuration and build
parameters from the modules sources. It is triggered by
C<ConfigStart>/C<ConfigEnd> sections inside I<modulename>C<.module> files.

=item B<Apache Autoconf-style Interface (APACI)>

This is the new top-level C<configure> script from Apache 1.3 which provides a
GNU Autoconf-style interface. It is useful for configuring the source tree
without manually editing any C<src/Configuration> files. Any parametrization
can be done via command line options to the C<configure> script. Internally
this is just a nifty a wrapper to the old C<src/Configure> script.

=item B<Dynamic Shared Object (DSO) support>

This is beside Windows NT support one of most interesting features in Apache
1.3. Its a way to build Apache modules as so-called C<dynamic shared objects>
(usually named I<modulename>C<.so>) which can be loaded via the C<LoadModule>
directives from within Apache's C<httpd.conf> file. The benefit is that the
modules is part of the C<httpd> program only on-demand, i.e. only when the
user wants the module it is loaded into the address space of the C<httpd>
module. This is for instance interesting for memory consumption and easy
upgrade issues. The DSO mechanism is provided by Apache's C<mod_so.c> which
needs to be compiled into the C<httpd> program. This is automatically done
when DSO is enabled for module C<mod_xxx> via C<configure --enable-module=xxx>
or by explicitly adding C<mod_so> via C<configure --enable-module=so>.

=item B<APache eXtenSion (APXS) support tool>

This is a new support tool from Apache 1.3 which can be used to build an
Apache module as a DSO even B<outside> the Apache source-tree. One can say
APXS is what MakeMaker and XS is for Perl. It knows the platform dependent
build parameters for making DSO files and provides an easy way to run the
build commands with them.

=back

Taking these four features together provides a way to integrate mod_perl into
Apache in a very clean and smooth way. I<No patching of the Apache source tree
is needed in the standard situation and even not only the source tree itself
is needed in the APXS situation>.

=head1 DESCRIPTION

To benefit from the above described features a new hybrid build environment
was created for the Apache-side of mod_perl. The Apache-side consists of the C
source files of mod_perl which have to be compiled into the C<httpd> program.
They are usually copied to the subdirectory C<src/modules/perl/> in the Apache
source tree. To integrate this subtree into the Apache build process a lot of
adjustments were done by mod_perl's C<Makefile.PL> in the past. And
additionally the C<Makefile.PL> controlled the Apache build process. The
side-effect of this approach was that it is both an not very clean and
especially captive way. Because it assumed mod_perl is the only third-party
modules which has to be integrated into Apache. This is very problematic.

The new approach described below avoids these problems. It only prepares the
C<src/modules/perl/> subtree inside the Apache source tree I<without>
adjusting or editing anything else. This way no conflicts can occur. Instead
mod_perl is activated (and then configures itself) when the Apache source tree
is configured via standard APACI calls later.

=head1 THE GAME ITSELF

There are various ways available to build Apache with the new hybrid build
environment:

=head2 The all-in-one way

If your goal is just to build and install Apache 1.3 with mod_perl out of
their source trees and have no special interests in further adjusting or
enhancing Apache do the following:

 $ gunzip <apache_1.3.X.tar.gz | tar xvf -
 $ gunzip <mod_perl-1.X.tar.gz | tar xvf -
 $ cd mod_perl-1.X
 $ perl Makefile.PL \
     APACHE_PREFIX=/path/to/install/of/apache \
     APACHE_SRC=../apache-1.3.X/src \
     DO_HTTPD=1 \
     USE_APACI=1 \
     EVERYTHING=1 \
     APACI_ARGS='[...]' \
     [...]
 $ make
 $ make test
 $ make install

This builds Apache statically with mod_perl, installs Apache under
C</path/to/install/of/apache/> and mod_perl into the C<site_lib> hierarchy of
your existing Perl installation. All in one step.

=head2 The flexible way 

This is the standard situation when you want to be flexible while building:
Statically building mod_perl into the C<httpd> binary of Apache but via
different steps, so you have a chance for other third-party Apache modules,
etc.

=over 3

=item B<1. Prepare the Apache 1.3 source tree>

The first step is the extract the distributions:

 $ gunzip <apache_1.3.X.tar.gz | tar xvf -
 $ gunzip <mod_perl-1.X.tar.gz | tar xvf -

=item B<2. Install mod_perl's Perl-side and prepare the Apache-side>

The second step is to install the Perl-side of mod_perl into the Perl system
and prepare the C<src/modules/perl/> subdirectory inside the Apache source
tree:

 $ cd mod_perl-1.XX
 $ perl Makefile.PL \
     APACHE_SRC=../apache_1.3.X/src \
     DO_HTTPD=1 \
     USE_APACI=1 \
     PREP_HTTPD=1 \
     EVERYTHING=1 \
     [...]
 $ make
 $ make test
 $ make install
 $ cd ..

(The C<APACHE_SRC> set the path to your Apache source tree, the C<DO_HTTPD>
option forces this path and only this path to be used, the C<USE_APACI> option
triggers the new hybrid build environment and the C<PREP_HTTPD> forces only a
preparation of the C<APACHE_SRC/modules/perl/> tree but no automatic builds.)

This now prepares the Apache-side of mod_perl in the Apache source tree but
don't touches anything else inside it. It then just builds the Perl-side of
mod_perl and installs it into the Perl installation hierarchy.

Important: If you use C<PREP_HTTPD> as described above, to complete the
build you must go into an apache source directory and run C<make> and
C<make install>.

=item B<3. Additionally prepare other third-party modules>

Now you still have a chance to prepare more third-party modules.  For instance
the PHP3 language can be added similarly to the above mod_perl procedure.

=item B<4. Build the Apache package>

Finally its time to build the Apache package and thus also the
Apache-side of mod_perl and any other prepared third-party modules:

 $ cd apache_1.3.X
 $ ./configure \
     --prefix=/path/to/install/of/apache \
     --activate-module=src/modules/perl/libperl.a \
     [...]
 $ make
 $ make test
 $ make install

(The C<--prefix> option is usually always needed and the C<--activate-module>
option activates mod_perl for the configuration process and thus also for the
build process.)

=back

Now bask in the glow and be happy to received a mod_perl-aware Apache 1.3
system without having to mangle the Apache source tree for mod_perl plus the
freedom of being able to adding more third-party modules.

=head1 EXPERIMENTAL

With Apache 1.3 there is support for building modules as Dynamic Shared
Objects (DSO).  So there is support for DSO in mod_perl now, too.  I<BUT THIS
IS STILL EXPERIMENTAL, SO BE WARNED!>

=head2 When DSO can be used

If you want to build C<mod_perl> as DSO you must make sure that Perl
was built with system's native malloc(). If Perl was built with its
own malloc() and C<-Dbincompat5005>, it pollutes the main C<httpd>
program with I<free> and I<malloc> symbols.  When C<httpd> restarts
(happens at startup too), any references in the main program to
I<free> and I<malloc> become invalid, and this causes memory leaks and
segfaults.

Notice that mod_perl's build system warns about this problem.

With Perl 5.6.0+ this pollution can be prevented with
C<-Ubincompat5005>.  or C<-Uusemymalloc> for any version of Perl, but
there's a chance that might hurt performance depending on platform, so
C<-Ubincompat5005> is likely a better choice.

If you get the following reports with Perl version 5.6.0+:

  % perl -V:usemymalloc
  usemymalloc='y';
  % perl -V:bincompat5005
  bincompat5005='define';

rebuild Perl with C<-Ubincompat5005>.

For Perl versions pre-5.6.x, if you get:

  % perl -V:usemymalloc
  usemymalloc='y';

rebuild Perl with C<-Uusemymalloc>.

now rebuild mod_perl.


=head2 Build mod_perl as DSO inside Apache source tree via APACI

We already said that the new mod_perl build environment is a hybrid one. What
does it mean? It means for instance that the same C<src/modules/perl/> stuff
can be used to build mod_perl as a DSO, too. I<And again without having to
edit anything specially for this>. When you want to build C<libperl.so> (sorry
for the name, C<libmodperl.so> would be more correct, but because of historic
Apache issues the name has to be C<libperl.so>. Don't confuse this with
the real C<libperl.a> or even C<libperl.so> from the Perl installation)
all you have to do is to add one single option to the above steps.

You have two options here, dependend on which way you choose above: If you
choose the all-in-one way above then add 

  USE_DSO=1

to the mod_perl/Makefile.PL options. If you choose the flexible way then
add

  --enable-shared=perl

to the Apache/configure options.

As you can see only an additional C<USE_DSO=1> or C<--enable-shared=perl>
option is needed.  Anything else is done automatically: C<mod_so> is
automatically enabled, the Makefiles are adjusted automatically and even the
C<install> target from APACI now additionally installs the C<libperl.so> into
the Apache installation tree.  And even more: The C<LoadModule> and
C<AddModule> directives are automatically added to the C<httpd.conf> file. 

=head2 Build mod_perl as DSO outside Apache source tree via APXS

Above we've seen how to build mod_perl as DSO I<inside> the Apache source
tree. But there is a nifty alternative: Building mod_perl as DSO I<outside>
the Apache source tree via the new Apache 1.3 support tool C<apxs> (APache
eXtension). The advantage is obvious: You can extend an already installed
Apache with mod_perl even if you don't have the sources (for instance you
installed an Apache binary package from your vendor).

Here are the steps:

 $ gunzip <mod_perl-1.X.tar.gz | tar xvf -
 $ cd mod_perl-1.X
 $ perl Makefile.PL \
     USE_APXS=1 \
     WITH_APXS=/path/to/bin/apxs \
     EVERYTHING=1 \
     [...]
 $ make 
 $ make test
 $ make install

This will build the DSO C<libperl.so> B<outside> the Apache source tree with
the new Apache 1.3 support tool C<apxs> and installs it into the existing
Apache hierarchy.

=head1 AUTHOR

 Ralf S. Engelschall
 rse@engelschall.com
 rse@apache.org

