1#
2# Copyright 2011, Ben Langmead <langmea@cs.jhu.edu>
3#
4# This file is part of Bowtie 2.
5#
6# Bowtie 2 is free software: you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation, either version 3 of the License, or
9# (at your option) any later version.
10#
11# Bowtie 2 is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with Bowtie 2.  If not, see <http://www.gnu.org/licenses/>.
18#
19
20#
21# Makefile for bowtie, bowtie2-build, bowtie2-inspect
22#
23
24PREFIX := /usr/local
25bindir := $(PREFIX)/bin
26
27LDLIBS := -lpthread -lz
28
29HEADERS := $(wildcard *.h)
30BOWTIE_MM := 1
31BOWTIE_SHARED_MEM :=
32
33CXXFLAGS += -std=c++11
34
35ARCH = $(shell uname -p)
36NGS_VER ?= 2.9.2
37VDB_VER ?= 2.9.2-1
38
39# Detect Cygwin or MinGW
40WINDOWS :=
41MINGW :=
42ifneq (,$(findstring MINGW,$(shell uname)))
43  WINDOWS := 1
44  MINGW := 1
45  # POSIX memory-mapped files not currently supported on Windows
46  BOWTIE_MM :=
47  BOWTIE_SHARED_MEM :=
48endif
49
50MACOS :=
51ifneq (,$(findstring Darwin,$(shell uname)))
52  MACOS := 1
53  ifeq (1,$(shell uname -r | awk -F. '{ if ($$1 > 12 && $$1 < 16) print 1; }'))
54	CXXFLAGS += -stdlib=libstdc++
55  endif
56  ifdef STATIC_BUILD
57	CXXFLAGS += -mmacosx-version-min=10.9
58  endif
59endif
60
61BITS := 32
62ifneq (,$(findstring $(shell uname -p), x86_64 amd64))
63  BITS := 64
64  SSE_FLAG := -msse2
65  POPCNT_CAPABILITY ?= 1
66else ifneq (,$(findstring $(shell uname -p), aarch64 arm64 s390x powerpc64 powerpc64le))
67  BITS := 64
68  SSE_FLAG :=
69  CXXFLAGS += -fopenmp-simd
70  CPPFLAGS += -Ithird_party
71  POPCNT_CAPABILITY ?= 0
72endif
73
74# msys will always be 32 bit so look at the cpu arch instead.
75ifneq (,$(findstring AMD64,$(PROCESSOR_ARCHITEW6432)))
76  ifeq (1,$(MINGW))
77    BITS := 64
78  endif
79endif
80ifeq (32,$(BITS))
81  $(error bowtie2 compilation requires a 64-bit platform )
82endif
83
84ifdef STATIC_BUILD
85  LDFLAGS += -L$(CURDIR)/.tmp/lib
86  CPPFLAGS += -I$(CURDIR)/.tmp/include
87endif
88
89ifeq (1, $(POPCNT_CAPABILITY))
90  CXXFLAGS += -DPOPCNT_CAPABILITY
91  CPPFLAGS += -I third_party
92endif
93
94MM_DEF :=
95
96ifeq (1,$(BOWTIE_MM))
97  MM_DEF := -DBOWTIE_MM
98endif
99
100SHMEM_DEF :=
101
102ifdef BOWTIE_SHARED_MEM
103  SHMEM_DEF := -DBOWTIE_SHARED_MEM
104endif
105
106PTHREAD_PKG :=
107PTHREAD_LIB :=
108
109ifeq (1,$(MINGW))
110  PTHREAD_LIB :=
111else
112  PTHREAD_LIB := -lpthread
113endif
114
115ifeq (1,$(NO_SPINLOCK))
116  CXXFLAGS += -DNO_SPINLOCK
117endif
118
119USE_SRA ?=
120ifeq (1, $(USE_SRA))
121  ifdef MINGW
122    $(error "SRA binaries cannot be built on MINGW")
123  else
124    LDFLAGS += -L$(CURDIR)/.tmp/lib64
125    ifndef ($(STATIC_BUILD))
126      CPPFLAGS += -I$(CURDIR)/.tmp/include
127    endif
128    LDLIBS += -lncbi-ngs-c++-static
129    LDLIBS += -lngs-c++-static
130    LDLIBS += -lncbi-vdb-static
131    LDLIBS += -ldl
132    CXXFLAGS += -DUSE_SRA
133  endif
134endif
135
136ifeq (1,$(WITH_THREAD_PROFILING))
137  CXXFLAGS += -DPER_THREAD_TIMING=1
138endif
139
140ifeq (1,$(WITH_AFFINITY))
141  CXXFLAGS += -DWITH_AFFINITY=1
142endif
143
144#default is to use queue lock for better thread scaling performance
145ifneq (1,$(NO_QUEUELOCK))
146  CXXFLAGS += -DNO_SPINLOCK
147  CXXFLAGS += -DWITH_QUEUELOCK=1
148endif
149
150SHARED_CPPS :=  ccnt_lut.cpp ref_read.cpp alphabet.cpp shmem.cpp \
151  edit.cpp bt2_locks.cpp bt2_idx.cpp bt2_io.cpp bt2_util.cpp \
152  reference.cpp ds.cpp multikey_qsort.cpp limit.cpp \
153  random_source.cpp
154
155SEARCH_CPPS :=  qual.cpp pat.cpp sam.cpp \
156  read_qseq.cpp aligner_seed_policy.cpp \
157  aligner_seed.cpp \
158  aligner_seed2.cpp \
159  aligner_sw.cpp \
160  aligner_sw_driver.cpp aligner_cache.cpp \
161  aligner_result.cpp ref_coord.cpp mask.cpp \
162  pe.cpp aln_sink.cpp dp_framer.cpp \
163  scoring.cpp presets.cpp unique.cpp \
164  simple_func.cpp \
165  random_util.cpp \
166  aligner_bt.cpp sse_util.cpp \
167  aligner_swsse.cpp outq.cpp \
168  aligner_swsse_loc_i16.cpp \
169  aligner_swsse_ee_i16.cpp \
170  aligner_swsse_loc_u8.cpp \
171  aligner_swsse_ee_u8.cpp \
172  aligner_driver.cpp
173
174ifeq (1, $(WITH_ZSTD))
175  LDLIBS += -lzstd
176  SHARED_CPPS += zstd_decompress.cpp
177endif
178
179SEARCH_CPPS_MAIN := $(SEARCH_CPPS) bowtie_main.cpp
180
181DP_CPPS := qual.cpp aligner_sw.cpp aligner_result.cpp ref_coord.cpp mask.cpp \
182  simple_func.cpp sse_util.cpp aligner_bt.cpp aligner_swsse.cpp \
183  aligner_swsse_loc_i16.cpp aligner_swsse_ee_i16.cpp \
184  aligner_swsse_loc_u8.cpp aligner_swsse_ee_u8.cpp scoring.cpp
185
186BUILD_CPPS := diff_sample.cpp
187BUILD_CPPS_MAIN := $(BUILD_CPPS) bowtie_build_main.cpp
188
189SEARCH_FRAGMENTS := $(wildcard search_*_phase*.c)
190VERSION := $(shell cat BOWTIE2_VERSION)
191
192SANITIZER_FLAGS :=
193ifeq (0,$(shell $(CXX) -E -fsanitize=address,undefined btypes.h > /dev/null 2>&1; echo $$?))
194  SANITIZER_FLAGS := -fsanitize=address,undefined
195else ifeq (0,$(shell $(CXX) -E -fsanitize=address btypes.h > /dev/null 2>&1; echo $$?))
196  SANITIZER_FLAGS := -fsanitize=address
197else ifeq (0,$(shell $(CXX) -E -fsanitize=undefined btypes.h > /dev/null 2>&1; echo $$?))
198  SANITIZER_FLAGS := -fsanitize=undefined
199endif
200
201DEBUG_FLAGS    := -O0 -g3 $(SSE_FLAG)
202RELEASE_FLAGS  := -O3 $(SSE_FLAG) -funroll-loops -g3
203NOASSERT_FLAGS := -DNDEBUG
204FILE_FLAGS     := -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
205DEBUG_DEFS     = -DCOMPILER_OPTIONS="\"$(DEBUG_FLAGS) $(CXXFLAGS)\""
206RELEASE_DEFS   = -DCOMPILER_OPTIONS="\"$(RELEASE_FLAGS) $(CXXFLAGS)\""
207
208BOWTIE2_BIN_LIST := bowtie2-build-s \
209  bowtie2-build-l \
210  bowtie2-align-s \
211  bowtie2-align-l \
212  bowtie2-inspect-s \
213  bowtie2-inspect-l
214BOWTIE2_BIN_LIST_DBG := bowtie2-build-s-debug \
215  bowtie2-build-l-debug \
216  bowtie2-align-s-debug \
217  bowtie2-align-l-debug \
218  bowtie2-inspect-s-debug \
219  bowtie2-inspect-l-debug
220BOWTIE2_BIN_LIST_SAN := bowtie2-build-s-sanitized \
221  bowtie2-build-l-sanitized \
222  bowtie2-align-s-sanitized \
223  bowtie2-align-l-sanitized \
224  bowtie2-inspect-s-sanitized \
225  bowtie2-inspect-l-sanitized
226ifndef SANITIZER_FLAGS
227        BOWTIE2_BIN_LIST_SAN =
228endif
229
230GENERAL_LIST := $(wildcard scripts/*.sh) \
231  $(wildcard scripts/*.pl) \
232  doc/manual.html \
233  doc/README \
234  doc/style.css \
235  $(wildcard example/index/*.bt2) \
236  $(wildcard example/reads/*.fq) \
237  $(wildcard example/reads/*.pl) \
238  example/reads/combined_reads.bam \
239  example/reference/lambda_virus.fa \
240  $(PTHREAD_PKG) \
241  bowtie2 \
242  bowtie2-build \
243  bowtie2-inspect \
244  AUTHORS \
245  LICENSE \
246  NEWS \
247  MANUAL \
248  MANUAL.markdown \
249  README.md \
250  TUTORIAL \
251  BOWTIE2_VERSION
252
253ifeq (1,$(WINDOWS))
254  BOWTIE2_BIN_LIST := $(BOWTIE2_BIN_LIST) bowtie2.bat bowtie2-build.bat bowtie2-inspect.bat
255  CXXFLAGS += -static-libgcc -static-libstdc++
256endif
257
258# This is helpful on Windows under MinGW/MSYS, where Make might go for
259# the Windows FIND tool instead.
260FIND := $(shell which find)
261
262SRC_PKG_LIST = $(wildcard *.h) \
263  $(wildcard *.hh) \
264  $(wildcard *.c) \
265  $(wildcard *.cpp) \
266  $(wildcard third_party/*) \
267  Makefile \
268  CMakeLists.txt \
269  $(GENERAL_LIST)
270
271ifeq (1,$(WINDOWS))
272  BIN_PKG_LIST := $(GENERAL_LIST) bowtie2.bat bowtie2-build.bat bowtie2-inspect.bat
273else
274  BIN_PKG_LIST := $(GENERAL_LIST)
275endif
276
277.PHONY: all allall both both-debug
278
279all: $(BOWTIE2_BIN_LIST) ;
280allall: $(BOWTIE2_BIN_LIST) $(BOWTIE2_BIN_LIST_DBG) $(BOWTIE2_BIN_LIST_SAN) ;
281both: bowtie2-align-s bowtie2-build-s bowtie2-align-l bowtie2-build-l ;
282both-debug: bowtie2-align-s-debug bowtie2-build-s-debug bowtie2-align-l-debug bowtie2-build-l-debug ;
283both-sanitized: bowtie2-align-s-sanitized bowtie2-build-s-sanitized bowtie2-align-l-sanitized bowtie2-build-l-sanitized ;
284
285DEFS := -fno-strict-aliasing \
286  -DBOWTIE2_VERSION="\"`cat BOWTIE2_VERSION`\"" \
287  -DBUILD_HOST="\"$${HOSTNAME:-`hostname`}\"" \
288  -DBUILD_TIME="\"`date -u`\"" \
289  -DCOMPILER_VERSION="\"`$(CXX) -v 2>&1 | tail -1`\"" \
290  $(FILE_FLAGS) \
291  $(PREF_DEF) \
292  $(MM_DEF) \
293  $(SHMEM_DEF)
294
295# set compiler flags for all sanitized builds
296ifdef BOWTIE2_BIN_LIST_SAN
297$(BOWTIE2_BIN_LIST_SAN): CXXFLAGS+=$(SANITIZER_FLAGS)
298else
299$(BOWTIE2_BIN_LIST_SAN): $(error "Compiler does not support...")
300endif
301
302#
303# bowtie2-build targets
304#
305
306bowtie2-build-s-sanitized bowtie2-build-s: bt2_build.cpp $(SHARED_CPPS) $(HEADERS)
307	$(CXX) $(RELEASE_FLAGS) $(RELEASE_DEFS) $(CXXFLAGS) \
308		$(DEFS) -DBOWTIE2 $(NOASSERT_FLAGS) -Wall \
309		$(CPPFLAGS) \
310		-o $@ $< \
311		$(SHARED_CPPS) $(BUILD_CPPS_MAIN) \
312		$(LDFLAGS) $(LDLIBS)
313
314bowtie2-build-l-sanitized bowtie2-build-l: bt2_build.cpp $(SHARED_CPPS) $(HEADERS)
315	$(CXX) $(RELEASE_FLAGS) $(RELEASE_DEFS) $(CXXFLAGS) \
316		$(DEFS) -DBOWTIE2 -DBOWTIE_64BIT_INDEX $(NOASSERT_FLAGS) -Wall \
317		$(CPPFLAGS) \
318		-o $@ $< \
319		$(SHARED_CPPS) $(BUILD_CPPS_MAIN) \
320		$(LDFLAGS) $(LDLIBS)
321
322bowtie2-build-s-debug: bt2_build.cpp $(SHARED_CPPS) $(HEADERS)
323	$(CXX) $(DEBUG_FLAGS) $(DEBUG_DEFS) $(CXXFLAGS) \
324		$(DEFS) -DBOWTIE2 -Wall \
325		$(CPPFLAGS) \
326		-o $@ $< \
327		$(SHARED_CPPS) $(BUILD_CPPS_MAIN) \
328		$(LDFLAGS) $(LDLIBS)
329
330bowtie2-build-l-debug: bt2_build.cpp $(SHARED_CPPS) $(HEADERS)
331	$(CXX) $(DEBUG_FLAGS) $(DEBUG_DEFS) $(CXXFLAGS) \
332		$(DEFS) -DBOWTIE2 -DBOWTIE_64BIT_INDEX -Wall \
333		$(CPPFLAGS) \
334		-o $@ $< \
335		$(SHARED_CPPS) $(BUILD_CPPS_MAIN) \
336		$(LDFLAGS) $(LDLIBS)
337
338#
339# bowtie2-align targets
340#
341
342bowtie2-align-s-sanitized bowtie2-align-s: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $(SEARCH_FRAGMENTS)
343	$(CXX) $(RELEASE_FLAGS) $(RELEASE_DEFS) $(CXXFLAGS) \
344		$(DEFS) -DBOWTIE2 $(NOASSERT_FLAGS) -Wall \
345		$(CPPFLAGS) \
346		-o $@ $< \
347		$(SHARED_CPPS) $(SEARCH_CPPS_MAIN) \
348		$(LDFLAGS) $(LDLIBS)
349
350bowtie2-align-l-sanitized bowtie2-align-l: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $(SEARCH_FRAGMENTS)
351	$(CXX) $(RELEASE_FLAGS) $(RELEASE_DEFS) $(CXXFLAGS) \
352		$(DEFS) -DBOWTIE2 -DBOWTIE_64BIT_INDEX $(NOASSERT_FLAGS) -Wall \
353		$(CPPFLAGS) \
354		-o $@ $< \
355		$(SHARED_CPPS) $(SEARCH_CPPS_MAIN) \
356		$(LDFLAGS) $(LDLIBS)
357
358bowtie2-align-s-debug: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $(SEARCH_FRAGMENTS)
359	$(CXX) $(DEBUG_FLAGS) \
360		$(DEBUG_DEFS) $(CXXFLAGS) \
361		$(DEFS) -DBOWTIE2 -Wall \
362		$(CPPFLAGS) \
363		-o $@ $< \
364		$(SHARED_CPPS) $(SEARCH_CPPS_MAIN) \
365		$(LDFLAGS) $(LDLIBS)
366
367bowtie2-align-l-debug: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $(SEARCH_FRAGMENTS)
368	$(CXX) $(DEBUG_FLAGS) \
369		$(DEBUG_DEFS) $(CXXFLAGS) \
370		$(DEFS) -DBOWTIE2 -DBOWTIE_64BIT_INDEX -Wall \
371		$(CPPFLAGS) \
372		-o $@ $< \
373		$(SHARED_CPPS) $(SEARCH_CPPS_MAIN) \
374		$(LDFLAGS) $(LDLIBS)
375
376#
377# bowtie2-inspect targets
378#
379
380bowtie2-inspect-s-sanitized bowtie2-inspect-s: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS)
381	$(CXX) $(RELEASE_FLAGS) \
382		$(RELEASE_DEFS) $(CXXFLAGS) \
383		$(DEFS) -DBOWTIE2 -DBOWTIE_INSPECT_MAIN -Wall \
384		$(CPPFLAGS) \
385		-o $@ $< \
386		$(SHARED_CPPS) \
387		$(LDFLAGS) $(LDLIBS)
388
389bowtie2-inspect-l-sanitized bowtie2-inspect-l: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS)
390	$(CXX) $(RELEASE_FLAGS) \
391		$(RELEASE_DEFS) $(CXXFLAGS) \
392		$(DEFS) -DBOWTIE2 -DBOWTIE_INSPECT_MAIN  -DBOWTIE_64BIT_INDEX -Wall \
393		$(CPPFLAGS) \
394		-o $@ $< \
395		$(SHARED_CPPS) \
396		$(LDFLAGS) $(LDLIBS)
397
398bowtie2-inspect-s-debug: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS)
399	$(CXX) $(DEBUG_FLAGS) \
400		$(DEBUG_DEFS) $(CXXFLAGS) \
401		$(DEFS) -DBOWTIE2 -DBOWTIE_INSPECT_MAIN -Wall \
402		$(CPPFLAGS) \
403		-o $@ $< \
404		$(SHARED_CPPS) \
405		$(LDFLAGS) $(LDLIBS)
406
407bowtie2-inspect-l-debug: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS)
408	$(CXX) $(DEBUG_FLAGS) \
409		$(DEBUG_DEFS) $(CXXFLAGS) \
410		$(DEFS) -DBOWTIE2 -DBOWTIE_64BIT_INDEX -DBOWTIE_INSPECT_MAIN -Wall \
411		$(CPPFLAGS) \
412		-o $@ $< \
413		$(SHARED_CPPS) \
414		$(LDFLAGS) $(LDLIBS)
415
416#
417# bowtie2-dp targets
418#
419
420bowtie2-dp: bt2_dp.cpp $(HEADERS) $(SHARED_CPPS) $(DP_CPPS)
421	$(CXX) $(RELEASE_FLAGS) \
422		$(RELEASE_DEFS) $(CXXFLAGS) $(NOASSERT_FLAGS) \
423		$(DEFS) -DBOWTIE2 -DBOWTIE_DP_MAIN -Wall \
424		$(CPPFLAGS) \
425		-o $@ $< \
426		$(DP_CPPS) $(SHARED_CPPS) \
427		$(LDFLAGS) $(LDLIBS)
428
429bowtie2-dp-debug: bt2_dp.cpp $(HEADERS) $(SHARED_CPPS) $(DP_CPPS)
430	$(CXX) $(DEBUG_FLAGS) \
431		$(DEBUG_DEFS) $(CXXFLAGS) \
432		$(DEFS) -DBOWTIE2 -DBOWTIE_DP_MAIN -Wall \
433		$(CPPFLAGS) \
434		-o $@ $< \
435		$(DP_CPPS) $(SHARED_CPPS) \
436		$(LDFLAGS) $(LDLIBS)
437
438bowtie2.bat:
439	echo "@echo off" > bowtie2.bat
440	echo "perl %~dp0/bowtie2 %*" >> bowtie2.bat
441
442bowtie2-build.bat:
443	echo "@echo off" > bowtie2-build.bat
444	echo "python3 %~dp0/bowtie2-build %*" >> bowtie2-build.bat
445
446bowtie2-inspect.bat:
447	echo "@echo off" > bowtie2-inspect.bat
448	echo "python3 %~dp0/bowtie2-inspect %*" >> bowtie2-inspect.bat
449
450.PHONY: bowtie2-src-pkg
451bowtie2-src-pkg: $(SRC_PKG_LIST)
452	chmod a+x scripts/*.sh scripts/*.pl
453	mkdir .src.tmp
454	mkdir .src.tmp/bowtie2-$(VERSION)
455	zip tmp.zip $(SRC_PKG_LIST)
456	mv tmp.zip .src.tmp/bowtie2-$(VERSION)
457	cd .src.tmp/bowtie2-$(VERSION) ; unzip tmp.zip ; rm -f tmp.zip
458	cd .src.tmp ; zip -r bowtie2-$(VERSION)-source.zip bowtie2-$(VERSION)
459	cp .src.tmp/bowtie2-$(VERSION)-source.zip .
460	rm -rf .src.tmp
461
462.PHONY: bowtie2-bin-pkg
463bowtie2-bin-pkg: PKG_DIR := bowtie2-$(VERSION)-$(if $(USE_SRA),sra-)$(if $(MACOS),macos,$(if $(MINGW),mingw,linux))-$(ARCH)
464bowtie2-bin-pkg: $(BIN_PKG_LIST) $(BOWTIE2_BIN_LIST) $(BOWTIE2_BIN_LIST_DBG)
465	chmod a+x scripts/*.sh scripts/*.pl
466	rm -rf .bin.tmp
467	mkdir -p .bin.tmp/$(PKG_DIR)
468	if [ -f bowtie2-align-s.exe ] ; then \
469		zip tmp.zip $(BIN_PKG_LIST) $(addsuffix .exe,$(BOWTIE2_BIN_LIST) $(BOWTIE2_BIN_LIST_DBG)) ; \
470	else \
471		zip tmp.zip $(BIN_PKG_LIST) $(BOWTIE2_BIN_LIST) $(BOWTIE2_BIN_LIST_DBG) ; \
472	fi
473	mv tmp.zip .bin.tmp/$(PKG_DIR)
474	cd .bin.tmp/$(PKG_DIR) ; unzip tmp.zip ; rm -f tmp.zip
475	cd .bin.tmp ; zip -r $(PKG_DIR).zip $(PKG_DIR)
476	cp .bin.tmp/$(PKG_DIR).zip .
477	rm -rf .bin.tmp
478
479bowtie2-seeds-debug: aligner_seed.cpp ccnt_lut.cpp alphabet.cpp aligner_seed.h bt2_idx.cpp bt2_io.cpp
480	$(CXX) $(DEBUG_FLAGS) \
481		$(DEBUG_DEFS) $(CXXFLAGS) \
482		-DSCAN_MAIN \
483		$(DEFS) -Wall \
484		$(CPPFLAGS) \
485		-o $@ $< \
486		aligner_seed.cpp bt2_idx.cpp ccnt_lut.cpp alphabet.cpp bt2_io.cpp \
487		$(LDFLAGS) $(LDLIBS)
488
489.PHONY: doc
490doc: doc/manual.html MANUAL
491
492doc/manual.html: MANUAL.markdown
493	echo "<h1>Table of Contents</h1>" > .tmp.head
494	pandoc -B .tmp.head \
495	       --metadata title:"Bowtie 2 Manual"\
496	       --css doc/style.css -o $@ \
497	       --from markdown-smart \
498	       --to HTML \
499	       --table-of-contents $^
500	rm -f .tmp.head
501
502MANUAL: MANUAL.markdown
503	pandoc -f markdown-smart -t plain $^ -o $@
504
505.PHONY: install
506install: all
507	mkdir -p $(DESTDIR)$(bindir)
508	for file in $(BOWTIE2_BIN_LIST) bowtie2-inspect bowtie2-build bowtie2 ; do \
509		cp -f $$file $(DESTDIR)$(bindir) ; \
510	done
511
512.PHONY: simple-test
513simple-test: perl-deps both both-debug both-sanitized
514	eval `perl -I $(CURDIR)/.tmp/lib/perl5 -Mlocal::lib=$(CURDIR)/.tmp` ; \
515	sh ./scripts/test/simple_tests.sh
516
517.PHONY: random-test
518random-test: all perl-deps
519	eval `perl -I $(CURDIR)/.tmp/lib/perl5 -Mlocal::lib=$(CURDIR)/.tmp` ; \
520	sh ./scripts/sim/run.sh $(if $(NUM_CORES), $(NUM_CORES), 2)
521
522.PHONY: perl-deps
523perl-deps:
524	if [ ! -d "$(CURDIR)/.tmp" ]; then \
525		mkdir -p $(CURDIR)/.tmp/include $(CURDIR)/.tmp/lib ; \
526	fi
527	DL=$$( ( which wget >/dev/null 2>&1 && echo "wget --no-check-certificate -O-" ) || echo "curl -L") ; \
528	$$DL http://cpanmin.us | perl - -l $(CURDIR)/.tmp App::cpanminus local::lib ; \
529	eval `perl -I $(CURDIR)/.tmp/lib/perl5 -Mlocal::lib=$(CURDIR)/.tmp` ; \
530	$(CURDIR)/.tmp/bin/cpanm --force File::Which Math::Random Clone Test::Deep Sys::Info ; \
531
532.PHONY: static-libs
533static-libs:
534	if [ ! -d "$(CURDIR)/.tmp" ] ; then \
535		mkdir -p $(CURDIR)/.tmp/include $(CURDIR)/.tmp/lib ; \
536	fi ; \
537	if [ `uname` = "Darwin" ]; then \
538		export CFLAGS=-mmacosx-version-min=10.9 ; \
539		export CXXFLAGS=-mmacosx-version-min=10.9 ; \
540	fi ; \
541	cd $(CURDIR)/.tmp ; \
542	DL=$$( ( which wget >/dev/null 2>&1 && echo "wget --no-check-certificate" ) || echo "curl -LOk") ; \
543	if [ ! -f "$(CURDIR)/.tmp/include/zlib.h" ] ; then \
544		$$DL https://zlib.net/zlib-1.2.11.tar.gz && tar xzf zlib-1.2.11.tar.gz && cd zlib-1.2.11 ; \
545		$(if $(MINGW), mingw32-make -f win32/Makefile.gcc, ./configure --static && make) ; \
546		cp zlib.h zconf.h $(CURDIR)/.tmp/include && cp libz.a $(CURDIR)/.tmp/lib ; \
547		rm -f zlib-1.2.11 ; \
548	fi ; \
549        if [ ! -f "$(CURDIR)/.tmp/include/zstd.h" ]; then \
550                cd $(CURDIR)/.tmp ; \
551                $$DL https://github.com/facebook/zstd/releases/download/v1.4.9/zstd-1.4.9.tar.gz && tar xzf zstd-1.4.9.tar.gz ; \
552                cd zstd-1.4.9 && $(MAKE) ; \
553                cd $(CURDIR)/.tmp/zstd-1.4.9/lib && cp zstd.h $(CURDIR)/.tmp/include && cp libzstd.a $(CURDIR)/.tmp/lib ; \
554        fi
555
556.PHONY: sra-deps
557sra-deps:
558	DL=$$( ( which wget >/dev/null 2>&1 && echo "wget --no-check-certificate" ) || echo "curl -LOk") ; \
559	if [ ! -d "$(CURDIR)/.tmp" ] ; then \
560		mkdir -p $(CURDIR)/.tmp/include $(CURDIR)/.tmp/lib ; \
561	fi ; \
562	if [ `uname` = "Darwin" ]; then \
563		export CFLAGS=-mmacosx-version-min=10.9 ; \
564		export CXXFLAGS=-mmacosx-version-min=10.9 ; \
565	fi ; \
566	if [ ! -f "$(CURDIR)/.tmp/include/ngs/Alignment.hpp" ] ; then \
567		if [ ! -d "$(CURDIR)/.tmp/ngs-$(NGS_VER)/ngs-sdk" ] ; then \
568			cd $(CURDIR)/.tmp ; \
569			$$DL https://github.com/ncbi/ngs/archive/$(NGS_VER).tar.gz ; \
570			tar xzvf $(NGS_VER).tar.gz ; \
571			rm -f $(NGS_VER).tar.gz ; \
572		fi ; \
573		cd $(CURDIR)/.tmp/ngs-$(NGS_VER) && ./configure --prefix=$(CURDIR)/.tmp --build-prefix=`pwd`/build ; \
574		make && make install ; \
575	fi ; \
576	if [ ! -f "$(CURDIR)/.tmp/include/ncbi-vdb/NGS.hpp" ] ; then \
577		if [ ! -d "$(CURDIR)/.tmp/ncbi-vdb-$(VDB_VER)/vdb3" ] ; then \
578			cd $(CURDIR)/.tmp ; \
579	 		$$DL https://github.com/ncbi/ncbi-vdb/archive/$(VDB_VER).tar.gz ; \
580	 		tar zxvf $(VDB_VER).tar.gz ; \
581	 		rm -f $(VDB_VER).tar.gz ; \
582	 	fi ; \
583	 	cd $(CURDIR)/.tmp/ncbi-vdb-$(VDB_VER) && ./configure --prefix=$(CURDIR)/.tmp --build-prefix=`pwd`/build --with-ngs-sdk=$(CURDIR)/.tmp && make && make install ; \
584	 fi ;
585
586.PHONY: test
587test: simple-test random-test
588
589.PHONY: clean
590clean:
591	rm -f $(BOWTIE2_BIN_LIST) $(BOWTIE2_BIN_LIST_DBG) $(BOWTIE2_BIN_LIST_SAN) \
592	$(addsuffix .exe,$(BOWTIE2_BIN_LIST) $(BOWTIE2_BIN_LIST_DBG)) \
593	bowtie2-*.zip
594	rm -f core.* .tmp.head
595	rm -rf *.dSYM
596	rm -rf .tmp
597