Commit patch to not break on spaces.
[bowtie.git] / Makefile
1 #
2 # Makefile for bowtie, bowtie-build, bowtie-inspect
3 #
4
5 SEQAN_DIR = SeqAn-1.1
6 SEQAN_INC = -I $(SEQAN_DIR)
7 INC = $(SEQAN_INC)
8 GCC_PREFIX = $(shell dirname `which gcc`)
9 GCC_SUFFIX =
10 CC = $(GCC_PREFIX)/gcc$(GCC_SUFFIX)
11 CPP = $(GCC_PREFIX)/g++$(GCC_SUFFIX)
12 CXX = $(CPP)
13 HEADERS = $(wildcard *.h)
14 BOWTIE_PTHREADS = 1
15 BOWTIE_MM = 1
16 BOWTIE_SHARED_MEM = 1
17 EXTRA_FLAGS =
18 EXTRA_CFLAGS =
19 EXTRA_CXXFLAGS =
20 CFLAGS += $(EXTRA_CFLAGS)
21 CXXFLAGS += $(EXTRA_CXXFLAGS)
22
23 # Detect Cygwin or MinGW
24 WINDOWS = 0
25 ifneq (,$(findstring CYGWIN,$(shell uname)))
26 WINDOWS = 1
27 # POSIX memory-mapped files not currently supported on Windows
28 BOWTIE_MM = 0
29 BOWTIE_SHARED_MEM = 0
30 else
31 ifneq (,$(findstring MINGW,$(shell uname)))
32 WINDOWS = 1
33 # POSIX memory-mapped files not currently supported on Windows
34 BOWTIE_MM = 0
35 BOWTIE_SHARED_MEM = 0
36 endif
37 endif
38
39 MACOS = 0
40 ifneq (,$(findstring Darwin,$(shell uname)))
41 MACOS = 1
42 endif
43
44 LINUX = 0
45 ifneq (,$(findstring Linux,$(shell uname)))
46 LINUX = 1
47 EXTRA_FLAGS += -Wl,--hash-style=both
48 endif
49
50 MM_DEF = 
51 ifeq (1,$(BOWTIE_MM))
52 MM_DEF = -DBOWTIE_MM
53 endif
54 SHMEM_DEF = 
55 ifeq (1,$(BOWTIE_SHARED_MEM))
56 SHMEM_DEF = -DBOWTIE_SHARED_MEM
57 endif
58 PTHREAD_PKG =
59 PTHREAD_LIB =
60 PTHREAD_DEF =
61 ifeq (1,$(BOWTIE_PTHREADS))
62 PTHREAD_DEF = -DBOWTIE_PTHREADS
63 ifeq (1,$(WINDOWS))
64 # pthreads for windows forces us to be specific about the library
65 PTHREAD_LIB = -L . -lpthreadGC2
66 PTHREAD_PKG = pthreadGC2.dll
67 else
68 # There's also -pthread, but that only seems to work on Linux
69 PTHREAD_LIB = -lpthread
70 endif
71 endif
72
73 PREFETCH_LOCALITY = 2
74 PREF_DEF = -DPREFETCH_LOCALITY=$(PREFETCH_LOCALITY)
75
76 LIBS = 
77 SEARCH_LIBS = $(PTHREAD_LIB)
78 BUILD_LIBS =
79
80 OTHER_CPPS = ccnt_lut.cpp ref_read.cpp alphabet.c shmem.cpp \
81              edit.cpp ebwt.cpp
82 SEARCH_CPPS = qual.cpp pat.cpp ebwt_search_util.cpp ref_aligner.cpp \
83               log.cpp hit_set.cpp refmap.cpp annot.cpp sam.cpp \
84               color.cpp color_dec.cpp hit.cpp
85 SEARCH_CPPS_MAIN = $(SEARCH_CPPS) bowtie_main.cpp
86
87 BUILD_CPPS =
88 BUILD_CPPS_MAIN = $(BUILD_CPPS) bowtie_build_main.cpp
89
90 SEARCH_FRAGMENTS = $(wildcard search_*_phase*.c)
91 VERSION = $(shell cat VERSION)
92
93 # Convert BITS=?? to a -m flag
94 BITS_FLAG =
95 ifeq (32,$(BITS))
96 BITS_FLAG = -m32
97 endif
98 ifeq (64,$(BITS))
99 BITS_FLAG = -m64
100 endif
101
102 # Convert CHUD=1 to CHUD-related flags
103 CHUD=0
104 CHUD_DEF =
105 ifeq (1,$(CHUD))
106 EXTRA_FLAGS += -g3
107 ifeq (1,$(MACOS))
108 CHUD_DEF = -F/System/Library/PrivateFrameworks -weak_framework CHUD -DCHUD_PROFILING
109 endif
110 endif
111
112 DEBUG_FLAGS = -O0 -g3 $(BITS_FLAG)
113 RELEASE_FLAGS = -O3 $(BITS_FLAG)
114 NOASSERT_FLAGS = -DNDEBUG
115 FILE_FLAGS = -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
116
117 BIN_LIST = bowtie-build \
118            bowtie \
119            bowtie-inspect
120 BIN_LIST_AUX = bowtie-build-debug \
121                bowtie-debug \
122                bowtie-inspect-debug
123
124 GENERAL_LIST = $(wildcard scripts/*.sh) \
125                $(wildcard scripts/*.pl) \
126                $(wildcard indexes/e_coli*) \
127                $(wildcard genomes/NC_008253.fna) \
128                $(wildcard reads/e_coli_1000.*) \
129                $(wildcard reads/e_coli_1000_*) \
130                doc/manual.html \
131                doc/README \
132                doc/style.css \
133                reads/e_coli_10000snp.fa \
134                reads/e_coli_10000snp.fq \
135                $(PTHREAD_PKG) \
136                AUTHORS \
137                COPYING \
138                NEWS \
139                MANUAL \
140                MANUAL.markdown \
141                TUTORIAL \
142                VERSION
143
144 # This is helpful on Windows under MinGW/MSYS, where Make might go for
145 # the Windows FIND tool instead.
146 FIND=$(shell which find)
147
148 SRC_PKG_LIST = $(wildcard *.h) \
149                $(wildcard *.hh) \
150                $(wildcard *.c) \
151                $(wildcard *.cpp) \
152                $(shell $(FIND) SeqAn-1.1 -name "*.h") \
153                $(shell $(FIND) SeqAn-1.1 -name "*.txt") \
154                doc/strip_markdown.pl \
155                Makefile \
156                $(GENERAL_LIST)
157
158 BIN_PKG_LIST = $(GENERAL_LIST)
159
160 all: $(BIN_LIST)
161
162 allall: $(BIN_LIST) $(BIN_LIST_AUX)
163
164 DEFS=-fno-strict-aliasing \
165      -DBOWTIE_VERSION="\"`cat VERSION`\"" \
166      -DBUILD_HOST="\"`hostname`\"" \
167      -DBUILD_TIME="\"`date`\"" \
168      -DCOMPILER_VERSION="\"`$(CXX) -v 2>&1 | tail -1`\"" \
169      $(FILE_FLAGS) \
170      $(PTHREAD_DEF) \
171      $(PREF_DEF) \
172      $(MM_DEF) \
173      $(SHMEM_DEF) \
174      $(CHUD_DEF)
175
176 define checksum
177   cat $^ | md5sum | awk '{print $$1}' > .$@.md5
178 endef
179
180 ALL_FLAGS=$(EXTRA_FLAGS) $(CFLAGS) $(CXXFLAGS)
181 DEBUG_DEFS = -DCOMPILER_OPTIONS="\"$(DEBUG_FLAGS) $(ALL_FLAGS)\""
182 RELEASE_DEFS = -DCOMPILER_OPTIONS="\"$(RELEASE_FLAGS) $(ALL_FLAGS)\""
183
184 #
185 # bowtie-build targets
186 #
187
188 bowtie-build: ebwt_build.cpp $(OTHER_CPPS) $(HEADERS)
189         $(checksum)
190         $(CXX) $(RELEASE_FLAGS) $(RELEASE_DEFS) $(ALL_FLAGS) \
191                 -DEBWT_BUILD_HASH=`cat .$@.md5` \
192                 $(DEFS) $(NOASSERT_FLAGS) -Wall \
193                 $(INC) \
194                 -o $@ $< \
195                 $(OTHER_CPPS) $(BUILD_CPPS_MAIN) \
196                 $(LIBS) $(BUILD_LIBS)
197
198 bowtie-build_prof: ebwt_build.cpp $(OTHER_CPPS) $(HEADERS)
199         $(checksum)
200         $(CXX) $(RELEASE_FLAGS) -pg -p -g3 $(RELEASE_DEFS) $(ALL_FLAGS) \
201                 -DEBWT_BUILD_HASH=`cat .$@.md5` \
202                 $(DEFS) $(NOASSERT_FLAGS) -Wall \
203                 $(INC) \
204                 -o $@ $< \
205                 $(OTHER_CPPS) $(BUILD_CPPS_MAIN) \
206                 $(LIBS) $(BUILD_LIBS)
207
208 bowtie-build-debug: ebwt_build.cpp $(OTHER_CPPS) $(HEADERS)
209         $(checksum)
210         $(CXX) $(DEBUG_FLAGS) $(DEBUG_DEFS) $(ALL_FLAGS) \
211                 -DEBWT_BUILD_HASH=`cat .$@.md5` \
212                 $(DEFS) -Wall \
213                 $(INC) \
214                 -o $@ $< \
215                 $(OTHER_CPPS) $(BUILD_CPPS_MAIN) \
216                 $(LIBS) $(BUILD_LIBS)
217
218 #
219 # bowtie targets
220 #
221
222 bowtie: ebwt_search.cpp $(SEARCH_CPPS) $(OTHER_CPPS) $(HEADERS) $(SEARCH_FRAGMENTS)
223         $(checksum)
224         $(CXX) $(RELEASE_FLAGS) $(RELEASE_DEFS) $(ALL_FLAGS) \
225                 -DEBWT_SEARCH_HASH=`cat .$@.md5` \
226                 $(DEFS) $(NOASSERT_FLAGS) -Wall \
227                 $(INC) \
228                 -o $@ $< \
229                 $(OTHER_CPPS) $(SEARCH_CPPS_MAIN) \
230                 $(LIBS) $(SEARCH_LIBS)
231
232 bowtie_prof: ebwt_search.cpp $(SEARCH_CPPS) $(OTHER_CPPS) $(HEADERS) $(SEARCH_FRAGMENTS)
233         $(checksum)
234         $(CXX) $(RELEASE_FLAGS) \
235                 $(RELEASE_DEFS) -pg -p -g3 $(ALL_FLAGS) \
236                 -DEBWT_SEARCH_HASH=`cat .$@.md5` \
237                 $(DEFS) $(NOASSERT_FLAGS) -Wall \
238                 $(INC) \
239                 -o $@ $< \
240                 $(OTHER_CPPS) $(SEARCH_CPPS_MAIN) \
241                 $(LIBS) $(SEARCH_LIBS)
242
243 bowtie-debug: ebwt_search.cpp $(SEARCH_CPPS) $(OTHER_CPPS) $(HEADERS) $(SEARCH_FRAGMENTS)
244         $(checksum)
245         $(CXX) $(DEBUG_FLAGS) \
246                 $(DEBUG_DEFS) $(ALL_FLAGS) \
247                 -DEBWT_SEARCH_HASH=`cat .$@.md5` \
248                 $(DEFS) -Wall \
249                 $(INC) \
250                 -o $@ $< \
251                 $(OTHER_CPPS) $(SEARCH_CPPS_MAIN) \
252                 $(LIBS) $(SEARCH_LIBS)
253
254 #
255 # bowtie-inspect targets
256 #
257
258 bowtie-inspect: bowtie_inspect.cpp $(HEADERS) $(OTHER_CPPS)
259         $(checksum)
260         $(CXX) $(RELEASE_FLAGS) \
261                 $(RELEASE_DEFS) $(ALL_FLAGS) \
262                 -DEBWT_INSPECT_HASH=`cat .$@.md5` \
263                 $(DEFS) -Wall \
264                 $(INC) -I . \
265                 -o $@ $< \
266                 $(OTHER_CPPS) \
267                 $(LIBS)
268
269 bowtie-inspect-debug: bowtie_inspect.cpp $(HEADERS) $(OTHER_CPPS) 
270         $(checksum)
271         $(CXX) $(DEBUG_FLAGS) \
272                 $(DEBUG_DEFS) $(ALL_FLAGS) \
273                 -DEBWT_INSPECT_HASH=`cat .$@.md5` \
274                 $(DEFS) -Wall \
275                 $(INC) -I . \
276                 -o $@ $< \
277                 $(OTHER_CPPS) \
278                 $(LIBS)
279
280 chaincat: chaincat.cpp hit_set.h filebuf.h hit_set.cpp alphabet.h alphabet.c
281         $(CXX) $(DEBUG_FLAGS) $(DEBUG_DEFS) $(ALL_FLAGS) -Wall $(INC) -I . -o $@ $< hit_set.cpp alphabet.c
282
283 bowtie-src.zip: $(SRC_PKG_LIST)
284         chmod a+x scripts/*.sh scripts/*.pl
285         mkdir .src.tmp
286         mkdir .src.tmp/bowtie-$(VERSION)
287         zip tmp.zip $(SRC_PKG_LIST)
288         mv tmp.zip .src.tmp/bowtie-$(VERSION)
289         cd .src.tmp/bowtie-$(VERSION) ; unzip tmp.zip ; rm -f tmp.zip
290         cd .src.tmp ; zip -r $@ bowtie-$(VERSION)
291         cp .src.tmp/$@ .
292         rm -rf .src.tmp
293
294 bowtie-bin.zip: $(BIN_PKG_LIST) $(BIN_LIST) $(BIN_LIST_AUX) 
295         chmod a+x scripts/*.sh scripts/*.pl
296         rm -rf .bin.tmp
297         mkdir .bin.tmp
298         mkdir .bin.tmp/bowtie-$(VERSION)
299         if [ -f bowtie.exe ] ; then \
300                 zip tmp.zip $(BIN_PKG_LIST) $(addsuffix .exe,$(BIN_LIST) $(BIN_LIST_AUX)) ; \
301         else \
302                 zip tmp.zip $(BIN_PKG_LIST) $(BIN_LIST) $(BIN_LIST_AUX) ; \
303         fi
304         mv tmp.zip .bin.tmp/bowtie-$(VERSION)
305         cd .bin.tmp/bowtie-$(VERSION) ; unzip tmp.zip ; rm -f tmp.zip
306         cd .bin.tmp ; zip -r $@ bowtie-$(VERSION)
307         cp .bin.tmp/$@ .
308         rm -rf .bin.tmp
309
310 .PHONY: doc
311 doc: doc/manual.html MANUAL
312
313 doc/manual.html: MANUAL.markdown
314         echo "<h1>Table of Contents</h1>" > .tmp.head
315         pandoc -T "Bowtie Manual" -B .tmp.head \
316                --css style.css -o $@ \
317                --from markdown --to HTML \
318                --table-of-contents $^
319
320 MANUAL: MANUAL.markdown
321         perl doc/strip_markdown.pl < $^ > $@
322
323 .PHONY: clean
324 clean:
325         rm -f $(BIN_LIST) $(BIN_LIST_AUX) \
326         bowtie_prof \
327         $(addsuffix .exe,$(BIN_LIST) $(BIN_LIST_AUX) bowtie_prof) \
328         bowtie-src.zip bowtie-bin.zip
329         rm -f core.*