diff --git a/CHANGES.md b/CHANGES.md index 38da85e..0f1f926 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -48,11 +48,6 @@ instead of `ghc`. It takes one argument, the name of the executable binary it must produce. - Note: the build script is called whenever `ghc` would have been - called. That means the `xmonad.hs` file (or any files in `lib` - need to have newer time stamps than the generated executable in - order for the build script to be called. - This fixes #8. (One of two possible custom build solutions. See the next entry for another solution.) diff --git a/src/XMonad/Core.hs b/src/XMonad/Core.hs index e6ae733..138d735 100644 --- a/src/XMonad/Core.hs +++ b/src/XMonad/Core.hs @@ -570,19 +570,16 @@ recompile force = io $ do src = cfgdir "xmonad.hs" lib = cfgdir "lib" buildscript = cfgdir "build" + libTs <- mapM getModTime . Prelude.filter isSource =<< allFiles lib - useBuildscript <- do - exists <- doesFileExist buildscript - if exists - then executable <$> getPermissions buildscript - else return False srcT <- getModTime src binT <- getModTime bin - buildScriptT <- getModTime buildscript - let addBuildScriptT = if useBuildscript - then (buildScriptT :) - else id - if force || any (binT <) ( addBuildScriptT $ srcT : libTs) + + useBuildscript <- do + exists <- doesFileExist buildscript + if exists then isExecutable buildscript else return False + + if force || useBuildscript || any (binT <) (srcT : libTs) then do -- temporarily disable SIGCHLD ignoring: uninstallSignalHandlers @@ -610,6 +607,7 @@ recompile force = io $ do else return True where getModTime f = E.catch (Just <$> getModificationTime f) (\(SomeException _) -> return Nothing) isSource = flip elem [".hs",".lhs",".hsc"] . takeExtension + isExecutable f = E.catch (executable <$> getPermissions f) (\(SomeException _) -> return False) allFiles t = do let prep = map (t) . Prelude.filter (`notElem` [".",".."]) cs <- prep <$> E.catch (getDirectoryContents t) (\(SomeException _) -> return [])