# Contributor: Mitch Tishmack <mitch.tishmack@gmail.com>
# Contributor: Jakub Jirutka <jakub@jirutka.cz>
# Maintainer: Mitch Tishmack <mitch.tishmack@gmail.com>
#
# Note: This abuilds downloads Haskell dependencies in the prepare phase
#       without any verification!
pkgname=idris
pkgver=1.0
pkgrel=0
pkgdesc="A Language with Dependent Types"
url="http://www.idris-lang.org"
arch="x86_64"
license="BSD3"
depends="gmp-dev gcc"
makedepends="ghc cabal libffi-dev ncurses-dev zlib-dev"
subpackages="$pkgname-doc"
source="$pkgname-$pkgver.tar.gz::https://github.com/idris-lang/Idris-dev/archive/v$pkgver.tar.gz
	cabal.config"
builddir="$srcdir/Idris-dev-$pkgver"

export CABAL_CONFIG="$srcdir/cabal/cabal.config"

cabal_update() {
	msg "Updating constraints"

	cd "$builddir"

	# Create cabal config and fetch index.
	HOME="${CABAL_CONFIG%/*}" cabal update

	# Resolve deps and generate fresh cabal.config with version constraints.
	rm -f cabal.config
	cabal freeze

	# Add version tag at the first line.
	sed -i "1i--$pkgver" cabal.config

	mv cabal.config "$startdir"/

	cd "$startdir"
	abuild checksum
}

prepare() {
	default_prepare

	if [ "$(head -n 1 "$srcdir"/cabal.config)" != "--$pkgver" ]; then
		die "Requirements file is outdated, run 'abuild cabal_update'"
	fi

	cd "$builddir"

	# Create cabal config and fetch index.
	HOME="${CABAL_CONFIG%/*}" cabal update

	# Cabal implicitly loads cabal.config from the project's directory.
	ln -sf "$srcdir"/cabal.config .

	# Create Cabal sandbox that will be used for all subsequent cabal
	# invocations. This is something like Python virtual env.
	cabal sandbox init

	# Fetch all dependencies.
	# XXX: This should always fetch the same versions as defined in
	# our cabal.config, but Cabal does not verify packages integrity!
	cabal fetch libffi .
}

build() {
	cd "$builddir"

	# Build dependencies.
	cabal install --offline -v libffi
	cabal install --only-dependencies --offline -v

	# Note: ordering of prefixes is important!
	cabal configure \
		--prefix='/usr' \
		--docdir='$prefix/share/doc' \
		--datadir='$prefix/share' \
		--htmldir='$docdir/html' \
		--libdir='$prefix/lib' \
		--libsubdir="$pkgname" \
		--datasubdir="$pkgname" \
		--dynlibdir="$pkgname" \
		--disable-shared \
		--flags='GMP FFI standalone'
	cabal build
}

# TODO: Run upstream tests and/or figure out how to set paths to be able
# to compile hello_world for check.
check() {
	cd "$builddir"

	./dist/build/idris/idris --version
}

package() {
	cd "$builddir"

	cabal copy --destdir="$pkgdir"

	cd "$pkgdir"

	# We don't need the haskell shared libraries or interface files.
	rm -r usr/lib/idris

	mkdir -p usr/share/doc/idris/ \
		usr/share/licenses/$pkgname/
	mv usr/share/idris/docs usr/share/doc/idris
	mv usr/share/doc/LICENSE usr/share/licenses/$pkgname/
}

sha512sums="a350004a8510f01d1cc8f965a9a4e2dab219f003980b98354ebb5ae42f73b32c90c98dce193943e9709d994cb92ad35814a46b79412a1afc85d42e1018c6ba10  idris-1.0.tar.gz
e078892987816012034295be81118fbc710e3dbf08af18257e5390fc159bb5d64e1aae8a802835ca92b1e0d065524833d657bc9edffc9ebefc8cb5c02935694a  cabal.config"