GNU Autotools explained

GNU Autotools
Logo Alt:GNU logo
Logo Size:256px
Author:Community
Developer:Free Software Foundation
Latest Release Version:Multiple
Programming Language:M4 (computer language), C
Operating System:Cross-platform
Platform:GNU and others
Included With:GNU Operating System
Language:English
License:GNU General Public License version 2

The GNU Autotools, also known as the GNU Build System, is a suite of programming tools designed to assist in making source code packages portable to many Unix-like systems.

It can be difficult to make a software program portable: the C compiler differs from system to system; certain library functions are missing on some systems; header files may have different names; shared libraries may be compiled and installed in different ways. One way to handle platform differences is to write conditional code, with code blocks selected by means of preprocessor directives (#ifdef); but because of the wide variety of build environments this approach quickly becomes unmanageable. Autotools is designed to address this problem more manageably.

Autotools is part of the GNU toolchain and is widely used in many free software and open source packages. Its component tools are free software, licensed under the GNU General Public License with special license exceptions[1] [2] permitting its use with proprietary software.

The GNU Build System makes it possible to build many programs using a two-step process: configure followed by make.[3]

Components

Autotools consists of the GNU utilities Autoconf, Automake, and Libtool.[4] Other related tools frequently used alongside it include GNU make, GNU gettext, pkg-config, and the GNU Compiler Collection (GCC).

Autoconf

Autoconf generates a configure script based on the contents of a configure.ac file, which characterizes a particular body of source code. The configure script, when run, scans the build environment and generates a subordinate config.status script which, in turn, converts other input files and most commonly Makefile.in into output files (Makefile), which are appropriate for that build environment. Finally, the make program uses Makefile to generate executable programs from source code.

The complexity of Autotools reflects the variety of circumstances under which a body of source code may be built.

To process files, autoconf uses the GNU implementation of the m4 macro system.

Autoconf comes with several auxiliary programs such as autoheader, which is used to help manage C header files; autoscan, which can create an initial input file for Autoconf; and ifnames, which can list C pre-processor identifiers used in the program.

Automake

Automake helps to create portable Makefiles, which are in turn processed with the make utility. It takes its input as Makefile.am, and turns it into Makefile.in, which is used by the configure script to generate the file Makefile output. It also performs automatic dependency tracking; every time a source file is compiled, the list of dependencies (e.g., C header files) is recorded. Later, any time make is run and a dependency appears to have changed, the dependent files will be rebuilt.

Libtool

Libtool helps manage the creation of static and dynamic libraries on various Unix-like operating systems. Libtool accomplishes this by abstracting the library-creation process, hiding differences between various systems (e.g. Linux systems vs. Solaris).

Usage

Autotools assists software developers to write cross-platform software and make it available to a much wider user community, including in its source code form to those users who wish to build the software themselves. In most cases users simply run the supplied configure script (which has no dependencies other than the presence of a Bourne-compatible shell), and then a make program.[5] They do not need to have the Autotools themselves installed on the computer.

It can be used both for building native programs on the build machine and also for cross-compiling to other architectures.[6]

Cross-compiling software to run on a Windows host from a Linux or other Unix-like build system is also possible, using MinGW, however native compilation is often desirable on operating systems (such as the Microsoft Windows family of systems) that cannot run Bourne shell scripts on their own. This makes building such software on the Windows operating system a bit harder than on a Unix-like system which provides the Bourne shell as a standard component. One can install the Cygwin or MSYS system on top of Windows to provide a Unix-like compatibility layer, though, allowing configure scripts to run. Cygwin also provides the GNU Compiler Collection, GNU make, and other software that provides a nearly complete Unix-like system within Windows; MSYS also provides GNU make and other tools designed to work with the MinGW version of GCC.

Although the developer is expected to provide a configure script for the end-user, occasionally the user may wish to re-generate the configure script itself. Such working might be necessary if the user wishes to amend the source code itself. Such users would need to have Autotools installed, and to use components such as its autoreconf.

The autoconf-generated configure can be slow because it executes programs such as a C compiler many times in order to test whether various libraries, header files, and language features are present. This particularly affects Cygwin, which, due to its lack of a native fork system call, may execute configure scripts considerably slower than Linux.[7]

Criticism

In his column for ACM Queue, FreeBSD developer Poul-Henning Kamp criticized the GNU Build System:[8]

Kamp sketches the history of the build system in the portability problems inherent in the multitude of 1980s Unix variants, and bemoans the need for such build systems to exist:

Although critics of the Autotools frequently advocate for alternatives that provide greater simplicity to their users, some have argued that this is not necessarily a good thing. John Calcote, author[9] of the Autotools, 2nd Edition: A Practitioner's Guide to GNU Autoconf, Automake, and Libtool, opined:[10]

See also

Notes and References

  1. Web site: Savannah Git Hosting - autoconf.git/blob - COPYING.EXCEPTION . https://web.archive.org/web/20110721073834/http://git.savannah.gnu.org/gitweb/?p=autoconf.git;a=blob;f=COPYING.EXCEPTION;h=469583528592cd69ac0847803b443849dcc9b1eb;hb=HEAD . dead . 2011-07-21 . Git.savannah.gnu.org . 2016-04-01 .
  2. Web site: libtool.git - GNU Libtool . Git.savannah.gnu.org . 2005-01-08 . 2016-04-01.
  3. Web site: The GNU configure and build system - Introduction . Airs.com . 1998-07-01 . 2016-04-01.
  4. Web site: Learning the GNU development tools . Autotoolset.sourceforge.net . 2016-04-01.
  5. Web site: automake: GNU Build System . Gnu.org . 2014-12-31 . 2016-04-01.
  6. Web site: Cross Compilation with GNU Autotools . September 24, 2008 . dead . https://web.archive.org/web/20081013213002/http://sources.redhat.com/autobook/autobook/autobook_258.html . October 13, 2008 .
  7. Web site: Robert Ögren - Slow shell script execution on Cygwin . Cygwin.com . 2016-04-01.
  8. Poul-Henning . Kamp . 2012 . ACM Queue . 10 . 8 . A Generation Lost in the Bazaar. 20–23 . 10.1145/2346916.2349257 . 11656592 . free .
  9. Web site: Autotools, 2nd Edition by John Calcote Penguin Random House Canada . January 22, 2021.
  10. Web site: Re: Future plans for Autotools . January 22, 2021.