Hi Tareq,
I strongly recommend you use the GNU Autotools (automake, autoconf and
libtool) to build your thing. Suppose you have classes
Tintin, Milou, Haddock, Tournesol
and programs
dupond, dupont
and classes Tintin and Milou go into one library libHerge, Haddock and
Tournesol another libMoulinsart. Then have directory structure like:
.
|-- Makefile.am
|-- acinclude.m4
|-- config
| `-- config.mk
|-- configure.in
|-- detectives
| |-- Makefile.am
| |-- dupond.cxx
| `-- dupont.cxx
|-- herge
| |-- Makefile.am
| |-- inc
| | |-- HergeInc.h
| | |-- HergeLinkDef.h
| | |-- Milou.h
| | `-- Tintin.h
| `-- src
| |-- Milou.cxx
| `-- Tintin.cxx
`-- moulinsart
|-- Makefile.am
|-- inc
| |-- Haddock.h
| |-- MoulinsartInc.h
| |-- MoulinsartLinkDef.h
| `-- Tournesol.h
`-- src
|-- Haddock.cxx
`-- Tournesol.cxx
The content of the files
Milou.h Milou.cxx Haddock.h Haddock.cxx
Tintin.h Tintin.cxx Tournesol.h Tournesol.cxx
as well as
dupond.cxx dupont.cxx
should be obvious, with only one cave-at: If you want to have
class Tintin {
private:
Milou* fMilou; // Has-a relation
friend class Haddock;
...
}
class Haddock {
private:
Milou* fMilou; // Hates-it's-guts-relation
...
public:
....
SetMilou(Tintin* tintin) { fMilou = tintin->fMilou; }
}
you'd better have the lines
#ifndef TINTIN_H
#include "Tintin.h"
#endif
in Haddock.h
The contents of the files HergeLinkDef.h and MoulinsartLinkDef.h are
the standard stuff for the CINT dictionary. HergeInc.h and
MoulinsartInc.h should just include the headers for that library,
e.g.,
#ifndef TINTIN_H
#inclide "Tintin.h"
#endif
#ifndef MILOU_H
#include "Milou.h"
#endif
No for the interresting stuff. The toplevel Makefile.am should contain
only
# We're not native GNU
AUTOMAKE_OPTIONS = foreign
# our subdiretories.
SUBDIRS = herge moulinsart detectives
and configure.in should contain
dnl this is a comment
dnl this file _must_ exist
AC_INIT(herge/src/Tintin.cxx)
dnl name of package and version number
AM_INIT_AUTOMAKE(adventure, 0.1.0)
AC_PROG_CC
AC_PROG_CXX
AC_ROOT
AC_ISC_POSIX
AM_DISABLE_STATIC
AM_PROG_LIBTOOL
AC_OUTPUT([Makefile
herge/Makefile
moulinsart/Makefile
detectives/Makefile], [])
The file acinclude.m4 should contain all of build/misc/acinclude.m4
(just copy it) from the ROOT source tree.
So far so good. The toplevel Makefile takes us to the three
subdirectories, and the configure script finds the ROOT installation
(macro AC_ROOT) C and C++ compiler, and writes al the Makefiles. No
this last step is ofcourse not at all automatic (wish it were); we
need to help out a bit. This is where config/config.h enters the
picture. In that file, we'll put some common stuff, here goes:
SOVERSION = $(shell echo $(VERSION) | \
sed 's/\(.*\)\.\(.*\)\.\(.*\)/\1:\2:0/')
ROOTCONF = @ROOTCONF@
ROOTCINT = $(shell $(ROOTCONF) --prefix)/bin/rootcint
ROOTLIBS = $(shell $(ROOTCONF) --libs)
ROOTGLIBS = $(shell $(ROOTCONF) --glibs)
ROOTCFLAGS = $(shell $(ROOTCONF) --cflags)
INCLUDES = -Iinc -I$(top_srcdir)/include $(ROOTCFLAGS)
CINTINCLUDES = -Iinc -I$(top_srcdir)/include
LIBS = $(ROOTLIBS)
CLEANFILES = *Cint.cxx *Cint.h *~ core
vpath %.cxx src
vpath %.h inc
%Cint.cxx:inc/%Inc.h inc/%LinkDef.h
$(ROOTCINT) -f $@ -c $(CINTINCLUDES) $^
all-local:
$(INSTALL) -d $(top_srcdir)/include
$(INSTALLDATA) $(addprefix inc/,$(HEADERS)) $(top_srcdir)/include
This file will be included into the Makefile.am's so that we only need
to do these things once. Notice the "@ROOTCONF@" that will be
substituted with the path to root-config, as found by the configure
script.
Next, in each of the file herge/Makefile.am and
moulinsart/Makefile.am, we put the definitions needed to make each
library, for libHerge.so
lib_LTLIBRARIES = libHerge.la
libHerge_la_SOURCES = Tintin.h Tintin.cxx \
Minou.h Minou.cxx \
HergeCint.h HergeCint.cxx
libHerge_la_LDFLAGS = -version-info $(SOVERSION)
include_HEADERS = Tintin.h Minou.h
BUILT_SOURCES = HergeCint.h HergeCint.cxx
include $(top_srcdir)/config/config.mk
and
lib_LTLIBRARIES = libMoulinsart.la
libMoulinsart_la_SOURCES = Haddock.h Haddock.cxx \
Tournesol.h Tournesol.cxx \
MoulinsartCint.h MoulinsartCint.cxx
libMoulinsart_la_LDFLAGS = -version-info $(SOVERSION)
include_HEADERS = Haddock.h Tournesol.h
BUILT_SOURCES = MoulinsartCint.h MoulinsartCint.cxx
include $(top_srcdir)/config/config.mk
Never mind the odd .la in the names. It'll turn out right in the end.
To make the program dupont and dupond, we need to link agianst
libHerge and libMoulinsart. Here's what we put in
detectives/Makefile.am:
bin_PROGRAMS = dupond dupont
dupond_SOURCES = dupond.cxx
dupont_SOURCES = dupont.cxx
dupond_LDADD = ../herge/libHerge.la \
../moulinsart/libMoulinsart.la
dupont_LDADD = ../herge/libHerge.la \
../moulinsart/libMoulinsart.la
include $(top_srcdir)/config/config.mk
That is it for the files. Now for the procedure. Cd into you package,
and do
automake -a
autoconf
to make the Makefile.ins and the configure script. This step is only
needed if you change something in the diretories (add/remove
files). Then configure your sources,
./configure --prefix=${HOME}/install
(prefix should be set to somewhere you may write, default is
/usr/local). This step should always be done before building. Now all
the Makefiles are created (take a quick glance in some of them - they
are ugly, but very efficient). Now you can build
make
and dosn't forget to install
(don't-eat-where-you-s**t-philosophy). That is it!
Hope that helps you a bit.
Yours,
Christian -----------------------------------------------------------
Holm Christensen Phone: (+45) 35 35 96 91
Sankt Hansgade 23, 1. th. Office: (+45) 353 25 305
DK-2200 Copenhagen N Web: www.nbi.dk/~cholm
Denmark Email: cholm@nbi.dk
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:40 MET