at 23.05-pre 99 lines 4.6 kB view raw
1diff --git a/Cabal/Distribution/Simple/Build/PathsModule.hs b/Cabal/Distribution/Simple/Build/PathsModule.hs 2index 5e660e8d6..1ae603c94 100644 3--- a/libraries/Cabal/Cabal/Distribution/Simple/Build/PathsModule.hs 4+++ b/libraries/Cabal/Cabal/Distribution/Simple/Build/PathsModule.hs 5@@ -37,6 +37,9 @@ import System.FilePath ( pathSeparator ) 6 -- * Building Paths_<pkg>.hs 7 -- ------------------------------------------------------------ 8 9+splitPath :: FilePath -> [ String ] 10+splitPath = unintersperse pathSeparator 11+ 12 generatePathsModule :: PackageDescription -> LocalBuildInfo -> ComponentLocalBuildInfo -> String 13 generatePathsModule pkg_descr lbi clbi = 14 let pragmas = 15@@ -78,12 +81,44 @@ generatePathsModule pkg_descr lbi clbi = 16 "import System.Environment (getExecutablePath)\n" 17 | otherwise = "" 18 19+ dirs = [ (flat_libdir, "LibDir") 20+ , (flat_dynlibdir, "DynLibDir") 21+ , (flat_datadir, "DataDir") 22+ , (flat_libexecdir, "LibexecDir") 23+ , (flat_sysconfdir, "SysconfDir") ]; 24+ 25+ shouldEmitPath p 26+ | (splitPath flat_prefix) `isPrefixOf` (splitPath flat_bindir) = True 27+ | (splitPath flat_prefix) `isPrefixOf` (splitPath p) = False 28+ | otherwise = True 29+ 30+ shouldEmitDataDir = shouldEmitPath flat_datadir 31+ 32+ nixEmitPathFn (path, name) = let 33+ varName = toLower <$> name 34+ fnName = "get"++name 35+ in if shouldEmitPath path then 36+ varName ++ " :: FilePath\n"++ 37+ varName ++ " = " ++ show path ++ 38+ "\n" ++ fnName ++ " :: IO FilePath" ++ 39+ "\n" ++ fnName ++ " = " ++ mkGetEnvOr varName ("return " ++ varName)++"\n" 40+ else "" 41+ 42+ absBody = intercalate "\n" $ nixEmitPathFn <$> dirs 43+ 44+ warnPragma = case filter (not . shouldEmitPath . fst) dirs of 45+ [] -> "" 46+ omittedDirs -> "{-# WARNING \"The functions: "++omittedFns++" Have been omitted by the Nix build system.\" #-}" 47+ where omittedFns = intercalate ", " $ map snd omittedDirs 48+ 49+ importList = intercalate ", " $ ("get" ++) . snd <$> filter (shouldEmitPath . fst) dirs 50+ 51 header = 52 pragmas++ 53- "module " ++ prettyShow paths_modulename ++ " (\n"++ 54- " version,\n"++ 55- " getBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir,\n"++ 56- " getDataFileName, getSysconfDir\n"++ 57+ "module " ++ prettyShow paths_modulename ++ " " ++ warnPragma ++ " (\n"++ 58+ " version, getBinDir,\n"++ 59+ (if shouldEmitDataDir then " getDataFileName, \n" else "\n")++ 60+ " " ++ importList ++"\n"++ 61 " ) where\n"++ 62 "\n"++ 63 foreign_imports++ 64@@ -136,26 +171,18 @@ generatePathsModule pkg_descr lbi clbi = 65 "\n"++ 66 filename_stuff 67 | absolute = 68- "\nbindir, libdir, dynlibdir, datadir, libexecdir, sysconfdir :: FilePath\n"++ 69+ "\nbindir :: FilePath\n"++ 70 "\nbindir = " ++ show flat_bindir ++ 71- "\nlibdir = " ++ show flat_libdir ++ 72- "\ndynlibdir = " ++ show flat_dynlibdir ++ 73- "\ndatadir = " ++ show flat_datadir ++ 74- "\nlibexecdir = " ++ show flat_libexecdir ++ 75- "\nsysconfdir = " ++ show flat_sysconfdir ++ 76 "\n"++ 77- "\ngetBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir, getSysconfDir :: IO FilePath\n"++ 78+ "\ngetBinDir :: IO FilePath\n"++ 79 "getBinDir = "++mkGetEnvOr "bindir" "return bindir"++"\n"++ 80- "getLibDir = "++mkGetEnvOr "libdir" "return libdir"++"\n"++ 81- "getDynLibDir = "++mkGetEnvOr "dynlibdir" "return dynlibdir"++"\n"++ 82- "getDataDir = "++mkGetEnvOr "datadir" "return datadir"++"\n"++ 83- "getLibexecDir = "++mkGetEnvOr "libexecdir" "return libexecdir"++"\n"++ 84- "getSysconfDir = "++mkGetEnvOr "sysconfdir" "return sysconfdir"++"\n"++ 85- "\n"++ 86- "getDataFileName :: FilePath -> IO FilePath\n"++ 87- "getDataFileName name = do\n"++ 88- " dir <- getDataDir\n"++ 89- " return (dir ++ "++path_sep++" ++ name)\n" 90+ absBody ++ "\n"++ 91+ (if shouldEmitDataDir then 92+ "getDataFileName :: FilePath -> IO FilePath\n"++ 93+ "getDataFileName name = do\n"++ 94+ " dir <- getDataDir\n"++ 95+ " return (dir ++ "++path_sep++" ++ name)\n" 96+ else "\n") 97 | otherwise = 98 "\nprefix, bindirrel :: FilePath" ++ 99 "\nprefix = " ++ show flat_prefix ++