Makefile 11.6 KB
Newer Older
1
TOP=../..
2 3 4
include $(TOP)/mk/boilerplate.mk
include $(TOP)/mk/test.mk

Ian Lynagh's avatar
Ian Lynagh committed
5
PKGCONF01=local01.package.conf
6
LOCAL_GHC_PKG01 = '$(GHC_PKG)' --no-user-package-db -f $(PKGCONF01)
7

8 9
STRIP_PKGROOT=sed 's/^pkgroot: .*$$/pkgroot: /'

10 11
# a bunch of tests for ghc-pkg
ghcpkg01 :
12 13
	@rm -rf $(PKGCONF01)
	$(LOCAL_GHC_PKG01) init $(PKGCONF01)
Ian Lynagh's avatar
Ian Lynagh committed
14
	$(LOCAL_GHC_PKG01) list
Simon Marlow's avatar
Simon Marlow committed
15
	$(LOCAL_GHC_PKG01) register --force test.pkg 2>/dev/null
16 17
	$(LOCAL_GHC_PKG01) describe testpkg         | $(STRIP_PKGROOT)
	$(LOCAL_GHC_PKG01) describe testpkg-1.2.3.4 | $(STRIP_PKGROOT)
Ian Lynagh's avatar
Ian Lynagh committed
18
	$(LOCAL_GHC_PKG01) field testpkg-1.2.3.4 import-dirs
19 20

	@: # test2.pkg is a later version of testpkg-1.2.3.4
Simon Marlow's avatar
Simon Marlow committed
21
	$(LOCAL_GHC_PKG01) register --force test2.pkg 2>/dev/null
Ian Lynagh's avatar
Ian Lynagh committed
22
	$(LOCAL_GHC_PKG01) list
23 24
	$(LOCAL_GHC_PKG01) describe testpkg-2.0 | $(STRIP_PKGROOT)
	$(LOCAL_GHC_PKG01) describe testpkg-*   | $(STRIP_PKGROOT)
Ian Lynagh's avatar
Ian Lynagh committed
25
	$(LOCAL_GHC_PKG01) field testpkg-* version
26 27

	@: # test hiding/exposing
Ian Lynagh's avatar
Ian Lynagh committed
28 29 30 31 32 33
	$(LOCAL_GHC_PKG01) hide testpkg-1.2.3.4
	$(LOCAL_GHC_PKG01) field testpkg-1.2.3.4 exposed | grep False
	$(LOCAL_GHC_PKG01) expose testpkg-2.0
	$(LOCAL_GHC_PKG01) field testpkg-2.0 exposed | grep True
	$(LOCAL_GHC_PKG01) hide testpkg-*
	$(LOCAL_GHC_PKG01) field testpkg-* exposed
34 35

	@: # test3.pkg  depends on testpkg-2.0
Ian Lynagh's avatar
Ian Lynagh committed
36
	$(LOCAL_GHC_PKG01) register test3.pkg
Simon Marlow's avatar
Simon Marlow committed
37 38 39 40

	@: # unregistering testpkg-2.0 should fail now, testpkg-3.0 depends on it
	if $(LOCAL_GHC_PKG01) unregister testpkg-2.0; then false; else true; fi

Ian Lynagh's avatar
Ian Lynagh committed
41
	$(LOCAL_GHC_PKG01) unregister testpkg-3.0
42

Ian Lynagh's avatar
Ian Lynagh committed
43
	$(LOCAL_GHC_PKG01) unregister testpkg-2.0
44
	$(LOCAL_GHC_PKG01) describe testpkg | $(STRIP_PKGROOT)
Ian Lynagh's avatar
Ian Lynagh committed
45 46
	$(LOCAL_GHC_PKG01) unregister testpkg-*
	$(LOCAL_GHC_PKG01) list
47 48

	@: # registering test3.pkg should fail now, its dependency has gone
Ian Lynagh's avatar
Ian Lynagh committed
49 50 51
	if $(LOCAL_GHC_PKG01) register test3.pkg; then false; else true; fi

PKGCONF03=local03.package.conf
52
LOCAL_GHC_PKG03 = '$(GHC_PKG)' --no-user-package-db -f $(PKGCONF03)
53

54
ghcpkg03 :
55 56
	@rm -rf $(PKGCONF03)
	$(LOCAL_GHC_PKG03) init $(PKGCONF03)
57
	@: # update should hide conflicting packages
Ian Lynagh's avatar
Ian Lynagh committed
58 59
	$(LOCAL_GHC_PKG03) register --force test.pkg
	$(LOCAL_GHC_PKG03) register --force test2.pkg
60 61

	@: # test4.pkg depends on testpkg-2.0, which conflicts with testpkg-1.2.3.4,
62
	@: # ghc-pkg will happily register it now (it didn't in GHC 6.4)
Ian Lynagh's avatar
Ian Lynagh committed
63 64
	$(LOCAL_GHC_PKG03) register test4.pkg
	$(LOCAL_GHC_PKG03) update test4.pkg
65 66

	@: # and another update of test.pkg will now hide dep-2.0
Ian Lynagh's avatar
Ian Lynagh committed
67
	$(LOCAL_GHC_PKG03) update --force test.pkg
68

Ian Lynagh's avatar
Ian Lynagh committed
69
PKGCONF04=local04.package.conf
70
LOCAL_GHC_PKG04 = '$(GHC_PKG)' --no-user-package-db -f $(PKGCONF04)
71 72 73

# Test that importing a module exposed by two packages reports a conflict
ghcpkg04 :
74 75
	rm -rf $(PKGCONF04)
	$(LOCAL_GHC_PKG04) init $(PKGCONF04)
76 77 78
	$(LOCAL_GHC_PKG04) register --force test.pkg >/dev/null 2>&1 
	$(LOCAL_GHC_PKG04) update --force test5.pkg >/dev/null 2>&1 
	$(LOCAL_GHC_PKG04) expose testpkg-1.2.3.4  >/dev/null 2>&1
79
	@: # testpkg-1.2.3.4 and newtestpkg-2.0 are both exposed now
80
	'$(TEST_HC)' $(TEST_HC_OPTS) -package-db $(PKGCONF04) -c ghcpkg04.hs || true
Ian Lynagh's avatar
Ian Lynagh committed
81

82 83 84
# Test stacking of package.confs (also #2441)
PKGCONF05a=local05a.package.conf
PKGCONF05b=local05b.package.conf
85 86
LOCAL_GHC_PKG05a = '$(GHC_PKG)' --no-user-package-db -f $(PKGCONF05a)
LOCAL_GHC_PKG05b = '$(GHC_PKG)' --no-user-package-db -f $(PKGCONF05a) -f $(PKGCONF05b)
87 88

ghcpkg05 :
89 90 91
	rm -rf $(PKGCONF05a) $(PKGCONF05b)
	$(LOCAL_GHC_PKG05a) init $(PKGCONF05a)
	$(LOCAL_GHC_PKG05b) init $(PKGCONF05b)
92 93
	$(LOCAL_GHC_PKG05a) register --force test2.pkg >/dev/null 2>&1 
	$(LOCAL_GHC_PKG05b) register --force test3.pkg >/dev/null 2>&1 
94
	$(LOCAL_GHC_PKG05b) check || true
95 96 97 98 99 100 101
	$(LOCAL_GHC_PKG05b) list
	$(LOCAL_GHC_PKG05b) expose testpkg-2.0
	$(LOCAL_GHC_PKG05b) hide   testpkg-2.0
	if $(LOCAL_GHC_PKG05b) unregister testpkg-2.0; then false; else true; fi
	$(LOCAL_GHC_PKG05b) unregister testpkg-3.0
	$(LOCAL_GHC_PKG05b) unregister testpkg-2.0

Simon Marlow's avatar
Simon Marlow committed
102 103
# Test for #2330: reject duplicate dependencies
PKGCONF06=local06.package.conf
104
LOCAL_GHC_PKG06 = '$(GHC_PKG)' --no-user-package-db -f $(PKGCONF06)
Simon Marlow's avatar
Simon Marlow committed
105 106

ghcpkg06 :
107 108
	rm -rf $(PKGCONF06)
	$(LOCAL_GHC_PKG06) init $(PKGCONF06)
Simon Marlow's avatar
Simon Marlow committed
109 110 111 112
	$(LOCAL_GHC_PKG06) register --force test.pkg >/dev/null 2>&1 
	if $(LOCAL_GHC_PKG06) register testdup.pkg; then false else true; fi
	$(LOCAL_GHC_PKG06) register --force testdup.pkg

113 114 115 116 117 118 119 120 121
PKGCONFT1750=localT1750.package.conf
LOCAL_GHC_PKGT1750 = '$(GHC_PKG)' --no-user-package-db -f $(PKGCONFT1750)

T1750:
	rm -rf $(PKGCONFT1750) T1750.hs T1750.o T1750.hi T1750.out
	$(LOCAL_GHC_PKGT1750) init $(PKGCONFT1750)
	$(LOCAL_GHC_PKGT1750) register --force T1750A.pkg >T1750.out 2>&1
	$(LOCAL_GHC_PKGT1750) register --force T1750B.pkg >T1750.out 2>&1
	GHC_PACKAGE_PATH=$(PKGCONFT1750) '$(GHC_PKG)' --no-user-package-db list
Simon Marlow's avatar
Simon Marlow committed
122 123 124
# GHC_PACKAGE_PATH trick is to make this work with 6.8.2 which doesn't have
# the patch "Change the command-line semantics for query commands" to
# ghc-pkg
125 126
	echo "main = return ()" >T1750.hs
	'$(TEST_HC)' $(TEST_HC_OPTS) -package-db $(PKGCONFT1750) -package T1750A T1750.hs || true
Simon Marlow's avatar
Simon Marlow committed
127

128 129
PKGCONFSHADOW1=localshadow1.package.conf
PKGCONFSHADOW2=localshadow2.package.conf
130
PKGCONFSHADOW3=localshadow3.package.conf
131 132
LOCAL_GHC_PKGSHADOW1 = '$(GHC_PKG)' --no-user-package-db -f $(PKGCONFSHADOW1)
LOCAL_GHC_PKGSHADOW2 = '$(GHC_PKG)' --no-user-package-db -f $(PKGCONFSHADOW2)
133 134 135
LOCAL_GHC_PKGSHADOW3 = '$(GHC_PKG)' --no-user-package-db -f $(PKGCONFSHADOW3)
LOCAL_GHC_PKGSHADOW12 = '$(GHC_PKG)' --no-user-package-db -f $(PKGCONFSHADOW1) -f $(PKGCONFSHADOW2)
LOCAL_GHC_PKGSHADOW13 = '$(GHC_PKG)' --no-user-package-db -f $(PKGCONFSHADOW1) -f $(PKGCONFSHADOW3)
136 137 138 139

# Test package shadowing behaviour.
#
#     localshadow1.package.conf:  shadowdep-1-XXX <- shadow-1-XXX
140 141 142 143 144
#     localshadow2.package.conf:                     shadow-1-XXX
#
# If the ABI hash of boths shadow-1s are the same, we'll just accept
# the later shadow version.  However, if the ABIs are different, we
# should complain!
145
shadow:
146
	rm -rf $(PKGCONFSHADOW1) $(PKGCONFSHADOW2) $(PKGCONFSHADOW3) shadow.hs shadow.o shadow.hi shadow.out shadow.hs shadow.hi
147 148
	$(LOCAL_GHC_PKGSHADOW1) init $(PKGCONFSHADOW1)
	$(LOCAL_GHC_PKGSHADOW2) init $(PKGCONFSHADOW2)
149
	$(LOCAL_GHC_PKGSHADOW3) init $(PKGCONFSHADOW3)
Ian Lynagh's avatar
Ian Lynagh committed
150 151 152
	$(LOCAL_GHC_PKGSHADOW1) register -v0 --force shadow1.pkg
	$(LOCAL_GHC_PKGSHADOW1) register -v0 --force shadow2.pkg
	$(LOCAL_GHC_PKGSHADOW2) register -v0 --force shadow3.pkg
153 154 155 156 157
	$(LOCAL_GHC_PKGSHADOW3) register -v0 --force shadow1.pkg
	@echo "databases 1 and 2:"
	$(LOCAL_GHC_PKGSHADOW12) list
	@echo "databases 1 and 3:"
	$(LOCAL_GHC_PKGSHADOW13) list
158
	echo "main = return ()" >shadow.hs
159 160 161
#
# In this test, the later database defines a new shadow-1-XXX which
# shadows the old one, making shadowdep unsatisfiable.
162 163
#
	@echo "should FAIL:"
164
	if '$(TEST_HC)' $(TEST_HC_OPTS) -package-db $(PKGCONFSHADOW1) -package-db $(PKGCONFSHADOW2) -package shadowdep -c shadow.hs -fno-code; then false; else true; fi
165
#
166 167 168
# Reversing the orders of the configs fixes the problem, because now
# the shadow-1-XXX defined in the same DB as shadowdep shadows
# shadow-1-XXX in localshadow2.package.conf
169
#
170 171
	@echo "should SUCCEED:"
	'$(TEST_HC)' $(TEST_HC_OPTS) -package-db $(PKGCONFSHADOW2) -package-db $(PKGCONFSHADOW1) -package shadowdep -c shadow.hs -fno-code
172
#
173
# When the ABIs are the same, dependencies don't break, we just swap it in
174 175
#
	@echo "should SUCCEED:"
176
	'$(TEST_HC)' $(TEST_HC_OPTS) -package-db $(PKGCONFSHADOW3) -package-db $(PKGCONFSHADOW1) -package shadowdep -c shadow.hs -fno-code
177

178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
# If we pass --global, we should ignore instances in the user database
T5442a:
	@rm -rf package.conf.T5442a.global package.conf.T5442a.user
	'$(GHC_PKG)' init package.conf.T5442a.global
	'$(GHC_PKG)' init package.conf.T5442a.user
	'$(GHC_PKG)' -f package.conf.T5442a.global register --force-files test.pkg 2>/dev/null
	'$(GHC_PKG)' -f package.conf.T5442a.user register --force-files test.pkg 2>/dev/null
	'$(GHC_PKG)' --global-package-db=package.conf.T5442a.global --user-package-db=package.conf.T5442a.user --global unregister testpkg
	@echo "global (should be empty):"
	'$(GHC_PKG)' -f package.conf.T5442a.global list --simple-output
	@echo "user:"
	'$(GHC_PKG)' -f package.conf.T5442a.user list --simple-output

# If we pass --user, we should ignore instances in the global database
T5442b:
	@rm -rf package.conf.T5442b.global package.conf.T5442b.user
	'$(GHC_PKG)' init package.conf.T5442b.global
	'$(GHC_PKG)' init package.conf.T5442b.user
	'$(GHC_PKG)' -f package.conf.T5442b.global register --force-files test.pkg 2>/dev/null
	! '$(GHC_PKG)' --global-package-db=package.conf.T5442b.global --user-package-db=package.conf.T5442b.user --user unregister testpkg
	@echo "global (should have testpkg):"
	'$(GHC_PKG)' -f package.conf.T5442b.global list --simple-output

# If we pass -f, we should ignore the user and global databases
T5442c:
	@rm -rf package.conf.T5442c.global package.conf.T5442c.user package.conf.T5442c.extra
	'$(GHC_PKG)' init package.conf.T5442c.global
	'$(GHC_PKG)' init package.conf.T5442c.user
	'$(GHC_PKG)' init package.conf.T5442c.extra
	'$(GHC_PKG)' -f package.conf.T5442c.global register --force-files test.pkg 2>/dev/null
	'$(GHC_PKG)' -f package.conf.T5442c.user register --force-files test.pkg 2>/dev/null
	! '$(GHC_PKG)' --global-package-db=package.conf.T5442c.global --user-package-db=package.conf.T5442c.user -f package.conf.T5442c.extra unregister testpkg
	@echo "global (should have testpkg):"
	'$(GHC_PKG)' -f package.conf.T5442c.global list --simple-output
	@echo "use (should have testpkg):"
	'$(GHC_PKG)' -f package.conf.T5442c.user list --simple-output

# If we pass --global and -f, we remove from the global database, but
# warn about possible breakage in the full package stack
T5442d:
	@rm -rf package.conf.T5442d.global package.conf.T5442d.user package.conf.T5442d.extra
	'$(GHC_PKG)' init package.conf.T5442d.global
	'$(GHC_PKG)' init package.conf.T5442d.user
	'$(GHC_PKG)' init package.conf.T5442d.extra
	'$(GHC_PKG)' -f package.conf.T5442d.global register --force-files shadow1.pkg 2>/dev/null
223
	'$(GHC_PKG)' -f package.conf.T5442d.user register --force-files shadow4.pkg 2>/dev/null
224 225 226 227 228 229 230 231
	'$(GHC_PKG)' --global-package-db=package.conf.T5442d.global -f package.conf.T5442d.extra register --force-files shadow2.pkg 2>/dev/null
	'$(GHC_PKG)' --global-package-db=package.conf.T5442d.global --user-package-db=package.conf.T5442d.user -f package.conf.T5442d.extra --global unregister shadow --force
	@echo "global (should be empty):"
	'$(GHC_PKG)' -f package.conf.T5442d.global list --simple-output
	@echo "user:"
	'$(GHC_PKG)' -f package.conf.T5442d.user list --simple-output
	@echo "extra:"
	'$(GHC_PKG)' -f package.conf.T5442d.extra list --simple-output
232

233 234 235 236 237
# -----------------------------------------------------------------------------
# Try piping the output of "ghc-pkg describe" into "ghc-pkg update" for
# every package we know about.  This is for testing the pretty printing/parsing
# of InstalledPackageInfo.

238
PACKAGE_CONF_ghcpkg02 = package.conf.ghcpkg02
239
GHC_PKG_ghcpkg02 = '$(GHC_PKG)' --no-user-package-db --global-package-db=$(PACKAGE_CONF_ghcpkg02)
Simon Marlow's avatar
Simon Marlow committed
240

Ian Lynagh's avatar
Ian Lynagh committed
241
ghcpkg02:
242 243
	rm -rf $(PACKAGE_CONF_ghcpkg02)
	$(GHC_PKG_ghcpkg02) init $(PACKAGE_CONF_ghcpkg02)
244
	set -e; \
thomie's avatar
thomie committed
245
	for i in `'$(GHC_PKG)' list --global --simple-output -v0`; do \
246
		'$(GHC_PKG)' describe --global $$i | $(GHC_PKG_ghcpkg02) -v0 update --global --force -; \
247
	done
248 249 250 251 252 253 254

PKGCONF07=local07.package.conf
LOCAL_GHC_PKG07 = '$(GHC_PKG)' --no-user-package-db -f $(PKGCONF07)
ghcpkg07:
	@rm -rf $(PKGCONF07)
	$(LOCAL_GHC_PKG07) init $(PKGCONF07)
	$(LOCAL_GHC_PKG07) register --force test.pkg 2>/dev/null
255
	$(LOCAL_GHC_PKG07) register --force test7a.pkg 2>&1 | grep "module" || :
256
	$(LOCAL_GHC_PKG07) field testpkg7a exposed-modules
257
	$(LOCAL_GHC_PKG07) register --force test7b.pkg 2>&1 | grep "module" || :
258
	$(LOCAL_GHC_PKG07) field testpkg7b exposed-modules
259 260 261 262

recache_reexport:
	@rm -rf recache_reexport_db/package.cache
	'$(GHC_PKG)' --no-user-package-db --global-package-db=recache_reexport_db recache