# Maintainer: Evangelos Foutras <evangelos@foutrelis.com>
# Contributor: Jan "heftig" Steffens <jan.steffens@gmail.com>

pkgname=(llvm-julia-git llvm-libs-julia-git)
pkgver=22.1.8
pkgrel=2
_archcn_rel=1
_versioned_llvm=
arch=(i686 x86_64 armv7h aarch64)
url="https://llvm.org/"
license=('custom:Apache 2.0 with LLVM Exception')
makedepends=('cmake' 'ninja' 'zlib' 'zstd' 'libffi' 'libedit' 'ncurses'
             'libxml2' 'python-setuptools' 'python-psutil' 'python-sphinx'
             'python-myst-parser' 'git')
# Disable LTO for now since there seems to be some issue at least on aarch64
# https://github.com/llvm/llvm-project/issues/57740
options=('staticlibs' '!strip' '!lto')
source=(https://github.com/yuyichao/llvm-project/archive/refs/tags/archcn-$pkgver-$_archcn_rel.tar.gz)
repodir=llvm-project-archcn-$pkgver-$_archcn_rel
sha256sums=('de750e52e06c5dc8d79e7857cd7f3eaf89d63089af76644c05697e26b232d7d6')

if [[ -z $_versioned_llvm ]]; then
  _llvm_prefix=/usr
else
  _llvm_prefix=/usr/lib/llvm${_versioned_llvm}
fi

# # Utilizing LLVM_DISTRIBUTION_COMPONENTS to avoid
# # installing static libraries; inspired by Gentoo
# _get_distribution_components() {
#   local target
#   ninja -t targets | grep -Po 'install-\K.*(?=-stripped:)' | while read -r target; do
#     case $target in
#       llvm-libraries|distribution)
#         continue
#         ;;
#       # shared libraries
#       LLVM|LLVMgold)
#         ;;
#       # libraries needed for clang-tblgen
#       LLVMDemangle|LLVMSupport|LLVMTableGen)
#         ;;
#       # exclude static libraries
#       LLVM*)
#         continue
#         ;;
#       # exclude llvm-exegesis (doesn't seem useful without libpfm)
#       llvm-exegesis)
#         continue
#         ;;
#     esac
#     echo $target
#   done
# }

prepare() {
  cd ${repodir}/llvm
  mkdir build

  # Arch patches
  msg "Applying Arch patches"
}

build() {
  cd ${repodir}/llvm/build

  export PATH="${srcdir}/bin:${PATH}"
  CFLAGS+=" -ffile-prefix-map=${srcdir}=${DBGSRCDIR:-/usr/src/debug}"
  CXXFLAGS+=" -ffile-prefix-map=${srcdir}=${DBGSRCDIR:-/usr/src/debug}"
  CFLAGS+=' -ggdb1 -O3 -fasynchronous-unwind-tables'
  CXXFLAGS+=' -ggdb1 -O3 -fasynchronous-unwind-tables'
  LDFLAGS+=' -O3 -fasynchronous-unwind-tables'
  export LANG=en_US.UTF-8

  local cmake_args=(
    -G Ninja
    -DCMAKE_BUILD_TYPE=Release
    -DCMAKE_INSTALL_DOCDIR=share/doc
    -DCMAKE_INSTALL_PREFIX=${_llvm_prefix}
    -DCMAKE_SKIP_RPATH=ON
    -DLLVM_BINUTILS_INCDIR=/usr/include
    -DLLVM_BUILD_DOCS=ON
    -DLLVM_BUILD_LLVM_DYLIB=ON
    -DLLVM_BUILD_TESTS=ON
    -DLLVM_ENABLE_BINDINGS=OFF
    -DLLVM_ENABLE_FFI=ON
    -DLLVM_ENABLE_RTTI=ON
    -DLLVM_ENABLE_SPHINX=ON
    -DLLVM_HOST_TRIPLE=$CHOST
    -DLLVM_INCLUDE_BENCHMARKS=OFF
    -DLLVM_INSTALL_UTILS=ON
    -DLLVM_LINK_LLVM_DYLIB=ON
    -DLLVM_USE_PERF=ON
    -DSPHINX_WARNINGS_AS_ERRORS=OFF
  )

  cmake .. "${cmake_args[@]}"
  # local distribution_components=$(_get_distribution_components | paste -sd\;)
  # test -n "$distribution_components"
  # cmake_args+=(-DLLVM_DISTRIBUTION_COMPONENTS="$distribution_components")

  # cmake .. "${cmake_args[@]}"
  ninja
}

package_llvm-julia-git() {
  pkgdesc="Compiler infrastructure (with patch for julia)"
  depends=("llvm-libs-julia-git=$pkgver-$pkgrel" perl)
  optdepends=()
  conflicts=("llvm${_versioned_llvm}")
  provides=("llvm${_versioned_llvm}=$pkgver-$pkgrel")
  export LANG=en_US.UTF-8

  cd ${repodir}/llvm/build

  DESTDIR="$pkgdir" ninja install

  if [[ -z $_versioned_llvm ]]; then
    optdepends+=('python-setuptools: for using lit (LLVM Integrated Tester)')
    # Include lit for running lit-based tests in other projects
    pushd ../utils/lit
    python3 setup.py install --root="$pkgdir" -O1
    popd
  fi

  # The runtime libraries go into llvm-libs
  mv -f "$pkgdir"/${_llvm_prefix}/lib/lib{LLVM,LTO,Remarks}*.so* "$srcdir"
  mv -f "$pkgdir"/${_llvm_prefix}/lib/LLVMgold.so "$srcdir"

  # Remove documentation sources
  rm -r "$pkgdir"/${_llvm_prefix}/share/doc/llvm/html/{_sources,.buildinfo}

  if [[ -n $_versioned_llvm ]]; then
    # Create versioned symlinks from /usr/bin/ to /usr/lib/llvm${_versioned_llvm}/bin/
    install -d "$pkgdir/usr/bin"
    local _binary
    for _binary in "$pkgdir"/${_llvm_prefix}/bin/*; do
    local _basename=${_binary##*/}
    ln -s ../lib/llvm${_versioned_llvm}/bin/$_basename \
       "$pkgdir/usr/bin/$_basename-${_versioned_llvm}"
    done
  fi

  install -Dm644 ../LICENSE.TXT "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
}

package_llvm-libs-julia-git() {
  pkgdesc="LLVM runtime libraries (with patch for julia)"
  depends=(gcc-libs zlib libzstd.so libffi.so libedit libncursesw.so libxml2)
  conflicts=("llvm${_versioned_llvm}-libs")
  provides=("llvm${_versioned_llvm}-libs=$pkgver-$pkgrel")
  export LANG=en_US.UTF-8

  install -d "$pkgdir/${_llvm_prefix}/lib"
  cp -P \
     "$srcdir"/lib{LLVM,LTO,Remarks}*.so* \
     "$srcdir"/LLVMgold.so \
     "$pkgdir/${_llvm_prefix}/lib/"

  if [[ -n $_versioned_llvm ]]; then
    ln -rs "$pkgdir/${_llvm_prefix}/lib/libLLVM-$_versioned_llvm.so" \
       "$pkgdir/usr/lib/libLLVM-$_versioned_llvm.so"
    ln -rs "$pkgdir/${_llvm_prefix}/lib/libLLVM-$_versioned_llvm.so" \
       "$pkgdir/usr/lib/libLLVM-$pkgver.so"
  fi

  install -Dm644 "$srcdir/${repodir}/llvm/LICENSE.TXT" \
          "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
}
