Recently I decided to finally try to understand autotools. It’s been on my list for ages, so I took the opportunity to read a bit more about the de-facto standard GNU build system. Cmake has been my C and C++ go-to build system for a while now, so learning Autotools is an opportunity to add one more tool to my belt.
In this post I’m sharing the routine I use to create an Autotools project from scratch. Whenever I create a new project, I just come back to this thread and copy/paste from here. I hope you find this useful.
Start New Project
To get started, you need to create configure.ac
and Makefile.am
configure.ac
AC_INIT([YOURPROJECT], [1.0])
AC_CONFIG_SRCDIR([.])
AM_INIT_AUTOMAKE
AC_CONFIG_MACRO_DIRS([m4])
AC_PREREQ([2.69])
AC_CONFIG_HEADERS([config.h])
AC_PROG_CC
AC_CHECK_HEADERS([stdlib.h])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
Makefile.am
AM_LDFLAGS=-lccoin -lglib-2.0
AM_CPPFLAGS = -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
ACLOCAL_AMFLAGS=-I m4
bin_PROGRAMS=prog1
prog1_SOURCES=prog1.c
prog1_LDADD=-lglib-2.0 -lccoin -lpthread -lsecp256k1
Customize the libraries and include directories at will.
See below for details about the ccoin
and secp256k1
libs used here.
Run autotools Commands
touch NEWS README AUTHORS COPYING ChangeLog INSTALL
aclocal
automake --add-missing
autoreconf
./configure
make
And Bob’s your uncle!
The above should generate all the basic files. From there on, all you gotta do is run make again. The automatically generated Makefile is smart enough to regenerate any modified files.
Building Outside the Main Tree
You may wish to build the project outside the main source tree, under a bin/
subdirectory for instance.
In that case, run the following commands.
make distclean
mkdir bin/
cd bin/
../configure
make
make distclean
will clean up the cached configuration from your main source tree and get it back to factory settings. Then create a directory where you’d like to build the system, I chose bin/
arbitrarily. Enter the new directory and run the root dir’s configure from there. Autotools is smart enough to generate all the required build files in the new subdirectory.
Well I hope this short cookbook recipe has been useful. I keep coming back to this post whenever I create a new C project, so I hope it’s useful to you too!
Picocoin C Language Bitcoin Library
You may have noticed that I use picocoin and secp256k1
libraries in my Makefile.am. I use both these great libraries in order to play with Bitcoin programming! Picocoin allows me to create a tiny wallet, generate keys, addresses and so on programmatically with a very tiny footprint.
If interested in this library, clone it using this:
git clone --recurse-submodules -j8 https://github.com/jgarzik/picocoin.git
This will create a secp256k1
subdirectory where you’ll find the last missing library required by Makefile.am
Build it with the usual GNU procedure:
./configure
make -j8
sudo make install
Your build system should automatically use the /usr/local
directory for builds. If it doesn’t, then please adjust your build environment accordingly.