From 8b8fac529efb45d615051d9c8c0320b026b6c861 Mon Sep 17 00:00:00 2001 From: Rone Charles Date: Wed, 13 Sep 2017 20:49:49 -0400 Subject: [PATCH 01/11] Initial fix for input files being skipped --- pat.cpp | 22 +++++++++------------- pat.h | 21 ++++++++++++++------- read_qseq.cpp | 3 +-- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/pat.cpp b/pat.cpp index 16d675414..472d5fd21 100644 --- a/pat.cpp +++ b/pat.cpp @@ -401,11 +401,11 @@ pair CFilePatternSource::nextBatchImpl( bool batch_a) { bool done = false; - int nread = 0; + unsigned nread = 0; pt.setReadId(readCnt_); while(true) { // loop that moves on to next file when needed do { - pair ret = nextBatchFromFile(pt, batch_a); + pair ret = nextBatchFromFile(pt, batch_a, nread); done = ret.first; nread = ret.second; } while(!done && nread == 0); // not sure why this would happen @@ -413,7 +413,7 @@ pair CFilePatternSource::nextBatchImpl( open(); resetForNextFile(); // reset state to handle a fresh file filecur_++; - if(nread == 0) { + if(nread == 0 || (nread < pt.max_buf_)) { continue; } } @@ -678,7 +678,7 @@ bool VectorPatternSource::parse(Read& ra, Read& rb, TReadId rdid) const { */ pair FastaPatternSource::nextBatchFromFile( PerThreadReadBuf& pt, - bool batch_a) + bool batch_a, unsigned readi) { int c; EList& readbuf = batch_a ? pt.bufa_ : pt.bufb_; @@ -697,7 +697,6 @@ pair FastaPatternSource::nextBatchFromFile( first_ = false; } bool done = false; - size_t readi = 0; // Read until we run out of input or until we've filled the buffer for(; readi < pt.max_buf_ && !done; readi++) { Read::TBuf& buf = readbuf[readi].readOrigBuf; @@ -803,11 +802,10 @@ bool FastaPatternSource::parse(Read& r, Read& rb, TReadId rdid) const { */ pair FastaContinuousPatternSource::nextBatchFromFile( PerThreadReadBuf& pt, - bool batch_a) + bool batch_a, unsigned readi) { int c = -1; EList& readbuf = batch_a ? pt.bufa_ : pt.bufb_; - size_t readi = 0; while(readi < pt.max_buf_) { c = getc_wrapper(); if(c < 0) { @@ -947,7 +945,7 @@ bool FastaContinuousPatternSource::parse( */ pair FastqPatternSource::nextBatchFromFile( PerThreadReadBuf& pt, - bool batch_a) + bool batch_a, unsigned readi) { int c = -1; EList* readbuf = batch_a ? &pt.bufa_ : &pt.bufb_; @@ -968,7 +966,6 @@ pair FastqPatternSource::nextBatchFromFile( } bool done = false, aborted = false; - size_t readi = 0; // Read until we run out of input or until we've filled the buffer while (readi < pt.max_buf_ && !done) { Read::TBuf& buf = (*readbuf)[readi].readOrigBuf; @@ -1133,14 +1130,13 @@ bool FastqPatternSource::parse(Read &r, Read& rb, TReadId rdid) const { */ pair TabbedPatternSource::nextBatchFromFile( PerThreadReadBuf& pt, - bool batch_a) + bool batch_a, unsigned readi) { int c = getc_wrapper(); while(c >= 0 && (c == '\n' || c == '\r')) { c = getc_wrapper(); } EList& readbuf = batch_a ? pt.bufa_ : pt.bufb_; - size_t readi = 0; // Read until we run out of input or until we've filled the buffer for(; readi < pt.max_buf_ && c >= 0; readi++) { readbuf[readi].readOrigBuf.clear(); @@ -1267,14 +1263,14 @@ bool TabbedPatternSource::parse(Read& ra, Read& rb, TReadId rdid) const { */ pair RawPatternSource::nextBatchFromFile( PerThreadReadBuf& pt, - bool batch_a) + bool batch_a, + unsigned readi) { int c = getc_wrapper(); while(c >= 0 && (c == '\n' || c == '\r')) { c = getc_wrapper(); } EList& readbuf = batch_a ? pt.bufa_ : pt.bufb_; - size_t readi = 0; // Read until we run out of input or until we've filled the buffer for(; readi < pt.max_buf_ && c >= 0; readi++) { readbuf[readi].readOrigBuf.clear(); diff --git a/pat.h b/pat.h index 57726a396..8f08060e1 100644 --- a/pat.h +++ b/pat.h @@ -382,7 +382,8 @@ class CFilePatternSource : public PatternSource { */ virtual std::pair nextBatchFromFile( PerThreadReadBuf& pt, - bool batch_a) = 0; + bool batch_a, + unsigned read_idx) = 0; /** * Reset state to handle a fresh file @@ -471,7 +472,8 @@ class FastaPatternSource : public CFilePatternSource { */ virtual std::pair nextBatchFromFile( PerThreadReadBuf& pt, - bool batch_a); + bool batch_a, + unsigned read_idx); /** * Scan to the next FASTA record (starting with >) and return the first @@ -523,7 +525,8 @@ class TabbedPatternSource : public CFilePatternSource { */ virtual std::pair nextBatchFromFile( PerThreadReadBuf& pt, - bool batch_a); + bool batch_a, + unsigned read_idx); bool secondName_; // true if --tab6, false if --tab5 }; @@ -568,7 +571,8 @@ class QseqPatternSource : public CFilePatternSource { */ virtual std::pair nextBatchFromFile( PerThreadReadBuf& pt, - bool batch_a); + bool batch_a, + unsigned read_idx); EList qualToks_; }; @@ -612,7 +616,8 @@ class FastaContinuousPatternSource : public CFilePatternSource { */ virtual std::pair nextBatchFromFile( PerThreadReadBuf& pt, - bool batch_a); + bool batch_a, + unsigned read_idx); /** * Reset state to be read for the next file. @@ -675,7 +680,8 @@ class FastqPatternSource : public CFilePatternSource { */ virtual std::pair nextBatchFromFile( PerThreadReadBuf& pt, - bool batch_a); + bool batch_a, + unsigned read_idx); /** * Reset state to be ready for the next file. @@ -719,7 +725,8 @@ class RawPatternSource : public CFilePatternSource { */ virtual std::pair nextBatchFromFile( PerThreadReadBuf& pt, - bool batch_a); + bool batch_a, + unsigned read_idx); /** * Reset state to be ready for the next file. diff --git a/read_qseq.cpp b/read_qseq.cpp index f428d65be..da2a68a13 100644 --- a/read_qseq.cpp +++ b/read_qseq.cpp @@ -53,14 +53,13 @@ static int parseName( */ pair QseqPatternSource::nextBatchFromFile( PerThreadReadBuf& pt, - bool batch_a) + bool batch_a, unsigned readi) { int c = getc_wrapper(); while(c >= 0 && (c == '\n' || c == '\r')) { c = getc_wrapper(); } EList& readbuf = batch_a ? pt.bufa_ : pt.bufb_; - size_t readi = 0; // Read until we run out of input or until we've filled the buffer for(; readi < pt.max_buf_ && c >= 0; readi++) { readbuf[readi].readOrigBuf.clear(); From 2159403c01befb95112af94aa2e4ae42095deb08 Mon Sep 17 00:00:00 2001 From: Rone Charles Date: Wed, 13 Sep 2017 23:51:57 -0400 Subject: [PATCH 02/11] Address edge case with previous change --- pat.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/pat.cpp b/pat.cpp index 472d5fd21..87da9613a 100644 --- a/pat.cpp +++ b/pat.cpp @@ -416,6 +416,7 @@ pair CFilePatternSource::nextBatchImpl( if(nread == 0 || (nread < pt.max_buf_)) { continue; } + done = false; } break; } From 52467f739959ba0ee45149e39a715c53b5d5527f Mon Sep 17 00:00:00 2001 From: Rone Charles Date: Mon, 18 Sep 2017 10:54:42 -0400 Subject: [PATCH 03/11] Fix issue with first character of read name being dropped when reading from a new file in a comma separated list --- bt2_search.cpp | 2 +- pat.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bt2_search.cpp b/bt2_search.cpp index 7214f5776..d4db045c2 100644 --- a/bt2_search.cpp +++ b/bt2_search.cpp @@ -819,7 +819,7 @@ static void printUsage(ostream& out) { << " --rg add (\"lab:value\") to @RG line of SAM header." << endl << " Note: @RG line only printed when --rg-id is set." << endl << " --omit-sec-seq put '*' in SEQ and QUAL fields for secondary alignments." << endl - << " --sam-noqname-trunc Suppress standard behavior of truncating readname at first whitespace " << endl + << " --sam-no-qname-trunc Suppress standard behavior of truncating readname at first whitespace " << endl << " at the expense of generating non-standard SAM." << endl << " --xeq Use '='/'X', instead of 'M,' to specify matches/mismatches in SAM record." << endl << " --soft-clipped-unmapped-tlen Exclude soft-clipped bases when reporting TLEN" << endl diff --git a/pat.cpp b/pat.cpp index 87da9613a..47b7f4308 100644 --- a/pat.cpp +++ b/pat.cpp @@ -963,7 +963,7 @@ pair FastqPatternSource::nextBatchFromFile( throw 1; } first_ = false; - (*readbuf)[0].readOrigBuf.append('@'); + (*readbuf)[readi].readOrigBuf.append('@'); } bool done = false, aborted = false; From 6c9cc5b207e7bcbff3265ec96e8142ff850add88 Mon Sep 17 00:00:00 2001 From: Rone Charles Date: Tue, 19 Sep 2017 22:26:29 -0400 Subject: [PATCH 04/11] General bugfixes and improvements --- pat.cpp | 13 ++++++------- pat.h | 8 +++++--- read_qseq.cpp | 3 +++ 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/pat.cpp b/pat.cpp index 87da9613a..84e6d0efe 100644 --- a/pat.cpp +++ b/pat.cpp @@ -416,7 +416,7 @@ pair CFilePatternSource::nextBatchImpl( if(nread == 0 || (nread < pt.max_buf_)) { continue; } - done = false; + done = false; } break; } @@ -846,18 +846,18 @@ pair FastaContinuousPatternSource::nextBatchFromFile( } if(eat_ > 0) { eat_--; - // Try to keep readCnt_ aligned with the offset + // Try to keep cur_ aligned with the offset // into the reference; that lets us see where // the sampling gaps are by looking at the read // name if(!beginning_) { - readCnt_++; + cur_++; } continue; } // install name readbuf[readi].readOrigBuf = name_prefix_buf_; - itoa10(readCnt_ - subReadCnt_, name_int_buf_); + itoa10(cur_ - last_, name_int_buf_); readbuf[readi].readOrigBuf.append(name_int_buf_); readbuf[readi].readOrigBuf.append('\t'); // install sequence @@ -871,7 +871,7 @@ pair FastaContinuousPatternSource::nextBatchFromFile( readbuf[readi].readOrigBuf.append(c); } eat_ = freq_-1; - readCnt_++; + cur_++; beginning_ = false; readi++; } @@ -970,7 +970,6 @@ pair FastqPatternSource::nextBatchFromFile( // Read until we run out of input or until we've filled the buffer while (readi < pt.max_buf_ && !done) { Read::TBuf& buf = (*readbuf)[readi].readOrigBuf; - assert(readi == 0 || buf.empty()); int newlines = 4; while(newlines) { c = getc_wrapper(); @@ -1116,7 +1115,7 @@ bool FastqPatternSource::parse(Read &r, Read& rb, TReadId rdid) const { // Set up a default name if one hasn't been set if(r.name.empty()) { char cbuf[20]; - itoa10(static_cast(readCnt_), cbuf); + itoa10(static_cast(rdid), cbuf); r.name.install(cbuf); } r.parsed = true; diff --git a/pat.h b/pat.h index 8f08060e1..ce312785a 100644 --- a/pat.h +++ b/pat.h @@ -592,7 +592,8 @@ class FastaContinuousPatternSource : public CFilePatternSource { eat_(length_-1), beginning_(true), bufCur_(0), - subReadCnt_(0llu) + cur_(0llu), + last_(0llu) { assert_gt(freq_, 0); resetForNextFile(); @@ -627,7 +628,7 @@ class FastaContinuousPatternSource : public CFilePatternSource { name_prefix_buf_.clear(); beginning_ = true; bufCur_ = 0; - subReadCnt_ = readCnt_; + last_ = cur_; } private: @@ -643,7 +644,8 @@ class FastaContinuousPatternSource : public CFilePatternSource { char name_int_buf_[20]; /// for composing offsets for names size_t bufCur_; /// buffer cursor; points to where we should /// insert the next character - uint64_t subReadCnt_;/// number to subtract from readCnt_ to get + uint64_t cur_; + uint64_t last_; /// number to subtract from readCnt_ to get /// the pat id to output (so it resets to 0 for /// each new sequence) }; diff --git a/read_qseq.cpp b/read_qseq.cpp index da2a68a13..627bfe4ed 100644 --- a/read_qseq.cpp +++ b/read_qseq.cpp @@ -71,6 +71,9 @@ pair QseqPatternSource::nextBatchFromFile( c = getc_wrapper(); } } + if (c != EOF) { + ungetc_wrapper(c); + } return make_pair(c < 0, readi); } From 8bcb95cbd02bf685be82f59828c82c7bcb19f750 Mon Sep 17 00:00:00 2001 From: Rone Charles Date: Tue, 19 Sep 2017 22:29:00 -0400 Subject: [PATCH 05/11] Add test for multi-file fastq inputs an batch size variations --- scripts/test/simple_tests.pl | 57 ++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 13 deletions(-) diff --git a/scripts/test/simple_tests.pl b/scripts/test/simple_tests.pl index f1fdde74f..51ef2be5e 100644 --- a/scripts/test/simple_tests.pl +++ b/scripts/test/simple_tests.pl @@ -341,7 +341,7 @@ fastq1 => "\@r0\nAGCATCGATC\r\n+\nIIIIIIIIII\n". "\@r1\nTCAGTTTTTGA\r\n+\nIIIIIIIIIII\n", fastq2 => "\@r0\nTCAGTTTTTGA\n+\nIIIIIIIIIII\n". - "\@r1\nAGCATCGATC\r\n+\nIIIIIIIIII", + "\@r1\nAGCATCGATC\r\n+\nIIIIIIIIII\n", pairhits => [ { "0,8" => 1 }, { "0,8" => 1 } ] }, # Paired-end reads that should align @@ -354,7 +354,7 @@ fastq1 => "\@r0\nAGCATCGATC\r\n+\nIIIIIIIIII\n". "\@r1\nTCAGTTTTTGA\n+\nIIIIIIIIIII\n", fastq2 => "\@r0\nTCAGTTTTTGA\n+\nIIIIIIIIIII\n". - "\@r1\nAGCATCGATC\r\n+\nIIIIIIIIII", + "\@r1\nAGCATCGATC\r\n+\nIIIIIIIIII\n", pairhits => [ { }, { "0,8" => 1 } ] }, # Paired-end reads that should align @@ -367,7 +367,7 @@ fastq1 => "\@r0\nAGCATCGATC\r\n+\nIIIIIIIIII\n". "\@r1\nTCAGTTTTTGA\r\n+\nIIIIIIIIIII\n", fastq2 => "\@r0\nTCAGTTTTTGA\n+\nIIIIIIIIIII\n". - "\@r1\nAGCATCGATC\r\n+\nIIIIIIIIII", + "\@r1\nAGCATCGATC\r\n+\nIIIIIIIIII\n", pairhits => [ { "0,8" => 1 }, { } ] }, # Paired-end reads with left end entirely trimmed away @@ -4327,16 +4327,18 @@ ($$$$$$$$$) $fq1, $fq2) = @_; - open(FQ1, defined($compressed) ? "| gzip -c >$fq1.gz" : ">$fq1") || die "Could not open '$fq1' for writing"; - open(FQ2, defined($compressed) ? "| gzip -c >$fq2.gz" : ">$fq2") || die "Could not open '$fq2' for writing"; my $pe = (defined($mate1s) && $mate1s ne ""); if($pe) { for (0..scalar(@$mate1s)-1) { + open(FQ1, defined($compressed) ? "| gzip -c >$fq1->[$_]" : ">$fq1->[$_]") || die "Could not open '$fq1->[$_]' for writing"; + open(FQ2, defined($compressed) ? "| gzip -c >$fq2->[$_]" : ">$fq2->[$_]") || die "Could not open '$fq2->[$_]' for writing"; + my $m1 = $mate1s->[$_]; my $m2 = $mate2s->[$_]; my $q1 = $qual1s->[$_]; my $q2 = $qual2s->[$_]; my $nm = $names->[$_]; + defined($m1) || die; defined($m2) || die; $q1 = $q1 || ("I" x length($m1)); @@ -4344,20 +4346,24 @@ ($$$$$$$$$) $nm = $nm || "r$_"; print FQ1 "\@$nm/1\n$m1\n+\n$q1\n"; print FQ2 "\@$nm/2\n$m2\n+\n$q2\n"; + close(FQ1); + close(FQ2); } } else { for (0..scalar(@$reads)-1) { + open(FQ1, defined($compressed) ? "| gzip -c >$fq1->[$_]" : ">$fq1->[$_]") || die "Could not open '$fq1->[$_]' for writing"; + my $read = $reads->[$_]; defined($read) || die; my $qual = $quals->[$_]; my $nm = $names->[$_]; + $qual = $qual || ("I" x length($read)); $nm = $nm || "r$_"; print FQ1 "\@$nm\n$read\n+\n$qual\n"; + close(FQ1); } } - close(FQ1); - close(FQ2); } ## @@ -4476,6 +4482,21 @@ ($$$$$$$$$$$$$$$$$$$$$$) } } } else { + $mate1arg = []; + $mate2arg = []; + my $ext = $compressed ? ".fq.gz" : ".fq"; + my $base_filename = ".simple_tests"; + + for (0 .. scalar($pe ? @$mate1s : @$reads) - 1) { + my $f = $base_filename . ".1" . ('a' .. 'z')[$_] . $ext; + push @$mate1arg, $f; + + if ($pe) { + $f = $base_filename . ".2" . ('a' .. 'z')[$_] . $ext; + push @$mate2arg, $f; + } + } + writeReads( $reads, $quals, @@ -4484,10 +4505,9 @@ ($$$$$$$$$$$$$$$$$$$$$$) $mate2s, $qual2s, $names, - ".simple_tests.1.fq", - ".simple_tests.2.fq"); - $mate1arg = defined($compressed) ? ".simple_tests.1.fq.gz" : ".simple_tests.1.fq"; - $mate2arg = defined($compressed) ? ".simple_tests.2.fq.gz" : ".simple_tests.2.fq"; + $mate1arg, + $mate2arg); + $formatarg = "-q"; $readarg = $mate1arg; } @@ -4495,12 +4515,23 @@ ($$$$$$$$$$$$$$$$$$$$$$) my $debug_arg = ""; $debug_arg = "--debug" if $debug_mode; my $cmd; + my $batch_size = int(rand(16) + 1); if($pe) { # Paired-end case - $cmd = "$bowtie2 $debug_arg @ARGV $idx_type $args -x .simple_tests.tmp $formatarg -1 $mate1arg -2 $mate2arg"; + if (ref $mate1arg eq "ARRAY") { + $cmd = "$bowtie2 $debug_arg @ARGV $idx_type $args --reads-per-batch $batch_size -x .simple_tests.tmp $formatarg -1 " . join(",", @$mate1arg) . " -2 " . join(",", @$mate2arg); + } + else { + $cmd = "$bowtie2 $debug_arg @ARGV $idx_type $args --reads-per-batch $batch_size -x .simple_tests.tmp $formatarg -1 $mate1arg -2 $mate2arg"; + } } else { # Unpaired case - $cmd = "$bowtie2 $debug_arg @ARGV $idx_type $args -x .simple_tests.tmp $formatarg $readarg"; + if (ref $readarg eq "ARRAY") { + $cmd = "$bowtie2 $debug_arg @ARGV $idx_type $args --reads-per-batch $batch_size -x .simple_tests.tmp $formatarg " . join(",", @$readarg); + } + else { + $cmd = "$bowtie2 $debug_arg @ARGV $idx_type $args --reads-per-batch $batch_size -x .simple_tests.tmp $formatarg $readarg"; + } } print "$cmd\n"; open(BT, "$cmd |") || die "Could not open pipe '$cmd |'"; From bc9aedce562376c9c8fbf59fcdba4b9c93415d31 Mon Sep 17 00:00:00 2001 From: Rone Charles Date: Tue, 26 Sep 2017 07:38:55 -0400 Subject: [PATCH 06/11] Consider indexes referred to by BOWTIE2_INDEXES env variable when doing index checking --- bowtie2 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/bowtie2 b/bowtie2 index 8476ad359..036d425fa 100755 --- a/bowtie2 +++ b/bowtie2 @@ -345,7 +345,13 @@ sub Extract_IndexName_From { my $idx_basename = $_[$i+1]; my @idx_filenames = glob($idx_basename . "*.bt2{,l}"); unless (@idx_filenames) { - Fail("\"" . $idx_basename . "\" is not a Bowtie 2 index\n"); + if (exists $ENV{"BOWTIE2_INDEXES"}) { + @idx_filenames = glob("$ENV{'BOWTIE2_INDEXES'}/$idx_basename" . "bt2{,l}"); + } + + if (!@idx_filenames) { + Fail("\"" . $idx_basename . "\" does not exist or is not a Bowtie 2 index\n"); + } } return $idx_basename; } From e9ed5cb117e3ec35476952c2021ad1479be9a453 Mon Sep 17 00:00:00 2001 From: Rone Charles Date: Tue, 3 Oct 2017 11:37:50 -0400 Subject: [PATCH 07/11] Changes for compiling against static zlib and TBB libraries --- Makefile | 65 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 22 deletions(-) diff --git a/Makefile b/Makefile index e886cde98..d7ed2b3b5 100644 --- a/Makefile +++ b/Makefile @@ -24,8 +24,8 @@ prefix = /usr/local bindir = $(prefix)/bin -INC = -LIBS = -lz +INC = $(if $(RELEASE_BUILD),-I$(CURDIR)/.include,) +LDFLAGS = $(if $(RELEASE_BUILD),-L$(CURDIR)/.lib,) -lz GCC_PREFIX = $(shell dirname `which gcc`) GCC_SUFFIX = CC ?= $(GCC_PREFIX)/gcc$(GCC_SUFFIX) @@ -55,6 +55,9 @@ ifneq (,$(findstring Darwin,$(shell uname))) CC = clang override EXTRA_FLAGS += -stdlib=libstdc++ endif + ifeq (1, $(RELEASE_BUILD)) + EXTRA_FLAGS += -mmacosx-version-min=10.9 + endif endif POPCNT_CAPABILITY ?= 1 @@ -95,10 +98,10 @@ endif #default is to use Intel TBB ifneq (1,$(NO_TBB)) - LIBS += $(PTHREAD_LIB) -ltbb -ltbbmalloc_proxy + LDFLAGS += $(PTHREAD_LIB) -ltbb -ltbbmalloc$(if $(RELEASE_BUILD),,_proxy) override EXTRA_FLAGS += -DWITH_TBB else - LIBS += $(PTHREAD_LIB) + LDFLAGS += $(PTHREAD_LIB) endif SEARCH_LIBS = BUILD_LIBS = @@ -283,7 +286,7 @@ bowtie2-build-s: bt2_build.cpp $(SHARED_CPPS) $(HEADERS) $(INC) \ -o $@ $< \ $(SHARED_CPPS) $(BUILD_CPPS_MAIN) \ - $(LIBS) $(BUILD_LIBS) + $(LDFLAGS) $(BUILD_LIBS) bowtie2-build-l: bt2_build.cpp $(SHARED_CPPS) $(HEADERS) $(CXX) $(RELEASE_FLAGS) $(RELEASE_DEFS) $(EXTRA_FLAGS) \ @@ -291,7 +294,7 @@ bowtie2-build-l: bt2_build.cpp $(SHARED_CPPS) $(HEADERS) $(INC) \ -o $@ $< \ $(SHARED_CPPS) $(BUILD_CPPS_MAIN) \ - $(LIBS) $(BUILD_LIBS) + $(LDFLAGS) $(BUILD_LIBS) bowtie2-build-s-debug: bt2_build.cpp $(SHARED_CPPS) $(HEADERS) $(CXX) $(DEBUG_FLAGS) $(DEBUG_DEFS) $(EXTRA_FLAGS) \ @@ -299,7 +302,7 @@ bowtie2-build-s-debug: bt2_build.cpp $(SHARED_CPPS) $(HEADERS) $(INC) \ -o $@ $< \ $(SHARED_CPPS) $(BUILD_CPPS_MAIN) \ - $(LIBS) $(BUILD_LIBS) + $(LDFLAGS) $(BUILD_LIBS) bowtie2-build-l-debug: bt2_build.cpp $(SHARED_CPPS) $(HEADERS) $(CXX) $(DEBUG_FLAGS) $(DEBUG_DEFS) $(EXTRA_FLAGS) \ @@ -307,7 +310,7 @@ bowtie2-build-l-debug: bt2_build.cpp $(SHARED_CPPS) $(HEADERS) $(INC) \ -o $@ $< \ $(SHARED_CPPS) $(BUILD_CPPS_MAIN) \ - $(LIBS) $(BUILD_LIBS) + $(LDFLAGS) $(BUILD_LIBS) # # bowtie2-align targets @@ -319,7 +322,7 @@ bowtie2-align-s: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $(SEARC $(INC) \ -o $@ $< \ $(SHARED_CPPS) $(SEARCH_CPPS_MAIN) \ - $(LIBS) $(SEARCH_LIBS) + $(LDFLAGS) $(SEARCH_LIBS) bowtie2-align-l: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $(SEARCH_FRAGMENTS) $(CXX) $(RELEASE_FLAGS) $(RELEASE_DEFS) $(EXTRA_FLAGS) \ @@ -327,7 +330,7 @@ bowtie2-align-l: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $(SEARC $(INC) \ -o $@ $< \ $(SHARED_CPPS) $(SEARCH_CPPS_MAIN) \ - $(LIBS) $(SEARCH_LIBS) + $(LDFLAGS) $(SEARCH_LIBS) bowtie2-align-s-debug: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $(SEARCH_FRAGMENTS) $(CXX) $(DEBUG_FLAGS) \ @@ -336,7 +339,7 @@ bowtie2-align-s-debug: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $ $(INC) \ -o $@ $< \ $(SHARED_CPPS) $(SEARCH_CPPS_MAIN) \ - $(LIBS) $(SEARCH_LIBS) + $(LDFLAGS) $(SEARCH_LIBS) bowtie2-align-l-debug: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $(SEARCH_FRAGMENTS) $(CXX) $(DEBUG_FLAGS) \ @@ -345,7 +348,7 @@ bowtie2-align-l-debug: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $ $(INC) \ -o $@ $< \ $(SHARED_CPPS) $(SEARCH_CPPS_MAIN) \ - $(LIBS) $(SEARCH_LIBS) + $(LDFLAGS) $(SEARCH_LIBS) # # bowtie2-inspect targets @@ -358,7 +361,7 @@ bowtie2-inspect-s: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS) $(INC) -I . \ -o $@ $< \ $(SHARED_CPPS) \ - $(LIBS) $(INSPECT_LIBS) + $(LDFLAGS) $(INSPECT_LIBS) bowtie2-inspect-l: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS) $(CXX) $(RELEASE_FLAGS) \ @@ -367,7 +370,7 @@ bowtie2-inspect-l: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS) $(INC) -I . \ -o $@ $< \ $(SHARED_CPPS) \ - $(LIBS) $(INSPECT_LIBS) + $(LDFLAGS) $(INSPECT_LIBS) bowtie2-inspect-s-debug: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS) $(CXX) $(DEBUG_FLAGS) \ @@ -376,7 +379,7 @@ bowtie2-inspect-s-debug: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS) $(INC) -I . \ -o $@ $< \ $(SHARED_CPPS) \ - $(LIBS) $(INSPECT_LIBS) + $(LDFLAGS) $(INSPECT_LIBS) bowtie2-inspect-l-debug: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS) $(CXX) $(DEBUG_FLAGS) \ @@ -385,7 +388,7 @@ bowtie2-inspect-l-debug: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS) $(INC) -I . \ -o $@ $< \ $(SHARED_CPPS) \ - $(LIBS) $(INSPECT_LIBS) + $(LDFLAGS) $(INSPECT_LIBS) # # bowtie2-dp targets @@ -398,7 +401,7 @@ bowtie2-dp: bt2_dp.cpp $(HEADERS) $(SHARED_CPPS) $(DP_CPPS) $(INC) -I . \ -o $@ $< \ $(DP_CPPS) $(SHARED_CPPS) \ - $(LIBS) $(SEARCH_LIBS) + $(LDFLAGS) $(SEARCH_LIBS) bowtie2-dp-debug: bt2_dp.cpp $(HEADERS) $(SHARED_CPPS) $(DP_CPPS) $(CXX) $(DEBUG_FLAGS) \ @@ -407,7 +410,7 @@ bowtie2-dp-debug: bt2_dp.cpp $(HEADERS) $(SHARED_CPPS) $(DP_CPPS) $(INC) -I . \ -o $@ $< \ $(DP_CPPS) $(SHARED_CPPS) \ - $(LIBS) $(SEARCH_LIBS) + $(LDFLAGS) $(SEARCH_LIBS) bowtie2.bat: echo "@echo off" > bowtie2.bat @@ -434,9 +437,10 @@ bowtie2-src: $(SRC_PKG_LIST) rm -rf .src.tmp .PHONY: bowtie2-pkg -bowtie2-pkg: $(BIN_PKG_LIST) $(BOWTIE2_BIN_LIST) $(BOWTIE2_BIN_LIST_AUX) +bowtie2-pkg: static-libs $(BIN_PKG_LIST) $(BOWTIE2_BIN_LIST) $(BOWTIE2_BIN_LIST_AUX) + $(eval RELEASE_BUILD=1) $(eval HAS_TBB=$(shell strings bowtie2-align-l* | grep tbb)) - $(eval PKG_DIR=bowtie2-$(VERSION)$(if $(HAS_TBB),,-legacy)) + $(eval PKG_DIR=bowtie2-$(VERSION)-$(if $(MACOS),macos,(if $(MINGW),mingw,linux))$(if $(HAS_TBB),,-legacy)-x86_64) chmod a+x scripts/*.sh scripts/*.pl rm -rf .bin.tmp mkdir -p .bin.tmp/$(PKG_DIR) @@ -459,7 +463,7 @@ bowtie2-seeds-debug: aligner_seed.cpp ccnt_lut.cpp alphabet.cpp aligner_seed.h b $(INC) -I . \ -o $@ $< \ aligner_seed.cpp bt2_idx.cpp ccnt_lut.cpp alphabet.cpp bt2_io.cpp \ - $(LIBS) + $(LDFLAGS) .PHONY: doc doc: doc/manual.html MANUAL @@ -495,13 +499,29 @@ random-test: all perl-deps .PHONY: perl-deps perl-deps: if [ ! -e .perllib.tmp ]; then \ - DL=$$([ `which wget` ] && echo wget -O- || echo curl -L) ; \ + 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 +static-libs: + if [[ ! -d $(CURDIR)/.lib || ! -d $(CURDIR)/.inc ]]; then \ + mkdir $(CURDIR)/.lib $(CURDIR)/.include ; \ + fi ; \ + if [[ `uname` == "Darwin" ]]; then \ + export CFLAGS=-mmacosx-version-min=10.9 ; \ + export CXXFLAGS=-mmacosx-version-min=10.9 ; \ + fi ; \ + DL=$$([ `which wget` ] && echo "wget" || echo "curl -LO") ; \ + cd /tmp ; \ + $$DL https://zlib.net/zlib-1.2.11.tar.gz && tar xzf zlib-1.2.11.tar.gz && cd zlib-1.2.11 ; \ + ./configure --static && make && cp *.a $(CURDIR)/.lib && cp zconf.h zlib.h $(CURDIR)/.include ; \ + cd .. ; \ + $$DL https://github.com/01org/tbb/archive/2017_U8.tar.gz && tar xzf 2017_U8.tar.gz && cd tbb-2017_U8; \ + make -j4 extra_inc=big_iron.inc && cp -r include/tbb $(CURDIR)/.include && cp build/*_release/*.a $(CURDIR)/.lib + .PHONY: test test: simple-test random-test @@ -513,3 +533,4 @@ clean: rm -f core.* .tmp.head rm -rf *.dSYM rm -rf .perllib.tmp + rm -rf .include .lib From a3216be56880d62832868e9496f5f9e11ba5373a Mon Sep 17 00:00:00 2001 From: Rone Charles Date: Wed, 4 Oct 2017 12:16:48 -0400 Subject: [PATCH 08/11] Additional changes to support comiling on Windows and HBB --- Makefile | 63 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/Makefile b/Makefile index d7ed2b3b5..b68f8eb43 100644 --- a/Makefile +++ b/Makefile @@ -24,8 +24,8 @@ prefix = /usr/local bindir = $(prefix)/bin -INC = $(if $(RELEASE_BUILD),-I$(CURDIR)/.include,) -LDFLAGS = $(if $(RELEASE_BUILD),-L$(CURDIR)/.lib,) -lz +INC = $(if $(RELEASE_BUILD),-I$(CURDIR)/.include) +LIBS = $(LDFLAGS) $(if $(RELEASE_BUILD),-L$(CURDIR)/.lib) -lz GCC_PREFIX = $(shell dirname `which gcc`) GCC_SUFFIX = CC ?= $(GCC_PREFIX)/gcc$(GCC_SUFFIX) @@ -33,11 +33,11 @@ CPP ?= $(GCC_PREFIX)/g++$(GCC_SUFFIX) CXX ?= $(CPP) HEADERS = $(wildcard *.h) BOWTIE_MM = 1 -BOWTIE_SHARED_MEM = 0 +BOWTIE_SHARED_MEM = # Detect Cygwin or MinGW -WINDOWS = 0 -MINGW = 0 +WINDOWS = +MINGW = ifneq (,$(findstring MINGW,$(shell uname))) WINDOWS = 1 MINGW = 1 @@ -47,7 +47,7 @@ ifneq (,$(findstring MINGW,$(shell uname))) override EXTRA_FLAGS += -ansi endif -MACOS = 0 +MACOS = ifneq (,$(findstring Darwin,$(shell uname))) MACOS = 1 ifneq (,$(findstring 13,$(shell uname -r))) @@ -98,10 +98,10 @@ endif #default is to use Intel TBB ifneq (1,$(NO_TBB)) - LDFLAGS += $(PTHREAD_LIB) -ltbb -ltbbmalloc$(if $(RELEASE_BUILD),,_proxy) + LIBS += $(PTHREAD_LIB) -ltbb -ltbbmalloc$(if $(RELEASE_BUILD),,_proxy) override EXTRA_FLAGS += -DWITH_TBB else - LDFLAGS += $(PTHREAD_LIB) + LIBS += $(PTHREAD_LIB) endif SEARCH_LIBS = BUILD_LIBS = @@ -246,7 +246,6 @@ SRC_PKG_LIST = $(wildcard *.h) \ $(wildcard *.c) \ $(wildcard *.cpp) \ $(wildcard third_party/*) \ - doc/strip_markdown.pl \ Makefile \ $(GENERAL_LIST) @@ -286,7 +285,7 @@ bowtie2-build-s: bt2_build.cpp $(SHARED_CPPS) $(HEADERS) $(INC) \ -o $@ $< \ $(SHARED_CPPS) $(BUILD_CPPS_MAIN) \ - $(LDFLAGS) $(BUILD_LIBS) + $(LIBS) $(BUILD_LIBS) bowtie2-build-l: bt2_build.cpp $(SHARED_CPPS) $(HEADERS) $(CXX) $(RELEASE_FLAGS) $(RELEASE_DEFS) $(EXTRA_FLAGS) \ @@ -294,7 +293,7 @@ bowtie2-build-l: bt2_build.cpp $(SHARED_CPPS) $(HEADERS) $(INC) \ -o $@ $< \ $(SHARED_CPPS) $(BUILD_CPPS_MAIN) \ - $(LDFLAGS) $(BUILD_LIBS) + $(LIBS) $(BUILD_LIBS) bowtie2-build-s-debug: bt2_build.cpp $(SHARED_CPPS) $(HEADERS) $(CXX) $(DEBUG_FLAGS) $(DEBUG_DEFS) $(EXTRA_FLAGS) \ @@ -302,7 +301,7 @@ bowtie2-build-s-debug: bt2_build.cpp $(SHARED_CPPS) $(HEADERS) $(INC) \ -o $@ $< \ $(SHARED_CPPS) $(BUILD_CPPS_MAIN) \ - $(LDFLAGS) $(BUILD_LIBS) + $(LIBS) $(BUILD_LIBS) bowtie2-build-l-debug: bt2_build.cpp $(SHARED_CPPS) $(HEADERS) $(CXX) $(DEBUG_FLAGS) $(DEBUG_DEFS) $(EXTRA_FLAGS) \ @@ -310,7 +309,7 @@ bowtie2-build-l-debug: bt2_build.cpp $(SHARED_CPPS) $(HEADERS) $(INC) \ -o $@ $< \ $(SHARED_CPPS) $(BUILD_CPPS_MAIN) \ - $(LDFLAGS) $(BUILD_LIBS) + $(LIBS) $(BUILD_LIBS) # # bowtie2-align targets @@ -322,7 +321,7 @@ bowtie2-align-s: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $(SEARC $(INC) \ -o $@ $< \ $(SHARED_CPPS) $(SEARCH_CPPS_MAIN) \ - $(LDFLAGS) $(SEARCH_LIBS) + $(LIBS) $(SEARCH_LIBS) bowtie2-align-l: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $(SEARCH_FRAGMENTS) $(CXX) $(RELEASE_FLAGS) $(RELEASE_DEFS) $(EXTRA_FLAGS) \ @@ -330,7 +329,7 @@ bowtie2-align-l: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $(SEARC $(INC) \ -o $@ $< \ $(SHARED_CPPS) $(SEARCH_CPPS_MAIN) \ - $(LDFLAGS) $(SEARCH_LIBS) + $(LIBS) $(SEARCH_LIBS) bowtie2-align-s-debug: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $(SEARCH_FRAGMENTS) $(CXX) $(DEBUG_FLAGS) \ @@ -339,7 +338,7 @@ bowtie2-align-s-debug: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $ $(INC) \ -o $@ $< \ $(SHARED_CPPS) $(SEARCH_CPPS_MAIN) \ - $(LDFLAGS) $(SEARCH_LIBS) + $(LIBS) $(SEARCH_LIBS) bowtie2-align-l-debug: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $(SEARCH_FRAGMENTS) $(CXX) $(DEBUG_FLAGS) \ @@ -348,7 +347,7 @@ bowtie2-align-l-debug: bt2_search.cpp $(SEARCH_CPPS) $(SHARED_CPPS) $(HEADERS) $ $(INC) \ -o $@ $< \ $(SHARED_CPPS) $(SEARCH_CPPS_MAIN) \ - $(LDFLAGS) $(SEARCH_LIBS) + $(LIBS) $(SEARCH_LIBS) # # bowtie2-inspect targets @@ -361,7 +360,7 @@ bowtie2-inspect-s: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS) $(INC) -I . \ -o $@ $< \ $(SHARED_CPPS) \ - $(LDFLAGS) $(INSPECT_LIBS) + $(LIBS) $(INSPECT_LIBS) bowtie2-inspect-l: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS) $(CXX) $(RELEASE_FLAGS) \ @@ -370,7 +369,7 @@ bowtie2-inspect-l: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS) $(INC) -I . \ -o $@ $< \ $(SHARED_CPPS) \ - $(LDFLAGS) $(INSPECT_LIBS) + $(LIBS) $(INSPECT_LIBS) bowtie2-inspect-s-debug: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS) $(CXX) $(DEBUG_FLAGS) \ @@ -379,7 +378,7 @@ bowtie2-inspect-s-debug: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS) $(INC) -I . \ -o $@ $< \ $(SHARED_CPPS) \ - $(LDFLAGS) $(INSPECT_LIBS) + $(LIBS) $(INSPECT_LIBS) bowtie2-inspect-l-debug: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS) $(CXX) $(DEBUG_FLAGS) \ @@ -388,7 +387,7 @@ bowtie2-inspect-l-debug: bt2_inspect.cpp $(HEADERS) $(SHARED_CPPS) $(INC) -I . \ -o $@ $< \ $(SHARED_CPPS) \ - $(LDFLAGS) $(INSPECT_LIBS) + $(LIBS) $(INSPECT_LIBS) # # bowtie2-dp targets @@ -401,7 +400,7 @@ bowtie2-dp: bt2_dp.cpp $(HEADERS) $(SHARED_CPPS) $(DP_CPPS) $(INC) -I . \ -o $@ $< \ $(DP_CPPS) $(SHARED_CPPS) \ - $(LDFLAGS) $(SEARCH_LIBS) + $(LIBS) $(SEARCH_LIBS) bowtie2-dp-debug: bt2_dp.cpp $(HEADERS) $(SHARED_CPPS) $(DP_CPPS) $(CXX) $(DEBUG_FLAGS) \ @@ -410,7 +409,7 @@ bowtie2-dp-debug: bt2_dp.cpp $(HEADERS) $(SHARED_CPPS) $(DP_CPPS) $(INC) -I . \ -o $@ $< \ $(DP_CPPS) $(SHARED_CPPS) \ - $(LDFLAGS) $(SEARCH_LIBS) + $(LIBS) $(SEARCH_LIBS) bowtie2.bat: echo "@echo off" > bowtie2.bat @@ -438,9 +437,7 @@ bowtie2-src: $(SRC_PKG_LIST) .PHONY: bowtie2-pkg bowtie2-pkg: static-libs $(BIN_PKG_LIST) $(BOWTIE2_BIN_LIST) $(BOWTIE2_BIN_LIST_AUX) - $(eval RELEASE_BUILD=1) - $(eval HAS_TBB=$(shell strings bowtie2-align-l* | grep tbb)) - $(eval PKG_DIR=bowtie2-$(VERSION)-$(if $(MACOS),macos,(if $(MINGW),mingw,linux))$(if $(HAS_TBB),,-legacy)-x86_64) + $(eval PKG_DIR=bowtie2-$(VERSION)-$(if $(MACOS),macos,$(if $(MINGW),mingw,linux))$(if $(HAS_TBB),,-legacy)-x86_64) chmod a+x scripts/*.sh scripts/*.pl rm -rf .bin.tmp mkdir -p .bin.tmp/$(PKG_DIR) @@ -463,7 +460,7 @@ bowtie2-seeds-debug: aligner_seed.cpp ccnt_lut.cpp alphabet.cpp aligner_seed.h b $(INC) -I . \ -o $@ $< \ aligner_seed.cpp bt2_idx.cpp ccnt_lut.cpp alphabet.cpp bt2_io.cpp \ - $(LDFLAGS) + $(LIBS) .PHONY: doc doc: doc/manual.html MANUAL @@ -499,7 +496,7 @@ random-test: all perl-deps .PHONY: perl-deps perl-deps: if [ ! -e .perllib.tmp ]; then \ - DL=$$([ `which wget` ] && echo "wget -O-" || echo "curl -L") ; \ + DL=$$([ `which wget` ] && echo "wget --no-check-certificate -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` ; \ @@ -510,17 +507,18 @@ static-libs: if [[ ! -d $(CURDIR)/.lib || ! -d $(CURDIR)/.inc ]]; then \ mkdir $(CURDIR)/.lib $(CURDIR)/.include ; \ fi ; \ - if [[ `uname` == "Darwin" ]]; then \ + if [[ `uname` = "Darwin" ]]; then \ export CFLAGS=-mmacosx-version-min=10.9 ; \ export CXXFLAGS=-mmacosx-version-min=10.9 ; \ fi ; \ - DL=$$([ `which wget` ] && echo "wget" || echo "curl -LO") ; \ + DL=$$([ `which wget` ] && echo "wget --no-check-certificate" || echo "curl -LO") ; \ cd /tmp ; \ $$DL https://zlib.net/zlib-1.2.11.tar.gz && tar xzf zlib-1.2.11.tar.gz && cd zlib-1.2.11 ; \ - ./configure --static && make && cp *.a $(CURDIR)/.lib && cp zconf.h zlib.h $(CURDIR)/.include ; \ + $(if $(MINGW), mingw32-make -f win32/Makefile.gcc, ./configure --static && make) && cp libz.a $(CURDIR)/.lib && cp zconf.h zlib.h $(CURDIR)/.include ; \ cd .. ; \ $$DL https://github.com/01org/tbb/archive/2017_U8.tar.gz && tar xzf 2017_U8.tar.gz && cd tbb-2017_U8; \ - make -j4 extra_inc=big_iron.inc && cp -r include/tbb $(CURDIR)/.include && cp build/*_release/*.a $(CURDIR)/.lib + $(if $(MINGW), mingw32-make comiler=gcc arch=ia64 runtime=mingw, make) extra_inc=big_iron.inc -j4 \ + && cp -r include/tbb $(CURDIR)/.include && cp build/*_release/*.a $(CURDIR)/.lib .PHONY: test test: simple-test random-test @@ -534,3 +532,4 @@ clean: rm -rf *.dSYM rm -rf .perllib.tmp rm -rf .include .lib + rm -rf .lib .include From 667aad25e8f9b5d9a15e0c9693e40c33ac104995 Mon Sep 17 00:00:00 2001 From: Rone Charles Date: Wed, 4 Oct 2017 12:18:23 -0400 Subject: [PATCH 09/11] Disable thread stealing and signal blocking in Windows --- bt2_search.cpp | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/bt2_search.cpp b/bt2_search.cpp index d4db045c2..1daa99631 100644 --- a/bt2_search.cpp +++ b/bt2_search.cpp @@ -29,7 +29,11 @@ #include #include #include + +#ifndef _WIN32 #include +#endif + #include "alphabet.h" #include "assert_helpers.h" #include "endian_swap.h" @@ -4353,7 +4357,7 @@ static void multiseedSearchWorker_2p5(void *vp) { return; } - +#ifndef _WIN32 /** * Print friendly-ish message pertaining to failed system call. */ @@ -4524,7 +4528,7 @@ static void thread_monitor(int pid, int orig_threads, EList& tids, EListloaded()) throw 1; multiseed_refs = refs.get(); - sigset_t set; - sigemptyset(&set); - sigaddset(&set, SIGPIPE); - pthread_sigmask(SIG_BLOCK, &set, NULL); +#ifndef _WIN32 + sigset_t set; + sigemptyset(&set); + sigaddset(&set, SIGPIPE); + pthread_sigmask(SIG_BLOCK, &set, NULL); +#endif EList tids; #ifdef WITH_TBB //tbb::task_group tbb_grp; @@ -4614,12 +4620,14 @@ static void multiseedSearch( { Timer _t(cerr, "Multiseed full-index search: ", timing); +#ifndef _WIN32 int pid = 0; if(thread_stealing) { pid = getpid(); write_pid(thread_stealing_dir.c_str(), pid); thread_counter = 0; } +#endif for(int i = 0; i < nthreads; i++) { #ifdef WITH_TBB @@ -4644,10 +4652,12 @@ static void multiseedSearch( #endif } +#ifndef _WIN32 if(thread_stealing) { int orig_threads = nthreads; thread_monitor(pid, orig_threads, tids, threads); } +#endif #ifdef WITH_TBB while(all_threads_done < nthreads) { @@ -4659,9 +4669,11 @@ static void multiseedSearch( } #endif +#ifndef _WIN32 if(thread_stealing) { del_pid(thread_stealing_dir.c_str(), pid); } +#endif } if(!metricsPerRead && (metricsOfb != NULL || metricsStderr)) { metrics.reportInterval(metricsOfb, metricsStderr, true, NULL); @@ -5012,7 +5024,9 @@ int bowtie(int argc, const char **argv) { return 1; } +#ifndef _WIN32 thread_stealing = thread_ceiling > nthreads; +#endif if(thread_stealing && thread_stealing_dir.empty()) { cerr << "When --thread-ceiling is specified, must also specify --thread-piddir" << endl; printUsage(cerr); From 3a9a705fc9af717e47c9e1e98141da54d6804762 Mon Sep 17 00:00:00 2001 From: Rone Charles Date: Thu, 5 Oct 2017 10:03:20 -0400 Subject: [PATCH 10/11] Fix issues in Makefile --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index b68f8eb43..4fac4a9dd 100644 --- a/Makefile +++ b/Makefile @@ -246,6 +246,7 @@ SRC_PKG_LIST = $(wildcard *.h) \ $(wildcard *.c) \ $(wildcard *.cpp) \ $(wildcard third_party/*) \ + doc/strip_markdown.pl \ Makefile \ $(GENERAL_LIST) @@ -437,7 +438,7 @@ bowtie2-src: $(SRC_PKG_LIST) .PHONY: bowtie2-pkg bowtie2-pkg: static-libs $(BIN_PKG_LIST) $(BOWTIE2_BIN_LIST) $(BOWTIE2_BIN_LIST_AUX) - $(eval PKG_DIR=bowtie2-$(VERSION)-$(if $(MACOS),macos,$(if $(MINGW),mingw,linux))$(if $(HAS_TBB),,-legacy)-x86_64) + $(eval PKG_DIR=bowtie2-$(VERSION)-$(if $(MACOS),macos,$(if $(MINGW),mingw,linux))-x86_64) chmod a+x scripts/*.sh scripts/*.pl rm -rf .bin.tmp mkdir -p .bin.tmp/$(PKG_DIR) @@ -517,7 +518,7 @@ static-libs: $(if $(MINGW), mingw32-make -f win32/Makefile.gcc, ./configure --static && make) && cp libz.a $(CURDIR)/.lib && cp zconf.h zlib.h $(CURDIR)/.include ; \ cd .. ; \ $$DL https://github.com/01org/tbb/archive/2017_U8.tar.gz && tar xzf 2017_U8.tar.gz && cd tbb-2017_U8; \ - $(if $(MINGW), mingw32-make comiler=gcc arch=ia64 runtime=mingw, make) extra_inc=big_iron.inc -j4 \ + $(if $(MINGW), mingw32-make compiler=gcc arch=ia64 runtime=mingw, make) extra_inc=big_iron.inc -j4 \ && cp -r include/tbb $(CURDIR)/.include && cp build/*_release/*.a $(CURDIR)/.lib .PHONY: test @@ -532,4 +533,3 @@ clean: rm -rf *.dSYM rm -rf .perllib.tmp rm -rf .include .lib - rm -rf .lib .include From 90a7d873a68d8214d9fa20850b1a174845f8b87f Mon Sep 17 00:00:00 2001 From: Rone Charles Date: Thu, 5 Oct 2017 11:04:39 -0400 Subject: [PATCH 11/11] Update documentation for v2.3.3.1 --- MANUAL | 2 +- MANUAL.markdown | 4 +-- NEWS | 6 ++++ VERSION | 2 +- doc/manual.html | 2 +- doc/website/manual.ssi | 2 +- doc/website/old_news.ssi | 49 +++++++++++++++++++++++++++++++ doc/website/recent_news.ssi | 57 +++++------------------------------- doc/website/rhsidebar.ssi | 4 +-- pthreadGC2.dll | Bin 60273 -> 0 bytes 10 files changed, 71 insertions(+), 57 deletions(-) delete mode 100644 pthreadGC2.dll diff --git a/MANUAL b/MANUAL index 5328c74f6..236044795 100644 --- a/MANUAL +++ b/MANUAL @@ -1516,7 +1516,7 @@ by tabs; from left to right, the fields are: will truncate the name at the first whitespace character. This is similar to the behavior of other tools. The standard behavior of truncating at the first whitespace can be suppressed with - --sam-noqname-trunc at the expense of generating non-standard SAM. + --sam-no-qname-trunc at the expense of generating non-standard SAM. 2. Sum of all applicable flags. Flags relevant to Bowtie are: diff --git a/MANUAL.markdown b/MANUAL.markdown index 039118cd9..809243128 100644 --- a/MANUAL.markdown +++ b/MANUAL.markdown @@ -1927,8 +1927,8 @@ left to right, the fields are: If the read name contains any whitespace characters, Bowtie 2 will truncate the name at the first whitespace character. This is similar to the behavior of other tools. The standard behavior of truncating at the first - whitespace can be suppressed with `--sam-noqname-trunc` at the expense of - generating non-standard SAM. + whitespace can be suppressed with `--sam-no-qname-trunc` at the expense of + generating non-standard SAM. 2. Sum of all applicable flags. Flags relevant to Bowtie are: diff --git a/NEWS b/NEWS index 4b0cd6276..cff70a19a 100644 --- a/NEWS +++ b/NEWS @@ -19,6 +19,12 @@ Please report any issues to the Bowtie 2 Github page or using the Sourceforge bu Version Release History ======================= +Version 2.3.3.1 - Oct 05, 2017 + * Fixed an issue causing input files to be skipped when running + multi-threaded alignment + * Fixed an issue causing the first character of a read name to be + dropped while parsing reads split across multiple input files + Version 2.3.3 - Sep 09, 2017 From this release forward prepackaged bowtie2 binaries are now statically linked to the zlib compression library and, the recommended diff --git a/VERSION b/VERSION index 0bee604df..9d714864f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.3.3 +2.3.3.1 diff --git a/doc/manual.html b/doc/manual.html index 77d2adb84..7c9d65ba7 100644 --- a/doc/manual.html +++ b/doc/manual.html @@ -1058,7 +1058,7 @@

SAM output

Each subsequent line describes an alignment or, if the read failed to align, a read. Each line is a collection of at least 12 fields separated by tabs; from left to right, the fields are:

  1. Name of read that aligned.

    -

    Note that the SAM specification disallows whitespace in the read name. If the read name contains any whitespace characters, Bowtie 2 will truncate the name at the first whitespace character. This is similar to the behavior of other tools. The standard behavior of truncating at the first whitespace can be suppressed with --sam-noqname-trunc at the expense of generating non-standard SAM.

  2. +

    Note that the SAM specification disallows whitespace in the read name. If the read name contains any whitespace characters, Bowtie 2 will truncate the name at the first whitespace character. This is similar to the behavior of other tools. The standard behavior of truncating at the first whitespace can be suppressed with --sam-no-qname-trunc at the expense of generating non-standard SAM.

  3. Sum of all applicable flags. Flags relevant to Bowtie are:

    diff --git a/doc/website/manual.ssi b/doc/website/manual.ssi index d9c222df5..37c745d0c 100644 --- a/doc/website/manual.ssi +++ b/doc/website/manual.ssi @@ -1058,7 +1058,7 @@ Seed 4 rc: TTATGCATGA

    Each subsequent line describes an alignment or, if the read failed to align, a read. Each line is a collection of at least 12 fields separated by tabs; from left to right, the fields are:

    1. Name of read that aligned.

      -

      Note that the SAM specification disallows whitespace in the read name. If the read name contains any whitespace characters, Bowtie 2 will truncate the name at the first whitespace character. This is similar to the behavior of other tools. The standard behavior of truncating at the first whitespace can be suppressed with --sam-noqname-trunc at the expense of generating non-standard SAM.

    2. +

      Note that the SAM specification disallows whitespace in the read name. If the read name contains any whitespace characters, Bowtie 2 will truncate the name at the first whitespace character. This is similar to the behavior of other tools. The standard behavior of truncating at the first whitespace can be suppressed with --sam-no-qname-trunc at the expense of generating non-standard SAM.

    3. Sum of all applicable flags. Flags relevant to Bowtie are:

    diff --git a/doc/website/old_news.ssi b/doc/website/old_news.ssi index 7df0a310c..791e80425 100644 --- a/doc/website/old_news.ssi +++ b/doc/website/old_news.ssi @@ -1,3 +1,52 @@ +

    Bowtie2 developers note

    +

    As of Nov 2015 we had to fix the bowtie2 github repo and relabel the entire history. Developers and contributors should re-clone the bowtie2 github repo from this current state.

    +

    Version 2.2.9 - Apr 22, 2016

    +
      +
    • Fixed the multiple threads issue for the bowtie2-build.
    • +
    • Fixed a TBB related build issue impacting TBB v4.4.
    • +
    +

    Version 2.2.8 - Mar 10, 2016

    +
      +
    • Various website updates.
    • +
    • Fixed the bowtie2-build issue that made TBB compilation fail.
    • +
    • Fixed the static build for Win32 platform.
    • +
    +

    Version 2.2.7 - Feb 10, 2016

    +
      +
    • Added a parallel index build option: bowtie2-build --threads <# threads>.
    • +
    • Fixed an issue whereby IUPAC codes (other than A/C/G/T/N) in reads were converted to As. Now all non-A/C/G/T characters in reads become Ns.
    • +
    • Fixed some compilation issues, including for the Intel C++ Compiler.
    • +
    • Removed debugging code that could impede performance for many alignment threads.
    • +
    • Fixed a few typos in documentation.
    • +
    +

    Version 2.2.6 - Jul 22, 2015

    +
      +
    • Switched to a stable sort to avoid some potential reproducibility confusions.
    • +
    • Added 'install' target for *nix platforms.
    • +
    • Added the Intel TBB option which provides in most situations a better performance output. TBB is not present by default in the current build but can be added by compiling the source code with WITH_TBB=1 option.
    • +
    • Fixed a bug that caused seed lenght to be dependent of the -L and -N parameters order.
    • +
    • Fixed a bug that caused --local followed by -N to reset seed lenght to 22 which is actually the default value for global.
    • +
    • Enable compilation on FreeBDS and clang, although gmake port is still required.
    • +
    • Fixed an issue that made bowtie2 compilation process to fail on Snow Leopard.
    • +
    + +

    Version 2.2.5 - Mar 9, 2015

    +
      +
    • Fixed some situations where incorrectly we could detect a Mavericks platform.
    • +
    • Fixed some manual issues including some HTML bad formating.
    • +
    • Make sure the wrapper correctly identifies the platform under OSX.
    • +
    • Fixed --rg/--rg-id options where included spaces were incorrectly treated.
    • +
    • Various documentation fixes added by contributors.
    • +
    • Fixed the incorrect behavior where parameter file names may contain spaces.
    • +
    • Fixed bugs related with the presence of spaces in the path where bowtie binaries are stored.
    • +
    • Improved exception handling for missformated quality values.
    • +
    • Improved redundancy checks by correctly account for soft clipping.
    • +
    + +

    Lighter released

    +
      +
    • Lighter is an extremely fast and memory-efficient program for correcting sequencing errors in DNA sequencing data. For details on how error correction can help improve the speed and accuracy of downstream analysis tools, see the paper in Genome Biology. Source and software available at GitHub
    • . +

    Version 2.2.4 - Oct 22, 2014

    • Fixed a Mavericks OSX specific bug caused by some linkage ambiguities.
    • diff --git a/doc/website/recent_news.ssi b/doc/website/recent_news.ssi index ed82ee726..9a41e30e5 100644 --- a/doc/website/recent_news.ssi +++ b/doc/website/recent_news.ssi @@ -1,3 +1,9 @@ +

      Version 2.3.3.1 - October 05, 2017

      +
        +
      • Fixed an issue causing input files to be skipped when running multi-threaded alignment
      • +
      • Fixed an issue causing the first character of a read name to be dropped while parsing reads split across multiple input files
      • +
      +

      Version 2.3.3 - September 06, 2017

      From this release forward prepackaged bowtie2 binaries are now statically linked to the zlib compression library and, the recommended threading library, TBB. Users who rely on prepackaged builds are no longer required to have these packages pre-installed. As a result of the aforementioned changes legacy packages have been discontinued.

        @@ -21,6 +27,7 @@
      • Fixed compilation issues caused by gzbuffer function when compiling with zlib v1.2.3.5 and earlier. Users compiling against these libraries will use the zlib default buffer size of 8Kb when decompressing read files.
      • Fixed issue that would cause Bowtie 2 hang when aligning FASTA inputs with more than one thread
      +

      Version 2.3.1 - Mar 03, 2017

      Please note that as of this release Bowtie 2 now has dependencies on zlib and readline libraries. Make sure that all dependencies are met before attempting to build from source.

        @@ -31,6 +38,7 @@
      • Fixed a bug whereby combining -—un-conc with -k or -a would cause bowtie2 to print duplicate reads in one or both of the --un-conc* output files, causing the ends to be misaligned.
      • The default --score-min for --local mode is now 'G,20,8'. That was the stated default in the documentation for a while, but the actual default was 'G,0,10' for many versions. Now the default matches the documentation and, we find, yields more accurate alignments than 'G,0,10'
      +

      Version 2.3.0 - Dec 13, 2016

      This is a major release with some larger and many smaller changes. These notes emphasize the large changes. See commit history for details.

        @@ -42,52 +50,3 @@
      • Now detects and reports inconsistencies between --score-min and --ma
      • Changed default for --bmaxdivn to yield better memory footprint and running time when building an index with many threads
      -

      Bowtie2 developers note

      -

      As of Nov 2015 we had to fix the bowtie2 github repo and relabel the entire history. Developers and contributors should re-clone the bowtie2 github repo from this current state.

      -

      Version 2.2.9 - Apr 22, 2016

      -
        -
      • Fixed the multiple threads issue for the bowtie2-build.
      • -
      • Fixed a TBB related build issue impacting TBB v4.4.
      • -
      -

      Version 2.2.8 - Mar 10, 2016

      -
        -
      • Various website updates.
      • -
      • Fixed the bowtie2-build issue that made TBB compilation fail.
      • -
      • Fixed the static build for Win32 platform.
      • -
      -

      Version 2.2.7 - Feb 10, 2016

      -
        -
      • Added a parallel index build option: bowtie2-build --threads <# threads>.
      • -
      • Fixed an issue whereby IUPAC codes (other than A/C/G/T/N) in reads were converted to As. Now all non-A/C/G/T characters in reads become Ns.
      • -
      • Fixed some compilation issues, including for the Intel C++ Compiler.
      • -
      • Removed debugging code that could impede performance for many alignment threads.
      • -
      • Fixed a few typos in documentation.
      • -
      -

      Version 2.2.6 - Jul 22, 2015

      -
        -
      • Switched to a stable sort to avoid some potential reproducibility confusions.
      • -
      • Added 'install' target for *nix platforms.
      • -
      • Added the Intel TBB option which provides in most situations a better performance output. TBB is not present by default in the current build but can be added by compiling the source code with WITH_TBB=1 option.
      • -
      • Fixed a bug that caused seed lenght to be dependent of the -L and -N parameters order.
      • -
      • Fixed a bug that caused --local followed by -N to reset seed lenght to 22 which is actually the default value for global.
      • -
      • Enable compilation on FreeBDS and clang, although gmake port is still required.
      • -
      • Fixed an issue that made bowtie2 compilation process to fail on Snow Leopard.
      • -
      - -

      Version 2.2.5 - Mar 9, 2015

      -
        -
      • Fixed some situations where incorrectly we could detect a Mavericks platform.
      • -
      • Fixed some manual issues including some HTML bad formating.
      • -
      • Make sure the wrapper correctly identifies the platform under OSX.
      • -
      • Fixed --rg/--rg-id options where included spaces were incorrectly treated.
      • -
      • Various documentation fixes added by contributors.
      • -
      • Fixed the incorrect behavior where parameter file names may contain spaces.
      • -
      • Fixed bugs related with the presence of spaces in the path where bowtie binaries are stored.
      • -
      • Improved exception handling for missformated quality values.
      • -
      • Improved redundancy checks by correctly account for soft clipping.
      • -
      - -

      Lighter released

      -
        -
      • Lighter is an extremely fast and memory-efficient program for correcting sequencing errors in DNA sequencing data. For details on how error correction can help improve the speed and accuracy of downstream analysis tools, see the paper in Genome Biology. Source and software available at GitHub
      • . -
      diff --git a/doc/website/rhsidebar.ssi b/doc/website/rhsidebar.ssi index a490f3e94..3a74fdcb8 100644 --- a/doc/website/rhsidebar.ssi +++ b/doc/website/rhsidebar.ssi @@ -18,10 +18,10 @@
    diff --git a/pthreadGC2.dll b/pthreadGC2.dll deleted file mode 100644 index 8b9116c78e6dec086dd179f86c944c9b9fbcdc89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60273 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%0Agy%wfdP^kYgX}UpqR* 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

    - Bowtie2 2.3.3 + Bowtie2 2.3.3.1 - 09/06/17  + 10/05/17