Permalink
Fetching contributors…
Cannot retrieve contributors at this time
516 lines (440 sloc) 14.1 KB
#
# Copyright 2011, Ben Langmead <langmea@cs.jhu.edu>
#
# This file is part of Bowtie 2.
#
# Bowtie 2 is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Bowtie 2 is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Bowtie 2. If not, see <http://www.gnu.org/licenses/>.
#
#
# Makefile for bowtie, bowtie2-build, bowtie2-inspect
#
prefix = /usr/local
bindir = $(prefix)/bin
INC =
LIBS = -lz
GCC_PREFIX = $(shell dirname `which gcc`)
GCC_SUFFIX =
CC ?= $(GCC_PREFIX)/gcc$(GCC_SUFFIX)
CPP ?= $(GCC_PREFIX)/g++$(GCC_SUFFIX)
CXX ?= $(CPP)
HEADERS = $(wildcard *.h)
BOWTIE_MM = 1
BOWTIE_SHARED_MEM = 0
# Detect Cygwin or MinGW
WINDOWS = 0
MINGW = 0
ifneq (,$(findstring MINGW,$(shell uname)))
WINDOWS = 1
MINGW = 1
# POSIX memory-mapped files not currently supported on Windows
BOWTIE_MM = 0
BOWTIE_SHARED_MEM = 0
override EXTRA_FLAGS += -ansi
endif
MACOS = 0
ifneq (,$(findstring Darwin,$(shell uname)))
MACOS = 1
ifneq (,$(findstring 13,$(shell uname -r)))
CPP = clang++
CC = clang
override EXTRA_FLAGS += -stdlib=libstdc++
endif
endif
POPCNT_CAPABILITY ?= 1
ifeq (1, $(POPCNT_CAPABILITY))
override EXTRA_FLAGS += -DPOPCNT_CAPABILITY
INC += -I third_party
endif
MM_DEF =
ifeq (1,$(BOWTIE_MM))
MM_DEF = -DBOWTIE_MM
endif
SHMEM_DEF =
ifeq (1,$(BOWTIE_SHARED_MEM))
SHMEM_DEF = -DBOWTIE_SHARED_MEM
endif
PTHREAD_PKG =
PTHREAD_LIB =
#if we're not using TBB, then we can't use queuing locks
ifeq (1,$(NO_TBB))
NO_QUEUELOCK=1
endif
ifeq (1,$(MINGW))
PTHREAD_LIB =
else
PTHREAD_LIB = -lpthread
endif
ifeq (1,$(NO_SPINLOCK))
override EXTRA_FLAGS += -DNO_SPINLOCK
endif
#default is to use Intel TBB
ifneq (1,$(NO_TBB))
LIBS += $(PTHREAD_LIB) -ltbb -ltbbmalloc_proxy
override EXTRA_FLAGS += -DWITH_TBB
else
LIBS += $(PTHREAD_LIB)
endif
SEARCH_LIBS =
BUILD_LIBS =
INSPECT_LIBS =
ifeq (1,$(MINGW))
BUILD_LIBS =
INSPECT_LIBS =
endif
ifeq (1,$(WITH_THREAD_PROFILING))
override EXTRA_FLAGS += -DPER_THREAD_TIMING=1
endif
ifeq (1,$(WITH_AFFINITY))
override EXTRA_FLAGS += -DWITH_AFFINITY=1
endif
#default is to use Intel TBB's queuing lock for better thread scaling performance
ifneq (1,$(NO_QUEUELOCK))
override EXTRA_FLAGS += -DNO_SPINLOCK
override EXTRA_FLAGS += -DWITH_QUEUELOCK=1
endif
SHARED_CPPS = ccnt_lut.cpp ref_read.cpp alphabet.cpp shmem.cpp \
edit.cpp bt2_idx.cpp bt2_io.cpp bt2_util.cpp \
reference.cpp ds.cpp multikey_qsort.cpp limit.cpp \
random_source.cpp
ifeq (1,$(NO_TBB))
SHARED_CPPS += tinythread.cpp
endif
SEARCH_CPPS = qual.cpp pat.cpp sam.cpp \
read_qseq.cpp aligner_seed_policy.cpp \
aligner_seed.cpp \
aligner_seed2.cpp \
aligner_sw.cpp \
aligner_sw_driver.cpp aligner_cache.cpp \
aligner_result.cpp ref_coord.cpp mask.cpp \
pe.cpp aln_sink.cpp dp_framer.cpp \
scoring.cpp presets.cpp unique.cpp \
simple_func.cpp \
random_util.cpp \
aligner_bt.cpp sse_util.cpp \
aligner_swsse.cpp outq.cpp \
aligner_swsse_loc_i16.cpp \
aligner_swsse_ee_i16.cpp \
aligner_swsse_loc_u8.cpp \
aligner_swsse_ee_u8.cpp \
aligner_driver.cpp
SEARCH_CPPS_MAIN = $(SEARCH_CPPS) bowtie_main.cpp
DP_CPPS = qual.cpp aligner_sw.cpp aligner_result.cpp ref_coord.cpp mask.cpp \
simple_func.cpp sse_util.cpp aligner_bt.cpp aligner_swsse.cpp \
aligner_swsse_loc_i16.cpp aligner_swsse_ee_i16.cpp \
aligner_swsse_loc_u8.cpp aligner_swsse_ee_u8.cpp scoring.cpp
BUILD_CPPS = diff_sample.cpp
BUILD_CPPS_MAIN = $(BUILD_CPPS) bowtie_build_main.cpp
SEARCH_FRAGMENTS = $(wildcard search_*_phase*.c)
VERSION = $(shell cat VERSION)
BITS=32
ifeq (x86_64,$(shell uname -m))
BITS=64
endif
ifeq (amd64,$(shell uname -m))
BITS=64
endif
# msys will always be 32 bit so look at the cpu arch instead.
ifneq (,$(findstring AMD64,$(PROCESSOR_ARCHITEW6432)))
ifeq (1,$(MINGW))
BITS=64
endif
endif
ifeq (32,$(BITS))
$(error bowtie2 compilation requires a 64-bit platform )
endif
SSE_FLAG=-msse2
DEBUG_FLAGS = -O0 -g3 -m64 $(SSE_FLAG)
DEBUG_DEFS = -DCOMPILER_OPTIONS="\"$(DEBUG_FLAGS) $(EXTRA_FLAGS)\""
RELEASE_FLAGS = -O3 -m64 $(SSE_FLAG) -funroll-loops -g3
RELEASE_DEFS = -DCOMPILER_OPTIONS="\"$(RELEASE_FLAGS) $(EXTRA_FLAGS)\""
NOASSERT_FLAGS = -DNDEBUG
FILE_FLAGS = -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
BOWTIE2_BIN_LIST = bowtie2-build-s \
bowtie2-build-l \
bowtie2-align-s \
bowtie2-align-l \
bowtie2-inspect-s \
bowtie2-inspect-l
BOWTIE2_BIN_LIST_AUX = bowtie2-build-s-debug \
bowtie2-build-l-debug \
bowtie2-align-s-debug \
bowtie2-align-l-debug \
bowtie2-inspect-s-debug \
bowtie2-inspect-l-debug
GENERAL_LIST = $(wildcard scripts/*.sh) \
$(wildcard scripts/*.pl) \
doc/manual.html \
doc/README \
doc/style.css \
$(wildcard example/index/*.bt2) \
$(wildcard example/reads/*.fq) \
$(wildcard example/reads/*.pl) \
example/reference/lambda_virus.fa \
$(PTHREAD_PKG) \
bowtie2 \
bowtie2-build \
bowtie2-inspect \
AUTHORS \
LICENSE \
NEWS \
MANUAL \
MANUAL.markdown \
TUTORIAL \
VERSION
ifeq (1,$(WINDOWS))
BOWTIE2_BIN_LIST := $(BOWTIE2_BIN_LIST) bowtie2.bat bowtie2-build.bat bowtie2-inspect.bat
ifneq (1,$(NO_TBB))
override EXTRA_FLAGS += -static-libgcc -static-libstdc++
else
override EXTRA_FLAGS += -static -static-libgcc -static-libstdc++
endif
endif
# This is helpful on Windows under MinGW/MSYS, where Make might go for
# the Windows FIND tool instead.
FIND=$(shell which find)
SRC_PKG_LIST = $(wildcard *.h) \
$(wildcard *.hh) \
$(wildcard *.c) \
$(wildcard *.cpp) \
$(wildcard third_party/*) \
doc/strip_markdown.pl \
Makefile \
$(GENERAL_LIST)
ifeq (1,$(WINDOWS))
BIN_PKG_LIST = $(GENERAL_LIST) bowtie2.bat bowtie2-build.bat bowtie2-inspect.bat
else
BIN_PKG_LIST = $(GENERAL_LIST)
endif
.PHONY: all allall both both-debug
all: $(BOWTIE2_BIN_LIST)
allall: $(BOWTIE2_BIN_LIST) $(BOWTIE2_BIN_LIST_AUX)
both: bowtie2-align-s bowtie2-build-s bowtie2-align-l bowtie2-build-l
both-debug: bowtie2-align-s-debug bowtie2-build-s-debug bowtie2-align-l-debug bowtie2-build-l-debug
DEFS=-fno-strict-aliasing \
-DBOWTIE2_VERSION="\"`cat VERSION`\"" \
-DBUILD_HOST="\"`hostname`\"" \
-DBUILD_TIME="\"`date`\"" \
-DCOMPILER_VERSION="\"`$(CXX) -v 2>&1 | tail -1`\"" \
$(FILE_FLAGS) \
$(PREF_DEF) \
$(MM_DEF) \
$(SHMEM_DEF)
#
# bowtie2-build targets
#
bowtie2-build-s: bt2_build.cpp $(SHARED_CPPS) $(HEADERS)
$(CXX) $(RELEASE_FLAGS) $(RELEASE_DEFS) $(EXTRA_FLAGS) \
$(DEFS) -DBOWTIE2 $(NOASSERT_FLAGS) -Wall \
$(INC) \
-o $@ $< \
$(SHARED_CPPS) $(BUILD_CPPS_MAIN) \
$(LIBS) $(BUILD_LIBS)
bowtie2-build-l: bt2_build.cpp $(SHARED_CPPS) $(HEADERS)
$(CXX) $(RELEASE_FLAGS) $(RELEASE_DEFS) $(EXTRA_FLAGS) \
$(DEFS) -DBOWTIE2 -DBOWTIE_64BIT_INDEX $(NOASSERT_FLAGS) -Wall \
$(INC) \
-o $@ $< \
$(SHARED_CPPS) $(BUILD_CPPS_MAIN) \
$(LIBS) $(BUILD_LIBS)
bowtie2-build-s-debug: bt2_build.cpp $(SHARED_CPPS) $(HEADERS)
$(CXX) $(DEBUG_FLAGS) $(DEBUG_DEFS) $(EXTRA_FLAGS) \
$(DEFS) -DBOWTIE2 -Wall \
$(INC) \
-o $@ $< \
$(SHARED_CPPS) $(BUILD_CPPS_MAIN) \
$(LIBS) $(BUILD_LIBS)
bowtie2-build-l-debug: bt2_build.cpp $(SHARED_CPPS) $(HEADERS)
$(CXX) $(DEBUG_FLAGS) $(DEBUG_DEFS) $(EXTRA_FLAGS) \
$(DEFS) -DBOWTIE2 -DBOWTIE_64BIT_INDEX -Wall \
$(INC) \
-o $@ $< \
$(SHARED_CPPS) $(BUILD_CPPS_MAIN) \
$(LIBS) $(BUILD_LIBS)
#
# bowtie2-align targets
#
bowtie2-align-s: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $(SEARCH_FRAGMENTS)
$(CXX) $(RELEASE_FLAGS) $(RELEASE_DEFS) $(EXTRA_FLAGS) \
$(DEFS) -DBOWTIE2 $(NOASSERT_FLAGS) -Wall \
$(INC) \
-o $@ $< \
$(SHARED_CPPS) $(SEARCH_CPPS_MAIN) \
$(LIBS) $(SEARCH_LIBS)
bowtie2-align-l: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $(SEARCH_FRAGMENTS)
$(CXX) $(RELEASE_FLAGS) $(RELEASE_DEFS) $(EXTRA_FLAGS) \
$(DEFS) -DBOWTIE2 -DBOWTIE_64BIT_INDEX $(NOASSERT_FLAGS) -Wall \
$(INC) \
-o $@ $< \
$(SHARED_CPPS) $(SEARCH_CPPS_MAIN) \
$(LIBS) $(SEARCH_LIBS)
bowtie2-align-s-debug: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $(SEARCH_FRAGMENTS)
$(CXX) $(DEBUG_FLAGS) \
$(DEBUG_DEFS) $(EXTRA_FLAGS) \
$(DEFS) -DBOWTIE2 -Wall \
$(INC) \
-o $@ $< \
$(SHARED_CPPS) $(SEARCH_CPPS_MAIN) \
$(LIBS) $(SEARCH_LIBS)
bowtie2-align-l-debug: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $(SEARCH_FRAGMENTS)
$(CXX) $(DEBUG_FLAGS) \
$(DEBUG_DEFS) $(EXTRA_FLAGS) \
$(DEFS) -DBOWTIE2 -DBOWTIE_64BIT_INDEX -Wall \
$(INC) \
-o $@ $< \
$(SHARED_CPPS) $(SEARCH_CPPS_MAIN) \
$(LIBS) $(SEARCH_LIBS)
#
# bowtie2-inspect targets
#
bowtie2-inspect-s: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS)
$(CXX) $(RELEASE_FLAGS) \
$(RELEASE_DEFS) $(EXTRA_FLAGS) \
$(DEFS) -DBOWTIE2 -DBOWTIE_INSPECT_MAIN -Wall \
$(INC) -I . \
-o $@ $< \
$(SHARED_CPPS) \
$(LIBS) $(INSPECT_LIBS)
bowtie2-inspect-l: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS)
$(CXX) $(RELEASE_FLAGS) \
$(RELEASE_DEFS) $(EXTRA_FLAGS) \
$(DEFS) -DBOWTIE2 -DBOWTIE_INSPECT_MAIN -DBOWTIE_64BIT_INDEX -Wall \
$(INC) -I . \
-o $@ $< \
$(SHARED_CPPS) \
$(LIBS) $(INSPECT_LIBS)
bowtie2-inspect-s-debug: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS)
$(CXX) $(DEBUG_FLAGS) \
$(DEBUG_DEFS) $(EXTRA_FLAGS) \
$(DEFS) -DBOWTIE2 -DBOWTIE_INSPECT_MAIN -Wall \
$(INC) -I . \
-o $@ $< \
$(SHARED_CPPS) \
$(LIBS) $(INSPECT_LIBS)
bowtie2-inspect-l-debug: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS)
$(CXX) $(DEBUG_FLAGS) \
$(DEBUG_DEFS) $(EXTRA_FLAGS) \
$(DEFS) -DBOWTIE2 -DBOWTIE_64BIT_INDEX -DBOWTIE_INSPECT_MAIN -Wall \
$(INC) -I . \
-o $@ $< \
$(SHARED_CPPS) \
$(LIBS) $(INSPECT_LIBS)
#
# bowtie2-dp targets
#
bowtie2-dp: bt2_dp.cpp $(HEADERS) $(SHARED_CPPS) $(DP_CPPS)
$(CXX) $(RELEASE_FLAGS) \
$(RELEASE_DEFS) $(EXTRA_FLAGS) $(NOASSERT_FLAGS) \
$(DEFS) -DBOWTIE2 -DBOWTIE_DP_MAIN -Wall \
$(INC) -I . \
-o $@ $< \
$(DP_CPPS) $(SHARED_CPPS) \
$(LIBS) $(SEARCH_LIBS)
bowtie2-dp-debug: bt2_dp.cpp $(HEADERS) $(SHARED_CPPS) $(DP_CPPS)
$(CXX) $(DEBUG_FLAGS) \
$(DEBUG_DEFS) $(EXTRA_FLAGS) \
$(DEFS) -DBOWTIE2 -DBOWTIE_DP_MAIN -Wall \
$(INC) -I . \
-o $@ $< \
$(DP_CPPS) $(SHARED_CPPS) \
$(LIBS) $(SEARCH_LIBS)
bowtie2.bat:
echo "@echo off" > bowtie2.bat
echo "perl %~dp0/bowtie2 %*" >> bowtie2.bat
bowtie2-build.bat:
echo "@echo off" > bowtie2-build.bat
echo "python %~dp0/bowtie2-build %*" >> bowtie2-build.bat
bowtie2-inspect.bat:
echo "@echo off" > bowtie2-inspect.bat
echo "python %~dp0/bowtie2-inspect %*" >> bowtie2-inspect.bat
.PHONY: bowtie2-src
bowtie2-src: $(SRC_PKG_LIST)
chmod a+x scripts/*.sh scripts/*.pl
mkdir .src.tmp
mkdir .src.tmp/bowtie2-$(VERSION)
zip tmp.zip $(SRC_PKG_LIST)
mv tmp.zip .src.tmp/bowtie2-$(VERSION)
cd .src.tmp/bowtie2-$(VERSION) ; unzip tmp.zip ; rm -f tmp.zip
cd .src.tmp ; zip -r bowtie2-$(VERSION)-source.zip bowtie2-$(VERSION)
cp .src.tmp/bowtie2-$(VERSION)-source.zip .
rm -rf .src.tmp
.PHONY: bowtie2-pkg
bowtie2-pkg: $(BIN_PKG_LIST) $(BOWTIE2_BIN_LIST) $(BOWTIE2_BIN_LIST_AUX)
$(eval HAS_TBB=$(shell strings bowtie2-align-l* | grep tbb))
$(eval PKG_DIR=bowtie2-$(VERSION)$(if $(HAS_TBB),,-legacy))
chmod a+x scripts/*.sh scripts/*.pl
rm -rf .bin.tmp
mkdir -p .bin.tmp/$(PKG_DIR)
if [ -f bowtie2-align-s.exe ] ; then \
zip tmp.zip $(BIN_PKG_LIST) $(addsuffix .exe,$(BOWTIE2_BIN_LIST) $(BOWTIE2_BIN_LIST_AUX)) ; \
else \
zip tmp.zip $(BIN_PKG_LIST) $(BOWTIE2_BIN_LIST) $(BOWTIE2_BIN_LIST_AUX) ; \
fi
mv tmp.zip .bin.tmp/$(PKG_DIR)
cd .bin.tmp/$(PKG_DIR) ; unzip tmp.zip ; rm -f tmp.zip
cd .bin.tmp ; zip -r $(PKG_DIR).zip $(PKG_DIR)
cp .bin.tmp/$(PKG_DIR).zip .
rm -rf .bin.tmp
bowtie2-seeds-debug: aligner_seed.cpp ccnt_lut.cpp alphabet.cpp aligner_seed.h bt2_idx.cpp bt2_io.cpp
$(CXX) $(DEBUG_FLAGS) \
$(DEBUG_DEFS) $(EXTRA_FLAGS) \
-DSCAN_MAIN \
$(DEFS) -Wall \
$(INC) -I . \
-o $@ $< \
aligner_seed.cpp bt2_idx.cpp ccnt_lut.cpp alphabet.cpp bt2_io.cpp \
$(LIBS)
.PHONY: doc
doc: doc/manual.html MANUAL
doc/manual.html: MANUAL.markdown
echo "<h1>Table of Contents</h1>" > .tmp.head
pandoc -T "Bowtie 2 Manual" -B .tmp.head \
--css style.css -o $@ \
--from markdown --to HTML \
--table-of-contents $^
rm -f .tmp.head
MANUAL: MANUAL.markdown
perl doc/strip_markdown.pl < $^ > $@
.PHONY: install
install: all
mkdir -p $(DESTDIR)$(bindir)
for file in $(BOWTIE2_BIN_LIST) bowtie2-inspect bowtie2-build bowtie2 ; do \
cp -f $$file $(DESTDIR)$(bindir) ; \
done
.PHONY: simple-test
simple-test: all perl-deps
eval `perl -I $(CURDIR)/.perllib.tmp/lib/perl5 -Mlocal::lib=$(CURDIR)/.perllib.tmp` ; \
sh ./scripts/test/simple_tests.sh
.PHONY: random-test
random-test: all perl-deps
eval `perl -I $(CURDIR)/.perllib.tmp/lib/perl5 -Mlocal::lib=$(CURDIR)/.perllib.tmp` ; \
sh ./scripts/sim/run.sh $(if $(NUM_CORES), $(NUM_CORES), 2)
.PHONY: perl-deps
perl-deps:
if [ ! -e .perllib.tmp ]; then \
DL=$$([ `which wget` ] && echo wget -O- || echo curl -L) ; \
mkdir .perllib.tmp ; \
$$DL http://cpanmin.us | perl - -l $(CURDIR)/.perllib.tmp App::cpanminus local::lib ; \
eval `perl -I $(CURDIR)/.perllib.tmp/lib/perl5 -Mlocal::lib=$(CURDIR)/.perllib.tmp` ; \
cpanm --force Math::Random Clone Test::Deep Sys::Info ; \
fi
.PHONY: test
test: simple-test random-test
.PHONY: clean
clean:
rm -f $(BOWTIE2_BIN_LIST) $(BOWTIE2_BIN_LIST_AUX) \
$(addsuffix .exe,$(BOWTIE2_BIN_LIST) $(BOWTIE2_BIN_LIST_AUX)) \
bowtie2-src.zip bowtie2-bin.zip
rm -f core.* .tmp.head
rm -rf *.dSYM
rm -rf .perllib.tmp