makefile generation from autotools
TRANSCRIPT
Introducing a New Product
Makefile generation from Autotools
Waqqas Jabbar
Prerequisites
C, C++
gcc and its options
make and Makefile
configure and its options
pkg-config
Objectives
Use autotools to generate Makefiles, for
Dynamic and Static libraries
Executable
Use libtool to generate libraries
Autotools
Collection of utilities
automake
autoconf
libtoolize
aclocal
autoheader
autoscan
autoupdate
autoreconf
Can be used separately or together
Inputs to autotools
configure.ac
Makefile.ac
config.h.in
Source code
Outputs of autotools
config.h
Added in project
Conditional compilation
#ifdef, #elif, #endif
Makefile(s)
Input to make
config.hMakefileMakefile.inSource codeconfigure.acautoscanautoheaderautomakeconfig.h.inMakefile.am
autoconfconfigure.scan
configureconfigure
?
config.hMakefileMakefile.inSource codeconfigure.acautoscanautoheaderautomakeconfig.h.inMakefile.am
autoconfconfigure.scan
configureconfigure
autoscan
Input: Source code
Output: configure.scan
Template for configure.ac
autoheader
Input: configure.ac, Source code
Output: config.h.in
What defines are to be generated in config.h
#undef VAR -> #define VAR 1 ( by configure)
automake
Input: Makefile.am
Output: Makefile.in
Convert automake variables to their values
autoconf
Input: configure.ac
Output: configure
Shell script
configure
Input: config.h.in, Makefile.in
Output: config.h, Makefile(s)
Makefile.in
Syntax of Makefile
Makefile.am
Executables
Installation binaries
bin_PROGRAMS = foo1
Non-Installation binaries
noinst_PROGRAMS = foo2
foo1_SOURCES = foo1.c foo1.h
INCLUDES=-I $HOME/usr/include
LDADD=-lpthread
AM_CFLAGS=-DMY_DEFINE
foo1extradir=$(datadir)/foo1
foo1extra_DATA= foo1.conf
Makefile.am
Libraries
Installation Libraries
lib_LTLIBRARIES=libtest.la
library_includedir= The directory where header files will be installed
library_include_HEADERS= Header files exposed by the library
Non-installation libraries
noinst_LTLIBRARIES=
libtest_la_SOURCES =
libtest_la_LDFLAGS =
INCLUDES = -I.
libtest_la_LIBADD= (other libraries to add)
Makefile.am
Predefined variables
$(top_srcdir) : Main directory of source-code
$(includedir) : Path specified in configure for installing header files
SUBDIRS =
configure.ac
Set of M4 Macros
Initialization
AC_PREREQ
AC_INIT
AC_CONFIG_HEADER(config.h)
AM_INIT_AUTOMAKE
Checks for programs
AC_PROG_CC
AC_PROG_CXX
AC_PROG_INSTALL
AM_PROG_LIBTOOL
AM_SANITY_CHECK
configure.ac
Checks for libraries
pkg-config
PKG_CHECK_MODULES(SNDFILE_DEPS, sndfile >= 1.0.17)
AC_SUBST(SNDFILE_DEPS_CFLAGS)
AC_SUBST(SNDFILE_DEPS_LIBS)
AC_SUBST passes variable from configure.ac to Makefile.am
configure.ac
No script
AC_CHECK_LIB
AC_ARG_WITH(mysql, [ --with-mysql= prefix of MySQL installation. e.g. /usr/local or /usr], [MYSQL_PREFIX=$with_mysql], AC_MSG_ERROR([You must call configure with the --with-mysql option. This tells configure where to find the MySql C library and headers. e.g. --with-mysql=/usr/local or --with-mysql=/usr]))
AC_SUBST(MYSQL_PREFIX)
MYSQL_LIBS="-L${MYSQL_PREFIX}/lib/mysql -lmysqlclient"
MYSQL_CFLAGS="-I${MYSQL_PREFIX}/include"
AC_SUBST(MYSQL_LIBS)
AC_SUBST(MYSQL_CFLAGS)
configure.ac
Checks for header files
AC_HEADER_STDC
AC_CHECK_HEADERS([string.h])
Checks for typedefs, structures, and compiler characteristics
Checks for library functions
AC_CHECK_FUNCS([bzero])
Give Makefile to generate
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
configure.ac
Adding option in configure script
AC_ARG_ENABLE(option-foo,[ --enable-option-foo help for option foo], [CFLAGS= "$CFLAGS -DOPTION_FOO_DEFINE"], [])
Disable shared libraries
AC_DISABLE_SHARED
References
http://www.elitecoders.de/mags/cscene/CS2/CS2-10.html
http://www.openismus.com/documents/linux/automake/automake.shtml
http://www.openismus.com/documents/linux/using_libraries/using_libraries.shtml
http://www.openismus.com/documents/linux/building_libraries/building_libraries.shtml
http://bec-systems.com/web/content/view/95/9/
http://sources.redhat.com/autobook/autobook/autobook_toc.html#SEC_Contents
http://www.gnu.org/manual/manual.html
Examples
http://www.openismus.com/documents/linux/building_libraries/examplelib-0.3.0.tar.gz
http://www.openismus.com/documents/linux/using_libraries/examplelib_example-0.3.0.tar.gz
Summary
You can generate distributions in tar.gz or rpm
Thank You