aboutsummaryrefslogtreecommitdiffstats
path: root/testing/idris/APKBUILD
blob: ca52a56cf3d4f2c63b3824be771ed6827d1edeb9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# Contributor: Mitch Tishmack <mitch.tishmack@gmail.com>
# Contributor: Jakub Jirutka <jakub@jirutka.cz>
# Maintainer: Mitch Tishmack <mitch.tishmack@gmail.com>
pkgname=idris
pkgver=1.0
pkgrel=0
pkgdesc="A Language with Dependent Types"
url="http://www.idris-lang.org"
# Note: same as ghc, if it gets ported elsewhere this should run too
arch="armhf 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"

_cabal_home="$srcdir/cabal"

# Prevent cabal setup from using unbounded memory
_cabal_install_opts=" --max-backjumps=10000"

cabal_update() {
	msg "Updating constraints"

	cd "$builddir"

	# Create cabal config and fetch index.
	HOME="$_cabal_home" cabal update

	# Resolve deps and generate fresh cabal.config with version constraints.
	rm -f cabal.config
	HOME="$_cabal_home" cabal freeze --shadow-installed-packages

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

	mv cabal.config "$startdir"/

	cd "$startdir"
	abuild checksum
}


# Used by the subsequent two functions.
# This barf of a pipeline converts the cabal freeze config file lines from:
# constraints: foo ==VERSION,
#              bar ==VERSION
# etc...
# To something we can more easily munge into what we need for other purposes
# aka we end up with:
# foo==VERSION bar==VERSION ...
_cabal_constraints_prime() {
	printf "$(grep '==' cabal.config | \
		sed -e 's/constraints[:]//g' | \
		tr -d '[:space:]' | \
		sed -e 's/[,]/ /g')"
}

# Take the output from above and replace =='s to -'s so we can cabal fetch
# the specific package-version's via cabal
_cabal_pkgs() {
	printf "$(_cabal_constraints_prime)" | sed -e 's/==/-/g'
}

# Similar to the above, but convert to --constraint args used for cabal install
# so that our cabal install line can use the same constraints for idris in cabal.config.
#
# This works around us running against a newer hackage index where one of the packages
# in the freeze file has a newer version that cabal install libffi could end up
# selecting due to libffi having more relaxed constraints than idris.
#
# That is:
# --constraint=foo==VERSION --constraint=bar==VERSION
_cabal_constraints() {
	printf " $(_cabal_constraints_prime)" | sed -e 's/ / --constraint=/g'
}

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_home" 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.
	HOME="$_cabal_home" cabal sandbox init

	# Fetch all dependencies.
	# Note: cabal-doctest is a transitive dependency for libffi-0.1 not idris
	HOME="$_cabal_home" cabal fetch --no-dependencies $(_cabal_pkgs) \
		 cabal-doctest-1.0.2 libffi-0.1
}

build() {
	cd "$builddir"

	# Build dependencies
	# Note: for libffi force constraints manually via the freeze file to prevent
	# cabal from possibly using newer constraints for libffi that might intersect
	# with those idris uses.
	HOME="$_cabal_home" cabal install $_cabal_install_opts --offline --constraint=cabal-doctest==1.0.2 \
		$(_cabal_constraints) -v libffi-0.1
	HOME="$_cabal_home" cabal install $_cabal_install_opts --offline --only-dependencies -v

	# Note: ordering of prefixes is important!
	HOME="$_cabal_home" 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'
	HOME="$_cabal_home" 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"

	HOME="$_cabal_home" 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
adce625aed6ab6f36adf6d91e5671c85c91a1009e17419a88071e3cd500962c1c545406b2eb431cd3efa45d3dacadac913a9a27a5956e8233bd13b4630ff2ab4  cabal.config"