# initialized flags #CC = #FC = #LD = CFLAGS = -g -O3 -Wall -Wuninitialized -DINCLUDE_FTPLIB ########################################################################### ## Environments setup ## Prefix ifndef PREFIX PREFIX = /usr/local endif # User defined flags for compiler USERFLAGS = # Do you need to compile the shared library? If so, set "1" here. NEED_SHLIB = # If RPATH needed ... NEED_RPATH = # If static ROOT libaries needed ... NEED_LIBROOTA = # If strlcpy.o needed ... NEED_STRLCPY = 1 # If zlib needed ... NEED_ZLIB = # MIDAS max event size MIDAS_MAX_EVENT_SIZE = # OS specific programs included SPECIFIC_OS_PRG = # ..? Why it is needed? MIDAS_PREF_FLAGS = ## installer INSTALL = $(shell which install) ifndef INSTALL INSTALL = ./install.sh else INS_OPTS = -v -D endif # MXML dir ifndef MXML_DIR MXML_DIR = ../mxml endif # MySQL MYSQL_CONFIG := $(shell which mysql_config 2> /dev/null) ifdef MYSQL_CONFIG MYSQLINCDIR := $(shell mysql_config --cflags | sed -e 's,^.*-I\([^ ]*\).*$$,\1,' -e s/\'//g) NEED_MYSQL := $(shell if test -e $(MYSQLINCDIR)/mysql.h ; then echo 1; fi) endif ########################################################################### ## Check OS Type for OS-specified flags OSTYPE = $(shell uname | tr '[A-Z]' '[a-z]') ifeq ($(OSTYPE), linux) # > 2GB file support CFLAGS += -D_LARGEFILE64_SOURCE CFLAGS += -DOS_LINUX -fPIC -Wno-unused-function LDFLAGS += -lutil -lpthread NEED_ZLIB =1 SPECIFIC_OS_PRG += mlxspeaker dio endif ifeq ($(OSTYPE), osf1) CFLAGS += -DOS_OSF1 FFLAGS += -nofor_main -D 40000000 -T 20000000 LDFLAGS += -lc -lbsd endif ifeq ($(OSTYPE), ultrix) CFLAGS += -DOS_ULTRIX -DNO_PTY endif ifeq ($(OSTYPE), freebsd) CFLAGS += -DOS_FREEBSD LDFLAGS += -lbsd -lcompat endif ifeq ($(OSTYPE), darwin) CFLAGS += -DOS_LINUX -DOS_DARWIN -DHAVE_STRLCPY -fPIC -Wno-unused-function LDFLAGS += -lpthread NEED_RANLIB = 1 SPECIFIC_OS_PRG += mlxspeaker endif ifeq ($(OSTYPE), cygwin_nt-5.1) OSTYPE = cygwin endif ifeq ($(OSTYPE), cygwin) CFLAGS += -DOS_LINUX -DOS_CYGWIN -Wno-unused-function LDFLAGS += -lutil -lpthread endif ifeq ($(OSTYPE), solaris) CFLAGS += -DOS_SOLARIS LDFLAGS += -lsocket -lnsl endif ########################################################################### ## Processing environment for building flags CFLAGS += $(MIDAS_PREF_FLAGS) $(USERFLAGS) ifdef MIDAS_MAX_EVENT_SIZE CFLAGS += -DMAX_EVENT_SIZE=$(MIDAS_MAX_EVENT_SIZE) endif # MIDAS_MAX_EVENT_SIZE ifdef NEED_MYSQL CFLAGS += -DHAVE_MYSQL $(shell $(MYSQL_CONFIG) --include) LDFLAGS += $(shell $(MYSQL_CONFIG) --libs) NEED_ZLIB =1 endif # NEED_MYSQL ifdef ROOTSYS ROOTLIBS := $(shell $(ROOTSYS)/bin/root-config --libs) ROOTCFLAGS := $(shell $(ROOTSYS)/bin/root-config --cflags) ifdef NEED_RPATH ROOTLIBS += -Wl,-rpath,$(ROOTSYS)/lib endif ifdef NEED_LIBROOTA ROOTLIBS := $(ROOTSYS)/lib/libRoot.a -lssl -ldl -lcrypt endif CFLAGS += $(ROOTCFLAGS) endif # ROOTSYS ifdef NEED_ZLIB CFLAGS += -DHAVE_ZLIB LIBS += -lz endif # ZLIB ifdef NEED_SHLIB CFLAGS += -shared -fPIC endif # SHLIB ########################################################################### ## Processing building targets ## Directories needed INC_DIR = include SRC_DIR = src UTL_DIR = utils DRV_DIR = drivers EXM_DIR = examples ## Driectories which will be created OS_DIR = $(OSTYPE) LIB_DIR = $(OS_DIR)/lib BIN_DIR = $(OS_DIR)/bin DIRS = $(OS_DIR) $(LIB_DIR) $(BIN_DIR) CFLAGS += -I$(INC_DIR) -I$(DRV_DIR) -I$(MXML_DIR) -L$(LIB_DIR) ## Directories for install INSTDIR_BIN = $(PREFIX)/bin INSTDIR_INC = $(PREFIX)/include INSTDIR_LIB = $(PREFIX)/lib INSTDIR_DRV = $(PREFIX)/driver ## Utilities PROGS = mserver mhttpd mlogger odbedit mtape mhist \ mstat mcnaf mdump mhdump mchart odbhist \ melog webpaw lazylogger stripchart.tcl \ $(SPECIFIC_OS_PRG) UTILS = $(shell for i in $(PROGS); do echo $(BIN_DIR)/$$i ; done) ## Analyzer objects ANALYZER = $(LIB_DIR)/mana.o ifdef CERNLIB ANALYZER += $(LIB_DIR)/hmana.o endif ifdef ROOTSYS ANALYZER += $(LIB_DIR)/rmana.o endif ## Objects for building $(LIBMIDAS_A) and $(LIBMIDAS_SO) OBJS_LIB_NEED = midas.o system.o mrpc.o odb.o ybos.o ftplib.o history.o alarm.o elog.o ifndef NEED_SHLIB OBJS_LIB_NEED += cnaf_callback.o endif OBJS_LIB = $(shell for i in $(OBJS_LIB_NEED) ; do echo $(LIB_DIR)/$$i ; done) ## MXML OBJS MXML_OBJS_NEED = mxml.o ifdef NEED_STRLCPY MXML_OBJS_NEED += strlcpy.o endif MXML_OBJS = $(shell for i in $(MXML_OBJS_NEED) ; do echo $(LIB_DIR)/$$i ; done) ## Objects for install OBJS_INS_NEED = mfe.o fal.o OBJS_INS = $(shell for i in $(OBJS_INS_NEED) ; do echo $(LIB_DIR)/$$i ; done) ## library LIBMIDAS_A = $(LIB_DIR)/libmidas.a ifdef NEED_SHLIB LIBMIDAS_SO = $(LIB_DIR)/libmidas.so LDFLAGS += -shared -L$(LIB_DIR) -lmidas endif ## Examples EXAMPLES_NEED = consume produce rpc_test msgdump minife minirc odb_test EXAMPLES = $(shell for i in $(EXAMPLES_NEED); do echo examples/$$i ; done) ## Includes INCLUDES = $(wildcard $(INC_DIR)/*.h) ########################################################################### CXXFLAGS = $(CFLAGS) ifdef ROOTSYS CXXFLAGS += -DHAVE_ROOT endif all: check-mxml mkdirs $(LIBMIDAS_A) $(LIBMIDAS_SO) $(ANALYZER) $(OBJS_INS) utilities .PHONY: clean ########################################################################### ## Library objects $(LIB_DIR)/%.o: $(SRC_DIR)/%.c $(INCLUDES) $(CC) $(CFLAGS) -c -o $@ $< ## MXML_OBJS $(LIB_DIR)/mxml.o: $(MXML_DIR)/mxml.c $(CC) $(CFLAGS) -c -o $@ $< $(LIB_DIR)/strlcpy.o: $(MXML_DIR)/strlcpy.c $(CC) $(CFLAGS) -c -o $@ $< ## Frontend and backend framework $(LIB_DIR)/fal.o: $(SRC_DIR)/fal.c $(INCLUDES) $(CXX) -Dextname -DMANA_LITE -c -o $@ $< $(CFLAGS) $(LIB_DIR)/hmana.o: $(SRC_DIR)/mana.c $(INCLUDES) $(CC) -Dextname -DHAVE_HBOOK $(CFLAGS) -c -o $@ $< $(LIB_DIR)/rmana.o: $(SRC_DIR)/mana.c $(INCLUDES) $(CXX) -DUSE_ROOT $(CXXFLAGS) -c -o $@ $< ## Utilities $(BIN_DIR)/%: $(UTL_DIR)/%.c $(INCLUDES) $(CC) $(CFLAGS) -o $@ $< $(LIBMIDAS_A) $(LDFLAGS) $(BIN_DIR)/mlogger: $(SRC_DIR)/mlogger.c $(LIBMIDAS_A) $(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) $(ROOTLIBS) $(BIN_DIR)/mserver: $(SRC_DIR)/mserver.c $(INCLUDES) $(BIN_DIR)/mhttpd: $(SRC_DIR)/mhttpd.c $(SRC_DIR)/mgd.c $(BIN_DIR)/odbedit: $(SRC_DIR)/odbedit.c $(SRC_DIR)/cmdedit.c $(BIN_DIR)/mcnaf: $(UTL_DIR)/mcnaf.c $(DRV_DIR)/camac/camacrpc.c $(BIN_DIR)/mhdump: $(UTL_DIR)/mhdump.cxx $(CXX) $(CXXFLAGS) -o $@ $< $(LDFLAGS) $(ROOTLIBS) $(BIN_DIR)/lazylogger: $(SRC_DIR)/lazylogger.c $(BIN_DIR)/stripchart.tcl: $(UTL_DIR)/stripchart.tcl @cp -f $< $(BIN_DIR)/$(shell basename $@) ########################################################################### mkdirs: @for i in $(DIRS) ; do \ echo "Making directory $$i ..." ; \ mkdir -p $$i ; \ done utilities: $(LIBMIDAS_A) $(UTILS) examples: $(LIBMIDAS_A) $(EXAMPLES) ## Libraries $(OBJS_LIB): $(MXML_OBJS) $(LIBMIDAS_A): $(OBJS_LIB) $(MXML_OBJS) @rm -f $@ ar -crv $@ $^ ifdef NEED_RANLIB ranlib $@ endif $(LIBMIDAS_SO): $(OBJS_LIB) $(MXML_OBJS) @rm -f $@ ld -o $@ $^ $(LDFLAGS) ## MXML-check check-mxml: ifdef NEED_STRLCPY @if test ! -e $(MXML_DIR)/strlcpy.h ; then \ echo "Please download mxml from: " ; \ echo "http://midas.psi.ch/htmldoc/quickstart.html" ;\ exit 1; \ fi endif @if test ! -e $(MXML_DIR)/mxml.h ; then \ echo "Please download mxml from: " ; \ echo "http://midas.psi.ch/htmldoc/quickstart.html" ;\ exit 1; \ fi ## Cleaning clean: @echo "Cleaning objects ..." @rm -f $(LIB_DIR)/*.o @echo "Cleaning libraries ..." @rm -f $(LIBMIDAS_A) $(LIBMIDAS_SO) @echo "Cleaning temporary files ..." @rm -rf *~ \#* mrproper: clean @rm -rf $(OS_DIR) @rm -rf vxworks/68kobj vxworks/ppcobj static: @rm -f $(UTILS) @$(MAKE) USERFLAGS=-static install: install-utils install-includes install-libs install-drivers install-src install-examples install-utils: $(UTILS) @echo "... " @echo "... Installing utilities to $(INSTDIR_BIN)" @echo "... " @for file in $^ ; do \ $(INSTALL) $(INS_OPTS) $$file $(INSTDIR_BIN)/$(shell basename "$$file") ; \ done @for file in dio mhttpd webpaw ; do \ if test -f $(INSTDIR_BIN)/$$file ; then chmod +s $(INSTDIR_BIN)/$$file ; fi ; \ done @ln -fs $(INSTDIR_BIN)/stripchart.tcl $(INSTDIR_BIN)/stripchart @chmod +x $(INSTDIR_BIN)/stripchart.tcl install-includes: $(INCLUDES) @echo "... " @echo "... Installing includes to $(INSTDIR_INC)" @echo "... " @for file in $^ ; do \ $(INSTALL) $(INS_OPTS) $$file $(INSTDIR_INC)/$(shell basename "$$file") ; \ done install-libs: $(LIBMIDAS_A) $(LIBMIDAS_SO) $(OBJS_INS) $(ANALYZER) @echo "... " @echo "... Installing libraries and objects to $(INSTDIR_LIB)" @echo "... " @for file in $^ ; do \ $(INSTALL) $(INS_OPTS) $$file $(INSTDIR_LIB)/$(shell basename "$$file") ; \ done install-drivers: @echo "... " @echo "... Installing drivers to $(PREFIX)" @echo "... " @for file in `find $(DRV_DIR) -type f | grep -v .svn` ; do \ F_PATH=$(shell dirname "$$file") ; \ if test ! -d ${PREFIX}/${F_PATH} ; then mkdir -p ${PREFIX}/${F_PATH}; fi ; \ $(INSTALL) $(INS_OPTS) $$file $(PREFIX)/$$file ; \ done install-examples: @echo "... " @echo "... Installing examples to $(PREFIX)" @echo "... " @for file in `find $(EXM_DIR) -type f | grep -v .svn` ; do \ $(INSTALL) $(INS_OPTS) $$file $(PREFIX)/$$file ; \ done install-src: @echo "... " @echo "... Installing sources to $(PREFIX)" @echo "... " @for file in `find $(SRC_DIR) -type f | grep -v .svn` ; do \ $(INSTALL) $(INS_OPTS) $$file $(PREFIX)/$$file ; \ done