From c4507d01a17de09ba77a3f660f316279b86eafb6 Mon Sep 17 00:00:00 2001
From: zimoch <zimoch>
Date: Wed, 7 Nov 2012 08:40:27 +0000
Subject: [PATCH] Restructuring for 3.15 Change in USE_LIBVERSION policy
 Support multiple test versions Allow to exclude target architectures

---
 App/tools/driver.makefile | 370 +++++++++++++++++---------------------
 1 file changed, 167 insertions(+), 203 deletions(-)

diff --git a/App/tools/driver.makefile b/App/tools/driver.makefile
index 3ff4eb5d..f9515299 100644
--- a/App/tools/driver.makefile
+++ b/App/tools/driver.makefile
@@ -1,6 +1,6 @@
 # driver.makefile
 #
-# $Header: /cvs/G/DRV/misc/App/tools/driver.makefile,v 1.85 2012/10/04 11:54:56 zimoch Exp $
+# $Header: /cvs/G/DRV/misc/App/tools/driver.makefile,v 1.86 2012/11/07 08:40:27 zimoch Exp $
 #
 # This generic makefile compiles EPICS code (drivers, records, snl, ...)
 # for all installed EPICS versions in parallel.
@@ -33,8 +33,8 @@
 # with the PROJECT variable in your Makefile).
 # A version number is appended to the name which is derived from
 # the latest CVS tag on the files in the source directory.
-# If any file is not up-to-date in CVS, not tagged, or tagged differently
-# from the other files, the version is called "test".
+# If any file is not up-to-date in CVS, not tagged, or tagged differently from the
+# other files, the version is a test version and labelled with the user name.
 # The library is installed to ${INSTALL_ROOT}/R${EPICSVERSION}/${T_A}.
 # Symbolic links are set to the latest version, the highest minor release
 # if each major release, and the highest patch level of each minor release.
@@ -63,6 +63,8 @@
 #    If not defined, all headers are for local use only.
 # EXCLUDE_VERSIONS
 #    EPICS versions to skip. Usually 3.13 or 3.14
+# EXCLUDE_ARCHS
+#    Skip architectures that start or end with the pattern, e.g. T2 or ppc604 
 
 # get the location of this file 
 MAKEHOME:=$(dir $(lastword ${MAKEFILE_LIST}))
@@ -72,26 +74,39 @@ USERMAKEFILE:=$(lastword $(filter-out $(lastword ${MAKEFILE_LIST}), ${MAKEFILE_L
 # Some configuration
 DEFAULT_EPICS_VERSIONS = 3.13.9 3.13.10 3.14.8 3.14.12
 BUILDCLASSES = vxWorks
-ifdef INSTBASE
+INSTBASE ?= /work
 INSTALL_ROOT=${INSTBASE}/iocBoot
-else
-INSTALL_ROOT=/work/iocBoot
-endif
 EPICS_LOCATION = /usr/local/epics
+SNCSEQ=${EPICS_BASE}/../seq
 
 DOCUEXT = txt html htm doc pdf ps tex dvi gif jpg png
 DOCUEXT += TXT HTML HTM DOC PDF PS TEX DVI GIF JPG PNG
-DOCUEXT += template db subst script
-VERSIONFILE = ${PRJ}_Version${LIBVERSION}.c
-REGISTRYFILE = ${PRJ}_registerRecordDeviceDriver.cpp
-EXPORTFILE = ${PRJ}_exportAddress.c
-SUBFUNCFILE = ${PRJ}_subRecordFunctions.dbd
+DOCUEXT += template db dbt subs subst substitutions script
+
+GLOBALPROJECTS = /PROJECTS/drivers/ /DRV/ /IOCMON/ /CRLOGIC/
+
+#override config here
+-include ${MAKEHOME}/config
+
+# Are we in an IOC project directory?
+# YES:
+#   - Don't use versions.
+#   - Install to IOC directory with slsinstall.
+#   - Use for local code (snl, subroutine records, etc.)
+#   - Autodetected: SLS beamline and machine, PROSCAN, FEL
+# NO:
+#   - Get version number from CVS tag.
+#   - Install to driver pool with make install.
+#   - Use for drivers and other modules of global interest.
+#   - This is the default.
+# User can overwrite USE_LIBVERSION in the Makefile.
+
+# Where are we in CVS (or in PWD if no CVS is around)?
+THISDIR := $(if $(wildcard CVS/Repository),$(shell cat CVS/Repository),${PWD})
+USE_LIBVERSION = $(if $(strip $(foreach d,${GLOBALPROJECTS},$(findstring $d,${THISDIR}))),YES,NO)
 
 # Some shortcuts
 MAKEVERSION = ${MAKE} -f ${USERMAKEFILE} LIBVERSION=${LIBVERSION}
-ifdef LIBVERSION
-LIBVERSIONSTR=-${LIBVERSION}
-endif
 
 # Some shell commands
 LN = ln -s
@@ -100,8 +115,11 @@ NM = nm
 RMDIR = rm -rf
 RM = rm -f
 
-REPOSITORY_HOST = pc770
-CP_PROD = repository -H ${REPOSITORY_HOST} add
+# some generated file names
+VERSIONFILE = ${PRJ}_Version${LIBVERSION}.c
+REGISTRYFILE = ${PRJ}_registerRecordDeviceDriver.cpp
+EXPORTFILE = ${PRJ}_exportAddress.c
+SUBFUNCFILE = ${PRJ}_subRecordFunctions.dbd
 
 ifndef EPICSVERSION
 ## RUN 1
@@ -114,58 +132,14 @@ MISSING_EPICS_VERSIONS = $(filter-out ${BUILD_EPICS_VERSIONS},${EPICS_VERSIONS})
 BUILD_EPICS_VERSIONS = $(filter ${INSTALLED_EPICS_VERSIONS},${EPICS_VERSIONS})
 EPICS_VERSIONS_3.13 = $(filter 3.13.%,${BUILD_EPICS_VERSIONS})
 EPICS_VERSIONS_3.14 = $(filter 3.14.%,${BUILD_EPICS_VERSIONS})
+EPICS_VERSIONS_3.15 = $(filter 3.15.%,${BUILD_EPICS_VERSIONS})
 
-# Are we in an IOC project directory?
-# YES:
-#   - Don't use versions.
-#   - Install to IOC directory with slsinstall.
-#   - Use for local code (snl, subroutine records, etc.)
-#   - Autodetected: SLS beamline and machine, PROSCAN, FEL
-# NO:
-#   - Get version number from CVS tag.
-#   - Install to driver pool with make install.
-#   - Use for drivers and other modules of global interest.
-#   - This is the default.
-# User can overwrite USE_LIBVERSION in the Makefile.
-USE_LIBVERSION = YES
-
-# Where are we in CVS (or in PWD if no CVS is around)?
-THISDIR := ${PWD}
-ifneq ($(wildcard CVS/Repository),)
-THISDIR := /$(shell cat CVS/Repository)
-endif
-
-ifneq ($(findstring /PROJECTS/subsystems/,${THISDIR}),)
-#in PROJECTS/subsystems/ project directory (obsolete)
-USE_LIBVERSION = NO
-endif
-ifneq ($(findstring /X/,${THISDIR}),)
-#in SLS beamline project directory
-USE_LIBVERSION = NO
-endif
-ifneq ($(findstring /A/,${THISDIR}),)
-#in SLS machine project directory
-USE_LIBVERSION = NO
-endif
-ifneq ($(findstring /P/,${THISDIR}),)
-#in PROSCAN project directory
-USE_LIBVERSION = NO
-endif
-ifneq ($(findstring /F/,${THISDIR}),)
-#in FEL project directory
-USE_LIBVERSION = NO
-endif
-ifneq ($(findstring /TRAINING/,${THISDIR}),)
-#in FEL project directory
-USE_LIBVERSION = NO
-endif
-
-VERSIONCHECKFILES = ${SOURCES} ${SOURCES_3.13} ${SOURCES_3.14} ${DBDS} ${DBDS_3.13} ${DBD_3.14}
+VERSIONCHECKFILES = ${SOURCES} ${DBDS} $(foreach v,3.13 3.14 3.15, ${SOURCES_$v} ${DBDS_$v})
 VERSIONCHECKCMD = ${MAKEHOME}/getVersion.tcl ${VERSIONCHECKFILES}
-LIBVERSION_YES = $(shell ${VERSIONCHECKCMD} 2>/dev/null)
+LIBVERSION_YES = $(or $(filter-out test,$(shell ${VERSIONCHECKCMD} 2>/dev/null)),${USER},test)
 LIBVERSION_Yes = $(LIBVERSION_YES)
 LIBVERSION_yes = $(LIBVERSION_YES)
-LIBVERSION = ${LIBVERSION_${USE_LIBVERSION}}
+LIBVERSION := ${LIBVERSION_${USE_LIBVERSION}}
 
 # Default project name is name of current directory.
 # But don't use "src" or "snl", go up directory tree instead.
@@ -182,7 +156,7 @@ build::
 
 clean::
 	$(RMDIR) O.*
-	find . -name "*~" -exec $(RM) {} \;
+#	find . -name "*~" -exec $(RM) {} \;
 
 clean.3.%::
 	$(RMDIR) O.${@:clean.%=%}*
@@ -204,9 +178,10 @@ help:
 	@echo "  TEMPLATES        ()"
 	@echo "  DBDS             (*.dbd)"
 	@echo "  EXCLUDE_VERSIONS () [versions not to build, e.g. 3.14]"
+	@echo "  EXCLUDE_ARCHS    () [target architectures not to build, e.g. embeddedlinux]"
 	@echo "  BUILDCLASSES     (vxWorks) [other choices: Linux]"
 
-# "make version" shows the the version and why it is how it is.       
+# "make version" shows the version and why it is how it is.       
 version:
 	@${VERSIONCHECKCMD}
 
@@ -217,6 +192,7 @@ debug::
 	@echo "EPICS_VERSIONS_3.13 = ${EPICS_VERSIONS_3.13}"
 	@echo "EPICS_VERSIONS_3.14 = ${EPICS_VERSIONS_3.14}"
 	@echo "BUILDCLASSES = ${BUILDCLASSES}"
+	@echo "USE_LIBVERSION = ${USE_LIBVERSION}"
 	@echo "LIBVERSION = ${LIBVERSION}"
 
 # Loop over all EPICS versions for second run.
@@ -227,21 +203,18 @@ build install uninstall install-headers install-doc install-templates debug::
 # Handle cases where user requests 3.13 or 3.14 
 # make <action>.3.13 or make <action>.3.14 instead of make <action> or
 # make 3.13 or make 3.14 instread of make
-3.13:
-	for VERSION in ${EPICS_VERSIONS_3.13}; do \
-	${MAKEVERSION} EPICSVERSION=$$VERSION build || exit; done
 
-%.3.13:
-	for VERSION in ${EPICS_VERSIONS_3.13}; do \
-	${MAKEVERSION} EPICSVERSION=$$VERSION ${@:%.3.13=%} || exit; done
+define VERSIONRULES
+$(1):
+	for VERSION in $${EPICS_VERSIONS_$(1)}; do \
+	$${MAKEVERSION} EPICSVERSION=$$$$VERSION build || exit; done
 
-3.14:
-	for VERSION in ${EPICS_VERSIONS_3.14}; do \
-	${MAKEVERSION} EPICSVERSION=$$VERSION build || exit; done
+%.$(1):
+	for VERSION in $${EPICS_VERSIONS_$(1)}; do \
+	$${MAKEVERSION} EPICSVERSION=$$$$VERSION $${@:%.$(1)=%} || exit; done
+endef
 
-%.3.14:
-	for VERSION in ${EPICS_VERSIONS_3.14}; do \
-	${MAKEVERSION} EPICSVERSION=$$VERSION ${@:%.3.14=%} || exit; done
+$(foreach v,3.13 3.14 3.15,$(eval $(call VERSIONRULES,$v)))
 
 # Handle cases where user requests one specific version
 # make <action>.<version> instead of make <action> or
@@ -271,7 +244,7 @@ else # EPICSVERSION
 
 EPICS_BASE=${EPICS_LOCATION}/base-${EPICSVERSION}
 
-ifneq ($(filter 3.14.%,$(EPICSVERSION)),)
+ifneq ($(filter 3.14.% 3.15.% ,$(EPICSVERSION)),)
 EPICS_BASETYPE=3.14
 
 # There is no 64 bit support before 3.14.12 
@@ -283,26 +256,10 @@ export USR_CXXFLAGS_$(EPICS_HOST_ARCH) += -m32
 export USR_LDFLAGS_$(EPICS_HOST_ARCH) += -m32
 endif
 endif
-endif # 3.14
-ifneq ($(filter 3.13.%,$(EPICSVERSION)),)
-EPICS_BASETYPE=3.13
-endif # 3.13
 
-# Is a version requested which is not installed?
-# Look if ${EPICS_BASE}/config/CONFIG file exists.
-${EPICS_BASE}/config/CONFIG:
+${EPICS_BASE}/configure/CONFIG:
 	@echo "ERROR: EPICS release ${EPICSVERSION} not installed on this host."
-	@if [ `hostname -i` != slslc03 ]; then \
-	    echo "ERROR: Try to log in on slslc."; \
-	fi
 
-# Include and overwrite default config for this EPICS version
-# This is how a "normal" EPICS Makefile.Vx would start.
-ifeq (${EPICS_BASETYPE},3.13)
--include ${EPICS_BASE}/config/CONFIG
-OBJ=.o
-export BUILD_TYPE=Vx
-else # 3.14
 # Some TOP and EPICS_BASE tweeking necessary to work around release check in 3.14.10+
 CONFIG=${EPICS_BASE}/configure
 EB=${EPICS_BASE}
@@ -311,8 +268,22 @@ TOP:=${EPICS_BASE}
 EPICS_BASE:=${EB}
 SHRLIB_VERSION=
 COMMON_DIR = O.${EPICSVERSION}_Common
+# do not link *everything* with readline (and curses)
+COMMANDLINE_LIBRARY =
 endif # 3.14
-INSTALL_LOCATION= ${INSTALL_ROOT}/R${EPICSVERSION}
+
+ifneq ($(filter 3.13.%,$(EPICSVERSION)),)
+
+EPICS_BASETYPE=3.13
+${EPICS_BASE}/config/CONFIG:
+	@echo "ERROR: EPICS release ${EPICSVERSION} not installed on this host."
+
+-include ${EPICS_BASE}/config/CONFIG
+OBJ=.o
+export BUILD_TYPE=Vx
+endif # 3.13
+
+INSTALL_LOCATION = ${INSTALL_ROOT}/R${EPICSVERSION}
 
 ifndef T_A
 ### RUN 2
@@ -335,8 +306,7 @@ ifeq (${EPICS_BASETYPE},3.14)
 DBDFILES += $(patsubst %.st,%_snl.dbd,$(notdir $(filter %.st,${SRCS})))
 DBDFILES += $(patsubst %.stt,%_snl.dbd,$(notdir $(filter %.stt,${SRCS})))
 endif # 3.14
-PROJECTDBD=${PRJ}${LIBVERSIONSTR}.dbd
-export DBDFILES PROJECTDBD     
+export DBDFILES
 
 RECORDS1 = $(patsubst %Record.dbd,%,$(notdir $(filter %Record.dbd, ${DBDFILES})))
 RECORDS2 = $(shell ${MAKEHOME}/expandDBD.tcl -r $(addprefix -I, $(sort $(dir ${DBDFILES}))) $(realpath ${DBDS}))
@@ -365,6 +335,7 @@ export DOCU
 ifeq (${EPICS_BASETYPE},3.14)
 CROSS_COMPILER_TARGET_ARCHS += ${EPICS_HOST_ARCH}
 endif # 3.14
+CROSS_BUILDS = $(filter-out $(addprefix %,${EXCLUDE_ARCHS}),$(filter-out $(addsuffix %,${EXCLUDE_ARCHS}),${CROSS_COMPILER_TARGET_ARCHS}))
 
 SRCS_Linux = ${SOURCES_Linux}
 SRCS_Linux += ${SOURCES_${EPICS_BASETYPE}_Linux}
@@ -384,22 +355,27 @@ DBDFILES_vxWorks += ${DBDS_vxWorks_${EPICS_BASETYPE}}
 export DBDFILES_vxWorks
 
 # Do not install without version
-install uninstall install-headers::
 ifndef LIBVERSION
+install uninstall install-headers::
 	@echo "ERROR: Can't $@ without LIBVERSION defined"
 	@exit 1
 endif # !LIBVERSION
 
+install build install-headers debug::
+	@echo "MAKING EPICS VERSION R${EPICSVERSION}"
+
 debug::
+	@echo "EPICS_BASE = ${EPICS_BASE}"
 	@echo "EPICSVERSION = ${EPICSVERSION}" 
 	@echo "EPICS_BASETYPE = ${EPICS_BASETYPE}" 
 	@echo "CROSS_COMPILER_TARGET_ARCHS = ${CROSS_COMPILER_TARGET_ARCHS}"
-	@echo "EPICS_BASE = ${EPICS_BASE}"
+	@echo "EXCLUDE_ARCHS = ${EXCLUDE_ARCHS}"
+	@echo "CROSS_BUILDS = ${CROSS_BUILDS}"
 	@echo "INSTALL_LOCATION = ${INSTALL_LOCATION}"
 	@echo "LIBVERSION = ${LIBVERSION}"
+	@echo "RELEASE_TOPS = ${RELEASE_TOPS}"
 
 install build install-headers debug:: .cvsignore
-	@echo "MAKING EPICS VERSION R${EPICSVERSION}"
 # Delete old build if INSTBASE has changed.
 # Create build dirs (and links) if necessary 
 ifeq (${EPICS_BASETYPE},3.14)
@@ -407,7 +383,7 @@ ifeq (${EPICS_BASETYPE},3.14)
             mkdir -p O.${EPICSVERSION}_Common; \
         fi
 endif
-	@for ARCH in ${CROSS_COMPILER_TARGET_ARCHS}; do \
+	@for ARCH in ${CROSS_BUILDS}; do \
             echo ${INSTBASE} | cmp -s O.${EPICSVERSION}_$$ARCH/INSTBASE - || $(RMDIR) O.${EPICSVERSION}_$$ARCH; \
 	    if [ ! -d O.${EPICSVERSION}_$$ARCH ]; then \
 	        mkdir -p O.${EPICSVERSION}_$$ARCH; \
@@ -425,7 +401,7 @@ endif
 # No need to create O.${T_A} subdirectory here:
 uninstall install-doc install-templates::
 	@echo "MAKING EPICS VERSION R${EPICSVERSION}"
-	for ARCH in ${CROSS_COMPILER_TARGET_ARCHS}; do \
+	for ARCH in ${CROSS_BUILDS}; do \
 	${MAKEVERSION} T_A=$$ARCH $@; done
 
 else # T_A
@@ -435,28 +411,34 @@ else # T_A
 # still in source directory for uninstall, install-doc, install-templates
 
 ifeq ($(filter ${OS_CLASS},${OS_CLASS_LIST}),)
-# Just print note if this OS_CLASS is not one of BUILDCLASSES
 
+install%: build
+install: build
 build%: build
 build:
-	@echo Skipping ${T_A} because ${OS_CLASS} is not in BUILDCLASSES
+	@echo Skipping ${T_A} because $(if ${OS_CLASS},${OS_CLASS} is not in BUILDCLASSES = ${BUILDCLASSES},it is not included in this installation.)
 %:
 	@true
 
 else ifeq ($(wildcard $(firstword ${CC})),)
-# Print warning if compiler is not installed on this machine.
 
-install% : build
+install%: build
 install: build
 build%: build
 build:
-	@echo Warning: Skipping ${T_A} because cross compiler ${CC} is not installed
+	@echo Warning: Skipping ${T_A} because cross compiler $(firstword ${CC}) is not installed.
 %:
 	@true
 
 else
 
 CFLAGS += ${EXTRA_CFLAGS}
+
+LIBVERSIONSTR = $(if ${LIBVERSION},-${LIBVERSION})
+TESTVERSION := $(shell echo "${LIBVERSION}" | grep -v -E "^[0-9]+\.[0-9]+\.[0-9]+\$$")
+PROJECTDBD=${if ${DBDFILES},${PRJ}${LIBVERSIONSTR}.dbd}
+DEPFILE = ${PRJ}${LIBVERSIONSTR}.dep
+
 INSTALL_BIN = ${INSTALL_LOCATION}/${T_A}
 INSTALL_DOC = $(dir ${INSTALL_LOCATION})driverdoc
 INSTALL_TEMPL = $(dir ${INSTALL_LOCATION})templates
@@ -467,23 +449,13 @@ INSTALL_DOCUS = $(addprefix ${INSTALL_DOC}/${PRJ}/,$(notdir ${DOCU}))
 INSTALL_TEMPLATES = $(addprefix ${INSTALL_TEMPL}/,$(subst .,${LIBVERSIONSTR}.,$(notdir ${TEMPLS})))
 INSTALL_DEP = ${INSTALL_BIN}/${DEPFILE}
 
-DEPFILE = ${PRJ}${LIBVERSIONSTR}.dep
-
 INSTALLDIRS = ${INSTALL_LOCATION} ${INSTALL_INCLUDE} ${INSTALL_BIN} 
 INSTALLDIRS += ${INSTALL_DBD} ${INSTALL_DOC} ${INSTALL_DOC}/${PRJ}
 INSTALLDIRS += ${INSTALL_TEMPL} 
 
-ifeq (${EPICS_BASETYPE},3.14)
-COMMON_DIR = ../O.${EPICSVERSION}_Common
-else
-COMMON_DIR = .
-endif
-
-ifeq ($(words ${DBDFILES}),0)
-PROJECTDBD=
-endif # !DBDFILES
-
-#INSTALL = install -m 444
+COMMON_DIR_3.14 = ../O.${EPICSVERSION}_Common
+COMMON_DIR_3.13 = .
+COMMON_DIR = ${COMMON_DIR_${EPICS_BASETYPE}}
 
 debug::
 	@echo "BUILDCLASSES = ${BUILDCLASSES}"
@@ -504,24 +476,28 @@ debug::
 	@echo "DBDS_${EPICS_BASETYPE} = ${DBDS_${EPICS_BASETYPE}}"
 	@echo "DBDS_${OS_CLASS} = ${DBDS_${OS_CLASS}}"
 	@echo "DBDFILES = ${DBDFILES}"
+	@echo "LIBVERSION = ${LIBVERSION}"
+	@echo "TESTVERSION = ${TESTVERSION}"
 
 ifeq (${EPICS_BASETYPE},3.13)
-install:: build ${INSTALLDIRS} ${INSTALL_HDRS} ${INSTALL_TEMPLATES}
+INSTALLRULE=install::
+BUILDRULE=build::
+BASERULES=${EPICS_BASE}/config/RULES.Vx
 else # 3.14
-install: build ${INSTALLDIRS} ${INSTALL_HDRS} ${INSTALL_TEMPLATES}
+INSTALLRULE=install:
+BUILDRULE=build:
+BASERULES=${EPICS_BASE}/configure/RULES
 endif # 3.14
 
+$(INSTALLRULE) build ${INSTALLDIRS} ${INSTALL_HDRS} ${INSTALL_TEMPLATES}
+
 install-headers:: ${INSTALL_LOCATION} ${INSTALL_INCLUDE}
 install-headers:: ${INSTALL_HDRS}
 install-templates:: ${INSTALL_TEMPLATES}
 install-doc:: ${INSTALL_LOCATION} ${INSTALL_DOC} ${INSTALL_DOC}/${PRJ} ${INSTALL_DOCUS}
 
 #link only non-test versions
-ifneq (${LIBVERSION},test)
-SETLINKS=${MAKEHOME}setLinks.tcl
-else
-SETLINKS=@\#
-endif
+SETLINKS=$(if ${TESTVERSION},@\#,${MAKEHOME}setLinks.tcl)
 
 ${INSTALLDIRS}:
 	mkdir -m 775 $@
@@ -608,16 +584,27 @@ LIBOBJS += $(patsubst %,../%,$(filter-out /%,$(filter %.o %.a,${SRCS})))
 LIBOBJS += ${LIBRARIES:%=${INSTALL_BIN}/%Lib}
 LIBNAME = ${PROJECTLIB}
 
+#add munched library for C++ code (does not work for Tornado 1)
+ifneq ($(filter %.cc %.cpp %.C,${SRCS}),)
+ifeq ($(filter T1-%,${T_A}),)
+PROD = ${PROJECTLIB}.munch
+endif # T1- T_A
+endif # .cc or .cpp found
+
 else # only 3.14 from here
 
 ifeq (${OS_CLASS},vxWorks)
-PROJECTLIB = $(if ${LIBOBJS},${PRJ}Lib${LIBVERSIONSTR},)
-else # !vxWorks
-PROJECTLIB = $(if ${LIBOBJS},${LIB_PREFIX}${PRJ}${LIBVERSIONSTR}${SHRLIB_SUFFIX},)
-endif # !vxWorks
+SHRLIB_SUFFIX=.munch
+LIB_PREFIX=
+LIB_INFIX=Lib
+# only install the munched lib
+INSTALL_PROD=
+endif
+
+PROJECTLIB = $(if ${LIBOBJS},${LIB_PREFIX}${PRJ}${LIB_INFIX}${LIBVERSIONSTR}${SHRLIB_SUFFIX},)
 
 # vxWorks
-PROD_vxWorks=${PROJECTLIB}.
+PROD_vxWorks=${PROJECTLIB}
 LIBOBJS += $(addsuffix $(OBJ),$(notdir $(basename $(filter-out %.o %.a,$(sort ${SRCS})))))
 LIBOBJS += ${LIBRARIES:%=${INSTALL_BIN}/%Lib}
 LIBS = -L ${EPICS_BASE_LIB} ${BASELIBS:%=-l%}
@@ -627,11 +614,6 @@ PRODUCT_OBJS = ${LIBOBJS}
 # Linux
 LOADABLE_LIBRARY=$(if ${LIBOBJS},${PRJ}${LIBVERSIONSTR},)
 LIBRARY_OBJS = ${LIBOBJS}
-ifneq ($(words $(filter %.st %.stt,${SRCS})),0)
-# now seq is a normal module found by require
-#SHRLIB_SEARCH_DIRS += $(EPICS_LOCATION)/seq/lib/$(T_A)
-#LIB_LIBS += pv seq
-endif # .st  or .stt
 
 # Handle registry stuff automagically if we have a dbd file.
 # See ${REGISTRYFILE} and ${EXPORTFILE} rules below.
@@ -649,11 +631,11 @@ endif # LIBVERSION
 endif # PROJECTLIB
 
 ifdef LIBVERSION
-ifneq (${LIBVERSION},test)
+ifndef TESTVERSION
 # Provide a global symbol for every version with the same
 # major and equal or smaller minor version number.
-# Other code using this will look for one of those symbols.
-# Add an undefined symbol for the version of every used driver.
+# OUTDATED: Other code using this will look for one of those symbols.
+# NOT ANY MORE: Add an undefined symbol for the version of every used driver.
 # This is done with the #define in the used headers (see below).
 MAJOR_MINOR_PATCH=$(subst ., ,${LIBVERSION})
 MAJOR=$(word 1,${MAJOR_MINOR_PATCH})
@@ -667,14 +649,14 @@ endif # vxWorks
 ifeq (${OS_CLASS}, Linux)
 PROVIDES = ${ALLMINORS:%=-Wl,--defsym,${PRJ}Lib_${MAJOR}.%=0}
 endif # Linux
-endif # !test
+endif # TESTVERSION
 endif # LIBVERSION defined
 
 LDFLAGS += ${PROVIDES} ${USR_LDFLAGS_${T_A}}
 
 # Create and include dependency files
 CPPFLAGS += -MD
-# 3.14.12 already defines -MDD here:
+# 3.14.12 already defines -MDD here (what we don't want):
 HDEPENDSCFLAGS =
 -include *.d
 
@@ -694,32 +676,31 @@ USR_DBDFLAGS += $(DBDEXPANDPATH)
 
 ifeq (${EPICS_BASETYPE},3.13)
 USR_INCLUDES += $(addprefix -I, $(sort $(dir ${SRCS:%=../%} ${HDRS:%=../%})))
-build:: PROJECTINFOS ${PROJECTDBD} $(addprefix ${COMMON_DIR}/,$(addsuffix Record.h,${RECORDS})) ${PROJECTLIB}
-.PHONY:: PROJECTINFOS
-ifneq ($(filter %.cc %.cpp %.C,${SRCS}),)
-ifneq (${T_A},T1-ppc604)
-#add munched library for C++ code (does not work for T1-ppc604)
-PROD += ${PROJECTLIB}.munch
-endif # T1-ppc604
-endif # .cc or .cpp found
+
 else # 3.14
 
 # different macros for 3.14.12 and earlier versions
 SRC_INCLUDES = $(addprefix -I, $(sort $(dir ${SRCS:%=../%} ${HDRS:%=../%})))
 GENERIC_SRC_INCLUDES = $(SRC_INCLUDES)
 
-build: PROJECTINFOS ${PROJECTDBD} $(addprefix ${COMMON_DIR}/,$(addsuffix Record.h,${RECORDS}))
-.PHONY: PROJECTINFOS
 EXPANDARG = -3.14
 ifneq ($(words $(filter %.c %.cc %.C %.cpp, $(SRCS))),0)
 DBDFILES+=${SUBFUNCFILE}
 endif
+
+# snc location in 3.14
+#-include ${SNCSEQ}/configure/RULES_BUILD # incompatible to 3.15
+SNC=${SNCSEQ}/bin/$(EPICS_HOST_ARCH)/snc
+SNC_CFLAGS=-I ${SNCSEQ}/include
+
 endif # 3.14
 
+${BUILDRULE} PROJECTINFOS ${PROJECTDBD} $(addprefix ${COMMON_DIR}/,$(addsuffix Record.h,${RECORDS})) ${DEPFILE}
+
 PROJECTINFOS:
 	@echo ${PRJ} > PROJECTNAME
 	@echo ${INSTBASE} > INSTBASE
-	@echo ${PROJECTLIB} ${PROJECTLIB}.munch ${PROJECTDBD} ${DEPFILE} > PRODUCTS
+	@echo ${PROJECTLIB} ${PROJECTDBD} ${DEPFILE} > PRODUCTS
 
 # Build one dbd file by expanding all source dbd files.
 # We can't use dbExpand (from the default EPICS make rules)
@@ -729,21 +710,21 @@ ${PROJECTDBD}: ${DBDFILES}
 	${MAKEHOME}/expandDBD.tcl ${EXPANDARG} ${DBDEXPANDPATH} $^ > $@
 
 # Install everything and set up symbolic links
-${INSTALL_BIN}/${PROJECTLIB}.munch: ${PROJECTLIB}.munch
-	@echo "Installing munched library $@"
-	$(RM) $@
-	cp $^ $@
-	chmod 444 $@
-	$(SETLINKS) ${INSTALL_BIN} .munch ${PRJ}Lib
-
 ifeq (${EPICS_BASETYPE},3.14)
 ${INSTALL_BIN}/${PROJECTLIB}: ${PROJECTLIB}
 	@echo "Installing library $@"
 	$(RM) $@
 	cp $^ $@
 	chmod 444 $@
-	$(SETLINKS) ${INSTALL_BIN} .so lib${PRJ}
+	$(SETLINKS) ${INSTALL_BIN} ${SHRLIB_SUFFIX} ${LIB_PREFIX}${PRJ}${LIB_INFIX}
 else
+${INSTALL_BIN}/${PROJECTLIB}.munch: ${PROJECTLIB}.munch
+	@echo "Installing munched library $@"
+	$(RM) $@
+	cp $^ $@
+	chmod 444 $@
+	$(SETLINKS) ${INSTALL_BIN} .munch ${PRJ}Lib
+
 ${INSTALL_BIN}/${PROJECTLIB}: ${PROJECTLIB}
 	@echo "Installing library $@"
 	$(RM) $@
@@ -764,7 +745,7 @@ ${INSTALL_DBD}/%.dbd: %.dbd
 	$(RM) $@
 	cp $^ $@
 	chmod 444 $@
-	$(SETLINKS) ${INSTALL_DBD} .dbd ${^:%${LIBVERSIONSTR}.dbd=%}
+	$(SETLINKS) ${INSTALL_DBD} .dbd ${PRJ}
 
 # Add a #define so that users of the header know the version.
 ${INSTALL_INCLUDE}/%${LIBVERSIONSTR}.h: %.h
@@ -777,20 +758,17 @@ ${INSTALL_INCLUDE}/%${LIBVERSIONSTR}.h: %.h
 
 
 # Include default EPICS Makefiles (version dependent)
-ifeq (${EPICS_BASETYPE},3.13)
-include ${EPICS_BASE}/config/RULES.Vx
-install:: ${INSTALL_DOCUS} ${INSTALL_PROJECTDBD} ${INSTALL_DEP}
-else # 3.14
-RELEASE_DBDFLAGS = -I ${EPICS_BASE}/dbd
-RELEASE_INCLUDES = -I ${EPICS_BASE}/include -I ${EPICS_BASE}/include/os/${OS_CLASS}
 # avoid library installation when doing 'make build'
 INSTALL_LOADABLE_SHRLIBS=
-include ${EPICS_BASE}/configure/RULES
-RULES_TOP=${EPICS_BASE}/../seq
--include ${RULES_TOP}/configure/RULES_BUILD
-SNC_CFLAGS=-I ${RULES_TOP}/include
-install: ${INSTALL_DOCUS} ${INSTALL_PROJECTDBD} ${INSTALL_LIBRARY} ${INSTALL_DEP}
-endif # 3.14
+include ${BASERULES}
+
+#Fix release rules
+RELEASE_DBDFLAGS = -I ${EPICS_BASE}/dbd
+RELEASE_INCLUDES = -I${EPICS_BASE}/include 
+RELEASE_INCLUDES += -I${EPICS_BASE}/include/compiler/${CMPLR_CLASS}
+RELEASE_INCLUDES += -I${EPICS_BASE}/include/os/${OS_CLASS}
+
+${INSTALLRULE} ${INSTALL_DOCUS} ${INSTALL_PROJECTDBD} ${INSTALL_LIBRARY} ${INSTALL_DEP}
 
 # Create SNL code from st/stt file
 # (RULES.Vx only allows ../%.st, 3.14 has no .st rules at all)
@@ -840,30 +818,21 @@ ${SUBFUNCFILE}: $(filter %.c %.cc %.C %.cpp, $(SRCS))
             print "function (" a[1] ")"\
         }' $< > $@
 
-# Check object code for wrong argument types in va_arg.
-# Some compilers seem to have problems with this.
-%$(OBJ): %.c
-	@echo "Compiling $< to $@"
-	$(RM) $@
-	$(COMPILE.c) $<
-	@$(NM) $@ | if grep -q __va_arg_type_violation; \
-	    then \
-	     echo "Error: va_arg type violation. Did you use float, char, or short in va_arg() ?" >&2; \
-	     $(RM) $@; exit 1; \
-	     else true; \
-	fi
-
 # The original 3.13 munching rule does not really work well
-
 ifeq (${EPICS_BASETYPE},3.13)
-%.munch: %.out
-	mv $< $@
+MUNCH=tclsh $(VX_DIR)/host/src/hutils/munch.tcl
+%.munch: %
+	@echo Munching $<
+	@ $(RM) ctct.o ctdt.c
+	$(NM) $< | $(MUNCH) > ctdt.c
+	$(COMPILE.c) -traditional ctdt.c
+	$(LINK.c) $@ $< ctdt.o
 endif
 
 ${VERSIONFILE}:
-ifneq (${LIBVERSION},test)
+ifndef TESTVERSION
 	echo "double _${PRJ}LibVersion = ${MAJOR}.${MINOR};" > $@
-endif # test
+endif
 	echo "char _${PRJ}LibRelease[] = \"${LIBVERSION}\";" >> $@
 
 # EPICS R3.14.*:
@@ -873,7 +842,7 @@ ${REGISTRYFILE}: ${PROJECTDBD}
 	$(PERL) $(EPICS_BASE_HOST_BIN)/registerRecordDeviceDriver.pl $< $(basename $@) > temp.cpp
 	$(MV) temp.cpp $@
 
-# 3.14.12 kills me if this rule is not overwritten
+# 3.14.12 complains if this rule is not overwritten
 ./%Include.dbd:
 
 # For 3.13 code used with 3.14:
@@ -908,7 +877,7 @@ END {for (name in func_missing) if (!func_found[name]) { \
 endef
  
 CORELIB = ${CORELIB_${OS_CLASS}}
-CORELIB_vxWorks = ${EPICS_BASE}/bin/${T_A}/iocCoreLibrary.munch
+CORELIB_vxWorks = ${EPICS_BASE}/bin/${T_A}/$(if $(filter 3.15.% ,$(EPICSVERSION)),softIoc.munch,iocCoreLibrary.munch)
  
 ifeq (${OS_CLASS},vxWorks)
 SHARED_LIBRARIES=NO
@@ -922,19 +891,14 @@ ${EXPORTFILE}: $(filter-out $(basename ${EXPORTFILE})$(OBJ),${LIBOBJS})
 	$(NM) $^ ${BASELIBS:%=${EPICS_BASE}/lib/${T_A}/$(LIB_PREFIX)%$(LSUFFIX)} ${CORELIB} | awk '$(makexportfile)' > $@
 
 # Create dependency file for recursive requires
-${PROJECTLIB}: ${DEPFILE}
 ${DEPFILE}: ${LIBOBJS}
 	@echo "Collecting dependencies"
 	$(RM) $@
 	@echo "# Generated file. Do not edit." > $@
 	${MAKEHOME}/getPrerequisites.tcl -dep ${INSTALL_INCLUDE} | grep -vw ${PRJ} >> $@; true
 
-ifeq (${EPICS_BASETYPE},3.14)
-ifneq (${OS_CLASS},vxWorks)
-build:
+$(BUILDRULE)
 	$(RM) MakefileInclude
-endif # !vxWorks
-endif # 3.14
 
 endif # in O.* directory
 endif # T_A defined
-- 
GitLab