Autotools Project Creation Template
This post has a simple bash script to create a basic Hello World autotools project with a single command. The justification for this autotools script is I’ve not seen a consolidated script that keeps it simple in one place. The script creates a boiler plate autotools hello world project. Here is what it does:
- Creation of
configure.acwith project name, version, and email - Creation of root
Makefile.amwhich just points to thesrc/Makefile.am - Creation of
src/Makefile.amwhich will make a binary and has a single source filemain.c - Creation of a
autogen.shwhich will runautoreconf --install - Creation of a
.gitignoreso we know what autotools files should be under version control - Creation of a
main.cwhich just prints “hello world” to stdout.
After we have created the files above all we need to do is run a ./autogen.sh and our project will be ready to run the infamous ./configure, make and make install.
To create the project we can run our script by adding the project name. For this example let’s call the project autotools_helloworld. This will create a binary called autotools_helloworld with our source in main.c. and create an autotools hello world project. Below is an example usage of the script to create the project, generate the autotools scripts, configure, make and run the program.
$ atprj autotools_helloworld
$ cd autotools_helloworld
$ ./autogen.sh
configure.ac:3: installing './compile'
configure.ac:2: installing './install-sh'
configure.ac:2: installing './missing'
src/Makefile.am: installing './depcomp'
$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets ... yes
checking whether make supports nested variables... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
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 whether gcc understands -c and -o together... yes
checking whether make supports the include directive... yes (GNU style)
checking dependency style of gcc... gcc3
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating config.h
config.status: executing depfiles commands
lloydrochester :: ~/autotools_helloworld » make
make all-recursive
make[1]: Entering directory '/home/lloydroc/autotools_helloworld'
Making all in src
make[2]: Entering directory '/home/lloydroc/autotools_helloworld/src'
gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
mv -f .deps/main.Tpo .deps/main.Po
gcc -g -O2 -o autotools_helloworld main.o
make[2]: Leaving directory '/home/lloydroc/autotools_helloworld/src'
make[2]: Entering directory '/home/lloydroc/autotools_helloworld'
make[2]: Leaving directory '/home/lloydroc/autotools_helloworld'
make[1]: Leaving directory '/home/lloydroc/autotools_helloworld'
$ ./src/autotools_helloworld
hello world
$Here is the script which I named atprj. This is short for “Autotools Project”.
# filename atprj and add to your $PATH
#!/bin/bash
EMAIL="lloyd@lloydrochester.com"
VERSION="1.0"
if [ $# -ne 1 ]; then
echo $0 progname
fi
mkdir $1
cd $1
touch README
cat << EOF > configure.ac
AC_INIT([$1], [$VERSION], [$EMAIL])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_CONFIG_SRCDIR([config.h.in])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CC
AC_PROG_INSTALL
# Checks for libraries.
# check for the math library. round can be replaced with another call in the lib
# AC_CHECK_LIB([m], [round])
# Checks for header files.
# AC_CHECK_HEADERS([arpa/inet.h netinet/in.h strings.h sys/socket.h])
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
# AC_CHECK_FUNCS([bzero socket])
AC_CONFIG_FILES([Makefile
src/Makefile])
AC_OUTPUT
EOF
cat << EOF > Makefile.am
SUBDIRS = src
dist_doc_DATA = README
EOF
mkdir src
cat << EOF > src/Makefile.am
bin_PROGRAMS = $1
$1_SOURCES = main.c
# if you want to link with the math library
# $1_LDADD = -lm
EOF
cat << EOF > autogen.sh
#!/bin/sh
autoreconf --install || exit 1
EOF
chmod u+x autogen.sh
cat << EOF > .gitignore
# http://www.gnu.org/software/automake
Makefile.in
/ar-lib
/mdate-sh
/py-compile
/test-driver
/ylwrap
# http://www.gnu.org/software/autoconf
autom4te.cache
/autoscan.log
/autoscan-*.log
/aclocal.m4
/compile
/config.guess
/config.h.in
/config.log
/config.status
/config.sub
/configure
/configure.scan
/depcomp
/install-sh
/missing
/stamp-h1
# https://www.gnu.org/software/libtool/
/ltmain.sh
# http://www.gnu.org/software/texinfo
/texinfo.tex
# http://www.gnu.org/software/m4/
m4/libtool.m4
m4/ltoptions.m4
m4/ltsugar.m4
m4/ltversion.m4
m4/lt~obsolete.m4(LIBDL)
Makefile
src/Makefile
*.o
src/.deps
src/test_become_daemon
config.h
tags
EOF