@@ -13,8 +13,9 @@ import Distribution.Simple.Utils (createDirectoryIfMissingVerbose, rewriteFile)
1313import Distribution.PackageDescription
1414import Distribution.Text
1515
16+import System.Environment
1617import System.Exit
17−import System.FilePath ((</>), splitDirectories)
18+import System.FilePath ((</>), splitDirectories,isAbsolute)
1819import System.Directory
1920import qualified System.FilePath.Posix as Px
2021import System.Process
@@ -70,6 +71,12 @@ isRelease flags =
7071 Just False -> False
7172 Nothing -> False
7273
74+isFreestanding :: S.ConfigFlags -> Bool
75+isFreestanding flags =
76+ case lookup (FlagName "freestanding") (S.configConfigurationsFlags flags) of
77+ Just True -> True
78+ Just False -> False
79+ Nothing -> False
7380-- -----------------------------------------------------------------------------
7481-- Clean
7582
@@ -98,12 +105,12 @@ gitHash = do h <- Control.Exception.catch (readProcess "git" ["rev-parse", "--sh
98105-- Put the Git hash into a module for use in the program
99106-- For release builds, just put the empty string in the module
100107generateVersionModule verbosity dir release = do
101− hash <- gitHash
102− let versionModulePath = dir </> "Version_idris" Px.<.> "hs"
103− putStrLn $ "Generating " ++ versionModulePath ++
108+ hash <- gitHash
109+ let versionModulePath = dir </> "Version_idris" Px.<.> "hs"
110+ putStrLn $ "Generating " ++ versionModulePath ++
104111 if release then " for release" else (" for prerelease " ++ hash)
105− createDirectoryIfMissingVerbose verbosity True dir
106− rewriteFile versionModulePath (versionModuleContents hash)
112+ createDirectoryIfMissingVerbose verbosity True dir
113+ rewriteFile versionModulePath (versionModuleContents hash)
107114
108115 where versionModuleContents h = "module Version_idris where\n\n" ++
109116 "gitHash :: String\n" ++
@@ -111,9 +118,38 @@ generateVersionModule verbosity dir release = do
111118 then "gitHash = \"\"\n"
112119 else "gitHash = \"-git:" ++ h ++ "\"\n"
113120
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" ++
132+ if absolute
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)"
142+
143+
114144idrisConfigure _ flags _ local = do
115145 configureRTS
116146 generateVersionModule verbosity (autogenModulesDir local) (isRelease (configFlags local))
147+ when (isFreestanding $ configFlags local) (do
148+ targetDir <- lookupEnv "IDRIS_INSTALL_DIR"
149+ case targetDir of
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.")
117153 where
118154 verbosity = S.fromFlag $ S.configVerbosity flags
119155 version = pkgVersion . package $ localPkgDescr local
@@ -128,12 +164,16 @@ idrisPreSDist args flags = do
128164 let dir = S.fromFlag (S.sDistDirectory flags)
129165 let verb = S.fromFlag (S.sDistVerbosity flags)
130166 generateVersionModule verb ("src") True
167+ generateTargetModule verb "src" "./libs"
131168 preSDist simpleUserHooks args flags
132169
133170idrisPostSDist args flags desc lbi = do
134171 Control.Exception.catch (do let file = "src" </> "Version_idris" Px.<.> "hs"
135− putStrLn $ "Removing generated module " ++ file
136− removeFile file)
172+ let targetFile = "src" </> "Target_idris" Px.<.> "hs"
173+ putStrLn $ "Removing generated modules:\n "
174+ ++ file ++ "\n" ++ targetFile
175+ removeFile file
176+ removeFile targetFile)
137177 (\e -> let e' = (e :: SomeException) in return ())
138178 postSDist simpleUserHooks args flags desc lbi
139179
@@ -168,6 +208,7 @@ idrisBuild _ flags _ local = do
168208 gmpflag True = ["GMP=-DIDRIS_GMP"]
169209
170210
211+
171212-- -----------------------------------------------------------------------------
172213-- Copy/Install
173214