summaryrefslogtreecommitdiff
path: root/testsuite/tests/cabal
diff options
context:
space:
mode:
authorEdward Z. Yang <ezyang@cs.stanford.edu>2014-07-04 17:01:08 +0100
committerEdward Z. Yang <ezyang@cs.stanford.edu>2014-07-25 17:59:55 -0700
commit7f5c10864e7c26b90c7ff4ed09d00c8a09aa4349 (patch)
tree45cc2f6c46f9cf583c8aeb7b324933d65586c1d5 /testsuite/tests/cabal
parentdae46da7de4d8c7104aea1be48586336bbd486ca (diff)
downloadhaskell-7f5c10864e7c26b90c7ff4ed09d00c8a09aa4349.tar.gz
Module reexports, fixing #8407.
The general approach is to add a new field to the package database, reexported-modules, which considered by the module finder as possible module declarations. Unlike declaring stub module files, multiple reexports of the same physical package at the same name do not result in an ambiguous import. Has submodule updates for Cabal and haddock. NB: When a reexport renames a module, that renaming is *not* accessible from inside the package. This is not so much a deliberate design choice as for implementation expediency (reexport resolution happens only when a package is in the package database.) TODO: Error handling when there are duplicate reexports/etc is not very well tested. Signed-off-by: Edward Z. Yang <ezyang@cs.stanford.edu> Conflicts: compiler/main/HscTypes.lhs testsuite/.gitignore utils/haddock
Diffstat (limited to 'testsuite/tests/cabal')
-rw-r--r--testsuite/tests/cabal/Makefile15
-rw-r--r--testsuite/tests/cabal/all.T6
-rw-r--r--testsuite/tests/cabal/cabal05/Makefile69
-rw-r--r--testsuite/tests/cabal/cabal05/Setup.hs2
-rw-r--r--testsuite/tests/cabal/cabal05/all.T9
-rw-r--r--testsuite/tests/cabal/cabal05/p/LICENSE0
-rw-r--r--testsuite/tests/cabal/cabal05/p/P.hs3
-rw-r--r--testsuite/tests/cabal/cabal05/p/P2.hs1
-rw-r--r--testsuite/tests/cabal/cabal05/p/Setup.hs2
-rw-r--r--testsuite/tests/cabal/cabal05/p/p.cabal11
-rw-r--r--testsuite/tests/cabal/cabal05/q/LICENSE0
-rw-r--r--testsuite/tests/cabal/cabal05/q/Q.hs4
-rw-r--r--testsuite/tests/cabal/cabal05/q/Setup.hs2
-rw-r--r--testsuite/tests/cabal/cabal05/q/q.cabal29
-rw-r--r--testsuite/tests/cabal/cabal05/r/LICENSE0
-rw-r--r--testsuite/tests/cabal/cabal05/r/R.hs11
-rw-r--r--testsuite/tests/cabal/cabal05/r/Setup.hs2
-rw-r--r--testsuite/tests/cabal/cabal05/r/r.cabal32
-rw-r--r--testsuite/tests/cabal/cabal05/s/LICENSE0
-rw-r--r--testsuite/tests/cabal/cabal05/s/S.hs18
-rw-r--r--testsuite/tests/cabal/cabal05/s/Setup.hs2
-rw-r--r--testsuite/tests/cabal/cabal05/s/s.cabal11
-rw-r--r--testsuite/tests/cabal/ghcpkg07.stdout11
-rw-r--r--testsuite/tests/cabal/recache_reexport_db/a.conf17
-rw-r--r--testsuite/tests/cabal/test7a.pkg17
-rw-r--r--testsuite/tests/cabal/test7b.pkg17
26 files changed, 291 insertions, 0 deletions
diff --git a/testsuite/tests/cabal/Makefile b/testsuite/tests/cabal/Makefile
index e8ed2bd817..062850f76f 100644
--- a/testsuite/tests/cabal/Makefile
+++ b/testsuite/tests/cabal/Makefile
@@ -236,3 +236,18 @@ ghcpkg02:
echo Updating $$i; \
$(GHC_PKG) describe --global $$i | $(GHC_PKG_ghcpkg02) update --global --force -; \
done
+
+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
+ $(LOCAL_GHC_PKG07) register --force test7a.pkg 2>/dev/null
+ $(LOCAL_GHC_PKG07) field testpkg7a reexported-modules
+ $(LOCAL_GHC_PKG07) register --force test7b.pkg 2>/dev/null
+ $(LOCAL_GHC_PKG07) field testpkg7b reexported-modules
+
+recache_reexport:
+ @rm -rf recache_reexport_db/package.cache
+ '$(GHC_PKG)' --no-user-package-db --global-package-db=recache_reexport_db recache
diff --git a/testsuite/tests/cabal/all.T b/testsuite/tests/cabal/all.T
index aa97f48209..60f8d6df9b 100644
--- a/testsuite/tests/cabal/all.T
+++ b/testsuite/tests/cabal/all.T
@@ -47,6 +47,12 @@ test('ghcpkg06',
run_command,
['$MAKE -s --no-print-directory ghcpkg06'])
+test('ghcpkg07',
+ extra_clean(['local07.package.conf',
+ 'local07.package.conf.old']),
+ run_command,
+ ['$MAKE -s --no-print-directory ghcpkg07'])
+
# Test that we *can* compile a module that also belongs to a package
# (this was disallowed in GHC 6.4 and earlier)
test('pkg01', normal, compile, [''])
diff --git a/testsuite/tests/cabal/cabal05/Makefile b/testsuite/tests/cabal/cabal05/Makefile
new file mode 100644
index 0000000000..d4bc1c733a
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/Makefile
@@ -0,0 +1,69 @@
+TOP=../../..
+include $(TOP)/mk/boilerplate.mk
+include $(TOP)/mk/test.mk
+
+SETUP = ../Setup -v0
+
+# This test is for package reexports
+# 1. install p
+# 2. install q (reexporting p modules)
+# 3. install r (reexporting p and q modules)
+# 4. configure and build s, using modules from q and r
+#
+# Here are the permutations we test for:
+# - Package qualifier? (YES/NO)
+# - Where is module? (defined in SELF /
+# (ORIGinally defined/REEXported) in DEPendency)
+# For deps, could be BOTH, if there is NO package qualifier
+# - Renamed? (YES/NO)
+# - Multiple modules with same name? (YES/NO)
+#
+# It's illegal for the module to be defined in SELF without renaming, or
+# for a package to cause a conflict with itself. A reexport which does
+# not rename definitionally "conflicts" with the original package's definition.
+#
+# Probably the trickiest bits are when we automatically pick out which package
+# when the package qualifier is missing, and handling whether or not modules
+# should be exposed or hidden.
+
+cabal05: clean
+ $(MAKE) clean
+ '$(GHC_PKG)' init tmp.d
+ '$(TEST_HC)' -v0 --make Setup
+ # build p
+ cd p && $(SETUP) clean
+ cd p && $(SETUP) configure $(CABAL_MINIMAL_BUILD) --with-ghc='$(TEST_HC)' --ghc-options='$(TEST_HC_OPTS)' --package-db=../tmp.d --prefix='$(PWD)/$$pkgid'
+ cd p && $(SETUP) build
+ cd p && $(SETUP) copy
+ cd p && $(SETUP) register
+ # build q
+ cd q && $(SETUP) clean
+ cd q && $(SETUP) configure $(CABAL_MINIMAL_BUILD) --with-ghc='$(TEST_HC)' --ghc-options='$(TEST_HC_OPTS)' --package-db=../tmp.d --prefix='$(PWD)/$$pkgid'
+ cd q && $(SETUP) build
+ cd q && $(SETUP) copy
+ cd q && $(SETUP) register
+ # build r
+ cd r && $(SETUP) clean
+ cd r && $(SETUP) configure $(CABAL_MINIMAL_BUILD) --with-ghc='$(TEST_HC)' --ghc-options='$(TEST_HC_OPTS)' --package-db=../tmp.d --prefix='$(PWD)/$$pkgid'
+ cd r && $(SETUP) build
+ cd r && $(SETUP) copy
+ cd r && $(SETUP) register
+ # build s
+ cd s && $(SETUP) clean
+ cd s && $(SETUP) configure $(CABAL_MINIMAL_BUILD) --with-ghc='$(TEST_HC)' --ghc-options='$(TEST_HC_OPTS)' --package-db=../tmp.d
+ cd s && $(SETUP) build
+ # now test that package recaching works
+ rm tmp.d/package.cache
+ '$(GHC_PKG)' --no-user-package-db --global-package-db=tmp.d recache
+ cd s && $(SETUP) clean
+ cd s && $(SETUP) configure $(CABAL_MINIMAL_BUILD) --with-ghc='$(TEST_HC)' --ghc-options='$(TEST_HC_OPTS)' --package-db=../tmp.d
+ cd s && $(SETUP) build
+ifneq "$(CLEANUP)" ""
+ $(MAKE) clean
+endif
+
+clean :
+ '$(GHC_PKG)' unregister --force p >/dev/null 2>&1 || true
+ '$(GHC_PKG)' unregister --force q >/dev/null 2>&1 || true
+ '$(GHC_PKG)' unregister --force r >/dev/null 2>&1 || true
+ $(RM) -r p-* q-* r-* tmp.d *.o *.hi */*.o */*.hi */Setup$(exeext) */dist Setup$(exeext)
diff --git a/testsuite/tests/cabal/cabal05/Setup.hs b/testsuite/tests/cabal/cabal05/Setup.hs
new file mode 100644
index 0000000000..9a994af677
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/testsuite/tests/cabal/cabal05/all.T b/testsuite/tests/cabal/cabal05/all.T
new file mode 100644
index 0000000000..36dcbdf9de
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/all.T
@@ -0,0 +1,9 @@
+if default_testopts.cleanup != '':
+ cleanup = 'CLEANUP=1'
+else:
+ cleanup = ''
+
+test('cabal05',
+ ignore_output,
+ run_command,
+ ['$MAKE -s --no-print-directory cabal05 ' + cleanup])
diff --git a/testsuite/tests/cabal/cabal05/p/LICENSE b/testsuite/tests/cabal/cabal05/p/LICENSE
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/p/LICENSE
diff --git a/testsuite/tests/cabal/cabal05/p/P.hs b/testsuite/tests/cabal/cabal05/p/P.hs
new file mode 100644
index 0000000000..f8b82de2ca
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/p/P.hs
@@ -0,0 +1,3 @@
+module P where
+data P = P
+p = True
diff --git a/testsuite/tests/cabal/cabal05/p/P2.hs b/testsuite/tests/cabal/cabal05/p/P2.hs
new file mode 100644
index 0000000000..769760dff8
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/p/P2.hs
@@ -0,0 +1 @@
+module P2 where
diff --git a/testsuite/tests/cabal/cabal05/p/Setup.hs b/testsuite/tests/cabal/cabal05/p/Setup.hs
new file mode 100644
index 0000000000..9a994af677
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/p/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/testsuite/tests/cabal/cabal05/p/p.cabal b/testsuite/tests/cabal/cabal05/p/p.cabal
new file mode 100644
index 0000000000..989156c5be
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/p/p.cabal
@@ -0,0 +1,11 @@
+name: p
+version: 0.1.0.0
+license-file: LICENSE
+author: Edward Z. Yang
+maintainer: ezyang@cs.stanford.edu
+build-type: Simple
+cabal-version: >=1.21
+
+library
+ exposed-modules: P, P2
+ build-depends: base
diff --git a/testsuite/tests/cabal/cabal05/q/LICENSE b/testsuite/tests/cabal/cabal05/q/LICENSE
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/q/LICENSE
diff --git a/testsuite/tests/cabal/cabal05/q/Q.hs b/testsuite/tests/cabal/cabal05/q/Q.hs
new file mode 100644
index 0000000000..721b231aa1
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/q/Q.hs
@@ -0,0 +1,4 @@
+module Q where
+import P
+data Q = Q
+q = not p
diff --git a/testsuite/tests/cabal/cabal05/q/Setup.hs b/testsuite/tests/cabal/cabal05/q/Setup.hs
new file mode 100644
index 0000000000..9a994af677
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/q/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/testsuite/tests/cabal/cabal05/q/q.cabal b/testsuite/tests/cabal/cabal05/q/q.cabal
new file mode 100644
index 0000000000..2ea54f2e8d
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/q/q.cabal
@@ -0,0 +1,29 @@
+name: q
+version: 0.1.0.0
+license-file: LICENSE
+author: Edward Z. Yang
+maintainer: ezyang@cs.stanford.edu
+build-type: Simple
+cabal-version: >=1.21
+
+library
+ exposed-modules: Q
+ reexported-modules:
+ -- qualified=NO, where=DEP(ORIG), renaming=NO, conflict=NO
+ -- impossible
+ -- qualified=NO, where=DEP(ORIG), renaming=NO, conflict=YES (p,s)
+ P,
+ -- qualified=NO, where=DEP(ORIG), renaming=YES, conflict=NO
+ P as QP,
+ -- qualified=NO, where=DEP(ORIG), renaming=YES, conflict=YES (r)
+ P as PMerge,
+ P2 as PMerge2,
+ -- qualified=NO, where=SELF, renaming=NO, conflict=NO
+ -- impossible
+ -- qualified=NO, where=SELF, renaming=NO, conflict=YES
+ -- should error
+ -- qualified=NO, where=SELF, renaming=YES, conflict=NO
+ Q as QQ,
+ -- qualified=NO, where=SELF, renaming=YES, conflict=YES (r)
+ Q as QMerge
+ build-depends: base, p
diff --git a/testsuite/tests/cabal/cabal05/r/LICENSE b/testsuite/tests/cabal/cabal05/r/LICENSE
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/r/LICENSE
diff --git a/testsuite/tests/cabal/cabal05/r/R.hs b/testsuite/tests/cabal/cabal05/r/R.hs
new file mode 100644
index 0000000000..6f086340cf
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/r/R.hs
@@ -0,0 +1,11 @@
+module R where
+import P -- p (exposed), q (reexport p:P)
+import P2 -- q (reexport p:P)
+import Q -- q (exposed)
+import qualified QP -- q (reexport p:P)
+import qualified QQ -- q (reexport q:Q)
+import qualified PMerge -- q (reexport p:P)
+import qualified PMerge2 -- q (reexport p:P2)
+import qualified QMerge -- q (reexport q:Q)
+data R = R
+r = p && q
diff --git a/testsuite/tests/cabal/cabal05/r/Setup.hs b/testsuite/tests/cabal/cabal05/r/Setup.hs
new file mode 100644
index 0000000000..9a994af677
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/r/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/testsuite/tests/cabal/cabal05/r/r.cabal b/testsuite/tests/cabal/cabal05/r/r.cabal
new file mode 100644
index 0000000000..d550340c0e
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/r/r.cabal
@@ -0,0 +1,32 @@
+name: r
+version: 0.1.0.0
+license-file: LICENSE
+author: Edward Z. Yang
+maintainer: ezyang@cs.stanford.edu
+build-type: Simple
+cabal-version: >=1.21
+
+library
+ exposed-modules: R
+ reexported-modules:
+ -- qualified=NO, where=DEP(BOTH), renaming=NO, conflict=YES (p,q)
+ P,
+ -- qualified=NO, where=DEP(BOTH), renaming=YES, conflict=NO
+ P as RP2,
+ -- qualified=NO, where=DEP(BOTH), renaming=YES, conflict=YES
+ P2 as PMerge,
+ -- qualified=YES, where=DEP(ORIG), renaming=YES, conflict=NO
+ p:P as RP,
+ -- qualified=YES, where=DEP(REEX), renaming=YES, conflict=NO
+ q:QP as RQP,
+ -- qualified=YES, where=DEP(REEX), renaming=YES, conflict=NO
+ q:P as RQP2,
+ -- qualified=YES, where=DEP(REEX), renaming=YES, conflict=YES
+ q:QQ as QMerge,
+ -- qualified=YES, where=SELF, renaming=YES, conflict=NO
+ r:R as RR,
+ -- qualified=YES, where=DEP, renaming=NO, conflict=YES (q)
+ q:Q,
+ -- qualified=YES, where=DEP(ORIG), renaming=YES, conflict=YES (q)
+ p:P2 as PMerge2
+ build-depends: base, p, q
diff --git a/testsuite/tests/cabal/cabal05/s/LICENSE b/testsuite/tests/cabal/cabal05/s/LICENSE
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/s/LICENSE
diff --git a/testsuite/tests/cabal/cabal05/s/S.hs b/testsuite/tests/cabal/cabal05/s/S.hs
new file mode 100644
index 0000000000..ed3c378072
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/s/S.hs
@@ -0,0 +1,18 @@
+module S where
+-- NB: package p is hidden!
+import qualified QP -- q (reexport p:P)
+import qualified RP -- r (reexport p:P)
+import qualified Q -- q (exposed), r (reexport q:Q)
+import qualified R -- r (exposed)
+import qualified RR -- r (reexport r:R)
+import qualified RP -- r (reexport p:P)
+import qualified RQP -- r (reexport p:P)
+import qualified RQP2 -- r (reexport p:P)
+import qualified PMerge -- q (reexport p:P), r (reexport p:P)
+import qualified PMerge2 -- q (reexport p:P2), r (reexport p:P2)
+import qualified QMerge -- q (reexport q:Q), r (reexport q:Q)
+
+x :: QP.P
+x = RP.P
+
+s = QP.p || Q.q || R.r
diff --git a/testsuite/tests/cabal/cabal05/s/Setup.hs b/testsuite/tests/cabal/cabal05/s/Setup.hs
new file mode 100644
index 0000000000..9a994af677
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/s/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/testsuite/tests/cabal/cabal05/s/s.cabal b/testsuite/tests/cabal/cabal05/s/s.cabal
new file mode 100644
index 0000000000..a0b09939a1
--- /dev/null
+++ b/testsuite/tests/cabal/cabal05/s/s.cabal
@@ -0,0 +1,11 @@
+name: s
+version: 0.1.0.0
+license-file: LICENSE
+author: Edward Z. Yang
+maintainer: ezyang@cs.stanford.edu
+build-type: Simple
+cabal-version: >=1.21
+
+library
+ exposed-modules: S
+ build-depends: base, q, r
diff --git a/testsuite/tests/cabal/ghcpkg07.stdout b/testsuite/tests/cabal/ghcpkg07.stdout
new file mode 100644
index 0000000000..f890b5bfe1
--- /dev/null
+++ b/testsuite/tests/cabal/ghcpkg07.stdout
@@ -0,0 +1,11 @@
+Reading package info from "test.pkg" ... done.
+Reading package info from "test7a.pkg" ... done.
+reexported-modules: testpkg:A (A@testpkg-1.2.3.4-XXX)
+ testpkg:A as A1 (A@testpkg-1.2.3.4-XXX)
+ E as E2 (E@testpkg7a-1.0-XXX)
+Reading package info from "test7b.pkg" ... done.
+reexported-modules: testpkg:A as F1 (A@testpkg-1.2.3.4-XXX)
+ testpkg7a:A as F2 (A@testpkg-1.2.3.4-XXX)
+ testpkg7a:A1 as F3 (A@testpkg-1.2.3.4-XXX)
+ testpkg7a:E as F4 (E@testpkg7a-1.0-XXX) E (E@testpkg7a-1.0-XXX)
+ E2 as E3 (E@testpkg7a-1.0-XXX)
diff --git a/testsuite/tests/cabal/recache_reexport_db/a.conf b/testsuite/tests/cabal/recache_reexport_db/a.conf
new file mode 100644
index 0000000000..c0698d70b9
--- /dev/null
+++ b/testsuite/tests/cabal/recache_reexport_db/a.conf
@@ -0,0 +1,17 @@
+name: testpkg7a
+version: 1.0
+id: testpkg7a-1.0-XXX
+license: BSD3
+copyright: (c) The Univsersity of Glasgow 2004
+maintainer: glasgow-haskell-users@haskell.org
+stability: stable
+homepage: http://www.haskell.org/ghc
+package-url: http://www.haskell.org/ghc
+description: A Test Package
+category: none
+author: simonmar@microsoft.com
+exposed: True
+exposed-modules: E
+reexported-modules: testpkg:A, testpkg:A as A1, E as E2
+hs-libraries: testpkg7a-1.0
+depends: testpkg-1.2.3.4-XXX
diff --git a/testsuite/tests/cabal/test7a.pkg b/testsuite/tests/cabal/test7a.pkg
new file mode 100644
index 0000000000..c0698d70b9
--- /dev/null
+++ b/testsuite/tests/cabal/test7a.pkg
@@ -0,0 +1,17 @@
+name: testpkg7a
+version: 1.0
+id: testpkg7a-1.0-XXX
+license: BSD3
+copyright: (c) The Univsersity of Glasgow 2004
+maintainer: glasgow-haskell-users@haskell.org
+stability: stable
+homepage: http://www.haskell.org/ghc
+package-url: http://www.haskell.org/ghc
+description: A Test Package
+category: none
+author: simonmar@microsoft.com
+exposed: True
+exposed-modules: E
+reexported-modules: testpkg:A, testpkg:A as A1, E as E2
+hs-libraries: testpkg7a-1.0
+depends: testpkg-1.2.3.4-XXX
diff --git a/testsuite/tests/cabal/test7b.pkg b/testsuite/tests/cabal/test7b.pkg
new file mode 100644
index 0000000000..d8bf47ec36
--- /dev/null
+++ b/testsuite/tests/cabal/test7b.pkg
@@ -0,0 +1,17 @@
+name: testpkg7b
+version: 1.0
+id: testpkg7b-1.0-XXX
+license: BSD3
+copyright: (c) The Univsersity of Glasgow 2004
+maintainer: glasgow-haskell-users@haskell.org
+stability: stable
+homepage: http://www.haskell.org/ghc
+package-url: http://www.haskell.org/ghc
+description: A Test Package
+category: none
+author: simonmar@microsoft.com
+exposed: True
+reexported-modules: testpkg:A as F1, testpkg7a:A as F2,
+ testpkg7a:A1 as F3, testpkg7a:E as F4, E, E2 as E3
+hs-libraries: testpkg7b-1.0
+depends: testpkg-1.2.3.4-XXX, testpkg7a-1.0-XXX