automake-1.16: Creating amhello
2.4.1 Creating ‘amhello-1.0.tar.gz’
-----------------------------------
Here is how we can recreate ‘amhello-1.0.tar.gz’ from scratch. The
package is simple enough so that we will only need to write 5 files.
(You may copy them from the final ‘amhello-1.0.tar.gz’ that is
distributed with Automake if you do not want to write them.)
Create the following files in an empty directory.
• ‘src/main.c’ is the source file for the ‘hello’ program. We store
it in the ‘src/’ subdirectory, because later, when the package
evolves, it will ease the addition of a ‘man/’ directory for man
pages, a ‘data/’ directory for data files, etc.
~/amhello % cat src/main.c
#include <config.h>
#include <stdio.h>
int
main (void)
{
puts ("Hello World!");
puts ("This is " PACKAGE_STRING ".");
return 0;
}
• ‘README’ contains some very limited documentation for our little
package.
~/amhello % cat README
This is a demonstration package for GNU Automake.
Type 'info Automake' to read the Automake manual.
• ‘Makefile.am’ and ‘src/Makefile.am’ contain Automake instructions
for these two directories.
~/amhello % cat src/Makefile.am
bin_PROGRAMS = hello
hello_SOURCES = main.c
~/amhello % cat Makefile.am
SUBDIRS = src
dist_doc_DATA = README
• Finally, ‘configure.ac’ contains Autoconf instructions to create
the ‘configure’ script.
~/amhello % cat configure.ac
AC_INIT([amhello], [1.0], [bug-automake@gnu.org])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([
Makefile
src/Makefile
])
AC_OUTPUT
Once you have these five files, it is time to run the Autotools to
instantiate the build system. Do this using the ‘autoreconf’ command as
follows:
~/amhello % autoreconf --install
configure.ac: installing './install-sh'
configure.ac: installing './missing'
configure.ac: installing './compile'
src/Makefile.am: installing './depcomp'
At this point the build system is complete.
In addition to the three scripts mentioned in its output, you can see
that ‘autoreconf’ created four other files: ‘configure’, ‘config.h.in’,
‘Makefile.in’, and ‘src/Makefile.in’. The latter three files are
templates that will be adapted to the system by ‘configure’ under the
names ‘config.h’, ‘Makefile’, and ‘src/Makefile’. Let’s do this:
~/amhello % ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating config.h
config.status: executing depfiles commands
You can see ‘Makefile’, ‘src/Makefile’, and ‘config.h’ being created
at the end after ‘configure’ has probed the system. It is now possible
to run all the targets we wish (⇒Standard Targets). For
instance:
~/amhello % make
...
~/amhello % src/hello
Hello World!
This is amhello 1.0.
~/amhello % make distcheck
...
=============================================
amhello-1.0 archives ready for distribution:
amhello-1.0.tar.gz
=============================================
Note that running ‘autoreconf’ is only needed initially when the GNU
Build System does not exist. When you later change some instructions in
a ‘Makefile.am’ or ‘configure.ac’, the relevant part of the build system
will be regenerated automatically when you execute ‘make’.
‘autoreconf’ is a script that calls ‘autoconf’, ‘automake’, and a
bunch of other commands in the right order. If you are beginning with
these tools, it is not important to figure out in which order all of
these tools should be invoked and why. However, because Autoconf and
Automake have separate manuals, the important point to understand is
that ‘autoconf’ is in charge of creating ‘configure’ from
‘configure.ac’, while ‘automake’ is in charge of creating ‘Makefile.in’s
from ‘Makefile.am’s and ‘configure.ac’. This should at least direct you
to the right manual when seeking answers.