# Maintainer: Sébastien Luttringer
# PGO build: Laio O. Seman <laio [at] ieee.org>

pkgname=lz4
epoch=1
pkgver=1.10.0
pkgrel=2
pkgdesc='Extremely fast compression algorithm'
arch=('x86_64')
url='https://lz4.github.io/lz4/'
license=(GPL-2.0-or-later)
makedepends=('git' 'meson' 'ninja' 'llvm' 'clang' 'bc')
checkdepends=('diffutils')
depends=('glibc')
provides=('liblz4.so')
source=("git+https://github.com/lz4/lz4.git#tag=v$pkgver")
sha256sums=('487f9bc24fdaf589e2f4bb23dd98b1f21a71b643db09251145616587c9468555')

# Function to generate data and compress-decompress it
_generate_and_process_data() {
  local _data_size=$1
  local _compression_level=$2
  local _filename="data_${_data_size}_${_compression_level}.bin"

  msg2 "Generating data for ${_data_size} KB with compression level ${_compression_level}"

  # Generate data
  $DATASET_GENERATOR "-g$_data_size" > "$_filename"

  msg2 "Compressing and decompressing data: $_filename"

  # Compress
  local _start_time="$(date +%s.%N)"
  LLVM_PROFILE_FILE="${PGO_PROFILE_DIR}/_%m_%p.profraw" $LZ4_BIN "-$_compression_level" "$_filename" "$_filename.lz4" > /dev/null 2>&1
  local _end_time="$(date +%s.%N)"
  local _compress_time="$(echo "$_end_time - $_start_time" | bc)"

  msg2 "Decompressing data"
  # Decompress
  _start_time="$(date +%s.%N)"
  LLVM_PROFILE_FILE="${PGO_PROFILE_DIR}/_%m_%p.profraw" $LZ4_BIN -d "$_filename.lz4" "${_filename}_uncompressed" > /dev/null 2>&1
  _end_time="$(date +%s.%N)"
  local _decompress_time="$(echo "$_end_time - $_start_time" | bc)"

  # Cleanup and log results
  rm "$_filename" "$_filename.lz4" "${_filename}_uncompressed"
}

build() {
  export ROOT_DIR="$PWD"
  export PGO_PROFILE_DIR="$ROOT_DIR/pgo"

  export CC=clang
  export CXX=clang++

  mkdir -p pgo

  # Generate PGO binary
  export CFLAGS="$CFLAGS -fprofile-generate"
  export CXXFLAGS="$CXXFLAGS -fprofile-generate"

  meson setup --prefix=/usr --buildtype=plain lz4/build/meson build
  meson configure build -Dcontrib=true -Dexamples=true -Dprograms=true
  meson compile -C build

  cd "$pkgname/tests"
  make datagen
  export DATASET_GENERATOR="$PWD/datagen"
  cd "$ROOT_DIR"

  export LZ4_BIN="$ROOT_DIR/build/meson/programs/lz4"

  # create data for 1MB, 10MB, 50MB
  export DATA_SIZES=(1000000 50000000)

  export COMPRESSION_LEVELS=(1 3) # 1 for fastest

  msg2 "PGO data generation"
  # Generate and process data for 100 times
  for i in {1..30}; do
      for SIZE in "${DATA_SIZES[@]}"; do
          for LEVEL in "${COMPRESSION_LEVELS[@]}"; do
              _generate_and_process_data "$SIZE" "$LEVEL"
          done
      done
  done

  for SIZE in "${DATA_SIZES[@]}"; do
      for LEVEL in "${COMPRESSION_LEVELS[@]}"; do
          _generate_and_process_data "$SIZE" "$LEVEL"
      done
  done

  export CFLAGS="${CFLAGS//-fprofile-generate/} -fprofile-use=$PGO_PROFILE_DIR/merged.profdata"
  export CXXFLAGS="${CXXFLAGS//-fprofile-generate/} -fprofile-use=$PGO_PROFILE_DIR/merged.profdata"

  llvm-profdata merge -o "$PGO_PROFILE_DIR/merged.profdata" "${PGO_PROFILE_DIR}"/*.profraw

  # clean everything
  rm -rf build

  meson setup --prefix=/usr --buildtype=plain lz4/build/meson build
  meson configure build -Dcontrib=true -Dexamples=true -Dprograms=true
  meson compile -C build

}

check() {
  rm -f passwd.lz4
  build/meson/programs/lz4 /etc/passwd passwd.lz4
  build/meson/programs/lz4 -d passwd.lz4 passwd
  diff -q /etc/passwd passwd
  rm passwd
}

package() {
  meson install -C build --destdir "$pkgdir"
}

# vim:set ts=2 sw=2 et:
