| The structure of a package |
Writing packages which compile on all platforms and can easily be
maintained is a complex task. The
More precisely, the directory structure of a new package foox should be as follows:
foox
| configure.ac
| Makefile.am
| macros
| | ac_prefix_config_h.m4
| | mmx_module.m4
| | dependency.m4
| build
| | Makefile.am
| include
| | foox
| | | header_file1.hpp
| | | ...
| src
| | src_file1.cpp
| | ...
| glue
| | glue_file1.cpp
| | ...
| script
| | foox-config.in
| bin
| | ...
| test
| | ...
| 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], [bugs@mathemagix.org])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_CONFIG_HEADER(foox/include/config.hpp)
AC_PROG_CC
AC_PROG_CXX
AC_LANG_CPLUSPLUS
AC_PROG_INSTALL
AC_PROG_LIBTOOL
AC_PROG_RANLIB
and end with something like
AC_OUTPUT([
Makefile
build/Makefile
script/foox-config
],[chmod +x script/foox-config])
AC_PREFIX_CONFIG_H(FOOX,
[include/foox/config.hpp],
[include/foox-config.hpp])
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
Additional dependencies should all come with a corresponding m4 file. For instance, numerix tests for gmp in the following way:
AC_WITH_GMP
AC_LIB_GMP
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 = \
../include/foox/file1.hpp \
../include/foox/file2.hpp \
../include/foox/file3.hpp \
...
One next has to specify the
lib_LTLIBRARIES = libfoox.la
and the corresponding sources to be built:
libfoox_la_CPPFLAGS = \
-I../include \
... \
@CPPFLAGS@
libfoox_la_SOURCES = \
../src/foo1.cpp \
../src/foo2.cpp \
...
We also have to provide a configuration script foox/script/foox-config.in and distribute it with our package:
EXTRA_DIST = \
../macros/ac_prefix_config_h.m4 \
../macros/mmx_module.m4 \
... \
../specif/foox.amx
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:
if GLUE_OPT
mmxinclude_HEADERS += \
../include/foox/file1.hpp \
../include/foox/file2.hpp \
...
lib_LTLIBRARIES += libmmxfoox.la
libmmxbasix_la_CPPFLAGS = \
-I../glue \
... \
$(libfoox_la_CPPFLAGS)
libmmxfoox_la_SOURCES = \
../glue/glue1.cpp \
../glue/glue2.cpp \
...
endif
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