makefile generation from autotools

Download Makefile Generation From Autotools

If you can't read please download the document

Upload: waqqas-jabbar

Post on 16-Apr-2017

2.277 views

Category:

Documents


3 download

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