# =============================================================== # # # # File : Makefile # # # # Institute of Microbiology (Technical University Munich) # # http://www.arb-home.de/ # # # # =============================================================== # # ----------------------------------------------------- # The ARB Makefile is aware of the following defines: # # CC C compiler (should be defined by OS) # CXX C++ compiler (should be defined by OS) # # DEVELOPER=name special compilation (values: ANY,RELEASE,your name) # OPENGL=0/1 whether OPENGL is available # # ----------------------------------------------------- # Paths for several libraries may be set from config.makefile by using: # # export XLIBS=$(shell pkg-config --libs xpm xerces-c) # export XINCLUDES=$(shell pkg-config --cflags x11) # export XAW_LIBS=$(shell pkg-config --libs xaw7) # export XML_INCLUDES=$(shell pkg-config --cflags xerces-c) # # You make have to explicitely point pkg-config to the *.pc files needed. # For example, Xquartz X11 libraries on macOS can be located by adding # the following line before those given above: # # export PKG_CONFIG_PATH=/usr/X11/lib/pkgconfig # # If you introduce a new variable that is handled as described above, # please add to section .@InjectedEnvironment # # ----------------------------------------------------- # ARB Makefile and ARB source code are aware of the following defines: # # $(MACH) name of the machine (LINUX or DARWIN; see config.makefile) # DEBUG compiles the DEBUG sections # DEBUG_GRAPHICS all X-graphics are flushed immediately (for debugging) # ARB_64=0/1 1=>compile 64 bit version # UNIT_TESTS=0/1 1=>compile in unit tests and call them after build # COVERAGE=0/1/2 compile in gcov support (useful together with UNIT_TESTS=1) # 0=no, 1+2=compile in, 1=show # STABS=0/1 force stabs format? (0 = "use default format") # SANITIZE=0/#/all use Sanitizer? (defaults to 0, # 1=AddressSanitizer+LeakSanitizer, # 2=UndefinedBehaviorSanitizer, # combine bit-values to activate multiple Sanitizers, # specify 'all' to activate all) # IGNORE_LEAKS=1 does not abort when leaks are detected (while using SANITIZE=1/all) # SHOWTODO=0/1 activate TODO-warnings? (defaults to 0, except for ralf) # # ----------------------------------------------------- # The ARB source code is aware of the following defines: # # NDEBUG doesn't compile the DEBUG sections # DEVEL_$(DEVELOPER) developer-dependent flag (enables you to have private sections in code) # DEVELOPER='ANY' (default setting) will be ignored # configurable in config.makefile # # ----------------------------------------------------- ifndef ARB_ORG_MAKEFLAGS ARB_ORG_MAKEFLAGS=$(MAKEFLAGS) else ifeq ($(ARB_ORG_MAKEFLAGS),) ARB_ORG_MAKEFLAGS=$(MAKEFLAGS) endif endif # Read configuration include config.makefile CONFIG_MAKEFILE_FOUND=$(strip $(wildcard config.makefile)) # strip spaces from values defined in config.makefile # (otherwise they easily have spaces appended) ifdef DEVELOPER DEVELOPER := $(strip $(DEVELOPER)) endif ifdef OPENGL OPENGL := $(strip $(OPENGL)) endif ifdef ISINA ISINA := $(strip $(ISINA)) endif ifdef DEBUG DEBUG := $(strip $(DEBUG)) endif ifdef UNIT_TESTS UNIT_TESTS := $(strip $(UNIT_TESTS)) endif ifdef COVERAGE COVERAGE := $(strip $(COVERAGE)) endif ifdef SHOWTODO SHOWTODO := $(strip $(SHOWTODO)) endif ifdef STABS STABS := $(strip $(STABS)) endif ifdef TRACESYM TRACESYM := $(strip $(TRACESYM)) endif ifdef DEBUG_GRAPHICS DEBUG_GRAPHICS := $(strip $(DEBUG_GRAPHICS)) endif # set defaults for (or strip) variables commented out in config.makefile: ifdef SANITIZE SANITIZE := $(strip $(SANITIZE)) else SANITIZE:=0 endif ifdef IGNORE_LEAKS IGNORE_LEAKS := $(strip $(IGNORE_LEAKS)) else IGNORE_LEAKS:=0 endif ifndef DARWIN DARWIN:=0 else DARWIN := $(strip $(DARWIN)) endif ifndef LINUX LINUX:=0 else LINUX := $(strip $(LINUX)) endif ifndef DEBIAN DEBIAN:=0 else DEBIAN := $(strip $(DEBIAN)) endif ifndef ARB_64 ARB_64=1#default to 64bit else ARB_64 := $(strip $(ARB_64)) endif # Variables allowed for injection [InjectedEnvironment] # (alternatively initialize them with '?=', e.g. done for XLIBS and XINCLUDES) # In both cases add them to SOURCE_TOOLS/export2sub ifndef XML_INCLUDES XML_INCLUDES= endif ifndef XAW_LIBS XAW_LIBS= endif ifneq ($(CONFIG_MAKEFILE_FOUND),) ifneq ($(DARWIN)$(LINUX),10) ifneq ($(DARWIN)$(LINUX),01) $(error exactly one of DARWIN=1 or LINUX=1 has to be defined (got:$(DARWIN)$(LINUX))) endif endif endif # compiler settings: ifneq ($(CC),use__A_CC__instead_of__CC) A_CC:=$(CC)# compile C A_CXX:=$(CXX)# compile C++ # uncomment to ensure no submakefile uses CC and CXX directly override CC:=use__A_CC__instead_of__CC override CXX:=use__A_CXX__instead_of__CXX endif export CC CXX A_CC A_CXX # unconditionally prepend $(ARBHOME)/lib to LD_LIBRARY_PATH if not found ifeq ($(findstring $(ARBHOME)/lib,$(LD_LIBRARY_PATH)),) LD_LIBRARY_PATH:=${ARBHOME}/lib:$(LD_LIBRARY_PATH) endif # store LD_LIBRARY_PATH to circumvent SIP restrictions: ARBBUILD_LIBRARY_PATH:=$(LD_LIBRARY_PATH) FORCEMASK = umask 002 NODIR=--no-print-directory SED:=$(ARBHOME)/SH/arb_sed READLINK:=$(ARBHOME)/SH/arb_readlink # ---------------------- compiler version detection # supported gcc versions: ALLOWED_gcc_VERSIONS=\ 4.4.3 4.4.5 4.4.6 4.4.7 \ 4.5.2 \ 4.6.1 4.6.2 4.6.3 4.6.4 \ 4.7.1 4.7.2 4.7.3 4.7.4 \ 4.8.0 4.8.1 4.8.2 4.8.3 4.8.4 4.8.5 \ 4.9.0 4.9.1 4.9.2 4.9.3 4.9.4 \ 5.1.0 5.2.0 5.3.0 5.4.0 5.5.0 \ 6.1.0 6.2.0 6.3.0 6.4.0 6.5.0 \ 7.1.0 7.2.0 7.3.0 7.4.0 7.5.0 \ 8.1.0 8.2.0 8.3.0 8.4.0 8.5.0 \ 9.1.0 9.2.0 9.3.0 9.4.0 9.5.0 \ 10.1.0 10.2.0 10.3.0 10.4.0 10.5.0 \ # Note: starting with version 5, arb silently accepts any subversion number # above zero. See SOURCE_TOOLS/arb_compiler_version.pl@acceptSubVersions # # This may cause problems when manually checking for compiler versions in code # (GCC_VERSION_CODE is not affected, GCC_PATCHLEVEL_CODE may cause problems!) # ---------------------- COMPILER_INFO:=$(shell SOURCE_TOOLS/arb_compiler_version.pl $(A_CXX)) COMPILER_NAME:=$(word 1,$(COMPILER_INFO)) COMPILER_VERSION:=$(word 2,$(COMPILER_INFO)) USE_CLANG:=0 ifneq ($(COMPILER_NAME),gcc) ifeq ($(COMPILER_NAME),clang) USE_CLANG:=1 else ifeq ($(COMPILER_VERSION),4.6.4) # gcc version 4.6.4 segfaults when dumping symbols for detection (silently accept as gcc) COMPILER_NAME:=gcc else $(error failed to detect COMPILER_NAME (got '$(COMPILER_NAME)', expected 'clang' or 'gcc')) endif endif endif ifeq ($(USE_CLANG),1) # accept all clang versions: ALLOWED_COMPILER_VERSIONS=$(COMPILER_VERSION) else ALLOWED_COMPILER_VERSIONS=$(ALLOWED_gcc_VERSIONS) endif COMPILER_VERSION_ALLOWED=$(strip $(subst ___,,$(foreach version,$(ALLOWED_COMPILER_VERSIONS),$(findstring ___$(version)___,___$(COMPILER_VERSION)___)))) #---------------------- split gcc version SPLITTED_VERSION:=$(subst ., ,$(COMPILER_VERSION)) USE_GCC_MAJOR:=$(word 1,$(SPLITTED_VERSION)) USE_GCC_MINOR:=$(word 2,$(SPLITTED_VERSION)) USE_GCC_PATCHLEVEL:=$(word 3,$(SPLITTED_VERSION)) USE_GCC_452_OR_HIGHER:= USE_GCC_46_OR_HIGHER:= USE_GCC_47_OR_HIGHER:= USE_GCC_48_OR_HIGHER:= USE_GCC_49_OR_HIGHER:= USE_GCC_50_OR_HIGHER:= USE_GCC_60_OR_HIGHER:= USE_GCC_70_OR_HIGHER:= USE_GCC_80_OR_HIGHER:= USE_GCC_90_OR_HIGHER:= ifeq ($(USE_CLANG),0) ifeq ($(USE_GCC_MAJOR),4) ifeq ($(USE_GCC_MINOR),5) ifneq ('$(findstring $(USE_GCC_PATCHLEVEL),23456789)','') USE_GCC_452_OR_HIGHER:=yes endif else ifneq ('$(findstring $(USE_GCC_MINOR),6789)','') USE_GCC_452_OR_HIGHER:=yes USE_GCC_46_OR_HIGHER:=yes ifneq ($(USE_GCC_MINOR),6) USE_GCC_47_OR_HIGHER:=yes ifneq ($(USE_GCC_MINOR),7) USE_GCC_48_OR_HIGHER:=yes ifneq ($(USE_GCC_MINOR),8) USE_GCC_49_OR_HIGHER:=yes endif endif endif endif endif else # gcc 5.x or higher USE_GCC_452_OR_HIGHER:=yes USE_GCC_46_OR_HIGHER:=yes USE_GCC_47_OR_HIGHER:=yes USE_GCC_48_OR_HIGHER:=yes USE_GCC_49_OR_HIGHER:=yes USE_GCC_50_OR_HIGHER:=yes ifneq ($(USE_GCC_MAJOR),5) # gcc 6.x or higher USE_GCC_60_OR_HIGHER:=yes ifneq ($(USE_GCC_MAJOR),6) # gcc 7.x or higher USE_GCC_70_OR_HIGHER:=yes ifneq ($(USE_GCC_MAJOR),7) # gcc 8.x or higher USE_GCC_80_OR_HIGHER:=yes ifneq ($(USE_GCC_MAJOR),8) # gcc 9.x or higher USE_GCC_90_OR_HIGHER:=yes endif endif endif endif endif endif #---------------------- define special directories for non standard builds ifeq ($(DARWIN),1) OSX_FW:=/System/Library/Frameworks OSX_FW_OPENGL:=$(OSX_FW)/OpenGL.framework/Versions/A/Libraries OSX_FW_GLUT:=$(OSX_FW)/GLUT.framework/Versions/A/Libraries OSX_FW_IMAGEIO:=$(OSX_FW)/ApplicationServices.framework/Versions/A/Frameworks/ImageIO.framework/Versions/A/Resources endif #---------------------- SSE vectorization # for details about vectorization checks see SOURCE_TOOLS/vectorize.README DISABLE_VECTORIZE_CHECK:=0# set to 1 to completely disable vectorization checks TRACE_MISSED_VECTORIZATIONS:=0# set to 1 to activate detailed output about failed vectorizations # (does also show details about successful vectorized loops, which are not optimal) VECTORIZATION_CHECK_CANDIDATES:=0# set to 1 to show vectorizations that may be checked # (for yet unchecked files) # Note: TRACE_MISSED_VECTORIZATIONS and VECTORIZATION_CHECK_CANDIDATES cannot be used together! #---------------------- Support for OPENMP USE_OPENMP:=1 ifeq ($(DARWIN),1) USE_OPENMP:=0 endif #---------------------- ifeq ($(DARWIN),1) LINK_STATIC=1# link static else LINK_STATIC=0# link dynamically # LINK_STATIC=1# link static (testing only) endif shared_cflags :=# flags for shared lib compilation onlyC_flags :=# flags only suitable for C (not C++; see cxxflags). clflags :=# linker flags (when passed through gcc) extended_warnings :=# warning flags for C and C++-compiler extended_cpp_warnings :=# warning flags for C++-compiler only ifeq ($(DEBUG),0) dflags := -DNDEBUG# defines ifeq ($(USE_CLANG),1) cflags := -O3# compiler flags (C and C++) else clflags += -Wl,-O2# passthrough linker flags # ------- standard optimization: cflags := -O3# compiler flags (C and C++) # ------- test changed optimization (DISABLE_VECTORIZE_CHECK for -O2 or lower): # cflags := -O2# do not commit uncommented! # DISABLE_VECTORIZE_CHECK:=1 endif endif ifeq ($(DEBIAN),1) clflags += -Wl,-rpath=/usr/lib/arb/lib -Wl,-z,relro endif ifeq ($(DEBUG),1) dflags := -DDEBUG gdb_common := -g -g3 -ggdb -ggdb3 DBGOPTI:=-O0 ifneq ('$(SANITIZE)','0') # sanitizer report several bogus buffer-overflows when arb is build with -O0 (e.g. with gcc 7.5.0) DBGOPTI:=-O1 endif ifeq ($(STABS),1) $(error STABS no longer supported) endif cflags := $(DBGOPTI) $(gdb_common) # cflags := -O2 $(gdb_common) # use this for callgrind (force inlining) ifeq ($(DARWIN),0) clflags += -Wl,-g # Note: # Previously '-Wl,-noinhibit-exec' was added to 'clflags' here, # to fix some issues with launchpad binutils (see [12972]). # But that change also caused 'undefined symbols' NOT to be reported as errors # at link time, producing executables that fail at runtime :/ endif ifeq ($(DEBUG_GRAPHICS),1) dflags += -DDEBUG_GRAPHICS endif endif # DEBUG only # ------------------------------ POST_COMPILE - control how much you get spammed # (please do not change default in SVN) POST_COMPILE := 2>&1 | $(ARBHOME)/SOURCE_TOOLS/postcompile.pl # POST_COMPILE += --original # dont modify compiler output # POST_COMPILE += --hide-Noncopyable-advices # POST_COMPILE += --show-useless-Weff++ # POST_COMPILE += --no-warnings # POST_COMPILE += --only-first-error # POST_COMPILE += --no-warnings --only-first-error # always pass used compiler version to postcompile: POST_COMPILE += --compiler=$(COMPILER_VERSION) # ------------------------------ # Enable extra warnings extended_warnings := extended_cpp_warnings := # C and C++ extended_warnings += -Wwrite-strings -Wunused -Wno-aggregate-return ifeq ('$(USE_GCC_50_OR_HIGHER)','yes') # disable shadow warnings for gcc 4.8 (and lower) # (does e.g. warn if a method-name is used as parameter in another method - even for derived classes. unusable!) extended_warnings += -Wshadow endif # C++ only extended_cpp_warnings += -Wnon-virtual-dtor -Wreorder -Wpointer-arith -Wdisabled-optimization -Wmissing-format-attribute extended_cpp_warnings += -Wctor-dtor-privacy # extended_cpp_warnings += -Wfloat-equal extended_cpp_warnings += -Wmissing-noreturn # extended_cpp_warnings += -Wold-style-cast# (warns about 28405 old-style casts) extended_cpp_warnings += -Winit-self extended_cpp_warnings += -Wstrict-aliasing extended_cpp_warnings += -Wextra # ------- above only warning-options already available in gcc 4.4.3 # -Weffc++ broken in 4.7.x series # gcc 4.7.3 crashes on GenomeImport.cxx when -Weffc++ is active # (bug reported https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56923; apparently wont be fixed for 4.7-series) # gcc 4.7.4 crashes on DBwriter.cxx when -Weffc++ is active WEFFC_BROKEN:=0 ifeq ('$(USE_GCC_47_OR_HIGHER)','yes') ifneq ('$(USE_GCC_48_OR_HIGHER)','yes') WEFFC_BROKEN:=1 endif endif ifeq ('$(WEFFC_BROKEN)','0') extended_cpp_warnings += -Weffc++ endif # turn off -Wmaybe-uninitialized in debug mode (gets activated with -Wextra). too many bogus warnings ifeq ($(DEBUG),1) ifeq ($(USE_CLANG),0) extended_cpp_warnings += -Wno-maybe-uninitialized endif endif SUGGEST_FINAL:= ifeq ('$(USE_GCC_452_OR_HIGHER)','yes') extended_cpp_warnings += -Wlogical-op# gcc 4.5.2 endif ifeq ('$(USE_GCC_47_OR_HIGHER)','yes') extended_cpp_warnings += -Wzero-as-null-pointer-constant# gcc 4.7 endif ifeq ('$(USE_GCC_48_OR_HIGHER)','yes') extended_cpp_warnings += -Wunused-local-typedefs# available since gcc 4.7 (but fails for each STATIC_ASSERT, so enable only for Cxx11) endif ifeq ('$(USE_GCC_50_OR_HIGHER)','yes') extended_cpp_warnings += -Wswitch-bool extended_cpp_warnings += -Wlogical-not-parentheses extended_cpp_warnings += -Wsizeof-array-argument extended_cpp_warnings += -Wbool-compare SUGGEST_FINAL:=yes endif ifeq ('$(USE_GCC_60_OR_HIGHER)','yes') extended_cpp_warnings += -Wduplicated-cond endif ifeq ('$(USE_GCC_80_OR_HIGHER)','yes') extended_cpp_warnings += -Wmultistatement-macros endif # switch off final suggestions for 8.3.0 and 8.4.0: ifeq ('$(COMPILER_VERSION)','8.3.0') SUGGEST_FINAL:=no endif ifeq ('$(COMPILER_VERSION)','8.4.0') SUGGEST_FINAL:=no endif ifeq ($(DEVELOPER),RELEASE) # switch off final suggestions in RELEASE: SUGGEST_FINAL:=no endif # suggest final: ifeq ('$(SUGGEST_FINAL)','yes') extended_cpp_warnings += -Wsuggest-final-types extended_cpp_warnings += -Wsuggest-final-methods dflags += -DSUGGESTS_FINAL endif #---------------------- turn off clang bogus warnings ifeq ($(USE_CLANG),1) # -Wmismatched-tags warns about struct/class mismatch in forward declarations (which is explicitely allowed) # -Wchar-subscripts reports too many bogus warnings for "array['x']" (when 'x' is known to be in range [0..128]) # -Wunused-private-field report too many false positives (currently ~ 2 of 3) # -Wstring-plus-int warns about common ARB coding practice # -Wgnu-static-float-init warns about accepted GNU extension extended_cpp_warnings += -Wno-mismatched-tags -Wno-char-subscripts -Wno-unused-private-field -Wno-string-plus-int ifeq ('$(COMPILER_VERSION)','4.2.1') # jenkins build (doesn't know switch -Wno-gnu-static-float-init) extended_cpp_warnings += -Wno-gnu else extended_cpp_warnings += -Wno-gnu-static-float-init endif endif #---------------------- developer ifneq ($(DEVELOPER),ANY) # ANY=default setting (skip all developer specific code) dflags += -DDEVEL_$(DEVELOPER)# activate developer/release specific code endif #---------------------- activate TODO warnings? ifndef SHOWTODO ifeq ($(DEVELOPER),RALF) SHOWTODO:=1 else SHOWTODO:=0 endif endif ifeq ($(SHOWTODO),1) dflags += -DWARN_TODO# activate "TODO" warnings endif #---------------------- activate threads? # only useful if compiler is able to compile Cxx11 or better ifeq ('$(USE_GCC_48_OR_HIGHER)','yes') # see also ./TEMPLATES/cxxforward.h@USE_Cxx11 cflags += -pthread clflags += -pthread endif #---------------------- activate Sanitizers? ASAN_OPTIONS:=handle_segv=0:color=0 ifeq ($(IGNORE_LEAKS),1) ASAN_OPTIONS+=:detect_leaks=0 # disable leak-detection else ASAN_OPTIONS+=:detect_leaks=1 # detect leaks (normal setting) endif ASAN_OPTIONS+=:check_initialization_order=1 # ASAN_OPTIONS+=:abort_on_error=1 # suppressions: SOURCE_TOOLS/arb.leaksan.supp LSAN_OPTIONS:=max_leaks=3:suppressions=$(ARBHOME)/SOURCE_TOOLS/arb.leaksan.supp UBSAN_OPTIONS:=print_stacktrace=1 SANITIZE_ADDRESS:=0 SANITIZE_UNDEFINED:=0 ifneq ($(SANITIZE),0) ifeq ($(SANITIZE),all) SANITIZE:=3 endif ifeq ($(SANITIZE),1) SANITIZE_ADDRESS:=1 else ifeq ($(SANITIZE),2) SANITIZE_UNDEFINED:=1 else ifeq ($(SANITIZE),3) SANITIZE_ADDRESS:=1 SANITIZE_UNDEFINED:=1 else $(error Unknown value '$(SANITIZE)' specified for SANITIZE in config.makefile) endif endif endif endif ifeq ($(SANITIZE_ADDRESS),1) ifneq ('$(USE_GCC_48_OR_HIGHER)','yes') $(info AddressSanitizer not usable with gcc $(COMPILER_VERSION) - disabled) SANITIZE_ADDRESS:=0 else ifneq ('$(USE_GCC_49_OR_HIGHER)','yes') $(info LeakSanitizer does not work with gcc $(COMPILER_VERSION) - disabled) # need to disable AddressSanitizer (otherwise build fails; only affects gcc 4.8.x series) SANITIZE_ADDRESS:=0 endif endif endif ifeq ($(SANITIZE_UNDEFINED),1) ifneq ('$(USE_GCC_49_OR_HIGHER)','yes') $(info UndefinedBehaviorSanitizer not usable with gcc $(COMPILER_VERSION) - disabled) SANITIZE_UNDEFINED:=0 endif endif SANITIZE_ANY:=0 ifeq ($(SANITIZE_ADDRESS),1) SANITIZE_ANY:=1 endif ifeq ($(SANITIZE_UNDEFINED),1) SANITIZE_ANY:=1 endif # vectorization fails if sanitizer active where it normally succeeds -> disable check ifeq ($(SANITIZE_ANY),1) $(info disabling vectorize checks. would fail with sanitized code) DISABLE_VECTORIZE_CHECK:=1 else $(info no sanitizer enabled. reset: SANITIZE=0) SANITIZE:=0 endif # deactivate some bogus warnings occurring when sanitizing NDEBUG version # (do not disable for future gcc-version >= 8.x -> test again when available) ifeq ($(SANITIZE_ANY),1) ifeq ($(DEBUG),0) ifneq ('$(USE_GCC_80_OR_HIGHER)','yes') extended_cpp_warnings += -Wno-format-overflow extended_cpp_warnings += -Wno-maybe-uninitialized endif endif endif #---------------------- 32 or 64 bit cross_cflags:= cross_lflags:= cross_clflags:= ifeq ($(ARB_64),1) dflags += -DARB_64 shared_cflags += -fPIC CROSS_LIB:=# empty => autodetect below ifeq ($(DARWIN),1) cross_cflags += -arch x86_64 cross_lflags += -arch x86_64 cross_clflags += -arch x86_64 endif else CROSS_LIB:=/lib endif cflags += $(cross_cflags) clflags += $(cross_clflags) ifeq ('$(CROSS_LIB)','') # autodetect libdir ifeq ($(ARB_64),1) CROSS_LIB:=$(shell (test -d /lib64 && echo lib64) || echo lib) else CROSS_LIB:=$(shell (test -d /lib32 && echo lib32) || echo lib) endif endif #---------------------- unit tests ifndef UNIT_TESTS UNIT_TESTS=0#default is "no tests" endif ifeq ($(UNIT_TESTS),1) dflags += -DUNIT_TESTS UNIT_TESTER_LIB=UNIT_TESTER/UNIT_TESTER.a else UNIT_TESTER_LIB= endif #---------------------- use gcov ifndef COVERAGE COVERAGE=0#default is "no" endif ifneq ($(COVERAGE),0) GCOV_FLAGS=--coverage $(info disabling vectorize checks. would fail with COVERAGE on) DISABLE_VECTORIZE_CHECK:=1 else GCOV_FLAGS= endif cflags += $(GCOV_FLAGS) clflags += $(GCOV_FLAGS) cross_lflags += $(GCOV_FLAGS) #---------------------- other flags dflags += -D$(MACH) # define machine ifeq ($(DARWIN),1) shared_cflags += -fno-common else dflags += $(shell getconf LFS_CFLAGS) endif cflags += -pipe cflags += -fmessage-length=0# dont wrap compiler output cflags += -fshow-column# show columns cflags += -funit-at-a-time cflags += -fPIC cflags += -fno-common# link all global data into one namespace cflags += -fstrict-aliasing# gcc 3.4 onlyC_flags += -Werror-implicit-function-declaration ifeq ('$(USE_GCC_48_OR_HIGHER)','yes') cflags += -fno-diagnostics-show-caret#gcc 4.8 (4.7.?) endif #cflags += -save-temps# uncomment to see preprocessor output #---------------------- various sanitizers # There are some disabled tests in CORE/arb_misc.cxx@sanitizers # which trigger sanitizer reports. ifeq ($(SANITIZE_ANY),1) cflags += -ggdb3 -fno-omit-frame-pointer endif SANI_CFLAGS:= SANI_CLFLAGS:= # activate AddressSanitizer+LeakSanitizer? ifeq ($(SANITIZE_ADDRESS),1) SANI_CFLAGS += -fsanitize=address SANI_CLFLAGS += -fsanitize=address dflags += -DLEAKS_SANITIZED endif # activate UndefinedBehaviorSanitizer? ifeq ($(SANITIZE_UNDEFINED),1) SANI_CFLAGS += -fsanitize=undefined SANI_CLFLAGS += -fsanitize=undefined dflags += -DUNDEF_SANITIZED ifeq ('$(USE_GCC_50_OR_HIGHER)','yes') # abort on runtime errors SANI_CFLAGS += -fno-sanitize-recover=all endif cflags += $(SANI_CFLAGS) clflags += $(SANI_CLFLAGS) # # Note: alignment-sanitizer is deactivated for ARBDB and PROBE! ifeq ('$(DEBUG)','1') ifeq ($(USE_GCC_MAJOR),4) ifeq ($(USE_GCC_MINOR),9) ifneq ('$(findstring $(USE_GCC_PATCHLEVEL),01)','') # workaround https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63531 for 4.9.0 + 4.9.1 # (problem is fixed in 4.9.2 release) extended_cpp_warnings:=$(subst -Weffc++,,$(extended_cpp_warnings)) endif endif endif endif endif #---------------------- X11 location ifeq ($(DARWIN),1) XHOME:=$(PREFIX) else ifeq ($(DEBIAN),1) XHOME:=$(PREFIX) else XHOME:=/usr/X11R6 endif endif XINCLUDES ?= -I$(XHOME)/include XLIBS ?= -L$(XHOME)/$(CROSS_LIB) ifeq ($(DARWIN),1) XINCLUDES += -I$(OSX_FW)/GLUT.framework/Headers -I$(OSX_FW)/OpenGL.framework/Headers -I$(OSX_SDK)/usr/include/krb5 XLIBS += -lXm -lpng -lz -lXt -lX11 -lXext -lXp -lXmu -lXi XLIBS += -Wl,-dylib_file,$(OSX_FW_OPENGL)/libGL.dylib:$(OSX_FW_OPENGL)/libGL.dylib XLIBS += -Wl,-dylib_file,$(OSX_FW_OPENGL)/libGLU.dylib:$(OSX_FW_OPENGL)/libGLU.dylib else XLIBS += -lXm -lXpm -lXt -lXext -lX11 endif #---------------------- open GL ifeq ($(OPENGL),1) cflags += -DARB_OPENGL # activate OPENGL code GL := gl # this is the name of the OPENGL base target GL_LIB_SYS := -lGL -lGLU GL_LIB_ARB := -L$(ARBHOME)/GL/glAW -lglAW ifeq ($(DARWIN),1) GL_LIB_SYS += -lpthread endif GL_PNGLIBS_ARB := -L$(ARBHOME)/GL/glpng -lglpng_arb GL_PNGLIBS_SYS := -lpng GLEWLIB := -lGLEW -lGLw GLUTLIB := -lglut GL_LIBS_SYS := $(GL_LIB_SYS) $(GL_PNGLIBS_SYS) $(GLEWLIB) $(GLUTLIB) GL_LIBS_ARB := $(GL_LIB_ARB) $(GL_PNGLIBS_ARB) RNA3D_LIB := RNA3D/RNA3D.a else GL_LIBS_SYS:=# no opengl -> no libs GL_LIBS_ARB:=# no opengl -> no libs GL:=# dont build ARB openGL libs RNA3D_LIB := endif RNA3D_LIB_4_DEPENDS := RNA3D/RNA3D.a GL_LIBS:=$(GL_LIBS_ARB) $(GL_LIBS_SYS) #---------------------- sina: ifndef ISINA # build sina delivered with arb? ifeq ($(LINUX),1) ifeq ('$(USE_GCC_70_OR_HIGHER)','yes') ISINA := 1# default to 'yes' for linux with gcc>=7 endif endif ifndef ISINA ISINA := 0# 'no' otherwise endif endif #---------------------- tiff lib: TIFFLIBS := -ltiff #---------------------- XML lib: XMLLIBS := -lxerces-c #---------------------- glib: ARB_NEEDED_GLIB=glib-2.0 ARB_GLIB_INCLUDE:=$(strip $(shell pkg-config --cflags $(ARB_NEEDED_GLIB))) ARB_GLIB_LIBS:=$(strip $(shell pkg-config --libs $(ARB_NEEDED_GLIB))) #---------------------- sunrpc lib: # Note: sunrpc has been removed from glibc # (e.g. in SuSE Leap 15.3 and Fedora 28) # see https://fedoraproject.org/wiki/Changes/SunRPCRemoval # HAVE_LIBTIRPC=$(strip $(shell pkg-config --exists libtirpc && echo libtirpc)) ifeq ($(HAVE_LIBTIRPC),) ARB_RPC_INCLUDE:= ARB_RPC_LIBS:= else ARB_RPC_INCLUDE:=$(strip $(shell pkg-config --cflags $(HAVE_LIBTIRPC))) ARB_RPC_LIBS:=$(strip $(shell pkg-config --libs $(HAVE_LIBTIRPC))) endif #---------------------- basic libs: ARB_CORE_LIBS:=$(ARB_GLIB_LIBS) $(ARB_RPC_LIBS) SYSLIBS:= ifeq ($(DARWIN),1) SYSLIBS += -lstdc++ else SYSLIBS += -lm $(ARB_CORE_LIBS) endif #---------------------- system dependent commands ifeq ($(DARWIN),1) TIME:=gtime else TIME:=/usr/bin/time endif #---------------------- SSE vectorizer # for details see SOURCE_TOOLS/vectorize.README ifeq ($(DEBUG),0) ifeq ($(USE_GCC_49_OR_HIGHER),yes) ifeq ($(DISABLE_VECTORIZE_CHECK),0) cflags += -fopt-info-vec cflags += -fopt-info-vec-missed ifeq ($(TRACE_MISSED_VECTORIZATIONS),1) # Shows reasons for unsuccessful vectorization: cflags += -ftree-vectorizer-verbose=10 POST_COMPILE += --dump-loop-optimization ifeq ($(VECTORIZATION_CHECK_CANDIDATES),1) $(error TRACE_MISSED_VECTORIZATIONS and VECTORIZATION_CHECK_CANDIDATES may not be used together!) endif endif ifeq ($(VECTORIZATION_CHECK_CANDIDATES),1) POST_COMPILE += --loop-optimization-candi endif POST_COMPILE += --check-loop-optimization endif else ifeq ($(USE_GCC_48_OR_HIGHER),yes) # no automatic vectorization-check for gcc<4.9.0 # -> uncomment the next 2 lines and grep the spam it will produce for 'vectorized.*loops' # cflags += -fopt-info -fopt-info-vec-missed # POST_COMPILE += --original endif endif endif #---------------------- stop early on broken flags/compiler combination ifeq ($(DEBUG),0) ifeq ($(SANITIZE_ANY),1) ifeq ('$(COMPILER_VERSION)','4.9.1') $(error compiling DEBUG=0 + SANITIZE!=0 crashes with gcc $(COMPILER_VERSION) (gcc 4.9.2 works)) endif endif endif #---------------------- include symbols? ifeq ($(TRACESYM),1) ifeq ($(USE_CLANG),0) cflags += -rdynamic clflags += -rdynamic -Wl,--export-dynamic endif endif #---------------------- warn about duplicate variable definitions ifeq ($(DARWIN),1) clflags += -Wl,-warn_commons else clflags += -Wl,--warn-common endif #---------------------- differences between linking executables and shared libs: # executables: ifeq ($(DARWIN),1) blflags:=$(clflags) else blflags:=$(clflags) -Wl,--no-undefined endif # shared libraries llflags:=$(clflags) # dont use clflags below clflags:= # ------------------------------------------------------------------------- # Don't put any machine/version/etc conditionals below! # (instead define variables above) # ------------------------------------------------------------------------- cflags += -W -Wall $(dflags) $(extended_warnings) cxxflags := $(extended_cpp_warnings)# flags only suitable for C++ (not C; see onlyC_flags). # add CFLAGS + CPPFLAGS from environment for DEBIAN build ifeq ($(DEBIAN),1) cflags := $(CFLAGS) $(cflags) cxxflags += $(CPPFLAGS) endif ifeq ('$(USE_CLANG)','1') # none of the following standards works with clang3.3 (under linux) => dont use standard (as done before r15516) # cxxflags += -std=gnu++11 # cxxflags += -std=gnu++0x else ifeq ('$(USE_GCC_60_OR_HIGHER)','yes') cxxflags += -std=gnu++14# see also TEMPLATES/cxxforward.h@USE_Cxx14 else ifeq ('$(USE_GCC_47_OR_HIGHER)','yes') cxxflags += -std=gnu++11# see also TEMPLATES/cxxforward.h@USE_Cxx11 else # gcc versions between 4.3 (lowest supported) and <4.7 cxxflags += -std=gnu++0x endif endif endif LINK_STATIC_LIB := $(AR) -csq# link static lib LINK_EXECUTABLE := $(A_CXX) $(blflags) -o# link executable (c++) ifeq ($(LINK_STATIC),1) SHARED_LIB_SUFFIX = a# static lib suffix LINK_SHARED_LIB := $(LINK_STATIC_LIB) else SHARED_LIB_SUFFIX = so# shared lib suffix LINK_SHARED_LIB := $(A_CXX) $(llflags) -shared -o# link shared lib endif ifeq ($(DARWIN),1) lflags4perl:= else lflags4perl:=$(cross_lflags) -shared endif # delete variables unused below blflags:= llflags:= # other used tools MAKEDEPEND_PLAIN = makedepend MAKEDEPEND = $(FORCEMASK);$(MAKEDEPEND_PLAIN) SEPNODATE:=-------------------------------------------------------------------------------- SEP=[`date +%M:%S.%N`] ------------------------------------------------ # to analyse timings run # make -j9 clean; make -j9 all | grep '^\[' | sort # make -j9 "TIMED_TARGET=perl" clean_timed_target | grep '^\[' | sort # ------------------------------------------------------------ DYNLIBDEFS # various dynamic library definitions for linking executables: # # SYSLIBS: system libraries needed by database lib # ARBDB_LIB: database lib # DBSYS_LIBS: executable using database (but no GUI) # GUI_LIBS: executable using database and GUI (arb gui uses database) # # Note: definitions exported to sub-makefiles are described in SOURCE_TOOLS/parent_make.txt CORE_LIB=-lCORE ARBDB_LIB=-lARBDB $(CORE_LIB) DBSYS_LIBS = $(ARBDB_LIB) $(SYSLIBS) GUI_LIBS_PREFIX:= ifeq ($(DARWIN),1) # this seem to be added at wrong place, since opengl is only needed to link EDIT4 GUI_LIBS_PREFIX:=-framework GLUT -framework OpenGL endif GUI_LIBS=$(GUI_LIBS_PREFIX) $(DBSYS_LIBS) -lAWT -lWINDOW $(XLIBS) LIBPATH = -L$(ARBHOME)/lib DEST_LIB = lib DEST_BIN = bin CC_INCLUDES := -I. -I$(ARBHOME)/INCLUDE $(XINCLUDES) $(ARB_GLIB_INCLUDE) $(ARB_RPC_INCLUDE) CXX_INCLUDES := $(CC_INCLUDES) MAKEDEPENDFLAGS := -- -DARB_OPENGL -DUNIT_TESTS -D__cplusplus -I. -Y$(ARBHOME)/INCLUDE # --------------------------------------- # wrap main() use_ARB_main=$(ARBHOME)/SOURCE_TOOLS/arb_main_cpp.o use_ARB_main_C=$(ARBHOME)/SOURCE_TOOLS/arb_main_c.o # ----------------------------------------- # unique build-id # - different for different calls of make # - constant in recursive calls ifndef ARBBID ARBBID:=$(shell SOURCE_TOOLS/uniqueID.sh) endif # ----------------------------------------- # export variables to submakefiles include SOURCE_TOOLS/export2sub # do not define (exported) variables below this point # ------------------------- # Main arb targets: # ------------------------- first_target: $(MAKE) checks @echo $(SEPNODATE) @echo 'Main targets:' @echo '' @echo ' all - Compile ARB + TOOLs + and copy shared libs + link foreign software' @echo ' (That is most likely the target you want)' @echo '' @echo ' clean - remove generated files ("SUBDIR/SUBDIR.clean" to clean only SUBDIR)' @echo ' rebuild - clean + all' @echo ' cleanlinked - remove all binaries' @echo ' relink - cleanlinked + all (=relink all from objects)' @echo '' @echo 'Targets for automated builds:' @echo '' @echo ' ALL, REBUILD, TARFILE + TARFILE_QUICK ' @echo ' - same as all, rebuild, tarfile + tarfile_quick' @echo ' - if errors occur, they are extracted and listed at tail of output' @echo '' @echo $(SEPNODATE) @echo '' @echo 'Development targets:' @echo '' @echo ' depends - create or update dependencies ("SUBDIR/SUBDIR.depends" to update only SUBDIR)' @echo ' proto - create or update prototypes ("SUBDIR/SUBDIR.proto" to update only SUBDIR)' @echo ' tags - create tags for xemacs' @echo ' show - show available shortcuts (AKA subtargets)' @echo ' up - shortcut for depends+proto+tags' ifeq ($(UNIT_TESTS),1) @echo ' ut - only run tests' @echo ' "UNIT=..." oneunit - build one unit and run tests (see also UNIT_TESTER/Makefile.setup.local)' endif ifneq ($(SANITIZE),0) @echo ' sanitize - all + run arb_ntree with sanitizer (test.arb + execute _logged)' endif @echo ' modified - rebuild files modified in svn checkout (does touch)' @echo ' touch - touch files modified in svn checkout' @echo '' @echo 'Some often used sub targets:' @echo '' @echo ' arb - Just compile ARB (but none of the integrated tools)' @echo ' menus - create lib/gde/arb.menu from GDEHELP/ARB_GDEmenus.source' @echo ' perl - Compile the PERL XSUBS into lib/ARB.so and create links in lib to perl' @echo ' binlink - Create all links in the bin directory' @echo '' @echo 'Internal maintenance:' @echo '' @echo ' relinfo - show help on release targets' @echo ' tarfile - make rebuild and create arb version tarfile ("tarfile_quick" to skip rebuild)' @echo ' save - save all basic ARB sources into arbsrc_DATE ("savetest" to check filelist)' @echo ' patch - save svn diff to patchfile' @echo ' source_doc - create doxygen documentation' @echo ' relocated - rebuild partly (use when you have relocated ARBHOME)' @echo ' check_res - check resource usage' @echo ' dep_graph - Build dependency graphs' @echo ' clean_cov - Clean coverage results' @echo '' @echo ' clean_opengl_changed - clean after changing OPENGL setting in config.Makefile' @echo ' clean_checked_vect - clean units containing vectorization checks' @echo ' cleanRelinkable - similar to cleanlinked (but skips raxml8 to avoid rebuild)' @echo '' @echo ' post_commit_check - Checks whether' @echo ' * main make targets work,' @echo ' * dependencies and prototypes are up to date,' @echo ' * SVN-controlled files remain unaffected by called targets and' @echo ' * all generated files are ignored.' @echo ' (has to be called in a clean SVN checkout)' @echo $(SEPNODATE) @echo '' relinfo: @echo '' @echo $(SEPNODATE) @echo 'Release targets:' @echo '' @echo ' inc_candi - increase RC candidate-number (only possible in "rc" branch, not needed for RC1)' @echo ' inc_patch - increase release patchlevel (only possible in "stable" branch)' @echo ' inc_minor - increase minor version number (only possible in "trunk")' @echo ' inc_major - increase MAJOR version number (only possible in "trunk")' @echo '' @echo ' show_version - show version tag' @echo '' @echo $(SEPNODATE) @echo '' # auto-generate config.makefile: config.makefile : config.makefile.template @echo -------------------------------------------------------------------------------- ifeq ($(CONFIG_MAKEFILE_FOUND),) @cp $< $@ @echo '$(ARBHOME)/$@:1: has been generated.' @echo 'Please edit $@ to configure your system!' @echo -------------------------------------------------------------------------------- @false else @echo '$(ARBHOME)/$<:1: is more recent than' @echo '$(ARBHOME)/$@:1:' @ls -al config.makefile* @echo -------------------------------------------------------------------------------- @echo "Updating $@ (if this fails, check manually)" SOURCE_TOOLS/update_config_makefile.pl @echo "Sucessfully updated $@" @echo -------------------------------------------------------------------------------- @ls -al config.makefile* @echo -------------------------------------------------------------------------------- @echo "Diff to your old config.makefile:" @echo -------------------------------------------------------------------------------- -diff $@.bak $@ @echo -------------------------------------------------------------------------------- endif # check if everything is configured correctly check_DEVELOPER: ifndef DEVELOPER @echo 'config.makefile:1: DEVELOPER not defined' @false endif check_DEBUG: ifndef dflags @echo 'config.makefile:1: DEBUG has to be defined. Valid values are 0 and 1' @false endif check_ARB_64: ifndef ARB_64 @echo 'config.makefile:1: ARB_64 has to be defined. Valid values are 0 and 1' @false endif # ---------------------------------------- check gcc version COMPILER_BROKEN:=0 ifeq ('$(COMPILER_VERSION_ALLOWED)', '4.6.4') COMPILER_BROKEN:=1 endif ifeq ('$(COMPILER_VERSION_ALLOWED)', '4.8.0') COMPILER_BROKEN:=1 endif check_same_GCC_VERSION: $(ARBHOME)/SOURCE_TOOLS/check_same_compiler_version.pl $(COMPILER_NAME) $(COMPILER_VERSION_ALLOWED) check_GCC_VERSION: @echo 'Compiler version check:' # see .@ALLOWED_gcc_VERSIONS ifeq ('$(COMPILER_VERSION_ALLOWED)', '') @echo " - Your compiler is '$(COMPILER_NAME)' version '$(COMPILER_VERSION)'" @echo ' This version is not in the list of supported $(COMPILER_NAME)-versions:' @$(foreach version,$(ALLOWED_COMPILER_VERSIONS),echo ' * $(version)';) @echo ' - You may either ..' @echo ' - add your version to ALLOWED_$(COMPILER_NAME)_VERSIONS in the Makefile and try it out or' @echo ' - switch to one of the allowed versions (see arb_README_gcc.txt for installing' @echo ' a different version of gcc)' $(error Unsupported compiler '$(COMPILER_NAME)' version '$(COMPILER_VERSION)') else ifeq ($(COMPILER_BROKEN),1) $(error compilation refused for $(COMPILER_NAME) version '$(COMPILER_VERSION_ALLOWED)'. Refer to http://bugs.arb-home.de/wiki/GccVersionInfo for details.) else @echo " - Supported $(COMPILER_NAME) version '$(COMPILER_VERSION_ALLOWED)' detected - fine!" @echo '' ifeq ($(USE_CLANG),1) @echo "Dump clang version:" $(A_CXX) -v endif $(MAKE) check_same_GCC_VERSION endif endif #---------------------- check ARBHOME # use arb_INSTALL.txt to determine whether ARBHOME points to correct directory ARB_INSTALL_FOUND=$(wildcard $(ARBHOME)/arb_INSTALL.txt) check_ARBHOME: ifeq ($(strip $(ARB_INSTALL_FOUND)),) @echo ------------------------------------------------------------ @echo "ARBHOME is set to '$(ARBHOME)'" @echo "The environment variable ARBHOME has to point to the top arb source directory." @echo "If you use bash enter:" @echo " export ARBHOME='`pwd`'" @echo ------------------------------------------------------------ @false endif ARB_PATH_SET=$(findstring $(ARBHOME)/bin,$(PATH)) check_PATH: check_ARBHOME ifeq ($(strip $(ARB_PATH_SET)),) @echo ------------------------------------------------------------ @echo "The environment variable PATH has to contain $(ARBHOME)/bin" @echo "If you use bash enter:" @echo ' export PATH=$$ARBHOME/bin:$$PATH' @echo ------------------------------------------------------------ @false endif check_TOOLS: @util/arb_check_build_env.pl \ "$(A_CC)" \ "$(A_CXX)" \ "$(LINK_SHARED_LIB)" \ have_makedepend: @util/arb_check_build_env.pl --check-only "$(MAKEDEPEND_PLAIN)" check_ENVIRONMENT : check_PATH check_TOOLS @echo "-------------------- Environment [start]" @echo "ARBHOME='$(ARBHOME)'" @echo "PATH='$(PATH)'" @echo "LD_LIBRARY_PATH='$(LD_LIBRARY_PATH)'" @echo "-------------------- Environment [end]" check_tabs: check_setup ifeq ($(DEBUG),1) @SOURCE_TOOLS/tabBrake.pl endif force_tab_check: @touch -t 198001010000 SOURCE_TOOLS/stamp.tabBrake @$(MAKE) check_tabs # --------------------- check_setup: check_ENVIRONMENT check_DEBUG check_ARB_64 check_DEVELOPER check_GCC_VERSION @echo Your setup seems to be ok. checks: check_setup check_tabs @rm -f SOURCE_TOOLS/postcompile.sav # end test section ------------------------------ # --------------------------------------- # List of standard top level directories # # sub-makefiles have to define the targets # - 'depends' and # - 'clean' # # when adding new libraries/subdirs here, also add a dependency vs 'links' or 'links_non_perl' in .@DD_links_non_perl TL_ARCHIVES = \ AISC/AISC.a \ ARB_GDE/ARB_GDE.a \ AWTC/AWTC.a \ AWTI/AWTI.a \ CONSENSUS_TREE/CONSENSUS_TREE.a \ CONVERTALN/CONVERTALN.a \ DBSERVER/DBSERVER.a \ DIST/DIST.a \ EDIT4/EDIT4.a \ EISPACK/EISPACK.a \ GENOM/GENOM.a \ GENOM_IMPORT/GENOM_IMPORT.a \ ISLAND_HOPPING/ISLAND_HOPPING.a \ MERGE/MERGE.a \ MULTI_PROBE/MULTI_PROBE.a \ NALIGNER/NALIGNER.a \ NAMES/NAMES.a \ NAMES_COM/server.a \ NTREE/NTREE.a \ PARSIMONY/PARSIMONY.a \ PHYLO/PHYLO.a \ PRIMER_DESIGN/PRIMER_DESIGN.a \ PROBE/PROBE.a \ PROBE_COM/server.a \ PROBE_DESIGN/PROBE_DESIGN.a \ $(RNA3D_LIB) \ RNACMA/RNACMA.a \ SECEDIT/SECEDIT.a \ SEQ_QUALITY/SEQ_QUALITY.a \ SERVERCNTRL/SERVERCNTRL.a \ STAT/STAT.a \ TREEGEN/TREEGEN.a \ WETC/WETC.a \ XML/XML.a \ TL_SHARED_ARCHIVES = \ ARBDB/libARBDB.so \ CORE/libCORE.so \ AWT/libAWT.so \ WINDOW/libWINDOW.so \ TL_ARCHIV_COLLECTIONS = \ SL/SL.archColl \ TL_TOOLS_COLLECTIONS = \ AISC_MKPTPS/AISC_MKPTPS.toolColl \ TOOLS/TOOLS.toolColl \ PERLTOOLS/PERLTOOLS.toolColl \ PROBE_SET/PROBE_SET.toolColl \ READSEQ/READSEQ.toolColl \ RECURSIVE_SUBS = \ GDE/GDE.sub \ UNIT_TESTER/UNIT_TESTER.sub \ SUBDIRS = \ $(RECURSIVE_SUBS) \ $(TL_ARCHIVES:.a=.sub) \ $(TL_SHARED_ARCHIVES:.so=.sub) \ $(TL_ARCHIV_COLLECTIONS:.archColl=.sub) \ $(TL_TOOLS_COLLECTIONS:.toolColl=.sub) \ # sub directories inside TL_ARCHIV_COLLECTIONS CL_ARCH_DIRS = $(foreach coll,$(TL_ARCHIV_COLLECTIONS),$(shell find $(dir $(coll)) -maxdepth 1 -mindepth 1 -type d)) # archives inside CL_ARCH_DIRS: CL_ARCHIVES = $(foreach adir,$(CL_ARCH_DIRS),$(dir $(adir))$(notdir $(adir))/$(notdir $(adir)).a) # ----------------------- # library packets ARCHS_CLIENT_PROBE = PROBE_COM/client.a ARCHS_CLIENT_NAMES = NAMES_COM/client.a ARCHS_MAKEBIN = AISC_MKPTPS/AISC_MKPTPS.a AISC/AISC.a # communication libs need aisc and aisc_mkpts: AISC/AISC.dummy: proto_tools comtools: AISC/AISC.dummy ARCHS_SEQUENCE = \ SL/SEQUENCE/SEQUENCE.a \ SL/ALIVIEW/ALIVIEW.a \ SL/PRONUC/PRONUC.a \ ARCHS_TREE = \ SL/ARB_TREE/ARB_TREE.a \ SL/FILTER/FILTER.a \ $(ARCHS_SEQUENCE) \ # parsimony tree (used by NTREE, PARSIMONY, STAT(->EDIT4), DIST(obsolete!)) ARCHS_AP_TREE = \ SL/AP_TREE/AP_TREE.a \ $(ARCHS_TREE) \ # -------------------------------------------------------------------------------- # dependencies for linking shared libs link_core: core link_db: db link_core link_aw: aw link_db link_awt: awt link_aw #*************************************************************************************** # Individual_Programs_Section #*************************************************************************************** arbmainwrapper: $(MAKE) -C SOURCE_TOOLS -r mainwrapper #*********************************** arb_ntree ************************************** NTREE = bin/arb_ntree ARCHS_NTREE = \ NTREE/NTREE.a \ ARB_GDE/ARB_GDE.a \ SL/GROUP_SEARCH/GROUP_SEARCH.a \ SL/SAICALC/SAICALC.a \ SL/DB_UI/DB_UI.a \ AWTC/AWTC.a \ AWTI/AWTI.a \ CONSENSUS_TREE/CONSENSUS_TREE.a \ GENOM_IMPORT/GENOM_IMPORT.a \ GENOM/GENOM.a \ MERGE/MERGE.a \ MULTI_PROBE/MULTI_PROBE.a \ PRIMER_DESIGN/PRIMER_DESIGN.a \ PROBE_DESIGN/PROBE_DESIGN.a \ SEQ_QUALITY/SEQ_QUALITY.a \ SERVERCNTRL/SERVERCNTRL.a \ SL/ALILINK/ALILINK.a \ SL/AW_NAME/AW_NAME.a \ SL/CONSENSUS/CONSENSUS.a \ SL/DB_SCANNER/DB_SCANNER.a \ SL/DB_QUERY/DB_QUERY.a \ SL/QUERY/QUERY.a \ SL/SEQIO/SEQIO.a \ STAT/STAT.a \ SL/GUI_ALIVIEW/GUI_ALIVIEW.a \ SL/HELIX/HELIX.a \ SL/REGEXPR/REGEXPR.a \ SL/REFENTRIES/REFENTRIES.a \ SL/NDS/NDS.a \ SL/ITEM_SHADER/ITEM_SHADER.a \ SL/ITEMS/ITEMS.a \ SL/INSDEL/INSDEL.a \ SL/LOCATION/LOCATION.a \ SL/MACROS/MACROS.a \ SL/PVP/PVP.a \ SL/TRANSLATE/TRANSLATE.a \ SL/TREEDISP/TREEDISP.a \ SL/TREE_ADMIN/TREE_ADMIN.a \ SL/TREE_READ/TREE_READ.a \ SL/TREE_WRITE/TREE_WRITE.a \ SL/XFERGUI/XFERGUI.a \ SL/XFERSET/XFERSET.a \ XML/XML.a \ $(ARCHS_AP_TREE) \ ARCHS_NTREE_ALL = $(ARCHS_NTREE) $(ARCHS_CLIENT_PROBE) $(GUI_LIBS) $(XMLLIBS) $(NTREE): $(ARCHS_NTREE:.a=.dummy) link_awt @SOURCE_TOOLS/binuptodate.pl $@ $(use_ARB_main) $(ARCHS_NTREE_ALL) || ( \ echo "$(SEP) Link $@"; \ echo "$(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_NTREE_ALL)" ; \ $(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_NTREE_ALL) && \ echo "$(SEP) Link $@ [done]"; \ ) #*********************************** arb_edit4 ************************************** EDIT4 = bin/arb_edit4 ARCHS_EDIT4 := \ EDIT4/EDIT4.a \ ARB_GDE/ARB_GDE.a \ SL/FAST_ALIGNER/FAST_ALIGNER.a \ AWTC/AWTC.a \ ISLAND_HOPPING/ISLAND_HOPPING.a \ SECEDIT/SECEDIT.a \ SERVERCNTRL/SERVERCNTRL.a \ SL/AW_HELIX/AW_HELIX.a \ SL/AW_NAME/AW_NAME.a \ SL/CONSENSUS/CONSENSUS.a \ SL/ITEMS/ITEMS.a \ STAT/STAT.a \ SL/GUI_ALIVIEW/GUI_ALIVIEW.a \ SL/HELIX/HELIX.a \ SL/TRANSLATE/TRANSLATE.a \ SL/MACROS/MACROS.a \ SL/NDS/NDS.a \ $(ARCHS_AP_TREE) \ XML/XML.a \ ifeq ($(OPENGL),1) ARCHS_EDIT4 += RNA3D/RNA3D.a endif ARCHS_EDIT4_ALL = $(ARCHS_EDIT4) $(ARCHS_CLIENT_NAMES) $(GUI_LIBS) $(LIBS_EDIT4) LIBS_EDIT4 := $(GL_LIBS) $(EDIT4): $(ARCHS_EDIT4:.a=.dummy) link_awt @SOURCE_TOOLS/binuptodate.pl $@ $(use_ARB_main) $(ARCHS_EDIT4_ALL) || ( \ echo "$(SEP) Link $@"; \ echo "$(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_EDIT4_ALL)" ; \ $(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_EDIT4_ALL) && \ echo "$(SEP) Link $@ [done]"; \ ) #*********************************** arb_rnacma ************************************** RNACMA = bin/arb_rnacma ARCHS_RNACMA = \ RNACMA/RNACMA.a \ ARCHS_RNACMA_ALL = $(ARCHS_RNACMA) $(DBSYS_LIBS) $(RNACMA) : $(ARCHS_RNACMA:.a=.dummy) link_db @SOURCE_TOOLS/binuptodate.pl $@ $(ARCHS_RNACMA_ALL) || ( \ echo "$(SEP) Link $@"; \ echo "$(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_RNACMA_ALL)"; \ $(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_RNACMA_ALL) && \ echo "$(SEP) Link $@ [done]"; \ ) #*********************************** arb_wetc ************************************** WETC = bin/arb_wetc ARCHS_WETC = \ WETC/WETC.a \ SL/HELIX/HELIX.a \ SL/FILTER/FILTER.a \ XML/XML.a \ ARCHS_WETC_ALL = $(ARCHS_WETC) $(GUI_LIBS) $(WETC): $(ARCHS_WETC:.a=.dummy) link_awt @SOURCE_TOOLS/binuptodate.pl $@ $(use_ARB_main) $(ARCHS_WETC_ALL) || ( \ echo "$(SEP) Link $@"; \ echo "$(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_WETC_ALL)" ; \ $(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_WETC_ALL) && \ echo "$(SEP) Link $@ [done]"; \ ) #*********************************** arb_dist ************************************** DIST = bin/arb_dist ARCHS_DIST = \ DIST/DIST.a \ CONSENSUS_TREE/CONSENSUS_TREE.a \ EISPACK/EISPACK.a \ SERVERCNTRL/SERVERCNTRL.a \ SL/GUI_ALIVIEW/GUI_ALIVIEW.a \ SL/HELIX/HELIX.a \ SL/MATRIX/MATRIX.a \ SL/MACROS/MACROS.a \ SL/NDS/NDS.a \ SL/ITEMS/ITEMS.a \ SL/NEIGHBOURJOIN/NEIGHBOURJOIN.a \ XML/XML.a \ $(ARCHS_AP_TREE) \ ARCHS_DIST_ALL = $(ARCHS_DIST) $(ARCHS_CLIENT_PROBE) $(GUI_LIBS) $(DIST): $(ARCHS_DIST:.a=.dummy) link_awt @SOURCE_TOOLS/binuptodate.pl $@ $(use_ARB_main) $(ARCHS_DIST_ALL) || ( \ echo "$(SEP) Link $@"; \ echo "$(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_DIST_ALL)" ; \ $(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_DIST_ALL) && \ echo "$(SEP) Link $@ [done]"; \ ) #*********************************** arb_pars ************************************** PARSIMONY = bin/arb_pars ARCHS_PARSIMONY = \ PARSIMONY/PARSIMONY.a \ SERVERCNTRL/SERVERCNTRL.a \ SL/AW_NAME/AW_NAME.a \ SL/GUI_ALIVIEW/GUI_ALIVIEW.a \ SL/HELIX/HELIX.a \ SL/MACROS/MACROS.a \ SL/NDS/NDS.a \ SL/ITEMS/ITEMS.a \ SL/TRANSLATE/TRANSLATE.a \ SL/TREEDISP/TREEDISP.a \ XML/XML.a \ $(ARCHS_AP_TREE) \ ARCHS_PARSIMONY_ALL = $(ARCHS_PARSIMONY) $(ARCHS_CLIENT_NAMES) $(GUI_LIBS) $(PARSIMONY): $(ARCHS_PARSIMONY:.a=.dummy) link_awt @SOURCE_TOOLS/binuptodate.pl $@ $(use_ARB_main) $(ARCHS_PARSIMONY_ALL) || ( \ echo "$(SEP) Link $@"; \ echo "$(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_PARSIMONY_ALL)" ; \ $(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_PARSIMONY_ALL) && \ echo "$(SEP) Link $@ [done]"; \ ) #*********************************** arb_convert_aln ************************************** CONVERT_ALN = bin/arb_convert_aln ARCHS_CONVERT_ALN = \ CONVERTALN/CONVERTALN.a \ ARCHS_CONVERT_ALN_ALL = $(ARCHS_CONVERT_ALN) $(DBSYS_LIBS) $(CONVERT_ALN) : $(ARCHS_CONVERT_ALN:.a=.dummy) link_db @SOURCE_TOOLS/binuptodate.pl $@ $(use_ARB_main) $(ARCHS_CONVERT_ALN_ALL) || ( \ echo "$(SEP) Link $@"; \ echo "$(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_CONVERT_ALN_ALL)"; \ $(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_CONVERT_ALN_ALL) && \ echo "$(SEP) Link $@ [done]"; \ ) #*********************************** arb_treegen ************************************** TREEGEN = bin/arb_treegen ARCHS_TREEGEN = \ TREEGEN/TREEGEN.a \ ARCHS_TREEGEN_ALL = $(ARCHS_TREEGEN) $(TREEGEN) : $(ARCHS_TREEGEN:.a=.dummy) @SOURCE_TOOLS/binuptodate.pl $@ $(use_ARB_main_C) $(ARCHS_TREEGEN_ALL) || ( \ echo "$(SEP) Link $@"; \ echo "$(LINK_EXECUTABLE) $@ $(use_ARB_main_C) $(LIBPATH) $(ARCHS_TREEGEN_ALL)" ; \ $(LINK_EXECUTABLE) $@ $(use_ARB_main_C) $(LIBPATH) $(ARCHS_TREEGEN_ALL) && \ echo "$(SEP) Link $@ [done]"; \ ) #*********************************** arb_naligner ************************************** NALIGNER = bin/arb_naligner ARCHS_NALIGNER = \ NALIGNER/NALIGNER.a \ SERVERCNTRL/SERVERCNTRL.a \ SL/HELIX/HELIX.a \ ARCHS_NALIGNER_ALL = $(ARCHS_NALIGNER) $(ARCHS_CLIENT_PROBE) $(DBSYS_LIBS) $(NALIGNER): $(ARCHS_NALIGNER:.a=.dummy) link_db @SOURCE_TOOLS/binuptodate.pl $@ $(use_ARB_main) $(ARCHS_NALIGNER_ALL) || ( \ echo "$(SEP) Link $@"; \ echo "$(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_NALIGNER_ALL)" ; \ $(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_NALIGNER_ALL) && \ echo "$(SEP) Link $@ [done]"; \ ) #*********************************** arb_phylo ************************************** PHYLO = bin/arb_phylo ARCHS_PHYLO = \ PHYLO/PHYLO.a \ SL/HELIX/HELIX.a \ SL/FILTER/FILTER.a \ SL/MACROS/MACROS.a \ XML/XML.a \ ARCHS_PHYLO_ALL = $(ARCHS_PHYLO) $(GUI_LIBS) $(PHYLO): $(ARCHS_PHYLO:.a=.dummy) link_awt @SOURCE_TOOLS/binuptodate.pl $@ $(use_ARB_main) $(ARCHS_PHYLO_ALL) || ( \ echo "$(SEP) Link $@"; \ echo "$(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_PHYLO_ALL)" ; \ $(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_PHYLO_ALL) && \ echo "$(SEP) Link $@ [done]"; \ ) #*************************************************************************************** # SERVER SECTION #*************************************************************************************** #*********************************** arb_db_server ************************************** DBSERVER = bin/arb_db_server ARCHS_DBSERVER = \ DBSERVER/DBSERVER.a \ SERVERCNTRL/SERVERCNTRL.a \ ARCHS_DBSERVER_ALL = $(ARCHS_DBSERVER) $(ARBDB_LIB) $(ARCHS_CLIENT_PROBE) $(SYSLIBS) $(DBSERVER): $(ARCHS_DBSERVER:.a=.dummy) link_db @SOURCE_TOOLS/binuptodate.pl $@ $(use_ARB_main) $(ARCHS_DBSERVER_ALL) || ( \ echo "$(SEP) Link $@"; \ echo "$(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_DBSERVER_ALL)" ; \ $(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_DBSERVER_ALL) && \ echo "$(SEP) Link $@ [done]"; \ ) #*********************************** arb_pt_server ************************************** PROBE = bin/arb_pt_server ARCHS_PROBE_DEPEND = \ PROBE/PROBE.a \ SL/PTCLEAN/PTCLEAN.a \ SERVERCNTRL/SERVERCNTRL.a \ SL/HELIX/HELIX.a \ ARCHS_PROBE_ALL = $(ARCHS_PROBE_DEPEND) $(ARCHS_CLIENT_PROBE) $(ARBDB_LIB) $(SYSLIBS) $(PROBE): $(ARCHS_PROBE_DEPEND:.a=.dummy) link_db @SOURCE_TOOLS/binuptodate.pl $@ $(use_ARB_main) config.makefile $(ARCHS_PROBE_ALL) || ( \ echo "$(SEP) Link $@"; \ echo "$(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_PROBE_ALL)" ; \ $(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_PROBE_ALL) && \ echo "$(SEP) Link $@ [done]"; \ ) #*********************************** arb_name_server ************************************** NAMES = bin/arb_name_server ARCHS_NAMES = \ NAMES/NAMES.a \ SERVERCNTRL/SERVERCNTRL.a \ ARCHS_NAMES_ALL = $(ARCHS_NAMES) $(ARBDB_LIB) $(ARCHS_CLIENT_NAMES) NAMES_COM/server.a $(SYSLIBS) $(NAMES): $(ARCHS_NAMES:.a=.dummy) link_db @SOURCE_TOOLS/binuptodate.pl $@ $(use_ARB_main) $(ARCHS_NAMES_ALL) || ( \ echo "$(SEP) Link $@"; \ echo "$(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_NAMES_ALL)" ; \ $(LINK_EXECUTABLE) $@ $(use_ARB_main) $(LIBPATH) $(ARCHS_NAMES_ALL) && \ echo "$(SEP) Link $@ [done]"; \ ) #*********************************** SHARED LIBRARIES SECTION ************************************** prepare_libdir: addlibs addlibs: (perl $(ARBHOME)/SOURCE_TOOLS/provide_libs.pl \ "arbhome=$(ARBHOME)" \ "opengl=$(OPENGL)" \ "link_static=$(LINK_STATIC)" \ ) #*************************************************************************************** # Recursive calls to sub-makefiles #*************************************************************************************** %.depends: have_makedepend @cp -p $(@D)/Makefile $(@D)/Makefile.old # save old Makefile @$(MAKE) -C $(@D) -r \ "AUTODEPENDS=1" \ "MAIN=nothing" \ "cflags=noCflagsHere_use_MAKEDEPENDFLAGS" \ "cxxflags=noCxxflagsHere_use_MAKEDEPENDFLAGS" \ depends @grep "^# DO NOT DELETE" $(@D)/Makefile >/dev/null @cat $(@D)/Makefile \ | SOURCE_TOOLS/fix_depends.pl "(from main)" \ >$(@D)/Makefile.2 @mv $(@D)/Makefile.old $(@D)/Makefile # restore old Makefile @$(ARBHOME)/SOURCE_TOOLS/mv_if_diff $(@D)/Makefile.2 $(@D)/Makefile # update Makefile if changed %.proto: @($(MAKE) -C $(@D) \ "AUTODEPENDS=0" \ "MAIN=nothing" \ "cflags=noCflags" \ "cxxflags=noCxxflags" \ proto 2>&1 ) | $(ARBHOME)/SOURCE_TOOLS/asan2msg.pl %.clean: @$(MAKE) -C $(@D) \ "AUTODEPENDS=0" \ "MAIN=nothing" \ "cflags=noCflags" \ "cxxflags=noCxxflags" \ clean # stop wrong targets: target_is_missing_lib_prefix: @echo "Error: Denied to build shared library target with missing 'lib'-prefix" false ARBDB/ARBDB.dummy: target_is_missing_lib_prefix CORE/CORE.dummy: target_is_missing_lib_prefix AWT/AWT.dummy: target_is_missing_lib_prefix WINDOW/WINDOW.dummy: target_is_missing_lib_prefix # rule to generate main target (normally a library): # @@@ check effect of setting LANG=C below %.dummy: @( export ID=$$$$; LANG=C; \ (( \ echo "$(SEP) Make $(@D)"; \ $(MAKE) -C $(@D) -r \ "AUTODEPENDS=1" \ "MAIN=$(@F:.dummy=.a)" \ "cflags=$(cflags) -DIN_ARB_$(subst /,_,$(@D))" \ && \ echo "$(SEP) Make $(@D) [done]"; \ ) >$(@D).$$ID.log 2>&1 && (cat $(@D).$$ID.log;rm $(@D).$$ID.log)) || (cat $(@D).$$ID.log;rm $(@D).$$ID.log;false)) # Additional dependencies for subtargets: PROBE_COM/PROBE_COM.dummy : comtools NAMES_COM/NAMES_COM.dummy : comtools com: PROBE_COM/PROBE_COM.dummy NAMES_COM/NAMES_COM.dummy # stop wrong more targets: PROBE_COM/server.dummy: @echo Unwanted request to make target $< false PROBE_COM/client.dummy: @echo Unwanted request to make target $< false NAMES_COM/server.dummy: @echo Unwanted request to make target $< false NAMES_COM/client.dummy: @echo Unwanted request to make target $< false ARBDB/libARBDB.dummy: links CORE/libCORE.dummy: links PERLTOOLS/PERLTOOLS.dummy: core db # all subdirs perl not depends on go here (ADD_links_non_perl) AWT/libAWT.dummy: links_non_perl AWTI/AWTI.dummy: links_non_perl CONSENSUS_TREE/CONSENSUS_TREE.dummy: links_non_perl CONVERTALN/CONVERTALN.dummy: links_non_perl DBSERVER/DBSERVER.dummy: links_non_perl DIST/DIST.dummy: links_non_perl EDIT4/EDIT4.dummy: links_non_perl com EISPACK/EISPACK.dummy: links_non_perl GDE/GDE.dummy: links_non_perl GENOM/GENOM.dummy: links_non_perl GENOM_IMPORT/GENOM_IMPORT.dummy: links_non_perl ISLAND_HOPPING/ISLAND_HOPPING.dummy: links_non_perl MERGE/MERGE.dummy: links_non_perl NTREE/NTREE.dummy: links_non_perl PARSIMONY/PARSIMONY.dummy: links_non_perl PHYLO/PHYLO.dummy: links_non_perl PRIMER_DESIGN/PRIMER_DESIGN.dummy: links_non_perl PROBE_SET/PROBE_SET.dummy: links_non_perl link_db READSEQ/READSEQ.dummy: links_non_perl RNACMA/RNACMA.dummy: links_non_perl header_libs SECEDIT/SECEDIT.dummy: links_non_perl SEQ_QUALITY/SEQ_QUALITY.dummy: links_non_perl SERVERCNTRL/SERVERCNTRL.dummy: links_non_perl com SL/ALILINK/ALILINK.dummy: links_non_perl SL/ALIVIEW/ALIVIEW.dummy: links_non_perl SL/AP_TREE/AP_TREE.dummy: links_non_perl SL/ARB_TREE/ARB_TREE.dummy: links_non_perl SL/AW_HELIX/AW_HELIX.dummy: links_non_perl SL/CONSENSUS/CONSENSUS.dummy: links_non_perl SL/DB_QUERY/DB_QUERY.dummy: links_non_perl SL/DB_SCANNER/DB_SCANNER.dummy: links_non_perl SL/DB_UI/DB_UI.dummy: links_non_perl SL/FAST_ALIGNER/FAST_ALIGNER.dummy: links_non_perl SL/FILTER/FILTER.dummy: links_non_perl SL/FILTSEQEXP/FILTSEQEXP.dummy: links_non_perl SL/GROUP_SEARCH/GROUP_SEARCH.dummy: links_non_perl SL/GUI_ALIVIEW/GUI_ALIVIEW.dummy: links_non_perl SL/HEADERTESTS/HEADERTESTS.dummy: links_non_perl SL/HELIX/HELIX.dummy: links_non_perl SL/INSDEL/INSDEL.dummy: links_non_perl SL/ITEM_SHADER/ITEM_SHADER.dummy: links_non_perl SL/ITEMS/ITEMS.dummy: links_non_perl SL/LOCATION/LOCATION.dummy: links_non_perl SL/MACROS/MACROS.dummy: links_non_perl SL/MATRIX/MATRIX.dummy: links_non_perl SL/NDS/NDS.dummy: links_non_perl SL/NEIGHBOURJOIN/NEIGHBOURJOIN.dummy: links_non_perl SL/PRONUC/PRONUC.dummy: links_non_perl SL/PTCLEAN/PTCLEAN.dummy: links_non_perl link_db SL/PVP/PVP.dummy: links_non_perl SL/QUERY/QUERY.dummy: links_non_perl link_db SL/REFENTRIES/REFENTRIES.dummy: links_non_perl SL/REGEXPR/REGEXPR.dummy: links_non_perl SL/SAICALC/SAICALC.dummy: links_non_perl SL/SEQIO/SEQIO.dummy: links_non_perl SL/SEQUENCE/SEQUENCE.dummy: links_non_perl SL/TRANSLATE/TRANSLATE.dummy: links_non_perl SL/TREE_ADMIN/TREE_ADMIN.dummy: links_non_perl SL/TREE_READ/TREE_READ.dummy: links_non_perl SL/TREE_WRITE/TREE_WRITE.dummy: links_non_perl SL/TREEDISP/TREEDISP.dummy: links_non_perl SL/XFERGUI/XFERGUI.dummy: links_non_perl SL/XFERSET/XFERSET.dummy: links_non_perl STAT/STAT.dummy: links_non_perl TREEGEN/TREEGEN.dummy: links_non_perl WETC/WETC.dummy: links_non_perl WINDOW/libWINDOW.dummy: links_non_perl XML/XML.dummy: links_non_perl ifeq ($(OPENGL),1) GL/glAW/glAW.dummy: links_non_perl GL/glpng/glpng.dummy: links_non_perl GL/GL.dummy: GL/glAW/glAW.dummy GL/glpng/glpng.dummy RNA3D/RNA3D.dummy: links_non_perl gl endif UNIT_TESTER/UNIT_TESTER.dummy: link_db \ SERVERCNTRL/SERVERCNTRL.dummy \ # see also TOOLS/Makefile@TOOLSLIBDEPENDS TOOLS/TOOLS.dummy : links_non_perl link_db \ CONSENSUS_TREE/CONSENSUS_TREE.dummy \ SERVERCNTRL/SERVERCNTRL.dummy \ SL/FILTER/FILTER.dummy \ SL/FILTSEQEXP/FILTSEQEXP.dummy \ SL/INSDEL/INSDEL.dummy \ SL/REGEXPR/REGEXPR.dummy \ SL/SEQIO/SEQIO.dummy \ SL/TREE_READ/TREE_READ.dummy \ SL/TREE_WRITE/TREE_WRITE.dummy \ XML/XML.dummy \ AWTC/AWTC.dummy : com NAMES/NAMES.dummy : com SL/AW_NAME/AW_NAME.dummy : com PROBE/PROBE.dummy : com MULTI_PROBE/MULTI_PROBE.dummy : com PROBE_DESIGN/PROBE_DESIGN.dummy : com NALIGNER/NALIGNER.dummy : com ARB_GDE/ARB_GDE.dummy : proto_tools menus compile_compatibility: SOURCE_TOOLS/COMPILE_COMPAT/COMPILE_COMPAT.dummy #*************************************************************************************** # Short aliases to make targets #*************************************************************************************** show: @echo $(SEP) @echo 'Aliases for often needed targets:' @echo '' @echo ' executables:' @echo '' @echo ' nt arb_ntree' @echo ' e4 arb_edit4 (includes secedit)' @echo ' di arb_dist' @echo ' ph arb_phylo' @echo ' pa arb_parsimony' @echo ' tg arb_treegen' @echo ' ds arb_dbserver' @echo ' pt arb_pt_server' @echo ' na arb_name_server' @echo '' @echo ' libraries:' @echo '' @echo ' com communication libraries' @echo ' db ARB database' @echo ' aw GUI lib' @echo ' awt GUI toolkit' @echo ' awtc general purpose library' @echo ' awti import/export library' @echo ' mp multi probe library' @echo ' ge genome library' @echo ' pd probe design lib' @echo ' prd primer design lib' @echo '' @echo ' other targets:' @echo '' @echo ' help recompile help files' @echo ' tools make small tools used by arb' @echo '' @echo ' foreign targets:' @echo '' @echo ' gde GDE' @echo ' agde ARB_GDE' @echo '' @echo 'for other targets inspect $(ARBHOME)/Makefile' @echo '' @echo $(SEP) source_doc: @echo "Remove some links (doxygen crashes otherwise):" find . \( -name "AISC" -o -name "C" -o -name "GDEHELP" \) -type l -exec rm {} \; doxygen 2>&1 1>/dev/null $(MAKE) forcelinks dep_graph: @echo "Building some dependency graphs" SOURCE_TOOLS/dependency_graphs.pl help: HELP_SOURCE/HELP_SOURCE.dummy HELP_SOURCE/HELP_SOURCE.dummy: link_core xml menus db: ARBDB/libARBDB.dummy core: CORE/libCORE.dummy aw: WINDOW/libWINDOW.dummy awt: AWT/libAWT.dummy awtc: AWTC/AWTC.dummy awti: AWTI/AWTI.dummy mp: MULTI_PROBE/MULTI_PROBE.dummy mg: MERGE/MERGE.dummy ge: GENOM/GENOM.dummy prd: PRIMER_DESIGN/PRIMER_DESIGN.dummy nt: menus $(NTREE) nal: $(NALIGNER) di: $(DIST) ph: $(PHYLO) pa: $(PARSIMONY) tg: $(TREEGEN) ifeq ($(OPENGL),1) 3d: RNA3D/RNA3D.dummy gl: GL/GL.dummy else noopengl: @echo "invalid target for OPENGL=0" 3d: noopengl gl: noopengl endif SL/SL.dummy: com ds: $(DBSERVER) pt: $(PROBE) pst: PROBE_SET/PROBE_SET.dummy pd: PROBE_DESIGN/PROBE_DESIGN.dummy na: $(NAMES) sq: SEQ_QUALITY/SEQ_QUALITY.dummy cma: $(RNACMA) sec: SECEDIT/SECEDIT.dummy e4: $(EDIT4) readseq menus gi: GENOM_IMPORT/GENOM_IMPORT.dummy wetc: $(WETC) xml: XML/XML.dummy stat: STAT/STAT.dummy $(NTREE) $(EDIT4) fa: SL/FAST_ALIGNER/FAST_ALIGNER.dummy #******************************************************************************** up_by_remake: depends proto vectorize_checks up: up_by_remake tags valgrind_update #******************************************************************************** touch: SOURCE_TOOLS/touch_modified.pl modified: touch $(MAKE) all #******************************************************************************** libdepends: $(MAKE) -C "SOURCE_TOOLS" \ "RNA3D_LIB=$(RNA3D_LIB_4_DEPENDS)" \ libdepends #******************************************************************************** # create generated headers: genheaders: TEMPLATES/TEMPLATES.dummy clrdotdepends: rm PROBE_COM/.depends || true rm NAMES_COM/.depends || true rm PERL2ARB/.depends || true comdepends: comtools clrdotdepends have_makedepend @echo "$(SEP) Partially build com interface" $(MAKE) PROBE_COM/PROBE_COM.depends NAMES_COM/NAMES_COM.depends $(MAKE) PROBE_COM/server.depends NAMES_COM/server.depends depends: genheaders comdepends vectorize_checks have_makedepend @echo "$(SEP) Updating other dependencies" $(MAKE) $(subst NAMES_COM/server.depends,,$(subst PROBE_COM/server.depends,,$(SUBDIRS:.sub=.depends))) \ HELP_SOURCE/HELP_SOURCE.depends \ SOURCE_TOOLS/COMPILE_COMPAT/COMPILE_COMPAT.depends \ $(MAKE) libdepends depend: depends # ------------------------------------------------------------ # dependency generation tests for AISC code #(all should work w/o creating wrong dependencies; # neither in XXX_COM/Makefile nor in code using AISC interface) dependstest1: silent_clean $(MAKE) depends dependstest2: silent_clean $(MAKE) com dependstest3: silent_clean $(MAKE) aw dependstest4: silent_clean $(MAKE) pt dependstest5: silent_clean $(MAKE) na dependstest6: silent_clean $(MAKE) nt dependstest7: silent_clean $(MAKE) all # ------------------------------------------------------------ vectorize_checks: $(MAKE) -C SOURCE_TOOLS -r vectorize_checks clean_checked_vect: lib/lib.clean SOURCE_TOOLS/clean_checked_vectorizations.sh # ------------------------------------------------------------ AISC_MKPTPS/AISC_MKPTPS.dummy: links proto_tools: AISC_MKPTPS/AISC_MKPTPS.dummy proto: proto_tools @echo $(SEP) Updating prototypes $(MAKE) \ ARBDB/ARBDB.proto \ AISC_COM/AISC_COM.proto \ ARB_GDE/ARB_GDE.proto \ CORE/CORE.proto \ CONVERTALN/CONVERTALN.proto \ NTREE/NTREE.proto \ MERGE/MERGE.proto \ PROBE/PROBE.proto \ SERVERCNTRL/SERVERCNTRL.proto \ SL/SL.proto \ #******************************************************************************** valgrind_update: links @echo $(SEP) Updating for valgrind $(MAKE) -C SOURCE_TOOLS valgrind_update #******************************************************************************** TAGFILE=TAGS UTAGS=TAGS.$(ARBBID) TAGFILE_TMP=$(UTAGS).tmp TAG_SOURCE_HEADERS=$(UTAGS).headers.tmp TAG_SOURCE_CODE=$(UTAGS).codefiles.tmp TAG_SOURCE_LISTS=$(TAG_SOURCE_HEADERS) $(TAG_SOURCE_CODE) ETAGS_IGNORE_LIST=SOURCE_TOOLS/etags_ignore.lst ETAGS=ctags -e -I @$(ETAGS_IGNORE_LIST) --sort=no --if0=no --extra=q ETAGS_TYPES=--C-kinds=cgnsut --C++-kinds=cgnsut ETAGS_FUN =--C-kinds=fm --C++-kinds=fm ETAGS_REST =--C-kinds=dev --C++-kinds=dev FILTER_TAGS_SOURCES= \ $(SED) -e 's/^.\///g' | \ grep -vi '^HEADERLIBS\|^GDE/\|/GEN[CH]/' $(TAG_SOURCE_HEADERS): links @find . \( -name '*.hxx' -o -name "*.h" \) -type f | $(FILTER_TAGS_SOURCES) > $@ $(TAG_SOURCE_CODE): links @find . \( -name '*.cxx' -o -name "*.c" \) -type f | $(FILTER_TAGS_SOURCES) > $@ $(UTAGS).1.tmp: $(TAG_SOURCE_HEADERS) @$(ETAGS) -f $@ $(ETAGS_TYPES) -L $< $(UTAGS).2.tmp: $(TAG_SOURCE_HEADERS) @$(ETAGS) -f $@ $(ETAGS_FUN) -L $< $(UTAGS).3.tmp: $(TAG_SOURCE_HEADERS) @$(ETAGS) -f $@ $(ETAGS_REST) -L $< $(UTAGS).4.tmp: $(TAG_SOURCE_CODE) @$(ETAGS) -f $@ $(ETAGS_TYPES) -L $< $(UTAGS).5.tmp: $(TAG_SOURCE_CODE) @$(ETAGS) -f $@ $(ETAGS_FUN) -L $< $(UTAGS).6.tmp: $(TAG_SOURCE_CODE) @$(ETAGS) -f $@ $(ETAGS_REST) -L $< TAGS_ALL_PARTS=$(UTAGS).1.tmp $(UTAGS).2.tmp $(UTAGS).3.tmp $(UTAGS).4.tmp $(UTAGS).5.tmp $(UTAGS).6.tmp $(TAGFILE_TMP) : $(TAGS_ALL_PARTS) @cat $(TAGS_ALL_PARTS) > $@ @rm $(TAGS_ALL_PARTS) $(TAG_SOURCE_LISTS) cleanOldTags: @find $(ARBHOME) -name 'TAGS.*.tmp' -ctime +2 -exec rm {} \; tags: $(TAGFILE_TMP) cleanOldTags @mv_if_diff $(TAGFILE_TMP) $(TAGFILE) #******************************************************************************** LINKSTAMP=SOURCE_TOOLS/stamp.generate_all_links links: checks $(LINKSTAMP) arbmainwrapper links_no_checks: $(LINKSTAMP) arbmainwrapper forcelinks: -rm $(LINKSTAMP) $(MAKE) links $(LINKSTAMP): SOURCE_TOOLS/generate_all_links.sh genheaders +SOURCE_TOOLS/generate_all_links.sh touch $(LINKSTAMP) clean_links: # avoid to delete linked pts, nas or arb_tcp.dat: find . -path './lib' -prune -o -type l -exec rm {} \; # removed obsolete file - refuses to disappear due to 'prune' above @rm -f lib/help/GDEHELP @rm -f $(LINKSTAMP) lib/inputMasks/format.readme redo_links: clean_links $(MAKE) links_no_checks #******************************************************************************** header_libs: @(( \ echo "$(SEP) Make HEADERLIBS"; \ $(MAKE) -C HEADERLIBS all && \ echo "$(SEP) Make HEADERLIBS [done]"; \ ) > HEADERLIBS.log 2>&1 && (cat HEADERLIBS.log;rm HEADERLIBS.log)) || (cat HEADERLIBS.log;rm HEADERLIBS.log;false) #******************************************************************************** gde: GDE/GDE.dummy GDE: gde agde: ARB_GDE/ARB_GDE.dummy tools: TOOLS/TOOLS.dummy convert: $(CONVERT_ALN) readseq: READSEQ/READSEQ.dummy #*************************************************************************************** # Some user commands #*************************************************************************************** menus: binlink links @(( \ echo "$(SEP) Make GDEHELP"; \ $(MAKE) -C GDEHELP -r all && \ echo "$(SEP) Make GDEHELP [done]"; \ ) > GDEHELP.log 2>&1 && (cat GDEHELP.log;rm GDEHELP.log)) || (cat GDEHELP.log;rm GDEHELP.log;false) ifeq ($(DEBUG),1) BIN_TARGET=develall else BIN_TARGET=all endif binlink: $(MAKE) -C bin $(BIN_TARGET) check_bin_dep: binlink SOURCE_TOOLS/check_bin_dependencies.pl fig_cure: SOURCE_TOOLS/sortfig.pl doit preplib: (cd lib;$(MAKE) all) # -------------------------------------------------------------------------------- # This section is quite tricky: # # make 'perl' is a BIG target, so when it has to be made, it has to be started # as early as possible to reduce overall compile time. Since 'make' does not # provide any priorities, i force it to build all 'perl'-prerequisites early, by # adding artificial dependencies to these prerequisites # # That behavior is likely to be system-dependent. # My goal was only to make it work on my current development system, # where this saves about 20% of overall build time. ifeq ($(WITHPERL),1) links_non_perl: PERLTOOLS/PERLTOOLS.dummy perltools: links_non_perl perl: realperl else links_non_perl: links perl: links $(MAKE) "WITHPERL=1" perl endif # ---------------------------------------- perl realperl: perltools (( \ echo "$(SEP) Make PERL2ARB" ; \ $(TIME) $(MAKE) -C PERL2ARB -r -f Makefile.main \ "AUTODEPENDS=1" \ "dflags=$(dflags)" \ "cflags4perl=$(cflags) $(cxxflags) $(dflags)" \ "lflags4perl=$(lflags4perl)" \ "COMPILER_VERSION=$(COMPILER_VERSION)" \ all && \ $(MAKE) -C PERL_SCRIPTS/test test && \ echo "$(SEP) Make PERL2ARB [done]" ; \ ) > PERL2ARB.log 2>&1 && (cat PERL2ARB.log;rm PERL2ARB.log)) || (cat PERL2ARB.log;rm PERL2ARB.log;false) perl_clean: @$(MAKE) -C PERL2ARB -r -f Makefile.main \ "AUTODEPENDS=0" \ clean PERL2ARB/PERL2ARB.clean: $(MAKE) perl_clean $(MAKE) -C PERL_SCRIPTS/test clean # ---------------------------------------- bindings to script languages bindings: lib/libCORE.so lib/libARBDB.so $(MAKE) -C BINDINGS all ARBDEPENDS="$(^:%=../%)" DFLAGS="$(dflags)" bindings_clean: $(MAKE) -C BINDINGS clean # ---------------------------------------- check resources check_res: $(ARBHOME)/SOURCE_TOOLS/check_resources.pl # ---------------------------------------- cleaning rmbak: @echo "[cleanup backup/core files]" @find . \( -name '*%' \ -o -name '*.bak' \ -o -name '*~' \) \ -o \( -name 'core' -a \! -type d \) \ -exec rm -v {} \; || \ echo "Warning: target 'rmbak' reported problems when removing misc. backup files (ignored)" @echo "[cleanup done]" bin_reinit: $(MAKE) bin/bin.clean $(MAKE) -C "bin" all clean_directories: -rm -rf \ $(ARBHOME)/PROBE_SET/bin \ $(ARBHOME)/INCLUDE \ libclean: -find $(ARBHOME) -type f \( -name '*.a' ! -type l \) -exec rm -f {} \; -find $(ARBHOME) -type f \( -name 'lib*.so' ! -type l \) -exec rm -f {} \; objclean: -find $(ARBHOME) -type f \( -name '*.o' ! -type l \) -exec rm -f {} \; # bin.clean and HELP_SOURCE.clean interfere clean3: $(MAKE) bin/bin.clean $(MAKE) HELP_SOURCE/HELP_SOURCE.clean # delete all binaries (similar to 'cleanlinked') cleanRelinkable: libclean UNIT_TESTER/UNIT_TESTER.clean $(MAKE) -C bin cleanbinariesRelinkable $(MAKE) -C PROBE_SET cleanLinked clean2: $(SUBDIRS:.sub=.clean) \ clean3 \ rmbak \ libclean \ objclean \ lib/lib.clean \ GDEHELP/GDEHELP.clean \ HEADERLIBS/HEADERLIBS.clean \ SOURCE_TOOLS/SOURCE_TOOLS.clean \ SOURCE_TOOLS/COMPILE_COMPAT/COMPILE_COMPAT.clean \ UNIT_TESTER/UNIT_TESTER.clean \ TEMPLATES/TEMPLATES.clean \ perl_clean \ clean_directories \ rm -f *.last_gcc *.last_compiler config.makefile.bak # links are needed for cleanup clean: redo_links motif_xpm_hack_clean $(MAKE) clean2 $(MAKE) clean_cov_all clean_links silent_clean: $(MAKE) clean >/dev/null # 'relocated' is about 50% faster than 'rebuild' reloc_clean: links @echo "---------------------------------------- Relocation cleanup" $(MAKE) \ perl_clean \ GDEHELP/GDEHELP.clean \ HELP_SOURCE/genhelp/genhelp.clean \ bin/bin.clean \ libclean \ objclean relocated: links $(MAKE) reloc_clean @echo "---------------------------------------- and remake" $(MAKE) build # ----------------------------------- # some stress tests # (helpful to reveal race conditions with -j) rebuild4ever: rebuild $(MAKE) rebuild4ever build4ever: build $(MAKE) build4ever clean4ever: clean $(MAKE) clean4ever test4ever: ut $(MAKE) test4ever perl4ever: clean $(MAKE) links $(MAKE) perl $(MAKE) perl4ever help4ever: clean $(MAKE) help $(MAKE) help4ever # ----------------------------------- cleanlinked: bin/bin.clean libclean relink: cleanlinked $(MAKE) all # -------------------------------------------------------------------------------- # source related targets CLOC=cloc CLOCFLAGS=--no3 --quiet --progress-rate=0 CLOCARB=--exclude-dir=GDE . CLOCEXT=GDE CLOCCODE=--force-lang-def=$(ARBHOME)/SOURCE_TOOLS/arb.cloc.code.def CLOCREST=--force-lang-def=$(ARBHOME)/SOURCE_TOOLS/arb.cloc.rest.def CLOCFILT=tail --lines=+4 cloc: @echo 'Arb code:' @$(CLOC) $(CLOCFLAGS) $(CLOCCODE) $(CLOCARB) | $(CLOCFILT) @echo 'Arb rest:' @$(CLOC) $(CLOCFLAGS) $(CLOCREST) $(CLOCARB) | $(CLOCFILT) @echo 'External code:' @$(CLOC) $(CLOCFLAGS) $(CLOCCODE) $(CLOCEXT) | $(CLOCFILT) @echo 'External rest:' @$(CLOC) $(CLOCFLAGS) $(CLOCREST) $(CLOCEXT) | $(CLOCFILT) # patch generation patch: SOURCE_TOOLS/arb_create_patch.sh arbPatch --svn # source tarball generation save: sourcetarfile sourcetarfile: rmbak util/arb_save # test early whether save will work savetest: @util/arb_srclst.pl >/dev/null testsave: savetest save2: rmbak util/arb_save ignore save_test: rmbak @echo "Testing source list.." @util/arb_srclst.pl > /dev/null save_test_no_error: @-$(MAKE) save_test # -------------------------------------------------------------------------------- # version management inc_candi: touch SOURCE_TOOLS/inc_candi.stamp $(MAKE) do_version_update inc_patch: touch SOURCE_TOOLS/inc_patch.stamp $(MAKE) do_version_update inc_minor: touch SOURCE_TOOLS/inc_minor.stamp $(MAKE) do_version_update inc_major: touch SOURCE_TOOLS/inc_major.stamp $(MAKE) do_version_update do_version_update: @echo Incrementing version information $(MAKE) savetest $(MAKE) genheaders # auto upgrades version early show_version: $(MAKE) genheaders # updates version info @echo "$(SEP) ARB version info" @grep ARB_VERSION TEMPLATES/arb_build.h @echo "$(SEP)" # -------------------------------------------------------------------------------- # special cleanups clean_opengl_changed: RNA3D/RNA3D.clean EDIT4/EDIT4.clean WINDOW/WINDOW.clean GL/GL.clean # -------------------------------------------------------------------------------- arbapplications: nt pa e4 wetc pt na nal di ph ds wetc cma arb_external: convert tools gde readseq tg pst arb_no_perl: arbapplications help arb_external arb: motif_xpm_hack $(MAKE) "WITHPERL=1" perl arb_no_perl motif_xpm_hack: $(MAKE) -r -C "lib/motifHack" all motif_xpm_hack_clean: $(MAKE) -r -C "lib/motifHack" clean # -------------------------------------------------------------------------------- # special targets for SOURCE_TOOLS/remake_after_change.pl rac_arb_dist: di rac_arb_edit4: e4 rac_arb_ntree: nt rac_arb_pars: pa rac_arb_phylo: ph rac_arb_wetc: wetc rac_arb_naligner: nal rac_arb_pt_server: pt rac_arb_db_server: ds rac_arb_name_server: na rac_arb_convert_aln: convert rac_arb_treegen: tg rac_arb_rnacma: cma rac_arb_help2xml: help rac_arb_a2ps: tools rac_arb_consensus_tree: tools rac_arb_dnarates: tools rac_arb_export_rates: tools rac_arb_export_tree: tools rac_arb_gene_probe: tools rac_arb_message: tools rac_arb_primer: tools rac_arb_probe: tools rac_arb_read_tree: tools # -------------------------------------------------------------------------------- # unit testing # @@@ work in progress # # goal is to automatically test all libraries/executables using TESTED_UNITS_AUTO # currently not all test executables link w/o error. # therefor units are organized in three sets: # # TESTED_UNITS = testable and contain tests # UNTESTED_UNITS = testable, but no tests written yet # UNTESTABLE_UNITS = not testable # always define OPENGL units manually: OPENGL_TESTS := ifeq ($(OPENGL),1) OPENGL_TESTS += \ $(subst .a,.test,$(RNA3D_LIB)) \ GL/glAW/libglAW.test \ GL/glpng/libglpng_arb.test \ endif UNITS_NOT_AUTODETECTED = \ HELP_SOURCE/HELP_SOURCE.tooltests TESTED_UNITS_AUTO = \ $(OPENGL_TESTS) \ $(TL_ARCHIVES:.a=.test) \ $(TL_SHARED_ARCHIVES:.so=.test) \ $(CL_ARCHIVES:.a=.test) \ $(TL_TOOLS_COLLECTIONS:.toolColl=.tooltests) \ $(UNITS_NOT_AUTODETECTED) \ UNTESTED_UNITS = \ $(OPENGL_TESTS) \ EISPACK/EISPACK.test \ GENOM/GENOM.test \ ISLAND_HOPPING/ISLAND_HOPPING.test \ NALIGNER/NALIGNER.test \ NAMES/NAMES.test \ PHYLO/PHYLO.test \ PRIMER_DESIGN/PRIMER_DESIGN.test \ READSEQ/READSEQ.tooltests \ SECEDIT/SECEDIT.test \ SEQ_QUALITY/SEQ_QUALITY.test \ SERVERCNTRL/SERVERCNTRL.test \ SL/ALIVIEW/ALIVIEW.test \ SL/AP_TREE/AP_TREE.test \ SL/ARB_TREE/ARB_TREE.test \ SL/AW_HELIX/AW_HELIX.test \ SL/AW_NAME/AW_NAME.test \ SL/DB_SCANNER/DB_SCANNER.test \ SL/DB_UI/DB_UI.test \ SL/GUI_ALIVIEW/GUI_ALIVIEW.test \ SL/HELIX/HELIX.test \ SL/QUERY/QUERY.test \ SL/REFENTRIES/REFENTRIES.test \ SL/SEQUENCE/SEQUENCE.test \ SL/TREE_ADMIN/TREE_ADMIN.test \ SL/TREE_WRITE/TREE_WRITE.test \ SL/XFERGUI/XFERGUI.test \ STAT/STAT.test \ TREEGEN/TREEGEN.test \ WETC/WETC.test \ XML/XML.test \ # untestable units UNTESTABLE_UNITS = \ AISC/AISC.test \ NAMES_COM/server.test \ PROBE_COM/server.test \ # -------------------- # put all units containing tests into the following 4 sections (see also TESTED_UNITS below) # recent development UNITS_TESTED_FIRST = \ SL/MATRIX/MATRIX.test \ AWTI/AWTI.test \ SL/FILTSEQEXP/FILTSEQEXP.test \ SL/GROUP_SEARCH/GROUP_SEARCH.test \ SL/PVP/PVP.test \ SL/SAICALC/SAICALC.test \ SL/TRANSLATE/TRANSLATE.test \ SL/XFERSET/XFERSET.test \ # start units with long duration early UNITS_RUNNING_LONG = \ ARBDB/libARBDB.test \ AWTC/AWTC.test \ TOOLS/TOOLS.tooltests \ # plain test-libaries that are not linked anywhere TEST_SANDBOXES = \ SL/CB/CB.test \ SL/HEADERTESTS/HEADERTESTS.test \ UNITS_TESTED = \ AISC_MKPTPS/AISC_MKPTPS.tooltests \ ARB_GDE/ARB_GDE.test \ AWT/libAWT.test \ CONSENSUS_TREE/CONSENSUS_TREE.test \ CONVERTALN/CONVERTALN.test \ CORE/libCORE.test \ DBSERVER/DBSERVER.test \ DIST/DIST.test \ EDIT4/EDIT4.test \ GENOM_IMPORT/GENOM_IMPORT.test \ HELP_SOURCE/HELP_SOURCE.tooltests \ MERGE/MERGE.test \ MULTI_PROBE/MULTI_PROBE.test \ NTREE/NTREE.test \ PARSIMONY/PARSIMONY.test \ PERLTOOLS/PERLTOOLS.tooltests \ PROBE/PROBE.test \ PROBE_DESIGN/PROBE_DESIGN.test \ PROBE_SET/PROBE_SET.tooltests \ RNACMA/RNACMA.test \ SL/ALILINK/ALILINK.test \ SL/CONSENSUS/CONSENSUS.test \ SL/DB_QUERY/DB_QUERY.test \ SL/FAST_ALIGNER/FAST_ALIGNER.test \ SL/FILTER/FILTER.test \ SL/INSDEL/INSDEL.test \ SL/ITEM_SHADER/ITEM_SHADER.test \ SL/ITEMS/ITEMS.test \ SL/LOCATION/LOCATION.test \ SL/MACROS/MACROS.test \ SL/NDS/NDS.test \ SL/NEIGHBOURJOIN/NEIGHBOURJOIN.test \ SL/PRONUC/PRONUC.test \ SL/PTCLEAN/PTCLEAN.test \ SL/REGEXPR/REGEXPR.test \ SL/SEQIO/SEQIO.test \ SL/TREE_READ/TREE_READ.test \ SL/TREEDISP/TREEDISP.test \ WINDOW/libWINDOW.test \ TESTED_UNITS = \ $(UNITS_TESTED_FIRST) \ $(UNITS_RUNNING_LONG) \ $(TEST_SANDBOXES) \ $(UNITS_TESTED) \ # ---------------------------------------- ifeq ($(DEVELOPER),RALF) DEFINED_TEST_UNITS = \ $(TESTED_UNITS) \ $(UNTESTED_UNITS) \ $(UNTESTABLE_UNITS) \ list_undefined_units: @UNIT_TESTER/list_undefined_units.pl $(DEFINED_TEST_UNITS) -- $(TESTED_UNITS_AUTO) else list_undefined_units: endif # ---------------------------------------- TEST_LOG_DIR = UNIT_TESTER/logs TEST_RUN_SUITE=$(MAKE) $(NODIR) -C UNIT_TESTER -f Makefile.suite -r # -> UNIT_TESTER/Makefile.suite TEST_MAKE_FLAGS= TEST_POST_CLEAN= ifeq ($(COVERAGE),1) TEST_POST_CLEAN=$(MAKE) clean_cov TEST_MAKE_FLAGS+=-j1 endif %.test: -@( export ID=$$$$; mkdir -p $(TEST_LOG_DIR); \ ( \ echo "take[1]: Entering directory \`$(ARBHOME)/UNIT_TESTER'"; \ $(MAKE) -C UNIT_TESTER -f Makefile.test -r \ "UNITDIR=$(@D)" \ "UNITLIBNAME=$(@F:.test=)" \ "COVERAGE=$(COVERAGE)" \ "ARB_PID=$(ARB_PID)_$(@F)" \ runtest; \ echo "take[1]: Leaving directory \`$(ARBHOME)/UNIT_TESTER'"; \ $(TEST_POST_CLEAN) \ ) >$(TEST_LOG_DIR)/$(@F).log 2>&1; \ UNIT_TESTER/log_result.pl $(TEST_LOG_DIR)/$(@F).log ) %.notest: -@( export ID=$$$$; mkdir -p $(TEST_LOG_DIR); \ ( \ echo "take[4]: Entering directory \`$(ARBHOME)/UNIT_TESTER'"; \ $(MAKE) -C UNIT_TESTER -f Makefile.test -r \ "UNITDIR=$(@D)" \ "UNITLIBNAME=$(@F:.notest=)" \ "COVERAGE=0" \ "ARB_PID=$(ARB_PID)_$(@F)" \ check_no_test; \ echo "take[4]: Leaving directory \`$(ARBHOME)/UNIT_TESTER'" \ ) >$(TEST_LOG_DIR)/$(@F).log 2>&1 ) # tool test aliases (used to test one or multiple executable(s) in a single subdir): %.tooltests: $(error please define an explicit tooltest alias for $@) AISC_MKPTPS/AISC_MKPTPS.tooltests : AISC_MKPTPS/mkptypes.test @echo "aliasing $@ -> $^" PERLTOOLS/PERLTOOLS.tooltests : PERLTOOLS/arb_proto_2_xsub.test @echo "aliasing $@ -> $^" PROBE_SET/PROBE_SET.tooltests : PROBE_SET/fb_test.test @echo "aliasing $@ -> $^" HELP_SOURCE/HELP_SOURCE.tooltests : HELP_SOURCE/arb_help2xml.test @echo "aliasing $@ -> $^" TOOLS/TOOLS.tooltests : TOOLS/arb_consensus_tree.test TOOLS/arb_probe.test TOOLS/arb_test.test @echo "aliasing $@ -> $^" # aliases for tools w/o tests: READSEQ/READSEQ.tooltests: @echo "Note: no tests for $@" test_base: $(UNIT_TESTER_LIB:.a=.dummy) $(subst .test,.dummy,$(TEST_SANDBOXES)) clean_cov: find . \( -name "*.gcda" -o -name "*.gcov" -o -name "*.cov" \) -exec rm {} \; clean_cov_all: clean_cov find . \( -name "*.gcno" \) -exec rm {} \; cleanup_faked_arbpids: @rm ~/.arb_tmp/tmp/arb_pids_${USER}_${ARB_PID}_* || true cleanup_faked_arbpids_and_fail: cleanup_faked_arbpids @false NOTESTS_IN_UNTESTED = $(subst .test,.notest,$(UNTESTED_UNITS)) run_tests_faked_arbpid: +@$(TEST_RUN_SUITE) init @echo "take[2]: Entering directory \`$(ARBHOME)/UNIT_TESTER'" @$(MAKE) $(TEST_MAKE_FLAGS) $(NODIR) $(TESTED_UNITS) $(NOTESTS_IN_UNTESTED) || $(MAKE) cleanup_faked_arbpids_and_fail @echo "take[2]: Leaving directory \`$(ARBHOME)/UNIT_TESTER'" +@$(TEST_RUN_SUITE) cleanup || $(MAKE) cleanup_faked_arbpids_and_fail @$(MAKE) clean_cov >/dev/null @$(MAKE) cleanup_faked_arbpids # @@@ instead of only running UNIT, this should as well run all tests this unit depends on? according to 'needs_libs' # @@@ 'run_tests_faked_arbpid' does not work for UNIT=ARBDB/libARBDB or UNIT=PARS/PARS -> could be solved via extra suffix, e.g. ARBDB/libARBDB.unit run_onetest_faked_arbpid: +@$(TEST_RUN_SUITE) init @echo "take[3]: Entering directory \`$(ARBHOME)/UNIT_TESTER'" test -n "$(UNIT)" || (echo "Error: UNIT has to be defined for target 'run_onetest_faked_arbpid'!"; false) $(MAKE) $(TEST_MAKE_FLAGS) $(NODIR) $(UNIT).test || $(MAKE) cleanup_faked_arbpids_and_fail @echo "take[3]: Leaving directory \`$(ARBHOME)/UNIT_TESTER'" +@$(TEST_RUN_SUITE) cleanup || $(MAKE) cleanup_faked_arbpids_and_fail @$(MAKE) clean_cov >/dev/null @$(MAKE) cleanup_faked_arbpids run_tests: test_base clean_cov $(MAKE) "ARB_PID=UT_$$$$" run_tests_faked_arbpid list_undefined_units run_oneunitstests: test_base $(MAKE) "ARB_PID=UT_$$$$" run_onetest_faked_arbpid ut: ifeq ($(UNIT_TESTS),1) @echo $(MAKE) run_tests @$(MAKE) run_tests else @echo "Not compiled with unit tests" endif aut: +@$(TEST_RUN_SUITE) unskip $(MAKE) ut # -------------------------------------------------------------------------------- TIMELOG=$(ARBHOME)/arb_time.log TIMEARGS=--append --output=$(TIMELOG) --format=" * %E(%S+%U) %P [%C]" TIMECMD=$(TIME) $(TIMEARGS) time_one: ifeq ($(ONE_TIMED_TARGET),) @echo "Error: You have to pass ONE_TIMED_TARGET to $@" false else @echo "$(SEP) $(MAKE) $(ONE_TIMED_TARGET)" @$(TIMECMD) $(MAKE) $(ONE_TIMED_TARGET) @echo "$(SEP) $(MAKE) $(ONE_TIMED_TARGET) [done]" endif timed_target: ifeq ($(TIMED_TARGET),) @echo "Error: You have to pass TIMED_TARGET to $@" false else @echo "Build time:" > $(TIMELOG) $(MAKE) "ONE_TIMED_TARGET=$(TIMED_TARGET)" time_one @cat $(TIMELOG) @rm $(TIMELOG) endif timed_target_tested: ifeq ($(TIMED_TARGET),) @echo "Error: You have to pass TIMED_TARGET to $@" false else @echo "Build time:" > $(TIMELOG) $(MAKE) "ONE_TIMED_TARGET=$(TIMED_TARGET)" time_one $(MAKE) "ONE_TIMED_TARGET=ut" time_one @cat $(TIMELOG) @rm $(TIMELOG) endif clean_timed_target: ifeq ($(TIMED_TARGET),) @echo "Error: You have to pass TIMED_TARGET to $@" false else @echo "Build time:" > $(TIMELOG) $(MAKE) "ONE_TIMED_TARGET=clean" time_one $(MAKE) "ONE_TIMED_TARGET=$(TIMED_TARGET)" time_one @cat $(TIMELOG) @rm $(TIMELOG) endif # -------------------------------------------------------------------------------- CHECKOUT_MODIFIED=0# set to 1 to temporarily skip test for modifications (do not check in if set to 1) check_svn_does_not_contain_generated: ifeq ($(CHECKOUT_MODIFIED),0) @echo "Testing that build does not modify files in SVN" @test 0 = `svn status | wc -l` || ( \ echo "The checkout is not/no longer clean:"; \ svn status; \ echo "- if this fails instantly, your checkout is not clean"; \ echo "- if this fails after other targets, these targets modify checked in data"; \ echo " (a common cause may be that depends are not up to date)"; \ false) else grep -Hn 'CHECKOUT_MODIFIED' Makefile endif check_svn_ignores_generated: @test 0 = `svn status | grep '^\?' | wc -l` || ( \ echo "There are svn-unignored files:"; \ svn status | grep '^\?'; \ echo "(all generated files should be svn-ignored)"; \ false) check_svn_state: check_svn_does_not_contain_generated $(MAKE) check_svn_ignores_generated $(MAKE) savetest things_that_always_should_work: depends proto post_commit_check: @echo "---------------------------------------- [Initial]" $(MAKE) check_svn_state $(MAKE) clean @echo "---------------------------------------- [After 'make clean']" $(MAKE) check_svn_state $(MAKE) things_that_always_should_work @echo "---------------------------------------- [After 'make things_that_always_should_work']" $(MAKE) check_svn_state $(MAKE) all @echo "---------------------------------------- [After 'make all']" $(MAKE) check_svn_state $(MAKE) things_that_always_should_work @echo "---------------------------------------- [Final]" $(MAKE) check_svn_state # -------------------------------------------------------------------------------- # sanitize arb_ntree; also works for clients (arb_edit4, ...) started from there. sanitize: all ( \ export "LSAN_OPTIONS=max_leaks=30:suppressions=$(ARBHOME)/SOURCE_TOOLS/arb.leaksan.supp"; \ echo "sake[1]: Entering directory \`$(ARBHOME)'"; \ $(ARBHOME)/bin/arb_ntree --execute _logged ~/data/test.arb 2>&1 ; \ echo "sake[1]: Leaving directory \`$(ARBHOME)'" \ ) | $(ARBHOME)/SOURCE_TOOLS/asan2msg.pl # -------------------------------------------------------------------------------- # build and test one unit: build_oneunit: $(MAKE) "WITHPERL=1" $(UNIT).dummy oneunit: ifndef UNIT @echo "Please define UNIT, e.g. using" @echo " make \"UNIT=ARBDB/libARBDB\" oneunit" @echo " make \"UNIT=SL/TREEDISP/TREEDISP\" oneunit" @echo "(Note: 1st is a shared library, 2nd isn't)" false else @echo "Build time" > $(TIMELOG) @echo "$(SEP) $(MAKE) build_oneunit" @$(TIMECMD) $(MAKE) build_oneunit ifeq ($(UNIT_TESTS),1) @echo "$(SEP) $(MAKE) run_oneunitstests" @$(TIMECMD) $(MAKE) run_oneunitstests endif @cat $(TIMELOG) @rm $(TIMELOG) endif # -------------------------------------------------------------------------------- # Main targets: tarfile: rebuild $(MAKE) prepare_libdir util/arb_compress tarfile_quick: all $(MAKE) prepare_libdir util/arb_compress # ----------------------------------- build: arb $(MAKE) check_bin_dep preplib compile_compatibility fig_cure all: @echo "Build time" > $(TIMELOG) # $(MAKE) clean_checked_vect # uncomment to rebuild sources where expected vectorization gets tested @echo "$(SEP) $(MAKE) all" @$(TIMECMD) $(MAKE) build @echo $(SEP) @echo "made 'all' with success." @echo "to start arb enter 'arb'" ifeq ($(UNIT_TESTS),1) @echo "$(SEP) $(MAKE) run_tests" @$(TIMECMD) $(MAKE) run_tests endif @echo "$(SEP) $(MAKE) all [done]" ifeq ($(DEBUG),1) @$(MAKE) save_test_no_error >/dev/null # just show hints endif @cat $(TIMELOG) @rm $(TIMELOG) rebuild: clean $(MAKE) all # -------------------------------------------------------------------------------- # special targets showing obvious error at bottom # (intended to be used from automated builds) BUILD_LOG=build.log SHELL=bash REDIRECT_KEEP_EXITCODE = tee $(BUILD_LOG) ; exit "$${PIPESTATUS[0]}" EXTRACT_ERROR_SUMMARY = (./SOURCE_TOOLS/short_error_summary.pl $(BUILD_LOG); false) ALL: @(($(MAKE) all 2>&1) | $(REDIRECT_KEEP_EXITCODE)) || $(EXTRACT_ERROR_SUMMARY) REBUILD: @(($(MAKE) rebuild 2>&1) | $(REDIRECT_KEEP_EXITCODE)) || $(EXTRACT_ERROR_SUMMARY) TARFILE: @(($(MAKE) tarfile 2>&1) | $(REDIRECT_KEEP_EXITCODE)) || $(EXTRACT_ERROR_SUMMARY) TARFILE_QUICK: @(($(MAKE) tarfile_quick 2>&1) | $(REDIRECT_KEEP_EXITCODE)) || $(EXTRACT_ERROR_SUMMARY)