{
  stdenv,
  lib,
  fetchFromGitHub,
  fetchpatch,
  cmake,
  pkg-config,
  gfortran,
  texinfo,
  python3,
  boost,
  # Select SIMD alignment width (in bytes) for vectorization.
  simdWidth ? 1,
  # Pad arrays to simdWidth by default?
  # Note: Only useful if simdWidth > 1
  enablePadding ? false,
  # Activate serialization through Boost.Serialize?
  enableSerialization ? true,
  # Activate test-suite?
  # WARNING: Some of the tests require up to 1700MB of memory to compile.
  doCheck ? true,
}:

let
  inherit (lib) optional;
in
stdenv.mkDerivation rec {
  pname = "blitz++";
  version = "1.0.2";

  src = fetchFromGitHub {
    owner = "blitzpp";
    repo = "blitz";
    tag = version;
    hash = "sha256-wZDg+4lCd9iHvxuQQE/qs58NorkxZ0+mf+8PKQ57CDE=";
  };

  patches = [
    # https://github.com/blitzpp/blitz/pull/180
    (fetchpatch {
      name = "use-cmake-install-full-dir.patch";
      url = "https://github.com/blitzpp/blitz/commit/020f1d768c7fa3265cec244dc28f3dc8572719c5.patch";
      hash = "sha256-8hYFNyWrejjIWPN/HzIOphD4Aq6Soe0FFUBmwV4tpWQ=";
    })
  ];

  # CMake 4 is no longer retro compatible with versions < 3.5
  # cmake_minimum_required was already to an upper version, but not cmake_policy
  postPatch = ''
    substituteInPlace CMakeLists.txt --replace-fail \
      "cmake_policy(VERSION 3.1)" \
      ""
  '';

  nativeBuildInputs = [
    cmake
    pkg-config
    python3
    texinfo
  ];

  buildInputs = [
    gfortran
    texinfo
    boost
  ];

  cmakeFlags =
    optional enablePadding "-DARRAY_LENGTH_PADDING=ON"
    ++ optional enableSerialization "-DENABLE_SERIALISATION=ON"
    ++ optional stdenv.hostPlatform.is64bit "-DBZ_FULLY64BIT=ON";
  # FIXME ++ optional doCheck "-DBUILD_TESTING=ON";

  # skip broken library name detection
  ax_boost_user_serialization_lib = lib.optionalString stdenv.hostPlatform.isDarwin "boost_serialization";

  enableParallelBuilding = true;

  inherit doCheck;

  meta = {
    description = "Fast multi-dimensional array library for C++";
    homepage = "https://sourceforge.net/projects/blitz/";
    license = with lib.licenses; [
      artistic2 # or
      bsd3 # or
      lgpl3Plus
    ];
    platforms = lib.platforms.unix;
    maintainers = [ ];
    longDescription = ''
      Blitz++ is a C++ class library for scientific computing which provides
      performance on par with Fortran 77/90. It uses template techniques to
      achieve high performance. Blitz++ provides dense arrays and vectors,
      random number generators, and small vectors (useful for representing
      multicomponent or vector fields).
    '';
  };
}
