Skip to content

Build

Platform requirements

  • Requires zlib or a zlib-compatible library
  • Integers must be two’s complement.
  • Fixed width integer types up to (u)int32_t
  • CHAR_BIT must equal 8.
  • size_t must be unsigned.
  • size_t and int must be at least 32-bit, 16-bit platforms are not supported.
  • Floating point support and math functions

CMake

mkdir cbuild
cd cbuild
cmake .. # Don't forget to set optimization level!
make
make install

Meson

meson build --buildtype=release # Default is debug
cd build
ninja
ninja install

Embedding the source code

The source files spng.c/spng.h can be embedded in a project without any configuration, SSE2 intrinsics are enabled by default on x86.

Build options

Meson CMake Compiler option Default Description
(auto) (auto) SPNG_STATIC Controls symbol visibility on Windows
enable_opt ENABLE_OPT SPNG_DISABLE_OPT ON Compile with optimizations
SPNG_SSE=<1-4> 1 SSE version target for x86 (ignored on non-x86)
SPNG_ARM (auto) Enable ARM NEON optimizations (ARM64 only)
static_zlib OFF Link zlib statically
use_miniz SPNG_USE_MINIZ OFF Compile using miniz, disables some features
(auto) SPNG_ENABLE_TARGET_CLONES Use target_clones() to optimize (GCC + glibc only)
dev_build OFF Enable the testsuite, requires libpng
benchmarks OFF Enable benchmarks, requires Git LFS
oss_fuzz OFF Enable regression tests with OSS-Fuzz corpora

Valid values for SPNG_SSE:

  • 1 - SSE2
  • 2 - same as above
  • 3 - SSSE3
  • 4 - SSE4.1

Currently only SSE2 optimizations are tested.

The source code alone can be built without any compiler flags, compiler-specific macros are used to omit the need for options such as -msse2, -mssse3.

miniz

miniz is a single source file replacement for zlib, linking against miniz allows libspng to be embedded into a project with just four files: spng.c, miniz.c and their headers.

For building with miniz add the SPNG_USE_MINIZ compiler option, this handles some minor differences in the API. Performance is mostly identical, slightly better in some cases compared to stock zlib.

Profile-guided optimization

Profile-guided optimization (PGO) improves performance by up to 10%.

# Run in root directory
git clone https://github.com/libspng/benchmark_images.git
cd build
meson configure -Dbuildtype=release --default-library both -Db_pgo=generate
ninja
./example ../benchmark_images/medium_rgb8.png
./example ../benchmark_images/medium_rgba8.png
./example ../benchmark_images/large_palette.png
meson configure -Db_pgo=use
ninja
ninja install

Documentation

Documentation is built with mkdocs:

# Run in root directory
mkdocs build