| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" |
| "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
| |
| <html xmlns="http://www.w3.org/1999/xhtml"> |
| <head> |
| <meta name="generator" content="HTML Tidy, see www.w3.org" /> |
| |
| <title>Source Re-organisation</title> |
| </head> |
| <!-- Background white, links blue (unvisited), navy (visited), red (active) --> |
| |
| <body bgcolor="#FFFFFF" text="#000000" link="#0000FF" |
| vlink="#000080" alink="#FF0000"> |
| <!--#include virtual="header.html" --> |
| |
| <h1 align="CENTER">Source Re-organisation</h1> |
| As of 1.3, the Apache source directories have been |
| re-organised. This re-organisation is designed to simplify the |
| directory structure, make it easier to add additional modules, |
| and to give module authors a way of specifying compile time |
| options or distribute binary modules. |
| |
| <h2>Summary of Changes</h2> |
| The source changes are: |
| |
| <ul> |
| <li>The non-module source files have moved from |
| <code>src</code> into <code>src/main</code></li> |
| |
| <li>The module source files previously in <code>src</code> |
| have moved to <code>src/modules/standard</code></li> |
| |
| <li>The <code>support</code> directory is now in |
| <code>src/support</code></li> |
| |
| <li>The existing symbol names used for global Apache function |
| and variable identifiers have been renamed in the source. |
| This way namespace conflicts are avoided when linking Apache |
| with third-party libraries. See the file |
| <code>src/include/compat.h</code> both for the list of |
| renamed symbol names and for a way to get source backward |
| compatibility in existing third-party module sources.</li> |
| </ul> |
| In addition, the following enhancements have been made: |
| |
| <ul> |
| <li>OS abstractions can be added in the <code>src/os</code> |
| directory. Currently this contains information for unix, OS/2 |
| and Windows 32 platforms.</li> |
| |
| <li><code>Configuration</code> syntax has been simplified for |
| adding new modules. Users no longer need to enter the |
| module's structure name. In addition, new modules can be |
| located anywhere on the file system, or typically in new or |
| existing directories under <code>src/modules</code>.</li> |
| |
| <li>Module authors can give simpler instructions for adding |
| their modules to Apache compilation. They can also now |
| provide compile time information required by |
| <code>Configure</code>, such as additional libraries |
| required.</li> |
| |
| <li>Module authors can distribute pre-compiled (.a or .o) |
| versions of their modules if required, along with a "module |
| definition file" which contains the information required by |
| <code>Configure</code>.</li> |
| |
| <li>All the sub-directories (main, modules/* and os/*) are |
| built as libraries.</li> |
| |
| <li>The new Apache Autoconf-style Interface (APACI) script |
| named <code>configure</code> replaced the old top-level |
| <code>Makefile</code> and |
| <code>src/helpers/InstallApache</code> stuff.</li> |
| </ul> |
| |
| <h2>Adding Modules</h2> |
| Modules are added to Apache by adding a reference to them in |
| <code>src/Configuration</code> then running |
| <code>Configure</code> and <code>make</code>. In earlier |
| version of Apache before 1.3, the line added to Configuration |
| looked like this: |
| <pre> |
| Module status_module mod_status.o |
| </pre> |
| From 1.3 onwards, the <code>AddModule</code> line should be |
| used instead, and typically looks like this: |
| <pre> |
| AddModule modules/standard/mod_status.o |
| </pre> |
| The argument to AddModule is the path, relative to |
| <code>src</code>, to the module file's source or object file. |
| |
| <p>Normally when adding a module you should follow the |
| instructions of the module author. However if the module comes |
| as a single source file, say mod_foo.c, then the recommended |
| way to add the module to Apache is as follows:</p> |
| |
| <ul> |
| <li>Put <code>mod_foo.c</code> into the directory |
| <code>src/modules/extra</code></li> |
| |
| <li>Go to the <code>src</code> directory and add the |
| following line to <code>Configuration</code><br /> |
| <code>AddModule modules/extra/mod_foo.o</code></li> |
| |
| <li>Run <code>./Configure</code></li> |
| |
| <li>Run <code>make</code></li> |
| </ul> |
| |
| <h2>New Facilities for Module Authors</h2> |
| In previous releases of Apache, new modules were added to the |
| <code>src</code> directory, and if the module required any |
| additional compilation options (such as libraries) they would |
| have to be added to <code>Configuration</code>. Also the user |
| would have to be told the module's structure name to add on the |
| Module line of <code>Configuration</code>. |
| |
| <p>From Apache 1.3 onwards, module authors can make use of |
| these new features:</p> |
| |
| <ul> |
| <li>Simplified <code>Configuration</code> command AddModule |
| which only requires a path to the module source or object |
| file</li> |
| |
| <li>If the module requires compile time options (such as |
| extra libraries) these can be specified in the module file |
| source or an external "module definition file".</li> |
| |
| <li>If a module is distributed as binary (.o or .a) then an |
| external "module definition file" can also be distributed |
| which gives the information Configure needs to add the |
| module, such as extra libraries and the module's structure |
| name.</li> |
| |
| <li>Modules can be installed anywhere on the file system, |
| although a directory under <code>src/modules</code> is |
| recommended.</li> |
| |
| <li>If the module is in its own directory, Apache can |
| automatically create a Makefile to build the module given a |
| file containing the module's dependencies.</li> |
| |
| <li>For building a third-party module |
| <strong>outside</strong> the Apache source tree the new |
| <code>apxs</code> support tool can be used to compile the |
| module into a <a href="dso.html">dynamic shared object |
| (DSO)</a>, install it into the existing Apache installation |
| and optionally activating it in the Apache |
| <code>httpd.conf</code> file. The only requirement is that |
| Apache has DSO-support for the used platform and the module |
| <code><a href="mod/mod_so.html">mod_so</a></code> was built |
| into the server binary <code>httpd</code>.</li> |
| </ul> |
| The rest of this document shows how to package modules for |
| Apache 1.3 and later and what to tell end-users of the module. |
| |
| <h3>Building a simple source distribution</h3> |
| Consider a simple add-on module, distributed as a single file. |
| For example, say it is called mod_demo.c. The archive for this |
| module should consist of two files, in a suitable directory |
| name. For example: |
| |
| <ul> |
| <li>mod_demo/mod_demo.c</li> |
| |
| <li>mod_demo/Makefile.tmpl</li> |
| </ul> |
| (Of course end-user instructions, README's, etc can also be |
| supplied in the archive). The end user should be told to |
| extract this archive in the <code>src/modules</code> directory |
| of their Apache source tree. This will create a new directory |
| <code>src/modules/mod_demo</code>. Then they need to add the |
| following line to the <code>Configuration</code> file: |
| <pre> |
| AddModule modules/mod_demo/mod_demo.o |
| </pre> |
| then run <code>Configure</code> and <code>make</code> as |
| normal. |
| |
| <p>The <code>mod_demo/Makefile.tmpl</code> should contain the |
| dependencies of the module source. For example, a simple module |
| which just interfaces to some standard Apache module API |
| functions might look this this:</p> |
| <pre> |
| mod_demo.o: mod_demo.c $(INCDIR)/httpd.h $(INCDIR)/http_protocol.h |
| </pre> |
| When the user runs <code>Configure</code> Apache will create a |
| full makefile to build this module. If this module also |
| requires some additional built-time options to be given, such |
| as libraries, see the next section. |
| |
| <p>If the module also comes with header files, these can be |
| added to the archive. If the module consists of multiple source |
| files it can be built into a library file using a supplied |
| makefile. In this case, distribute the makefile as |
| <code>mod_demo/Makefile</code> and <strong>do not</strong> |
| include a <code>mod_demo/Makefile.tmpl</code>. If |
| <code>Configure</code> sees a <code>Makefile.tmpl</code> it |
| assumes it is safe to overwrite any existing |
| <code>Makefile</code>.</p> |
| |
| <p>See the Apache <code>src/modules/standard</code> for an |
| example of a module directory where the makefile is created |
| automatically from a Makefile.tmpl file (note that this |
| directory also shows how to distribute multiple modules in a |
| single directory). See <code>src/modules/proxy</code> and |
| <code>src/modules/example</code> for examples of modules built |
| using custom makefiles (to build a library and an object file, |
| respectively).</p> |
| |
| <h3>Adding Compile time Information</h3> |
| Apache source files (or module definition files, see below) can |
| contain information used by <code>Configure</code> to add |
| compile-time options such as additional libraries. For example, |
| if mod_demo in the example above also requires that Apache be |
| linked against a DBM library, then the following text could be |
| inserted into the mod_demo.c source: |
| <pre> |
| /* |
| * Module definition information - the part between the -START and -END |
| * lines below is used by Configure. This could be stored in a separate |
| * instead. |
| * |
| * MODULE-DEFINITION-START |
| * Name: demo_module |
| * ConfigStart |
| LIBS="$LIBS $DBM_LIB" |
| if [ "X$DBM_LIB" != "X" ]; then |
| echo " + using $DBM_LIB for mod_demo" |
| fi |
| * ConfigEnd |
| * MODULE-DEFINITION-END |
| */ |
| </pre> |
| Note that this is contained inside a C language comment to hide |
| it from the compiler. Anything between the lines which contains |
| <code>MODULE-DEFINITION-START</code> and |
| <code>MODULE-DEFINITION-END</code> is used by |
| <code>Configure</code>. The <code>Name:</code> line gives the |
| module's structure name. This is not really necessary in this |
| case since if not present <code>Configure</code> will guess at |
| a name based on the filename (<em>e.g.</em>, given "mod_demo" |
| it will remove the leading "mod_" and append "_module" to get a |
| structure name. This works with all modules distributed with |
| Apache). |
| |
| <p>The lines between <code>ConfigStart</code> and |
| <code>ConfigEnd</code> as executed by <code>Configure</code> |
| and can be used to add compile-time options and libraries. In |
| this case it adds the DBM library (from $DBM_LIB) to the |
| standard compilation libraries ($LIB) and displays a |
| message.</p> |
| |
| <p>See the default distribution's mod_auth_dbm.c for an example |
| of an embedded module definition.</p> |
| |
| <h3>Module Definition Information for Binary Distribitions</h3> |
| If the module is to be distributed as binary (object or |
| library) rather than source, it is not possible to add the |
| module definition information to the source file. In this case |
| it can be placed in a separate file which has the same base |
| name as the object or library file, but with a |
| <code>.module</code> extension. So, for example, if the |
| distributed module object file is mod_demo.o, the module |
| definition file should be called mod_demo.module. It contains |
| the same information as above, but does not need to be inside a |
| C comment or delimited with |
| <code>MODULE-DEFINITION-START</code> <em>etc.</em> For example: |
| |
| <pre> |
| Name: demo_module |
| ConfigStart |
| LIBS="$LIBS $DBM_LIB" |
| if [ "X$DBM_LIB" != "X" ]; then |
| echo " + using $DBM_LIB for mod_demo" |
| fi |
| ConfigEnd |
| </pre> |
| See the default distribution's mod_auth_db.module for an |
| example of a separate module definition file. |
| <!--#include virtual="footer.html" --> |
| </body> |
| </html> |
| |