GNU Autotools

Last updated
GNU Autotools
Original author(s) Community
Developer(s) Free Software Foundation
Stable release
Multiple
Written in M4 (computer language), C
Operating system Cross-platform
Platform GNU and others
Included with GNU Operating System
Available inEnglish
License GNU General Public License version 2
Website www.gnu.org/software/software.html

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.

Contents

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

Flow diagram of autoconf and automake Autoconf-automake-process.svg
Flow diagram of autoconf and automake

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]

The idea is that the configure script performs approximately 200 automated tests, so that the user is not burdened with configuring libtool manually. This is a horribly bad idea, already much criticized back in the 1980s when it appeared, as it allows source code to pretend to be portable behind the veneer of the configure script, rather than actually having the quality of portability to begin with. It is a travesty that the configure idea survived.

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:

the 31,085 lines of configure for libtool still check if <sys/stat.h> and <stdlib.h> exist, even though the Unixen, which lacked them, had neither sufficient memory to execute libtool nor disks big enough for its 16-MB source code.

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]

The Autotools are actually more transparent than any other build tools out there. All these other tools' (cmake, maven, etc) - that purport to be so much simpler because they insulate the user from the underlying details of the build process - these tool's primary failure is that this very insulation keeps users from being able to make the changes they need to accomplish their unique project-specific build goals.

Anyone who has nothing but good things to say about this aspect of cmake, maven, gradle, or whatever, has simply not worked on a project that requires them to move far enough away from the defaults. I've used them all and I've spent hours in frustration trying to determine how to work around the shortcomings of some "do-all" (except what I want) tool function. This is simply not an issue with the Autotools. As someone mentioned earlier in this thread, you can drop shell script into a configure.ac file, and make script into a Makefile.am file. That is the very definition of transparency. No other tool in existence allows this level of flexibility.

See also

Related Research Articles

<span class="mw-page-title-main">Cygwin</span> Unix-like environment for Windows

Cygwin is a free and open-source Unix-like environment and command-line interface for Microsoft Windows. The project also provides a software repository containing many open-source packages. Cygwin allows source code for Unix-like operating systems to be compiled and run on Windows. Cygwin provides native integration of Windows-based applications.

GNU Autoconf is a tool for producing configure scripts for building, installing, and packaging software on computer systems where a Bourne shell is available.

<span class="mw-page-title-main">GNU Libtool</span> Software development tool

In computer programming, GNU Libtool is a software development tool, part of the GNU build system, consisting of a shell script created to address the software portability problem when compiling shared libraries from source code. It hides the differences between computing platforms for the commands which compile shared libraries. It provides a command-line interface that is identical across platforms and it executes the platform's native commands.

In software development, Make is a command-line interface (CLI) build automation tool that performs actions based on a configuration file, called a makefile. Make is commonly used to build executable code from source code. But, not limited to building, Make can perform any operation available via the operating system shell.

<span class="mw-page-title-main">Automake</span> Programming tool to automate parts of the compilation process

In software development, GNU Automake is a programming tool to automate parts of the compilation process. It eases usual compilation problems. For example, it points to needed dependencies.

<span class="mw-page-title-main">MinGW</span> Free and open-source software for developing applications in Microsoft Windows

MinGW, formerly mingw32, is a free and open source software development environment to create Microsoft Windows applications.

The GNU toolchain is a broad collection of programming tools produced by the GNU Project. These tools form a toolchain used for developing software applications and operating systems.

Perforce Jam was an open-source build system developed by Christopher Seiwald of Perforce Software. It was used as a replacement for make. Its primary feature was its ability to express build patterns in an imperative language which supported structured namespaces and simple lists. Jam could be used with autoconf, although it was often not necessary because of Jam's portability features. Perforce Jam ran on Unix, OpenVMS, Windows NT, Mac OS, and BeOS. It was also possible to configure it to work on Windows 9x using MinGW or Cygwin.

<span class="mw-page-title-main">SCons</span>

SCons is a computer software build tool that automatically analyzes source code file dependencies and operating system adaptation requirements from a software project description and generates final binary executables for installation on the target operating system platform. Its function is analogous to the traditional GNU build system based on the make utility and the autoconf tools.

menuconfig

make menuconfig is one of five similar tools that can configure Linux source, a necessary early step needed to compile the source code. make menuconfig, with a menu-driven user interface, allows the user to choose the features of Linux that will be compiled. It is normally invoked using the command make menuconfig; menuconfig is a target in Linux Makefile.

<span class="mw-page-title-main">CMake</span> Cross-platform, compiler-independent build system generator

In software development, CMake is cross-platform free and open-source software for build automation, testing, packaging and installation of software by using a compiler-independent method. CMake is not a build system itself; it generates another system's build files. It supports directory hierarchies and applications that depend on multiple libraries. It can invoke native build environments such as Make, Qt Creator, Ninja, Android Studio, Apple's Xcode, and Microsoft Visual Studio. It has minimal dependencies, requiring only a C++ compiler on its own build system.

<span class="mw-page-title-main">Waf (build system)</span>

Waf is a build automation tool designed to assist in the automatic compilation and installation of computer software. It is written in Python and maintained by Thomas Nagy.

configure script Executable script used when building programs

A configure script is an executable script designed to aid in developing a program to be run on a wide number of different computers. It matches the libraries on the user's computer, with those required by the program before compiling it from its source code.

makedepend is a Unix tool used to generate dependencies of C source files. A Microsoft Windows version was made available in 2002 and last updated in 2007 on UnxUtils.

lzip Data compression utility

lzip is a free, command-line tool for the compression of data; it employs the Lempel–Ziv–Markov chain algorithm (LZMA) with a user interface that is familiar to users of usual Unix compression tools, such as gzip and bzip2.

The following outline is provided as an overview of and topical guide to the Perl programming language:

Mingw-w64 is a free and open-source suite of developments tools that generate Portable Executable (PE) binaries for Microsoft Windows. It was forked in 2005–2010 from MinGW.

<span class="mw-page-title-main">Meson (software)</span> Build automation system

Meson is a software tool for automating the building (compiling) of software. Meson adopts a convention over configuration approach, promoting standard development tools and practice instead of providing unlimited flexibility to the user. Meson is free and open-source software written in Python, under the Apache License 2.0.

References

  1. "Savannah Git Hosting - autoconf.git/blob - COPYING.EXCEPTION". Git.savannah.gnu.org. Archived from the original on 2011-07-21. Retrieved 2016-04-01.
  2. "libtool.git - GNU Libtool". Git.savannah.gnu.org. 2005-01-08. Retrieved 2016-04-01.
  3. "The GNU configure and build system - Introduction". Airs.com. 1998-07-01. Retrieved 2016-04-01.
  4. "Learning the GNU development tools". Autotoolset.sourceforge.net. Retrieved 2016-04-01.
  5. "automake: GNU Build System". Gnu.org. 2014-12-31. Retrieved 2016-04-01.
  6. "Cross Compilation with GNU Autotools". Archived from the original on October 13, 2008. Retrieved September 24, 2008.
  7. "Robert Ögren - Slow shell script execution on Cygwin". Cygwin.com. Retrieved 2016-04-01.
  8. Kamp, Poul-Henning (2012). "A Generation Lost in the Bazaar". ACM Queue. 10 (8): 20–23. doi: 10.1145/2346916.2349257 . S2CID   11656592.
  9. "Autotools, 2nd Edition by John Calcote | Penguin Random House Canada" . Retrieved January 22, 2021.
  10. "Re: Future plans for Autotools" . Retrieved January 22, 2021.