Skip to content

Commit e5fa845

Browse files
committed
Read basedir from cabal-file, and thread it through apropriately.
1 parent 21efd0b commit e5fa845

File tree

12 files changed

+147
-72
lines changed

12 files changed

+147
-72
lines changed

Cabal/Distribution/Simple.hs

Lines changed: 76 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,10 @@ import Distribution.Text
9696

9797
-- Base
9898
import System.Environment (getArgs, getProgName)
99-
import System.Directory (removeFile, doesFileExist
99+
import System.Directory (removeFile, doesFileExist, getCurrentDirectory
100100
,doesDirectoryExist, removeDirectoryRecursive)
101101
import System.Exit (exitWith,ExitCode(..))
102-
import System.FilePath (searchPathSeparator)
102+
import System.FilePath (searchPathSeparator, takeDirectory, (</>))
103103
import Distribution.Compat.Environment (getEnvironment)
104104
import Distribution.Compat.GetShortPathName (getShortPathName)
105105

@@ -248,9 +248,10 @@ buildAction :: UserHooks -> BuildFlags -> Args -> IO ()
248248
buildAction hooks flags args = do
249249
distPref <- findDistPrefOrDefault (buildDistPref flags)
250250
let verbosity = fromFlag $ buildVerbosity flags
251-
flags' = flags { buildDistPref = toFlag distPref }
252-
253251
lbi <- getBuildConfig hooks verbosity distPref
252+
let flags' = flags { buildDistPref = toFlag distPref
253+
, buildCabalFilePath = maybeToFlag (cabalFilePath lbi)}
254+
254255
progs <- reconfigurePrograms verbosity
255256
(buildProgramPaths flags')
256257
(buildProgramArgs flags')
@@ -288,7 +289,10 @@ hscolourAction :: UserHooks -> HscolourFlags -> Args -> IO ()
288289
hscolourAction hooks flags args = do
289290
distPref <- findDistPrefOrDefault (hscolourDistPref flags)
290291
let verbosity = fromFlag $ hscolourVerbosity flags
291-
flags' = flags { hscolourDistPref = toFlag distPref }
292+
lbi <- getBuildConfig hooks verbosity distPref
293+
let flags' = flags { hscolourDistPref = toFlag distPref
294+
, hscolourCabalFilePath = maybeToFlag (cabalFilePath lbi)}
295+
292296
hookedAction preHscolour hscolourHook postHscolour
293297
(getBuildConfig hooks verbosity distPref)
294298
hooks flags' args
@@ -313,9 +317,10 @@ haddockAction :: UserHooks -> HaddockFlags -> Args -> IO ()
313317
haddockAction hooks flags args = do
314318
distPref <- findDistPrefOrDefault (haddockDistPref flags)
315319
let verbosity = fromFlag $ haddockVerbosity flags
316-
flags' = flags { haddockDistPref = toFlag distPref }
317-
318320
lbi <- getBuildConfig hooks verbosity distPref
321+
let flags' = flags { haddockDistPref = toFlag distPref
322+
, haddockCabalFilePath = maybeToFlag (cabalFilePath lbi)}
323+
319324
progs <- reconfigurePrograms verbosity
320325
(haddockProgramPaths flags')
321326
(haddockProgramArgs flags')
@@ -328,7 +333,10 @@ haddockAction hooks flags args = do
328333
cleanAction :: UserHooks -> CleanFlags -> Args -> IO ()
329334
cleanAction hooks flags args = do
330335
distPref <- findDistPrefOrDefault (cleanDistPref flags)
331-
let flags' = flags { cleanDistPref = toFlag distPref }
336+
337+
lbi <- getBuildConfig hooks verbosity distPref
338+
let flags' = flags { cleanDistPref = toFlag distPref
339+
, cleanCabalFilePath = maybeToFlag (cabalFilePath lbi)}
332340

333341
pbi <- preClean hooks args flags'
334342

@@ -354,7 +362,9 @@ copyAction :: UserHooks -> CopyFlags -> Args -> IO ()
354362
copyAction hooks flags args = do
355363
distPref <- findDistPrefOrDefault (copyDistPref flags)
356364
let verbosity = fromFlag $ copyVerbosity flags
357-
flags' = flags { copyDistPref = toFlag distPref }
365+
lbi <- getBuildConfig hooks verbosity distPref
366+
let flags' = flags { copyDistPref = toFlag distPref
367+
, copyCabalFilePath = maybeToFlag (cabalFilePath lbi)}
358368
hookedAction preCopy copyHook postCopy
359369
(getBuildConfig hooks verbosity distPref)
360370
hooks flags' { copyArgs = args } args
@@ -363,7 +373,9 @@ installAction :: UserHooks -> InstallFlags -> Args -> IO ()
363373
installAction hooks flags args = do
364374
distPref <- findDistPrefOrDefault (installDistPref flags)
365375
let verbosity = fromFlag $ installVerbosity flags
366-
flags' = flags { installDistPref = toFlag distPref }
376+
lbi <- getBuildConfig hooks verbosity distPref
377+
let flags' = flags { installDistPref = toFlag distPref
378+
, installCabalFilePath = maybeToFlag (cabalFilePath lbi)}
367379
hookedAction preInst instHook postInst
368380
(getBuildConfig hooks verbosity distPref)
369381
hooks flags' args
@@ -427,7 +439,9 @@ registerAction :: UserHooks -> RegisterFlags -> Args -> IO ()
427439
registerAction hooks flags args = do
428440
distPref <- findDistPrefOrDefault (regDistPref flags)
429441
let verbosity = fromFlag $ regVerbosity flags
430-
flags' = flags { regDistPref = toFlag distPref }
442+
lbi <- getBuildConfig hooks verbosity distPref
443+
let flags' = flags { regDistPref = toFlag distPref
444+
, regCabalFilePath = maybeToFlag (cabalFilePath lbi)}
431445
hookedAction preReg regHook postReg
432446
(getBuildConfig hooks verbosity distPref)
433447
hooks flags' { regArgs = args } args
@@ -436,7 +450,9 @@ unregisterAction :: UserHooks -> RegisterFlags -> Args -> IO ()
436450
unregisterAction hooks flags args = do
437451
distPref <- findDistPrefOrDefault (regDistPref flags)
438452
let verbosity = fromFlag $ regVerbosity flags
439-
flags' = flags { regDistPref = toFlag distPref }
453+
lbi <- getBuildConfig hooks verbosity distPref
454+
let flags' = flags { regDistPref = toFlag distPref
455+
, regCabalFilePath = maybeToFlag (cabalFilePath lbi)}
440456
hookedAction preUnreg unregHook postUnreg
441457
(getBuildConfig hooks verbosity distPref)
442458
hooks flags' args
@@ -618,62 +634,83 @@ defaultUserHooks = autoconfUserHooks {
618634
-- https://github.com/haskell/cabal/issues/158
619635
where oldCompatPostConf args flags pkg_descr lbi
620636
= do let verbosity = fromFlag (configVerbosity flags)
621-
confExists <- doesFileExist "configure"
637+
baseDir lbi' = fromMaybe "" (takeDirectory <$> cabalFilePath lbi')
638+
639+
confExists <- doesFileExist $ (baseDir lbi) </> "configure"
622640
when confExists $
623641
runConfigureScript verbosity
624642
backwardsCompatHack flags lbi
625643

626-
pbi <- getHookedBuildInfo verbosity
644+
base_dir <- getBaseDir (configCabalFilePath flags)
645+
646+
pbi <- getHookedBuildInfo base_dir verbosity
627647
sanityCheckHookedBuildInfo pkg_descr pbi
628648
let pkg_descr' = updatePackageDescription pbi pkg_descr
629649
lbi' = lbi { localPkgDescr = pkg_descr' }
630650
postConf simpleUserHooks args flags pkg_descr' lbi'
631651

632652
backwardsCompatHack = True
633653

654+
getBaseDir :: Flag FilePath -> IO FilePath
655+
getBaseDir flag = do
656+
-- compute the base directory. This is the current
657+
-- working directory unless a different one was provided
658+
-- via --cabal-file-path.
659+
pwd <- getCurrentDirectory
660+
return $ fromMaybe pwd (takeDirectory <$> flagToMaybe flag)
661+
634662
autoconfUserHooks :: UserHooks
635663
autoconfUserHooks
636664
= simpleUserHooks
637665
{
638666
postConf = defaultPostConf,
639-
preBuild = readHookWithArgs buildVerbosity,
640-
preCopy = readHookWithArgs copyVerbosity,
641-
preClean = readHook cleanVerbosity,
642-
preInst = readHook installVerbosity,
643-
preHscolour = readHook hscolourVerbosity,
644-
preHaddock = readHook haddockVerbosity,
645-
preReg = readHook regVerbosity,
646-
preUnreg = readHook regVerbosity
667+
preBuild = readHookWithArgs buildVerbosity buildCabalFilePath,
668+
preCopy = readHookWithArgs copyVerbosity copyCabalFilePath,
669+
preClean = readHook cleanVerbosity cleanCabalFilePath,
670+
preInst = readHook installVerbosity installCabalFilePath,
671+
preHscolour = readHook hscolourVerbosity hscolourCabalFilePath,
672+
preHaddock = readHook haddockVerbosity haddockCabalFilePath,
673+
preReg = readHook regVerbosity regCabalFilePath,
674+
preUnreg = readHook regVerbosity regCabalFilePath
647675
}
648676
where defaultPostConf :: Args -> ConfigFlags -> PackageDescription
649677
-> LocalBuildInfo -> IO ()
650678
defaultPostConf args flags pkg_descr lbi
651679
= do let verbosity = fromFlag (configVerbosity flags)
652-
confExists <- doesFileExist "configure"
680+
baseDir lbi' = fromMaybe "" (takeDirectory <$> cabalFilePath lbi')
681+
confExists <- doesFileExist $ (baseDir lbi) </> "configure"
653682
if confExists
654683
then runConfigureScript verbosity
655684
backwardsCompatHack flags lbi
656685
else die "configure script not found."
657686

658-
pbi <- getHookedBuildInfo verbosity
687+
base_dir <- getBaseDir (configCabalFilePath flags)
688+
689+
pbi <- getHookedBuildInfo base_dir verbosity
659690
sanityCheckHookedBuildInfo pkg_descr pbi
660691
let pkg_descr' = updatePackageDescription pbi pkg_descr
661692
lbi' = lbi { localPkgDescr = pkg_descr' }
662693
postConf simpleUserHooks args flags pkg_descr' lbi'
663694

664695
backwardsCompatHack = False
665696

666-
readHookWithArgs :: (a -> Flag Verbosity) -> Args -> a
697+
readHookWithArgs :: (a -> Flag Verbosity)
698+
-> (a -> Flag FilePath)
699+
-> Args -> a
667700
-> IO HookedBuildInfo
668-
readHookWithArgs get_verbosity _ flags = do
669-
getHookedBuildInfo verbosity
701+
readHookWithArgs get_verbosity get_cabal_file_path _ flags = do
702+
base_dir <- getBaseDir (get_cabal_file_path flags)
703+
getHookedBuildInfo base_dir verbosity
670704
where
671705
verbosity = fromFlag (get_verbosity flags)
672706

673-
readHook :: (a -> Flag Verbosity) -> Args -> a -> IO HookedBuildInfo
674-
readHook get_verbosity a flags = do
707+
readHook :: (a -> Flag Verbosity)
708+
-> (a -> Flag FilePath)
709+
-> Args -> a -> IO HookedBuildInfo
710+
readHook get_verbosity get_cabal_file_path a flags = do
675711
noExtraFlags a
676-
getHookedBuildInfo verbosity
712+
base_dir <- getBaseDir (get_cabal_file_path flags)
713+
getHookedBuildInfo base_dir verbosity
677714
where
678715
verbosity = fromFlag (get_verbosity flags)
679716

@@ -705,8 +742,9 @@ runConfigureScript verbosity backwardsCompatHack flags lbi = do
705742
shConfiguredProg <- lookupProgram shProg
706743
`fmap` configureProgram verbosity shProg progDb
707744
case shConfiguredProg of
708-
Just sh -> runProgramInvocation verbosity
745+
Just sh -> runProgramInvocation verbosity $
709746
(programInvocation (sh {programOverrideEnv = overEnv}) args')
747+
{ progInvokeCwd = takeDirectory <$> cabalFilePath lbi }
710748
Nothing -> die notFoundMsg
711749

712750
where
@@ -718,9 +756,13 @@ runConfigureScript verbosity backwardsCompatHack flags lbi = do
718756
++ "If you are not on Windows, ensure that an 'sh' command "
719757
++ "is discoverable in your path."
720758

721-
getHookedBuildInfo :: Verbosity -> IO HookedBuildInfo
722-
getHookedBuildInfo verbosity = do
723-
maybe_infoFile <- defaultHookedPackageDesc
759+
getHookedBuildInfo :: FilePath -> Verbosity -> IO HookedBuildInfo
760+
getHookedBuildInfo baseDir verbosity = do
761+
-- TODO: We should probably better generate this in the
762+
-- build dir, rather then in the base dir? However
763+
-- `configure` is run in the baseDir.
764+
765+
maybe_infoFile <- findHookedPackageDesc baseDir
724766
case maybe_infoFile of
725767
Nothing -> return emptyHookedBuildInfo
726768
Just infoFile -> do

Cabal/Distribution/Simple/Configure.hs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ import qualified Data.Map as Map
124124
import System.Directory
125125
( doesFileExist, createDirectoryIfMissing, getTemporaryDirectory )
126126
import System.FilePath
127-
( (</>), isAbsolute )
127+
( (</>), isAbsolute, takeDirectory )
128128
import qualified System.Info
129129
( compilerName, compilerVersion )
130130
import System.IO
@@ -690,6 +690,7 @@ configure (pkg_descr0, pbi) cfg = do
690690
compiler = comp,
691691
hostPlatform = compPlatform,
692692
buildDir = buildDir,
693+
cabalFilePath = flagToMaybe (configCabalFilePath cfg),
693694
componentGraph = Graph.fromDistinctList buildComponents,
694695
componentNameMap = buildComponentsMap,
695696
installedPkgs = packageDependsIndex,
@@ -1633,14 +1634,19 @@ checkForeignDeps pkg lbi verbosity =
16331634

16341635
libExists lib = builds (makeProgram []) (makeLdArgs [lib])
16351636

1637+
baseDir lbi' = fromMaybe "" (takeDirectory <$> cabalFilePath lbi')
1638+
16361639
commonCppArgs = platformDefines lbi
16371640
-- TODO: This is a massive hack, to work around the
16381641
-- fact that the test performed here should be
16391642
-- PER-component (c.f. the "I'm Feeling Lucky"; we
16401643
-- should NOT be glomming everything together.)
16411644
++ [ "-I" ++ buildDir lbi </> "autogen" ]
1642-
++ [ "-I" ++ dir | dir <- collectField PD.includeDirs ]
1643-
++ ["-I."]
1645+
++ [ "-I" ++ (baseDir lbi) </> dir | dir <- collectField PD.includeDirs
1646+
, not (isAbsolute dir)]
1647+
++ [ "-I" ++ dir | dir <- collectField PD.includeDirs
1648+
, isAbsolute dir]
1649+
++ ["-I" ++ (baseDir lbi)]
16441650
++ collectField PD.cppOptions
16451651
++ collectField PD.ccOptions
16461652
++ [ "-I" ++ dir

Cabal/Distribution/Simple/GHC/Internal.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ configureToolchain _implInfo ghcProg ghcInfo =
107107
}
108108
where
109109
compilerDir = takeDirectory (programPath ghcProg)
110-
baseDir = takeDirectory compilerDir
111-
mingwBinDir = baseDir </> "mingw" </> "bin"
110+
base_dir = takeDirectory compilerDir
111+
mingwBinDir = base_dir </> "mingw" </> "bin"
112112
isWindows = case buildOS of Windows -> True; _ -> False
113113
binPrefix = ""
114114

Cabal/Distribution/Simple/Haddock.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -736,7 +736,8 @@ haddockToHscolour flags =
736736
hscolourBenchmarks = haddockBenchmarks flags,
737737
hscolourForeignLibs = haddockForeignLibs flags,
738738
hscolourVerbosity = haddockVerbosity flags,
739-
hscolourDistPref = haddockDistPref flags
739+
hscolourDistPref = haddockDistPref flags,
740+
hscolourCabalFilePath = haddockCabalFilePath flags
740741
}
741742

742743
-- ------------------------------------------------------------------------------

Cabal/Distribution/Simple/Install.hs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ copyComponent verbosity pkg_descr lbi (CLib lib) clbi copydest = do
171171

172172
-- install include files for all compilers - they may be needed to compile
173173
-- haskell files (using the CPP extension)
174-
installIncludeFiles verbosity lib buildPref incPref
174+
installIncludeFiles verbosity lib lbi buildPref incPref
175175

176176
case compilerFlavor (compiler lbi) of
177177
GHC -> GHC.installLib verbosity lbi libPref dynlibPref buildPref pkg_descr lib clbi
@@ -247,20 +247,21 @@ installDataFiles verbosity pkg_descr destDataDir =
247247

248248
-- | Install the files listed in install-includes for a library
249249
--
250-
installIncludeFiles :: Verbosity -> Library -> FilePath -> FilePath -> IO ()
251-
installIncludeFiles verbosity lib buildPref destIncludeDir = do
252-
let relincdirs = "." : filter isRelative (includeDirs lbi)
253-
lbi = libBuildInfo lib
254-
incdirs = relincdirs ++ [ buildPref </> dir | dir <- relincdirs ]
255-
incs <- traverse (findInc incdirs) (installIncludes lbi)
250+
installIncludeFiles :: Verbosity -> Library -> LocalBuildInfo -> FilePath -> FilePath -> IO ()
251+
installIncludeFiles verbosity lib lbi buildPref destIncludeDir = do
252+
let relincdirs = "." : filter isRelative (includeDirs libBi)
253+
libBi = libBuildInfo lib
254+
incdirs = [ baseDir lbi </> dir | dir <- relincdirs ]
255+
++ [ buildPref </> dir | dir <- relincdirs ]
256+
incs <- traverse (findInc incdirs) (installIncludes libBi)
256257
sequence_
257258
[ do createDirectoryIfMissingVerbose verbosity True destDir
258259
installOrdinaryFile verbosity srcFile destFile
259260
| (relFile, srcFile) <- incs
260261
, let destFile = destIncludeDir </> relFile
261262
destDir = takeDirectory destFile ]
262263
where
263-
264+
baseDir lbi' = fromMaybe "" (takeDirectory <$> cabalFilePath lbi')
264265
findInc [] file = die' verbosity ("can't find include file " ++ file)
265266
findInc (dir:dirs) file = do
266267
let path = dir </> file

Cabal/Distribution/Simple/LHC.hs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ configureToolchain :: ConfiguredProgram -> ProgramDb
118118
-> ProgramDb
119119
configureToolchain lhcProg =
120120
addKnownProgram gccProgram {
121-
programFindLocation = findProg gccProgram (baseDir </> "gcc.exe"),
121+
programFindLocation = findProg gccProgram (base_dir </> "gcc.exe"),
122122
programPostConf = configureGcc
123123
}
124124
. addKnownProgram ldProgram {
@@ -127,9 +127,9 @@ configureToolchain lhcProg =
127127
}
128128
where
129129
compilerDir = takeDirectory (programPath lhcProg)
130-
baseDir = takeDirectory compilerDir
131-
gccLibDir = baseDir </> "gcc-lib"
132-
includeDir = baseDir </> "include" </> "mingw"
130+
base_dir = takeDirectory compilerDir
131+
gccLibDir = base_dir </> "gcc-lib"
132+
includeDir = base_dir </> "include" </> "mingw"
133133
isWindows = case buildOS of Windows -> True; _ -> False
134134

135135
-- on Windows finding and configuring ghc's gcc and ld is a bit special

0 commit comments

Comments
 (0)