OBS-URL: https://build.opensuse.org/package/show/devel:languages:haskell/ghc?expand=0&rev=419
278 lines
11 KiB
Diff
278 lines
11 KiB
Diff
From 1f8f9fd08fb90bd94668ac8a81c94e179fc8ab86 Mon Sep 17 00:00:00 2001
|
|
From: Matthew Pickering <matthewtpickering@gmail.com>
|
|
Date: Fri, 14 Mar 2025 12:55:51 +0000
|
|
Subject: [PATCH] Set <pkgname_datadir> to an absolute path
|
|
|
|
Ticket #10717 points out that the <pkgname>_datadir environment variable
|
|
should be set to an absolute path since the test executables may
|
|
change directory during their invocation.
|
|
|
|
This is easily fixed by using the absoluteWorkingDirLBI
|
|
function, which was introduced in 027bddfcdf3ba298376c60be1ccf664ebc394cec,
|
|
|
|
Fixes #10717
|
|
---
|
|
Cabal/src/Distribution/Simple/Bench.hs | 2 +
|
|
Cabal/src/Distribution/Simple/Build.hs | 50 ++++++++++---------
|
|
Cabal/src/Distribution/Simple/Haddock.hs | 3 +-
|
|
Cabal/src/Distribution/Simple/Test.hs | 2 +
|
|
cabal-install/src/Distribution/Client/Run.hs | 3 ++
|
|
.../DataDirSetupTest/cabal.cabal.out | 13 +++++
|
|
.../PackageTests/DataDirSetupTest/cabal.out | 13 +++++
|
|
changelog.d/pr-10830.md | 10 ++++
|
|
8 files changed, 72 insertions(+), 24 deletions(-)
|
|
create mode 100644 cabal-testsuite/PackageTests/DataDirSetupTest/cabal.cabal.out
|
|
create mode 100644 cabal-testsuite/PackageTests/DataDirSetupTest/cabal.out
|
|
create mode 100644 changelog.d/pr-10830.md
|
|
|
|
diff --git a/Cabal/src/Distribution/Simple/Bench.hs b/Cabal/src/Distribution/Simple/Bench.hs
|
|
index 78f169f25..c4b4dbd2f 100644
|
|
--- a/Cabal/src/Distribution/Simple/Bench.hs
|
|
+++ b/Cabal/src/Distribution/Simple/Bench.hs
|
|
@@ -56,6 +56,7 @@ bench
|
|
-- ^ flags sent to benchmark
|
|
-> IO ()
|
|
bench args pkg_descr lbi flags = do
|
|
+ curDir <- LBI.absoluteWorkingDirLBI lbi
|
|
let verbosity = fromFlag $ benchmarkVerbosity flags
|
|
benchmarkNames = args
|
|
pkgBenchmarks = PD.benchmarks pkg_descr
|
|
@@ -71,6 +72,7 @@ bench args pkg_descr lbi flags = do
|
|
{ -- Include any build-tool-depends on build tools internal to the current package.
|
|
LBI.withPrograms =
|
|
addInternalBuildTools
|
|
+ curDir
|
|
pkg_descr
|
|
lbi
|
|
(benchmarkBuildInfo bm)
|
|
diff --git a/Cabal/src/Distribution/Simple/Build.hs b/Cabal/src/Distribution/Simple/Build.hs
|
|
index 0ebd51e48..647480d35 100644
|
|
--- a/Cabal/src/Distribution/Simple/Build.hs
|
|
+++ b/Cabal/src/Distribution/Simple/Build.hs
|
|
@@ -187,13 +187,15 @@ build_setupHooks
|
|
-- dumped.
|
|
dumpBuildInfo verbosity distPref (configDumpBuildInfo (configFlags lbi)) pkg_descr lbi flags
|
|
|
|
+ curDir <- absoluteWorkingDirLBI lbi
|
|
+
|
|
-- Now do the actual building
|
|
(\f -> foldM_ f (installedPkgs lbi) componentsToBuild) $ \index target -> do
|
|
let comp = targetComponent target
|
|
clbi = targetCLBI target
|
|
bi = componentBuildInfo comp
|
|
-- Include any build-tool-depends on build tools internal to the current package.
|
|
- progs' = addInternalBuildTools pkg_descr lbi bi (withPrograms lbi)
|
|
+ progs' = addInternalBuildTools curDir pkg_descr lbi bi (withPrograms lbi)
|
|
lbi' =
|
|
lbi
|
|
{ withPrograms = progs'
|
|
@@ -375,17 +377,20 @@ repl_setupHooks
|
|
|
|
internalPackageDB <- createInternalPackageDB verbosity lbi distPref
|
|
|
|
- let lbiForComponent comp lbi' =
|
|
- lbi'
|
|
- { withPackageDB = withPackageDB lbi ++ [internalPackageDB]
|
|
- , withPrograms =
|
|
- -- Include any build-tool-depends on build tools internal to the current package.
|
|
- addInternalBuildTools
|
|
- pkg_descr
|
|
- lbi'
|
|
- (componentBuildInfo comp)
|
|
- (withPrograms lbi')
|
|
- }
|
|
+ let lbiForComponent comp lbi' = do
|
|
+ curDir <- absoluteWorkingDirLBI lbi'
|
|
+ return $
|
|
+ lbi'
|
|
+ { withPackageDB = withPackageDB lbi' ++ [internalPackageDB]
|
|
+ , withPrograms =
|
|
+ -- Include any build-tool-depends on build tools internal to the current package.
|
|
+ addInternalBuildTools
|
|
+ curDir
|
|
+ pkg_descr
|
|
+ lbi'
|
|
+ (componentBuildInfo comp)
|
|
+ (withPrograms lbi')
|
|
+ }
|
|
runPreBuildHooks :: LocalBuildInfo -> TargetInfo -> IO ()
|
|
runPreBuildHooks lbi2 tgt =
|
|
let inputs =
|
|
@@ -403,7 +408,7 @@ repl_setupHooks
|
|
[ do
|
|
let clbi = targetCLBI subtarget
|
|
comp = targetComponent subtarget
|
|
- lbi' = lbiForComponent comp lbi
|
|
+ lbi' <- lbiForComponent comp lbi
|
|
preBuildComponent runPreBuildHooks verbosity lbi' subtarget
|
|
buildComponent
|
|
(mempty{buildCommonFlags = mempty{setupVerbosity = toFlag verbosity}})
|
|
@@ -420,7 +425,7 @@ repl_setupHooks
|
|
-- REPL for target components
|
|
let clbi = targetCLBI target
|
|
comp = targetComponent target
|
|
- lbi' = lbiForComponent comp lbi
|
|
+ lbi' <- lbiForComponent comp lbi
|
|
preBuildComponent runPreBuildHooks verbosity lbi' target
|
|
replComponent flags verbosity pkg_descr lbi' suffixHandlers comp clbi distPref
|
|
|
|
@@ -925,12 +930,13 @@ createInternalPackageDB verbosity lbi distPref = do
|
|
-- 'progOverrideEnv', so that any programs configured from now on will be
|
|
-- able to invoke these build tools.
|
|
addInternalBuildTools
|
|
- :: PackageDescription
|
|
+ :: AbsolutePath (Dir Pkg)
|
|
+ -> PackageDescription
|
|
-> LocalBuildInfo
|
|
-> BuildInfo
|
|
-> ProgramDb
|
|
-> ProgramDb
|
|
-addInternalBuildTools pkg lbi bi progs =
|
|
+addInternalBuildTools pwd pkg lbi bi progs =
|
|
prependProgramSearchPathNoLogging
|
|
internalToolPaths
|
|
[pkgDataDirVar]
|
|
@@ -949,13 +955,11 @@ addInternalBuildTools pkg lbi bi progs =
|
|
buildDir lbi
|
|
</> makeRelativePathEx (toolName' </> toolName' <.> exeExtension (hostPlatform lbi))
|
|
]
|
|
- mbWorkDir = mbWorkDirLBI lbi
|
|
- rawDataDir = dataDir pkg
|
|
- dataDirPath
|
|
- | null $ getSymbolicPath rawDataDir =
|
|
- interpretSymbolicPath mbWorkDir sameDirectory
|
|
- | otherwise =
|
|
- interpretSymbolicPath mbWorkDir rawDataDir
|
|
+
|
|
+ -- This is an absolute path, so if a process changes directory, it can still
|
|
+ -- find the datadir (#10717)
|
|
+ dataDirPath :: FilePath
|
|
+ dataDirPath = interpretSymbolicPathAbsolute pwd (dataDir pkg)
|
|
|
|
-- TODO: build separate libs in separate dirs so that we can build
|
|
-- multiple libs, e.g. for 'LibTest' library-style test suites
|
|
diff --git a/Cabal/src/Distribution/Simple/Haddock.hs b/Cabal/src/Distribution/Simple/Haddock.hs
|
|
index ee2b88e76..5c534c01d 100644
|
|
--- a/Cabal/src/Distribution/Simple/Haddock.hs
|
|
+++ b/Cabal/src/Distribution/Simple/Haddock.hs
|
|
@@ -331,12 +331,13 @@ haddock_setupHooks
|
|
createInternalPackageDB verbosity lbi (flag $ setupDistPref . haddockCommonFlags)
|
|
|
|
(\f -> foldM_ f (installedPkgs lbi) targets') $ \index target -> do
|
|
+ curDir <- absoluteWorkingDirLBI lbi
|
|
let
|
|
component = targetComponent target
|
|
clbi = targetCLBI target
|
|
bi = componentBuildInfo component
|
|
-- Include any build-tool-depends on build tools internal to the current package.
|
|
- progs' = addInternalBuildTools pkg_descr lbi bi (withPrograms lbi)
|
|
+ progs' = addInternalBuildTools curDir pkg_descr lbi bi (withPrograms lbi)
|
|
lbi' =
|
|
lbi
|
|
{ withPrograms = progs'
|
|
diff --git a/Cabal/src/Distribution/Simple/Test.hs b/Cabal/src/Distribution/Simple/Test.hs
|
|
index 5b7a6daa7..57107eef6 100644
|
|
--- a/Cabal/src/Distribution/Simple/Test.hs
|
|
+++ b/Cabal/src/Distribution/Simple/Test.hs
|
|
@@ -70,6 +70,7 @@ test
|
|
-- ^ flags sent to test
|
|
-> IO ()
|
|
test args pkg_descr lbi0 flags = do
|
|
+ curDir <- LBI.absoluteWorkingDirLBI lbi0
|
|
let common = testCommonFlags flags
|
|
verbosity = fromFlag $ setupVerbosity common
|
|
distPref = fromFlag $ setupDistPref common
|
|
@@ -96,6 +97,7 @@ test args pkg_descr lbi0 flags = do
|
|
{ withPrograms =
|
|
-- Include any build-tool-depends on build tools internal to the current package.
|
|
addInternalBuildTools
|
|
+ curDir
|
|
pkg_descr
|
|
lbi
|
|
(PD.testBuildInfo suite)
|
|
diff --git a/cabal-install/src/Distribution/Client/Run.hs b/cabal-install/src/Distribution/Client/Run.hs
|
|
index 88671a9f5..1dd9db32c 100644
|
|
--- a/cabal-install/src/Distribution/Client/Run.hs
|
|
+++ b/cabal-install/src/Distribution/Client/Run.hs
|
|
@@ -35,6 +35,7 @@ import Distribution.Simple.Flag (fromFlag)
|
|
import Distribution.Simple.LocalBuildInfo
|
|
( ComponentName (..)
|
|
, LocalBuildInfo (..)
|
|
+ , absoluteWorkingDirLBI
|
|
, buildDir
|
|
, depLibraryPaths
|
|
, interpretSymbolicPathLBI
|
|
@@ -142,6 +143,7 @@ splitRunArgs verbosity lbi args =
|
|
-- | Run a given executable.
|
|
run :: Verbosity -> LocalBuildInfo -> Executable -> [String] -> IO ()
|
|
run verbosity lbi exe exeArgs = do
|
|
+ curDir <- absoluteWorkingDirLBI lbi
|
|
let distPref = fromFlag $ configDistPref $ configFlags lbi
|
|
buildPref = buildDir lbi
|
|
pkg_descr = localPkgDescr lbi
|
|
@@ -154,6 +156,7 @@ run verbosity lbi exe exeArgs = do
|
|
, -- Include any build-tool-depends on build tools internal to the current package.
|
|
withPrograms =
|
|
addInternalBuildTools
|
|
+ curDir
|
|
pkg_descr
|
|
lbi
|
|
(buildInfo exe)
|
|
diff --git a/cabal-testsuite/PackageTests/DataDirSetupTest/cabal.cabal.out b/cabal-testsuite/PackageTests/DataDirSetupTest/cabal.cabal.out
|
|
new file mode 100644
|
|
index 000000000..f1e923b5c
|
|
--- /dev/null
|
|
+++ b/cabal-testsuite/PackageTests/DataDirSetupTest/cabal.cabal.out
|
|
@@ -0,0 +1,13 @@
|
|
+# Setup configure
|
|
+Configuring datadir-test-0.1.0.0...
|
|
+# Setup build
|
|
+Preprocessing library for datadir-test-0.1.0.0...
|
|
+Building library for datadir-test-0.1.0.0...
|
|
+Preprocessing test suite 'datadir-test' for datadir-test-0.1.0.0...
|
|
+Building test suite 'datadir-test' for datadir-test-0.1.0.0...
|
|
+# Setup test
|
|
+Running 1 test suites...
|
|
+Test suite datadir-test: RUNNING...
|
|
+Test suite datadir-test: PASS
|
|
+Test suite logged to: cabal.cabal.dist/work/dist/test/datadir-test-0.1.0.0-datadir-test.log
|
|
+1 of 1 test suites (1 of 1 test cases) passed.
|
|
diff --git a/cabal-testsuite/PackageTests/DataDirSetupTest/cabal.out b/cabal-testsuite/PackageTests/DataDirSetupTest/cabal.out
|
|
new file mode 100644
|
|
index 000000000..eadbc3aea
|
|
--- /dev/null
|
|
+++ b/cabal-testsuite/PackageTests/DataDirSetupTest/cabal.out
|
|
@@ -0,0 +1,13 @@
|
|
+# Setup configure
|
|
+Configuring datadir-test-0.1.0.0...
|
|
+# Setup build
|
|
+Preprocessing library for datadir-test-0.1.0.0...
|
|
+Building library for datadir-test-0.1.0.0...
|
|
+Preprocessing test suite 'datadir-test' for datadir-test-0.1.0.0...
|
|
+Building test suite 'datadir-test' for datadir-test-0.1.0.0...
|
|
+# Setup test
|
|
+Running 1 test suites...
|
|
+Test suite datadir-test: RUNNING...
|
|
+Test suite datadir-test: PASS
|
|
+Test suite logged to: cabal.dist/work/dist/test/datadir-test-0.1.0.0-datadir-test.log
|
|
+1 of 1 test suites (1 of 1 test cases) passed.
|
|
diff --git a/changelog.d/pr-10830.md b/changelog.d/pr-10830.md
|
|
new file mode 100644
|
|
index 000000000..9e7876144
|
|
--- /dev/null
|
|
+++ b/changelog.d/pr-10830.md
|
|
@@ -0,0 +1,10 @@
|
|
+---
|
|
+synopsis: Set <pkgname>_datadir to an absolute path when running tests
|
|
+packages: [Cabal]
|
|
+prs: 10828
|
|
+issues: [10717]
|
|
+---
|
|
+
|
|
+Fix a regression where `<pkgname>_datadir` was set to a relative path. This
|
|
+caused issues when running testsuites which changed the working directory and
|
|
+accessed datafiles.
|
|
--
|
|
2.50.1
|
|
|