Writing packages which compile on all platforms and can easily be
maintained is a complex task. The
Keep configure.ac and the Makefile.am as straightforward as possible.
Use a uniform organization for the directory structure.
More precisely, the directory structure of a new package foox should be as follows:
| | ac_prefix_config_h.m4
| | mmx_module.m4
| | dependency.m4
| | ...
| | Makefile.am
| | foox
| | | header_file1.hpp
| | | ...
| | src_file1.cpp
| | ...
| | glue_file1.cpp
| | ...
| | foox-config.in
| | ...
| | ...
| subdir ...
Of course, there may be multiple dependency: any external dependency of your package should come with a separate .m4 file. Similarly, you also have one subdir for each type of functionality of your package. A configuration file foox/include/foox-config.hpp should be created automatically using autoheader and AC_PREFIX_CONFIG_H. The file foox/Makefile.am is very short and mainly refers to the main makefile foox/build/Makefile.am.
The file configure.ac should be modeled on the corresponding file of basix. In particular, you have to start with something like
AC_INIT([foox], [0.2.2], [email@example.com])
AM_INIT_AUTOMAKE([nostdinc -Wall -Werror foreign])
and end with something like
],[chmod +x script/foox-config])
The file mmx_module.m4 defines a convenient macro AC_MMX_MODULE. When calling this macro inside your configure.ac, the following common options for
Enable debugging (disabled by default).
Enable optimization (enabled by default).
Support exceptions for high level routines (enabled by default).
Enable security checks for low level routines (disabled by default).
Build the glue libraries for use with the interpreter (enabled by default).
Build suite of test programs (disabled by default).
Build suite of benchmark programs (disabled by default).
Activate the building of the documentation (disabled by default).
Additional dependencies should all come with a corresponding m4 file. For instance, numerix tests for gmp in the following way:
The macro AC_WITH_GMP provides an option to specify
the install path for gmp. The macro AC_LIB_GMP
tests whether it is possible to execute some functionality of the
library. Notice that the m4 files of some of the
Each package should come with a global Makefile.am which should be kept as straightforward as possible and the build/Makefile.am, which control how to build the package. Let us describe its content.
First of all, all include files in foox/include/ should be put into the mathemagix subdirectory of includedir:
mmxincludedir = $(includedir)/mathemagix
mmxinclude_HEADERS = \
One next has to specify the
lib_LTLIBRARIES = libfoox.la
and the corresponding sources to be built:
libfoox_la_CPPFLAGS = \
libfoox_la_SOURCES = \
We also have to provide a configuration script foox/script/foox-config.in and distribute it with our package:
EXTRA_DIST = \
In order to produce a clean distribution of the package, you also have to add:
DISTCLEANFILES = ../include/foox-config.hpp
In addition to the above required sources and targets, additional libraries and binaries may have to be built as a function of the configuration options –enable-glue, –enable-test and –enable-bench. For instance, in order to build the library which has to be glued to the interpreter, one typically adds the following lines:
mmxinclude_HEADERS += \
lib_LTLIBRARIES += libmmxfoox.la
libmmxbasix_la_CPPFLAGS = \
libmmxfoox_la_SOURCES = \
For the other options, and as a more general rule, we recommend to mimick the code in the existing files */build/Makefile.am.
When your package is finished, according to the above guidelines, then
we can include it in the main