Skip to content

v1.0.0

Choose a tag to compare

@thisisamirv thisisamirv released this 19 Jun 15:07
· 81 commits to main since this release

The first stable release of SPRING2, a cross-platform FASTQ/FASTA compressor and decompressor built on the foundations of the original SPRING.

Installation

Binaries are available below for Linux, macOS, and Windows:

  • Linux: portable AppImages for x86_64 and ARM64.
  • macOS: .app bundle zips for x86_64 and ARM64.
  • Windows: standalone spring2.exe binaries for x86_64 and ARM64.

Windows installers have been dropped to reduce release complexity — the standalone .exe is self-contained and requires no installation step.

If you prefer building from source or want the full user guide, see:

Highlights

  • Conda packaging is now first-class. An in-repo recipe (conda/recipe/meta.yaml) and platform build scripts let you build SPRING2 as a conda package on Linux, macOS, and Windows. CI validates the recipe on every run.
  • Broader platform support: minimum CMake version lowered to 3.31+ and all CI runners now test the full platform and compiler matrix.
  • License clarification: SPRING2 is now published under the same license as upstream SPRING following redistribution permission.

What Changed

  • The native C++ embed-reference codegen binary has been replaced with an equivalent Python script (tools/codegen/embed_reference.py). The C++ binary was blocked at build time by Windows Device Guard policy on hardened runners; Python's signed interpreter is trusted by Device Guard and its zlib.compress() output is fully compatible with the libdeflate_zlib_decompress runtime path.
  • Windows releases no longer ship Setup installers — standalone binaries are the only Windows artifact.

Fixes

Windows crash fixes (all platforms/compilers):

  • Fixed gzipped input crashes (0xC0000005) on Windows MSVC and ClangCL by compiling cloudflare_zlib with /Od/-O1 to avoid miscompilation under aggressive optimization.
  • Fixed gzipped input crashes on Windows ARM64 MSVC: __aarch64__ was activating unsafe CRC32 and NEON paths with unaligned pointer casts; fixed with /U__aarch64__ to force safe C fallbacks.
  • Fixed multiple compression and decompression crashes on Windows ClangCL x64 caused by: a file-scope thread_local std::string never initialized for LLVM libomp worker threads; OpenMP closure mishandling of shared std::vector<T> variables; and LLVM libomp using CreateThread() instead of _beginthreadex() with the static CRT. Fixed by eliminating the thread_local, extracting raw pointers before parallel regions, and switching ClangCL to /MD.

Correctness fixes:

  • Fixed SPRING1 archive decompression producing truncated output on Windows ARM64 — omp_get_thread_num() always returned 0 with OpenMP disabled, so only the first block per step was processed. Replaced #pragma omp parallel + omp_get_thread_num() with #pragma omp parallel for.
  • Fixed MSVC crash (exit code 3) during MPHF construction in pthash: buckets_iterator_t decremented past begin() when m_bucket_size reached zero.
  • Fixed MSVC access violation in populate_bucket_read_ids: #pragma omp atomic capture received a non-addressable std::unique_ptr::operator[] expression in Debug builds.
  • Fixed out-of-bounds heap access when valid_bucket_range accepted empty ranges [N, N), causing the tail sentinel MAX_NUM_READS to index reads[].
  • Fixed a thread-safety data race on bbhashdict::empty_bin — std::vector<bool> shares words across adjacent elements; changed to std::vector<uint8_t>.
  • Fixed Windows integration test failures (tar: _repack_tmp.tar: Can't add archive to itself) by adding --exclude _repack_tmp.tar to all tar -cf invocations.