# comm.gmk: COMMON GNUMAKEFILE FRAGMENT # # $Id$ # Copyright (c) 2001 Ravenbrook Limited. See end of file for license. # # DESCRIPTION # # This makefile fragment is included in more specific makefiles for # platforms which use GNU make. # # PARAMETERS # # Assumes the following variables and definitions: # CFLAGSCOMPILER a list of flags for all compilations # CFLAGSDEBUG a list of flags for compilations with maximum debug # information, and any optimization possible # CFLAGSOPT a list of flags for compilations with maximum # optimization, and any debug info possible # CFLAGSOPTNODEBUG a list of flags for compilations with maximum # optimization, and absolutely no debug info # CC the command for the C compiler # LINKFLAGS a list of flags passed to the linker # ARFLAGSPFM platform-specific flags for ar # RANLIB the command to index a library (default: none needed) # gendep optionally defined to be a command sequence for # generating the dependency file (.d) from a C file (.c); # it is used in a rule of the form: # $(PFM)/$(VARIETY)/%.d: %.c # PFM platform code, e.g. "sus8gc" # LIBS extra libraries to include in tests (usually "-lm") # NOISY if defined and non-empty, causes commands to be emitted # MPMPF platform-dependent C sources for the "mpm" part # MPMS assembler sources for the "mpm" part (.s files) # MPMPS pre-processor assembler sources for the "mpm" part (.S files) # SWPF platform-dependent C sources for the "sw" part # # %%PART: Add a new parameter above for the files included in the part. # # EDITING # # To add new targets, varieties, and parts: # Search for the string "%%TARGET", "%%VARIETY", or "%%PART" in this # makefile and follow the instructions. If you're adding a part, you'll # have to change the makefiles for all the platforms which use this # makefile to define the source list for that part, and the GNUmakefile # to include a recursive call to the name of that part. # # CHECK PARAMETERS # # GNU make doesn't really have an "error" directive, but these lines # will cause it to exit with an error. # [These only test to see whether the symbol is defined. We could be # more thorough and test the syntax and content. -- richard 1995-09-07] ifndef CC error "comm.gmk: CC not defined" endif ifndef CFLAGSCOMPILER error "comm.gmk: CFLAGSCOMPILER not defined" endif ifndef CFLAGSDEBUG error "comm.gmk: CFLAGSDEBUG not defined" endif ifndef CFLAGSOPT error "comm.gmk: CFLAGSOPT not defined" endif ifndef CFLAGSOPTNODEBUG error "comm.gmk: CFLAGSOPTNODEBUG not defined" endif # # %%PART: Add checks for the parameter with the sources for the new # part. ifndef PFM error "comm.gmk: PFM not defined" endif ifndef MPMPF error "comm.gmk: MPMPF not defined" endif # DECLARATIONS ifdef NOISY ECHO = : else .SILENT: ECHO = echo endif .PHONY: phony # C FLAGS # Some flags depend on the target. Alas. ifdef TARGET ifeq ($(TARGET),mmsw.a) CFLAGSTARGET = -DCONFIG_PROD_EPCORE else ifeq ($(TARGET),replaysw) CFLAGSTARGET = -DCONFIG_PROD_EPCORE else ifeq ($(TARGET),mmdw.a) CFLAGSTARGET = -DCONFIG_PROD_DYLAN else ifeq ($(TARGET),replay) CFLAGSTARGET = -DCONFIG_PROD_DYLAN else CFLAGSTARGET = -DCONFIG_PROD_MPS endif endif endif endif endif # These flags are included in all compilations. CFLAGSCOMMON = $(PFMDEFS) $(CFLAGSTARGET) $(CFLAGSCOMPILER) # %%VARIETY: Define a macro containing the set of flags for the new # variety. # These flags are added to compilations for the indicated variety. CFWE = -DCONFIG_VAR_WE -DNDEBUG $(CFLAGSOPTNODEBUG) CFWI = -DCONFIG_VAR_WI -DNDEBUG $(CFLAGSOPT) CFHE = -DCONFIG_VAR_HE -DNDEBUG $(CFLAGSOPTNODEBUG) CFHI = -DCONFIG_VAR_HI -DNDEBUG $(CFLAGSOPT) CFII = -DCONFIG_VAR_II -DNDEBUG $(CFLAGSOPT) CFCE = -DCONFIG_VAR_CE $(CFLAGSOPTNODEBUG) CFCI = -DCONFIG_VAR_CI $(CFLAGSDEBUG) CFTI = -DCONFIG_VAR_TI $(CFLAGSDEBUG) # Bind CFLAGS to the appropriate set of flags for the variety. # %%VARIETY: Add a test for the variety and set CFLAGS here. ifeq ($(VARIETY),we) CFLAGS=$(CFLAGSCOMMON) $(CFWE) else ifeq ($(VARIETY),wi) CFLAGS=$(CFLAGSCOMMON) $(CFWI) else ifeq ($(VARIETY),he) CFLAGS=$(CFLAGSCOMMON) $(CFHE) else ifeq ($(VARIETY),hi) CFLAGS=$(CFLAGSCOMMON) $(CFHI) else ifeq ($(VARIETY),ii) CFLAGS=$(CFLAGSCOMMON) $(CFII) else ifeq ($(VARIETY),ce) CFLAGS=$(CFLAGSCOMMON) $(CFCE) else ifeq ($(VARIETY),ci) CFLAGS=$(CFLAGSCOMMON) $(CFCI) else ifeq ($(VARIETY),ti) CFLAGS=$(CFLAGSCOMMON) $(CFTI) else endif endif endif endif endif endif endif endif ARFLAGS=rc$(ARFLAGSPFM) # == Common definitions == # %%PART: Add your part here, unless it's platform-specific # These values are defined here because they have no variation between # platforms. AMC = poolamc.c AMS = poolams.c poolamsi.c AWL = poolawl.c LO = poollo.c SNC = poolsnc.c POOLN = pooln.c MVFF = poolmvff.c TESTLIB = testlib.c FMTDY = fmtdy.c fmtno.c FMTDYTST = fmtdy.c fmtno.c fmtdytst.c FMTHETST = fmthe.c fmtdy.c fmtno.c fmtdytst.c PLINTH = mpsliban.c mpsioan.c EVENTPROC = eventcnv.c eventpro.c table.c MPMCOMMON = mpsi.c mpm.c arenavm.c arenacl.c arena.c global.c locus.c \ tract.c walk.c reserv.c protocol.c pool.c poolabs.c \ trace.c root.c seg.c format.c buffer.c ref.c bt.c ring.c \ shield.c ld.c event.c sac.c message.c \ poolmrg.c poolmfs.c poolmv.c dbgpool.c dbgpooli.c \ boot.c meter.c splay.c cbs.c version.c MPM = $(MPMCOMMON) $(MPMPF) SWCOMMON = mpsi.c mpm.c arenavm.c arenacl.c arena.c global.c locus.c \ tract.c walk.c reserv.c protocol.c pool.c poolabs.c \ trace.c root.c seg.c format.c buffer.c ref.c bt.c ring.c \ shield.c ld.c event.c sac.c message.c \ poolmrg.c poolmfs.c poolmv.c dbgpool.c dbgpooli \ poolams.c poolamsi.c poolmvff.c \ boot.c meter.c splay.c cbs.c version.c mpsioan.c SW = $(SWCOMMON) $(SWPF) # These map the source file lists onto object files and dependency files # in the platform/variety directory. # # %%PART: Add a new macro which expands to the files included in the # part. ifdef VARIETY MPMOBJ = $(MPM:%.c=$(PFM)/$(VARIETY)/%.o) \ $(MPMS:%.s=$(PFM)/$(VARIETY)/%.o) MPMDEP = $(MPM:%.c=$(PFM)/$(VARIETY)/%.d) AMCOBJ = $(AMC:%.c=$(PFM)/$(VARIETY)/%.o) AMCDEP = $(AMC:%.c=$(PFM)/$(VARIETY)/%.d) AMSOBJ = $(AMS:%.c=$(PFM)/$(VARIETY)/%.o) AMSDEP = $(AMS:%.c=$(PFM)/$(VARIETY)/%.d) AWLOBJ = $(AWL:%.c=$(PFM)/$(VARIETY)/%.o) AWLDEP = $(AWL:%.c=$(PFM)/$(VARIETY)/%.d) LOOBJ = $(LO:%.c=$(PFM)/$(VARIETY)/%.o) LODEP = $(LO:%.c=$(PFM)/$(VARIETY)/%.d) SNCOBJ = $(SNC:%.c=$(PFM)/$(VARIETY)/%.o) SNCDEP = $(SNC:%.c=$(PFM)/$(VARIETY)/%.d) POOLNOBJ = $(POOLN:%.c=$(PFM)/$(VARIETY)/%.o) POOLNDEP = $(POOLN:%.c=$(PFM)/$(VARIETY)/%.d) MVFFOBJ = $(MVFF:%.c=$(PFM)/$(VARIETY)/%.o) MVFFDEP = $(MVFF:%.c=$(PFM)/$(VARIETY)/%.d) SWOBJ = $(SW:%.c=$(PFM)/$(VARIETY)/%.o) # The following hack for SWDEP only creates those dependencies when # a SW target is being built. ifdef TARGET ifeq ($(TARGET),mmsw.a) SWDEP = $(SW:%.c=$(PFM)/$(VARIETY)/%.d) else ifeq ($(TARGET),depend) SWDEP = $(SW:%.c=$(PFM)/$(VARIETY)/%.d) else SWDEP = endif endif endif TESTLIBOBJ = $(TESTLIB:%.c=$(PFM)/$(VARIETY)/%.o) TESTLIBDEP = $(TESTLIB:%.c=$(PFM)/$(VARIETY)/%.d) FMTDYOBJ = $(FMTDY:%.c=$(PFM)/$(VARIETY)/%.o) FMTDYDEP = $(FMTDY:%.c=$(PFM)/$(VARIETY)/%.d) FMTDYTSTOBJ = $(FMTDYTST:%.c=$(PFM)/$(VARIETY)/%.o) FMTHETSTOBJ = $(FMTHETST:%.c=$(PFM)/$(VARIETY)/%.o) FMTHETSTDEP = $(FMTHETST:%.c=$(PFM)/$(VARIETY)/%.d) PLINTHOBJ = $(PLINTH:%.c=$(PFM)/$(VARIETY)/%.o) PLINTHDEP = $(PLINTH:%.c=$(PFM)/$(VARIETY)/%.d) EVENTPROCOBJ = $(EVENTPROC:%.c=$(PFM)/$(VARIETY)/%.o) EVENTPROCDEP = $(EVENTPROC:%.c=$(PFM)/$(VARIETY)/%.d) endif # == Pseudo-targets == # %%TARGET: Add the target to the all dependencies, if it uses the # CONFIG_PROD_MPS configuration, to swall if CONFIG_PROD_EPCORE all: mpmss sacss amcss amcsshe amsss amssshe segsmss awlut awluthe \ mpsicv lockcov poolncv locv qs apss \ finalcv finaltest arenacv bttest teletest \ abqtest cbstest btcv mv2test messtest steptest \ eventcnv walkt0 libcbt \ mps.a mpsplan.a swall: mmsw.a replaysw # Runs the automatic tests that are built with CONFIG_PROD_MPS. # These tests are run overnight (see design.buildsys.overnight). # bttest & teletest cannot be run unattended # mv2test cannot be run because MV2 is broken # %%TARGET: If target is suitable for the overnight tests, then # add it here. testrun: mpmss apss sacss amcss amcsshe amsss amssshe segsmss awlut awluthe \ mpsicv lockcov poolncv locv qs finalcv finaltest arenacv \ abqtest cbstest btcv messtest steptest walkt0 $(^:%=date && $(PFM)/$(VARIETY)/% &&) true # These convenience targets allow one to type "make foo" to build target # foo in selected varieties (or none, for the latter rule). # # %%TARGET: Add a pseudo-target for the new target here. mpmss sacss amcss amcssth amcsshe amsss amssshe segsmss awlut awlutth \ awluthe mpsicv lockcov poolncv locv qs apss \ finalcv finaltest arenacv bttest teletest \ expt825 \ libcbt \ abqtest cbstest btcv mv2test \ messtest steptest \ walkt0 \ exposet0 \ eventcnv replay replaysw \ mps.a mmsw.a mpsplan.a mmdw.a: phony ifdef VARIETY $(MAKE) -f $(PFM).gmk TARGET=$@ variety else $(MAKE) -f $(PFM).gmk TARGET=$@ target endif # "clean" removes the directory containing the build results for the # platform. clean: phony $(ECHO) "$(PFM): $@" rm -rf "$(PFM)" # "target" builds some varieties of the target named in the TARGET macro. # %%VARIETY: Optionally, add a recursive make call for the new variety, # if it should be built by default. ifdef TARGET ifndef VARIETY target: phony $(MAKE) -f $(PFM).gmk VARIETY=hi variety $(MAKE) -f $(PFM).gmk VARIETY=ci variety $(MAKE) -f $(PFM).gmk VARIETY=ti variety $(MAKE) -f $(PFM).gmk VARIETY=wi variety endif endif # "variety" builds the target named in the TARGET macro using the # variety named in the VARIETY macro. ifdef VARIETY ifdef TARGET variety: $(PFM)/$(VARIETY)/$(TARGET) endif endif # GENUINE TARGETS # # Each line defines an executable or library target to be built and the # object files it is built from. These lines add dependencies to the # generic rules below, and should not include commands to execute. # # %%TARGET: Add the dependencies for the new target here. ifdef VARIETY $(PFM)/$(VARIETY)/finalcv: $(PFM)/$(VARIETY)/finalcv.o \ $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/finaltest: $(PFM)/$(VARIETY)/finaltest.o \ $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/expt825: $(PFM)/$(VARIETY)/expt825.o \ $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/libcbt: $(PFM)/$(VARIETY)/libcbt.o \ $(PFM)/$(VARIETY)/mpslibcb.o \ $(PFM)/$(VARIETY)/mpsioan.o \ $(MPMOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/locv: $(PFM)/$(VARIETY)/locv.o \ $(MPMOBJ) $(PLINTHOBJ) $(LOOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mpmss: $(PFM)/$(VARIETY)/mpmss.o \ $(MPMOBJ) $(PLINTHOBJ) $(MVFFOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/apss: $(PFM)/$(VARIETY)/apss.o \ $(MPMOBJ) $(PLINTHOBJ) $(MVFFOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/sacss: $(PFM)/$(VARIETY)/sacss.o \ $(MPMOBJ) $(PLINTHOBJ) $(MVFFOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/bttest: $(PFM)/$(VARIETY)/bttest.o \ $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/teletest: $(PFM)/$(VARIETY)/teletest.o \ $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/lockcov: $(PFM)/$(VARIETY)/lockcov.o \ $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mpsicv: $(PFM)/$(VARIETY)/mpsicv.o \ $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/amcss: $(PFM)/$(VARIETY)/amcss.o \ $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/amcssth: $(PFM)/$(VARIETY)/amcssth.o \ $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/amcsshe: $(PFM)/$(VARIETY)/amcsshe.o \ $(FMTHETSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/amsss: $(PFM)/$(VARIETY)/amsss.o \ $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMSOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/amssshe: $(PFM)/$(VARIETY)/amssshe.o \ $(FMTHETSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMSOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/segsmss: $(PFM)/$(VARIETY)/segsmss.o \ $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMSOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/awlut: $(PFM)/$(VARIETY)/awlut.o \ $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(LOOBJ) $(AWLOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/awluthe: $(PFM)/$(VARIETY)/awluthe.o \ $(FMTHETSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(LOOBJ) $(AWLOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/awlutth: $(PFM)/$(VARIETY)/awlutth.o \ $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(LOOBJ) $(AWLOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/poolncv: $(PFM)/$(VARIETY)/poolncv.o \ $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) $(POOLNOBJ) $(PFM)/$(VARIETY)/qs: $(PFM)/$(VARIETY)/qs.o \ $(AMCOBJ) $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/arenacv: $(PFM)/$(VARIETY)/arenacv.o \ $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/abqtest: $(PFM)/$(VARIETY)/abqtest.o \ $(PFM)/$(VARIETY)/abq.o $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/cbstest: $(PFM)/$(VARIETY)/cbstest.o \ $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/btcv: $(PFM)/$(VARIETY)/btcv.o \ $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mv2test: $(PFM)/$(VARIETY)/mv2test.o \ $(PFM)/$(VARIETY)/poolmv2.o $(PFM)/$(VARIETY)/abq.o \ $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/messtest: $(PFM)/$(VARIETY)/messtest.o \ $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/steptest: $(PFM)/$(VARIETY)/steptest.o \ $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/walkt0: $(PFM)/$(VARIETY)/walkt0.o \ $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/exposet0: $(PFM)/$(VARIETY)/exposet0.o \ $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/eventcnv: $(PFM)/$(VARIETY)/eventcnv.o \ $(PFM)/$(VARIETY)/eventpro.o $(PFM)/$(VARIETY)/table.o $(PFM)/$(VARIETY)/replay: $(PFM)/$(VARIETY)/replay.o \ $(PFM)/$(VARIETY)/eventrep.o \ $(PFM)/$(VARIETY)/eventpro.o $(PFM)/$(VARIETY)/table.o \ $(MPMOBJ) $(PLINTHOBJ) $(AWLOBJ) $(AMSOBJ) $(POOLNOBJ) \ $(AMCOBJ) $(SNCOBJ) $(MVFFOBJ) $(PFM)/$(VARIETY)/mps.a: $(MPMOBJ) $(AMCOBJ) $(SNCOBJ) $(MVFFOBJ) $(PFM)/$(VARIETY)/mmdw.a: $(MPMOBJ) $(AMCOBJ) $(LOOBJ) $(SNCOBJ) \ $(FMTDYOBJ) $(AWLOBJ) $(PFM)/$(VARIETY)/mpsplan.a: $(PLINTHOBJ) $(PFM)/$(VARIETY)/mmsw.a: \ $(SWOBJ) endif # GENERIC RULES # # These generate build output in the / directory. # Note that we can't used "mkdir -p" to create this directory because # it's broken (w.r.t. the man page) under OSF/1. # Object files define run-cc $(ECHO) "$(PFM): $@" test -d $(PFM) || mkdir $(PFM) test -d $(PFM)/$(VARIETY) || mkdir $(PFM)/$(VARIETY) $(CC) $(CFLAGS) -c -o $@ $< endef # .force: FORCE is a dependent that can be used to force targets to be # built. .PHONY: FORCE # A rule with no dependents and no commands always causes update. # (See GNUMake doc, make.info, Node: Force Targets) # (ignore the bit about using FORCE as being the same as using .PHONY # it's not, and we make use of that, see .special.version below) FORCE: # .special.version: version.o has a special rule so that it is always # built. This rule has no commands, this has the effect of adding the # dependents to those specified by other rules (in this case the implicit # .o:.c rule below, .rule.c-to-o). The extra dependent added is the # FORCE dependent (defined above, .force) which causes the target to be # always built. ifdef VARIETY $(PFM)/$(VARIETY)/version.o: FORCE endif # .rule.c-to-o: $(PFM)/$(VARIETY)/%.o: %.c $(run-cc) $(PFM)/$(VARIETY)/%.o: %.s $(run-cc) $(PFM)/$(VARIETY)/%.o: %.S $(run-cc) # Dependencies # # These are included into _this_ makefile (see below). GNU make does the # right thing as long as it knows how to make the dependency files before # including them. ifdef gendep $(PFM)/$(VARIETY)/%.d: %.c $(ECHO) "$(PFM): $@" test -d $(PFM) || mkdir $(PFM) test -d $(PFM)/$(VARIETY) || mkdir $(PFM)/$(VARIETY) $(gendep) ifdef VARIETY ifdef TARGET # %%PART: Add the dependency file macro for the new part here. include $(MPMDEP) $(AMSDEP) $(AMCDEP) $(LODEP) $(SWDEP) \ $(AWLDEP) $(POOLNDEP) $(TESTLIBDEP) $(FMTDYDEP) $(FMTHETSTDEP) \ $(PLINTHDEP) $(EVENTPROCDEP) endif endif endif # Library ifndef RANLIB RANLIB = : endif $(PFM)/$(VARIETY)/%.a: $(ECHO) "$(PFM): $@" rm -f $@ $(AR) $(ARFLAGS) $@ $^ $(RANLIB) $@ # Executable $(PFM)/$(VARIETY)/%: $(ECHO) "$(PFM): $@" $(CC) $(LINKFLAGS) -o $@ $^ $(LIBS) # C. COPYRIGHT AND LICENSE # # Copyright (C) 2001-2002 Ravenbrook Limited . # All rights reserved. This is an open source license. Contact # Ravenbrook for commercial licensing options. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Redistributions in any form must be accompanied by information on how # to obtain complete source code for this software and any accompanying # software that uses this software. The source code must either be # included in the distribution or be available for no more than the cost # of distribution plus a nominal fee, and must be freely redistributable # under reasonable conditions. For an executable file, complete source # code means the source code for all modules it contains. It does not # include source code for modules or files that typically accompany the # major components of the operating system on which the executable file # runs. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS # IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR # PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.