# Maintainer: aimileus <me at aimileus dot nl>
# Maintainer: Maciej Borzecki <maciek.borzecki@gmail.com>
# Contributor: Timothy Redaelli <timothy.redaelli@gmail.com>
# Contributor: Zygmunt Krynicki <me at zygoon dot pl>
#
# Environment variables that can set by CI:
# - WITH_TEST_KEYS=1 - enable use of testing keys

pkgname=snapd
pkgdesc="Service and tools for management of snap packages."
depends=('squashfs-tools' 'libseccomp' 'libsystemd' 'libcap' 'apparmor')
optdepends=('bash-completion: bash completion support'
            'xdg-desktop-portal: desktop integration')
pkgver=2.71.1
pkgrel=1
arch=('x86_64' 'i686' 'armv7h' 'aarch64')
url="https://github.com/snapcore/snapd"
license=('GPL3')
makedepends=('git' 'go' 'go-tools' 'libseccomp' 'libcap' 'systemd' 'xfsprogs' 'python-docutils' 'apparmor' 'autoconf-archive')
# the following checkdepends are only required for static checks and unit tests,
# unit tests are currently enabled
checkdepends=('python' 'squashfs-tools' 'shellcheck')
conflicts=('snap-confine')
options=('!strip' 'emptydirs')
install=snapd.install
source=("${pkgname}_${pkgver}.vendor.tar.xz")
sha256sums=('SKIP')

prepare() {
  cd "$pkgname-$pkgver"

  :
}

build() {
  cd "$pkgname-$pkgver"

  unset GO111MODULE

  export CGO_ENABLED="1"
  export CGO_CFLAGS="${CFLAGS}"
  export CGO_CPPFLAGS="${CPPFLAGS}"
  export CGO_CXXFLAGS="${CXXFLAGS}"
  export CGO_LDFLAGS="${LDFLAGS}"

  # Generate snapd.defines.mk, this file is included by snapd.mk.
  cat >"$srcdir/snapd.defines.mk" <<__DEFINES__
# This file is generated by snapd packaging
# Directory variables.
prefix = /usr
bindir = /usr/bin
sbindir = /usr/sbin
libexecdir = /usr/lib
mandir = /usr/share/man
datadir = /usr/share
localstatedir = /var
sharedstatedir = /var/lib
unitdir = /usr/lib/systemd/system
builddir = $srcdir/_go_build
# Build configuration
with_core_bits = 0
with_alt_snap_mount_dir = 1
with_apparmor = 1
with_testkeys = ${WITH_TEST_KEYS:-0}
EXTRA_GO_BUILD_FLAGS = -trimpath
EXTRA_GO_LDFLAGS = -w -s
__DEFINES__

  ./mkversion.sh $pkgver-$pkgrel

  make -f packaging/snapd.mk \
       SNAPD_DEFINES_DIR="$srcdir"

  # Generate data files such as real systemd units, dbus service, environment
  # setup helpers out of the available templates
  make -C data \
       BINDIR=/bin \
       LIBEXECDIR=/usr/lib \
       SYSTEMDSYSTEMUNITDIR=/usr/lib/systemd/system \
       SNAP_MOUNT_DIR=/var/lib/snapd/snap \
       SNAPD_ENVIRONMENT_FILE=/etc/default/snapd

  cd cmd
  autoreconf -i -f
  ./configure \
    --prefix=/usr \
    --sysconfdir=/etc \
    --localstatedir=/var \
    --libexecdir=/usr/lib/snapd \
    --with-snap-mount-dir=/var/lib/snapd/snap \
    --enable-apparmor \
    --enable-nvidia-biarch \
    --enable-merged-usr
  make $MAKEFLAGS
}

check() {
    cd "$pkgname-$pkgver"

    # make sure the binaries that need to be built statically really are
    for binary in snap-exec snap-update-ns snapctl; do
        if ! LC_ALL=C ldd "$srcdir/_go_build/$binary" 2>&1 | grep -q 'not a dynamic executable'; then
            echo "$binary is not a static binary"
            exit 1
        fi
    done

    SKIP_UNCLEAN=1 IGNORE_MISSING=1 ./run-checks --unit
    # XXX: Static checks choke on autotools generated cruft. Let's not run them
    # here as they are designed to pass on a clean tree, before anything else is
    # done, not after building the tree.
    # ./run-checks --static
    TMPDIR=/tmp make -C cmd -k check
    TMPDIR=/tmp make -C data -k check
}

package() {
  cd "$pkgname-$pkgver"

  # Install bash completion
  install -Dm644 data/completion/bash/snap \
    "$pkgdir/usr/share/bash-completion/completions/snap"
  install -Dm644 data/completion/bash/complete.sh \
    "$pkgdir/usr/lib/snapd/complete.sh"
  install -Dm644 data/completion/bash/etelpmoc.sh \
    "$pkgdir/usr/lib/snapd/etelpmoc.sh"
  # Install zsh completion
  install -Dm644 data/completion/zsh/_snap \
    "$pkgdir/usr/share/zsh/site-functions/_snap"

  # Install systemd units, dbus services and a script for environment variables
  make -C data/ install \
     DBUSSERVICESDIR=/usr/share/dbus-1/services \
     BINDIR=/usr/bin \
     SYSTEMDSYSTEMUNITDIR=/usr/lib/systemd/system \
     SNAP_MOUNT_DIR=/var/lib/snapd/snap \
     DESTDIR="$pkgdir"

  make -C cmd install DESTDIR="$pkgdir/"

  make -f packaging/snapd.mk \
       SNAPD_DEFINES_DIR="$srcdir" \
       DESTDIR="$pkgdir" \
       install

  # Install the "info" data file with snapd version
  install -m 644 -D "data/info" "$pkgdir/usr/lib/snapd/info"

  # these locations are created at runtime but were not part of the packaging
  # previously, thus would trigger a file conflict on upgrade
  rm -rfv "$pkgdir/var/cache/snapd"
  rm -rfv "$pkgdir/var/lib/snapd/snap/README"
  rm -rfv "$pkgdir/var/lib/snapd/state.json"
  rm -rfv "$pkgdir/var/lib/snapd/system-key"

  # Remove snappy core specific units
  rm -fv "$pkgdir/usr/lib/snapd/snapd.core-fixup.sh"
  rm -fv "$pkgdir/usr/bin/ubuntu-core-launcher"
  rm -fv "$pkgdir/usr/lib/snapd/system-shutdown"

  # drop the last remaining Ubuntu Core specific service
  rm -fv "$pkgdir/usr/lib/systemd/system/snapd.failure.service"

  # Remove prompt services
  rm -fv "$pkgdir/usr/lib/systemd/system/snapd.aa-prompt-listener.service"
  rm -fv "$pkgdir/usr/lib/systemd/user/snapd.aa-prompt-ui.service"
  rm -fv "$pkgdir/usr/share/dbus-1/services/io.snapcraft.Prompt.service"

  # Remove gpio-chardev ordering target
  rm -fv "$pkgdir/usr/lib/systemd/system/snapd.gpio-chardev-setup.target"
}
