From b6d92b4e380716736e01d4cb60e35bbdf74f0dca Mon Sep 17 00:00:00 2001 From: Michael Sloan Date: Wed, 9 May 2018 18:21:06 -0700 Subject: [PATCH] Log information about xmonad compile + avoid unnecessary recompile Particularly with the addition of build scripts, it can be tricky to figure out what XMonad is doing when attempting recompilation. This makes it clearer by adding some logging. Due to this logging, I noticed that the lag of xmonad start was because it was always recompiling! When I startup my computer, I do not want it to delay rebuilding my window manager. This also fixes that issue such that it only recompiles XMonad if it is going to reinvoke due to getProgName not being the expected string. --- CHANGES.md | 12 ++++++++++ src/XMonad/Core.hs | 55 +++++++++++++++++++++++++++++++++++----------- src/XMonad/Main.hs | 14 ++++++++---- 3 files changed, 64 insertions(+), 17 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index e7d9c12..5a6b4b7 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -23,6 +23,18 @@ * Restored compatability with GHC version prior to 8.0.1 by removing the dependency on directory version 1.2.3. + * xmonad no longer always recompile on startup. Now it only does so if the + executable does not have the name that would be used for the compilation + output. The purpose of recompiling and executing the results in this case is + so that the `xmonad` executable in the package can be used with custom + configurations. + +### Enhancements + + * Whenever xmonad recompiles, it now explains how it is attempting to + recompile, by outputting logs to stderr. If you are using xmonad as a custom + X session, then this will end up in a `.xsession-errors` file. + ## 0.13 (February 10, 2017) ### Breaking Changes diff --git a/src/XMonad/Core.hs b/src/XMonad/Core.hs index 2d88f89..e8e3d4d 100644 --- a/src/XMonad/Core.hs +++ b/src/XMonad/Core.hs @@ -606,9 +606,36 @@ recompile force = io $ do useBuildscript <- do exists <- doesFileExist buildscript - if exists then isExecutable buildscript else return False + if exists + then do + isExe <- isExecutable buildscript + if isExe + then do + trace $ "XMonad will use build script at " ++ show buildscript ++ " to recompile." + return True + else do + trace $ unlines + [ "XMonad will not use build script, because " ++ show buildscript ++ " is not executable." + , "Suggested resolution to use it: chmod u+x " ++ show buildscript + ] + return False + else do + trace $ + "XMonad will use ghc to recompile, because " ++ show buildscript ++ " does not exist." + return False - if force || useBuildscript || any (binT <) (srcT : libTs) + shouldRecompile <- + if useBuildscript || force + then return True + else if any (binT <) (srcT : libTs) + then do + trace "XMonad doing recompile because some files have changed." + return True + else do + trace "XMonad skipping recompile because it is not forced (e.g. via --recompile), and neither xmonad.hs nor any *.hs / *.lhs / *.hsc files in lib/ have been changed." + return False + + if shouldRecompile then do -- temporarily disable SIGCHLD ignoring: uninstallSignalHandlers @@ -621,17 +648,19 @@ recompile force = io $ do installSignalHandlers -- now, if it fails, run xmessage to let the user know: - when (status /= ExitSuccess) $ do - ghcErr <- readFile err - let msg = unlines $ - ["Error detected while loading xmonad configuration file: " ++ src] - ++ lines (if null ghcErr then show status else ghcErr) - ++ ["","Please check the file for errors."] - -- nb, the ordering of printing, then forking, is crucial due to - -- lazy evaluation - hPutStrLn stderr msg - forkProcess $ executeFile "xmessage" True ["-default", "okay", replaceUnicode msg] Nothing - return () + if status == ExitSuccess + then trace "XMonad recompilation process exited with success!" + else do + ghcErr <- readFile err + let msg = unlines $ + ["Error detected while loading xmonad configuration file: " ++ src] + ++ lines (if null ghcErr then show status else ghcErr) + ++ ["","Please check the file for errors."] + -- nb, the ordering of printing, then forking, is crucial due to + -- lazy evaluation + hPutStrLn stderr msg + forkProcess $ executeFile "xmessage" True ["-default", "okay", replaceUnicode msg] Nothing + return () return (status == ExitSuccess) else return True where getModTime f = E.catch (Just <$> getModificationTime f) (\(SomeException _) -> return Nothing) diff --git a/src/XMonad/Main.hs b/src/XMonad/Main.hs index 495d8ff..685b670 100644 --- a/src/XMonad/Main.hs +++ b/src/XMonad/Main.hs @@ -113,12 +113,18 @@ usage = do -- buildLaunch :: IO () buildLaunch = do - recompile False - dir <- getXMonadDataDir - args <- getArgs whoami <- getProgName let compiledConfig = "xmonad-"++arch++"-"++os - unless (whoami == compiledConfig) $ + unless (whoami == compiledConfig) $ do + trace $ concat + [ "XMonad is recompiling and replacing itself another XMonad process because the current process is called " + , show whoami + , " but the compiled configuration should be called " + , show compiledConfig + ] + recompile False + dir <- getXMonadDataDir + args <- getArgs executeFile (dir compiledConfig) False args Nothing sendRestart :: IO ()