diff --git a/config/CONFIG.Host.Linux b/config/CONFIG.Host.Linux index 72a125603..a8daf4569 100644 --- a/config/CONFIG.Host.Linux +++ b/config/CONFIG.Host.Linux @@ -9,6 +9,7 @@ ARCH_CLASS = Linux include $(EPICS_BASE)/config/CONFIG.Host.UnixCommon AR = ar -rc +ARCMD = $(AR) $@ RANLIB = ranlib -t # Configure OS vendor C compiler @@ -55,4 +56,17 @@ CCC_DEPENDS_FLAG = -MM ARCH_DEP_CFLAGS = -D_X86_ -Dlinux ARCH_DEP_LDFLAGS = +#glibc FAQ +# "_GNU_SOURCE: glibc does not make the GNU extensions available +# automatically. If a program depends on the GNU extensions or some other +# non-standard functionality, it is necessary to compile it with the C +# compiler option -D_GNU_SOURCE, or better to put #define _GNU_SOURCE at +# the beginning of your source files, before any C library header files +# are included. This difference normally manifests itself in the form +# of missing prototypes and/or data type definitions. Thus, if you get +# such errors, the first thing you should do is try defining _GNU_SOURCE +# and see if that makes the problem go away." +#ARCH_DEP_CFLAGS += -D_GNU_SOURCE + + diff --git a/config/CONFIG.Host.UnixCommon b/config/CONFIG.Host.UnixCommon index 2246bb2a8..53f44b33b 100644 --- a/config/CONFIG.Host.UnixCommon +++ b/config/CONFIG.Host.UnixCommon @@ -17,13 +17,14 @@ LIBNAME = $(LIBRARY:%=lib%.a) # CONFIG.Host. files may override SHRLIB_SUFFIX = .so -SHRLIB_VERSION = .$(EPICS_VERSION).$(EPICS_REVISION) -SHRLIBNAME = lib$(LIBRARY)$(SHRLIB_SUFFIX)$(SHRLIB_VERSION) +SHRLIBNAME = lib$(LIBRARY)$(SHRLIB_SUFFIX)$(SHRLIB_VERSION:%=.%) SHRLIB_CFLAGS = $($(ANSI)_SHRLIB_CFLAGS_$(SHARED_LIBRARIES)) SHRLIB_LDFLAGS = $($(ANSI)_SHRLIB_LDFLAGS_$(SHARED_LIBRARIES)) -LINK.dll= $(SHRLIB_LINKER) -o $@ $(CFLAGS) $(CPPFLAGS) $(SHRLIB_LDFLAGS) $(LDFLAGS) +INSTALL_SHRLIB = $(INSTALL_LIB) + +LINK.shrlib= $(SHRLIB_LINKER) -o $@ $(CFLAGS) $(CPPFLAGS) $(SHRLIB_LDFLAGS) $(LDFLAGS) #------------------------------------------------------- # Unix command definitions diff --git a/config/CONFIG.Host.WIN32 b/config/CONFIG.Host.WIN32 index 05e2ccc93..b27cd9c84 100644 --- a/config/CONFIG.Host.WIN32 +++ b/config/CONFIG.Host.WIN32 @@ -125,7 +125,7 @@ CCC_SLIBS_YES= CCC_SLIBS_NO= LINK_OPT_FLAGS_YES = /WARN:3 /incremental:no /opt:ref\ -/release /version:$(EPICS_VERSION).$(EPICS_REVISION) +/release $(PROD_VERSION:%=/version:%) LINK_OPT_FLAGS_NO = /WARN:3 /debug OPT_LDFLAGS = $(LINK_OPT_FLAGS_$(HOST_OPT)) @@ -191,30 +191,33 @@ HOST_OPT_FLAGS += $(subst $@, /_WINDLL, $(findstring $@,$(LIBOBJS))) # # A WIN32 dll has three parts: -# x.dll: the real dll (DLLNAME) +# x.dll: the real dll (SHRLIBNAME) # x.lib: what you link to progs that use the dll (LIBNAME) # x.exp: what you need to build the dll (in no variable) # -LINK.dll = $(WINLINK) /nologo $(WIN32_DLLFLAGS) /implib:$(@:%.dll=%.lib) /out:$@ $(DLL_DEF_FLAG) +LINK.shrlib = $(WINLINK) /nologo $(WIN32_DLLFLAGS) /implib:$(DLL_LINK_LIBNAME) /out:$(SHRLIBNAME) $(DLL_DEF_FLAG) # adjust names of libraries to build # # But: if there are no objects LIBOBJS to include # in this library (may be for e.g. base/src/libCompat # on some archs), don't define (and build) any library! -DLLNAME = $(LIBRARY).dll +SHRLIBNAME = $(LIBRARY).dll # # Under WIN32 we have the unique situation where the DLL link creates the # DLL link library xxx.lib and we need to be very careful to avoid replacing # the xxx.lib created by the dll link with an xxx.lib created by $(AR) # -# LIBTYPE is empty if we are not building a DLL +# SHARED_LIBRARIES is YES if we are building a DLL and NO if we aren't # -DLL_LINK_LIBNAME_SHARED = $(LIBRARY).lib -DLL_LINK_LIBNAME = $(DLL_LINK_LIBNAME_$(LIBTYPE)) -OBJECT_LIBNAME_ = $(LIBRARY).lib -LIBNAME = $(OBJECT_LIBNAME_$(LIBTYPE)) +DLL_LINK_LIBNAME_YES = $(LIBRARY).lib +DLL_LINK_LIBNAME = $(DLL_LINK_LIBNAME_$(SHARED_LIBRARIES)) +OBJECT_LIBNAME_NO = $(LIBRARY).lib +LIBNAME = $(OBJECT_LIBNAME_$(SHARED_LIBRARIES)) + +# dll install location +INSTALL_SHRLIB = $(INSTALL_BIN) #-------------------------------------------------- # Dependancy definitions diff --git a/config/CONFIG.Host.cygwin32 b/config/CONFIG.Host.cygwin32 index 4d412102c..dd428d783 100644 --- a/config/CONFIG.Host.cygwin32 +++ b/config/CONFIG.Host.cygwin32 @@ -17,6 +17,8 @@ EXE=.exe ANSI=GCC # c++ code won't build with b19 CPLUSPLUS= +# Shared libraries not implemented yet +SHARED_LIBRARIES=NO #========================== # Fix for cygwin32 beta17.1 includes #OP_SYS_INCLUDES += /usr/local/include/g++ diff --git a/config/CONFIG_COMMON b/config/CONFIG_COMMON index e90cea08c..0ae93b7e0 100644 --- a/config/CONFIG_COMMON +++ b/config/CONFIG_COMMON @@ -148,6 +148,7 @@ TARGET_INCLUDES = $($(basename $@)_INCLUDES) TARGET_CFLAGS = $($(basename $@)_CFLAGS) TARGET_CXXFLAGS = $($(basename $@)_CXXFLAGS) TARGET_LDFLAGS = $($(basename $@)_LDFLAGS) +TARGET_LDLIBS = $($(basename $@)_LDLIBS) TARGET_CPPFLAGS = $($(basename $@)_CPPFLAGS) TARGET_SNCFLAGS = $($(basename $@)_SNCFLAGS) @@ -205,7 +206,7 @@ CXXFLAGS = $(OPT_CXXFLAGS) $(DEBUG_CXXFLAGS) $(WARN_CXXFLAGS) $(TARGET_CXXFLAGS) LDFLAGS = $(OPT_LDFLAGS) $(TARGET_LDFLAGS) $(USR_LDFLAGS)\ $(ARCH_DEP_LDFLAGS) $(STATIC_LDFLAGS) $(OP_SYS_LDFLAGS) -LDLIBS = $(USR_LDLIBS) $(ARCH_DEP_LDLIBS)\ +LDLIBS = $(TARGET_LDLIBS) $(USR_LDLIBS) $(ARCH_DEP_LDLIBS)\ $(STATIC_LDLIBS) $(OP_SYS_LDLIBS) CPPFLAGS += $(TARGET_CPPFLAGS) $(USR_CPPFLAGS) diff --git a/config/CONFIG_HOST_ARCH.WIN32 b/config/CONFIG_HOST_ARCH.WIN32 index d1c31c5aa..e1fcbbda6 100644 --- a/config/CONFIG_HOST_ARCH.WIN32 +++ b/config/CONFIG_HOST_ARCH.WIN32 @@ -12,7 +12,7 @@ CHMOD=echo WHAT=echo ECHO=echo -WIND_HOST_TYPE = +WIND_HOST_TYPE = x86-win32 # Use std path variables from ms HOME = $(HOMEDRIVE)$(HOMEPATH) diff --git a/config/CONFIG_SITE b/config/CONFIG_SITE index 65da7e39e..3ef31df6f 100644 --- a/config/CONFIG_SITE +++ b/config/CONFIG_SITE @@ -56,6 +56,7 @@ TORNADO=YES #TORNADO=NO # VxWorks directory for TORNADO=YES +#VX_DIR_YES=c:\\Tornado VX_DIR_YES = /usr/local/vw/tornado101 # VxWorks directory for TORNADO=NO @@ -98,13 +99,17 @@ CMPLR=STRICT # Individual Makefiles may override CXXCMPLR=STRICT -# Build shared libraries? (Unix type Host builds only) +# Build shared libraries? # (archive libraries will also be built) # must be either YES or NO +# NOTE: CONFIG_SITE.Host.$(HOST_ARCH) files may override +# +# NOTE WIN32: YES results in a DLL. CONFIG_SITE.Host.WIN32 +# distribution file contains YES override # # NOTE solaris and sun4: If YES then LD_LIBRARY_PATH must -# include $(INSTALL_LOCATION)/lib/$(HOST_ARCH) both -# for the base build and when invoking base executables +# include fullpathname $(INSTALL_LOCATION)/lib/$(HOST_ARCH) +# for both the base build and when invoking base executables SHARED_LIBRARIES=NO # Build client objects statically ? diff --git a/config/CONFIG_SITE.Host.WIN32 b/config/CONFIG_SITE.Host.WIN32 new file mode 100644 index 000000000..74f6697ee --- /dev/null +++ b/config/CONFIG_SITE.Host.WIN32 @@ -0,0 +1,8 @@ +# +# $Id$ +# +# Site Specific Configuration Information +# Only the local epics system manager should modify this file + +SHARED_LIBRARIES = YES + diff --git a/config/RULES.Host b/config/RULES.Host index 6fa63893f..2231c4dc9 100644 --- a/config/RULES.Host +++ b/config/RULES.Host @@ -1,4 +1,4 @@ -# + # $Id$ # # Rules for making things specified in Makefile.Host @@ -238,8 +238,7 @@ INCREC +=$(RECTYPES) $(MENUS) INSTALL_PROD= $(PROD:%= $(INSTALL_BIN)/%) INSTALL_LIBS= $(LIBNAME:%=$(INSTALL_LIB)/%) -INSTALL_SHRLIBS= $(SHRLIBNAME:%=$(INSTALL_LIB)/%) -INSTALL_DLLS=$(DLLNAME:%=$(INSTALL_BIN)/%) +INSTALL_SHRLIBS= $(SHRLIBNAME:%=$(INSTALL_SHRLIB)/%) INSTALL_DLL_LINK_LIBS=$(DLL_LINK_LIBNAME:%=$(INSTALL_LIB)/%) INSTALL_TCLLIBS=$(TCLLIBNAME:%=$(INSTALL_TCLLIB)/%) INSTALL_TCLINDEX=$(TCLINDEX:%=$(INSTALL_TCLLIB)/%) @@ -282,6 +281,15 @@ ifdef TEMPLATES_DIR DIRECTORY_TARGETS += $(INSTALL_TEMPLATES)/$(TEMPLATES_DIR) endif +#--------------------------------------------------------------- +ifneq (x$(SHARED_LIBRARIES_$(ARCH_CLASS)),x) +SHARED_LIBRARIES+=$(subst -nil-,,$(SHARED_LIBRARIES_$(ARCH_CLASS))) +else +ifdef SHARED_LIBRARIES_DEFAULT +SHARED_LIBRARIES_+=$(SHARED_LIBRARIES_DEFAULT) +endif +endif + #--------------------------------------------------------------- # must use c++ linker if linking to shared libs with c++ code ifeq ($(strip $(SHARED_LIBRARIES)),YES) @@ -291,6 +299,15 @@ endif # CPLUSPLUS endif # LIBTYPE #--------------------------------------------------------------- +# Version number for base shared libraries (and win32 products) +ifeq ($(EPICS_BASE),$(TOP)) +SHRLIB_VERSION = $(EPICS_VERSION).$(EPICS_REVISION) +PROD_VERSION = $(EPICS_VERSION).$(EPICS_REVISION) +endif # EPICS_BASE + +#--------------------------------------------------------------- +# Libraries +# # if there are no objects LIBOBJS to include # in this library (may be for e.g. base/src/libCompat # on some archs), don't define (and build) any library! @@ -299,17 +316,10 @@ ifdef LIBOBJS LIBTARGETS = $(INSTALL_LOCATION_LIB) $(INSTALL_LIB) LIBTARGETS += $(LIBNAME) $(INSTALL_LIBS) -# check if DLL or plain lib requested: (Win32 build) -ifeq ($(strip $(LIBTYPE)),SHARED) -# -# LIBTYPE=="SHARED" indicates build -# DLL and install both dll and dll link library -# -LIBTARGETS += $(DLLNAME) $(INSTALL_DLLS) $(INSTALL_DLL_LINK_LIBS) -endif # LIBTYPE=SHARED - -# check if shared library requested: (Unix type build) +# check if shared libraries requested ifeq ($(strip $(SHARED_LIBRARIES)),YES) + +PROD_VERSION =$(SHRLIB_VERSION) CFLAGS += $(SHRLIB_CFLAGS) CXXFLAGS += $(SHRLIB_CFLAGS) ifeq ($(findstring cc,$(suffix $(LIBSRCS))),cc) @@ -317,7 +327,8 @@ SHRLIB_LINKER = $(CXX) else SHRLIB_LINKER = $(CC) endif -LIBTARGETS += $(SHRLIBNAME) $(INSTALL_SHRLIBS) +LIBTARGETS += $(SHRLIBNAME) $(INSTALL_SHRLIBS) $(INSTALL_DLL_LINK_LIBS) + endif # SHARED_LIBRARIES=YES endif # LIBOBJS @@ -356,7 +367,7 @@ depends:: $(LIBSRCS) $(SRCS) clean:: @echo "Cleaning" - @$(RM) *.i *$(OBJ) *.a $(PROD) $(TESTPROD) $(LIBNAME) $(INC) *$(RES) $(TARGETS) + @$(RM) *.i *$(OBJ) *.a $(PROD) $(TESTPROD) $(LIBNAME) $(SHRLIBNAME) $(INC) *$(RES) $(TARGETS) $(DIRECTORY_TARGETS) : $(MKDIR) $@ @@ -379,6 +390,22 @@ endif ifdef PRODNAME +ifneq (x$(PRODNAME_SRCS_$(ARCH_CLASS)),x) +PRODNAME_SRCS += $(subst -nil-,,$(PRODNAME_SRCS_$(ARCH_CLASS))) +else +ifdef PRODNAME_SRCS_DEFAULT +PRODNAME_SRCS += $(PRODNAME_SRCS_DEFAULT) +endif +endif + +ifneq (x$(PRODNAME_RCS_$(ARCH_CLASS)),x) +PRODNAME_RCS += $(subst -nil-,,$(PRODNAME_RCS_$(ARCH_CLASS))) +else +ifdef PRODNAME_RCS_DEFAULT +PRODNAME_RCS += $(PRODNAME_RCS_DEFAULT) +endif +endif + $(PRODNAME): $(PROD_DEPLIBS) $(PRODNAME_DEPLIBS) ifdef PRODNAME_SRCS @@ -409,7 +436,11 @@ PROD_RESS=$(addsuffix $(RES), $(basename $(RCS) $(COND_PROD_RCS))) PROD_MAKE_COMMAND=$(MAKE) $@\ PRODNAME="$@"\ PRODNAME_SRCS="$(SRCS) $($(basename $@)_SRCS)"\ - PRODNAME_RCS="$(RCS) $($(basename $@)_RCS) $($(basename $@)_RCS_$(ARCH_CLASS))"\ + PRODNAME_SRCS_DEFAULT="$($(basename $@)_SRCS_DEFAULT)"\ + PRODNAME_SRCS_$(ARCH_CLASS)="$($(basename $@)_SRCS_$(ARCH_CLASS))"\ + PRODNAME_RCS="$(RCS) $($(basename $@)_RCS)"\ + PRODNAME_RCS_DEFAULT="$($(basename $@)_RCS_DEFAULT)"\ + PRODNAME_RCS_$(ARCH_CLASS)="$($(basename $@)_RCS_$(ARCH_CLASS))"\ PRODNAME_LIBS="$($(basename $@)_LIBS)" $(PROD): $(PROD_OBJS) $(PROD_RESS) $(PROD_DEPLIBS) $(COND_PROD_DEPLIBS) @@ -638,12 +669,8 @@ $(DBDNAME): ../$(DBDEXPAND) @$(RM) $@ $(EPICS_BASE)/bin/$(HOST_ARCH)/dbExpand$(EXE) $(USER_DBDFLAGS) $< > $@ -# rule for shareable (DLL- dynamic link library) creation -$(DLLNAME): $(LIBOBJS) - $(LINK.dll) $(LIBOBJS) $(DLL_LDLIBS) - -$(SHRLIBNAME): $(LIBOBJS) - $(LINK.dll) $(LIBOBJS) +$(DLL_LINK_LIBNAME) $(SHRLIBNAME): $(LIBOBJS) + $(LINK.shrlib) $(LIBOBJS) $(DLL_LDLIBS) # rule for lib (archive of object files) creation $(LIBNAME): $(LIBOBJS) @@ -674,14 +701,14 @@ endif # RANLIB $(INSTALL_LIB)/%.lib: %.lib @echo "Installing library $@" - @$(INSTALL) -m 644 $< $(INSTALL_LIB) + @$(INSTALL) -d -m 644 $< $(INSTALL_LIB) -$(INSTALL_SHRLIBS): $(SHRLIBNAME) +$(INSTALL_SHRLIB)/lib%: lib% @echo "Installing library $@" - $(INSTALL) -m 555 $< $(INSTALL_LIB) + @$(INSTALL) -m 555 $< $(INSTALL_SHRLIB) ifdef SHRLIB_VERSION - $(RM) $(subst $(SHRLIB_VERSION),,$@) - ln -s $< $(subst $(SHRLIB_VERSION),,$@) + @$(RM) $(@:%.$(SHRLIB_VERSION)=%) + ln -s $< $(@:%.$(SHRLIB_VERSION)=%) endif # SHRLIB_VERSION $(INSTALL_TCLLIB)/%: % diff --git a/config/RULES.Vx b/config/RULES.Vx index 8d8b43240..5e67e69ad 100644 --- a/config/RULES.Vx +++ b/config/RULES.Vx @@ -1,9 +1,13 @@ # $Id$ ifneq (x$(LIBOBJS_$(ARCH_CLASS)),x) -LIBOBJS += $(subst -nil-,,$(LIBOBJS_$(ARCH_CLASS))) +LIBOBJS+=$(subst -nil-,,$(LIBOBJS_$(ARCH_CLASS))) +else +ifdef LIBOBJS_DEFAULT +LIBOBJS+=$(LIBOBJS_DEFAULT) endif - +endif + INCREC +=$(RECTYPES) $(MENUS) INSTALL_PROD = $(PROD:%= $(INSTALL_BIN)/%) INSTALL_LIBS = $(LIBNAME:%= $(INSTALL_BIN)/%) diff --git a/config/Sample.Makefile.Host b/config/Sample.Makefile.Host index fc3f03ce1..4db7e239b 100644 --- a/config/Sample.Makefile.Host +++ b/config/Sample.Makefile.Host @@ -89,10 +89,6 @@ LIBSRCS_DEFAULT = posix.c LIBSRCS_WIN32 = win32_special.c LIBSRCS_BSD = -nil- -# Type of library to build. -# On WIN32, SHARED results in a DLL, others may ignore this. -LIBTYPE=SHARED - # Library to build: # lib$(LIBRARY).a or ..dll/..exp/..lib # @@ -100,6 +96,12 @@ LIBTYPE=SHARED # LIBRARY=libname +# if SHARED_LIBRARIES is YES then +# Library version +SHRLIB_VERSION = +# On WIN32 results in /version:$(SHRLIB_VERSION) link option +# On Unix type hosts .$(SHRLIB_VERSION) is appended to library name + # -------------------------------------------------------------------- # defining products (executable programs) # -------------------------------------------------------------------- @@ -137,6 +139,11 @@ PROD_WIN32 = product_only_for_WIN32 PROD_BSD = product_only_for_BSD PROD_SYSV = product_only_for_SYSV +# Product version +PROD_VERSION = +# On WIN32 results in /version:$(SHRLIB_VERSION) link option +# On Unix type hosts PROD_VERSION) is ignored + # Scripts to install # # If there is both ../$(SCRIPT) and ../$(ARCH_CLASS)/$(SCRIPT),