[med-svn] [seqan2] 01/01: New upstream version 2.3.2+dfsg

Michael Crusoe misterc-guest at moszumanska.debian.org
Thu Sep 28 16:19:07 UTC 2017


This is an automated email from the git hooks/post-receive script.

misterc-guest pushed a commit to annotated tag upstream/2.3.2+dfsg
in repository seqan2.

commit b70ac79b9acd75ed967888e0dcedba94ab63e2ed
Author: Michael R. Crusoe <michael.crusoe at gmail.com>
Date:   Thu Sep 28 07:44:06 2017 -0700

    New upstream version 2.3.2+dfsg
---
 CHANGELOG.rst                                      |  16 ++
 README.rst                                         |   4 +-
 apps/alf/CMakeLists.txt                            |   2 +-
 apps/bs_tools/CMakeLists.txt                       |   7 +-
 apps/dfi/CMakeLists.txt                            |   2 +-
 apps/fiona/CMakeLists.txt                          |   2 +-
 apps/fiona/fiona.cpp                               |  30 ++-
 apps/fx_tools/CMakeLists.txt                       |   2 +-
 apps/gustaf/CMakeLists.txt                         |   2 +-
 apps/insegt/CMakeLists.txt                         |   2 +-
 apps/mason2/CMakeLists.txt                         |   2 +-
 apps/micro_razers/CMakeLists.txt                   |   2 +-
 apps/ngs_roi/CMakeLists.txt                        |   2 +-
 apps/pair_align/CMakeLists.txt                     |   2 +-
 apps/param_chooser/CMakeLists.txt                  |   2 +-
 apps/rabema/CMakeLists.txt                         |   2 +-
 apps/razers/CMakeLists.txt                         |   2 +-
 apps/razers3/CMakeLists.txt                        |   2 +-
 apps/rep_sep/CMakeLists.txt                        |   2 +-
 apps/sak/CMakeLists.txt                            |   2 +-
 apps/sam2matrix/CMakeLists.txt                     |   2 +-
 apps/samcat/CMakeLists.txt                         |   2 +-
 apps/searchjoin/CMakeLists.txt                     |   2 +-
 apps/searchjoin/db.h                               |  16 +-
 apps/searchjoin/join.cpp                           |  17 +-
 apps/searchjoin/search.cpp                         |  16 +-
 apps/seqan_tcoffee/CMakeLists.txt                  |   2 +-
 apps/seqcons2/CMakeLists.txt                       |   2 +-
 apps/sgip/CMakeLists.txt                           |   2 +-
 apps/snp_store/CMakeLists.txt                      |   2 +-
 apps/splazers/CMakeLists.txt                       |   2 +-
 apps/stellar/CMakeLists.txt                        |   2 +-
 apps/tree_recon/CMakeLists.txt                     |   2 +-
 apps/yara/CMakeLists.txt                           |   2 +-
 .../parsing_command_line_arguments/base.cpp        |  97 ++++++++++
 .../parsing_command_line_arguments/base.cpp.stdout |   0
 dox/CMakeLists.txt                                 |   4 +-
 dox/{dox_only.sh => dox_only.sh.in}                |   0
 dox/{run.sh => run.sh.in}                          |   0
 include/seqan/align/dp_scout_simd.h                |   4 +-
 include/seqan/arg_parse/arg_parse_argument.h       |  64 +++---
 include/seqan/arg_parse/arg_parse_ctd_support.h    |  56 +++++-
 include/seqan/arg_parse/arg_parse_version_check.h  |  24 ++-
 include/seqan/index/index_bidirectional_stree.h    |   8 +-
 include/seqan/index/index_bifm_stree.h             |  28 +--
 .../journaled_string_tree_impl.h                   |   1 +
 include/seqan/seq_io/sequence_file.h               |  12 +-
 include/seqan/version.h                            |   2 +-
 .../Infrastructure/Use/CustomBuildSystem.rst       |   4 +-
 .../source/Infrastructure/Use/FindSeqAnCMake.rst   |  44 ++++-
 .../GettingStarted/ParsingCommandLineArguments.rst | 215 ++++++++++++---------
 tests/arg_parse/test_app.ctd                       |  18 +-
 tests/arg_parse/test_arg_parse_ctd_support.h       |   1 +
 tests/arg_parse/test_arg_parse_version_check.h     |   2 +-
 tests/index/test_index_bifm.cpp                    |  14 +-
 .../platform/test_platform_range_based_for_loops.h |   2 -
 tests/seq_io/test_tag_select_intersect.h           |  21 +-
 util/cmake/FindSeqAn.cmake                         |   1 +
 util/cmake/SeqAnConsistentFPFlags.cmake            |  59 ++++++
 util/pkgconfig/seqan.pc.in                         |   2 +-
 util/travis/linux-cibuild.sh                       |   3 +
 61 files changed, 560 insertions(+), 286 deletions(-)

diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 0c7b4bd..6c2dfcf 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -3,6 +3,22 @@ SeqAn Changelog
 
 This file summarizes the changes to the SeqAn library and apps.
 
+Release 2.3.2
+~~~~~~~~~~~~~
+
+Selected Bug Fixes
+^^^^^^^^^^^^^^^^^^
+
+- Argument parser
+   - various fixes in the version checker
+   - fix incompatibilities in CTD file creation with KNIME (introduced in 2.3.0)
+- Build systems
+   - reintroduce ``FindSeqAn.cmake`` for projects that rely on cmake's module mode
+   - fix the pkgconfig file
+- Platform related
+   - improved compliance with warning levels of soon-to-be-released gcc7 and clang4 
+   - because of unresolved bugs we now recommend gcc5 as minimum gcc version when using static linking 
+
 Release 2.3.1
 ~~~~~~~~~~~~~
 
diff --git a/README.rst b/README.rst
index 1159f2e..8b9c357 100644
--- a/README.rst
+++ b/README.rst
@@ -22,7 +22,7 @@ Prerequisites
 -------------------
 
 Linux, Mac OSX, FreeBSD:
-  * GCC ≥ 4.9
+  * GCC ≥ 4.9 [GCC ≥ 5 recommended]
   * Clang/LLVM ≥ 3.5
   * Intel Compiler ≥ 16.0.2
 Windows:
@@ -36,7 +36,7 @@ Architecture support:
   * many other architectures, including ARM, PowerPC and Sparc64 work, but receive less testing and optimizations
 
 To build tests, demos, and official SeqAn applications you also need:
-  * CMake ≥ 3.0 (http://cmake.org/)
+  * CMake ≥ 3.0 [CMake ≥ 3.4 recommended]
 
 Some of the official applications might have additional requirements or work only on a subset of platforms.
 
diff --git a/apps/alf/CMakeLists.txt b/apps/alf/CMakeLists.txt
index 7903507..e198d89 100644
--- a/apps/alf/CMakeLists.txt
+++ b/apps/alf/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_alf CXX)
 message (STATUS "Configuring apps/alf")
 
-set (SEQAN_APP_VERSION "1.1.8")
+set (SEQAN_APP_VERSION "1.1.9")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/bs_tools/CMakeLists.txt b/apps/bs_tools/CMakeLists.txt
index f43110b..8732293 100644
--- a/apps/bs_tools/CMakeLists.txt
+++ b/apps/bs_tools/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_bs_tools CXX)
 message (STATUS "Configuring apps/bs_tools")
 
-set (SEQAN_APP_VERSION "0.1.8")
+set (SEQAN_APP_VERSION "0.1.9")
 
 if ((${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD") AND ("$ENV{MODEL}" STREQUAL "Nightly"))
     message (STATUS "bs_tools skipped on FreeBSD because math.h rounding errors.")
@@ -114,6 +114,11 @@ install (FILES LICENSE
 # App Test
 # ----------------------------------------------------------------------------
 
+if (SEQAN_BUILD_SYSTEM STREQUAL "DEVELOP")
+    include("SeqAnConsistentFPFlags")
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SEQAN_CONSISTENT_FP_FLAGS}")
+endif()
+
 # (weese:) temporarily disabled app test
 seqan_add_app_test (bs_tools)
 
diff --git a/apps/dfi/CMakeLists.txt b/apps/dfi/CMakeLists.txt
index f5352c7..ee9e7c6 100644
--- a/apps/dfi/CMakeLists.txt
+++ b/apps/dfi/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_dfi CXX)
 message (STATUS "Configuring apps/dfi")
 
-set (SEQAN_APP_VERSION "2.1.8")
+set (SEQAN_APP_VERSION "2.1.9")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/fiona/CMakeLists.txt b/apps/fiona/CMakeLists.txt
index e00d7b1..babd267 100644
--- a/apps/fiona/CMakeLists.txt
+++ b/apps/fiona/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_fiona CXX)
 message (STATUS "Configuring apps/fiona")
 
-set (SEQAN_APP_VERSION "0.2.8")
+set (SEQAN_APP_VERSION "0.2.9")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/fiona/fiona.cpp b/apps/fiona/fiona.cpp
index 0b96bd4..b468b16 100644
--- a/apps/fiona/fiona.cpp
+++ b/apps/fiona/fiona.cpp
@@ -70,26 +70,18 @@
 
 #endif
 
+#include <seqan/platform.h>
 
 #if defined(_OPENMP)
     #include <omp.h>
     #define SEQAN_PARALLEL      // Only enable parallelism in fiona if OpenMP is enabled.
     #define FIONA_PARALLEL		// divide suffix tree into subtrees for each possible 3-gram
-                                // and use process subtrees in parallel
-    #if !defined(__MINGW32__) || defined(__amd64__) || defined(__x86_64__) || defined(__ia64__)
-    // The parallel STL generates warnings in MinGW: "...parallel/compatibility.h:167:42: note: #pragma message: slow __fetch_and_add_64".
-    // Thus, we do not enable it in this case.
-        #define _GLIBCXX_PARALLEL
-    #endif  // #if !defined(__MINGW32__) || defined(__amd64__) || defined(__x86_64__) || defined(__ia64__)
-
-    #if defined(__INTEL_COMPILER)
-        #pragma message("The Intel Compiler crashes with _GLIBCXX_PARALLEL defined (at least until v16.0.2). Therefore, the feature will be disabled.")
-        #if __INTEL_COMPILER < 1600 || (__INTEL_COMPILER == 1600 && __INTEL_COMPILER_UPDATE <= 2)
-            #undef _GLIBCXX_PARALLEL
-        #endif
-    #endif // #if defined(__INTEL_COMPILER)
+
+    #if defined(STDLIB_GNU)
+        #include <parallel/algorithm>
+    #endif
 #else
-    #warning "Please enable OpenMP."
+    #pragma message("Please enable OpenMP.")
 #endif  // #ifdef _OPENMP
 
 // The q-gram length used for the q-gram index.  This has to be hard-coded as a precompiler definition since it is part
@@ -661,7 +653,7 @@ namespace seqan
             }
         
         // sort them descendingly by bucket size
-        ::std::sort(begin(bktIdx, Standard()), end(bktIdx, Standard()), GreaterBucketSize<TDir>(dir));
+        sort(bktIdx, GreaterBucketSize<TDir>(dir), Parallel());
         
         // mask for removal of the largest buckets that 
         // contain overall at most 2% of all suffixes
@@ -715,7 +707,7 @@ namespace seqan
             }
         
         // sort them descendingly by bucket size
-        ::std::sort(begin(bktIdx, Standard()), end(bktIdx, Standard()), GreaterBucketSize<TDir>(dir));
+        sort(bktIdx, GreaterBucketSize<TDir>(dir), Parallel());
 
         TBktIter itFirst = begin(bktIdx, Standard());
         TBktIter itLast = end(bktIdx, Standard());
@@ -1730,7 +1722,7 @@ inline unsigned applyReadErrorCorrections(String<TCorrection> const &correctionL
         //sorting by Position first to get the best correction per Position
         //sorting is done arbitrarily from large to small(right to left)
 
-        std::sort(begin(possibleCorrections, Standard()), end(possibleCorrections, Standard()), LessPositionOverlap<CorrectionIndelPos>());
+        sort(possibleCorrections, LessPositionOverlap<CorrectionIndelPos>(), Parallel());
 
 #ifndef FIONA_NO_SEPARATE_OVERLAPSUM
 	//only remove if several corrections per position are saved
@@ -1780,7 +1772,7 @@ inline unsigned applyReadErrorCorrections(String<TCorrection> const &correctionL
 
         //sorting by overlap sum now
 #ifndef FIONA_NOERROROPTIMIZATION    //dont sort in random encounter (local) mode
-        std::sort(begin(possibleCorrections, Standard()), end(possibleCorrections, Standard()), LessOverlap<CorrectionIndelPos>());
+        sort(possibleCorrections, LessOverlap<CorrectionIndelPos>(), Parallel());
 #endif
         //go through all Correction struct and keep the ones with highest overlapsum
         // and without conflict in terms of error type
@@ -4947,7 +4939,7 @@ unsigned correctReads(
 	if (inTerm && options.verbosity >= 1)
         std::cerr << "done. (" << SEQAN_PROTIMEDIFF(search) << " seconds)" << std::endl;
 
-    std::sort(begin(resourcesPerPackage, Standard()), end(resourcesPerPackage, Standard()));
+    sort(resourcesPerPackage, Parallel());
 	if (inTerm && options.verbosity >= 2)
     {
         std::cerr << std::endl;
diff --git a/apps/fx_tools/CMakeLists.txt b/apps/fx_tools/CMakeLists.txt
index fab4cd6..b0e9d7e 100644
--- a/apps/fx_tools/CMakeLists.txt
+++ b/apps/fx_tools/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_fx_tools CXX)
 message (STATUS "Configuring apps/fx_tools")
 
-set (SEQAN_APP_VERSION "0.2.8")
+set (SEQAN_APP_VERSION "0.2.9")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/gustaf/CMakeLists.txt b/apps/gustaf/CMakeLists.txt
index 829bd41..d8ae684 100644
--- a/apps/gustaf/CMakeLists.txt
+++ b/apps/gustaf/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_gustaf CXX)
 message (STATUS "Configuring apps/gustaf")
 
-set (SEQAN_APP_VERSION "1.0.8")
+set (SEQAN_APP_VERSION "1.0.9")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/insegt/CMakeLists.txt b/apps/insegt/CMakeLists.txt
index c27037e..6adda64 100644
--- a/apps/insegt/CMakeLists.txt
+++ b/apps/insegt/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_insegt CXX)
 message (STATUS "Configuring apps/insegt")
 
-set (SEQAN_APP_VERSION "1.1.8")
+set (SEQAN_APP_VERSION "1.1.9")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/mason2/CMakeLists.txt b/apps/mason2/CMakeLists.txt
index a345347..eaf4345 100644
--- a/apps/mason2/CMakeLists.txt
+++ b/apps/mason2/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_mason2 CXX)
 message (STATUS "Configuring apps/mason2")
 
-set (SEQAN_APP_VERSION "2.0.7")
+set (SEQAN_APP_VERSION "2.0.8")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/micro_razers/CMakeLists.txt b/apps/micro_razers/CMakeLists.txt
index e8761c3..5e2dd4f 100644
--- a/apps/micro_razers/CMakeLists.txt
+++ b/apps/micro_razers/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_micro_razers CXX)
 message (STATUS "Configuring apps/micro_razers")
 
-set (SEQAN_APP_VERSION "1.0.9")
+set (SEQAN_APP_VERSION "1.0.10")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/ngs_roi/CMakeLists.txt b/apps/ngs_roi/CMakeLists.txt
index 96f9aaf..980224b 100644
--- a/apps/ngs_roi/CMakeLists.txt
+++ b/apps/ngs_roi/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_ngs_roi CXX)
 message (STATUS "Configuring apps/ngs_roi")
 
-set (SEQAN_APP_VERSION "0.2.10")
+set (SEQAN_APP_VERSION "0.2.11")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/pair_align/CMakeLists.txt b/apps/pair_align/CMakeLists.txt
index 6dcb816..70f9e5c 100644
--- a/apps/pair_align/CMakeLists.txt
+++ b/apps/pair_align/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_pair_align CXX)
 message (STATUS "Configuring apps/pair_align")
 
-set (SEQAN_APP_VERSION "1.3.6")
+set (SEQAN_APP_VERSION "1.3.7")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/param_chooser/CMakeLists.txt b/apps/param_chooser/CMakeLists.txt
index 92c16e8..ef4cfeb 100644
--- a/apps/param_chooser/CMakeLists.txt
+++ b/apps/param_chooser/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_param_chooser CXX)
 message (STATUS "Configuring apps/param_chooser")
 
-set (SEQAN_APP_VERSION "0.0.7")
+set (SEQAN_APP_VERSION "0.0.8")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/rabema/CMakeLists.txt b/apps/rabema/CMakeLists.txt
index bc52b51..723e225 100644
--- a/apps/rabema/CMakeLists.txt
+++ b/apps/rabema/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_rabema CXX)
 message (STATUS "Configuring apps/rabema")
 
-set (SEQAN_APP_VERSION "1.2.8")
+set (SEQAN_APP_VERSION "1.2.9")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/razers/CMakeLists.txt b/apps/razers/CMakeLists.txt
index 12707cc..be52d54 100644
--- a/apps/razers/CMakeLists.txt
+++ b/apps/razers/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_razers CXX)
 message (STATUS "Configuring apps/razers")
 
-set (SEQAN_APP_VERSION "1.5.6")
+set (SEQAN_APP_VERSION "1.5.7")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/razers3/CMakeLists.txt b/apps/razers3/CMakeLists.txt
index a637047..0eb5157 100644
--- a/apps/razers3/CMakeLists.txt
+++ b/apps/razers3/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_razers3 CXX)
 message (STATUS "Configuring apps/razers3")
 
-set (SEQAN_APP_VERSION "3.5.6")
+set (SEQAN_APP_VERSION "3.5.7")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/rep_sep/CMakeLists.txt b/apps/rep_sep/CMakeLists.txt
index 0dd76fc..c8b6312 100644
--- a/apps/rep_sep/CMakeLists.txt
+++ b/apps/rep_sep/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_rep_sep CXX)
 message (STATUS "Configuring apps/rep_sep")
 
-set (SEQAN_APP_VERSION "0.1.9")
+set (SEQAN_APP_VERSION "0.1.10")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/sak/CMakeLists.txt b/apps/sak/CMakeLists.txt
index c935026..3687181 100644
--- a/apps/sak/CMakeLists.txt
+++ b/apps/sak/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_sak CXX)
 message (STATUS "Configuring apps/sak")
 
-set (SEQAN_APP_VERSION "0.4.6")
+set (SEQAN_APP_VERSION "0.4.7")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/sam2matrix/CMakeLists.txt b/apps/sam2matrix/CMakeLists.txt
index 74d46e0..e0d60ad 100644
--- a/apps/sam2matrix/CMakeLists.txt
+++ b/apps/sam2matrix/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_sam2matrix CXX)
 message (STATUS "Configuring apps/sam2matrix")
 
-set (SEQAN_APP_VERSION "0.3.6")
+set (SEQAN_APP_VERSION "0.3.7")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/samcat/CMakeLists.txt b/apps/samcat/CMakeLists.txt
index 35b4cfc..963ec67 100644
--- a/apps/samcat/CMakeLists.txt
+++ b/apps/samcat/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_samcat CXX)
 message (STATUS "Configuring apps/samcat")
 
-set (SEQAN_APP_VERSION "0.3.6")
+set (SEQAN_APP_VERSION "0.3.7")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/searchjoin/CMakeLists.txt b/apps/searchjoin/CMakeLists.txt
index bcee315..576df51 100644
--- a/apps/searchjoin/CMakeLists.txt
+++ b/apps/searchjoin/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_searchjoin CXX)
 message (STATUS "Configuring apps/searchjoin")
 
-set (SEQAN_APP_VERSION "0.5.6")
+set (SEQAN_APP_VERSION "0.5.7")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/searchjoin/db.h b/apps/searchjoin/db.h
index 7d0cfac..2ef7a45 100644
--- a/apps/searchjoin/db.h
+++ b/apps/searchjoin/db.h
@@ -797,11 +797,13 @@ void build(DbIndex<Index<TText, TIndexSpec>, TDbIndexSpec> & dbIndex,
         for (int i = 1; i < (int)length(dir); ++i)
         {
             if (dir[i - 1] + 1 < dir[i])
-                std::sort(
-                    saBegin + dir[i - 1],
-                    saBegin + dir[i],
-                    QGramLessOffset_<TIndexSAPos, TText const>(text, maxSeedLength, shapeLength));
-
+            {
+		auto infixSA = infix(sa, saBegin + dir[i - 1], saBegin + dir[i]);
+	        sort(
+		    infixSA,
+		    QGramLessOffset_<TIndexSAPos, TText const>(text, maxSeedLength, shapeLength),
+		    Parallel());
+            }
 //            typename Infix<TIndexSAFibre>::Type saInf = infix(sa, dir[i - 1], dir[i]);
 //            _refineQGramIndexBucket(
 //                saInf,
@@ -833,7 +835,7 @@ void build(DbIndex<Index<TText, TIndexSpec>, TDbIndexSpec> & dbIndex,
 //    }
 //
 //    QGramLess_<TIndexSAPos, TText const> less(db.text, MaxValue<TTextSize>::VALUE);
-//    std::sort(begin(sa, Standard()), end(sa, Standard()), less);
+//    sort(sa, less, Parallel());
 }
 
 // ----------------------------------------------------------------------------
@@ -953,7 +955,7 @@ void _buildSA(TIndexSAFibre & sa,
 
     // Construct index using quicksort.
     QGramLess_<TIndexSAPos, TText const> less(db.text, seedLength);
-    std::sort(begin(sa, Standard()), end(sa, Standard()), less);
+    sort(sa, less, Parallel());
 }
 
 // ----------------------------------------------------------------------------
diff --git a/apps/searchjoin/join.cpp b/apps/searchjoin/join.cpp
index 1b7d356..63357b3 100644
--- a/apps/searchjoin/join.cpp
+++ b/apps/searchjoin/join.cpp
@@ -39,22 +39,19 @@
 // EDBT/ICDT ’13, March 18 – 22 2013, Genoa, Italy
 // ==========================================================================
 
-#ifdef _OPENMP
-    #define _GLIBCXX_PARALLEL
-    #include <omp.h>
+#include <seqan/platform.h>
 
-    #if defined(__INTEL_COMPILER)
-        #pragma message("The Intel Compiler crashes with _GLIBCXX_PARALLEL defined (at least until v16.0.2). Therefore, the feature will be disabled.")
-        #if __INTEL_COMPILER < 1600 || (__INTEL_COMPILER == 1600 && __INTEL_COMPILER_UPDATE <= 2)
-            #undef _GLIBCXX_PARALLEL
-        #endif
-    #endif // #if defined(__INTEL_COMPILER)
+#if defined(_OPENMP)
+    #include <omp.h>
 
+    #if defined(STDLIB_GNU)
+        #include <parallel/algorithm>
+    #endif
 #else
     #if !defined(SEQAN_IGNORE_MISSING_OPENMP) || (SEQAN_IGNORE_MISSING_OPENMP == 0)
         #pragma message("OpenMP not found! Shared-memory parallelization will be disabled in join tool.")
     #endif  // #if !defined(SEQAN_IGNORE_MISSING_OPENMP) || (SEQAN_IGNORE_MISSING_OPENMP == 0)
-#endif
+#endif  // #ifdef _OPENMP
 
 #include <seqan/basic.h>
 #include <seqan/sequence.h>
diff --git a/apps/searchjoin/search.cpp b/apps/searchjoin/search.cpp
index a286d6d..f769b97 100644
--- a/apps/searchjoin/search.cpp
+++ b/apps/searchjoin/search.cpp
@@ -39,21 +39,19 @@
 // EDBT/ICDT ’13, March 18 – 22 2013, Genoa, Italy
 // ==========================================================================
 
-#ifdef _OPENMP
-    #define _GLIBCXX_PARALLEL
+#include <seqan/platform.h>
+
+#if defined(_OPENMP)
     #include <omp.h>
 
-    #if defined(__INTEL_COMPILER)
-        #pragma message("The Intel Compiler crashes with _GLIBCXX_PARALLEL defined (at least until v16.0.2). Therefore, the feature will be disabled.")
-        #if __INTEL_COMPILER < 1600 || (__INTEL_COMPILER == 1600 && __INTEL_COMPILER_UPDATE <= 2)
-            #undef _GLIBCXX_PARALLEL
-        #endif
-    #endif // #if defined(__INTEL_COMPILER)
+    #if defined(STDLIB_GNU)
+        #include <parallel/algorithm>
+    #endif
 #else
     #if !defined(SEQAN_IGNORE_MISSING_OPENMP) || (SEQAN_IGNORE_MISSING_OPENMP == 0)
         #pragma message("OpenMP not found! Shared-memory parallelization will be disabled in search tool.")
     #endif  // #if !defined(SEQAN_IGNORE_MISSING_OPENMP) || (SEQAN_IGNORE_MISSING_OPENMP == 0)
-#endif
+#endif  // #ifdef _OPENMP
 
 #include <seqan/basic.h>
 #include <seqan/sequence.h>
diff --git a/apps/seqan_tcoffee/CMakeLists.txt b/apps/seqan_tcoffee/CMakeLists.txt
index 850a780..66e85e2 100644
--- a/apps/seqan_tcoffee/CMakeLists.txt
+++ b/apps/seqan_tcoffee/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_seqan_tcoffee CXX)
 message (STATUS "Configuring apps/seqan_tcoffee")
 
-set (SEQAN_APP_VERSION "1.13.6")
+set (SEQAN_APP_VERSION "1.13.7")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/seqcons2/CMakeLists.txt b/apps/seqcons2/CMakeLists.txt
index ac507ec..8b5fcc2 100644
--- a/apps/seqcons2/CMakeLists.txt
+++ b/apps/seqcons2/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_seqcons2 CXX)
 message (STATUS "Configuring apps/seqcons2")
 
-set (SEQAN_APP_VERSION "2.0.7")
+set (SEQAN_APP_VERSION "2.0.8")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/sgip/CMakeLists.txt b/apps/sgip/CMakeLists.txt
index 717b94f..71a28ac 100755
--- a/apps/sgip/CMakeLists.txt
+++ b/apps/sgip/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_sgip CXX)
 message (STATUS "Configuring apps/sgip")
 
-set (SEQAN_APP_VERSION "1.4.6")
+set (SEQAN_APP_VERSION "1.4.7")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/snp_store/CMakeLists.txt b/apps/snp_store/CMakeLists.txt
index 8739a17..e846ec3 100644
--- a/apps/snp_store/CMakeLists.txt
+++ b/apps/snp_store/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_snp_store CXX)
 message (STATUS "Configuring apps/snp_store")
 
-set (SEQAN_APP_VERSION "1.3.6")
+set (SEQAN_APP_VERSION "1.3.7")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/splazers/CMakeLists.txt b/apps/splazers/CMakeLists.txt
index 364b1bf..bb85d5d 100644
--- a/apps/splazers/CMakeLists.txt
+++ b/apps/splazers/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_splazers CXX)
 message (STATUS "Configuring apps/splazers")
 
-set (SEQAN_APP_VERSION "1.3.6")
+set (SEQAN_APP_VERSION "1.3.7")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/stellar/CMakeLists.txt b/apps/stellar/CMakeLists.txt
index bc10111..a94d1bf 100644
--- a/apps/stellar/CMakeLists.txt
+++ b/apps/stellar/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_stellar CXX)
 message (STATUS "Configuring apps/stellar")
 
-set (SEQAN_APP_VERSION "1.4.9")
+set (SEQAN_APP_VERSION "1.4.10")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/tree_recon/CMakeLists.txt b/apps/tree_recon/CMakeLists.txt
index 154a483..d39248f 100644
--- a/apps/tree_recon/CMakeLists.txt
+++ b/apps/tree_recon/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required (VERSION 3.0.0)
 project (seqan_apps_tree_recon CXX)
 message (STATUS "Configuring apps/tree_recon")
 
-set (SEQAN_APP_VERSION "1.4.6")
+set (SEQAN_APP_VERSION "1.4.7")
 
 # ----------------------------------------------------------------------------
 # Dependencies
diff --git a/apps/yara/CMakeLists.txt b/apps/yara/CMakeLists.txt
index f59a30c..73ec26a 100644
--- a/apps/yara/CMakeLists.txt
+++ b/apps/yara/CMakeLists.txt
@@ -46,7 +46,7 @@ endif (NOT BZIP2_FOUND)
 # App-Level Configuration
 # ----------------------------------------------------------------------------
 
-set (SEQAN_APP_VERSION "0.9.9")
+set (SEQAN_APP_VERSION "0.9.10")
 
 option (YARA_LARGE_CONTIGS "Set to OFF to disable support for more than 32k contigs or contigs longer than 4Gbp." ON)
 if (YARA_LARGE_CONTIGS AND NOT SEQAN_TRAVIS_BUILD)
diff --git a/demos/tutorial/parsing_command_line_arguments/base.cpp b/demos/tutorial/parsing_command_line_arguments/base.cpp
new file mode 100644
index 0000000..5aa9f85
--- /dev/null
+++ b/demos/tutorial/parsing_command_line_arguments/base.cpp
@@ -0,0 +1,97 @@
+#include <iostream>
+#include <seqan/arg_parse.h>
+
+int main()
+{
+    seqan::ArgumentParser parser("base");
+
+//![setMinMax]
+    seqan::addOption(parser, seqan::ArgParseOption(
+        "i", "integer-value", "An integer option",
+        seqan::ArgParseArgument::INTEGER, "INT"));
+ 
+    seqan::setMinValue(parser, "i", "10");
+    seqan::setMaxValue(parser, "integer-value", "20");
+//![setMinMax]
+
+//![setRequired]
+    seqan::addOption(parser, seqan::ArgParseOption(
+       "ir", "required-integer", "An required integer option",
+       seqan::ArgParseArgument::INTEGER, "INT"));
+
+   	setRequired(parser, "ir");
+//![setRequired]
+
+//![setValidValues]
+    seqan::addOption(parser, seqan::ArgParseOption(
+        "", "distance-model", "Distance model, either HAMMING or EDIT.",
+        seqan::ArgParseArgument::STRING, "STR"));
+
+    seqan::setValidValues(parser, "distance-model", "HAMMING EDIT");
+//![setValidValues]
+
+//![addFileOption]
+    seqan::addOption(parser, seqan::ArgParseOption(
+        "I", "input-file", "Path to the input file",
+        seqan::ArgParseArgument::INPUT_FILE, "IN"));
+    seqan::addOption(parser, seqan::ArgParseOption(
+        "O", "output-file", "Path to the output file",
+        seqan::ArgParseArgument::OUTPUT_FILE, "OUT"));
+//![addFileOption]
+
+//![addFileExtension]
+    seqan::setValidValues(parser, "input-file", "txt");
+    seqan::setValidValues(parser, "output-file", "txt");
+//![addFileExtension]
+
+//![readFile]
+    seqan::CharString inputFileName, outputFileName;
+    seqan::getOptionValue(inputFileName, parser, "input-file");
+    seqan::getOptionValue(outputFileName, parser, "output-file");
+//![readFile]
+
+//![tupleOption]
+    seqan::addOption(parser, seqan::ArgParseOption(
+        "r", "range", "The range to modify.",
+        seqan::ArgParseArgument::INTEGER, "BEGIN END",
+        false, 2));
+//![tupleOption]
+
+//![getTupleValue]
+    unsigned rangeBegin = 0, rangeEnd = 0;
+    seqan::getOptionValue(rangeBegin, parser, "range", 0);
+    seqan::getOptionValue(rangeEnd, parser, "range", 1);
+//![getTupleValue]
+
+//![setVersion]
+    seqan::setShortDescription(parser, "String Modifier");
+    seqan::setVersion(parser, "1.0");
+    seqan::setDate(parser, "July 2012");
+//![setVersion]
+
+//![addUsageLine]
+    seqan::addUsageLine(parser,
+        "[\\fIOPTIONS\\fP] \"\\fITEXT\\fP\"");
+    seqan::addDescription(parser,
+        "This program allows simple character modifications to "
+        "each i-th character.");
+//![addUsageLine]
+
+//![addSection]
+    seqan::addSection(parser, "Modification Options");
+//![addSection]
+
+//![addListItem]
+    seqan::addTextSection(parser, "Examples");
+
+    seqan::addListItem(parser,
+        "\\fBmodify_string\\fP \\fB-U\\fP \\fIveryverylongword\\fP",
+        "Print upper case version of \"veryverylongword\"");
+    seqan::addListItem(parser,
+        "\\fBmodify_string\\fP \\fB-L\\fP \\fB-i\\fP \\fI3\\fP \\fIveryverylongword\\fP",
+        "Print \"veryverylongword\" with every third character "
+        "converted to upper case.");
+//![addListItem]
+
+    return 0;
+}
diff --git a/demos/tutorial/parsing_command_line_arguments/base.cpp.stdout b/demos/tutorial/parsing_command_line_arguments/base.cpp.stdout
new file mode 100644
index 0000000..e69de29
diff --git a/dox/CMakeLists.txt b/dox/CMakeLists.txt
index 90c8bbc..78c0597 100644
--- a/dox/CMakeLists.txt
+++ b/dox/CMakeLists.txt
@@ -51,8 +51,8 @@ if(NOT(${PYTHON_VERSION_MAJOR} MATCHES "2"))
     message (STATUS "Found Python 2.x: ${PYTHON_EXECUTABLE}")
 
     # change shell scripts for building dox
-    file(READ "${CMAKE_CURRENT_SOURCE_DIR}/../dox/run.sh" run_content)
-    file(READ "${CMAKE_CURRENT_SOURCE_DIR}/../dox/dox_only.sh" dox_only_content)
+    file(READ "${CMAKE_CURRENT_SOURCE_DIR}/../dox/run.sh.in" run_content)
+    file(READ "${CMAKE_CURRENT_SOURCE_DIR}/../dox/dox_only.sh.in" dox_only_content)
     string(REPLACE "python2 ../" "${PYTHON_EXECUTABLE} ../" run_content "${run_content}")
     string(REPLACE "python2 ../" "${PYTHON_EXECUTABLE} ../" dox_only_content "${dox_only_content}")
     file(WRITE "${CMAKE_CURRENT_SOURCE_DIR}/../dox/run.sh" "${run_content}")
diff --git a/dox/dox_only.sh b/dox/dox_only.sh.in
old mode 100755
new mode 100644
similarity index 100%
rename from dox/dox_only.sh
rename to dox/dox_only.sh.in
diff --git a/dox/run.sh b/dox/run.sh.in
old mode 100755
new mode 100644
similarity index 100%
rename from dox/run.sh
rename to dox/run.sh.in
diff --git a/include/seqan/align/dp_scout_simd.h b/include/seqan/align/dp_scout_simd.h
index bd5cf86..92095d2 100644
--- a/include/seqan/align/dp_scout_simd.h
+++ b/include/seqan/align/dp_scout_simd.h
@@ -107,10 +107,10 @@ public:
 
     inline void updateMasksBottom()
     {
-        for (auto pos : sortedEndsV)
+        for (auto posIt  = begin(sortedEndsV, Standard()); posIt != end(sortedEndsV, Standard()); ++posIt)
             for (auto it = nextEndsH; it != end(sortedEndsH, Standard()); ++it)
             {
-                masks[pos] |= (masksH[*it] & masksV[pos]);
+                masks[*posIt] |= (masksH[*it] & masksV[*posIt]);
             }
     }
 
diff --git a/include/seqan/arg_parse/arg_parse_argument.h b/include/seqan/arg_parse/arg_parse_argument.h
index e22d41f..95ebf88 100644
--- a/include/seqan/arg_parse/arg_parse_argument.h
+++ b/include/seqan/arg_parse/arg_parse_argument.h
@@ -219,60 +219,44 @@ public:
 
 inline std::string _typeToString(ArgParseArgument const & me)
 {
-    std::string typeName = "";
-
     switch (me._argumentType)
     {
-    case ArgParseArgument::BOOL:
-        typeName = "bool";
-        break;
+        case ArgParseArgument::BOOL:
+            return "bool";
 
-    case ArgParseArgument::DOUBLE:
-        typeName = "double";
-        break;
+        case ArgParseArgument::DOUBLE:
+            return "double";
 
-    case ArgParseArgument::INTEGER:
-        typeName = "integer";
-        break;
+        case ArgParseArgument::INTEGER:
+            return "integer";
 
-    case ArgParseArgument::INT64:
-        typeName = "int64";
-        break;
+        case ArgParseArgument::INT64:
+            return "int64";
 
-    case ArgParseArgument::STRING:
-        typeName = "string";
-        break;
+        case ArgParseArgument::STRING:
+            return "string";
 
-    case ArgParseArgument::INPUT_FILE:
-        typeName = "input_file";
-        break;
+        case ArgParseArgument::INPUT_FILE:
+            return "input_file";
 
-    case ArgParseArgument::OUTPUT_FILE:
-        typeName = "output_file";
-        break;
+        case ArgParseArgument::OUTPUT_FILE:
+            return "output_file";
 
-    case ArgParseArgument::INPUT_PREFIX:
-        typeName = "input_prefix";
-        break;
+        case ArgParseArgument::INPUT_PREFIX:
+            return "input_prefix";
 
-    case ArgParseArgument::OUTPUT_PREFIX:
-        typeName = "output_prefix";
-        break;
+        case ArgParseArgument::OUTPUT_PREFIX:
+            return "output_prefix";
 
-    case ArgParseArgument::INPUT_DIRECTORY:
-        typeName = "input_directory";
-        break;
+        case ArgParseArgument::INPUT_DIRECTORY:
+            return "input_directory";
 
-    case ArgParseArgument::OUTPUT_DIRECTORY:
-        typeName = "output_directory";
-        break;
+        case ArgParseArgument::OUTPUT_DIRECTORY:
+            return "output_directory";
 
-    default:
-        typeName = "unknown";
-        break;
+        default:
+            return "unknown";
     }
-
-    return typeName;
 }
 
 // ----------------------------------------------------------------------------
diff --git a/include/seqan/arg_parse/arg_parse_ctd_support.h b/include/seqan/arg_parse/arg_parse_ctd_support.h
index 9442815..532cddd 100644
--- a/include/seqan/arg_parse/arg_parse_ctd_support.h
+++ b/include/seqan/arg_parse/arg_parse_ctd_support.h
@@ -165,8 +165,14 @@ _getRestrictions(std::vector<std::string> & restrictions, ArgParseArgument const
 {
     // we only extract non-file restrictions
     if (isOutputFileArgument(opt) || isInputFileArgument(opt) || isInputPrefixArgument(opt) || isOutputPrefixArgument(opt))
+    {
         return;
-
+    }
+    else if (isBooleanArgument(opt))
+    {
+        appendValue(restrictions, "true,false");
+        return;
+    }
     if (length(opt.validValues) != 0)
     {
         for (std::vector<std::string>::const_iterator valid = opt.validValues.begin();
@@ -281,6 +287,50 @@ inline std::string _getManual(ArgumentParser const & me)
 }
 
 // ----------------------------------------------------------------------------
+// Function _toValidGKNTypeSpecifier()
+// ----------------------------------------------------------------------------
+// TODO(dadi): similar to  _typeToString() function. Differs only in the case of bool, integer, int64 and types
+//.            that has underscores in them. hyphens are used instead of underscores. e.g. input-file instead
+//             of input_file. This should be removed and _typeToString() should be used instead once GKN is
+//             modified to accept the results of _typeToString() functions directly.
+
+inline std::string _toValidGKNTypeSpecifier(ArgParseArgument const & me)
+{
+    switch (me._argumentType)
+    {
+        case ArgParseArgument::BOOL:
+            return "string";
+
+        case ArgParseArgument::INTEGER:
+            return "int";
+
+        case ArgParseArgument::INT64:
+            return "int";
+
+        case ArgParseArgument::INPUT_FILE:
+            return "input-file";
+
+        case ArgParseArgument::OUTPUT_FILE:
+            return "output-file";
+
+        case ArgParseArgument::INPUT_PREFIX:
+            return "input-prefix";
+
+        case ArgParseArgument::OUTPUT_PREFIX:
+            return "output-prefix";
+
+        case ArgParseArgument::INPUT_DIRECTORY:
+            return "input-prefix";
+
+        case ArgParseArgument::OUTPUT_DIRECTORY:
+            return "output-prefix";
+
+        default:
+            return _typeToString(me);
+    }
+}
+
+// ----------------------------------------------------------------------------
 // Function writeCTD()
 // ----------------------------------------------------------------------------
 
@@ -391,7 +441,7 @@ writeCTD(ArgumentParser const & me, std::ostream & ctdfile)
         // prefer short name for options
         std::string optionName = _getOptionName(opt);
 
-        std::string type = _typeToString(opt);
+        std::string type = _toValidGKNTypeSpecifier(opt);
 
         // set up restrictions
         std::vector<std::string> restrictions;
@@ -464,7 +514,7 @@ writeCTD(ArgumentParser const & me, std::ostream & ctdfile)
         argumentNameStream << "argument-" << argIdx;
         std::string optionName = argumentNameStream.str();
 
-        std::string type = _typeToString(arg);
+        std::string type = _toValidGKNTypeSpecifier(arg);
 
         // set up restrictions
         std::vector<std::string> restrictions;
diff --git a/include/seqan/arg_parse/arg_parse_version_check.h b/include/seqan/arg_parse/arg_parse_version_check.h
index 5a1f7cd..bb10cc8 100644
--- a/include/seqan/arg_parse/arg_parse_version_check.h
+++ b/include/seqan/arg_parse/arg_parse_version_check.h
@@ -109,6 +109,7 @@ struct VersionCheck
     std::string _program;
     std::string _command;
     std::string _path = _getPath();
+    std::string _timestamp_filename;
     std::ostream & errorStream;
 
     // ----------------------------------------------------------------------------
@@ -122,6 +123,11 @@ struct VersionCheck
         errorStream(errorStream)
     {
         std::smatch versionMatch;
+#if defined(NDEBUG) || defined(SEQAN_TEST_VERSION_CHECK_)
+        _timestamp_filename = _path + "/" + _name + "_usr.timestamp";
+#else
+        _timestamp_filename = _path + "/" + _name + "_dev.timestamp";
+#endif
         if (!version.empty() &&
             std::regex_search(version, versionMatch, std::regex("^([[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+).*")))
         {
@@ -318,11 +324,11 @@ inline std::string _getPath()
 // Function _getFileTimeDiff()
 // ----------------------------------------------------------------------------
 
-inline double _getFileTimeDiff(std::string const & timestamp_filename)
+inline double _getFileTimeDiff(VersionCheck const & me)
 {
     double curr = static_cast<double>(std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch()).count());
     std::ifstream timestamp_file;
-    timestamp_file.open(timestamp_filename.c_str());
+    timestamp_file.open(me._timestamp_filename.c_str());
 
     if (timestamp_file.is_open())
     {
@@ -390,8 +396,7 @@ inline void _readVersionStrings(std::vector<std::string> & versions, std::string
 inline void _callServer(VersionCheck const me, std::promise<bool> prom)
 {
     // update timestamp
-    std::string timestamp_filename(me._path + "/" + me._name + ".timestamp");
-    std::ofstream timestamp_file(timestamp_filename.c_str());
+    std::ofstream timestamp_file(me._timestamp_filename.c_str());
     if (timestamp_file.is_open())
     {
         timestamp_file << std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch()).count();
@@ -419,9 +424,8 @@ inline void _checkForNewerVersion(VersionCheck & me, std::promise<bool> prom)
     }
 
     std::string version_filename(me._path + "/" + me._name + ".version");
-    std::string timestamp_filename(me._path + "/" + me._name + ".timestamp");
     double min_time_diff(86400);                                 // one day = 86400 seonds
-    double file_time_diff(_getFileTimeDiff(timestamp_filename)); // time difference in seconds
+    double file_time_diff(_getFileTimeDiff(me)); // time difference in seconds
 
     if (file_time_diff < min_time_diff)
     {
@@ -447,18 +451,20 @@ inline void _checkForNewerVersion(VersionCheck & me, std::promise<bool> prom)
         me.errorStream << VersionControlTags_<>::MESSAGE_UNREGISTERED_APP;
 #endif
 
-#if defined(NDEBUG) || defined(SEQAN_TEST_VERSION_CHECK_) // only check app version in release or testing mode
     if (!str_server_versions[0].empty() & !(str_server_versions[0] == VersionControlTags_<>::UNREGISTERED_APP)) // app version
     {
         Lexical<> version_comp(_getNumbersFromString(me._version), _getNumbersFromString(str_server_versions[0]));
 
+#if defined(NDEBUG) || defined(SEQAN_TEST_VERSION_CHECK_) // only check app version in release or testing mode
         if (isLess(version_comp))
             me.errorStream << VersionControlTags_<>::MESSAGE_APP_UPDATE;
+#endif // defined(NDEBUG) || defined(SEQAN_TEST_VERSION_CHECK_)
 
-        else if (isGreater(version_comp))
+#if !defined(NDEBUG) || defined(SEQAN_TEST_VERSION_CHECK_) // only notify developer that app version should be updated on server
+        if (isGreater(version_comp))
             me.errorStream << VersionControlTags_<>::MESSAGE_REGISTERED_APP_UPDATE;
+#endif // !defined(NDEBUG) || defined(SEQAN_TEST_VERSION_CHECK_)
     }
-#endif // defined(NDEBUG) || defined(SEQAN_TEST_VERSION_CHECK_)
 
     if (me._program.empty())
     {
diff --git a/include/seqan/index/index_bidirectional_stree.h b/include/seqan/index/index_bidirectional_stree.h
index 8db53f4..9f14588 100644
--- a/include/seqan/index/index_bidirectional_stree.h
+++ b/include/seqan/index/index_bidirectional_stree.h
@@ -218,7 +218,7 @@ inline bool goDown(Iter<Index<TText, BidirectionalIndex<TIndexSpec> >, VSTree<To
 {
     if (goDown(_iter(it, Fwd())))
     {
-        update(it, Fwd());
+        _update(it, Fwd());
         return true;
     }
     return false;
@@ -229,7 +229,7 @@ inline bool goDown(Iter<Index<TText, BidirectionalIndex<TIndexSpec> >, VSTree<To
 {
     if (goDown(_iter(it, Rev())))
     {
-        update(it, Rev());
+        _update(it, Rev());
         return true;
     }
     return false;
@@ -253,7 +253,7 @@ _goDownObject(
 {
     if (_goDownChar(_iter(it, TDirection()), obj))
     {
-        update(it, TDirection());
+        _update(it, TDirection());
         return true;
     }
     return false;
@@ -349,7 +349,7 @@ inline bool goRight(Iter<Index<TText, BidirectionalIndex<TIndexSpec> >, VSTree<T
 {
     if (goRight(_iter(it, Tag<TDirection>())))
     {
-        update(it, Tag<TDirection>());
+        _updateOnGoRight(it, Tag<TDirection>());
         return true;
     }
     return false;
diff --git a/include/seqan/index/index_bifm_stree.h b/include/seqan/index/index_bifm_stree.h
index 9fea578..089f70d 100644
--- a/include/seqan/index/index_bifm_stree.h
+++ b/include/seqan/index/index_bifm_stree.h
@@ -44,25 +44,31 @@ namespace seqan {
 // ============================================================================
 
 template <typename TText, typename TOccSpec, typename TIndexSpec, typename TSpec, typename TDirection>
-inline void update(Iter<Index<TText, BidirectionalIndex<FMIndex<TOccSpec, TIndexSpec> > >, VSTree<TopDown<TSpec> > > & it, TDirection)
+inline void _update(Iter<Index<TText, BidirectionalIndex<FMIndex<TOccSpec, TIndexSpec> > >, VSTree<TopDown<TSpec> > > & it, TDirection)
 {
     typedef typename IfC<IsSameType<TDirection, Tag<BidirectionalFwd_> >::VALUE, Rev, Fwd>::Type TOppositeDirection;
 
-    typedef typename IfC<IsSameType<TDirection, Tag<BidirectionalFwd_> >::VALUE, TText, typename RevTextFibre<TText>::Type>::Type TDirText;
-    typedef typename IfC<IsSameType<TDirection, Tag<BidirectionalFwd_> >::VALUE, typename RevTextFibre<TText>::Type, TText>::Type TOppDirText;
-
-    typedef Iter<Index<TDirText, FMIndex<TOccSpec, TIndexSpec> >, VSTree<TopDown<TSpec> > > TDirIter;
-    typedef Iter<Index<TOppDirText, FMIndex<TOccSpec, TIndexSpec> >, VSTree<TopDown<TSpec> > > TOppDirIter;
-
     _historyPush(_iter(it, TOppositeDirection()));
 
-    TDirIter & dirIter = _iter(it, TDirection());
-    TOppDirIter & oppDirIter = _iter(it, TOppositeDirection());
+    auto & dirIter = _iter(it, TDirection());
+    auto & oppDirIter = _iter(it, TOppositeDirection());
 
     value(oppDirIter).range.i1 += value(dirIter).smaller;
     value(oppDirIter).range.i2 = value(oppDirIter).range.i1 + value(dirIter).range.i2 - value(dirIter).range.i1;
 
-    value(oppDirIter).repLen = value(dirIter).repLen; // do not increment in case of goRight
+    value(oppDirIter).repLen = value(dirIter).repLen;
+}
+
+template <typename TText, typename TOccSpec, typename TIndexSpec, typename TSpec, typename TDirection>
+inline void _updateOnGoRight(Iter<Index<TText, BidirectionalIndex<FMIndex<TOccSpec, TIndexSpec> > >, VSTree<TopDown<TSpec> > > & it, TDirection)
+{
+    typedef typename IfC<IsSameType<TDirection, Tag<BidirectionalFwd_> >::VALUE, Rev, Fwd>::Type TOppositeDirection;
+
+    auto & dirIter = _iter(it, TDirection());
+    auto & oppDirIter = _iter(it, TOppositeDirection());
+
+    value(oppDirIter).range.i1 = nodeUp(oppDirIter).range.i1 + value(dirIter).smaller;
+    value(oppDirIter).range.i2 = value(oppDirIter).range.i1 + value(dirIter).range.i2 - value(dirIter).range.i1;
 }
 
 template <typename TText, typename TOccSpec, typename TIndexSpec, typename TSpec, typename TString, typename TSize, typename TDirection>
@@ -92,7 +98,7 @@ _goDownString(Iter<Index<TText, BidirectionalIndex<FMIndex<TOccSpec, TIndexSpec>
 
         value(_iter(it, TDirection())).range = _range;
         value(_iter(it, TDirection())).smaller = _smaller;
-        update(it, TDirection());
+        _update(it, TDirection());
     }
 
     value(_iter(it, Fwd())).repLen += lcp;
diff --git a/include/seqan/journaled_string_tree/journaled_string_tree_impl.h b/include/seqan/journaled_string_tree/journaled_string_tree_impl.h
index 6dfb9e9..1795f3c 100644
--- a/include/seqan/journaled_string_tree/journaled_string_tree_impl.h
+++ b/include/seqan/journaled_string_tree/journaled_string_tree_impl.h
@@ -612,6 +612,7 @@ insert(JournaledStringTree<TSequence, TConfig, TSpec> & jst,
     forEach(ids,[&jst, &coverage](TID seqId)
     {
         SEQAN_ASSERT_LT(static_cast<TSize>(seqId), length(jst));  // Check that id is valid.
+        ignoreUnusedVariableWarning(jst);
         coverage[seqId] = true;
     });
 
diff --git a/include/seqan/seq_io/sequence_file.h b/include/seqan/seq_io/sequence_file.h
index 78e018b..9be397a 100644
--- a/include/seqan/seq_io/sequence_file.h
+++ b/include/seqan/seq_io/sequence_file.h
@@ -89,18 +89,22 @@ typedef
     TagList<Embl,
     TagList<GenBank,
     TagList<Raw,
-    TagList<Bam,
     TagList<Sam
-    > > > > > > >
+#if SEQAN_HAS_ZLIB
+    , TagList<Bam>
+#endif
+    > > > > > >
     SeqInFormats;
 
 typedef
     TagList<Fastq,
     TagList<Fasta,
     TagList<Raw,
-    TagList<Bam,
     TagList<Sam
-    > > > > >
+#if SEQAN_HAS_ZLIB
+    , TagList<Bam>
+#endif
+    > > > >
     SeqOutFormats;
 
 typedef TagSelector<SeqInFormats>   SeqInFormat;
diff --git a/include/seqan/version.h b/include/seqan/version.h
index 7af0b73..7716422 100644
--- a/include/seqan/version.h
+++ b/include/seqan/version.h
@@ -41,7 +41,7 @@
 
 #define SEQAN_VERSION_MINOR 3
 
-#define SEQAN_VERSION_PATCH 1
+#define SEQAN_VERSION_PATCH 2
 
 #define SEQAN_VERSION_PRE_RELEASE 0
 
diff --git a/manual/source/Infrastructure/Use/CustomBuildSystem.rst b/manual/source/Infrastructure/Use/CustomBuildSystem.rst
index 47938c2..b6d1423 100644
--- a/manual/source/Infrastructure/Use/CustomBuildSystem.rst
+++ b/manual/source/Infrastructure/Use/CustomBuildSystem.rst
@@ -45,9 +45,9 @@ GNU/Linux
 
 Add ``-lrt -lpthread`` to the compiler call.
 
-Note static linking against pthread might cause issues on some linux distributions.
+Note static linking against pthread might cause issues on some linux distributions, especially with gcc-4.9.
 In this case you need to explicitly link against the whole archive like: ``-Wl,--whole-archive -lpthread -Wl,--no-whole-archive``.
-You can read more about this issue `here <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52590>`_.
+Or just use a more recent version of gcc!
 
 BSD
 ^^^
diff --git a/manual/source/Infrastructure/Use/FindSeqAnCMake.rst b/manual/source/Infrastructure/Use/FindSeqAnCMake.rst
index 8e5dc78..3ae1d83 100644
--- a/manual/source/Infrastructure/Use/FindSeqAnCMake.rst
+++ b/manual/source/Infrastructure/Use/FindSeqAnCMake.rst
@@ -77,26 +77,45 @@ First you should create a build directory, i.e. for cmake-builds everything happ
    # mkdir -p ~/devel/my_project-build/release
    # cd ~/devel/my_project-build/release
 
-By default, the ``cmake`` program will look for ``seqan-config.cmake`` in a predefined set of directories.
-Please read the documentation `find_project <https://cmake.org/cmake/help/v3.0/command/find_package.html>`_ to find out, which standard paths are searched.
-Depending on how you :ref:`installed SeqAn <infra-use-install>` it might be found by cmake automatically. 
-If not, you have to give the path containing the config file to cmake via the ``SeqAn_DIR`` argument on the command line, or you add the installation prefix of ``SeqAn`` via the ``CMAKE_PREFIX_PATH`` variable.
+Cmake supports two different modes to load settings from an external project: The **module** and the **config** mode. 
+Please read the `cmake documentation <https://cmake.org/cmake/help/v3.0/command/find_package.html>`_ to learn more about this feature.
 
-Also, CMake will look for the SeqAn include files in central locations such as ``/usr/local/include``. Again, depending on your installation this might *just work*. If not, you need to specify the location via the ``SEQAN_INCLUDE_PATH`` argument.
+Install SeqAn from package maintainer
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-When using operating system packages of SeqAn and the default compiler it might look like this:
+The recommended way for SeqAn 2.3 or newer is to use the config mode. 
+If you installed/updated SeqAn from one of the downstream package maintainer listed in :ref:`Getting Started with SeqAn <infra-use-install>`, then a file called ``seqan-config.cmake`` was installed in a system path that is automatically searched by the cmake system (see the cmake documentation for `find_package <https://cmake.org/cmake/help/v3.0/command/find_package.html>`_).
+If everything was done with default settings, than you can simply build your project like:
 
 .. code-block:: console
-
+   
    # cmake ../../my_project
 
-If you instead did a full git checkout to your home-directory in the previous step, it might look like this:
+Install SeqAn into user defined prefix or clone from GitHub
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In case you obtained SeqAn from a git clone, or installed SeqAn into a user defined location, you need to specify the install location by setting the ``CMAKE_PREFIX_PATH`` in your cmake call.
+In addition you also have to specify the ``SEQAN_INCLUDE_PATH`` variable to find the SeqAn headers. 
+Assume you have cloned SeqAn into ``~/devel/seqan``, then your setup could look as the following:
 
 .. code-block:: console
+   
+   # cmake ../../my_project \
+      -DCMAKE_PREFIX_PATH="$HOME/devel/seqan/util/cmake" \
+      -DSEQAN_INCLUDE_PATH="$HOME/devel/seqan/include"
+
+Backwards compatibility
+~~~~~~~~~~~~~~~~~~~~~~~
 
+Before SeqAn 2.3 we used the module mode to setup SeqAn as an external project.
+To allow backwards compatibility we added a redirect from the ``FindSeqAn.cmake`` to ``seqan-config.cmake`` in our sources.
+In this case configuing your project with the old approach using the ``CMAKE_MODULE_PATH`` variable, will still work:
+
+.. code-block:: console
+   
    # cmake ../../my_project \
-       -DCMAKE_MODULE_PATH=~/devel/seqan/util/cmake \
-       -DSEQAN_INCLUDE_PATH=~/devel/seqan/include
+      -DCMAKE_MODULE_PATH="$HOME/devel/seqan/util/cmake" \
+      -DSEQAN_INCLUDE_PATH="$HOME/devel/seqan/include"
 
 .. tip::
 
@@ -249,3 +268,8 @@ Required additions to C++ compiler flags are in the following variable:
   .. caution::
 
     Please note that these variables include whatever has been added by the dependencies mentioned above so **do not add** e.g. ``${OpenMP_CXX_FLAGS}`` yourself!
+
+Static builds
+^^^^^^^^^^^^^
+
+If you want to build your app statically, please do not use gcc-4.9 or make sure you add the ``-static`` flag **before** calling ``find_package (SeqAn)``. Otherwise a broken binary will be built that crashes immediately.
diff --git a/manual/source/Tutorial/GettingStarted/ParsingCommandLineArguments.rst b/manual/source/Tutorial/GettingStarted/ParsingCommandLineArguments.rst
index 80cc333..1ec9471 100644
--- a/manual/source/Tutorial/GettingStarted/ParsingCommandLineArguments.rst
+++ b/manual/source/Tutorial/GettingStarted/ParsingCommandLineArguments.rst
@@ -73,16 +73,22 @@ For example, we can already let the program generate an online help:
    SYNOPSIS
 
    DESCRIPTION
+
+   REQUIRED ARGUMENTS
+       TEXT STRING
+
+   OPTIONS
        -h, --help
-	     Displays this help message.
-       -i, --period INT
-	     Period to use for the index.
+             Display the help message.
+       -i, --period INTEGER
+             Period to use for the index.
        -U, --uppercase
-	     Select to-uppercase as operation.
+             Select to-uppercase as operation.
 
    VERSION
+       Last update:
        modify_string version:
-       Last update
+       SeqAn version: 2.3.1
 
 While already informative, the help screen looks like there is something missing.
 For example, there is no synopsis, no version and no date of the last update given.
@@ -323,15 +329,8 @@ Of course, this only works with integer- and double-typed command line options.
 We can pass both the short and the long option name to these functions.
 The value is given as a string and parsed the same as parameters on the command line.
 
-.. code-block:: cpp
-
-   seqan::ArgumentParser parser("modify_string");
-   addOption(parser, seqan::ArgParseOption(
-       "i", "integer-value", "An integer option",
-       seqan::ArgParseArgument::INTEGER, "INT"));
-
-   setMinValue(parser, "i", "10");
-   setMaxValue(parser, "integer-value", "20");
+.. includefrags:: demos/tutorial/parsing_command_line_arguments/base.cpp
+      :fragment: setMinMax
 
 Assignment 4
 """"""""""""
@@ -356,14 +355,8 @@ Marking Options as Required
 
 We can mark options as being required using the function :dox:`ArgumentParser#setRequired`:
 
-.. code-block:: cpp
-
-   seqan::ArgumentParser parser("modify_string");
-   addOption(parser, seqan::ArgParseOption(
-       "i", "integer-value", "An integer option",
-       seqan::ArgParseArgument::INTEGER, "INT"));
-
-   setRequired(parser, "i");
+.. includefrags:: demos/tutorial/parsing_command_line_arguments/base.cpp
+      :fragment: setRequired
 
 Setting List of Valid Values
 """"""""""""""""""""""""""""
@@ -372,14 +365,8 @@ Sometimes, it is useful to give a list of valid values for a command line option
 You can give it as a space-separated list in a string to :dox:`ArgumentParser#setValidValues`.
 The check whether the value from the command line is valid is case sensitive.
 
-.. code-block:: cpp
-
-    seqan::ArgumentParser parser("modify_string");
-    addOption(parser, seqan::ArgParseOption(
-        "", "distance-model", "Distance model, either HAMMING or EDIT.",
-        seqan::ArgParseArgument::STRING, "STR"));
-
-    setValidValues(parser, "distance-model", "HAMMING EDIT");
+.. includefrags:: demos/tutorial/parsing_command_line_arguments/base.cpp
+      :fragment: setValidValues
 
 More Option and Argument Types
 ------------------------------
@@ -400,32 +387,21 @@ However, there are two special argument/option types ``ArgParseArgument::INPUT_F
 
 Here is an example for defining input and output file arguments:
 
-.. code-block:: cpp
-
-   addOption(parser, seqan::ArgParseOption(
-       "I", "input-file", "Path to the input file",
-       seqan::ArgParseArgument::INPUT_FILE, "IN"));
-   addOption(parser, seqan::ArgParseOption(
-       "O", "output-file", "Path to the output file",
-       seqan::ArgParseArgument::OUTPUT_FILE, "OUT"));
+.. includefrags:: demos/tutorial/parsing_command_line_arguments/base.cpp
+      :fragment: addFileOption
 
 The restrictions are added by defining the expected file extension.
 
-.. code-block:: cpp
-
-   setValidValues(parser, "input-file", "txt");
-   setValidValues(parser, "output-file", "txt");
+.. includefrags:: demos/tutorial/parsing_command_line_arguments/base.cpp
+      :fragment: addFileExtension
 
 Again multiple values are provided as space-separated list.
 Note that the file ending check is case insensitive, so you do not need to provide ``txt`` and ``TXT``.
 
 You can simply read the values of these options as you would read string options:
 
-.. code-block:: cpp
-
-    seqan::CharString inputFileName, outputFileName;
-    seqan::getOptionValue(inputFileName, parser, "input-file");
-    seqan::getOptionValue(outputFileName, parser, "output-file");
+.. includefrags:: demos/tutorial/parsing_command_line_arguments/base.cpp
+      :fragment: readFile
 
 
 Assignment 5
@@ -455,12 +431,8 @@ Tuples
 We can define an :dox:`ArgParseArgument` and :dox:`ArgParseOption` to be a tuple with a fixed number of arguments.
 For example, an integer pair (tuple with two entries) could describe a range:
 
-.. code-block:: cpp
-
-   addOption(parser, seqan::ArgParseOption(
-       "r", "range", "The range to modify.",
-       seqan::ArgParseArgument::INTEGER, "BEGIN END",
-       false, 2));
+.. includefrags:: demos/tutorial/parsing_command_line_arguments/base.cpp
+      :fragment: tupleOption
 
 We add two parameters after the label ``"BEGIN END"`` for the documentation.
 First, we specify that the option is not a list option (``false``) and second, that we need exactly two numbers for it.
@@ -473,11 +445,8 @@ The user can now use the parameter as follows:
 
 We use the four-parameter variant with an integer index of :dox:`ArgumentParser#getOptionValue` to access the entries in the tuple given on the command line.
 
-.. code-block:: cpp
-
-    unsigned rangeBegin = 0, rangeEnd = 0;
-    getOptionValue(rangeBegin, parser, "range", 0);
-    getOptionValue(rangeEnd, parser, "range", 1);
+.. includefrags:: demos/tutorial/parsing_command_line_arguments/base.cpp
+      :fragment: getTupleValue
 
 Assignment 6
 """"""""""""
@@ -510,22 +479,14 @@ You can set the short description, the version string, date, synopsis and add te
 Let us first set the **short description**, **version string**, and **date** in our program from above.
 We insert the following lines just after the declaration of the variable ``parser``.
 
-.. code-block:: cpp
-
-   setShortDescription(parser, "String Modifier");
-   setVersion(parser, "1.0");
-   setDate(parser, "July 2012");
+.. includefrags:: demos/tutorial/parsing_command_line_arguments/base.cpp
+      :fragment: setVersion
 
 After the line with ``setDate()``, we give a usage line and add to the description.
 This information will go to the Synopsis section of the program help.
 
-.. code-block:: cpp
-
-   addUsageLine(parser,
-		"[\\fIOPTIONS\\fP] \"\\fITEXT\\fP\"");
-   addDescription(parser,
-		  "This program allows simple character modifications to "
-		  "each i-th character.");
+.. includefrags:: demos/tutorial/parsing_command_line_arguments/base.cpp
+      :fragment: addUsageLine
 
 .. tip::
 
@@ -547,24 +508,14 @@ The argument parser will add some options of its own, for example for printing t
 To separate our arguments from the autogenerated ones, we add the following line.
 This line will introduce the section "Modification Options" in the Description section of the output.
 
-.. code-block:: cpp
-
-   addSection(parser, "Modification Options");
+.. includefrags:: demos/tutorial/parsing_command_line_arguments/base.cpp
+      :fragment: addSection
 
 Finally, we will add a section with examples.
 Add the following lines just before the line with the ``parse()`` function call.
 
-.. code-block:: cpp
-
-   addTextSection(parser, "Examples");
-
-   addListItem(parser,
-	       "\\fBmodify_string\\fP \\fB-U\\fP \\fIveryverylongword\\fP",
-	       "Print upper case version of \"veryverylongword\"");
-   addListItem(parser,
-	       "\\fBmodify_string\\fP \\fB-L\\fP \\fB-i\\fP \\fI3\\fP \\fIveryverylongword\\fP",
-	       "Print \"veryverylongword\" with every third character "
-	       "converted to upper case.");
+.. includefrags:: demos/tutorial/parsing_command_line_arguments/base.cpp
+      :fragment: addListItem
 
 That were a lot of changes!
 Click **more...** to see the complete program.
@@ -590,29 +541,33 @@ Simply call the new program with the ``--help`` option.
        This program allows simple character modifications to each
        i-th character.
 
+   REQUIRED ARGUMENTS
+       TEXT STRING
+
+   OPTIONS
        -h, --help
-	     Displays this help message.
+             Display the help message.
        --version
-	     Display version information
+             Display version information.
 
      Modification Options:
-       -i, --period INT
-	     Period to use for the index.
+       -i, --period INTEGER
+             Period to use for the index. Default: 1.
        -U, --uppercase
-	     Select to-uppercase as operation.
+             Select to-uppercase as operation.
        -L, --lowercase
-	     Select to-lowercase as operation.
+             Select to-lowercase as operation.
 
    EXAMPLES
        modify_string -U veryverylongword
-	     Print upper case version of "veryverylongword"
+             Print upper case version of "veryverylongword"
        modify_string -L -i 3 veryverylongword
-	     Print "veryverylongword" with every third character
-	     converted to upper case.
+             Print "veryverylongword" with every third character converted to upper case.
 
    VERSION
+       Last update: July 2012
        modify_string version: 1.0
-       Last update July 2012
+       SeqAn version: 2.3.1
 
 Also, there is an undocumented option called ``--export-help`` that is automatically added by :dox:`ArgumentParser`.
 You can call it with the values ``html`` and ``man``.
@@ -639,3 +594,75 @@ Below, you can see a part of the rendered HTML and man pages generated by the co
 .. image:: modify_string.png
 
 For further deading, have a look at the :dox:`ArgumentParser` class.
+
+The Version Update Feature
+--------------------------
+
+With the seqan-2.3.0 release applications, using the :dox:`ArgumentParser`, check SeqAn servers for version updates. The functionality helps getting new versions out to users faster. It is also used to inform application developers of new versions of the SeqAn library which means that applications ship with less bugs.
+
+Customized Messages
+"""""""""""""""""""
+The version information you receive depends on whether you are an application user or developer.
+We differentiate this by inquiring the ``NDEBUG`` (no debug) macro.
+
+#. Case: ``NDEBUG`` **is set**. Its the default in our application and represents that you ara a user.
+The only message you will eventually encounter is the following:
+
+.. code-block:: console
+
+    [APP INFO] :: There is a newer version of this application available.
+    [APP INFO] :: If this app is developed by SeqAn, visit www.seqan.de for updates.
+    [APP INFO] :: If you don't want to recieve this message again set --version_check OFF
+
+#. Case: ``NDEBUG`` **is NOT set**. If you build one of our application or your own one in debug mode, we will consider you as a developer.
+Therefore we will inform you whenever a new library version is available:
+
+.. code-block:: console
+
+    [SEQAN INFO] :: There is a newer SeqAn version available!
+    [SEQAN INFO] :: Please visit www.seqan.de for an update or inform the developer of this app.
+    [SEQAN INFO] :: If you don't want to recieve this message again set --version-check OFF
+
+  If you are working on your own application, using the SeqAn ArgumentParser, we will inform you about the possibility to register your application with us. This will make the distribution of your application version simple and convenient.
+
+.. code-block:: console
+
+    [SEQAN INFO] :: Thank you for using SeqAn!
+    [SEQAN INFO] :: You might want to regsiter you app for support and version check features?
+    [SEQAN INFO] :: Just send us an email to seqan at team.fu-berlin.de with your app name and version number.
+    [SEQAN INFO] :: If you don't want to recieve this message anymore set --version_check OFF
+  
+
+The information we do (not) collect
+"""""""""""""""""""""""""""""""""""
+The process of checking for a new version happens at most once a day and takes at most three seconds enforced by an internal timeout.
+
+.. note::
+
+    The runtime of your application might be slightly affected by the process of checkng the version. 
+    You might want to temporarily switch off the option while doing sensible performance measurements (``--version-check OFF``).
+
+The following information is transmitted to the servers solely via the URL:
+
+  * The application name and its version
+  * The SeqAn version that the application was built with
+  * The operating system type (Linux, macOS, Windows or BSD)
+  * The CPU type (32 or 64bit)
+
+The purpose of this transmission is to provide accurate update data for your app.
+Beyond the update information, we may count the total number of version requests and may also resolve them to geographical regions.
+This may be used for anonymized analysis by the SeqAn team, but raw data is never shared with third parties.
+
+.. attention::
+
+    There is no form of user identification and no tracking. 
+    IP-Addresses are never stored permanently. 
+    SeqAn collects no information regarding your use of the application, like selected options or arguments provided, and of course no information on your files!
+
+Disable this feature any time you want
+""""""""""""""""""""""""""""""""""""""
+If you still feel uncomfortable with the version check, you may
+
+  * disable it at run-time simply by setting ``--version-check OFF`` or
+  * rebuild the application and specify ``-DCMAKE_CXX_ARGS="-DSEQAN_VERSION_CHECK_OPT_IN=YES"`` to change the default value of ``--version-check to OFF`` or even
+  * rebuild the application and specify ``-DCMAKE_CXX_ARGS="-DSEQAN_DISABLE_VERSION_CHECK=YES"`` to completely remove all codepaths related to this feature.
diff --git a/tests/arg_parse/test_app.ctd b/tests/arg_parse/test_app.ctd
index 6d60e25..f4346e2 100644
--- a/tests/arg_parse/test_app.ctd
+++ b/tests/arg_parse/test_app.ctd
@@ -9,6 +9,9 @@ The second one contains formating <bla>.
 		<clielement optionIdentifier="--full-help" isList="false">
 			<mapping referenceName="test_app.full-help" />
 		</clielement>
+		<clielement optionIdentifier="--bool" isList="false">
+			<mapping referenceName="test_app.bool" />
+		</clielement>
 		<clielement optionIdentifier="--double" isList="false">
 			<mapping referenceName="test_app.double" />
 		</clielement>
@@ -53,20 +56,21 @@ The second one contains formating <bla>.
 	<PARAMETERS version="1.6.2" xsi:noNamespaceSchemaLocation="http://open-ms.sourceforge.net/schemas/Param_1_6_2.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 		<NODE name="test_app" description="This is a test-app.">
 			<ITEM name="full-help" value="false" type="string" description="Display the help message with advanced options." restrictions="true,false" required="false" advanced="false" />
+			<ITEM name="bool" value="" type="string" description="set a bool option" restrictions="true,false" required="false" advanced="false" />
 			<ITEM name="double" value="" type="double" description="set a double option" required="false" advanced="false" />
-			<ITEM name="integer" value="" type="integer" description="set an integer option" restrictions="1:10" required="false" advanced="false" />
-			<ITEM name="int64" value="" type="int64" description="set a 64 bit integer option" required="false" advanced="false" />
+			<ITEM name="integer" value="" type="int" description="set an integer option" restrictions="1:10" required="false" advanced="false" />
+			<ITEM name="int64" value="" type="int" description="set a 64 bit integer option" required="false" advanced="false" />
 			<ITEMLIST name="string" type="string" description="set a string option" restrictions="a,b,c" required="false" advanced="false" >
 			</ITEMLIST>
-			<ITEM name="in" value="" type="input_file" description="set an input file" supported_formats="*.fasta" required="false" advanced="false" />
-			<ITEM name="out" value="" type="output_file" description="set an output file" supported_formats="*.sam" required="false" advanced="false" />
-			<ITEM name="input-prefix-option" value="" type="input_prefix" description="set an input prefix" supported_formats="*.btx" required="false" advanced="false" />
-			<ITEM name="output-prefix-option" value="" type="output_prefix" description="set an output prefix" supported_formats="*.blub" required="false" advanced="false" />
+			<ITEM name="in" value="" type="input-file" description="set an input file" supported_formats="*.fasta" required="false" advanced="false" />
+			<ITEM name="out" value="" type="output-file" description="set an output file" supported_formats="*.sam" required="false" advanced="false" />
+			<ITEM name="input-prefix-option" value="" type="input-prefix" description="set an input prefix" supported_formats="*.btx" required="false" advanced="false" />
+			<ITEM name="output-prefix-option" value="" type="output-prefix" description="set an output prefix" supported_formats="*.blub" required="false" advanced="false" />
 			<ITEM name="advanced" value="" type="string" description="an advanced option - will appear as advanced in the ctd, too" required="false" advanced="true" />
 			<ITEM name="argument-0" value="" type="double" description="Double Argument" required="true" advanced="false" />
 			<ITEM name="argument-1" value="" type="string" description="String Argument" required="true" advanced="false" />
 			<ITEM name="argument-2" value="" type="string" description="Documentated Argument with formating" required="true" advanced="false" />
-			<ITEM name="argument-3" value="" type="output_file" description="Testing output file arguments" required="true" advanced="false" />
+			<ITEM name="argument-3" value="" type="output-file" description="Testing output file arguments" required="true" advanced="false" />
 		</NODE>
 	</PARAMETERS>
 </tool>
diff --git a/tests/arg_parse/test_arg_parse_ctd_support.h b/tests/arg_parse/test_arg_parse_ctd_support.h
index f703aa4..cd59ad1 100644
--- a/tests/arg_parse/test_arg_parse_ctd_support.h
+++ b/tests/arg_parse/test_arg_parse_ctd_support.h
@@ -55,6 +55,7 @@ SEQAN_DEFINE_TEST(test_arg_parse_ctd_support)
     addDescription(parser, "This is the first line of our test description.");
     addDescription(parser, "The second one contains formating <\\fIbla\\fP>.");
 
+    addOption(parser, seqan::ArgParseOption("b", "bool", "set a bool option", seqan::ArgParseArgument::BOOL));
     addOption(parser, seqan::ArgParseOption("d", "double", "set a double option", seqan::ArgParseArgument::DOUBLE));
     addOption(parser, seqan::ArgParseOption("i", "integer", "set an integer option", seqan::ArgParseArgument::INTEGER));
     setMinValue(parser, "i", "1");
diff --git a/tests/arg_parse/test_arg_parse_version_check.h b/tests/arg_parse/test_arg_parse_version_check.h
index d632ae5..e6dd938 100644
--- a/tests/arg_parse/test_arg_parse_version_check.h
+++ b/tests/arg_parse/test_arg_parse_version_check.h
@@ -63,7 +63,7 @@ const std::string TestVersionCheck_::APP_VERSION_FILENAME     = TestVersionCheck
                                                                 static_cast<std::string>(".version");
 const std::string TestVersionCheck_::APP_TIMESTAMP_FILENAME   = TestVersionCheck_::PATH + "/" +
                                                                 TestVersionCheck_::APP_NAME +
-                                                                static_cast<std::string>(".timestamp");
+                                                                static_cast<std::string>("_usr.timestamp");
 
 namespace seqan {
 
diff --git a/tests/index/test_index_bifm.cpp b/tests/index/test_index_bifm.cpp
index dfd6b81..742835c 100644
--- a/tests/index/test_index_bifm.cpp
+++ b/tests/index/test_index_bifm.cpp
@@ -66,21 +66,17 @@ typedef String<SimpleType<unsigned char, ReducedAminoAcid_<Murphy10> > > Murphy1
 typedef
     TagList<Index<String<bool>,   BidirectionalIndex<FMIndex<void, FMIndexConfigLevelsPrefix<> > > >,
     TagList<Index<DnaString,      BidirectionalIndex<FMIndex<void, FMIndexConfigLevelsPrefix<> > > >,
-    TagList<Index<RnaString,      BidirectionalIndex<FMIndex<void, FMIndexConfigLevelsPrefix<> > > >,
     TagList<Index<Dna5String,     BidirectionalIndex<FMIndex<void, FMIndexConfigLevelsPrefix<> > > >,
-    TagList<Index<Rna5String,     BidirectionalIndex<FMIndex<void, FMIndexConfigLevelsPrefix<> > > >,
     TagList<Index<Murphy10String, BidirectionalIndex<FMIndex<void, FMIndexConfigLevelsPrefix<> > > >,
     TagList<Index<Peptide,        BidirectionalIndex<FMIndex<void, FMIndexConfigLevelsPrefix<> > > >,
     TagList<Index<CharString,     BidirectionalIndex<FMIndex<void, FMIndexConfigLevelsPrefix<> > > >,
     TagList<Index<String<bool>,   BidirectionalIndex<FMIndex<void, FMIndexWTConfig<> > > >,
     TagList<Index<DnaString,      BidirectionalIndex<FMIndex<void, FMIndexWTConfig<> > > >,
-    TagList<Index<RnaString,      BidirectionalIndex<FMIndex<void, FMIndexWTConfig<> > > >,
     TagList<Index<Dna5String,     BidirectionalIndex<FMIndex<void, FMIndexWTConfig<> > > >,
-    TagList<Index<Rna5String,     BidirectionalIndex<FMIndex<void, FMIndexWTConfig<> > > >,
     TagList<Index<Murphy10String, BidirectionalIndex<FMIndex<void, FMIndexWTConfig<> > > >,
     TagList<Index<Peptide,        BidirectionalIndex<FMIndex<void, FMIndexWTConfig<> > > >,
     TagList<Index<CharString,     BidirectionalIndex<FMIndex<void, FMIndexWTConfig<> > > >
-    > > > > > > > > > > > > > > > >
+    > > > > > > > > > > > >
     FMIndices;
 
 // ==========================================================================
@@ -167,7 +163,7 @@ SEQAN_TYPED_TEST(BidirectionalFMIndexTest, SearchInString)
 
     TIndex index(text);
 
-    for (unsigned patternLength = 1; patternLength <= 20; ++patternLength)
+    for (unsigned patternLength = 1; patternLength <= 10; ++patternLength)
     {
         TText pattern;
         generateText(rng, pattern, patternLength);
@@ -200,7 +196,7 @@ SEQAN_TYPED_TEST(BidirectionalFMIndexTest, SearchInStringSet)
         appendValue(revStringSet, revText);
 
         TStringSetIndex index(stringSet);
-        for (unsigned patternLength = 1; patternLength <= 10; ++patternLength)
+        for (unsigned patternLength = 1; patternLength <= 20; ++patternLength)
         {
             TText pattern;
             if (rng() % 2) // guaranteed hit
@@ -213,9 +209,9 @@ SEQAN_TYPED_TEST(BidirectionalFMIndexTest, SearchInStringSet)
     }
 }
 
-// ========================================================================== 
+// ==========================================================================
 // Functions
-// ========================================================================== 
+// ==========================================================================
 
 int main(int argc, char const ** argv)
 {
diff --git a/tests/platform/test_platform_range_based_for_loops.h b/tests/platform/test_platform_range_based_for_loops.h
index 63cac6d..260e67e 100644
--- a/tests/platform/test_platform_range_based_for_loops.h
+++ b/tests/platform/test_platform_range_based_for_loops.h
@@ -100,8 +100,6 @@ SEQAN_DEFINE_TEST(test_platform_range_based_for_loops2) {
     #if defined(__INTEL_COMPILER)
         #if __INTEL_COMPILER < 1600 || (__INTEL_COMPILER == 1600 && __INTEL_COMPILER_UPDATE <= 3)
             SEQAN_SKIP_TEST;
-        #else
-            #warning "The Intel Compiler has a bug for this type of range-based for loop (at least until v16.0.3). Please reevaluate this issue for newer versions."
         #endif
     #endif
 
diff --git a/tests/seq_io/test_tag_select_intersect.h b/tests/seq_io/test_tag_select_intersect.h
index 1b5d364..e29ea56 100644
--- a/tests/seq_io/test_tag_select_intersect.h
+++ b/tests/seq_io/test_tag_select_intersect.h
@@ -35,17 +35,18 @@
 #ifndef TESTS_SEQ_IO_TEST_TAG_SELECT_INTERSECT_H_
 #define TESTS_SEQ_IO_TEST_TAG_SELECT_INTERSECT_H_
 
-#include <seqan/basic.h>
-#include <seqan/sequence.h>
-#include <seqan/seq_io.h>
-#include <seqan/bam_io.h>
-
 // ---------------------------------------------------------------------------
 // Assign tags to an output file based on the format of input file.
 // ---------------------------------------------------------------------------
 
 void testTransferTag()
 {
+    // in the case of no ZLIB BAM tag is not in the TagList and tagId is shifted by 1
+    int offset = 1;
+#if SEQAN_HAS_ZLIB
+    offset = 0;
+#endif
+
     SeqOutFormat outFormat;
     SeqFileIn inputFile;
     seqan::CharString filePath;
@@ -72,7 +73,7 @@ void testTransferTag()
     open(inputFile, toCString(filePath));
     result = tagSelectIntersect(outFormat, inputFile.format);
     SEQAN_ASSERT_EQ(result, true);
-    SEQAN_ASSERT_EQ(outFormat.tagId, 3);
+    SEQAN_ASSERT_EQ(outFormat.tagId, 3 - offset);
     close(inputFile);
 
     filePath = SEQAN_PATH_TO_ROOT();
@@ -80,7 +81,7 @@ void testTransferTag()
     open(inputFile, toCString(filePath));
     result = tagSelectIntersect(outFormat, inputFile.format);
     SEQAN_ASSERT_EQ(result, true);
-    SEQAN_ASSERT_EQ(outFormat.tagId, 4);
+    SEQAN_ASSERT_EQ(outFormat.tagId, 4 - offset);
     close(inputFile);
 
     filePath = SEQAN_PATH_TO_ROOT();
@@ -88,16 +89,18 @@ void testTransferTag()
     open(inputFile, toCString(filePath));
     result = tagSelectIntersect(outFormat, inputFile.format);
     SEQAN_ASSERT_EQ(result, true);
-    SEQAN_ASSERT_EQ(outFormat.tagId, 0);
+    SEQAN_ASSERT_EQ(outFormat.tagId, 1 - offset);
     close(inputFile);
 
+#if SEQAN_HAS_ZLIB
     filePath = SEQAN_PATH_TO_ROOT();
     append(filePath, "/tests/seq_io/small_sequences.bam");
     open(inputFile, toCString(filePath));
     result = tagSelectIntersect(outFormat, inputFile.format);
     SEQAN_ASSERT_EQ(result, true);
-    SEQAN_ASSERT_EQ(outFormat.tagId, 1);
+    SEQAN_ASSERT_EQ(outFormat.tagId, 0);
     close(inputFile);
+#endif
 }
 
 SEQAN_DEFINE_TEST(test_tag_select_intersect)
diff --git a/util/cmake/FindSeqAn.cmake b/util/cmake/FindSeqAn.cmake
new file mode 100644
index 0000000..653c6a9
--- /dev/null
+++ b/util/cmake/FindSeqAn.cmake
@@ -0,0 +1 @@
+include("seqan-config")
diff --git a/util/cmake/SeqAnConsistentFPFlags.cmake b/util/cmake/SeqAnConsistentFPFlags.cmake
new file mode 100644
index 0000000..5e9c44d
--- /dev/null
+++ b/util/cmake/SeqAnConsistentFPFlags.cmake
@@ -0,0 +1,59 @@
+# ============================================================================
+#                  SeqAn - The Library for Sequence Analysis
+# ============================================================================
+# Copyright (c) 2006-2016, Knut Reinert, FU Berlin
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in the
+#       documentation and/or other materials provided with the distribution.
+#     * Neither the name of Knut Reinert or the FU Berlin nor the names of
+#       its contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL KNUT REINERT OR THE FU BERLIN BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+# DAMAGE.
+# ============================================================================
+# Author: Marcel Ehrhardt <marcel.ehrhardt at fu-berlin.de>
+# ============================================================================
+# An attempt to produce the same floating point output across all platforms
+# for some of our not-so-well written test cases
+# ============================================================================
+
+if (COMPILER_LINTEL AND CMAKE_CXX_COMPILER_ID VERSION_LESS 17.0.0)
+  # https://software.intel.com/en-us/articles/consistency-of-floating-point-results-using-the-intel-compiler
+  set(SEQAN_CONSISTENT_FP_FLAGS "-fp-model precise -fp-model source -fimf-arch-consistency=true -no-fma")
+elseif (COMPILER_WINTEL AND CMAKE_CXX_COMPILER_ID VERSION_LESS 17.0.0)
+  # note: bs_tools didn't produce the same output with these settings
+  set(SEQAN_CONSISTENT_FP_FLAGS "/fp:precise /fp:source /Qimf-arch-consistency:true /Qfma-")
+elseif (COMPILER_LINTEL)
+  # at least version 17.0.0
+  set(SEQAN_CONSISTENT_FP_FLAGS "-fp-model consistent")
+elseif (COMPILER_WINTEL)
+  # at least version 17.0.0
+  set(SEQAN_CONSISTENT_FP_FLAGS "/fp:consistent")
+elseif(COMPILER_GCC)
+  # https://randomascii.wordpress.com/2013/07/16/floating-point-determinism/
+  # cc1plus: sorry, unimplemented: -fexcess-precision=standard for C++
+  set(SEQAN_CONSISTENT_FP_FLAGS "-ffloat-store -ffp-contract=off")
+elseif(COMPILER_CLANG)
+  set(SEQAN_CONSISTENT_FP_FLAGS "-ffp-contract=off")
+elseif(COMPILER_MSVC)
+  # https://msdn.microsoft.com/en-us/library/e7s85ffb.aspx
+  # note: bs_tools didn't produce the same output with this setting
+  set(SEQAN_CONSISTENT_FP_FLAGS "/fp:precise")
+endif()
diff --git a/util/pkgconfig/seqan.pc.in b/util/pkgconfig/seqan.pc.in
index 085ff53..8cc5f3f 100644
--- a/util/pkgconfig/seqan.pc.in
+++ b/util/pkgconfig/seqan.pc.in
@@ -7,5 +7,5 @@ Description: C++ library for biological sequence analysis
 URL: http://www.seqan.de
 Version: @SEQAN_VERSION_STRING@
 Requires: zlib
-Cflags: -I${includedir}  @SEQAN_PKGCFG_CFLAGS@ -DSEQAN_HAS_ZLIB=1 -DSEQAN_HAS_BZIP2=1
+Cflags: -I${includedir} -DSEQAN_HAS_ZLIB=1 -DSEQAN_HAS_BZIP2=1
 Libs: -lbz2
diff --git a/util/travis/linux-cibuild.sh b/util/travis/linux-cibuild.sh
index 3bddc27..14627a8 100755
--- a/util/travis/linux-cibuild.sh
+++ b/util/travis/linux-cibuild.sh
@@ -18,6 +18,9 @@ if [ "$(echo ${CXX} | cut -c1-5)" = "clang" ]; then
   export CXXFLAGS="${CXXFLAGS} -Qunused-arguments -DSEQAN_IGNORE_MISSING_OPENMP=1"
 fi
 
+# Switch version check default to OFF to prevent checks during app tests
+CXXFLAGS="${CXXFLAGS} -DSEQAN_VERSION_CHECK_OPT_IN=YES"
+
 ctest -V -S util/travis/linux-cibuild.cmake
 
 # we indicate build failures if ctest experienced any errors

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/seqan2.git



More information about the debian-med-commit mailing list