Repository navigation
v1.0.0
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:
.appbundle zips for x86_64 and ARM64. - Windows: standalone
spring2.exebinaries 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:
- https://spring2.readthedocs.io/
docs/user/BUILDING.mdin the repository
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-referencecodegen 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 itszlib.compress()output is fully compatible with thelibdeflate_zlib_decompressruntime 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 compilingcloudflare_zlibwith/Od/-O1to 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::stringnever initialized for LLVM libomp worker threads; OpenMP closure mishandling of sharedstd::vector<T>variables; and LLVM libomp usingCreateThread()instead of_beginthreadex()with the static CRT. Fixed by eliminating thethread_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_tdecremented pastbegin()whenm_bucket_sizereached zero. - Fixed MSVC access violation in
populate_bucket_read_ids:#pragma omp atomic capturereceived a non-addressablestd::unique_ptr::operator[]expression in Debug builds. - Fixed out-of-bounds heap access when
valid_bucket_rangeaccepted empty ranges[N, N), causing the tail sentinelMAX_NUM_READSto indexreads[]. - Fixed a thread-safety data race on
bbhashdict::empty_bin—std::vector<bool>shares words across adjacent elements; changed tostd::vector<uint8_t>. - Fixed Windows integration test failures (
tar: _repack_tmp.tar: Can't add archive to itself) by adding--exclude _repack_tmp.tarto alltar -cfinvocations.