@@ -13,8 +13,9 @@ import Distribution.Simple.Utils (createDirectoryIfMissingVerbose, rewriteFile)
13import Distribution.PackageDescription
13import Distribution.PackageDescription
14import Distribution.Text
14import Distribution.Text
16+import System.Environment
16import System.Exit
17import System.Exit
17−import System.FilePath ((</>), splitDirectories)
18+import System.FilePath ((</>), splitDirectories,isAbsolute)
18import System.Directory
19import System.Directory
19import qualified System.FilePath.Posix as Px
20import qualified System.FilePath.Posix as Px
20import System.Process
21import System.Process
@@ -70,6 +71,12 @@ isRelease flags =
70 Just False -> False
71 Just False -> False
71 Nothing -> False
72 Nothing -> False
74+isFreestanding :: S.ConfigFlags -> Bool
75+isFreestanding flags =
76+ case lookup (FlagName "freestanding") (S.configConfigurationsFlags flags) of
73-- -----------------------------------------------------------------------------
80-- -----------------------------------------------------------------------------
@@ -98,12 +105,12 @@ gitHash = do h <- Control.Exception.catch (readProcess "git" ["rev-parse", "--sh
98-- Put the Git hash into a module for use in the program
105-- Put the Git hash into a module for use in the program
99-- For release builds, just put the empty string in the module
106-- For release builds, just put the empty string in the module
100generateVersionModule verbosity dir release = do
107generateVersionModule verbosity dir release = do
101− hash <- gitHash
108+ hash <- gitHash
102− let versionModulePath = dir </> "Version_idris" Px.<.> "hs"
109+ let versionModulePath = dir </> "Version_idris" Px.<.> "hs"
103− putStrLn $ "Generating " ++ versionModulePath ++
110+ putStrLn $ "Generating " ++ versionModulePath ++
104 if release then " for release" else (" for prerelease " ++ hash)
111 if release then " for release" else (" for prerelease " ++ hash)
105− createDirectoryIfMissingVerbose verbosity True dir
112+ createDirectoryIfMissingVerbose verbosity True dir
106− rewriteFile versionModulePath (versionModuleContents hash)
113+ rewriteFile versionModulePath (versionModuleContents hash)
108 where versionModuleContents h = "module Version_idris where\n\n" ++
115 where versionModuleContents h = "module Version_idris where\n\n" ++
109 "gitHash :: String\n" ++
116 "gitHash :: String\n" ++
@@ -111,9 +118,38 @@ generateVersionModule verbosity dir release = do
111 then "gitHash = \"\"\n"
118 then "gitHash = \"\"\n"
112 else "gitHash = \"-git:" ++ h ++ "\"\n"
119 else "gitHash = \"-git:" ++ h ++ "\"\n"
121+-- Generate a module that contains the lib path for a freestanding Idris
122+generateTargetModule verbosity dir targetDir = do
123+ absPath <- return $ isAbsolute targetDir
124+ let targetModulePath = dir </> "Target_idris" Px.<.> "hs"
125+ putStrLn $ "Generating " ++ targetModulePath
126+ createDirectoryIfMissingVerbose verbosity True dir
127+ rewriteFile targetModulePath (versionModuleContents absPath targetDir)
128+ where versionModuleContents absolute td = "module Target_idris where\n\n" ++
129+ "import System.FilePath\n" ++
130+ "import System.Environment\n" ++
131+ "getDataDir :: IO String\n" ++
133+ then "getDataDir = return \"" ++ td ++ "\"\n"
134+ else "getDataDir = do \n" ++
135+ " expath <- getExecutablePath\n" ++
136+ " execDir <- return $ dropFileName expath\n" ++
137+ " return $ execDir ++ \"" ++ td ++ "\"\n"
138+ ++ "getDataFileName :: FilePath -> IO FilePath\n"
139+ ++ "getDataFileName name = do\n"
140+ ++ " dir <- getDataDir\n"
141+ ++ " return (dir ++ \"/\" ++ name)"
114idrisConfigure _ flags _ local = do
144idrisConfigure _ flags _ local = do
115 configureRTS
145 configureRTS
116 generateVersionModule verbosity (autogenModulesDir local) (isRelease (configFlags local))
146 generateVersionModule verbosity (autogenModulesDir local) (isRelease (configFlags local))
147+ when (isFreestanding $ configFlags local) (do
148+ targetDir <- lookupEnv "IDRIS_INSTALL_DIR"
150+ Just d -> generateTargetModule verbosity (autogenModulesDir local) d
151+ Nothing -> error $ "Trying to build freestanding without a target directory."
152+ ++ " Set it by defining IDRIS_INSTALL_DIR.")
118 verbosity = S.fromFlag $ S.configVerbosity flags
154 verbosity = S.fromFlag $ S.configVerbosity flags
119 version = pkgVersion . package $ localPkgDescr local
155 version = pkgVersion . package $ localPkgDescr local
@@ -128,12 +164,16 @@ idrisPreSDist args flags = do
128 let dir = S.fromFlag (S.sDistDirectory flags)
164 let dir = S.fromFlag (S.sDistDirectory flags)
129 let verb = S.fromFlag (S.sDistVerbosity flags)
165 let verb = S.fromFlag (S.sDistVerbosity flags)
130 generateVersionModule verb ("src") True
166 generateVersionModule verb ("src") True
167+ generateTargetModule verb "src" "./libs"
131 preSDist simpleUserHooks args flags
168 preSDist simpleUserHooks args flags
133idrisPostSDist args flags desc lbi = do
170idrisPostSDist args flags desc lbi = do
134 Control.Exception.catch (do let file = "src" </> "Version_idris" Px.<.> "hs"
171 Control.Exception.catch (do let file = "src" </> "Version_idris" Px.<.> "hs"
172+ let targetFile = "src" </> "Target_idris" Px.<.> "hs"
135− putStrLn $ "Removing generated module " ++ file
173+ putStrLn $ "Removing generated modules:\n "
174+ ++ file ++ "\n" ++ targetFile
136− removeFile file)
176+ removeFile targetFile)
137 (\e -> let e' = (e :: SomeException) in return ())
177 (\e -> let e' = (e :: SomeException) in return ())
138 postSDist simpleUserHooks args flags desc lbi
178 postSDist simpleUserHooks args flags desc lbi
@@ -168,6 +208,7 @@ idrisBuild _ flags _ local = do
168 gmpflag True = ["GMP=-DIDRIS_GMP"]
208 gmpflag True = ["GMP=-DIDRIS_GMP"]
171-- -----------------------------------------------------------------------------
212-- -----------------------------------------------------------------------------
172-- Copy/Install
213-- Copy/Install