@@ -36,7 +36,7 @@ import Data.Version (showVersion)
36import qualified Data.Map as M
36import qualified Data.Map as M
37import qualified Data.ByteString.Char8 as B
37import qualified Data.ByteString.Char8 as B
39−import System.Directory (doesFileExist, getModificationTime, createDirectoryIfMissing)
39+import System.Directory (doesDirectoryExist, doesFileExist, getModificationTime, createDirectoryIfMissing)
40import System.FilePath ((</>), takeDirectory, addExtension, dropExtension)
40import System.FilePath ((</>), takeDirectory, addExtension, dropExtension)
41import System.IO.Error (tryIOError)
41import System.IO.Error (tryIOError)
42import System.IO.UTF8
42import System.IO.UTF8
@@ -116,9 +116,11 @@ buildMakeActions outputDir filePathMap usePrefix =
116 writeTextFile externsFile exts
116 writeTextFile externsFile exts
118 let supportDir = outputDir </> "PureScript"
118 let supportDir = outputDir </> "PureScript"
119+ supportFilesExist <- dirExists supportDir
120+ when (not supportFilesExist) $ do
119− writeTextFile (supportDir </> "PureScript.hh") $ B.unpack $(embedFile "pcc/include/purescript.hh")
121+ writeTextFile (supportDir </> "PureScript.hh") $ B.unpack $(embedFile "pcc/include/purescript.hh")
120− writeTextFile (supportDir </> "PureScript.cc") $ B.unpack $(embedFile "pcc/include/purescript.cc")
122+ writeTextFile (supportDir </> "PureScript.cc") $ B.unpack $(embedFile "pcc/include/purescript.cc")
121− writeTextFile (supportDir </> "purescript_memory.hh") $ B.unpack $(embedFile "pcc/include/purescript_memory.hh")
123+ writeTextFile (supportDir </> "purescript_memory.hh") $ B.unpack $(embedFile "pcc/include/purescript_memory.hh")
123 let inputPath = dropExtension $ getInputFile mn
125 let inputPath = dropExtension $ getInputFile mn
124 hfile = addExtension inputPath "hh"
126 hfile = addExtension inputPath "hh"
@@ -137,6 +139,10 @@ buildMakeActions outputDir filePathMap usePrefix =
137 requiresForeign :: CF.Module a -> Bool
139 requiresForeign :: CF.Module a -> Bool
138 requiresForeign = not . null . CF.moduleForeign
140 requiresForeign = not . null . CF.moduleForeign
142+ dirExists :: FilePath -> Make Bool
143+ dirExists path = makeIO (const (ErrorMessage [] $ CannotReadFile path)) $ do
144+ doesDirectoryExist path
140 textFileExists :: FilePath -> Make Bool
146 textFileExists :: FilePath -> Make Bool
141 textFileExists path = makeIO (const (ErrorMessage [] $ CannotReadFile path)) $ do
147 textFileExists path = makeIO (const (ErrorMessage [] $ CannotReadFile path)) $ do
142 doesFileExist path
148 doesFileExist path
@@ -150,12 +156,12 @@ buildMakeActions outputDir filePathMap usePrefix =
150 readTextFile path = makeIO (const (ErrorMessage [] $ CannotReadFile path)) $ readUTF8File path
156 readTextFile path = makeIO (const (ErrorMessage [] $ CannotReadFile path)) $ readUTF8File path
152 writeTextFile :: FilePath -> String -> Make ()
158 writeTextFile :: FilePath -> String -> Make ()
153− writeTextFile path text = makeIO (const (ErrorMessage [] $ CannotWriteFile path)) $ do
159+ writeTextFile path text = makeIO (const (ErrorMessage [] $ CannotWriteFile path)) $ do
154− fileExists <- doesFileExist path
160+ mkdirp path
155− when (not fileExists) $ do
161+ writeFile path text
163+ mkdirp :: FilePath -> IO ()
156− createDirectoryIfMissing True (takeDirectory path)
164+ mkdirp = createDirectoryIfMissing True . takeDirectory
157− _ <- tryIOError $ writeFile path text
160 -- | Render a progress message
166 -- | Render a progress message
161 renderProgressMessage :: P.ProgressMessage -> String
167 renderProgressMessage :: P.ProgressMessage -> String