aboutsummaryrefslogtreecommitdiffstats
path: root/testing/idris/APKBUILD
blob: ed2fffb40abf9b0f7c539b250ceedc3312aeff81 (plain) (blame)
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
157
158
159
160
161
162
163
164
165
# Contributor: Mitch Tishmack <mitch.tishmack@gmail.com>
# Contributor: Jakub Jirutka <jakub@jirutka.cz>
# Maintainer: Mitch Tishmack <mitch.tishmack@gmail.com>
pkgname=idris
pkgver=1.3.0
pkgrel=1
pkgdesc="A Language with Dependent Types"
url="https://www.idris-lang.org/"
# Note: same as ghc, if it gets ported elsewhere this should run too.
# armhf: disabled due to build failure
arch="x86_64"
license="BSD-3-Clause"
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

	# Remove rts/ghc-boot-sh package if they somehow got inserted
	sed -i -e "s/.*rts.*//g" -e "s/.*ghc-boot-th.*//g" 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.
	cmd="cabal sandbox init"
	msg "$cmd"
	HOME="$_cabal_home" $cmd

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

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 \
		--disable-profiling \
		--disable-library-profiling \
		--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="d015d643e0c121702c8e1a8a27db0a4f071fae35437bb4835314e70499b1eae123ab92d8272f0b91fae6d03b46cceee887e27935c950341c0905a4cdb43cbb84  idris-1.3.0.tar.gz
713ae5a61d5fe297a4e4afba61d8b5d4422183780e696bd3f6059a0753a391b4cbb869e1baed24203ad2f626421e5be9cd05785cf286e003ac236f0ed024f606  cabal.config"