From 193fc254891603770ced9b214a42888cee3bdd16 Mon Sep 17 00:00:00 2001
From: zimoch <zimoch>
Date: Thu, 27 Sep 2012 08:30:27 +0000
Subject: [PATCH] 64 bit support EPICS 3.14.12 patches. problem: different
 installation order of libs for vxWorks. Now don't link non-munch libs.
 Warning for non-existing cross compiler Don't link dbd directory any more.
 Not needed with current version of require. No more undefined symbols for
 prerequisites any more in order to support loading of test versions instead.
 Use generic lib suffixes in order to support other OS types. Fix wrong export
 for registrars.

---
 App/tools/driver.makefile | 151 +++++++++++++++++++++++---------------
 1 file changed, 90 insertions(+), 61 deletions(-)

diff --git a/App/tools/driver.makefile b/App/tools/driver.makefile
index ac8b9f1b..34c2d65b 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.81 2011/09/19 08:52:12 zimoch Exp $
+# $Header: /cvs/G/DRV/misc/App/tools/driver.makefile,v 1.82 2012/09/27 08:30:27 zimoch Exp $
 #
 # This generic makefile compiles EPICS code (drivers, records, snl, ...)
 # for all installed EPICS versions in parallel.
@@ -269,15 +269,25 @@ else # EPICSVERSION
 # EPICSVERSION defined 
 # second or third turn (see T_A branch below)
 
+EPICS_BASE=${EPICS_LOCATION}/base-${EPICSVERSION}
+
 ifneq ($(filter 3.14.%,$(EPICSVERSION)),)
 EPICS_BASETYPE=3.14
+
+# There is no 64 bit support before 3.14.12 
+ifneq ($(filter %_64,$(EPICS_HOST_ARCH)),)
+ifeq ($(wildcard $(EPICS_BASE)/lib/$(EPICS_HOST_ARCH)),)
+EPICS_HOST_ARCH:=$(patsubst %_64,%,$(EPICS_HOST_ARCH))
+export USR_CFLAGS_$(EPICS_HOST_ARCH) += -m32
+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
 
-EPICS_BASE=${EPICS_LOCATION}/base-${EPICSVERSION}
-
 # Is a version requested which is not installed?
 # Look if ${EPICS_BASE}/config/CONFIG file exists.
 ${EPICS_BASE}/config/CONFIG:
@@ -300,6 +310,7 @@ TOP:=${EPICS_BASE}
 -include ${EPICS_BASE}/configure/CONFIG
 EPICS_BASE:=${EB}
 SHRLIB_VERSION=
+COMMON_DIR = O.${EPICSVERSION}_Common
 endif # 3.14
 INSTALL_LOCATION= ${INSTALL_ROOT}/R${EPICSVERSION}
 
@@ -327,7 +338,7 @@ endif # 3.14
 PROJECTDBD=${PRJ}${LIBVERSIONSTR}.dbd
 export DBDFILES PROJECTDBD     
 
-RECORDS1 = $(patsubst %Record.dbd,%,$(notdir $(filter %Record.dbd, ${DBDS})))
+RECORDS1 = $(patsubst %Record.dbd,%,$(notdir $(filter %Record.dbd, ${DBDFILES})))
 RECORDS2 = $(shell ${MAKEHOME}/expandDBD.tcl -r $(addprefix -I, $(sort $(dir ${DBDFILES}))) $(realpath ${DBDS}))
 RECORDS = $(sort ${RECORDS1} ${RECORDS2})
 export RECORDS
@@ -338,7 +349,7 @@ export MENUS
 BPTS = $(patsubst %.data,%.dbd,$(wildcard bpt*.data))
 export BPTS
 
-HDRS = ${HEADERS} $(addsuffix Record.h,${RECORDS})
+HDRS = ${HEADERS} $(addprefix ${COMMON_DIR}/,$(addsuffix Record.h,${RECORDS}))
 export HDRS
 
 TEMPLS = ${TEMPLATES}
@@ -391,6 +402,11 @@ 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)
+	@if [ ! -d O.${EPICSVERSION}_Common ]; then \
+            mkdir -p O.${EPICSVERSION}_Common; \
+        fi
+endif
 	@for ARCH in ${CROSS_COMPILER_TARGET_ARCHS}; do \
             echo ${INSTBASE} | cmp -s O.${EPICSVERSION}_$$ARCH/INSTBASE - || $(RMDIR) O.${EPICSVERSION}_$$ARCH; \
 	    if [ ! -d O.${EPICSVERSION}_$$ARCH ]; then \
@@ -419,13 +435,26 @@ 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
 
 build%: build
 build:
-	@echo skipping ${T_A} because ${OS_CLASS} is not in BUILDCLASSES
+	@echo Skipping ${T_A} because ${OS_CLASS} is not in BUILDCLASSES
 %:
 	@true
-else # OS_CLASS in BUILDCLASSES
+
+else ifeq ($(wildcard $(firstword ${CC})),)
+# Print warning if compiler is not installed on this machine.
+
+install% : build
+install: build
+build%: build
+build:
+	@echo Warning: Skipping ${T_A} because cross compiler ${CC} is not installed
+%:
+	@true
+
+else
 
 CFLAGS += ${EXTRA_CFLAGS}
 INSTALL_BIN = ${INSTALL_LOCATION}/${T_A}
@@ -443,8 +472,12 @@ DEPFILE = ${PRJ}${LIBVERSIONSTR}.dep
 INSTALLDIRS = ${INSTALL_LOCATION} ${INSTALL_INCLUDE} ${INSTALL_BIN} 
 INSTALLDIRS += ${INSTALL_DBD} ${INSTALL_DOC} ${INSTALL_DOC}/${PRJ}
 INSTALLDIRS += ${INSTALL_TEMPL} 
- 
-DBDLINKS = ${INSTALL_BIN}/dbd
+
+ifeq (${EPICS_BASETYPE},3.14)
+COMMON_DIR = ../O.${EPICSVERSION}_Common
+else
+COMMON_DIR = .
+endif
 
 ifeq ($(words ${DBDFILES}),0)
 PROJECTDBD=
@@ -473,9 +506,9 @@ debug::
 	@echo "DBDFILES = ${DBDFILES}"
 
 ifeq (${EPICS_BASETYPE},3.13)
-install:: build ${INSTALLDIRS} ${DBDLINKS} ${INSTALL_HDRS} ${INSTALL_TEMPLATES}
+install:: build ${INSTALLDIRS} ${INSTALL_HDRS} ${INSTALL_TEMPLATES}
 else # 3.14
-install: build ${INSTALLDIRS} ${DBDLINKS} ${INSTALL_HDRS} ${INSTALL_TEMPLATES}
+install: build ${INSTALLDIRS} ${INSTALL_HDRS} ${INSTALL_TEMPLATES}
 endif # 3.14
 
 install-headers:: ${INSTALL_LOCATION} ${INSTALL_INCLUDE}
@@ -483,12 +516,16 @@ 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
+
 ${INSTALLDIRS}:
 	mkdir -m 775 $@
 
-${INSTALL_BIN}/dbd:
-	${LN} ../dbd $@
-
 ${INSTALL_DOC}/${PRJ}/%: %
 	@echo "Installing documentation $@"
 	$(RM) $@
@@ -501,8 +538,7 @@ ${INSTALL_TEMPL}/%${LIBVERSIONSTR}.template: %.template
 	echo "#${PRJ}Lib ${LIBVERSION}" > $@
 	cat $^ >> $@
 	chmod 444 $@
-	@[ "${LIBVERSION}" == "test" ] || \
-	${MAKEHOME}/setLinks.tcl ${INSTALL_TEMPL} .template $(basename $(notdir $^))
+	$(SETLINKS) ${INSTALL_TEMPL} .template $(basename $(notdir $^))
 
 ${INSTALL_TEMPL}/%${LIBVERSIONSTR}.db: %.db
 	@echo "Installing template file $@"
@@ -510,8 +546,7 @@ ${INSTALL_TEMPL}/%${LIBVERSIONSTR}.db: %.db
 	echo "#${PRJ}Lib ${LIBVERSION}" > $@
 	cat $^ >> $@
 	chmod 444 $@
-	@[ "${LIBVERSION}" == "test" ] || \
-	${MAKEHOME}/setLinks.tcl ${INSTALL_TEMPL} .db $(basename $(notdir $^))
+	$(SETLINKS) ${INSTALL_TEMPL} .db $(basename $(notdir $^))
 
 ifeq ($(filter O.%,$(notdir ${CURDIR})),)
 # still in source directory, third run
@@ -529,17 +564,14 @@ uninstall::
 	@for i in ${RMFILES}; \
 	    do ${EXISTS} $$i && echo "Uninstalling $$i" && $(RM) $$i; \
 	done; true
-	@if [ "${LIBVERSION}" != "test" ]; \
-	then  \
-	    ${MAKEHOME}/setLinks.tcl ${INSTALL_BIN} "" ${PRJ}Lib; \
-	    ${MAKEHOME}/setLinks.tcl ${INSTALL_BIN} .munch ${PRJ}Lib; \
-	    ${MAKEHOME}/setLinks.tcl ${INSTALL_BIN} .so lib${PRJ}; \
-	    ${MAKEHOME}/setLinks.tcl ${INSTALL_BIN} .dep ${PRJ}; \
-	    ${MAKEHOME}/setLinks.tcl ${INSTALL_DBD} .dbd ${INSTALL_PROJECTDBD:%${LIBVERSIONSTR}.dbd=%}; \
-	    ${MAKEHOME}/setLinks.tcl ${INSTALL_INCLUDE} .h $(notdir ${HDRS:%.h=%}); \
-	    ${MAKEHOME}/setLinks.tcl ${INSTALL_TEMPL} .template $(notdir ${TEMPLS:%.template=%}); \
-	    ${MAKEHOME}/setLinks.tcl ${INSTALL_TEMPL} .db $(notdir ${TEMPLS:%.db=%}); \
-	fi
+	$(SETLINKS) ${INSTALL_BIN} "" ${PRJ}Lib;
+	$(SETLINKS) ${INSTALL_BIN} .munch ${PRJ}Lib;
+	$(SETLINKS) ${INSTALL_BIN} .so lib${PRJ};
+	$(SETLINKS) ${INSTALL_BIN} .dep ${PRJ};
+	$(SETLINKS) ${INSTALL_DBD} .dbd ${INSTALL_PROJECTDBD:%${LIBVERSIONSTR}.dbd=%};
+	$(SETLINKS) ${INSTALL_INCLUDE} .h $(notdir ${HDRS:%.h=%});
+	$(SETLINKS) ${INSTALL_TEMPL} .template $(notdir ${TEMPLS:%.template=%});
+	$(SETLINKS) ${INSTALL_TEMPL} .db $(notdir ${TEMPLS:%.db=%});
 
 ${INSTALL_INCLUDE}/%${LIBVERSIONSTR}.h: %.h
 	@echo "Installing header file $@"
@@ -547,8 +579,7 @@ ${INSTALL_INCLUDE}/%${LIBVERSIONSTR}.h: %.h
 	echo "#define __${PRJ}Lib__ ${MAJOR}.${MINOR}" > $@
 	cat $^ >> $@
 	chmod 444 $@
-	@[ "${LIBVERSION}" == "test" ] || \
-	${MAKEHOME}/setLinks.tcl ${INSTALL_INCLUDE} .h $(basename $(notdir $^))
+	$(SETLINKS) ${INSTALL_INCLUDE} .h $(basename $(notdir $^))
 
 vpath %.db $(sort $(dir ${TEMPLS}))
 vpath %.template $(sort $(dir ${TEMPLS}))
@@ -632,27 +663,25 @@ ALLMINORS := $(shell for ((i=0;i<=${MINOR};i++));do echo $$i;done)
 PREREQUISITES = $(shell ${MAKEHOME}/getPrerequisites.tcl ${INSTALL_INCLUDE} | grep -vw ${PRJ})
 ifeq (${OS_CLASS}, vxWorks)
 PROVIDES = ${ALLMINORS:%=--defsym __${PRJ}Lib_${MAJOR}.%=0}
-#REQUIRES = ${PREREQUISITES:%=-u __%}
 endif # vxWorks
 ifeq (${OS_CLASS}, Linux)
-REQUIRES = ${PREREQUISITES:%=-Wl,-u,%}
 PROVIDES = ${ALLMINORS:%=-Wl,--defsym,${PRJ}Lib_${MAJOR}.%=0}
 endif # Linux
 endif # !test
 endif # LIBVERSION defined
 
-LDFLAGS += ${PROVIDES} ${REQUIRES}
+LDFLAGS += ${PROVIDES} ${USR_LDFLAGS_${T_A}}
 
 # Create and include dependency files
 CPPFLAGS += -MD
-# 3.14.12 uses -MDD instead. Remove it
+# 3.14.12 already defines -MDD here:
 HDEPENDSCFLAGS =
 -include *.d
 
 # Setup searchpaths from all used files
 vpath % ..
 vpath % $(sort $(dir ${SRCS:%=../%}))
-vpath %.h $(sort $(dir ${HDRS:%=../%}))
+vpath %.h $(addprefix ../,$(sort $(dir $(filter-out /%,${HDRS})))) $(dir $(filter /%,${HDRS}))
 vpath %.template $(sort $(dir ${TEMPLS:%=../%}))
 vpath %.db $(sort $(dir ${TEMPLS:%=../%}))
 vpath %.dbd $(sort $(dir ${DBDFILES:%=../%}))
@@ -665,7 +694,7 @@ USR_DBDFLAGS += $(DBDEXPANDPATH)
 
 ifeq (${EPICS_BASETYPE},3.13)
 USR_INCLUDES += $(addprefix -I, $(sort $(dir ${SRCS:%=../%} ${HDRS:%=../%})))
-build:: PROJECTINFOS ${PROJECTDBD} $(addsuffix Record.h,${RECORDS}) ${PROJECTLIB}
+build:: PROJECTINFOS ${PROJECTDBD} $(addprefix ${COMMON_DIR}/,$(addsuffix Record.h,${RECORDS})) ${PROJECTLIB}
 .PHONY:: PROJECTINFOS
 ifneq ($(filter %.cc %.cpp %.C,${SRCS}),)
 ifneq (${T_A},T1-ppc604)
@@ -674,10 +703,12 @@ 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} $(addsuffix Record.h,${RECORDS})
+
+build: PROJECTINFOS ${PROJECTDBD} $(addprefix ${COMMON_DIR}/,$(addsuffix Record.h,${RECORDS}))
 .PHONY: PROJECTINFOS
 EXPANDARG = -3.14
 ifneq ($(words $(filter %.c %.cc %.C %.cpp, $(SRCS))),0)
@@ -703,33 +734,28 @@ ${INSTALL_BIN}/${PROJECTLIB}.munch: ${PROJECTLIB}.munch
 	$(RM) $@
 	cp $^ $@
 	chmod 444 $@
-	@[ "${LIBVERSION}" == "test" ] || \
-	${MAKEHOME}/setLinks.tcl ${INSTALL_BIN} .munch ${PRJ}Lib
+	$(SETLINKS) ${INSTALL_BIN} .munch ${PRJ}Lib
 
 ${INSTALL_BIN}/${PROJECTLIB}: ${PROJECTLIB}
 	@echo "Installing library $@"
 	$(RM) $@
 	cp $^ $@
 	chmod 444 $@
-	@[ "${LIBVERSION}" == "test" ] || \
-	${MAKEHOME}/setLinks.tcl ${INSTALL_BIN} "" ${PRJ}Lib
-	${MAKEHOME}/setLinks.tcl ${INSTALL_BIN} .so lib${PRJ}
+	$(SETLINKS) ${INSTALL_BIN} .so lib${PRJ} 
 
 ${INSTALL_BIN}/${DEPFILE}: ${DEPFILE}
 	@echo "Installing dependency file $@"
 	$(RM) $@
 	cp $^ $@
 	chmod 444 $@
-	@[ "${LIBVERSION}" == "test" ] || \
-	${MAKEHOME}/setLinks.tcl ${INSTALL_BIN} .dep ${PRJ}
+	$(SETLINKS) ${INSTALL_BIN} .dep ${PRJ}
 
 ${INSTALL_DBD}/%.dbd: %.dbd
 	@echo "Installing dbd file $@"
 	$(RM) $@
 	cp $^ $@
 	chmod 444 $@
-	@[ "${LIBVERSION}" == "test" ] || \
-	${MAKEHOME}/setLinks.tcl ${INSTALL_DBD} .dbd ${^:%${LIBVERSIONSTR}.dbd=%}
+	$(SETLINKS) ${INSTALL_DBD} .dbd ${^:%${LIBVERSIONSTR}.dbd=%}
 
 # Add a #define so that users of the header know the version.
 ${INSTALL_INCLUDE}/%${LIBVERSIONSTR}.h: %.h
@@ -738,8 +764,7 @@ ${INSTALL_INCLUDE}/%${LIBVERSIONSTR}.h: %.h
 	echo "#define __${PRJ}Lib__ ${MAJOR}.${MINOR}" > $@
 	cat $^ >> $@
 	chmod 444 $@
-	@[ "${LIBVERSION}" == "test" ] || \
-	${MAKEHOME}/setLinks.tcl ${INSTALL_INCLUDE} .h $(basename $(notdir $^))
+	$(SETLINKS) ${INSTALL_INCLUDE} .h $(basename $(notdir $^))
 
 
 # Include default EPICS Makefiles (version dependent)
@@ -747,7 +772,6 @@ ifeq (${EPICS_BASETYPE},3.13)
 include ${EPICS_BASE}/config/RULES.Vx
 install:: ${INSTALL_DOCUS} ${INSTALL_PROJECTDBD} ${INSTALL_DEP}
 else # 3.14
-COMMON_DIR = .
 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'
@@ -810,7 +834,7 @@ ${SUBFUNCFILE}: $(filter %.c %.cc %.C %.cpp, $(SRCS))
 # Check object code for wrong argument types in va_arg.
 # Some compilers seem to have problems with this.
 %$(OBJ): %.c
-	@echo "Compiling $<"
+	@echo "Compiling $< to $@"
 	$(RM) $@
 	$(COMPILE.c) $<
 	@$(NM) $@ | if grep -q __va_arg_type_violation; \
@@ -822,12 +846,10 @@ ${SUBFUNCFILE}: $(filter %.c %.cc %.C %.cpp, $(SRCS))
 
 # The original 3.13 munching rule does not really work well
 
-MUNCH = $(PERL) $(EPICS_LOCATION)/base/bin/$(EPICS_HOST_ARCH)/munch.pl
-%.munch: %
-	$(RM) $*_ctct.o $*_ctdt.c
-	$(NM) $< | $(MUNCH) > $*_ctdt.c
-	$(GCC) -traditional $(CFLAGS) -fdollars-in-identifiers -c $(SOURCE_FLAG) $*_ctdt.c
-	$(LINK.c) $@ $< $*_ctdt.o
+ifeq (${EPICS_BASETYPE},3.13)
+%.munch: %.out
+	mv $< $@
+endif
 
 ${VERSIONFILE}:
 ifneq (${LIBVERSION},test)
@@ -867,8 +889,8 @@ END {for (name in func_missing) if (!func_found[name]) { \
 	print "void " name "();"; \
 	print "epicsRegisterFunction(" name ");"} \
      for (name in reg_missing) if (!reg_found[name]) { \
-	print "REGISTRYFUNCTION " name ";"; \
-	print "epicsRegisterFunction(" name ");"} \
+	print "extern REGISTRYFUNCTION " name ";"; \
+	print "epicsExportRegistrar(" name ");"} \
      for (name in var_missing) if (!var_found[name]) { \
         type = var_missing[name]; \
 	print "extern " type " " name ";"; \
@@ -877,11 +899,18 @@ END {for (name in func_missing) if (!func_found[name]) { \
 endef
  
 CORELIB = ${CORELIB_${OS_CLASS}}
-CORELIB_vxWorks = ${EPICS_BASE}/bin/${T_A}/iocCoreLibrary.o
+CORELIB_vxWorks = ${EPICS_BASE}/bin/${T_A}/iocCoreLibrary.munch
+ 
+ifeq (${OS_CLASS},vxWorks)
+SHARED_LIBRARIES=NO
+endif
+LSUFFIX_YES=$(SHRLIB_SUFFIX)
+LSUFFIX_NO=$(LIB_SUFFIX)
+LSUFFIX=$(LSUFFIX_$(SHARED_LIBRARIES))
  
 ${EXPORTFILE}: $(filter-out $(basename ${EXPORTFILE})$(OBJ),${LIBOBJS})
 	$(RM) $@
-	$(NM) $^ ${BASELIBS:%=${EPICS_BASE}/lib/${T_A}/lib%.a} ${CORELIB} | awk '$(makexportfile)' > $@
+	$(NM) $^ ${BASELIBS:%=${EPICS_BASE}/lib/${T_A}/$(LIB_PREFIX)%$(LSUFFIX)} ${CORELIB} | awk '$(makexportfile)' > $@
 
 # Create dependency file for recursive requires
 ${PROJECTLIB}: ${DEPFILE}
-- 
GitLab