# (c) 2001 jannet it services # contact@jannet.de # $Id$ # ----- standard variables PROJECT ?= $(shell (cd $(TOPDIR); basename `pwd`)) PROJECT_DESCR ?= No description CUSTOMER ?= No customer VERSION ?= $(shell cat $(TOPDIR)/VERSION) DIST_VERSION ?= $(shell sed -e "s/-dev//" $(TOPDIR)/VERSION) HEX_VERSION = $(shell echo $(DIST_VERSION) | \ sed 's/-dev//; s/pre[^\.]*//; s/[\.-]/ /g' | xargs printf "0x%02x%02x%02x%02x") DEVELOPMENT ?= $(shell grep -q 'dev' $(TOPDIR)/VERSION && echo true) USE_PROJECT_LIB ?= true USE_YTOOLS ?= true REENTRANT ?= true export REENTRANT ifeq ($(DEVELOPMENT),true) include $(TOPDIR)/make/cfg_dev.mk else include $(TOPDIR)/make/cfg_dist.mk endif OPTS_PID_FILE ?= $(PIDDIR)/$(PROJECT).pid CFLAGS += -DVERSION=$(HEX_VERSION) CPPFLAGS += -DVERSION=$(HEX_VERSION) LD_LIB_PATH += $(MODDIR)/lib ifndef LIBNAME LIBNAME := $(PROJECT) endif WINVERSION = $(shell echo $(VERSION) | sed -e "s/\./_/g") LOCAL_VERSION = $(shell echo $(VERSION)) LOCAL_WINVERSION = $(shell echo $(VERSION) | sed -e "s/\./_/g") DIST_VERSION = $(shell echo $(VERSION) | sed -e "s/-dev//") DIST_WINVERSION = $(shell echo $(WINVERSION) | sed -e "s/-dev//") LOCAL_DIST_VERSION = $(shell echo $(LOCAL_VERSION) | sed -e "s/-dev//") LOCAL_DIST_WINVERSION = $(shell echo $(LOCAL_WINVERSION) | sed -e "s/-dev//") PROJECT_STEM = $(PROJECT)-$(DIST_VERSION) CVS_ROOT_DIR = $(shell test -d CVS && pwd | sed -e "s%`cat CVS/Repository`%%; s%/$$%%") REV_SUBDIRS = $(shell echo $(SUBDIRS) | awk '{for (i=NF; i>=1; i--) printf ("%s ",$$i)}') FRESH_CVSDIR = $(HOME)/local/src/cvs.fresh ARCH = @ARCH@ FIND_SUBDIRS = $(filter-out . .. ./nomake ./CVS $(addprefix ./,$(IGNORE_SUBDIRS)), $(shell find . -maxdepth 1 -type d)) PROJECT_CAPNAME = $(shell echo $(PROJECT) | tr [a-z] [A-Z] | sed 's/-/_/g') BINARY_VERSION = $(shell echo $(PROJECT)_$(VERSION) | tr [a-z] [A-Z] | sed 's/-[^-]*$$//; s/-/_/g') FTP_PCKG_DIR = /pub/packages JANNET_PROJ_DIR = rsync_ssh://ftp.jannet.de:/home/ftp/dat$(FTP_PCKG_DIR) CONFDIR = $(MODDIR)/../conf CC = gcc GCC_VERSION = $(shell gcc -v 2>&1 | grep version | awk '{ print $$3;}') GCC_MAJOR = $(shell gcc -v 2>&1 | grep version | awk '{ split($$3,a,"."); print a[1];}') GCC_MINOR = $(shell gcc -v 2>&1 | grep version | awk '{ split($$3,a,"."); print a[2];}') GCC_REV = $(shell gcc -v 2>&1 | grep version | awk '{ split($$3,a,"."); print a[3];}') LD_VERSION = $(shell ld --version | sed '/GNU ld/ !d; s/[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/') LD_MAJOR = $(shell echo $(LD_VERSION) | cut -d. -f1) LD_MINOR = $(shell echo $(LD_VERSION) | cut -d. -f2) LD_REV = $(shell echo $(LD_VERSION) | cut -d. -f3) YTOOLS_VERSION = @PACKAGE_VERSION@ YTOOLS_VERSION_STR = \"@PACKAGE_VERSION@\" #ifndef $(TOPDIR) # TOPDIR := $(MODDIR) #endif EXE_SH += $(wildcard *.sh *.pl) MKFILES += $(wildcard *.mk) FULL_NAME = $(shell grep "^`id -nu`": /etc/passwd | cut -d: -f5) SRC_SUFFIX += $(sort $(suffix $(wildcard $(TOPDIR)/hdr/*))) LOCAL_SRC += Makefile $(wildcard $(addprefix *,$(SRC_SUFFIX))) SRC_HEADERED += $(shell if [ "$(LOCAL_SRC)" ]; then grep -ic "it services" $(LOCAL_SRC) | sed '/:0$$/ d; s/:.*$$//'; fi) SRC_UNHEADERED += $(filter-out $(SRC_HEADERED),$(LOCAL_SRC)) LOCAL_C += $(wildcard *.c) LOCAL_CPP += $(wildcard *.cc *.cpp *.C) LOCAL_H += $(wildcard *.h *.H) SFILES += $(wildcard *.S) UIFILES += $(wildcard *.ui) RCCFILES += $(wildcard *.qrc) SRC_ALL_CPP += $(LOCAL_C) $(LOCAL_CPP) $(LOCAL_H) # why both SRC_H <-> LOCAL_H? SRC_H += $(filter %.h %.H, $(SRC_ALL_CPP)) SRC_C += $(filter %.c, $(SRC_ALL_CPP)) SRC_CPP += $(filter %.cc %.cpp %.C, $(SRC_ALL_CPP)) OBJ += $(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(filter %.c %.cpp %.cc, $(SRC_ALL_CPP))))) OBJ += $(patsubst %.S,%.o,$(SFILES)) SHOBJS += $(patsubst %.cpp,lib%.so,$(patsubst %.cc,lib%.so,$(patsubst %.c,lib%.so,$(SRC_ALL_CPP)))) SHSCRIPTS += $(patsubst %.sh.tmpl,%.sh,$(wildcard *.sh.tmpl)) SCRIPTS += $(patsubst %.tmpl,%,$(wildcard *.tmpl)) BUILD_EXE_SH += $(patsubst %.sh,$(BUILD_BINDIR)/%.sh,$(EXE_SH)) BUILD_H += $(patsubst %.h,$(TOPDIR)/include/%.h,$(SRC_H)) PREREQ_DIR += $(addprefix $(MODDIR)/,$(LOCAL_PREREQ)) PREREQ_DONE += $(addsuffix /all.done,$(PREREQ_DIR)) PREREQ_H += $(foreach dir,$(PREREQ_DIR),$(wildcard $(dir)/*.h)) PREREQ_C += $(foreach dir,$(PREREQ_DIR),$(wildcard $(dir)/*.c)) PREREQ_CPP += $(foreach dir,$(PREREQ_DIR),$(wildcard $(dir)/*.c)) \ $(foreach dir,$(PREREQ_DIR),$(wildcard $(dir)/*.cpp)) PREREQ_CSRC += $(PREREQ_H) $(PREREQ_C) $(PREREQ_CPP) CONTRIB_MOD += $(addprefix contrib/,$(CONTRIB_LIBS)) REQUIRED := $(CONTRIB_MOD) $(REQUIRED) REQUIRED_DIR += $(patsubst %,$(MODDIR)/%,$(REQUIRED)) REQUIRED_DONE += $(patsubst %,%/all.done,$(REQUIRED_DIR)) REQUIRED_H += $(foreach dir,$(REQUIRED_DIR),$(wildcard $(dir)/*.h)) REQUIRED_C += $(foreach dir,$(REQUIRED_DIR),$(wildcard $(dir)/*.c)) REQUIRED_CPP += $(foreach dir,$(REQUIRED_DIR),$(wildcard $(dir)/*.cpp)) \ $(foreach dir,$(PREREQ_DIR),$(wildcard $(dir)/*.cpp)) REQUIRED_CSRC += $(REQUIRED_H) $(REQUIRED_C) $(REQUIRED_CPP) ALL_H += $(LOCAL_H) $(PREREQ_H) ALL_C += $(LOCAL_C) $(PREREQ_CPP) ALL_CPP += $(LOCAL_CPP) $(PREREQ_CPP) ALL_CSRC += $(LOCAL_CSRC) $(PREREQ_CSRC) TEXTCLEAN += $(wildcard *~ .*~ .*.swp *.rep) INCLUDE += -I. -I$(TOPDIR)/include $(PROJECT_INCLUDE) $(LOCAL_INCLUDE) UPLOAD_URL_RPM_BIN = rsync_ssh://ftp.jannet.de:/home/ftp/dat/pub/packages/rpm/bin/ UPLOAD_URL_RPM_SRC = rsync_ssh://ftp.jannet.de:/home/ftp/dat/pub/packages/rpm/src/ ifneq ($(TOPDIR),$(MODDIR)) INCLUDE += -I$(MODDIR)/include endif INSTALL_LIBDIR ?= $(PREFIX)/lib INSTALL_HDRDIR ?= $(PREFIX)/include INSTALL_MKDIR ?= $(PREFIX)/make INSTALL_BINDIR ?= $(PREFIX)/bin BUILD_BINDIR = $(TOPDIR)/bin LIBDIR = $(TOPDIR)/lib INSTALL_DOCDIR_DIST = $(DOC_PREFIX) INSTALL_DOCDIR_DEVEL = $(DOC_PREFIX)-devel DOCS += $(wildcard README CHANGES TODO LICENSE AUTHORS CREDITS *.pdf *.txt *.html) DOCSUBDIRS += $(wildcard html tex info examples src) INSTALLED_VERSION_FILE = $(PREFIX)/VERSION INSTALLED_DOCS_DIST = $(addprefix $(INSTALL_DOCDIR_DIST)/,$(DOCS)) INSTALLED_DOCS_DEVEL = $(addprefix $(INSTALL_DOCDIR_DEVEL)/,$(DOCS)) SO_SUFFIX = so.$(shell echo $(VERSION) | cut -d- -f1) LIB_A = $(LIBDIR)/lib$(LIBNAME).a LIB_SO = $(LIBDIR)/lib$(LIBNAME).$(SO_SUFFIX) VERSION_SCRIPT = $(LIBDIR)/version.ldscript INSTALLED_LIB_SO = $(INSTALL_LIBDIR)/lib$(LIBNAME).$(SO_SUFFIX) INSTALLED_SHOBJS += $(addprefix $(INSTALL_LIBDIR)/,$(SHOBJS)) INSTALLED_LINKS_SO += $(shell echo $(INSTALLED_LIB_SO) | sed -e "s/\.so\..*$$/.so/" | grep -v $(INSTALLED_LIB_SO)) LINKS_SO += $(shell echo $(LIB_SO) | sed -e "s/\.so\..*$$/.so/" | grep -v $(LIB_SO)) INSTALLED_LIB_A = $(INSTALL_LIBDIR)/lib$(LIBNAME).a INSTALLED_EXE += $(INSTALL_BINDIR)/$(EXE) INSTALLED_EXE_SH += $(addprefix $(INSTALL_BINDIR)/,$(EXE_SH)) INSTALLED_EXE_BIN += $(addprefix $(INSTALL_BINDIR)/,$(EXE_BIN)) INSTALLED_MKFILES += $(addprefix $(INSTALL_MKDIR)/,$(MKFILES)) INSTALLED_H += $(addprefix $(INSTALL_HDRDIR)/,$(SRC_H)) INSTALLED_PROFILE_PATH_SCRIPT = $(ENV_PREFIX)/etc/profile.d/path_$(PROJECT).sh MEMBERS += $(LIB_A)($(OBJ)) ifeq ($(DEVELOPMENT),true) CFLAGS += -D_DEVELOPMENT_ CPPFLAGS += -D_DEVELOPMENT_ endif CFLAGS += $(LOCAL_CFLAGS) $(PROJECT_CFLAGS) $(YLIB_CFLAGS) $(INCLUDE) CPPFLAGS += $(LOCAL_CPPFLAGS) $(PROJECT_CPPFLAGS) $(YLIB_CPPFLAGS) $(INCLUDE) CORE += $(wildcard core core.* vgcore vgcore.*) ifeq ($(USE_QT),true) include $(MODDIR)/make/qt-defs.mk endif ifeq ($(USE_X),true) ifeq ($(ARCH),x86) LDFLAGS += -L/usr/X11/lib -lXext -lX11 else LDFLAGS += -L/usr/X11/lib64 -lXext -lX11 endif endif LPPFLAGS += -lstdc++ ifeq ($(GCC_MAJOR),2) LPPFLAGS += -lm CFLAGS += -I/usr/local/include CPPFLAGS += -I/usr/local/include else ifeq ($(GCC_MAJOR),3) LPPFLAGS += -lgcc_s # LPPFLAGS += -L/usr/local/gcc3.3/lib else ifeq ($(GCC_MAJOR),4) # -PIC is more a thing with AMD64, I think CPPFLAGS += -fPIC CFLAGS += -fPIC endif endif endif ifeq ($(LIBTYPE),shared) LDFLAGS += -rdynamic endif # TODO: this shoud be only conditional, but breaks, because not all headers # do a conditional include of timer headers, yet GENERATE_FUNC_TIMERS = $(MODDIR)/YStopWatchThreadList/generate_func_timers.sh CPP = sh $(firstword $(wildcard $(MODDIR)/contrib/gfilt/gfilt $(MODDIR)/bin/gfilt)) ifeq ($(strip $(CPP)),sh) CPP = g++ endif RM = rm AR = ar ifeq ($(LOG_THREAD_NAMES), true) CFLAGS += -DSLOG_THREAD_NAMES CPPFLAGS += -DSLOG_THREAD_NAMES endif ifneq ($(wildcard $(MODDIR)/devutil/scripts),) MOD_SCRIPT_DIR = $(MODDIR)/devutil/scripts else MOD_SCRIPT_DIR = $(MODDIR)/bin endif ifdef INSTALL_LOG INSTALL=$(MOD_SCRIPT_DIR)/log_install.sh -l $(INSTALL_LOG) LINK_LIB=$(MOD_SCRIPT_DIR)/log_install.sh -L -l $(INSTALL_LOG) else ifndef INSTALL INSTALL = install endif ifndef LINK_LIB LINK_LIB=$(MOD_SCRIPT_DIR)/log_install.sh -L endif endif # ----- function definitions define make_subdirs set -e; for D in $(SUBDIRS) ; do make -C $$D ; done endef define make_subdirs_target set -e; for D in $(SUBDIRS) ; do make -C $$D $@; done endef define install_local_cfg $(INSTALL) -o $(CFGOWNER) -g $(CFGGROUP) -m $(CFGMODE) $< $@ endef # ----- local.mk ifneq ($(wildcard $(MODDIR)/make/local.mk),) include $(MODDIR)/make/local.mk endif ifneq ($(wildcard $(TOPDIR)/make/local.mk),) include $(TOPDIR)/make/local.mk endif ifneq ($(wildcard local.mk),) include local.mk endif # ----- standard features, switched on with USE_XXX = true ifeq ($(USE_PROJECT_LIB),true) PROJECTLIB_LDFLAGS += -l$(LIBNAME) -L$(TOPDIR)/lib LD_LIB_PATH += $(TOPDIR)/lib endif ifeq ($(USE_YTOOLS),true) PROJECTLIB_LDFLAGS += -lytools -L$(MODDIR)/lib LD_LIB_PATH += $(MODDIR)/lib endif ifeq ($(USE_TIMER),true) CFLAGS += -D_USE_TIMER_ CPPFLAGS += -D_USE_TIMER_ endif LDFLAGS += -L$(LIBDIR) $(LOCAL_LDFLAGS) $(PROJECTLIB_LDFLAGS) $(PROJECT_LDFLAGS) $(LPPFLAGS) ifeq ($(USE_PROFILER),true) CFLAGS += -fprofile-arcs -ftest-coverage CPPFLAGS += -fprofile-arcs -ftest-coverage LDFLAGS += -fprofile-arcs -ftest-coverage endif ifeq ($(USE_YAMD),true) CC = yamd-gcc endif ifeq ($(USE_MPATROL),true) CFLAGS += -include /usr/include/mpatrol.h #CPPFLAGS += -include /usr/include/mpatrol.h LDFLAGS += -lmpatrolmt -lbfd -liberty endif ifeq ($(USE_VALGRIND),true) CFLAGS += -include /usr/include/valgrind/memcheck.h CPPFLAG += -include /usr/include/valgrind/memcheck.h # LDFLAGS += endif ifeq ($(USE_STACK_PROTECTOR),true) CFLAGS += -fstack-protector-all # CFLAGS += -fstack-protector endif ifeq ($(USE_DBMALLOC),true) CONTRIB_LIBS += dbmalloc CFLAGS += -DDBMALLOC -DEXITFUN=_exit -I$(TOPDIR)/contrib/dbmalloc CPPFLAGS += -DDBMALLOC -DEXITFUN=_exit -I$(TOPDIR)/contrib/dbmalloc LDFLAGS += -ldbmalloc endif ifeq ($(USE_DMALLOC),true) CFLAGS += -DDMALLOC -DDMALLOC_FUNC_CHECK -DSTORE_SEEN_COUNT CPPFLAGS += -DDMALLOC -DDMALLOC_FUNC_CHECK -DSTORE_SEEN_COUNT LDFLAGS += -ldmallocthcxx -ldmallocth endif ifeq ($(USE_MEMWATCH),true) CFLAGS += -DMEMWATCH -DMW_STDIO CPPFLAGS += -DMEMWATCH -DMW_STDIO endif ifeq ($(USE_EFENCE),true) CFLAGS += -DEFENCE CPPFLAGS += -DEFENCE LDFLAGS += -lefence endif ifeq ($(USE_TRACING),true) CFLAGS += -D_DO_TRACE_ CPPFLAGS += -D_DO_TRACE_ endif ifeq ($(USE_ASSERTIONS),false) CFLAGS += -DNDEBUG CPPFLAGS += -DNDEBUG endif ifeq ($(COMPILE_DEBUG_CODE),true) CFLAGS += -D_DEBUG_ CPPFLAGS += -D_DEBUG_ endif ifeq ($(USE_MPATROL),true) CFLAGS += -include $(MODDIR)/include/mpatrol.h CPPFLAGS += -include $(MODDIR)/include/mpatrol.h LDFLAGS += -lmpatrolmt -lbfd -liberty endif ifeq ($(USE_COMPILER_DEBUG_OPTS),true) CFLAGS += -Wall -g3 CPPFLAGS += -Wall -g3 LDFLAGS += -Wall -g3 endif ifeq ($(USE_COMPILER_OPTIMIZATION_OPTS),true) CFLAGS += -funroll-loops -O2 CPPFLAGS += -funroll-loops -O2 endif #export PROJECT PROJECT_CFLAGS PROJECT_CPPFLAGS PROJECT_LDFLAGS USE_TIMER