Skip to content

Commit cbcfb6b

Browse files
committed
Fix extra-prog-path propagation in the codebase.
This allows finding system executables in: - `cabal exec` - `cabal build` (configure steps for example) - `cabal get` In particular this fixes PATH issues when running MinGW cabal in PowerShell.
1 parent feaa338 commit cbcfb6b

File tree

18 files changed

+132
-71
lines changed

18 files changed

+132
-71
lines changed

Cabal/src/Distribution/Simple/Configure.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,6 +1008,9 @@ configure (pkg_descr0, pbi) cfg = do
10081008
mkPromisedDepsSet :: [GivenComponent] -> Map (PackageName, ComponentName) ComponentId
10091009
mkPromisedDepsSet comps = Map.fromList [((pn, CLibName ln), cid) | GivenComponent pn ln cid <- comps]
10101010

1011+
-- | Adds the extra program paths from the flags provided to @configure@ as
1012+
-- well as specified locations for certain known programs and their default
1013+
-- arguments.
10111014
mkProgramDb :: ConfigFlags -> ProgramDb -> ProgramDb
10121015
mkProgramDb cfg initialProgramDb = programDb
10131016
where

Cabal/src/Distribution/Simple/ConfigureScript.hs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -169,10 +169,7 @@ runConfigureScript verbosity flags lbi = do
169169
maybeHostFlag = if hp == buildPlatform then [] else ["--host=" ++ show (pretty hp)]
170170
args' = configureFile' : args ++ ["CC=" ++ ccProgShort] ++ maybeHostFlag
171171
shProg = simpleProgram "sh"
172-
progDb =
173-
modifyProgramSearchPath
174-
(\p -> map ProgramSearchPathDir extraPath ++ p)
175-
emptyProgramDb
172+
progDb <- appendProgramSearchPath verbosity extraPath emptyProgramDb
176173
shConfiguredProg <-
177174
lookupProgram shProg
178175
`fmap` configureProgram verbosity shProg progDb

Cabal/src/Distribution/Simple/Program/Db.hs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ module Distribution.Simple.Program.Db
3434
-- ** Query and manipulate the program db
3535
, addKnownProgram
3636
, addKnownPrograms
37+
, appendProgramSearchPath
3738
, lookupKnownProgram
3839
, knownPrograms
3940
, getProgramSearchPath
@@ -221,6 +222,20 @@ modifyProgramSearchPath
221222
modifyProgramSearchPath f db =
222223
setProgramSearchPath (f $ getProgramSearchPath db) db
223224

225+
-- | Modify the current 'ProgramSearchPath' used by the 'ProgramDb'
226+
-- by appending the provided extra paths. Also logs the added paths
227+
-- in info verbosity.
228+
appendProgramSearchPath
229+
:: Verbosity
230+
-> [FilePath]
231+
-> ProgramDb
232+
-> IO ProgramDb
233+
appendProgramSearchPath verbosity extraPaths db = do
234+
info verbosity . unlines $
235+
"Including the following directories in PATH:"
236+
: map ("- " ++) extraPaths
237+
pure $ modifyProgramSearchPath (map ProgramSearchPathDir extraPaths ++) db
238+
224239
-- | User-specify this path. Basically override any path information
225240
-- for this program in the configuration. If it's not a known
226241
-- program ignore it.

Cabal/src/Distribution/Simple/Program/GHC.hs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -554,8 +554,6 @@ data GhcOptions = GhcOptions
554554
, ghcOptExtraPath :: NubListR FilePath
555555
-- ^ Put the extra folders in the PATH environment variable we invoke
556556
-- GHC with
557-
-- | Put the extra folders in the PATH environment variable we invoke
558-
-- GHC with
559557
, ghcOptCabal :: Flag Bool
560558
-- ^ Let GHC know that it is Cabal that's calling it.
561559
-- Modifies some of the GHC error messages.

Cabal/src/Distribution/Simple/Program/Run.hs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,13 @@ data ProgramInvocation = ProgramInvocation
5151
{ progInvokePath :: FilePath
5252
, progInvokeArgs :: [String]
5353
, progInvokeEnv :: [(String, Maybe String)]
54-
, -- Extra paths to add to PATH
55-
progInvokePathEnv :: [FilePath]
54+
, progInvokePathEnv :: [FilePath]
55+
-- ^ Extra paths to add to PATH.
56+
--
57+
-- NOTE: The only program that sets paths here is GHC. See
58+
-- 'componentGhcOptions' and the value of 'ghcOptExtraPath' there used then in
59+
-- 'ghcInvocation'. Every other program we run doesn't set this but instead
60+
-- provides a @"PATH"@ var in @progInvokeEnv@.
5661
, progInvokeCwd :: Maybe FilePath
5762
, progInvokeInput :: Maybe IOData
5863
, progInvokeInputEncoding :: IOEncoding

cabal-install/src/Distribution/Client/CmdExec.hs

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ import Distribution.Client.NixStyleOptions
2626
, defaultNixStyleFlags
2727
, nixStyleOptions
2828
)
29+
import Distribution.Client.ProjectConfig.Types
30+
( ProjectConfig (projectConfigShared)
31+
, ProjectConfigShared (projectConfigProgPathExtra)
32+
)
2933
import Distribution.Client.ProjectFlags
3034
( removeIgnoreProjectOption
3135
)
@@ -66,12 +70,9 @@ import Distribution.Simple.GHC
6670
)
6771
import Distribution.Simple.Program.Db
6872
( configuredPrograms
69-
, modifyProgramSearchPath
73+
, appendProgramSearchPath
7074
, requireProgram
7175
)
72-
import Distribution.Simple.Program.Find
73-
( ProgramSearchPathEntry (..)
74-
)
7576
import Distribution.Simple.Program.Run
7677
( programInvocation
7778
, runProgramInvocation
@@ -86,11 +87,13 @@ import Distribution.Simple.Program.Types
8687
import Distribution.Simple.Utils
8788
( createDirectoryIfMissingVerbose
8889
, dieWithException
89-
, info
9090
, notice
9191
, withTempDirectory
9292
, wrapText
9393
)
94+
import Distribution.Utils.NubList
95+
( fromNubList
96+
)
9497
import Distribution.Verbosity
9598
( normal
9699
)
@@ -162,10 +165,11 @@ execAction flags@NixStyleFlags{..} extraArgs globalFlags = do
162165
mempty
163166

164167
-- Some dependencies may have executables. Let's put those on the PATH.
165-
extraPaths <- pathAdditions verbosity baseCtx buildCtx
166-
let programDb =
167-
modifyProgramSearchPath
168-
(map ProgramSearchPathDir extraPaths ++)
168+
let extraPaths = pathAdditions baseCtx buildCtx
169+
170+
programDb <-
171+
appendProgramSearchPath verbosity
172+
extraPaths
169173
. pkgConfigCompilerProgs
170174
. elaboratedShared
171175
$ buildCtx
@@ -263,13 +267,14 @@ withTempEnvFile verbosity baseCtx buildCtx buildStatus action = do
263267
action envOverrides
264268
)
265269

266-
pathAdditions :: Verbosity -> ProjectBaseContext -> ProjectBuildContext -> IO [FilePath]
267-
pathAdditions verbosity ProjectBaseContext{..} ProjectBuildContext{..} = do
268-
info verbosity . unlines $
269-
"Including the following directories in PATH:"
270-
: paths
271-
return paths
270+
pathAdditions :: ProjectBaseContext -> ProjectBuildContext -> [FilePath]
271+
pathAdditions ProjectBaseContext{..} ProjectBuildContext{..} =
272+
paths ++ cabalConfigPaths
272273
where
274+
cabalConfigPaths = fromNubList
275+
. projectConfigProgPathExtra
276+
. projectConfigShared
277+
$ projectConfig
273278
paths =
274279
S.toList $
275280
binDirectories distDirLayout elaboratedShared elaboratedPlanToExecute

cabal-install/src/Distribution/Client/CmdInstall.hs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -151,13 +151,10 @@ import qualified Distribution.Simple.InstallDirs as InstallDirs
151151
import qualified Distribution.Simple.PackageIndex as PI
152152
import Distribution.Simple.Program.Db
153153
( defaultProgramDb
154-
, modifyProgramSearchPath
154+
, appendProgramSearchPath
155155
, userSpecifyArgss
156156
, userSpecifyPaths
157157
)
158-
import Distribution.Simple.Program.Find
159-
( ProgramSearchPathEntry (..)
160-
)
161158
import Distribution.Simple.Setup
162159
( Flag (..)
163160
, installDirsOptions
@@ -496,6 +493,7 @@ installAction flags@NixStyleFlags{extraFlags = clientInstallFlags', ..} targetSt
496493
, projectConfigHcPath
497494
, projectConfigHcPkg
498495
, projectConfigStoreDir
496+
, projectConfigProgPathExtra
499497
}
500498
, projectConfigLocalPackages =
501499
PackageConfig
@@ -509,17 +507,13 @@ installAction flags@NixStyleFlags{extraFlags = clientInstallFlags', ..} targetSt
509507
hcPath = flagToMaybe projectConfigHcPath
510508
hcPkg = flagToMaybe projectConfigHcPkg
511509

510+
configProgDb <- appendProgramSearchPath verbosity ((fromNubList packageConfigProgramPathExtra) ++ (fromNubList projectConfigProgPathExtra)) defaultProgramDb
511+
let
512512
-- ProgramDb with directly user specified paths
513513
preProgDb =
514514
userSpecifyPaths (Map.toList (getMapLast packageConfigProgramPaths))
515515
. userSpecifyArgss (Map.toList (getMapMappend packageConfigProgramArgs))
516-
. modifyProgramSearchPath
517-
( ++
518-
[ ProgramSearchPathDir dir
519-
| dir <- fromNubList packageConfigProgramPathExtra
520-
]
521-
)
522-
$ defaultProgramDb
516+
$ configProgDb
523517

524518
-- progDb is a program database with compiler tools configured properly
525519
( compiler@Compiler

cabal-install/src/Distribution/Client/CmdRun.hs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ import Distribution.Client.NixStyleOptions
4848
, defaultNixStyleFlags
4949
, nixStyleOptions
5050
)
51+
import Distribution.Client.ProjectConfig.Types
52+
( ProjectConfig (projectConfigShared)
53+
, ProjectConfigShared (projectConfigProgPathExtra)
54+
)
5155
import Distribution.Client.ProjectOrchestration
5256
import Distribution.Client.ProjectPlanning
5357
( ElaboratedConfiguredPackage (..)
@@ -105,6 +109,9 @@ import Distribution.Types.UnqualComponentName
105109
( UnqualComponentName
106110
, unUnqualComponentName
107111
)
112+
import Distribution.Utils.NubList
113+
( fromNubList
114+
)
108115
import Distribution.Verbosity
109116
( normal
110117
, silent
@@ -288,6 +295,13 @@ runAction flags@NixStyleFlags{..} targetAndArgs globalFlags =
288295
buildSettingDryRun (buildSettings baseCtx)
289296
|| buildSettingOnlyDownload (buildSettings baseCtx)
290297

298+
let extraPath =
299+
fromNubList
300+
. projectConfigProgPathExtra
301+
. projectConfigShared
302+
. projectConfig
303+
$ baseCtx
304+
291305
if dryRun
292306
then notice verbosity "Running of executable suppressed by flag(s)"
293307
else
@@ -300,6 +314,7 @@ runAction flags@NixStyleFlags{..} targetAndArgs globalFlags =
300314
dataDirsEnvironmentForPlan
301315
(distDirLayout baseCtx)
302316
elaboratedPlan
317+
, progInvokePathEnv = extraPath
303318
}
304319
where
305320
(targetStr, args) = splitAt 1 targetAndArgs

cabal-install/src/Distribution/Client/Config.hs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1540,6 +1540,14 @@ parseConfig src initial = \str -> do
15401540
splitMultiPath
15411541
(configConfigureArgs scf)
15421542
}
1543+
, savedGlobalFlags =
1544+
let sgf = savedGlobalFlags conf
1545+
in sgf
1546+
{ globalProgPathExtra =
1547+
toNubList $
1548+
splitMultiPath
1549+
(fromNubList $ globalProgPathExtra sgf)
1550+
}
15431551
}
15441552

15451553
parse =

cabal-install/src/Distribution/Client/Get.hs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ import Distribution.Solver.Types.SourcePackage
7878
import Control.Monad (mapM_)
7979
import qualified Data.Map as Map
8080
import Distribution.Client.Errors
81+
import Distribution.Utils.NubList
82+
( fromNubList
83+
)
8184
import System.Directory
8285
( createDirectoryIfMissing
8386
, doesDirectoryExist
@@ -99,7 +102,7 @@ get
99102
-> IO ()
100103
get verbosity _ _ _ [] =
101104
notice verbosity "No packages requested. Nothing to do."
102-
get verbosity repoCtxt _ getFlags userTargets = do
105+
get verbosity repoCtxt globalFlags getFlags userTargets = do
103106
let useSourceRepo = case getSourceRepository getFlags of
104107
NoFlag -> False
105108
_ -> True
@@ -154,7 +157,7 @@ get verbosity repoCtxt _ getFlags userTargets = do
154157

155158
clone :: [UnresolvedSourcePackage] -> IO ()
156159
clone =
157-
clonePackagesFromSourceRepo verbosity prefix kind
160+
clonePackagesFromSourceRepo verbosity prefix kind (fromNubList $ globalProgPathExtra globalFlags)
158161
. map (\pkg -> (packageId pkg, packageSourceRepos pkg))
159162
where
160163
kind :: Maybe RepoKind
@@ -337,6 +340,8 @@ clonePackagesFromSourceRepo
337340
-- ^ destination dir prefix
338341
-> Maybe RepoKind
339342
-- ^ preferred 'RepoKind'
343+
-> [FilePath]
344+
-- ^ Extra prog paths
340345
-> [(PackageId, [PD.SourceRepo])]
341346
-- ^ the packages and their
342347
-- available 'SourceRepo's
@@ -345,13 +350,14 @@ clonePackagesFromSourceRepo
345350
verbosity
346351
destDirPrefix
347352
preferredRepoKind
353+
progPaths
348354
pkgrepos = do
349355
-- Do a bunch of checks and collect the required info
350356
pkgrepos' <- traverse preCloneChecks pkgrepos
351357

352358
-- Configure the VCS drivers for all the repository types we may need
353359
vcss <-
354-
configureVCSs verbosity $
360+
configureVCSs verbosity progPaths $
355361
Map.fromList
356362
[ (vcsRepoType vcs, vcs)
357363
| (_, _, vcs, _) <- pkgrepos'

0 commit comments

Comments
 (0)