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