Autoconf setup
File: autogen.sh
../../std-autogen.sh ../../.. # fetch Antimake template from libusual make -f ../../antimake.mk show-config > build.mk.in echo 'include $(abs_top_srcdir)/antimake.mk' >> build.mk.in ln -sf ../../antimake.mk . ln -sf ../../amext-cxx.mk .
File: configure.ac
AC_INIT([actest], [0.1]) AC_CONFIG_SRCDIR([esub/prog.c]) AC_PREREQ([2.59]) AC_USUAL_INIT LT_INIT AC_USUAL_PROGRAM_CHECK AC_PROG_CXX AC_OUTPUT([build.mk])
Here are the source files:
./prog.c ./cpptest.cpp ./sub/func1.c ./sub/esub/func2,c ./sub/sub/func3.c ./esub/func4.c ./esub/esub/func5.c ./esub/sub/func6.c
$ mkdir -p sub/esub sub/sub esub/esub esub/sub
File: esub/prog.c
#include "func1.h" #include "func2.h" #include "func3.h" #include "func4.h" #include "func5.h" #include "func6.h" #include <stdio.h> int main(void) { printf("%s\n", __FILE__); func1(); func2(); func3(); func4(); func5(); func6(); return 0; }
File: cpptest.cpp
#include <iostream>
using namespace std;
int main(void)
{
cout << "Hello" << endl;
return 0;
}
File: sub/func1.c
#include <stdio.h> #include "func1.h" void func1(void) { printf("%s\n", __FILE__); }
File: sub/func1.h
void func1(void);
$ sed s/1/2/ sub/func1.c > sub/esub/func2.c $ sed s/1/2/ sub/func1.h > sub/esub/func2.h $ sed s/1/3/ sub/func1.c > sub/sub/func3.c $ sed s/1/3/ sub/func1.h > sub/sub/func3.h $ sed s/1/4/ sub/func1.c > esub/func4.c $ sed s/1/4/ sub/func1.h > esub/func4.h $ sed s/1/5/ sub/func1.c > esub/sub/func5.c $ sed s/1/5/ sub/func1.h > esub/sub/func5.h $ sed s/1/6/ sub/func1.c > esub/esub/func6.c $ sed s/1/6/ sub/func1.h > esub/esub/func6.h
Now fill makefiles
File: Makefile
SUBDIRS = sub EMBED_SUBDIRS = esub AM_FEATURES = cxx override WFLAGS = -Wall EXTRA_DIST = Makefile antimake.mk amext-cxx.mk $(MAINTAINERCLEANFILES) # clean configured files DISTCLEANFILES = \ config.status \ config.log \ libtool # clean generated files MAINTAINERCLEANFILES = \ configure \ config.guess \ config.sub \ install-sh \ build.mk.in \ ltmain.sh noinst_PROGRAMS = cpptest cpptest_SOURCES = cpptest.cpp # launch Antimake include build.mk
File: sub/Makefile
SUBLOC = sub SUBDIRS = sub EMBED_SUBDIRS = esub noinst_LIBRARIES = libfunc1.a libfunc1_a_SOURCES = func1.c func1.h EXTRA_DIST = Makefile include ../build.mk
File: sub/sub/Makefile
SUBLOC = sub/sub EXTRA_DIST = Makefile noinst_LIBRARIES = libfunc3.a libfunc3_a_SOURCES = func3.c func3.h include ../../build.mk
File: sub/esub/Makefile.am
noinst_LIBRARIES = libfunc2.a libfunc2_a_SOURCES = func2.c func2.h EXTRA_DIST = Makefile.am
File: esub/Makefile.am
SUBDIRS = sub
EMBED_SUBDIRS = esub
EXTRA_DIST = Makefile.am
noinst_LIBRARIES = libfunc4.a
libfunc4_a_SOURCES = func4.c func4.h
noinst_PROGRAMS = prog
prog_SOURCES = prog.c
prog_LDFLAGS = -L../sub -L../sub/esub -L. -Lsub
prog_LDADD = \
-lfunc1 \
-lfunc2 \
$(topdir)/sub/sub/libfunc3.a \
-lfunc4 \
-lfunc5 \
esub/libfunc6.a
prog_CFLAGS = -I../sub
prog_CPPFLAGS = \
-I../sub/esub \
-I$(topdir)/sub/sub \
-I. \
-Iesub \
-I./sub
File: esub/sub/Makefile
SUBLOC = esub/sub EXTRA_DIST = Makefile noinst_LIBRARIES = libfunc5.a libfunc5_a_SOURCES = func5.c func5.h include ../../build.mk
File: esub/esub/Makefile.am
EXTRA_DIST = Makefile.am noinst_LIBRARIES = libfunc6.a libfunc6_a_SOURCES = func6.c func6.h
Build the project
$ sh ./autogen.sh
$ ./configure
[...]
$ make
--> sub
--> sub/sub
CC func3.c
AR libfunc3.a
RANLIB libfunc3.a
<-- sub/sub
CC func1.c
AR libfunc1.a
RANLIB libfunc1.a
CC esub/func2.c
AR esub/libfunc2.a
RANLIB esub/libfunc2.a
<-- sub
--> esub/sub
CC func5.c
AR libfunc5.a
RANLIB libfunc5.a
<-- esub/sub
CC esub/func4.c
AR esub/libfunc4.a
RANLIB esub/libfunc4.a
CC esub/esub/func6.c
AR esub/esub/libfunc6.a
RANLIB esub/esub/libfunc6.a
CXX cpptest.cpp
CXXLD cpptest
CC esub/prog.c
CCLD esub/prog
$ ls
Makefile build.mk config.status cpptest libtool
amext-cxx.mk build.mk.in config.sub cpptest.cpp ltmain.sh
antimake.mk config.guess configure esub sub
autogen.sh config.log configure.ac install-sh
$ ./esub/prog
esub/prog.c
func1.c
esub/func2.c
func3.c
esub/func4.c
func5.c
esub/esub/func6.c
Create distribution package
$ make dist
CHECK dist-gzip
MKDIR actest-0.1
COPY actest-0.1
PACK actest-0.1.tar.gz
$ tar tzf actest-0.1.tar.gz | sort
actest-0.1/
actest-0.1/Makefile
actest-0.1/amext-cxx.mk
actest-0.1/antimake.mk
actest-0.1/build.mk.in
actest-0.1/config.guess
actest-0.1/config.sub
actest-0.1/configure
actest-0.1/cpptest.cpp
actest-0.1/esub/
actest-0.1/esub/Makefile.am
actest-0.1/esub/esub/
actest-0.1/esub/esub/Makefile.am
actest-0.1/esub/esub/func6.c
actest-0.1/esub/esub/func6.h
actest-0.1/esub/func4.c
actest-0.1/esub/func4.h
actest-0.1/esub/prog.c
actest-0.1/esub/sub/
actest-0.1/esub/sub/Makefile
actest-0.1/esub/sub/func5.c
actest-0.1/esub/sub/func5.h
actest-0.1/install-sh
actest-0.1/ltmain.sh
actest-0.1/sub/
actest-0.1/sub/Makefile
actest-0.1/sub/esub/
actest-0.1/sub/esub/Makefile.am
actest-0.1/sub/esub/func2.c
actest-0.1/sub/esub/func2.h
actest-0.1/sub/func1.c
actest-0.1/sub/func1.h
actest-0.1/sub/sub/
actest-0.1/sub/sub/Makefile
actest-0.1/sub/sub/func3.c
actest-0.1/sub/sub/func3.h
Test installation
$ make install DESTDIR=`pwd`/inst
--> sub
--> sub/sub
make[2]: Nothing to be done for `install'.
<-- sub/sub
<-- sub
--> esub/sub
make[1]: Nothing to be done for `install'.
<-- esub/sub
$ ls
Makefile autogen.sh config.log configure.ac install-sh
actest-0.1.tar.gz build.mk config.status cpptest libtool
amext-cxx.mk build.mk.in config.sub cpptest.cpp ltmain.sh
antimake.mk config.guess configure esub sub
$ find inst | sort
find: `inst': No such file or directory
Test the distribution package and separate build dir
$ mkdir -p test
$ cd test
$ tar xf ../actest-0.1.tar.gz
$ mkdir build
$ cd build
$ ../actest-0.1/configure
[...]
$ make
MKDIR Create sub
--> sub
MKDIR Create sub/sub
--> sub/sub
CC ../../../actest-0.1/sub/sub/func3.c
AR libfunc3.a
RANLIB libfunc3.a
<-- sub/sub
CC ../../actest-0.1/sub/func1.c
AR libfunc1.a
RANLIB libfunc1.a
CC ../../actest-0.1/sub/esub/func2.c
AR esub/libfunc2.a
RANLIB esub/libfunc2.a
<-- sub
MKDIR Create esub/sub
--> esub/sub
CC ../../../actest-0.1/esub/sub/func5.c
AR libfunc5.a
RANLIB libfunc5.a
<-- esub/sub
CC ../actest-0.1/esub/func4.c
AR esub/libfunc4.a
RANLIB esub/libfunc4.a
CC ../actest-0.1/esub/esub/func6.c
AR esub/esub/libfunc6.a
RANLIB esub/esub/libfunc6.a
CXX ../actest-0.1/cpptest.cpp
CXXLD cpptest
CC ../actest-0.1/esub/prog.c
CCLD esub/prog
$ ls
Makefile build.mk config.log config.status cpptest esub libtool sub
$ make esub/prog
make: `esub/prog' is up to date.
$ ./esub/prog
../actest-0.1/esub/prog.c
../../actest-0.1/sub/func1.c
../../actest-0.1/sub/esub/func2.c
../../../actest-0.1/sub/sub/func3.c
../actest-0.1/esub/func4.c
../../../actest-0.1/esub/sub/func5.c
../actest-0.1/esub/esub/func6.c
$ cd ../..
Clean up
$ make maintainer-clean
--> sub
--> sub/sub
CLEAN libfunc3.a
<-- sub/sub
CLEAN libfunc1.a
CLEAN esub/libfunc2.a
CLEAN clean
<-- sub
--> esub/sub
CLEAN libfunc5.a
<-- esub/sub
CLEAN esub/libfunc4.a
CLEAN esub/esub/libfunc6.a
CLEAN cpptest
CLEAN esub/prog
CLEAN clean
--> sub
--> sub/sub
CLEAN libfunc3.a
<-- sub/sub
CLEAN libfunc1.a
CLEAN esub/libfunc2.a
CLEAN clean
--> sub/sub
CLEAN libfunc3.a
MAINTAINERCLEAN maintainer-clean
<-- sub/sub
MAINTAINERCLEAN maintainer-clean
<-- sub
--> esub/sub
CLEAN libfunc5.a
MAINTAINERCLEAN maintainer-clean
<-- esub/sub
MAINTAINERCLEAN maintainer-clean
$ ls
Makefile amext-cxx.mk autogen.sh configure.ac esub test
actest-0.1.tar.gz antimake.mk build.mk cpptest.cpp sub
Done