From 37be0713e482b5aeccfe5896fe205cfaa6f5d0a7 Mon Sep 17 00:00:00 2001 From: Kevin Buhr <buhr@asaurus.net> Date: Fri, 3 May 2019 18:15:44 -0500 Subject: [PATCH] Handle trailing path separator in package DB names (#16360) Package DB directories with trailing separator (provided via GHC_PACKAGE_PATH or via -package-db) resulted in incorrect calculation of ${pkgroot} substitution variable. Keep the trailing separator while resolving as directory or file, but remove it before dropping the last path component with takeDirectory. Closes #16360. --- compiler/main/Packages.hs | 6 ++++-- testsuite/tests/driver/T16360/Hello.hs | 3 +++ testsuite/tests/driver/T16360/Makefile | 17 +++++++++++++++++ testsuite/tests/driver/T16360/all.T | 1 + testsuite/tests/driver/T16360/test/Test.hs | 4 ++++ testsuite/tests/driver/T16360/test/test.pkg | 8 ++++++++ 6 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 testsuite/tests/driver/T16360/Hello.hs create mode 100644 testsuite/tests/driver/T16360/Makefile create mode 100644 testsuite/tests/driver/T16360/all.T create mode 100644 testsuite/tests/driver/T16360/test/Test.hs create mode 100644 testsuite/tests/driver/T16360/test/test.pkg diff --git a/compiler/main/Packages.hs b/compiler/main/Packages.hs index 2275267d14c..dd12101bcb0 100644 --- a/compiler/main/Packages.hs +++ b/compiler/main/Packages.hs @@ -559,13 +559,15 @@ readPackageConfig dflags conf_file = do "can't find a package database at " ++ conf_file let + -- Fix #16360: remove trailing slash from conf_file before calculting pkgroot + conf_file' = dropTrailingPathSeparator conf_file top_dir = topDir dflags - pkgroot = takeDirectory conf_file + pkgroot = takeDirectory conf_file' pkg_configs1 = map (mungePackageConfig top_dir pkgroot) proto_pkg_configs pkg_configs2 = setBatchPackageFlags dflags pkg_configs1 -- - return (conf_file, pkg_configs2) + return (conf_file', pkg_configs2) where readDirStylePackageConfig conf_dir = do let filename = conf_dir </> "package.cache" diff --git a/testsuite/tests/driver/T16360/Hello.hs b/testsuite/tests/driver/T16360/Hello.hs new file mode 100644 index 00000000000..56109fa8bfa --- /dev/null +++ b/testsuite/tests/driver/T16360/Hello.hs @@ -0,0 +1,3 @@ +import Test + +main = print test diff --git a/testsuite/tests/driver/T16360/Makefile b/testsuite/tests/driver/T16360/Makefile new file mode 100644 index 00000000000..67dcf80ba82 --- /dev/null +++ b/testsuite/tests/driver/T16360/Makefile @@ -0,0 +1,17 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk + +LOCAL_PKGCONF=package.conf.d + +clean: + rm -f test/*.o test/*.hi *.o *.hi + rm -rf $(LOCAL_PKGCONF) + +.PHONY: T16360 +T16360: + @rm -rf $(LOCAL_PKGCONF) + "$(TEST_HC)" $(TEST_HC_OPTS) -this-unit-id test-1.0 -c test/Test.hs + "$(GHC_PKG)" init $(LOCAL_PKGCONF) + "$(GHC_PKG)" --no-user-package-db -f $(LOCAL_PKGCONF) register test/test.pkg -v0 + "$(TEST_HC)" $(TEST_HC_OPTS) -package-db $(LOCAL_PKGCONF)/ -c Hello.hs diff --git a/testsuite/tests/driver/T16360/all.T b/testsuite/tests/driver/T16360/all.T new file mode 100644 index 00000000000..1cc19459f92 --- /dev/null +++ b/testsuite/tests/driver/T16360/all.T @@ -0,0 +1 @@ +test('T16360', [extra_files(['Hello.hs', 'test/'])], makefile_test, []) diff --git a/testsuite/tests/driver/T16360/test/Test.hs b/testsuite/tests/driver/T16360/test/Test.hs new file mode 100644 index 00000000000..b4d7f27dce7 --- /dev/null +++ b/testsuite/tests/driver/T16360/test/Test.hs @@ -0,0 +1,4 @@ +module Test where + +test :: Int +test = 42 diff --git a/testsuite/tests/driver/T16360/test/test.pkg b/testsuite/tests/driver/T16360/test/test.pkg new file mode 100644 index 00000000000..f925cfe2d99 --- /dev/null +++ b/testsuite/tests/driver/T16360/test/test.pkg @@ -0,0 +1,8 @@ +name: test +version: 1.0 +id: test-1.0 +key: test-1.0 +exposed-modules: Test +import-dirs: ${pkgroot}/test +library-dirs: ${pkgroot}/test +exposed: True -- GitLab