MakeQuick

MakeQuick is a make-inspired build system that compiles to GNU Autotools.

Git repository

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.ams 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.