diff --git a/Cabal/Cabal.cabal b/Cabal/Cabal.cabal index 548017796f0..780488cbcec 100644 --- a/Cabal/Cabal.cabal +++ b/Cabal/Cabal.cabal @@ -206,6 +206,7 @@ library Distribution.Utils.LogProgress Distribution.Utils.MapAccum Distribution.Compat.CreatePipe + Distribution.Compat.Directory Distribution.Compat.Environment Distribution.Compat.Exception Distribution.Compat.Graph diff --git a/Cabal/Distribution/Compat/Directory.hs b/Cabal/Distribution/Compat/Directory.hs new file mode 100644 index 00000000000..6cad93c79fd --- /dev/null +++ b/Cabal/Distribution/Compat/Directory.hs @@ -0,0 +1,27 @@ +{-# LANGUAGE CPP #-} + +module Distribution.Compat.Directory (listDirectory, makeAbsolute) where + +import System.Directory as Dir +#if !MIN_VERSION_directory(1,2,2) +import System.FilePath as Path +#endif + +#if !MIN_VERSION_directory(1,2,5) + +listDirectory :: FilePath -> IO [FilePath] +listDirectory path = + filter f <$> Dir.getDirectoryContents path + where f filename = filename /= "." && filename /= ".." + +#endif + +#if !MIN_VERSION_directory(1,2,2) + +makeAbsolute :: FilePath -> IO FilePath +makeAbsolute p | Path.isAbsolute p = return p + | otherwise = do + cwd <- Dir.getCurrentDirectory + return $ cwd p + +#endif diff --git a/Cabal/Distribution/Simple.hs b/Cabal/Distribution/Simple.hs index 016f4b4cc53..e45c8312ac5 100644 --- a/Cabal/Distribution/Simple.hs +++ b/Cabal/Distribution/Simple.hs @@ -1,4 +1,3 @@ -{-# LANGUAGE CPP #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE RankNTypes #-} @@ -59,6 +58,7 @@ module Distribution.Simple ( ) where import Prelude () +import Control.Exception (try) import Distribution.Compat.Prelude -- local @@ -99,7 +99,8 @@ import System.Environment (getArgs, getProgName) import System.Directory (removeFile, doesFileExist ,doesDirectoryExist, removeDirectoryRecursive) import System.Exit (exitWith,ExitCode(..)) -import System.FilePath (searchPathSeparator) +import System.FilePath (searchPathSeparator, takeDirectory, ()) +import Distribution.Compat.Directory (makeAbsolute) import Distribution.Compat.Environment (getEnvironment) import Distribution.Compat.GetShortPathName (getShortPathName) @@ -248,9 +249,10 @@ buildAction :: UserHooks -> BuildFlags -> Args -> IO () buildAction hooks flags args = do distPref <- findDistPrefOrDefault (buildDistPref flags) let verbosity = fromFlag $ buildVerbosity flags - flags' = flags { buildDistPref = toFlag distPref } - lbi <- getBuildConfig hooks verbosity distPref + let flags' = flags { buildDistPref = toFlag distPref + , buildCabalFilePath = maybeToFlag (cabalFilePath lbi)} + progs <- reconfigurePrograms verbosity (buildProgramPaths flags') (buildProgramArgs flags') @@ -288,7 +290,10 @@ hscolourAction :: UserHooks -> HscolourFlags -> Args -> IO () hscolourAction hooks flags args = do distPref <- findDistPrefOrDefault (hscolourDistPref flags) let verbosity = fromFlag $ hscolourVerbosity flags - flags' = flags { hscolourDistPref = toFlag distPref } + lbi <- getBuildConfig hooks verbosity distPref + let flags' = flags { hscolourDistPref = toFlag distPref + , hscolourCabalFilePath = maybeToFlag (cabalFilePath lbi)} + hookedAction preHscolour hscolourHook postHscolour (getBuildConfig hooks verbosity distPref) hooks flags' args @@ -313,9 +318,10 @@ haddockAction :: UserHooks -> HaddockFlags -> Args -> IO () haddockAction hooks flags args = do distPref <- findDistPrefOrDefault (haddockDistPref flags) let verbosity = fromFlag $ haddockVerbosity flags - flags' = flags { haddockDistPref = toFlag distPref } - lbi <- getBuildConfig hooks verbosity distPref + let flags' = flags { haddockDistPref = toFlag distPref + , haddockCabalFilePath = maybeToFlag (cabalFilePath lbi)} + progs <- reconfigurePrograms verbosity (haddockProgramPaths flags') (haddockProgramArgs flags') @@ -328,7 +334,12 @@ haddockAction hooks flags args = do cleanAction :: UserHooks -> CleanFlags -> Args -> IO () cleanAction hooks flags args = do distPref <- findDistPrefOrDefault (cleanDistPref flags) - let flags' = flags { cleanDistPref = toFlag distPref } + + elbi <- tryGetBuildConfig hooks verbosity distPref + let flags' = flags { cleanDistPref = toFlag distPref + , cleanCabalFilePath = case elbi of + Left _ -> mempty + Right lbi -> maybeToFlag (cabalFilePath lbi)} pbi <- preClean hooks args flags' @@ -354,7 +365,9 @@ copyAction :: UserHooks -> CopyFlags -> Args -> IO () copyAction hooks flags args = do distPref <- findDistPrefOrDefault (copyDistPref flags) let verbosity = fromFlag $ copyVerbosity flags - flags' = flags { copyDistPref = toFlag distPref } + lbi <- getBuildConfig hooks verbosity distPref + let flags' = flags { copyDistPref = toFlag distPref + , copyCabalFilePath = maybeToFlag (cabalFilePath lbi)} hookedAction preCopy copyHook postCopy (getBuildConfig hooks verbosity distPref) hooks flags' { copyArgs = args } args @@ -363,7 +376,9 @@ installAction :: UserHooks -> InstallFlags -> Args -> IO () installAction hooks flags args = do distPref <- findDistPrefOrDefault (installDistPref flags) let verbosity = fromFlag $ installVerbosity flags - flags' = flags { installDistPref = toFlag distPref } + lbi <- getBuildConfig hooks verbosity distPref + let flags' = flags { installDistPref = toFlag distPref + , installCabalFilePath = maybeToFlag (cabalFilePath lbi)} hookedAction preInst instHook postInst (getBuildConfig hooks verbosity distPref) hooks flags' args @@ -427,7 +442,9 @@ registerAction :: UserHooks -> RegisterFlags -> Args -> IO () registerAction hooks flags args = do distPref <- findDistPrefOrDefault (regDistPref flags) let verbosity = fromFlag $ regVerbosity flags - flags' = flags { regDistPref = toFlag distPref } + lbi <- getBuildConfig hooks verbosity distPref + let flags' = flags { regDistPref = toFlag distPref + , regCabalFilePath = maybeToFlag (cabalFilePath lbi)} hookedAction preReg regHook postReg (getBuildConfig hooks verbosity distPref) hooks flags' { regArgs = args } args @@ -436,7 +453,9 @@ unregisterAction :: UserHooks -> RegisterFlags -> Args -> IO () unregisterAction hooks flags args = do distPref <- findDistPrefOrDefault (regDistPref flags) let verbosity = fromFlag $ regVerbosity flags - flags' = flags { regDistPref = toFlag distPref } + lbi <- getBuildConfig hooks verbosity distPref + let flags' = flags { regDistPref = toFlag distPref + , regCabalFilePath = maybeToFlag (cabalFilePath lbi)} hookedAction preUnreg unregHook postUnreg (getBuildConfig hooks verbosity distPref) hooks flags' args @@ -487,7 +506,13 @@ sanityCheckHookedBuildInfo pkg_descr (_, hookExes) sanityCheckHookedBuildInfo _ _ = return () +-- | Try to read the 'localBuildInfoFile' +tryGetBuildConfig :: UserHooks -> Verbosity -> FilePath + -> IO (Either ConfigStateFileError LocalBuildInfo) +tryGetBuildConfig u v = try . getBuildConfig u v + +-- | Read the 'localBuildInfoFile' or throw an exception. getBuildConfig :: UserHooks -> Verbosity -> FilePath -> IO LocalBuildInfo getBuildConfig hooks verbosity distPref = do lbi_wo_programs <- getPersistBuildConfig distPref @@ -618,12 +643,14 @@ defaultUserHooks = autoconfUserHooks { -- https://github.com/haskell/cabal/issues/158 where oldCompatPostConf args flags pkg_descr lbi = do let verbosity = fromFlag (configVerbosity flags) - confExists <- doesFileExist "configure" + baseDir lbi' = fromMaybe "" (takeDirectory <$> cabalFilePath lbi') + + confExists <- doesFileExist $ (baseDir lbi) "configure" when confExists $ runConfigureScript verbosity backwardsCompatHack flags lbi - pbi <- getHookedBuildInfo verbosity + pbi <- getHookedBuildInfo (buildDir lbi) verbosity sanityCheckHookedBuildInfo pkg_descr pbi let pkg_descr' = updatePackageDescription pbi pkg_descr lbi' = lbi { localPkgDescr = pkg_descr' } @@ -636,26 +663,27 @@ autoconfUserHooks = simpleUserHooks { postConf = defaultPostConf, - preBuild = readHookWithArgs buildVerbosity, - preCopy = readHookWithArgs copyVerbosity, - preClean = readHook cleanVerbosity, - preInst = readHook installVerbosity, - preHscolour = readHook hscolourVerbosity, - preHaddock = readHook haddockVerbosity, - preReg = readHook regVerbosity, - preUnreg = readHook regVerbosity + preBuild = readHookWithArgs buildVerbosity buildDistPref, -- buildCabalFilePath, + preCopy = readHookWithArgs copyVerbosity copyDistPref, + preClean = readHook cleanVerbosity cleanDistPref, + preInst = readHook installVerbosity installDistPref, + preHscolour = readHook hscolourVerbosity hscolourDistPref, + preHaddock = readHook haddockVerbosity haddockDistPref, + preReg = readHook regVerbosity regDistPref, + preUnreg = readHook regVerbosity regDistPref } where defaultPostConf :: Args -> ConfigFlags -> PackageDescription -> LocalBuildInfo -> IO () defaultPostConf args flags pkg_descr lbi = do let verbosity = fromFlag (configVerbosity flags) - confExists <- doesFileExist "configure" + baseDir lbi' = fromMaybe "" (takeDirectory <$> cabalFilePath lbi') + confExists <- doesFileExist $ (baseDir lbi) "configure" if confExists then runConfigureScript verbosity backwardsCompatHack flags lbi else die "configure script not found." - pbi <- getHookedBuildInfo verbosity + pbi <- getHookedBuildInfo (buildDir lbi) verbosity sanityCheckHookedBuildInfo pkg_descr pbi let pkg_descr' = updatePackageDescription pbi pkg_descr lbi' = lbi { localPkgDescr = pkg_descr' } @@ -663,17 +691,23 @@ autoconfUserHooks backwardsCompatHack = False - readHookWithArgs :: (a -> Flag Verbosity) -> Args -> a + readHookWithArgs :: (a -> Flag Verbosity) + -> (a -> Flag FilePath) + -> Args -> a -> IO HookedBuildInfo - readHookWithArgs get_verbosity _ flags = do - getHookedBuildInfo verbosity + readHookWithArgs get_verbosity get_dist_pref _ flags = do + dist_dir <- findDistPrefOrDefault (get_dist_pref flags) + getHookedBuildInfo (dist_dir "build") verbosity where verbosity = fromFlag (get_verbosity flags) - readHook :: (a -> Flag Verbosity) -> Args -> a -> IO HookedBuildInfo - readHook get_verbosity a flags = do + readHook :: (a -> Flag Verbosity) + -> (a -> Flag FilePath) + -> Args -> a -> IO HookedBuildInfo + readHook get_verbosity get_dist_pref a flags = do noExtraFlags a - getHookedBuildInfo verbosity + dist_dir <- findDistPrefOrDefault (get_dist_pref flags) + getHookedBuildInfo (dist_dir "build") verbosity where verbosity = fromFlag (get_verbosity flags) @@ -690,6 +724,8 @@ runConfigureScript verbosity backwardsCompatHack flags lbi = do -- to ccFlags -- We don't try and tell configure which ld to use, as we don't have -- a way to pass its flags too + configureFile <- makeAbsolute $ + fromMaybe "." (takeDirectory <$> cabalFilePath lbi) "configure" let extraPath = fromNubList $ configProgramPathExtra flags let cflagsEnv = maybe (unwords ccFlags) (++ (" " ++ unwords ccFlags)) $ lookup "CFLAGS" env @@ -698,19 +734,20 @@ runConfigureScript verbosity backwardsCompatHack flags lbi = do ((intercalate spSep extraPath ++ spSep)++) $ lookup "PATH" env overEnv = ("CFLAGS", Just cflagsEnv) : [("PATH", Just pathEnv) | not (null extraPath)] - args' = args ++ ["CC=" ++ ccProgShort] + args' = configureFile:args ++ ["CC=" ++ ccProgShort] shProg = simpleProgram "sh" progDb = modifyProgramSearchPath (\p -> map ProgramSearchPathDir extraPath ++ p) emptyProgramDb shConfiguredProg <- lookupProgram shProg `fmap` configureProgram verbosity shProg progDb case shConfiguredProg of - Just sh -> runProgramInvocation verbosity + Just sh -> runProgramInvocation verbosity $ (programInvocation (sh {programOverrideEnv = overEnv}) args') + { progInvokeCwd = Just (buildDir lbi) } Nothing -> die notFoundMsg where - args = "./configure" : configureArgs backwardsCompatHack flags + args = configureArgs backwardsCompatHack flags notFoundMsg = "The package has a './configure' script. " ++ "If you are on Windows, This requires a " @@ -718,9 +755,9 @@ runConfigureScript verbosity backwardsCompatHack flags lbi = do ++ "If you are not on Windows, ensure that an 'sh' command " ++ "is discoverable in your path." -getHookedBuildInfo :: Verbosity -> IO HookedBuildInfo -getHookedBuildInfo verbosity = do - maybe_infoFile <- defaultHookedPackageDesc +getHookedBuildInfo :: FilePath -> Verbosity -> IO HookedBuildInfo +getHookedBuildInfo build_dir verbosity = do + maybe_infoFile <- findHookedPackageDesc build_dir case maybe_infoFile of Nothing -> return emptyHookedBuildInfo Just infoFile -> do diff --git a/Cabal/Distribution/Simple/Configure.hs b/Cabal/Distribution/Simple/Configure.hs index 8bb879949da..69f8bacbfb4 100644 --- a/Cabal/Distribution/Simple/Configure.hs +++ b/Cabal/Distribution/Simple/Configure.hs @@ -112,19 +112,22 @@ import qualified Distribution.Simple.HaskellSuite as HaskellSuite import Control.Exception ( ErrorCall, Exception, evaluate, throw, throwIO, try ) -import Distribution.Compat.Binary ( decodeOrFailIO, encode ) -import Data.ByteString.Lazy (ByteString) +import Control.Monad ( forM, forM_ ) +import Distribution.Compat.Binary ( decodeOrFailIO, encode ) +import Distribution.Compat.Directory ( listDirectory ) +import Data.ByteString.Lazy ( ByteString ) import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy.Char8 as BLC8 import Data.List - ( (\\), partition, inits, stripPrefix ) + ( (\\), partition, inits, stripPrefix, intersect ) import Data.Either ( partitionEithers ) import qualified Data.Map as Map import System.Directory - ( doesFileExist, createDirectoryIfMissing, getTemporaryDirectory ) + ( doesFileExist, createDirectoryIfMissing, getTemporaryDirectory + , removeFile) import System.FilePath - ( (), isAbsolute ) + ( (), isAbsolute, takeDirectory ) import qualified System.Info ( compilerName, compilerVersion ) import System.IO @@ -137,6 +140,7 @@ import Text.PrettyPrint import Distribution.Compat.Environment ( lookupEnv ) import Distribution.Compat.Exception ( catchExit, catchIO ) + type UseExternalInternalDeps = Bool -- | The errors that can be thrown when reading the @setup-config@ file. @@ -702,6 +706,7 @@ configure (pkg_descr0, pbi) cfg = do compiler = comp, hostPlatform = compPlatform, buildDir = buildDir, + cabalFilePath = flagToMaybe (configCabalFilePath cfg), componentGraph = Graph.fromDistinctList buildComponents, componentNameMap = buildComponentsMap, installedPkgs = packageDependsIndex, @@ -1646,9 +1651,41 @@ checkForeignDeps pkg lbi verbosity = allLibs = collectField PD.extraLibs ifBuildsWith headers args success failure = do + checkDuplicateHeaders ok <- builds (makeProgram headers) args if ok then success else failure + -- Ensure that there is only one header with a given name + -- in either the generated (most likely by `configure`) + -- build directory (e.g. `dist/build`) or in the source directory. + -- + -- If it exists in both, we'll remove the one in the source + -- directory, as the generated should take precedence. + -- + -- C compilers like to prefer source local relative includes, + -- so the search paths provided to the compiler via -I are + -- ignored if the included file can be found relative to the + -- including file. As such we need to take drastic measures + -- and delete the offending file in the source directory. + checkDuplicateHeaders = do + let relIncDirs = filter (not . isAbsolute) (collectField PD.includeDirs) + isHeader = isSuffixOf ".h" + genHeaders <- forM relIncDirs $ \dir -> + fmap (dir ) . filter isHeader <$> listDirectory (buildDir lbi dir) + `catchIO` (\_ -> return []) + srcHeaders <- forM relIncDirs $ \dir -> + fmap (dir ) . filter isHeader <$> listDirectory (baseDir lbi dir) + `catchIO` (\_ -> return []) + let commonHeaders = concat genHeaders `intersect` concat srcHeaders + forM_ commonHeaders $ \hdr -> do + warn verbosity $ "Duplicate header found in " + ++ (buildDir lbi hdr) + ++ " and " + ++ (baseDir lbi hdr) + ++ "; removing " + ++ (baseDir lbi hdr) + removeFile (baseDir lbi hdr) + findOffendingHdr = ifBuildsWith allHeaders ccArgs (return Nothing) @@ -1673,14 +1710,23 @@ checkForeignDeps pkg lbi verbosity = libExists lib = builds (makeProgram []) (makeLdArgs [lib]) + baseDir lbi' = fromMaybe "." (takeDirectory <$> cabalFilePath lbi') + commonCppArgs = platformDefines lbi -- TODO: This is a massive hack, to work around the -- fact that the test performed here should be -- PER-component (c.f. the "I'm Feeling Lucky"; we -- should NOT be glomming everything together.) ++ [ "-I" ++ buildDir lbi "autogen" ] - ++ [ "-I" ++ dir | dir <- collectField PD.includeDirs ] - ++ ["-I."] + -- `configure' may generate headers in the build directory + ++ [ "-I" ++ buildDir lbi dir | dir <- collectField PD.includeDirs + , not (isAbsolute dir)] + -- we might also reference headers from the packages directory. + ++ [ "-I" ++ baseDir lbi dir | dir <- collectField PD.includeDirs + , not (isAbsolute dir)] + ++ [ "-I" ++ dir | dir <- collectField PD.includeDirs + , isAbsolute dir] + ++ ["-I" ++ baseDir lbi] ++ collectField PD.cppOptions ++ collectField PD.ccOptions ++ [ "-I" ++ dir diff --git a/Cabal/Distribution/Simple/GHC/Internal.hs b/Cabal/Distribution/Simple/GHC/Internal.hs index 00ee355f008..08adc9c117c 100644 --- a/Cabal/Distribution/Simple/GHC/Internal.hs +++ b/Cabal/Distribution/Simple/GHC/Internal.hs @@ -107,8 +107,8 @@ configureToolchain _implInfo ghcProg ghcInfo = } where compilerDir = takeDirectory (programPath ghcProg) - baseDir = takeDirectory compilerDir - mingwBinDir = baseDir "mingw" "bin" + base_dir = takeDirectory compilerDir + mingwBinDir = base_dir "mingw" "bin" isWindows = case buildOS of Windows -> True; _ -> False binPrefix = "" @@ -276,7 +276,11 @@ componentCcGhcOptions verbosity _implInfo lbi bi clbi odir filename = ghcOptCppIncludePath = toNubListR $ [autogenComponentModulesDir lbi clbi ,autogenPackageModulesDir lbi ,odir] - ++ PD.includeDirs bi, + -- includes relative to the package + ++ PD.includeDirs bi + -- potential includes generated by `configure' + -- in the build directory + ++ [buildDir lbi dir | dir <- PD.includeDirs bi], ghcOptHideAllPackages= toFlag True, ghcOptPackageDBs = withPackageDB lbi, ghcOptPackages = toNubListR $ mkGhcOptPackages clbi, @@ -309,7 +313,11 @@ componentCxxGhcOptions verbosity _implInfo lbi bi cxxlbi odir filename = ghcOptCppIncludePath = toNubListR $ [autogenComponentModulesDir lbi cxxlbi ,autogenPackageModulesDir lbi ,odir] - ++ PD.includeDirs bi, + -- includes relative to the package + ++ PD.includeDirs bi + -- potential includes generated by `configure' + -- in the build directory + ++ [buildDir lbi dir | dir <- PD.includeDirs bi], ghcOptHideAllPackages= toFlag True, ghcOptPackageDBs = withPackageDB lbi, ghcOptPackages = toNubListR $ mkGhcOptPackages cxxlbi, @@ -365,7 +373,11 @@ componentGhcOptions verbosity implInfo lbi bi clbi odir = ghcOptCppIncludePath = toNubListR $ [autogenComponentModulesDir lbi clbi ,autogenPackageModulesDir lbi ,odir] - ++ PD.includeDirs bi, + -- includes relative to the package + ++ PD.includeDirs bi + -- potential includes generated by `configure' + -- in the build directory + ++ [buildDir lbi dir | dir <- PD.includeDirs bi], ghcOptCppOptions = toNubListR $ cppOptions bi, ghcOptCppIncludes = toNubListR $ [autogenComponentModulesDir lbi clbi cppHeaderName], diff --git a/Cabal/Distribution/Simple/Haddock.hs b/Cabal/Distribution/Simple/Haddock.hs index 4a2bfdb0bf2..c78d1bf46ce 100644 --- a/Cabal/Distribution/Simple/Haddock.hs +++ b/Cabal/Distribution/Simple/Haddock.hs @@ -736,7 +736,8 @@ haddockToHscolour flags = hscolourBenchmarks = haddockBenchmarks flags, hscolourForeignLibs = haddockForeignLibs flags, hscolourVerbosity = haddockVerbosity flags, - hscolourDistPref = haddockDistPref flags + hscolourDistPref = haddockDistPref flags, + hscolourCabalFilePath = haddockCabalFilePath flags } -- ------------------------------------------------------------------------------ diff --git a/Cabal/Distribution/Simple/Install.hs b/Cabal/Distribution/Simple/Install.hs index edf9ff99fb9..8d86318b205 100644 --- a/Cabal/Distribution/Simple/Install.hs +++ b/Cabal/Distribution/Simple/Install.hs @@ -171,7 +171,7 @@ copyComponent verbosity pkg_descr lbi (CLib lib) clbi copydest = do -- install include files for all compilers - they may be needed to compile -- haskell files (using the CPP extension) - installIncludeFiles verbosity lib buildPref incPref + installIncludeFiles verbosity lib lbi buildPref incPref case compilerFlavor (compiler lbi) of GHC -> GHC.installLib verbosity lbi libPref dynlibPref buildPref pkg_descr lib clbi @@ -247,12 +247,13 @@ installDataFiles verbosity pkg_descr destDataDir = -- | Install the files listed in install-includes for a library -- -installIncludeFiles :: Verbosity -> Library -> FilePath -> FilePath -> IO () -installIncludeFiles verbosity lib buildPref destIncludeDir = do - let relincdirs = "." : filter isRelative (includeDirs lbi) - lbi = libBuildInfo lib - incdirs = relincdirs ++ [ buildPref dir | dir <- relincdirs ] - incs <- traverse (findInc incdirs) (installIncludes lbi) +installIncludeFiles :: Verbosity -> Library -> LocalBuildInfo -> FilePath -> FilePath -> IO () +installIncludeFiles verbosity lib lbi buildPref destIncludeDir = do + let relincdirs = "." : filter isRelative (includeDirs libBi) + libBi = libBuildInfo lib + incdirs = [ baseDir lbi dir | dir <- relincdirs ] + ++ [ buildPref dir | dir <- relincdirs ] + incs <- traverse (findInc incdirs) (installIncludes libBi) sequence_ [ do createDirectoryIfMissingVerbose verbosity True destDir installOrdinaryFile verbosity srcFile destFile @@ -260,7 +261,7 @@ installIncludeFiles verbosity lib buildPref destIncludeDir = do , let destFile = destIncludeDir relFile destDir = takeDirectory destFile ] where - + baseDir lbi' = fromMaybe "" (takeDirectory <$> cabalFilePath lbi') findInc [] file = die' verbosity ("can't find include file " ++ file) findInc (dir:dirs) file = do let path = dir file diff --git a/Cabal/Distribution/Simple/LHC.hs b/Cabal/Distribution/Simple/LHC.hs index 5a224f7cbbd..1697d2d9f56 100644 --- a/Cabal/Distribution/Simple/LHC.hs +++ b/Cabal/Distribution/Simple/LHC.hs @@ -118,7 +118,7 @@ configureToolchain :: ConfiguredProgram -> ProgramDb -> ProgramDb configureToolchain lhcProg = addKnownProgram gccProgram { - programFindLocation = findProg gccProgram (baseDir "gcc.exe"), + programFindLocation = findProg gccProgram (base_dir "gcc.exe"), programPostConf = configureGcc } . addKnownProgram ldProgram { @@ -127,9 +127,9 @@ configureToolchain lhcProg = } where compilerDir = takeDirectory (programPath lhcProg) - baseDir = takeDirectory compilerDir - gccLibDir = baseDir "gcc-lib" - includeDir = baseDir "include" "mingw" + base_dir = takeDirectory compilerDir + gccLibDir = base_dir "gcc-lib" + includeDir = base_dir "include" "mingw" isWindows = case buildOS of Windows -> True; _ -> False -- on Windows finding and configuring ghc's gcc and ld is a bit special diff --git a/Cabal/Distribution/Simple/PreProcess.hs b/Cabal/Distribution/Simple/PreProcess.hs index e5c60a15ee6..c8b05e8693f 100644 --- a/Cabal/Distribution/Simple/PreProcess.hs +++ b/Cabal/Distribution/Simple/PreProcess.hs @@ -421,6 +421,7 @@ ppHsc2hs bi lbi clbi = -- Options from the current package: ++ [ "--cflag=-I" ++ dir | dir <- PD.includeDirs bi ] + ++ [ "--cflag=-I" ++ buildDir lbi dir | dir <- PD.includeDirs bi ] ++ [ "--cflag=" ++ opt | opt <- PD.ccOptions bi ++ PD.cppOptions bi ] ++ [ "--cflag=" ++ opt | opt <- diff --git a/Cabal/Distribution/Simple/Setup.hs b/Cabal/Distribution/Simple/Setup.hs index 2c156778d04..a768eb841df 100644 --- a/Cabal/Distribution/Simple/Setup.hs +++ b/Cabal/Distribution/Simple/Setup.hs @@ -918,7 +918,8 @@ data CopyFlags = CopyFlags { -- This is the same hack as in 'buildArgs'. But I (ezyang) don't -- think it's a hack, it's the right way to make hooks more robust -- TODO: Stop using this eventually when 'UserHooks' gets changed - copyArgs :: [String] + copyArgs :: [String], + copyCabalFilePath :: Flag FilePath } deriving (Show, Generic) @@ -927,7 +928,8 @@ defaultCopyFlags = CopyFlags { copyDest = Flag NoCopyDest, copyDistPref = NoFlag, copyVerbosity = Flag normal, - copyArgs = [] + copyArgs = [], + copyCabalFilePath = mempty } copyCommand :: CommandUI CopyFlags @@ -1002,7 +1004,10 @@ data InstallFlags = InstallFlags { installDistPref :: Flag FilePath, installUseWrapper :: Flag Bool, installInPlace :: Flag Bool, - installVerbosity :: Flag Verbosity + installVerbosity :: Flag Verbosity, + -- this is only here, because we can not + -- change the hooks API. + installCabalFilePath :: Flag FilePath } deriving (Show, Generic) @@ -1013,7 +1018,8 @@ defaultInstallFlags = InstallFlags { installDistPref = NoFlag, installUseWrapper = Flag False, installInPlace = Flag False, - installVerbosity = Flag normal + installVerbosity = Flag normal, + installCabalFilePath = mempty } installCommand :: CommandUI InstallFlags @@ -1157,7 +1163,8 @@ data RegisterFlags = RegisterFlags { regPrintId :: Flag Bool, regVerbosity :: Flag Verbosity, -- Same as in 'buildArgs' and 'copyArgs' - regArgs :: [String] + regArgs :: [String], + regCabalFilePath :: Flag FilePath } deriving (Show, Generic) @@ -1170,6 +1177,7 @@ defaultRegisterFlags = RegisterFlags { regDistPref = NoFlag, regPrintId = Flag False, regArgs = [], + regCabalFilePath = mempty, regVerbosity = Flag normal } @@ -1269,8 +1277,9 @@ data HscolourFlags = HscolourFlags { hscolourBenchmarks :: Flag Bool, hscolourForeignLibs :: Flag Bool, hscolourDistPref :: Flag FilePath, - hscolourVerbosity :: Flag Verbosity - } + hscolourVerbosity :: Flag Verbosity, + hscolourCabalFilePath :: Flag FilePath + } deriving (Show, Generic) emptyHscolourFlags :: HscolourFlags @@ -1284,7 +1293,8 @@ defaultHscolourFlags = HscolourFlags { hscolourBenchmarks = Flag False, hscolourDistPref = NoFlag, hscolourForeignLibs = Flag False, - hscolourVerbosity = Flag normal + hscolourVerbosity = Flag normal, + hscolourCabalFilePath = mempty } instance Monoid HscolourFlags where @@ -1459,7 +1469,8 @@ data HaddockFlags = HaddockFlags { haddockContents :: Flag PathTemplate, haddockDistPref :: Flag FilePath, haddockKeepTempFiles:: Flag Bool, - haddockVerbosity :: Flag Verbosity + haddockVerbosity :: Flag Verbosity, + haddockCabalFilePath :: Flag FilePath } deriving (Show, Generic) @@ -1482,7 +1493,8 @@ defaultHaddockFlags = HaddockFlags { haddockContents = NoFlag, haddockDistPref = NoFlag, haddockKeepTempFiles= Flag False, - haddockVerbosity = Flag normal + haddockVerbosity = Flag normal, + haddockCabalFilePath = mempty } haddockCommand :: CommandUI HaddockFlags @@ -1621,7 +1633,8 @@ instance Semigroup HaddockFlags where data CleanFlags = CleanFlags { cleanSaveConf :: Flag Bool, cleanDistPref :: Flag FilePath, - cleanVerbosity :: Flag Verbosity + cleanVerbosity :: Flag Verbosity, + cleanCabalFilePath :: Flag FilePath } deriving (Show, Generic) @@ -1629,7 +1642,8 @@ defaultCleanFlags :: CleanFlags defaultCleanFlags = CleanFlags { cleanSaveConf = Flag False, cleanDistPref = NoFlag, - cleanVerbosity = Flag normal + cleanVerbosity = Flag normal, + cleanCabalFilePath = mempty } cleanCommand :: CommandUI CleanFlags @@ -1677,7 +1691,8 @@ data BuildFlags = BuildFlags { buildNumJobs :: Flag (Maybe Int), -- TODO: this one should not be here, it's just that the silly -- UserHooks stop us from passing extra info in other ways - buildArgs :: [String] + buildArgs :: [String], + buildCabalFilePath :: Flag FilePath } deriving (Read, Show, Generic) @@ -1692,7 +1707,8 @@ defaultBuildFlags = BuildFlags { buildDistPref = mempty, buildVerbosity = Flag normal, buildNumJobs = mempty, - buildArgs = [] + buildArgs = [], + buildCabalFilePath = mempty } buildCommand :: ProgramDb -> CommandUI BuildFlags diff --git a/Cabal/Distribution/Simple/Utils.hs b/Cabal/Distribution/Simple/Utils.hs index 64498b01514..35c5a2edcc0 100644 --- a/Cabal/Distribution/Simple/Utils.hs +++ b/Cabal/Distribution/Simple/Utils.hs @@ -1536,6 +1536,7 @@ findPackageDesc dir tryFindPackageDesc :: FilePath -> IO FilePath tryFindPackageDesc dir = either die return =<< findPackageDesc dir +{-# DEPRECATED defaultHookedPackageDesc "Use findHookedPackageDesc with the proper base directory instead" #-} -- |Optional auxiliary package information file (/pkgname/@.buildinfo@) defaultHookedPackageDesc :: IO (Maybe FilePath) defaultHookedPackageDesc = findHookedPackageDesc currentDir diff --git a/Cabal/Distribution/Types/LocalBuildInfo.hs b/Cabal/Distribution/Types/LocalBuildInfo.hs index 6736247dfa0..8e79f73d856 100644 --- a/Cabal/Distribution/Types/LocalBuildInfo.hs +++ b/Cabal/Distribution/Types/LocalBuildInfo.hs @@ -103,6 +103,8 @@ data LocalBuildInfo = LocalBuildInfo { -- ^ The platform we're building for buildDir :: FilePath, -- ^ Where to build the package. + cabalFilePath :: Maybe FilePath, + -- ^ Path to the cabal file, if given during configuration. componentGraph :: Graph ComponentLocalBuildInfo, -- ^ All the components to build, ordered by topological -- sort, and with their INTERNAL dependencies over the diff --git a/cabal-install/Distribution/Client/Config.hs b/cabal-install/Distribution/Client/Config.hs index e17420a20dc..b0d31bc0f13 100644 --- a/cabal-install/Distribution/Client/Config.hs +++ b/cabal-install/Distribution/Client/Config.hs @@ -412,7 +412,8 @@ instance Semigroup SavedConfig where haddockContents = combine haddockContents, haddockDistPref = combine haddockDistPref, haddockKeepTempFiles = combine haddockKeepTempFiles, - haddockVerbosity = combine haddockVerbosity + haddockVerbosity = combine haddockVerbosity, + haddockCabalFilePath = combine haddockCabalFilePath } where combine = combine' savedHaddockFlags diff --git a/cabal-install/Distribution/Client/ProjectConfig/Legacy.hs b/cabal-install/Distribution/Client/ProjectConfig/Legacy.hs index d1f889a4b28..ab72321559e 100644 --- a/cabal-install/Distribution/Client/ProjectConfig/Legacy.hs +++ b/cabal-install/Distribution/Client/ProjectConfig/Legacy.hs @@ -729,7 +729,8 @@ convertToLegacyPerPackageConfig PackageConfig {..} = haddockContents = packageConfigHaddockContents, haddockDistPref = mempty, haddockKeepTempFiles = mempty, - haddockVerbosity = mempty + haddockVerbosity = mempty, + haddockCabalFilePath = mempty } diff --git a/cabal-install/Distribution/Client/ProjectPlanning.hs b/cabal-install/Distribution/Client/ProjectPlanning.hs index fa8ce4c9419..98c1b19504c 100644 --- a/cabal-install/Distribution/Client/ProjectPlanning.hs +++ b/cabal-install/Distribution/Client/ProjectPlanning.hs @@ -3198,7 +3198,8 @@ setupHsBuildFlags _ _ verbosity builddir = buildVerbosity = toFlag verbosity, buildDistPref = toFlag builddir, buildNumJobs = mempty, --TODO: [nice to have] sometimes want to use toFlag (Just numBuildJobs), - buildArgs = mempty -- unused, passed via args not flags + buildArgs = mempty, -- unused, passed via args not flags + buildCabalFilePath= mempty } @@ -3282,7 +3283,8 @@ setupHsCopyFlags _ _ verbosity builddir destdir = copyArgs = [], -- TODO: could use this to only copy what we enabled copyDest = toFlag (InstallDirs.CopyTo destdir), copyDistPref = toFlag builddir, - copyVerbosity = toFlag verbosity + copyVerbosity = toFlag verbosity, + copyCabalFilePath = mempty } setupHsRegisterFlags :: ElaboratedConfiguredPackage @@ -3303,7 +3305,8 @@ setupHsRegisterFlags ElaboratedConfiguredPackage{..} _ regPrintId = mempty, -- never use regDistPref = toFlag builddir, regArgs = [], - regVerbosity = toFlag verbosity + regVerbosity = toFlag verbosity, + regCabalFilePath = mempty } setupHsHaddockFlags :: ElaboratedConfiguredPackage @@ -3332,7 +3335,8 @@ setupHsHaddockFlags (ElaboratedConfiguredPackage{..}) _ verbosity builddir = haddockContents = maybe mempty toFlag elabHaddockContents, haddockDistPref = toFlag builddir, haddockKeepTempFiles = mempty, --TODO: from build settings - haddockVerbosity = toFlag verbosity + haddockVerbosity = toFlag verbosity, + haddockCabalFilePath = mempty } {-