diff --git a/Cabal/src/Distribution/Simple/BuildPaths.hs b/Cabal/src/Distribution/Simple/BuildPaths.hs index 8f77b954623..5c422041010 100644 --- a/Cabal/src/Distribution/Simple/BuildPaths.hs +++ b/Cabal/src/Distribution/Simple/BuildPaths.hs @@ -22,6 +22,7 @@ module Distribution.Simple.BuildPaths , haddockPref , autogenPackageModulesDir , autogenComponentModulesDir + , includeSearchDirs , preBuildRulesCacheFile , autogenPathsModuleName , autogenPackageInfoModuleName @@ -156,6 +157,44 @@ autogenPackageModulesDir lbi = buildDir lbi makeRelativePathEx "global-autog autogenComponentModulesDir :: LocalBuildInfo -> ComponentLocalBuildInfo -> SymbolicPath Pkg (Dir Source) autogenComponentModulesDir lbi clbi = componentBuildDir lbi clbi makeRelativePathEx "autogen" +-- | The directories in which to look for a header file named in @includes@ or +-- @install-includes@. +-- +-- Searched directories: +-- +-- - the package root +-- - the component build directory (if any) +-- - the include directories, with relative ones being interpreted relative to: +-- - the package root, +-- - the package build directory, +-- - the component build directory (if any) +includeSearchDirs + :: LocalBuildInfo + -> Maybe ComponentLocalBuildInfo + -- ^ the component being built (if any) + -> [SymbolicPath Pkg (Dir Include)] + -- ^ @include-dirs@ + -> [SymbolicPath Pkg (Dir Include)] +includeSearchDirs lbi mbClbi incDirs = + ordNub $ + (sameDirectory : incDirs) + ++ [ componentRoot dir + | componentRoot <- maybeToList mbComponentRoot + , dir <- sameDirectory : relIncDirs + ] + ++ [ packageBuildRoot dir + | dir <- relIncDirs + ] + where + relIncDirs :: [RelativePath Pkg (Dir Include)] + relIncDirs = mapMaybe symbolicPathRelative_maybe incDirs + + packageBuildRoot :: SymbolicPath Pkg (Dir Pkg) + packageBuildRoot = coerceSymbolicPath (buildDir lbi) + + mbComponentRoot :: Maybe (SymbolicPath Pkg (Dir Pkg)) + mbComponentRoot = coerceSymbolicPath . componentBuildDir lbi <$> mbClbi + -- | The path to the pre-build rules cache file for a component, used to -- compute rule staleness across runs. preBuildRulesCacheFile @@ -249,7 +288,7 @@ getExeSourceFiles -> IO [(ModuleName.ModuleName, SymbolicPath Pkg 'File)] getExeSourceFiles verbosity lbi exe clbi = do moduleFiles <- getSourceFiles verbosity mbWorkDir searchpaths modules - srcMainPath <- findFileCwd verbosity mbWorkDir (hsSourceDirs bi) (modulePath exe) + srcMainPath <- findFileCwd verbosity FindHaskellSourceFile mbWorkDir (hsSourceDirs bi) (modulePath exe) return ((ModuleName.main, srcMainPath) : moduleFiles) where mbWorkDir = mbWorkDirLBI lbi @@ -269,7 +308,7 @@ getTestSourceFiles -> IO [(ModuleName.ModuleName, SymbolicPath Pkg 'File)] getTestSourceFiles verbosity lbi test@TestSuite{testInterface = TestSuiteExeV10 _ path} clbi = do moduleFiles <- getSourceFiles verbosity mbWorkDir searchpaths modules - srcMainPath <- findFileCwd verbosity mbWorkDir (hsSourceDirs bi) path + srcMainPath <- findFileCwd verbosity FindHaskellSourceFile mbWorkDir (hsSourceDirs bi) path return ((ModuleName.main, srcMainPath) : moduleFiles) where mbWorkDir = mbWorkDirLBI lbi @@ -290,7 +329,7 @@ getBenchmarkSourceFiles -> IO [(ModuleName.ModuleName, SymbolicPath Pkg 'File)] getBenchmarkSourceFiles verbosity lbi bench@Benchmark{benchmarkInterface = BenchmarkExeV10 _ path} clbi = do moduleFiles <- getSourceFiles verbosity mbWorkDir searchpaths modules - srcMainPath <- findFileCwd verbosity mbWorkDir (hsSourceDirs bi) path + srcMainPath <- findFileCwd verbosity FindHaskellSourceFile mbWorkDir (hsSourceDirs bi) path return ((ModuleName.main, srcMainPath) : moduleFiles) where mbWorkDir = mbWorkDirLBI lbi diff --git a/Cabal/src/Distribution/Simple/Configure.hs b/Cabal/src/Distribution/Simple/Configure.hs index 53b99b349d0..cf9ed84388e 100644 --- a/Cabal/src/Distribution/Simple/Configure.hs +++ b/Cabal/src/Distribution/Simple/Configure.hs @@ -90,6 +90,7 @@ import Distribution.PackageDescription import Distribution.PackageDescription.Check hiding (doesFileExist, listDirectory) import Distribution.PackageDescription.Configuration import Distribution.PackageDescription.PrettyPrint +import Distribution.Simple.BuildPaths (includeSearchDirs) import Distribution.Simple.BuildTarget import Distribution.Simple.BuildToolDepends import Distribution.Simple.BuildWay @@ -1380,12 +1381,15 @@ finalCheckPackage do let common = configCommonFlags cfg verbosity = mkVerbosity verbHandles (fromFlag $ setupVerbosity common) - cabalFileDir = packageRoot common + pkgRoot = + interpretSymbolicPath + (flagToMaybe $ setupWorkingDir common) + (sameDirectory :: SymbolicPath Pkg (Dir Pkg)) checkCompilerProblems verbosity comp pkg_descr enabled checkPackageProblems verbosity - cabalFileDir + pkgRoot g_pkg_descr (updatePackageDescription hookedBuildInfo pkg_descr) -- NB: we apply the HookedBuildInfo to check it is valid, @@ -2782,14 +2786,14 @@ checkForeignDeps pkg lbi verbosity = <$> listDirectory (i (buildDir lbi) dir) `catchIO` (\_ -> return []) srcHeaders <- for relIncDirs $ \dir -> fmap (dir ) . filter isHeader - <$> listDirectory (baseDir dir) `catchIO` (\_ -> return []) + <$> listDirectory (pkgRoot dir) `catchIO` (\_ -> return []) let commonHeaders = concat genHeaders `intersect` concat srcHeaders for_ commonHeaders $ \hdr -> do warn verbosity $ "Duplicate header found in " ++ (getSymbolicPath (buildDir lbi) hdr) ++ " and " - ++ (baseDir hdr) + ++ (pkgRoot hdr) ++ ". Which one the C compiler will use is unspecified." findOffendingHdr = @@ -2825,12 +2829,10 @@ checkForeignDeps pkg lbi verbosity = libExists lib = builds (makeProgram []) (makeLdArgs [lib]) - common = configCommonFlags $ configFlags lbi - baseDir = packageRoot common - -- See Note [Symbolic paths] in Distribution.Utils.Path i = interpretSymbolicPathLBI lbi mbWorkDir = mbWorkDirLBI lbi + pkgRoot = i (sameDirectory :: SymbolicPath Pkg (Dir Pkg)) commonCppArgs = platformDefines lbi @@ -2839,20 +2841,9 @@ checkForeignDeps pkg lbi verbosity = -- PER-component (c.f. the "I'm Feeling Lucky"; we -- should NOT be glomming everything together.) ++ ["-I" ++ i (buildDir lbi makeRelativePathEx "autogen")] - -- `configure' may generate headers in the build directory - ++ [ "-I" ++ i (buildDir lbi unsafeCoerceSymbolicPath dir) - | dir <- mapMaybe symbolicPathRelative_maybe $ ordNub (collectField includeDirs) - ] - -- we might also reference headers from the - -- packages directory. - ++ [ "-I" ++ baseDir getSymbolicPath dir - | dir <- mapMaybe symbolicPathRelative_maybe $ ordNub (collectField includeDirs) - ] - ++ [ "-I" ++ dir - | dir <- ordNub (collectField (fmap getSymbolicPath . includeDirs)) - , isAbsolute dir + ++ [ "-I" ++ i dir + | dir <- includeSearchDirs lbi Nothing $ ordNub (collectField includeDirs) ] - ++ ["-I" ++ baseDir] ++ map Text.unpack (collectField cppOptions) ++ map Text.unpack (collectField ccOptions) ++ [ "-I" ++ dir @@ -2942,7 +2933,7 @@ checkForeignDeps pkg lbi verbosity = checkPackageProblems :: Verbosity -> FilePath - -- ^ Path to the @.cabal@ file's directory + -- ^ Path to the package root -> GenericPackageDescription -> PackageDescription -> IO () diff --git a/Cabal/src/Distribution/Simple/ConfigureScript.hs b/Cabal/src/Distribution/Simple/ConfigureScript.hs index 102bacf6234..8893e0126c4 100644 --- a/Cabal/src/Distribution/Simple/ConfigureScript.hs +++ b/Cabal/src/Distribution/Simple/ConfigureScript.hs @@ -22,7 +22,6 @@ import Distribution.PackageDescription import Distribution.Pretty import Distribution.Simple.Configure (findDistPrefOrDefault) import Distribution.Simple.Errors -import Distribution.Simple.LocalBuildInfo import Distribution.Simple.Program import Distribution.Simple.Program.Db import Distribution.Simple.Setup.Common @@ -59,7 +58,9 @@ runConfigureScript verbHandles cfg flags programDb hp = do dist_dir <- findDistPrefOrDefault $ setupDistPref commonCfg let build_dir = dist_dir makeRelativePathEx "build" mbWorkDir = flagToMaybe $ setupWorkingDir commonCfg - configureScriptPath = packageRoot commonCfg "configure" + configureScriptPath = + interpretSymbolicPath mbWorkDir $ + makeRelativePathEx @Pkg "configure" confExists <- doesFileExist configureScriptPath unless confExists $ dieWithException verbosity (ConfigureScriptNotFound configureScriptPath) diff --git a/Cabal/src/Distribution/Simple/Errors.hs b/Cabal/src/Distribution/Simple/Errors.hs index 24b4891f0c3..47ad6b3df45 100644 --- a/Cabal/src/Distribution/Simple/Errors.hs +++ b/Cabal/src/Distribution/Simple/Errors.hs @@ -1,3 +1,5 @@ +{-# LANGUAGE LambdaCase #-} + ----------------------------------------------------------------------------- -- Module : Distribution.Simple.Errors @@ -11,6 +13,7 @@ module Distribution.Simple.Errors ( CabalException (..) , FailedDependency (..) + , WhatToFind (..) , exceptionCode , exceptionMessage ) where @@ -49,10 +52,8 @@ data CabalException | -- | @NoLibraryFound@ has been downgraded to a warning, and is therefore no longer emitted. NoLibraryFound | CompilerNotInstalled CompilerFlavor - | CantFindIncludeFile String [String] | UnsupportedTestSuite String | UnsupportedBenchMark String - | NoIncludeFileFound String [String] | NoModuleFound ModuleName [Suffix] | RegMultipleInstancePkg | SuppressingChecksOnFile @@ -147,7 +148,7 @@ data CabalException | Couldn'tFindTestProgLibV09 FilePath | TestCoverageSupportLibV09 | RawSystemStdout String - | FindFile FilePath + | FindFile WhatToFind FilePath [FilePath] | FindModuleFileEx ModuleName [Suffix] [FilePath] | MultipleFilesWithExtension String | NoDesc @@ -171,6 +172,20 @@ data CabalException | StandaloneBytecodeNotSupportedYet deriving (Show) +data WhatToFind + = FindIncludeFile + | FindHaskellSourceFile + | FindModuleDefFile + | FindOtherFile -- generic fallback + deriving (Show, Eq) + +whatToFind :: WhatToFind -> String +whatToFind = \case + FindIncludeFile -> "include file" + FindHaskellSourceFile -> "Haskell source file" + FindModuleDefFile -> "module definition file" + FindOtherFile -> "file" + exceptionCode :: CabalException -> Int exceptionCode e = case e of NoBenchMarkProgram{} -> 1678 @@ -179,10 +194,10 @@ exceptionCode e = case e of NoBenchMark{} -> 1654 NoLibraryFound -> 2546 CompilerNotInstalled{} -> 7465 - CantFindIncludeFile{} -> 3876 + -- Retired: CantFindIncludeFile{} -> 3876 UnsupportedTestSuite{} -> 3245 UnsupportedBenchMark{} -> 9123 - NoIncludeFileFound{} -> 2987 + -- Retired: NoIncludeFileFound{} -> 2987 NoModuleFound{} -> 6421 RegMultipleInstancePkg{} -> 3421 SuppressingChecksOnFile{} -> 5436 @@ -319,10 +334,8 @@ exceptionMessage e = case e of NoBenchMark bmName -> "no such benchmark: " ++ bmName NoLibraryFound -> "No executables and no library found. Nothing to do." CompilerNotInstalled compilerFlavor -> "installing with " ++ prettyShow compilerFlavor ++ "is not implemented" - CantFindIncludeFile file sd -> "can't find include file " ++ file ++ " in any of the search dirs " ++ intercalate ", " sd UnsupportedTestSuite test_type -> "Unsupported test suite type: " ++ test_type UnsupportedBenchMark benchMarkType -> "Unsupported benchmark type: " ++ benchMarkType - NoIncludeFileFound f sd -> "can't find include file " ++ f ++ " in any of the search dirs " ++ intercalate ", " sd NoModuleFound m suffixes -> "Could not find module: " ++ prettyShow m @@ -705,7 +718,13 @@ exceptionMessage e = case e of ++ "\". Did you build the package first?" TestCoverageSupportLibV09 -> "Test coverage is only supported for packages with a library component." RawSystemStdout errors -> errors - FindFile fileName -> fileName ++ " doesn't exist" + FindFile what fileName searchDirs -> + "Could not find " + ++ whatToFind what + ++ " " + ++ fileName + ++ " in any of the search dirs: " + ++ intercalate ", " searchDirs FindModuleFileEx mod_name extensions searchPath -> "Could not find module: " ++ prettyShow mod_name diff --git a/Cabal/src/Distribution/Simple/GHC/Build/Utils.hs b/Cabal/src/Distribution/Simple/GHC/Build/Utils.hs index 7fbb97ec64f..839c52f2cbf 100644 --- a/Cabal/src/Distribution/Simple/GHC/Build/Utils.hs +++ b/Cabal/src/Distribution/Simple/GHC/Build/Utils.hs @@ -15,6 +15,7 @@ import Distribution.PackageDescription.Utils (cabalBug) import Distribution.Simple.BuildPaths import Distribution.Simple.BuildWay import Distribution.Simple.Compiler +import Distribution.Simple.Errors (WhatToFind (..)) import qualified Distribution.Simple.GHC.Internal as Internal import Distribution.Simple.Program.GHC import Distribution.Simple.Setup.Common @@ -41,7 +42,12 @@ findExecutableMain -> IO (SymbolicPath Pkg File) -- ^ The path to the main source file. findExecutableMain verbosity mbWorkDir buildDir (bnfo, modPath) = - findFileCwd verbosity mbWorkDir (coerceSymbolicPath buildDir : hsSourceDirs bnfo) modPath + findFileCwd + verbosity + FindHaskellSourceFile + mbWorkDir + (coerceSymbolicPath buildDir : hsSourceDirs bnfo) + modPath -- | Does this compiler support the @-dynamic-too@ option supportsDynamicToo :: Compiler -> Bool diff --git a/Cabal/src/Distribution/Simple/GHC/Internal.hs b/Cabal/src/Distribution/Simple/GHC/Internal.hs index a018b8da9c1..49f2fac0cdd 100644 --- a/Cabal/src/Distribution/Simple/GHC/Internal.hs +++ b/Cabal/src/Distribution/Simple/GHC/Internal.hs @@ -347,13 +347,7 @@ includePaths lbi bi clbi odir = , coerceSymbolicPath $ autogenPackageModulesDir lbi , coerceSymbolicPath odir ] - -- includes relative to the package - ++ includeDirs bi - -- potential includes generated by `configure' - -- in the build directory - ++ [ buildDir lbi dir - | dir <- mapMaybe (symbolicPathRelative_maybe . unsafeCoerceSymbolicPath) $ includeDirs bi - ] + ++ includeSearchDirs lbi (Just clbi) (includeDirs bi) data SplitSource = CcProgram | CxxProgram diff --git a/Cabal/src/Distribution/Simple/Install.hs b/Cabal/src/Distribution/Simple/Install.hs index ffcaad97556..6430734d348 100644 --- a/Cabal/src/Distribution/Simple/Install.hs +++ b/Cabal/src/Distribution/Simple/Install.hs @@ -33,7 +33,11 @@ import Distribution.Types.UnqualComponentName import Distribution.Package import Distribution.PackageDescription -import Distribution.Simple.BuildPaths (haddockPath, haddockPref) +import Distribution.Simple.BuildPaths + ( haddockPath + , haddockPref + , includeSearchDirs + ) import Distribution.Simple.BuildTarget import Distribution.Simple.Compiler ( CompilerFlavor (..) @@ -41,7 +45,6 @@ import Distribution.Simple.Compiler ) import Distribution.Simple.Glob (matchDirFileGlob) import Distribution.Simple.LocalBuildInfo -import Distribution.Simple.Setup.Config import Distribution.Simple.Setup.Copy ( CopyFlags (..) ) @@ -55,6 +58,7 @@ import qualified Distribution.Simple.SetupHooks.Internal as SetupHooks import Distribution.Simple.Utils ( createDirectoryIfMissingVerbose , dieWithException + , findFileCwd , info , installDirectoryContents , installOrdinaryFile @@ -239,7 +243,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 (libBuildInfo lib) lbi buildPref incPref + installIncludeFiles verbosity (libBuildInfo lib) lbi clbi incPref case compilerFlavor (compiler lbi) of GHC -> GHC.installLib verbosity lbi libPref dynlibPref bytecodeLibPref buildPref pkg_descr lib clbi @@ -254,7 +258,7 @@ copyComponent verbosity pkg_descr lbi (CFLib flib) clbi copydest = do buildPref = interpretSymbolicPathLBI lbi $ componentBuildDir lbi clbi noticeNoWrap verbosity ("Installing foreign library " ++ unUnqualComponentName (foreignLibName flib) ++ " in " ++ flibPref) - installIncludeFiles verbosity (foreignLibBuildInfo flib) lbi buildPref incPref + installIncludeFiles verbosity (foreignLibBuildInfo flib) lbi clbi incPref case compilerFlavor (compiler lbi) of GHC -> GHC.installFLib verbosity lbi flibPref buildPref pkg_descr flib @@ -338,31 +342,31 @@ installFileGlob verbosity spec_version mbWorkDir (srcDir, destDir) glob = do installOrdinaryFile verbosity src dst -- | Install the files listed in install-includes for a library -installIncludeFiles :: Verbosity -> BuildInfo -> LocalBuildInfo -> FilePath -> FilePath -> IO () -installIncludeFiles verbosity libBi lbi buildPref destIncludeDir = do - let relincdirs = sameDirectory : mapMaybe symbolicPathRelative_maybe (includeDirs libBi) - incdirs = - [ root getSymbolicPath dir - | -- NB: both baseDir and buildPref are already interpreted, - -- so we don't need to interpret these paths in the call to findInc. - dir <- relincdirs - , root <- [baseDir lbi, buildPref] - ] - incs <- traverse (findInc incdirs . getSymbolicPath) (installIncludes libBi) +installIncludeFiles + :: Verbosity + -> BuildInfo + -> LocalBuildInfo + -> ComponentLocalBuildInfo + -> FilePath + -- ^ absolute destination include directory + -> IO () +installIncludeFiles verbosity libBi lbi clbi destIncludeDir = do + incs <- + traverse + (\f -> (,) f <$> findFileCwd verbosity FindIncludeFile mbWorkDir incdirs f) + (installIncludes libBi) sequence_ [ do createDirectoryIfMissingVerbose verbosity True destDir - installOrdinaryFile verbosity srcFile destFile + installOrdinaryFile verbosity (i srcFile) destFile | (relFile, srcFile) <- incs - , let destFile = destIncludeDir relFile + , let destFile = destIncludeDir getSymbolicPath relFile destDir = takeDirectory destFile ] where - baseDir lbi' = packageRoot $ configCommonFlags $ configFlags lbi' - findInc fs f = go fs - where - go [] = dieWithException verbosity $ CantFindIncludeFile f fs - go (d : ds) = do - let path = d f - b <- doesFileExist path - if b then return (f, path) else go ds + -- See Note [Symbolic paths] in Distribution.Utils.Path + i = interpretSymbolicPathLBI lbi + mbWorkDir = mbWorkDirLBI lbi + + incdirs :: [SymbolicPath Pkg (Dir Include)] + incdirs = includeSearchDirs lbi (Just clbi) (includeDirs libBi) diff --git a/Cabal/src/Distribution/Simple/LocalBuildInfo.hs b/Cabal/src/Distribution/Simple/LocalBuildInfo.hs index 923e279f5ec..3573b2e2127 100644 --- a/Cabal/src/Distribution/Simple/LocalBuildInfo.hs +++ b/Cabal/src/Distribution/Simple/LocalBuildInfo.hs @@ -24,7 +24,6 @@ module Distribution.Simple.LocalBuildInfo -- * Convenience accessors , buildDir - , packageRoot , progPrefix , progSuffix , interpretSymbolicPathLBI diff --git a/Cabal/src/Distribution/Simple/PreProcess.hs b/Cabal/src/Distribution/Simple/PreProcess.hs index 431b3544e10..76055010729 100644 --- a/Cabal/src/Distribution/Simple/PreProcess.hs +++ b/Cabal/src/Distribution/Simple/PreProcess.hs @@ -568,10 +568,7 @@ ppHsc2hs bi lbi clbi = , osxFrameworkDirs , platformDefines lbi , -- Options from the current package: - ["-I" ++ u dir | dir <- PD.includeDirs bi] - , [ "-I" ++ u (buildDir lbi unsafeCoerceSymbolicPath relDir) - | relDir <- mapMaybe symbolicPathRelative_maybe $ PD.includeDirs bi - ] + ["-I" ++ u dir | dir <- includeSearchDirs lbi (Just clbi) (PD.includeDirs bi)] , -- hsc2hs uses the C ABI -- We assume that there are only C sources -- and C++ functions are exported via a C diff --git a/Cabal/src/Distribution/Simple/SrcDist.hs b/Cabal/src/Distribution/Simple/SrcDist.hs index 883b4994c78..0b38031434c 100644 --- a/Cabal/src/Distribution/Simple/SrcDist.hs +++ b/Cabal/src/Distribution/Simple/SrcDist.hs @@ -271,10 +271,13 @@ listPackageSources' verbosity rip mbWorkDir pkg_descr pps = fmap concat . withAllLib $ \l -> do - let lbi = libBuildInfo l - incls = getSymbolicPath <$> filter (`notElem` autogenIncludes lbi) (installIncludes lbi) - relincdirs = fmap getSymbolicPath $ sameDirectory : mapMaybe symbolicPathRelative_maybe (includeDirs lbi) - traverse (fmap (makeSymbolicPath . snd) . findIncludeFile verbosity cwd relincdirs) incls + let bi = libBuildInfo l + incls = filter (`notElem` autogenIncludes bi) (installIncludes bi) + -- Only search the source tree; don't include generated files. + relincdirs = sameDirectory : mapMaybe symbolicPathRelative_maybe (includeDirs bi) + traverse + (fmap relativeSymbolicPath . findFileCwd verbosity FindIncludeFile mbWorkDir relincdirs) + incls , -- Setup script, if it exists. maybe [] (\f -> [makeSymbolicPath f]) <$> findSetupFile cwd , -- SetupHooks script, if it exists. @@ -374,7 +377,13 @@ findMainExeFile verbosity cwd exeBi pps mainPath = do (hsSourceDirs exeBi) (dropExtensionsSymbolicPath mainPath) case ppFile of - Nothing -> findFileCwd verbosity cwd (hsSourceDirs exeBi) mainPath + Nothing -> + findFileCwd + verbosity + FindHaskellSourceFile + cwd + (hsSourceDirs exeBi) + mainPath Just pp -> return pp -- | Find a module definition file @@ -388,19 +397,12 @@ findModDefFile -> RelativePath Source File -> IO (SymbolicPath Pkg File) findModDefFile verbosity cwd flibBi _pps modDefPath = - findFileCwd verbosity cwd (sameDirectory : hsSourceDirs flibBi) modDefPath - --- | Given a list of include paths, try to find the include file named --- @f@. Return the name of the file and the full path, or exit with error if --- there's no such file. -findIncludeFile :: Verbosity -> FilePath -> [FilePath] -> String -> IO (String, FilePath) -findIncludeFile verbosity cwd fs f = go fs - where - go [] = dieWithException verbosity $ NoIncludeFileFound f fs - go (d : ds) = do - let path = d f - b <- doesFileExist (cwd path) - if b then return (f, path) else go ds + findFileCwd + verbosity + FindModuleDefFile + cwd + (sameDirectory : hsSourceDirs flibBi) + modDefPath -- | Remove the auto-generated modules (like 'Paths_*') from 'exposed-modules' -- and 'other-modules'. diff --git a/Cabal/src/Distribution/Simple/Test/ExeV10.hs b/Cabal/src/Distribution/Simple/Test/ExeV10.hs index 28cbc9062bc..2117e71652e 100644 --- a/Cabal/src/Distribution/Simple/Test/ExeV10.hs +++ b/Cabal/src/Distribution/Simple/Test/ExeV10.hs @@ -38,7 +38,7 @@ import Distribution.Verbosity import Distribution.Utils.Path import qualified Data.ByteString.Lazy as LBS -import Distribution.Simple.LocalBuildInfo (interpretSymbolicPathLBI, packageRoot) +import Distribution.Simple.LocalBuildInfo (interpretSymbolicPathLBI) import System.Directory ( createDirectoryIfMissing , doesFileExist @@ -89,7 +89,7 @@ runTest verbHandles pkg_descr lbi clbi hpcMarkupInfo flags suite = do map (testOption pkg_descr lbi suite) (testOptions flags) - tixFile = packageRoot (testCommonFlags flags) getSymbolicPath (tixFilePath distPref way testName') + tixFile = i $ tixFilePath distPref way testName' shellEnv <- getFullEnvironment diff --git a/Cabal/src/Distribution/Simple/UHC.hs b/Cabal/src/Distribution/Simple/UHC.hs index 612f9faed28..282127b34e3 100644 --- a/Cabal/src/Distribution/Simple/UHC.hs +++ b/Cabal/src/Distribution/Simple/UHC.hs @@ -35,6 +35,7 @@ import Distribution.Parsec import Distribution.Pretty import Distribution.Simple.BuildPaths import Distribution.Simple.Compiler +import Distribution.Simple.Errors (WhatToFind (..)) import Distribution.Simple.LocalBuildInfo import Distribution.Simple.PackageIndex import Distribution.Simple.Program @@ -245,7 +246,7 @@ buildExe verbosity _pkg_descr lbi exe clbi = do systemPkgDir <- getGlobalPackageDir verbosity (withPrograms lbi) userPkgDir <- getUserPackageDir let mbWorkDir = mbWorkDirLBI lbi - srcMainPath <- findFileCwd verbosity mbWorkDir (hsSourceDirs $ buildInfo exe) (modulePath exe) + srcMainPath <- findFileCwd verbosity FindHaskellSourceFile mbWorkDir (hsSourceDirs $ buildInfo exe) (modulePath exe) let runUhcProg = runDbProgramCwd verbosity (mbWorkDirLBI lbi) uhcProgram (withPrograms lbi) u = interpretSymbolicPathCWD uhcArgs = diff --git a/Cabal/src/Distribution/Simple/Utils.hs b/Cabal/src/Distribution/Simple/Utils.hs index 2b67dfa2888..11bc1e259ae 100644 --- a/Cabal/src/Distribution/Simple/Utils.hs +++ b/Cabal/src/Distribution/Simple/Utils.hs @@ -1358,6 +1358,8 @@ xargs maxSize rawSystemFun fixedArgs bigArgs = findFileCwd :: forall searchDir allowAbsolute . Verbosity + -> WhatToFind + -- ^ what kind of file are we looking for? (for error messages only) -> Maybe (SymbolicPath CWD (Dir Pkg)) -- ^ working directory -> [SymbolicPathX allowAbsolute Pkg (Dir searchDir)] @@ -1365,13 +1367,18 @@ findFileCwd -> RelativePath searchDir File -- ^ File Name -> IO (SymbolicPathX allowAbsolute Pkg File) -findFileCwd verbosity mbWorkDir searchPath fileName = +findFileCwd verbosity what mbWorkDir searchPath fileName = findFirstFile (interpretSymbolicPath mbWorkDir) [ path fileName - | path <- ordNub searchPath + | path <- dirs ] - >>= maybe (dieWithException verbosity $ FindFile $ getSymbolicPath fileName) return + >>= maybe notFound return + where + dirs = ordNub searchPath + notFound = + dieWithException verbosity $ + FindFile what (getSymbolicPath fileName) (map (interpretSymbolicPath mbWorkDir) dirs) -- | Find a file by looking in a search path. The file path must match exactly. findFileEx @@ -1382,7 +1389,8 @@ findFileEx -> RelativePath searchDir File -- ^ File Name -> IO (SymbolicPathX allowAbsolute Pkg File) -findFileEx v = findFileCwd v Nothing +-- TODO: deprecate then remove this function +findFileEx v = findFileCwd v FindOtherFile Nothing -- | Find a file by looking in a search path with one of a list of possible -- file extensions. The file base name should be given and it will be tried @@ -1435,6 +1443,7 @@ findAllFilesWithExtension -> [SymbolicPathX allowAbsolute Pkg (Dir searchDir)] -> RelativePath searchDir File -> IO [SymbolicPathX allowAbsolute Pkg File] +-- TODO: deprecate then remove this function findAllFilesWithExtension = findAllFilesCwdWithExtension Nothing @@ -1445,6 +1454,7 @@ findFileWithExtension' -> [SymbolicPathX allowAbsolute Pkg (Dir searchDir)] -> RelativePath searchDir File -> IO (Maybe (SymbolicPathX allowAbsolute Pkg (Dir searchDir), RelativePath searchDir File)) +-- TODO: deprecate then remove this function findFileWithExtension' = findFileCwdWithExtension' Nothing diff --git a/Cabal/src/Distribution/Types/LocalBuildInfo.hs b/Cabal/src/Distribution/Types/LocalBuildInfo.hs index 7e91a5ebeb2..2e75fac41f0 100644 --- a/Cabal/src/Distribution/Types/LocalBuildInfo.hs +++ b/Cabal/src/Distribution/Types/LocalBuildInfo.hs @@ -57,7 +57,6 @@ module Distribution.Types.LocalBuildInfo , buildDirPBD , setupFlagsBuildDir , distPrefLBI - , packageRoot , progPrefix , progSuffix @@ -130,8 +129,6 @@ import qualified Data.Map as Map import Distribution.Compat.Graph (Graph) import qualified Distribution.Compat.Graph as Graph -import qualified System.FilePath as FilePath (takeDirectory) - -- | Data cached after configuration step. See also -- 'Distribution.Simple.Setup.ConfigFlags'. data LocalBuildInfo = NewLocalBuildInfo @@ -307,18 +304,6 @@ setupFlagsBuildDir cfg = fromFlag (setupDistPref cfg) makeRelativePathEx "bu distPrefLBI :: LocalBuildInfo -> SymbolicPath Pkg (Dir Dist) distPrefLBI = fromFlag . setupDistPref . configCommonFlags . LBC.configFlags . LBC.packageBuildDescr . localBuildDescr --- | The (relative or absolute) path to the package root, based on --- --- - the working directory flag --- - the @.cabal@ path -packageRoot :: CommonSetupFlags -> FilePath -packageRoot cfg = - case flagToMaybe (setupCabalFilePath cfg) of - Just cabalPath -> FilePath.takeDirectory $ interpretSymbolicPath mbWorkDir cabalPath - Nothing -> maybe "." getSymbolicPath mbWorkDir - where - mbWorkDir = flagToMaybe $ setupWorkingDir cfg - progPrefix, progSuffix :: LocalBuildInfo -> PathTemplate -- NB: make sure to read from 'BuildOptions' rather than the 'ConfigFlags' -- stored in 'PackageBuildDescr', as the latter are the original command-line diff --git a/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/cabal.out b/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/cabal.out index 11a856798d0..869757b34ce 100644 --- a/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/cabal.out +++ b/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/cabal.out @@ -10,5 +10,5 @@ Error: [Cabal-7125] Failed to build MainIsBench-0.1-inplace-Bench. The exception was: -----BEGIN CABAL OUTPUT----- Error: [Cabal-2115] -MyDummy.hs doesn't exist +Could not find Haskell source file MyDummy.hs in any of the search dirs: /cabal.dist/work/./dist/build//ghc-/MainIsBench-0.1/b/Bench/build/Bench/Bench-tmp, /. CallStack (from HasCallStack): diff --git a/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/cabal.test.hs b/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/cabal.test.hs index 376e3f82dbc..bd7c9e7981b 100644 --- a/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/cabal.test.hs +++ b/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/cabal.test.hs @@ -2,5 +2,5 @@ import Test.Cabal.Prelude main = cabalTest $ do build <- fails $ cabal' "build" ["--enable-benchmarks"] - assertOutputContains "MyDummy.hs doesn't exist" build + assertOutputContains "Could not find Haskell source file MyDummy.hs" build return () diff --git a/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/setup.cabal.out b/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/setup.cabal.out index df8c9f91a00..93ba0204394 100644 --- a/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/setup.cabal.out +++ b/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/setup.cabal.out @@ -3,4 +3,4 @@ Configuring MainIsBench-0.1... # Setup sdist Building source dist for MainIsBench-0.1... Error: [Cabal-2115] -MyDummy.hs doesn't exist +Could not find Haskell source file MyDummy.hs in any of the search dirs: . diff --git a/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/setup.out b/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/setup.out index df8c9f91a00..93ba0204394 100644 --- a/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/setup.out +++ b/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/setup.out @@ -3,4 +3,4 @@ Configuring MainIsBench-0.1... # Setup sdist Building source dist for MainIsBench-0.1... Error: [Cabal-2115] -MyDummy.hs doesn't exist +Could not find Haskell source file MyDummy.hs in any of the search dirs: . diff --git a/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/setup.test.hs b/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/setup.test.hs index dde39071833..e1d14cebeb0 100644 --- a/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/setup.test.hs +++ b/cabal-testsuite/PackageTests/AutogenModules/MainIsBench/setup.test.hs @@ -4,8 +4,8 @@ import Test.Cabal.Prelude main = setupAndCabalTest $ do configureResult <- setup' "configure" [] - assertOutputDoesNotContain "MyDummy.hs doesn't exist" configureResult + assertOutputDoesNotContain "Could not find Haskell source file MyDummy.hs" configureResult sdistResult <- fails $ setup' "sdist" [] - assertOutputContains "MyDummy.hs doesn't exist" sdistResult + assertOutputContains "Could not find Haskell source file MyDummy.hs" sdistResult return () diff --git a/cabal-testsuite/PackageTests/AutogenModules/MainIsExe/setup.cabal.out b/cabal-testsuite/PackageTests/AutogenModules/MainIsExe/setup.cabal.out index ed81d6f0afb..71944585388 100644 --- a/cabal-testsuite/PackageTests/AutogenModules/MainIsExe/setup.cabal.out +++ b/cabal-testsuite/PackageTests/AutogenModules/MainIsExe/setup.cabal.out @@ -3,4 +3,4 @@ Configuring MainIsExe-0.1... # Setup sdist Building source dist for MainIsExe-0.1... Error: [Cabal-2115] -MyDummy.hs doesn't exist +Could not find Haskell source file MyDummy.hs in any of the search dirs: . diff --git a/cabal-testsuite/PackageTests/AutogenModules/MainIsExe/setup.out b/cabal-testsuite/PackageTests/AutogenModules/MainIsExe/setup.out index ed81d6f0afb..71944585388 100644 --- a/cabal-testsuite/PackageTests/AutogenModules/MainIsExe/setup.out +++ b/cabal-testsuite/PackageTests/AutogenModules/MainIsExe/setup.out @@ -3,4 +3,4 @@ Configuring MainIsExe-0.1... # Setup sdist Building source dist for MainIsExe-0.1... Error: [Cabal-2115] -MyDummy.hs doesn't exist +Could not find Haskell source file MyDummy.hs in any of the search dirs: . diff --git a/cabal-testsuite/PackageTests/AutogenModules/MainIsExe/setup.test.hs b/cabal-testsuite/PackageTests/AutogenModules/MainIsExe/setup.test.hs index dde39071833..e1d14cebeb0 100644 --- a/cabal-testsuite/PackageTests/AutogenModules/MainIsExe/setup.test.hs +++ b/cabal-testsuite/PackageTests/AutogenModules/MainIsExe/setup.test.hs @@ -4,8 +4,8 @@ import Test.Cabal.Prelude main = setupAndCabalTest $ do configureResult <- setup' "configure" [] - assertOutputDoesNotContain "MyDummy.hs doesn't exist" configureResult + assertOutputDoesNotContain "Could not find Haskell source file MyDummy.hs" configureResult sdistResult <- fails $ setup' "sdist" [] - assertOutputContains "MyDummy.hs doesn't exist" sdistResult + assertOutputContains "Could not find Haskell source file MyDummy.hs" sdistResult return () diff --git a/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/cabal.out b/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/cabal.out index b646aa1d8fb..f9be72728dc 100644 --- a/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/cabal.out +++ b/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/cabal.out @@ -10,5 +10,5 @@ Error: [Cabal-7125] Failed to build MainIsTest-0.1-inplace-Test. The exception was: -----BEGIN CABAL OUTPUT----- Error: [Cabal-2115] -MyDummy.hs doesn't exist +Could not find Haskell source file MyDummy.hs in any of the search dirs: /cabal.dist/work/./dist/build//ghc-/MainIsTest-0.1/t/Test/build/Test/Test-tmp, /cabal.dist/work/./dist/build//ghc-/MainIsTest-0.1/t/Test/build/Test/Test-gen, /. CallStack (from HasCallStack): diff --git a/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/cabal.test.hs b/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/cabal.test.hs index 5bf257f186d..4f4a18ba271 100644 --- a/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/cabal.test.hs +++ b/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/cabal.test.hs @@ -2,5 +2,5 @@ import Test.Cabal.Prelude main = cabalTest $ do build <- fails $ cabal' "build" ["--enable-tests"] - assertOutputContains "MyDummy.hs doesn't exist" build + assertOutputContains "Could not find Haskell source file MyDummy.hs" build return () diff --git a/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/setup.cabal.out b/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/setup.cabal.out index 82b28be2160..73ae2773441 100644 --- a/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/setup.cabal.out +++ b/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/setup.cabal.out @@ -3,4 +3,4 @@ Configuring MainIsTest-0.1... # Setup sdist Building source dist for MainIsTest-0.1... Error: [Cabal-2115] -MyDummy.hs doesn't exist +Could not find Haskell source file MyDummy.hs in any of the search dirs: . diff --git a/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/setup.out b/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/setup.out index 82b28be2160..73ae2773441 100644 --- a/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/setup.out +++ b/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/setup.out @@ -3,4 +3,4 @@ Configuring MainIsTest-0.1... # Setup sdist Building source dist for MainIsTest-0.1... Error: [Cabal-2115] -MyDummy.hs doesn't exist +Could not find Haskell source file MyDummy.hs in any of the search dirs: . diff --git a/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/setup.test.hs b/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/setup.test.hs index dde39071833..e1d14cebeb0 100644 --- a/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/setup.test.hs +++ b/cabal-testsuite/PackageTests/AutogenModules/MainIsTest/setup.test.hs @@ -4,8 +4,8 @@ import Test.Cabal.Prelude main = setupAndCabalTest $ do configureResult <- setup' "configure" [] - assertOutputDoesNotContain "MyDummy.hs doesn't exist" configureResult + assertOutputDoesNotContain "Could not find Haskell source file MyDummy.hs" configureResult sdistResult <- fails $ setup' "sdist" [] - assertOutputContains "MyDummy.hs doesn't exist" sdistResult + assertOutputContains "Could not find Haskell source file MyDummy.hs" sdistResult return () diff --git a/cabal-testsuite/PackageTests/Regression/T11186/cbits/clib.c b/cabal-testsuite/PackageTests/Regression/T11186/cbits/clib.c new file mode 100644 index 00000000000..749f94f93aa --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T11186/cbits/clib.c @@ -0,0 +1 @@ +int clib(void) { return 1; } diff --git a/cabal-testsuite/PackageTests/Regression/T11186/cbits/clib.h b/cabal-testsuite/PackageTests/Regression/T11186/cbits/clib.h new file mode 100644 index 00000000000..f0091719b0b --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T11186/cbits/clib.h @@ -0,0 +1,3 @@ +#ifndef CLIB_H +#define CLIB_H +#endif diff --git a/cabal-testsuite/PackageTests/Regression/T11186/install-includes-local.cabal b/cabal-testsuite/PackageTests/Regression/T11186/install-includes-local.cabal new file mode 100644 index 00000000000..4eba15d2856 --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T11186/install-includes-local.cabal @@ -0,0 +1,13 @@ +cabal-version: 2.4 +name: install-includes-local +version: 0.1.0.0 +build-type: Simple + +library + build-depends: base + hs-source-dirs: src + exposed-modules: Lib + include-dirs: cbits + c-sources: cbits/clib.c + install-includes: cbits/clib.h + default-language: Haskell2010 diff --git a/cabal-testsuite/PackageTests/Regression/T11186/setup.cabal.out b/cabal-testsuite/PackageTests/Regression/T11186/setup.cabal.out new file mode 100644 index 00000000000..79f129d2b57 --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T11186/setup.cabal.out @@ -0,0 +1,9 @@ +# Setup configure +Configuring install-includes-local-0.1.0.0... +# Setup build +Preprocessing library for install-includes-local-0.1.0.0... +Building library for install-includes-local-0.1.0.0... +# Setup copy +Installing library in +# Setup register +Registering library for install-includes-local-0.1.0.0... diff --git a/cabal-testsuite/PackageTests/Regression/T11186/setup.out b/cabal-testsuite/PackageTests/Regression/T11186/setup.out new file mode 100644 index 00000000000..79f129d2b57 --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T11186/setup.out @@ -0,0 +1,9 @@ +# Setup configure +Configuring install-includes-local-0.1.0.0... +# Setup build +Preprocessing library for install-includes-local-0.1.0.0... +Building library for install-includes-local-0.1.0.0... +# Setup copy +Installing library in +# Setup register +Registering library for install-includes-local-0.1.0.0... diff --git a/cabal-testsuite/PackageTests/Regression/T11186/setup.test.hs b/cabal-testsuite/PackageTests/Regression/T11186/setup.test.hs new file mode 100644 index 00000000000..ffe639c1831 --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T11186/setup.test.hs @@ -0,0 +1,13 @@ +import Test.Cabal.Prelude + +-- Regression test for #11186: install-includes should accept a relative +-- ("local") path and install the header to the include directory. +main = setupAndCabalTest $ withPackageDb $ do + setup_install [] + env <- getTestEnv + shouldExist $ + testLibInstallDir env + "install-includes-local-0.1.0.0" + "include" + "cbits" + "clib.h" diff --git a/cabal-testsuite/PackageTests/Regression/T11186/src/Lib.hs b/cabal-testsuite/PackageTests/Regression/T11186/src/Lib.hs new file mode 100644 index 00000000000..6d85a26fe10 --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T11186/src/Lib.hs @@ -0,0 +1 @@ +module Lib where diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.out b/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.out index 1d21331c5fa..10698d7e30f 100644 --- a/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.out +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.out @@ -15,11 +15,11 @@ Warning: Complex [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a Preprocessing executable 'Complex' for Complex-0.1.0.0... Building executable 'Complex' for Complex-0.1.0.0... # show-build-info Complex exe:Complex -{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"exe","name":"exe:Complex","unit-id":"Complex-0.1.0.0-inplace-Complex","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-i","-iapp","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen/cabal_macros.h","-pgmc","","-pgmcxx","","-this-unit-id","Complex-0.1.0.0-inplace-Complex","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-XHaskell2010","-threaded","-rtsopts","-with-rtsopts=-N -T","-Wredundant-constraints"],"modules":["Other","Paths_Complex"],"src-files":["Main.lhs"],"hs-src-dirs":["app"],"src-dir":"/","cabal-file":"Complex.cabal"}]} +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"exe","name":"exe:Complex","unit-id":"Complex-0.1.0.0-inplace-Complex","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-i","-iapp","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-I.","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/.","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen/cabal_macros.h","-pgmc","","-pgmcxx","","-this-unit-id","Complex-0.1.0.0-inplace-Complex","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-XHaskell2010","-threaded","-rtsopts","-with-rtsopts=-N -T","-Wredundant-constraints"],"modules":["Other","Paths_Complex"],"src-files":["Main.lhs"],"hs-src-dirs":["app"],"src-dir":"/","cabal-file":"Complex.cabal"}]} # cabal build Up to date # show-build-info Complex lib -{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"lib","name":"lib","unit-id":"Complex-0.1.0.0-inplace","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-i","-isrc","-idoesnt-exist","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen/cabal_macros.h","-pgmc","","-pgmcxx","","-this-unit-id","Complex-0.1.0.0-inplace","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-XHaskell2010","-Wall"],"modules":["A","B","C","D","Paths_Complex"],"src-files":[],"hs-src-dirs":["src","doesnt-exist"],"src-dir":"/","cabal-file":"Complex.cabal"}]} +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"lib","name":"lib","unit-id":"Complex-0.1.0.0-inplace","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-i","-isrc","-idoesnt-exist","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-I.","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/.","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen/cabal_macros.h","-pgmc","","-pgmcxx","","-this-unit-id","Complex-0.1.0.0-inplace","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-XHaskell2010","-Wall"],"modules":["A","B","C","D","Paths_Complex"],"src-files":[],"hs-src-dirs":["src","doesnt-exist"],"src-dir":"/","cabal-file":"Complex.cabal"}]} # cabal build Build profile: -w ghc- -O1 In order, the following will be built: @@ -34,7 +34,7 @@ Warning: Complex [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a Preprocessing benchmark 'complex-benchmarks' for Complex-0.1.0.0... Building benchmark 'complex-benchmarks' for Complex-0.1.0.0... # show-build-info Complex bench:complex-benchmarks -{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"bench","name":"bench:complex-benchmarks","unit-id":"Complex-0.1.0.0-inplace-complex-benchmarks","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-i","-ibenchmark","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen/cabal_macros.h","-pgmc","","-pgmcxx","","-this-unit-id","Complex-0.1.0.0-inplace-complex-benchmarks","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-package-id","","-XHaskell2010","-Wall","-rtsopts","-threaded","-with-rtsopts=-N"],"modules":["Paths_Complex"],"src-files":["Main.hs"],"hs-src-dirs":["benchmark"],"src-dir":"/","cabal-file":"Complex.cabal"}]} +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"bench","name":"bench:complex-benchmarks","unit-id":"Complex-0.1.0.0-inplace-complex-benchmarks","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-i","-ibenchmark","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-I.","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/.","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen/cabal_macros.h","-pgmc","","-pgmcxx","","-this-unit-id","Complex-0.1.0.0-inplace-complex-benchmarks","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-package-id","","-XHaskell2010","-Wall","-rtsopts","-threaded","-with-rtsopts=-N"],"modules":["Paths_Complex"],"src-files":["Main.hs"],"hs-src-dirs":["benchmark"],"src-dir":"/","cabal-file":"Complex.cabal"}]} # cabal build Build profile: -w ghc- -O1 In order, the following will be built: @@ -49,7 +49,7 @@ Warning: Complex [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a Preprocessing test suite 'func-test' for Complex-0.1.0.0... Building test suite 'func-test' for Complex-0.1.0.0... # show-build-info Complex test:func-test -{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"test","name":"test:func-test","unit-id":"Complex-0.1.0.0-inplace-func-test","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-i","-itest","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen/cabal_macros.h","-pgmc","","-pgmcxx","","-this-unit-id","Complex-0.1.0.0-inplace-func-test","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-package-id","","-XHaskell2010"],"modules":[],"src-files":["FuncMain.hs"],"hs-src-dirs":["test"],"src-dir":"/","cabal-file":"Complex.cabal"}]} +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"test","name":"test:func-test","unit-id":"Complex-0.1.0.0-inplace-func-test","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-i","-itest","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-I.","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/.","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen/cabal_macros.h","-pgmc","","-pgmcxx","","-this-unit-id","Complex-0.1.0.0-inplace-func-test","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-package-id","","-XHaskell2010"],"modules":[],"src-files":["FuncMain.hs"],"hs-src-dirs":["test"],"src-dir":"/","cabal-file":"Complex.cabal"}]} # cabal build Build profile: -w ghc- -O1 In order, the following will be built: @@ -64,4 +64,4 @@ Warning: Complex [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a Preprocessing test suite 'unit-test' for Complex-0.1.0.0... Building test suite 'unit-test' for Complex-0.1.0.0... # show-build-info Complex test:unit-test -{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"test","name":"test:unit-test","unit-id":"Complex-0.1.0.0-inplace-unit-test","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-i","-itest","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen/cabal_macros.h","-pgmc","","-pgmcxx","","-this-unit-id","Complex-0.1.0.0-inplace-unit-test","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-XHaskell2010"],"modules":[],"src-files":["UnitMain.hs"],"hs-src-dirs":["test"],"src-dir":"/","cabal-file":"Complex.cabal"}]} +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"test","name":"test:unit-test","unit-id":"Complex-0.1.0.0-inplace-unit-test","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-i","-itest","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-I.","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/.","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen/cabal_macros.h","-pgmc","","-pgmcxx","","-this-unit-id","Complex-0.1.0.0-inplace-unit-test","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-XHaskell2010"],"modules":[],"src-files":["UnitMain.hs"],"hs-src-dirs":["test"],"src-dir":"/","cabal-file":"Complex.cabal"}]} diff --git a/changelog.d/T11186.md b/changelog.d/T11186.md new file mode 100644 index 00000000000..a8ce3ecc746 --- /dev/null +++ b/changelog.d/T11186.md @@ -0,0 +1,28 @@ +--- +synopsis: "Consistent lookup of `includes` and `install-includes` header files" +packages: [Cabal] +prs: 12310 +issues: 11186 +--- + +Header files named in `includes` and `install-includes` are now looked up in the +same set of directories everywhere, via the new +`Distribution.Simple.BuildPaths.includeSearchDirs`. + +Previously, compilation, preprocessing with `hsc2hs`, the configure-time header +check and the installation of `install-includes` each searched a different +subset of these, so a header could be found by one and not by another. In +particular: + + - A header at the package root (without any `include-dirs`) would not be found + when compiling C sources. `GHC` and `hsc2hs` now receive `-I` and + `-I` on every invocation. + + - Generated headers placed in a component's build directory (e.g. `GHC`'s + FFI stub headers) were not on the include path when compiling. + Conversely, headers generated by `configure` into the package build + directory were not found when installing `install-includes` for a + sub-library or foreign library. + + - Absolute `include-dirs` entries were silently ignored when locating + `install-includes` files (#11186). diff --git a/changelog.d/packageRoot.md b/changelog.d/packageRoot.md new file mode 100644 index 00000000000..ca83c4e24ce --- /dev/null +++ b/changelog.d/packageRoot.md @@ -0,0 +1,10 @@ +--- +synopsis: "The package root is now determined solely by `--working-dir`" +packages: [Cabal] +prs: 12310 +--- + +The package root is now always derived from the `--working-dir` argument +(taken to be the current working directory if not specified), removing +`Distribution.Types.LocalBuildInfo.packageRoot` which derived the +package root from the directory component of `--cabal-file`.