There are a lot of reasons to use autotools over custom buildsystems, most of them relate to the fact that autotools contain reusable generic code that allows to provide users with common ways of doing the same thing among different projects. Almost all of these features are available in a form or another on the majority of buildsystems, but sometimes they get either suboptimally documented, if at all, and they are different project from project which makes it very difficult to deal with them in a common abstract way.
One of these feature is options to enable and disable features and optional dependencies, to avoid automagic dependencies which are a problem for advanced users and from-source distributors like us. While BSD makefiles have their knobs, and most software provides access through make variables or preprocessor macros to enable or disable features and other things, the configure
script generated by autoconf provides both a common interface to those options, and a documentation for them.
There are, though, a few interesting notes about this very useful common interface because a lot of projects either misuse it, or don’t know how deep the autoconf boilerplate is, and reinvent parts of it with no good reason. Let me try to show some of the interesting bits about it.
The first thing to know about the two AC_ARG_ENABLE
and AC_ARG_WITH
macros is that their arguments are: name, description, if present, if not present. The common mistake here is to consider the last two arguments as if enabled and if disabled; I’ve written about that mistake already a few years ago . This is not the case, and thus checking whether the option is enabled or disabled will have to be done outside of the option declaration for completeness.
Another interesting note is that the third parameter, if omitted, will by default generate a $enable_name
or $with_name
variable with the content of the specified option at configure (defaulting to yes and no for the positive and negative options when an explicit parameter is not passed through). It is thus possible to get a default-enabled feature variable using code like this:
AC_ARG_ENABLE([feature], [...], , [enable_feature=yes])
AS_IF([test "$enable_feature" = "yes"], [...])
Which is very handy since it avoids having to create custom variables and checking for them repeatedly (again, this is already written in my automagic guide ).
In the example above I explicitly skipped writing the documentation of the option itself, since that is another point where a lot of projects have confusion. If you look at the output of ./configure --help
, the default options are all well aligned and make use of as much space as it ś available on the terminal window you’re running it into. On the other hand, some projects’ custom options are instead badly aligned, tightened down on a side of the screen, splitted among multiple lines, or going over the horizontal boundary of the terminal. This is because the upstream developers tried to fake the same alignment of autoconf, without knowing that what it does is usually adapting to the actual output of the system.
So for instance you got stuff like this, coming from the gnumeric configure script:
--enable-compile-warnings=[no/minimum/yes/maximum/error]
Turn on compiler warnings
--enable-iso-c Try to warn if code is not ISO C
--disable-ssconvert Do not build ssconvert (command line spreadsheet conversion tool)
--disable-ssindex Do not build ssindex (spreadsheet indexer for beagle)
--disable-ssgrep Do not build ssgrep (search for supplied strings in spreadsheet)
--disable-solver Don't compile the solver
--enable-plugins="text html" Compile only the listed plugins
--enable-pdfdocs Generate documentation in Portable Document Format
As you can see there are multiple lines that are aligned totally to the right, and that go long to the right, while some others try to align themselves, and keep some space to their left too. The reason can be found in the configure.in
file:
AC_ARG_ENABLE(ssconvert,
[--disable-ssconvert Do not build ssconvert (command line spreadsheet conversion tool)],
[], [enable_ssconvert=yes])
AM_CONDITIONAL(ENABLE_SSCONVERT, test x"$enable_ssconvert" = xyes)
While this time the third and fourth arguments are correct, there is something up with the second, that is the description of the option. It’s totally expanded in the configure file, spaces included. But since it would be silly to waste space and readability that way, autoconf already provides an easy way to deal with the problem, which is to use the AS_HELP_STRING
macro (formerly AC_HELP_STRING
):
AC_ARG_ENABLE(ssconvert,
AS_HELP_STRING([--disable-ssconvert], [Do not build ssconvert (command line spreadsheet conversion tool)]),
[], [enable_ssconvert=yes])
AM_CONDITIONAL(ENABLE_SSCONVERT, test x"$enable_ssconvert" = xyes)
which then produces:
--enable-compile-warnings=[no/minimum/yes/maximum/error]
Turn on compiler warnings
--enable-iso-c Try to warn if code is not ISO C
--disable-ssconvert Do not build ssconvert (command line spreadsheet
conversion tool)
--disable-ssindex Do not build ssindex (spreadsheet indexer for
beagle)
--disable-ssgrep Do not build ssgrep (search for supplied strings in
spreadsheet)
--disable-solver Don't compile the solver
--enable-plugins="text html"
Compile only the listed plugins
--enable-pdfdocs Generate documentation in Portable Document Format
It looks nicer, doesn’t it?
Hopefully, reminding people about this will allow projects to clean up their configure.ac
(or configure.in
for those still using the old naming convention), or for their users to submit patches, so that the output is decently formatted and usable, even by automatic systems like zsh’s tab completion of ./configure
options.
P.S.: since I’ve changed gnumeric configure.in
script, I’m going to submit it upstream now, so no need to get to fix that.
“If you look at the output of
./configure --help
, the default options are all well aligned and make use of as much space as it ś available on the terminal window you’re running it into.”This sounds very nice indeed. But can not get it to work. I tried to fix gdb-6.8 with the following patch:Then I executed
autoconf configure.ac > configure
and./configure --help
. But it shows:Note that
enable use of Boehm's garbage collector with the GNU
is on one line andObjective-C runtime
is on the next line, even though there is plenty of space left on the first line for the rest of the message. The only little improvement is that the wordGNU
moved up to the first line. This is with autoconf 2.63.By the way, do you have a script that searches for packages with this bug yet? (A script that finds thing like “[ --enable-something Helptext]
“.) I am sure that such a script would give you a reason to open a gazillion bug reports.