Autotools examples explained
Jump to navigation
Jump to search
Contents
Fixing Autotools problems
Hello world example: Required 5 files
- configure.ac
- Makefile.am
- README
- src/
- Makefile.am
- helloworld.c
src/helloworld.c
#include <config.h> #include <stdio.h> int main (void) { puts ("Hello World!"); puts ("This is " PACKAGE_STRING "."); return 0; }
src/Makefile.am
- Makefile.am files have the same syntax
- Automake turns Makefile.am's into Makefile.in's
- baseline file
bin_PROGRAMS = helloworld helloworld_SOURCES = helloworld.c
- additional flags
helloworld_LDADD = $(LIBOBJS) info_TEXINFOS = helloworld.texi
uniform naming scheme
- directory variables
- bin_PROGRAMS is a concatenation of the ${bindir} and the primary token PROGRAMS
- also applicable: sbin_PROGRAMS
- also:
xmldir = $(datadir)/xml xml_DATA = file.xml
- list of primaries: ‘PROGRAMS’, ‘LIBRARIES’, ‘LTLIBRARIES’, ‘LISP’, ‘PYTHON’, ‘JAVA’, ‘SCRIPTS’, ‘DATA’, ‘HEADERS’, ‘MANS’, and ‘TEXINFOS’
Makefile.am
SUBDIRS=src dist_doc_DATA=README
README
This is a demonstration HelloWorld package for GNU Automake. Type `info Automake' to read the Automake manual.
config.ac
- List of Autoconf macros
- a "hello world" example:
- Macros that start with AC_ are Autoconf, AM_ are Automake
AC_INIT([helloworld], [1.0], [emailid@provider.com]) AM_INIT_AUTOMAKE([-Wall -Werror foreign]) AC_PROG_CC AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([ Makefile src/Makefile ]) AC_OUTPUT
- AC_INIT( [name of package], [version of package], [contact address for bug reports] )
- AM_INIT_AUTOMAKE( [ compiler flags ] )
- foreign means don't complaing that we don't have an authors or a changelog file
- AC_PROG_CC
- look for cc
- AC_CONFIG_HEADERS( [name of config file that you #included in your source code] )
- AC_CONFIG_FILES( [ newline delimited list of paths to all applicable Makefile.am's ] )
- AC_OUTPUT - the closing command that produces all the rest of the code.
wndchrm's
configure.ac
AC_INIT(wndchrm,1.30) AM_INIT_AUTOMAKE AC_PROG_CC AC_PROG_RANLIB # set the default c++ flags # Need to make the default CXXFLAGS be blank instead of -g -O2. Use these in AM_CXXFLAGS instead if test x"${CXXFLAGS+set}" = xset; then # the user set CXXFLAGS; don't override it. # Much more clever would be to issue a warning if users' CXXFLAGS have optimization higher than 0 # Cleverer still would be to figure out which versions of g++ barf when compiling FeatureNames.cpp with optimization. MY_CXXFLAGS="${CXXFLAGS}" else MY_CXXFLAGS="" fi # This sets the default CXXFLAGS (user/environment/or built-in default) AC_PROG_CXX # And here we overwrite it based on our test above CXXFLAGS=$MY_CXXFLAGS # Put the usual defualt into AM_CXXFLAGS AM_CXXFLAGS="-Wall -g -O2" SVNREV=`( svnversion $srcdir | sed 's/:/_/' ) 2>/dev/null` if { ! ( svnversion ) >/dev/null 2>&1 || test "$SVNREV" = "exported"; } ; then SVNREV=`cat $srcdir/SVNREV` else echo $SVNREV>$srcdir/SVNREV fi AC_SUBST(SVNREV) AC_DEFINE_UNQUOTED([SVNREV],["$SVNREV"], [SVN Revision from svnversion command]) AC_DEFINE_UNQUOTED([PACKAGE_VERSION],["$VERSION-$SVNREV"], [Version string, including SVNREV]) AC_DEFINE_UNQUOTED([PACKAGE_STRING],["$PACKAGE_NAME $VERSION-$SVNREV"], [Package string with version+SVNREV]) AM_CONFIG_HEADER(config.h) AC_CHECK_HEADER(math.h, [], AC_MSG_ERROR([the <math.h> header file could not be found.])) # ------------------------------------------------------------ # check for FFTW3 # ------------------------------------------------------------ AC_CHECK_LIB(fftw3,fftw_execute,[AC_DEFINE(HAVE_FFTW3,1,"Turn on FFTW3 support.")], [AC_MSG_ERROR([ FFTW3 library not found. Please download+install FFTW 3.x from http://www.fftw.org/download.html ])] ) AC_CHECK_HEADER(fftw3.h, [], AC_MSG_ERROR([ the <fftw3.h> header file from FFTW3 could not be found. Please download+install FFTW 3.x from http://www.fftw.org/download.html ])) # ------------------------------------------------------------ # check for libtiff # ------------------------------------------------------------ AC_CHECK_LIB(tiff, TIFFReadScanline) AC_CHECK_HEADER(tiffio.h,LIBTIFF='yes',AC_MSG_ERROR([ *** WND_CHARM requires libtiff; (Required TIFF headers not found) *** Please download+install libtiff from http://www.libtiff.org/ ])) # ------------------------------------------------------------ # check for TR1 stuff individually # ------------------------------------------------------------ # AC_HEADER_TR1_UNORDERED_MAP AC_DEFUN([AC_HEADER_TR1_UNORDERED_MAP], [ AC_CACHE_CHECK(for tr1/unordered_map, ac_cv_cxx_tr1_unordered_map, [AC_LANG_SAVE AC_LANG_CPLUSPLUS AC_TRY_COMPILE([#include <tr1/unordered_map>], [using std::tr1::unordered_map;], ac_cv_cxx_tr1_unordered_map=yes, ac_cv_cxx_tr1_unordered_map=no) AC_LANG_RESTORE ]) if test "$ac_cv_cxx_tr1_unordered_map" = yes; then AC_DEFINE(HAVE_TR1_UNORDERED_MAP,,[Define if tr1/unordered_map is present. ]) fi ]) AC_HEADER_TR1_UNORDERED_MAP # AC_HEADER_TR1_UNORDERED_SET AC_DEFUN([AC_HEADER_TR1_UNORDERED_SET], [ AC_CACHE_CHECK(for tr1/unordered_set, ac_cv_cxx_tr1_unordered_set, [AC_LANG_SAVE AC_LANG_CPLUSPLUS AC_TRY_COMPILE([#include <tr1/unordered_set>], [using std::tr1::unordered_set;], ac_cv_cxx_tr1_unordered_set=yes, ac_cv_cxx_tr1_unordered_set=no) AC_LANG_RESTORE ]) if test "$ac_cv_cxx_tr1_unordered_set" = yes; then AC_DEFINE(HAVE_TR1_UNORDERED_SET,,[Define if tr1/unordered_set is present. ]) fi ]) AC_HEADER_TR1_UNORDERED_SET # Write out our compile flags AC_SUBST(CXXFLAGS) AC_SUBST(AM_CXXFLAGS) AC_OUTPUT(Makefile)
Makefile.am
EXTRA_DIST = SVNREV distdir = $(PACKAGE)-$(VERSION).$(SVNREV) noinst_LIBRARIES = libimfit.a libFeatureNames.a # This is set up as a separate target because g++ barfs compiling this with optimization. # gcc 4.2.1 tries to allocate several gigs of RAM, and fails with an out-of-memory error # Apparently fixed in 4.3 or 4.4, but have not checked. libFeatureNames_a_SOURCES = \ FeatureNames.cpp \ FeatureNames.hpp # Our special optimization flags, which over-ride AM_CXXFLAGS. # Note that the user's CXXFLAGS always go at the end, which # get set to "-g -O2" if they are not set, which blows up. # I thought they were strictly for the user, so why are they set to a default? # configure.ac has some checks to not stomp on the user's CXXFLAGS, but also # not use the defaults provided by AC_PROG_CXX (which is where -g -O2 comes from). # The default options -g -O2 are set in AM_CXXFLAGS, which is as it should be. # The result is that it only blows up if the user has -O set in their CXXFLAGS. libFeatureNames_a_CXXFLAGS = -Wall -g -O0 libimfit_a_SOURCES = \ gsl/specfunc.cpp \ gsl/specfunc.h \ wndchrm_error.cpp \ wndchrm_error.h \ cmatrix.cpp \ cmatrix.h \ colors/FuzzyCalc.cpp \ colors/FuzzyCalc.h \ signatures.cpp \ signatures.h \ statistics/CombFirst4Moments.cpp \ statistics/CombFirst4Moments.h \ statistics/FeatureStatistics.cpp \ statistics/FeatureStatistics.h \ textures/gabor.cpp \ textures/gabor.h \ textures/haarlick/CVIPtexture.cpp \ textures/haarlick/CVIPtexture.h \ textures/haarlick/haarlick.cpp \ textures/haarlick/haarlick.h \ textures/haarlick/mapkit.cpp \ textures/haarlick/mapkit.h \ textures/haarlick/mapkit_generic.cpp \ textures/haarlick/mapkit_generic.h \ textures/tamura.cpp \ textures/tamura.h \ textures/zernike/zernike.cpp \ textures/zernike/zernike.h \ TrainingSet.cpp \ TrainingSet.h \ transforms/ChebishevFourier.cpp \ transforms/ChebishevFourier.h \ transforms/chevishev.cpp \ transforms/chevishev.h \ transforms/fft/bcb_fftw3/fftw3.h \ transforms/fft/fftw3.h \ transforms/radon.cpp \ transforms/radon.h \ transforms/wavelet/Common.cpp \ transforms/wavelet/Common.h \ transforms/wavelet/convolution.cpp \ transforms/wavelet/convolution.h \ transforms/wavelet/DataGrid.h \ transforms/wavelet/DataGrid2D.cpp \ transforms/wavelet/DataGrid2D.h \ transforms/wavelet/DataGrid3D.cpp \ transforms/wavelet/DataGrid3D.h \ transforms/wavelet/Filter.cpp \ transforms/wavelet/Filter.h \ transforms/wavelet/FilterSet.cpp \ transforms/wavelet/FilterSet.h \ transforms/wavelet/Symlet5.cpp \ transforms/wavelet/Symlet5.h \ transforms/wavelet/Wavelet.cpp \ transforms/wavelet/Wavelet.h \ transforms/wavelet/WaveletHigh.cpp \ transforms/wavelet/WaveletHigh.h \ transforms/wavelet/WaveletLow.cpp \ transforms/wavelet/WaveletLow.h \ transforms/wavelet/WaveletMedium.cpp \ transforms/wavelet/WaveletMedium.h \ transforms/wavelet/wt.cpp \ transforms/wavelet/wt.h AM_CPPFLAGS = -fPIC bin_PROGRAMS=wndchrm util/color_deconvolution wndchrm_SOURCES = wndchrm.cpp wndchrm_LDADD = libFeatureNames.a libimfit.a -lm -ltiff -L. -lFeatureNames -limfit -lfftw3 util_color_deconvolution_SOURCES = \ util/readTiffData.c \ util/readTIFF.h \ util/color_deconvolution.c util_color_deconvolution_LDADD = -lm -ltiff
aclocal
- a part of automake that will be deprecated in the future