From f18bda7dc792780a0a7c48d6f200df2b3eef0992 Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Wed, 8 Feb 2017 19:48:42 -0700 Subject: [PATCH] Having an executable build script implies `force = True' in `recompile' This is slight change to the original implementation. This version forces a recompile if XMonad detects a custom build script. The previous version took into consideration the time stamps of the source files. For a custom build script, the source files may be located in another location, or there could be dependencies unknown to XMonad. Better to just always call the build script and let it work out if something needs to be built. --- CHANGES.md | 5 ----- src/XMonad/Core.hs | 18 ++++++++---------- 2 files changed, 8 insertions(+), 15 deletions(-) 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 [])