# Maintainer: David Runge <dvzrv@archlinux.org>
# Maintainer: Carl Smedstad <carsme@archlinux.org>

pkgbase=libcamera
pkgname=(
  libcamera
  libcamera-docs
  libcamera-ipa
  libcamera-tools
  gst-plugin-libcamera
  python-libcamera
)
pkgver=0.5.2
pkgrel=1
pkgdesc="A complex camera support library for Linux, Android, and ChromeOS"
arch=(x86_64 aarch64)
url="https://libcamera.org/"
_url=https://git.libcamera.org/libcamera/libcamera.git
makedepends=(
  cmake
  doxygen
  git
  glib2
  graphviz
  gst-plugins-base
  gtest
  libdrm
  libjpeg-turbo
  libtiff
  libyaml
  libyuv
  meson
  pybind11
  python-jinja
  python-ply
  python-pyyaml
  python-sphinx
  python-sphinxcontrib-doxylink
  qt6-base
  qt6-tools
  sdl2
  systemd
  texlive-core
)
source=("git+$_url#tag=v$pkgver")
sha512sums=('4d9688e2587854cd7bd4b98cb53b4f5c89dab588c793523f0d3d41cdb7f884dca5490dd72eb78aeee838bc33a2db6db580409d4835841e8c123e3edf1fa7bf78')
b2sums=('749b620a993140ac3ce4d7c1808d588f65a99592f03247cff117d3949d3a169650d7f763fb4f67eb296c95f8f663daf7b3fedca1e2c8c48345b2733d54d8cfb2')

_pick() {
  local p="$1" f d; shift
  for f; do
    d="$srcdir/$p/${f#$pkgdir/}"
    mkdir -p "$(dirname "$d")"
    mv "$f" "$d"
    rmdir -p --ignore-fail-on-non-empty "$(dirname "$f")"
  done
}

prepare() {
  cd $pkgbase

  # add version, so that utils/gen-version.sh may rely on it
  printf "%s\n" "$pkgver" > .tarball-version
}

build() {
  local meson_options=(
    -D v4l2=enabled
    -D tracing=disabled
    -D test=true
    -D ipas=simple,vimc
    -D pipelines=simple,uvcvideo,vimc,virtual
  )

  arch-meson $pkgbase build "${meson_options[@]}"
  meson compile -C build
}

check() {
  # Skip tests failing due to requiring CLONE_NEWUSER/CLONE_NEWNET
  local tests=$(
    meson test -C build --list | awk '{print $3}' \
      | grep -v single_stream_test \
      | grep -v multi_stream_test \
      | grep -v memory_lifetime_test \
      | grep -v -e unixsocket_ipc \
                -e log_api \
                -e log_process \
                -e unixsocket \
                -e process_test \
                -e shared-fd \
                -e unique-fd \
  )
  # shellcheck disable=SC2068
  meson test -C build ${tests[@]}
}

package_libcamera() {
  license=(
    Apache-2.0
    CC0-1.0
    'GPL-2.0-only WITH Linux-syscall-note'
    GPL-2.0-or-later
    LGPL-2.1-or-later
    'GPL-2.0-or-later WITH Linux-syscall-note OR BSD-3-Clause'
    'GPL-2.0-or-later WITH Linux-syscall-note OR MIT'
  )
  depends=(
    gcc-libs
    glibc
    gnutls
    libcamera-ipa
    libelf
    libunwind
    libyaml
    libyuv
    sh
    systemd-libs libudev.so
  )
  optdepends=(
    'gst-plugin-libcamera: GStreamer plugin'
    'libcamera-docs: for documentation'
    'libcamera-tools: for applications'
  )
  provides=(libcamera.so libcamera-base.so)

  meson install -C build --destdir "$pkgdir"
  install -vDm 644 $pkgbase/LICENSES/{BSD-3-Clause,Linux-syscall-note,MIT}.txt -t "$pkgdir/usr/share/licenses/$pkgname/"

  (
    cd "$pkgdir"
    _pick $pkgbase-docs usr/share/doc
    _pick $pkgbase-ipa usr/lib/libcamera/
    _pick $pkgbase-tools usr/bin/{cam,qcam,lc-compliance}
    _pick gst-plugin-$pkgbase usr/lib/gstreamer-*
    _pick python-$pkgbase usr/lib/python*
  )
}

package_libcamera-docs() {
  pkgdesc+=" - documentation"
  license=(
    CC-BY-4.0
    CC-BY-SA-4.0
    CC0-1.0
  )

  mv -v $pkgname/* "$pkgdir"
  mv -v "$pkgdir/usr/share/doc/$pkgbase-$pkgver/" "$pkgdir/usr/share/doc/$pkgbase/"
  rm -frv "$pkgdir/usr/share/doc/$pkgbase/html/.buildinfo"
}

package_libcamera-ipa() {
  pkgdesc+=" - signed IPA"
  license=(
    BSD-2-Clause
    CC-BY-SA-4.0
    CC0-1.0
    GPL-2.0-or-later
    LGPL-2.1-or-later
  )
  depends=(
    gcc-libs
    glibc
    libcamera libcamera.so libcamera-base.so
  )
  # stripping requires re-signing of IPA libs, so we do it manually
  options=(!strip)

  strip $pkgname/usr/lib/libcamera/*{.so,proxy}
  for _lib in $pkgname/usr/lib/libcamera/*.so; do
    $pkgbase/src/ipa/ipa-sign.sh "$(find build -type f -iname "*ipa-priv-key.pem")" "$_lib" "$_lib.sign"
  done
  mv -v $pkgname/* "$pkgdir"
  install -vDm 644 $pkgbase/LICENSES/BSD-2-Clause.txt -t "$pkgdir/usr/share/licenses/$pkgname/"
}

package_libcamera-tools() {
  pkgdesc+=" - tools"
  license=(
    BSD-2-Clause
    CC0-1.0
    GPL-2.0-or-later
    LGPL-2.1-or-later
  )
  depends=(
    gcc-libs
    glibc
    gtest
    libcamera libcamera.so libcamera-base.so
    libdrm
    libevent libevent-2.1.so libevent_pthreads-2.1.so
    libjpeg-turbo libjpeg.so
    libtiff libtiff.so
    libyaml
    qt6-base
    sdl2
  )
  conflicts=("$pkgbase-tests<0.0.1-2")
  replaces=("$pkgbase-tests<0.0.1-2")

  mv -v $pkgname/* "$pkgdir"
  install -vDm 644 $pkgbase/LICENSES/BSD-2-Clause.txt -t "$pkgdir/usr/share/licenses/$pkgname/"
}

package_gst-plugin-libcamera() {
  pkgdesc="Multimedia graph framework - libcamera plugin"
  license=(
    CC0-1.0
    LGPL-2.1-or-later
  )
  depends=(
    gcc-libs
    glibc
    glib2 libg{lib,object}-2.0.so
    gstreamer
    gst-plugins-base-libs
    libcamera libcamera.so libcamera-base.so
  )

  mv -v $pkgname/* "$pkgdir"
}

package_python-libcamera() {
  pkgdesc+=" - Python integration"
  license=(
    CC0-1.0
    LGPL-2.1-or-later
  )
  depends=(
    gcc-libs
    glibc
    libcamera
    python
  )

  mv -v $pkgname/* "$pkgdir"
}
