MakeQuick
MakeQuick
is a make-inspired build system that compiles to GNU Autotools.
Introduction
MakeQuick
compiles a purely declarative build definition to POSIX-compliant and
thus fairly portable
automake input. It
solves a few problems with automake, such as the fact that libraries must appear
in topological order with respect to internal dependencies. This is still a
problem with automake. It basically means that the following automake code fails
during installation:
lib_LTLIBRARIES = liba.la libb.la liba_la_LIBADD = libb.la
lib_LTLIBRARIES
must list the libraries in topological order, so that a
definition as
libb.la liba.la
would work.
MakeQuick
solves this problem by
topologically sorting the libraries and emitting a properly sorted
lib_LTLIBRARIES
.
Another issue with automake is poor extensibility. Inference rules can be used
to extend automake with new source formats. By adding the new source extensions
to
SUFFIXES
, automake knows about them and generates the proper
.c
to
.o
rules. However, if you have a program, which is used to build other
sources, you will want to add this to the dependency list for the resulting
sources. With inference rules, this is not possible, so you need to write one
rule per source file. With many source files, this is a very tedious task and
there are two solutions: use GNU Make with pattern rules or generate the rules
with a script. Pattern rules can get very complex if you want to support
target-specific flags for your tool. Generating rules is always ad-hoc and each
type of rules needs its own script.
Yet another issue is the lack of wildcards. While wildcards have several
disadvantages, they also have many advantages and it is the author's opinion
that a good programmer should not suffer, because bad programmers might abuse a
feature. The same holds for build systems. Advanced features should not be
withheld from advanced users.
MakeQuick
supports but discourages the use of
wildcards.
Autotools integration
MakeQuick
input is translated to one or more
Makefile.am
s and a single
configure.ac
. The unification of automake and autoconf was done, because a
lot of knowledge from automake input has to be duplicated in the autoconf input.
Things such as which libraries to check for at configure time so that they may
be linked against in the Makefile or submodule dependencies are present in both
formats.
MakeQuick
attempts to unify these formats in a new format based on QML and
GNU Make.
Flexibility
MakeQuick
is, by design, much less flexible than automake and autoconf. It is also
much stricter. It gives the user some additional tools the author has been
missing in the GNU build system.
Source files are looked for in the entire source tree. Files are not explicitly
included by other files. Autoconf scripts may be included in the
project
block. Additional automake rules may be included in rule files. This gives you
all the flexibility back at the expense of the included files being essentially
a black box to
MakeQuick
, thus defeating its static analysis features.
MakeQuick
guarantees that pure projects, i.e. without external Autotools input, do not
cause errors at a lower level. This can no longer be guaranteed in the presence
of such black boxes.
Unsupported features
MakeQuick
does not plan on supporting percentages, because the author does not
believe in those.
cmake
is a build system that supports such comfort.
Documentation
The documentation is too large, so that it had to be distributed over multiple pages.