#Makefile for downloading and building all of the native libraries to support WFDB; #WFDB will be build on the current directory under the tmp subfolder #This Makefile will build the following packages: # curl # wfdb (with curl dependency) # edr (with wfdb dependency) # ecgpuwave (with wfdb dependency) # mse # dfa # # The file will fetch the required files from their resepective sources # and compile everything accordingly. # Build configuration # Target subdirectory host=custom #Package names and versions CURL_PKG=curl-7.64.0 CURL_ARCHIVE=$(CURL_PKG).tar.gz CURL_SOURCE=http://curl.haxx.se/download/$(CURL_ARCHIVE) CURL_SHA256=cb90d2eb74d4e358c1ed1489f8e3af96b50ea4374ad71f143fa4595e998d81b5 WFDB_PKG=wfdb-10.6.0 WFDB_ARCHIVE=$(WFDB_PKG).tar.gz WFDB_SOURCE=http://www.physionet.org/physiotools/archives/wfdb-10.6/$(WFDB_ARCHIVE) WFDB_SHA256=6b2bcc76e0e613b91c30d6f825c087895ff7f76d50664f8f367b4008f82709fd WFDB_MAJOR=10 ECGPUWAVE_PKG=ecgpuwave-1.3.3 ECGPUWAVE_ARCHIVE=$(ECGPUWAVE_PKG).tar.gz ECGPUWAVE_SOURCE=http://www.physionet.org/physiotools/ecgpuwave/src/$(ECGPUWAVE_ARCHIVE) ECGPUWAVE_SHA256=900ead3cc1495d0095f3fa8ca123bf695a73b4799108bf9a0b6b79feff79df54 EDR_SOURCE=http://www.physionet.org/physiotools/edr/edr-1.0.c EDR_SHA256=c1a07750291c9c9172786e1d9c3b9d171bd198dfd27f4b5115ed1c890615c131 MSE_SOURCE=http://www.physionet.org/physiotools/mse/mse-1.0.c MSE_SHA256=98b53053f2bbfa0fbd4522fa092a2be453eb6fb952ef5145834401c41b46bdea DFA_SOURCE=http://www.physionet.org/physiotools/dfa/dfa-1.0.c DFA_SHA256=37be78e9a9744c277b879b89046acb32ab9fb6e5f68b3a886e3c9bdf1a17d639 ifneq ($(crosshost),) CC=$(crosshost)-gcc $(extra_ldflags) F77=$(crosshost)-gfortran -std=legacy -ffixed-line-length-none -fno-automatic $(extra_ldflags) INSTALL_NAME_TOOL=$(crosshost)-install_name_tool configure_args=--host=$(crosshost) else CC=gcc $(extra_ldflags) F77=gfortran -std=legacy -ffixed-line-length-none -fno-automatic $(extra_ldflags) INSTALL_NAME_TOOL=install_name_tool endif # N.B.: need to include -static-libgcc as part of $CC, since libtool # ignores $CFLAGS/$LDFLAGS when building a Windows DLL. Furthermore, # this must be set at *configure* time since the value of $CC gets # baked into libtool. ifneq ($(host),custom) extra_ldflags=-static-libgcc -static-libgfortran endif SRC_DIR=$(shell pwd) INSTALL_DIR:=$(shell pwd)/$(host) BUILD_DIR=$(shell pwd)/$(host)/build prefix = $(INSTALL_DIR) bindir = $(INSTALL_DIR)/bin libdir = $(INSTALL_DIR)/lib includedir = $(INSTALL_DIR)/include buildbindir = $(BUILD_DIR)/bin GETURL = wget -O SHA256SUM = sha256sum MATLAB=matlab export nocheck export nojavacheck export PATH # ensure that libraries installed in $(libdir) are visible to binaries # (e.g. for tests) export LD_LIBRARY_PATH:=$(libdir):$(LD_LIBRARY_PATH) export DYLD_LIBRARY_PATH:=$(libdir):$(DYLD_LIBRARY_PATH) export WINEPATH:=$(bindir);$(WINEPATH) # add relocatable rpath to elf binaries: the following is equivalent # to -Wl,-rpath,$ORIGIN/../lib, but by setting it here we prevent the # '$' getting mangled by subsequent scripts and makefiles export LD_RUN_PATH=$$ORIGIN/../lib all: curl wfdb mse edr ecgpuwave dfa librdsampjni .PHONY: all ################################################################ ## Prebuilt binaries for Toolbox releases ## GNU/Linux (x86_64) binaries: built on Debian wheezy ## * make, gcc, gfortran, gcj-jdk install-linux: schroot -p -cwfdb-toolbox-build $(MAKE) install host=linux $(MAKE) installclean host=linux clean-linux: $(MAKE) clean host=linux ## Windows (x86_64) binaries: built using ## * gcc-mingw-w64, gfortran-mingw-w64 (Debian stretch) ## (which requires quadmath even though we don't use it) ## * zulu 1.8.0 for jni headers ## * wine64, wine-binfmt (Debian stretch) for tests install-windows: $(MAKE) install host=windows crosshost=x86_64-w64-mingw32 \ extra_curl_configure_args=--disable-pthreads \ F77="x86_64-w64-mingw32-gcc -std=legacy -ffixed-line-length-none -fno-automatic -static-libgcc" \ f77_extra_libs="-Wl,-Bstatic -lgfortran -lquadmath -Wl,-Bdynamic" \ JAVA_HOME=/home/benjamin/packages/zulu8.13.0.5-jdk8.0.72-win_x64 \ WINEPREFIX=$(SRC_DIR)/windows/build/.wine \ WINEARCH=win64 WINEDEBUG=warn+dll DISPLAY= nojavacheck=1 rm -rf $(SRC_DIR)/windows/build/.wine $(MAKE) installclean host=windows clean-windows: $(MAKE) clean host=windows ## Mac OS X (x86_64 + i686) binaries: built using ## * crosstool-ng (diorcety) ## * gfortran (5.3.0, --disable-libquadmath-support) ## * Mac OS X 10.6 SDK install-macosx: install-macosx-x86_64 install-macosx-i686 mkdir -p macosx/bin mkdir -p macosx/lib ( set -e; cd macosx/x86_64; \ for f in bin/* lib/*.dylib; do if [ -f $$f ]; then \ x86_64-apple-darwin9-lipo -create ../i686/$$f $$f -output ../$$f; \ fi; done ) rm -rf macosx/x86_64/bin macosx/x86_64/lib rm -rf macosx/i686/bin macosx/i686/lib install-macosx-x86_64: $(MAKE) install host=macosx/x86_64 MFLAGS= nocheck=1 \ crosshost=x86_64-apple-darwin9 $(MAKE) installclean host=macosx/x86_64 install-macosx-i686: $(MAKE) install host=macosx/i686 MFLAGS= nocheck=1 \ crosshost=i686-apple-darwin9 $(MAKE) installclean host=macosx/i686 clean-macosx: $(MAKE) clean host=macosx $(MAKE) clean host=macosx/x86_64 $(MAKE) clean host=macosx/i686 .PHONY: install-linux clean-linux install-windows clean-windows .PHONY: install-macosx install-macosx-x86_64 install-macosx-i686 clean-macosx ################################################################ ## Clean # Remove installed files that are only used while building installclean: installclean-wfdb installclean-curl installclean-librdsampjni -rmdir $(libdir) rm -rf $(INSTALL_DIR)/include rm -rf $(INSTALL_DIR)/share rm -rf $(INSTALL_DIR)/man rm -rf $(INSTALL_DIR)/database # Remove everything except installed binaries and downloaded sources clean: installclean rm -rf $(BUILD_DIR) # Remove everything including installed binaries and downloaded sources distclean: clean rm -f curl-*.tar.gz rm -f wfdb-*.tar.gz rm -f ecgpuwave-*.tar.gz rm -f edr.c mse.c dfa.c rm -rf custom/* rm -rf linux/* rm -rf macosx/* rm -rf windows/* .PHONY: installclean clean distclean ################################################################ ## Download all dependencies without installing anything download: $(CURL_ARCHIVE) $(WFDB_ARCHIVE) $(ECGPUWAVE_ARCHIVE) \ edr.c mse.c dfa.c .PHONY: download ################################################################ ## libcurl clean-curl: rm -rf $(BUILD_DIR)/$(CURL_PKG) rm -f $(BUILD_DIR)/curl.isconfig rm -f $(BUILD_DIR)/curl.isbuilt rm -f curl.tar.gz $(CURL_ARCHIVE): $(GETURL) curl.tar.gz $(CURL_SOURCE) $(SHA256SUM) < curl.tar.gz | grep $(CURL_SHA256) mv curl.tar.gz $(CURL_ARCHIVE) $(BUILD_DIR)/curl.isconfig: $(CURL_ARCHIVE) mkdir -p $(BUILD_DIR) tar -xzf $(CURL_ARCHIVE) -C $(BUILD_DIR) ( cd $(BUILD_DIR)/$(CURL_PKG) && \ ./configure $(configure_args) \ CC="$(CC)" \ --prefix=$(prefix) \ --libdir=$(libdir) \ --bindir=$(buildbindir) \ --disable-static \ --without-ssl --without-zlib --without-libssh2 --disable-ldap \ --disable-rtsp --disable-dict --disable-telnet --disable-tftp \ --disable-pop3 --disable-imap --disable-smb --disable-smtp \ --disable-gopher --without-libidn $(extra_curl_configure_args) ) touch $(BUILD_DIR)/curl.isconfig $(BUILD_DIR)/curl.isbuilt: $(BUILD_DIR)/curl.isconfig ( cd $(BUILD_DIR)/$(CURL_PKG) && $(MAKE) install ) ( set -e; cd $(libdir); \ if [ -f libcurl.dylib ]; then \ . ./libcurl.la; \ $(INSTALL_NAME_TOOL) -id @loader_path/../lib/$$dlname \ libcurl.dylib; \ fi ) touch $(BUILD_DIR)/curl.isbuilt curl: $(BUILD_DIR)/curl.isbuilt installclean-curl: rm -f $(BUILD_DIR)/curl.isbuilt rm -rf $(libdir)/pkgconfig ( set -e; if [ -f $(libdir)/libcurl.la ]; then \ cd $(libdir); . ./libcurl.la; \ if [ -f $$dlname ]; then \ cp $$dlname $$dlname-real; \ rm -f $$library_names; \ mv $$dlname-real $$dlname; \ fi; \ fi ) rm -f $(libdir)/libcurl.la .PHONY: curl clean-curl installclean-curl ################################################################ ## WFDB (requires libcurl) clean-wfdb: rm -rf $(BUILD_DIR)/$(WFDB_PKG) rm -f $(BUILD_DIR)/wfdb.isconfig rm -f $(BUILD_DIR)/wfdb.isbuilt rm -f wfdb.tar.gz $(WFDB_ARCHIVE): $(GETURL) wfdb.tar.gz $(WFDB_SOURCE) $(SHA256SUM) < wfdb.tar.gz | grep $(WFDB_SHA256) mv wfdb.tar.gz $(WFDB_ARCHIVE) $(BUILD_DIR)/wfdb.isconfig: PATH:=$(buildbindir):$(PATH) $(BUILD_DIR)/wfdb.isconfig: $(WFDB_ARCHIVE) $(BUILD_DIR)/curl.isbuilt mkdir -p $(BUILD_DIR) tar -xzf $(WFDB_ARCHIVE) -C $(BUILD_DIR) ( cd $(BUILD_DIR)/$(WFDB_PKG) && \ ./configure $(configure_args) \ --prefix=$(prefix) \ --libdir=$(libdir) \ --without-xview \ --with-libcurl ) sed -e "s/ DBDIR//" -i- $(BUILD_DIR)/$(WFDB_PKG)/lib/wfdblib.h0 sed -e "s, /usr/database,," -i- $(BUILD_DIR)/$(WFDB_PKG)/checkpkg/expected/lcheck.log-NETFILES touch $(BUILD_DIR)/wfdb.isconfig $(BUILD_DIR)/wfdb.isbuilt: PATH:=$(buildbindir):$(PATH) $(BUILD_DIR)/wfdb.isbuilt: $(BUILD_DIR)/wfdb.isconfig ( cd $(BUILD_DIR)/$(WFDB_PKG) && \ $(MAKE) install CC="$(CC) -I$(includedir) -L$(libdir)" \ RPATHFLAGS= ) [ -n "$(nocheck)" ] || ( cd $(BUILD_DIR)/$(WFDB_PKG) && $(MAKE) check ) rm -f $(bindir)/psfd \ $(bindir)/hrmem \ $(bindir)/hrfft \ $(bindir)/pschart \ $(bindir)/hrlomb \ $(bindir)/hrplot \ $(bindir)/setwfdb \ $(bindir)/cshsetwfdb \ $(bindir)/ahaconvert \ $(bindir)/plot2d \ $(bindir)/plot3d \ $(bindir)/pnwlogin \ $(bindir)/url_view \ $(bindir)/wave \ $(bindir)/wave-remote \ $(bindir)/wavescript ( set -e; if [ -f $(libdir)/libwfdb.dylib ]; then \ dlname=libwfdb.$(WFDB_MAJOR).dylib; \ $(INSTALL_NAME_TOOL) -id @loader_path/../lib/$$dlname \ $(libdir)/libwfdb.dylib; \ for f in $(bindir)/*; do \ $(INSTALL_NAME_TOOL) -change $(libdir)/$$dlname \ @loader_path/../lib/$$dlname $$f; \ done; \ fi ) cp $(bindir)/wfdb-config $(buildbindir) cp $(bindir)/bxb $(buildbindir) touch $(BUILD_DIR)/wfdb.isbuilt wfdb: $(BUILD_DIR)/wfdb.isbuilt installclean-wfdb: rm -f $(BUILD_DIR)/wfdb.isbuilt rm -rf $(libdir)/ps ( set -e; \ if [ -f $(libdir)/libwfdb.so ]; then \ cd $(libdir); \ dlname=libwfdb.so.$(WFDB_MAJOR); \ cp $$dlname $$dlname-real; \ rm -f libwfdb.so libwfdb.so.*.*; \ mv $$dlname-real $$dlname; \ elif [ -f $(libdir)/libwfdb.dylib ]; then \ cd $(libdir); \ dlname=libwfdb.$(WFDB_MAJOR).dylib; \ cp $$dlname $$dlname-real; \ rm -f libwfdb.dylib libwfdb.*.*.dylib; \ mv $$dlname-real $$dlname; \ else \ rm -f $(libdir)/libwfdb.dll.a $(libdir)/libwfdb.dll.a.*; \ fi ) .PHONY: wfdb clean-wfdb installclean-wfdb ################################################################ ## librdsampjni (requires WFDB, JNI) librdsampjni_srcdir = $(SRC_DIR)/../../dependencies/jni clean-librdsampjni: rm -rf $(BUILD_DIR)/librdsampjni rm -f $(BUILD_DIR)/librdsampjni.isconfig rm -f $(BUILD_DIR)/librdsampjni.isbuilt $(BUILD_DIR)/librdsampjni.isconfig: $(BUILD_DIR)/wfdb.isbuilt mkdir -p $(BUILD_DIR)/librdsampjni [ -x $(librdsampjni_srcdir)/configure ] || \ ( cd $(librdsampjni_srcdir) && ./autogen.sh ) ( cd $(BUILD_DIR)/librdsampjni && \ $(librdsampjni_srcdir)/configure $(configure_args) \ --prefix=$(prefix) \ CC="$(CC)" \ WFDB_CFLAGS=-I$(includedir) \ WFDB_LIBS="-L$(libdir) -lwfdb" ) touch $(BUILD_DIR)/librdsampjni.isconfig $(BUILD_DIR)/librdsampjni.isbuilt: $(BUILD_DIR)/librdsampjni.isconfig ( cd $(BUILD_DIR)/librdsampjni && $(MAKE) install ) [ -n "$(nocheck)$(nojavacheck)" ] || ( cd $(BUILD_DIR)/librdsampjni && $(MAKE) check ) set -e; if [ -f $(bindir)/librdsampjni.dll ]; then \ ( cd $(bindir); ls libcurl-*.dll > librdsampjni.dep ); \ ( cd $(bindir); ls wfdb-*.*.dll >> librdsampjni.dep ); \ fi librdsampjni: $(BUILD_DIR)/librdsampjni.isbuilt installclean-librdsampjni: rm -f $(BUILD_DIR)/librdsampjni.isbuilt ( set -e; if [ -f $(libdir)/librdsampjni.la ]; then \ cd $(libdir); . ./librdsampjni.la; \ if [ -f $$dlname ]; then \ cp $$dlname $$dlname-real; \ rm -f $$library_names; \ mv $$dlname-real $$dlname; \ fi; \ fi ) rm -f $(libdir)/librdsampjni.la .PHONY: librdsampjni clean-librdsampjni installclean-librdsampjni ################################################################ ## edr (ECG-derived respiration) (requires WFDB) clean-edr: rm -f $(bindir)/edr edr: $(bindir)/edr $(bindir)/edr: edr.c $(BUILD_DIR)/wfdb.isbuilt mkdir -p $(bindir) $(CC) -I$(includedir) -L$(libdir) \ -o $(bindir)/edr -O edr.c -lm -lwfdb edr.c: $(GETURL) edr.c.tmp $(EDR_SOURCE) $(SHA256SUM) < edr.c.tmp | grep $(EDR_SHA256) mv edr.c.tmp edr.c .PHONY: edr clean-edr ################################################################ ## mse (Multi-scale entropy) clean-mse: rm -f $(bindir)/mse mse: $(bindir)/mse $(bindir)/mse: mse.c mkdir -p $(bindir) $(CC) -o $(bindir)/mse -O mse.c -lm mse.c: $(GETURL) mse.c.tmp $(MSE_SOURCE) $(SHA256SUM) < mse.c.tmp | grep $(MSE_SHA256) mv mse.c.tmp mse.c .PHONY: mse clean-mse ################################################################ ## ecgpuwave (requires WFDB) clean-ecgpuwave: rm -rf $(BUILD_DIR)/$(ECGPUWAVE_PKG) rm -f $(BUILD_DIR)/ecgpuwave.isbuilt $(ECGPUWAVE_ARCHIVE): $(GETURL) ecgpuwave.tar.gz $(ECGPUWAVE_SOURCE) $(SHA256SUM) < ecgpuwave.tar.gz | grep $(ECGPUWAVE_SHA256) mv ecgpuwave.tar.gz $(ECGPUWAVE_ARCHIVE) $(BUILD_DIR)/ecgpuwave.isbuilt: PATH:=$(buildbindir):$(PATH) $(BUILD_DIR)/ecgpuwave.isbuilt: $(BUILD_DIR)/wfdb.isbuilt $(BUILD_DIR)/ecgpuwave.isbuilt: $(ECGPUWAVE_ARCHIVE) mkdir -p $(BUILD_DIR) tar -xzf $(ECGPUWAVE_ARCHIVE) -C $(BUILD_DIR) ( cd $(BUILD_DIR)/$(ECGPUWAVE_PKG) && \ $(MAKE) CC="$(CC)" F77="$(F77)" \ WFDB_CFLAGS="-I$(includedir)" \ WFDB_LIBS="-L$(libdir) -lwfdb $(f77_extra_libs)" \ INCDIR=$(includedir) ) cp $(BUILD_DIR)/$(WFDB_PKG)/data/100s.* $(BUILD_DIR)/$(ECGPUWAVE_PKG)/ [ -n "$(nocheck)" ] || \ ( cd $(BUILD_DIR)/$(ECGPUWAVE_PKG) && $(MAKE) check -o ecgpuwave ) mkdir -p $(bindir) cp -v $(BUILD_DIR)/$(ECGPUWAVE_PKG)/ecgpuwave $(bindir) touch $(BUILD_DIR)/ecgpuwave.isbuilt ecgpuwave: $(BUILD_DIR)/ecgpuwave.isbuilt .PHONY: ecgpuwave clean-ecgpuwave ################################################################ ## dfa (Detrended fluctuation analysis) clean-dfa: rm -f $(bindir)/dfa dfa.c: $(GETURL) dfa.c.tmp $(DFA_SOURCE) $(SHA256SUM) < dfa.c.tmp | grep $(DFA_SHA256) mv dfa.c.tmp dfa.c dfa: $(bindir)/dfa $(bindir)/dfa: dfa.c mkdir -p $(bindir) $(CC) -o $(bindir)/dfa -O dfa.c -lm .PHONY: dfa clean-dfa ################################################################ ## Install files from build into bin and/or lib install: all ( set -e; cd $(bindir); \ if [ -f wfdb-*.dll ]; then \ for f in *; do \ case $$f in *.*);; *) mv $$f $$f.exe;; esac; \ done; \ fi ) #Test will run the MATLAB Unit tests headlessly #This requires the complete code repository and that the Makefile #is run under [root-install-dir]/wfdb-app-tolbox/mcode/nativelibs/linux-amd64/ directory test: cd ../ ;\ $(MATLAB) -nodesktop -nosplash -nodisplay -r "addpath(pwd);cd ../UnitTests;BatchTest;exit" #Package will clean all temporary files #generated by this Makefile so that the Toolbox binaries #are ready to be deployed package: rm -rf ./tmp/ rm -rf $(BUILD_DIR) rm curl* ecgpuwave* edr* mse* wfdb* *~ .PHONY: install test package