The reSIProcate build system

From reSIProcate
Revision as of 15:50, 26 April 2011 by Pckizer (talk | contribs) (convert another page with sample code to display it in syntax-highlighted form)
Jump to navigation Jump to search

The resip build system is based on a customized gmake build system. This is not the same as the experimental autotools-based build system that is also available in resiprocate. Here is the overall directory structure for resiprocate.

The resiprocate project and all of its third party dependencies are stored using the subversion source code control system.

Build System Capabilities

The resiprocate custom build system satisfies a number of requirements:

  • easy to build a new package/library or executable
  • supports the following operating systems: linux, solaris, QNX, Mac OSX, Cygwin, and VxWorks
  • supports the following compilers: g++, Intel compiler, ARM cross compiler, Sunpro C++
  • can be easily extended to support additional compilers and operating systems that support gmake
  • builds and maintains dependencies automatically
  • support for shared libraries
  • support for distcc - for distributed compilation
  • keeps object and binaries in separate directories
  • can store object and binaries on a local filesystem
  • keeps optimized, profiled and debug binaries and object files in separate directories
  • support for toggling support of features such as IPV6, SSL, DTLS, etc.

Build System Example

Library example

The following example has additional annotations to explain in detail what each line means. It provides a fictional new library example that you could use in your organization.

 # provide a pointer to the location of your build directory as a relative
 # path. 
 BUILD = ../build
 # this line is required before any other declarations
 include $(BUILD)/Makefile.pre
 # specify all package/library dependencies.  

 # this defines the name of the target library. the library suffix depends on
 # whether static or dynamic libraries are selected in sip/build/Makefile.conf
 TARGET_LIBRARY := libexample
 # list all C and C++ source files which will be included in the library. if a
 # separate line is used for each input file, a backslash '\' is required at the
 # end of each line
 SRC = 	\
 	file1.cxx \

 # this line is required after all other declarations
 include $(BUILD)/

Binary example

The following example is taken from the repro project (a 3261 compliant sip proxy) with additional annotations to explain in detail what each line means:

 # Specifies the relative location of the resiprocate build directory
 BUILD = ../build

 # Some definitions that need to be included before anything else
 include $(BUILD)/Makefile.pre
 # 3rd parth package dependencies. Note that these are declared in a particular
 # order. For example, DUM is dependent on RESIPROCATE which is dependent on
 # OPENSSL. By declaring packages here, this will result in particular compile line
 # definitions, include paths and library search paths being defined.
 # Specify any subdirectories where code will be defined (any .cxx or .c files)
 CODE_SUBDIRS = monkeys stateAgents

 # The resulting library name will be or librepro.a
 TARGET_LIBRARY = librepro
 # One or more target executables. Each entry in TESTPROGRAMS will be compiled
 # against the above set of packages as well as the files specified in the SRC
 # declaration below.
 TESTPROGRAMS = repro.cxx 
 SRC 	+=   \
 	RouteStore.cxx \
 	UserStore.cxx \
 	ConfigStore.cxx \
 	AclStore.cxx \
 	Store.cxx \
 	AbstractDb.cxx \
 	BerkeleyDb.cxx \
 	CommandLineParser.cxx \
 	HttpBase.cxx \
 	HttpConnection.cxx \
 	WebAdmin.cxx \
 	WebAdminThread.cxx \
 	Proxy.cxx \
 	Registrar.cxx \
 	ReproServerAuthManager.cxx \
 	RequestContext.cxx \
 	ResponseContext.cxx \
        RequestProcessor.cxx \
        RequestProcessorChain.cxx \
        monkeys/DigestAuthenticator.cxx \
 	monkeys/StrictRouteFixup.cxx \
 	monkeys/AmIResponsible.cxx \
 	monkeys/IsTrustedNode.cxx \
 	monkeys/ConstantLocationMonkey.cxx \
 	monkeys/LocationServer.cxx \
 	monkeys/StaticRoute.cxx \
 	monkeys/StrictRouteFixup.cxx \

 # A conditional compilation to avoid building certain files if SSL is not being used 
 ifeq ($(USE_SSL), true)
 SRC +=	stateAgents/CertServer.cxx \
 	stateAgents/CertPublicationHandler.cxx \
 	stateAgents/CertSubscriptionHandler.cxx \
 	stateAgents/PrivateKeyPublicationHandler.cxx \
 # A set of definitions that must be included after everything else. 
 include $(BUILD)/

Build System Internals

Package Management

resiprocate packages

All of the package definitions for resiprocate are defined in sip/build/Makefile.pkg. For each package the following variables can be defined (optionally):

PACKAGE_LIBNAME       # base of the library name without lib prefix or library suffix
PACKAGE_LDFLAGS       # any parameters that should be passed to linker when this library is included
PACKAGE_LIBDIRS       # a space separated list of directories where related libraries are searched for
PACKAGE_LDLIBS_LAST   # a space separated list of libraries that should be included at the end of the lib list
PACKAGE_INCLUDEDIRS   # a space separated list of directories where related include files are searched for
PACKAGE_DEFINES       # a space separated list of definitions (e.g. -D foo) passed to compiler for this package

For example, the ARES package definition only specifies the following variables:

 ARES_INCLUDEDIRS := $(ROOT)/contrib/ares
 ARES_LIBDIRS := $(ROOT)/contrib/ares

The following is a current list of all packages in the resiprocate opensource project:

  • PTHREAD - pthread library
  • OPENSSL - openssl library for TLS and SSL development
  • ARES - asyncrhonous dns library
  • DUM - dialog usage manager library
  • RESIPROCATE - the basic transaction layer library of resiprocate

Build System Limitations