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.
This commit is contained in:
Michael Sloan
2018-05-09 18:21:06 -07:00
parent ecf1a0ca0d
commit b6d92b4e38
3 changed files with 64 additions and 17 deletions

View File

@@ -23,6 +23,18 @@
* Restored compatability with GHC version prior to 8.0.1 by removing the * Restored compatability with GHC version prior to 8.0.1 by removing the
dependency on directory version 1.2.3. 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) ## 0.13 (February 10, 2017)
### Breaking Changes ### Breaking Changes

View File

@@ -606,9 +606,36 @@ recompile force = io $ do
useBuildscript <- do useBuildscript <- do
exists <- doesFileExist buildscript 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 then do
-- temporarily disable SIGCHLD ignoring: -- temporarily disable SIGCHLD ignoring:
uninstallSignalHandlers uninstallSignalHandlers
@@ -621,17 +648,19 @@ recompile force = io $ do
installSignalHandlers installSignalHandlers
-- now, if it fails, run xmessage to let the user know: -- now, if it fails, run xmessage to let the user know:
when (status /= ExitSuccess) $ do if status == ExitSuccess
ghcErr <- readFile err then trace "XMonad recompilation process exited with success!"
let msg = unlines $ else do
["Error detected while loading xmonad configuration file: " ++ src] ghcErr <- readFile err
++ lines (if null ghcErr then show status else ghcErr) let msg = unlines $
++ ["","Please check the file for errors."] ["Error detected while loading xmonad configuration file: " ++ src]
-- nb, the ordering of printing, then forking, is crucial due to ++ lines (if null ghcErr then show status else ghcErr)
-- lazy evaluation ++ ["","Please check the file for errors."]
hPutStrLn stderr msg -- nb, the ordering of printing, then forking, is crucial due to
forkProcess $ executeFile "xmessage" True ["-default", "okay", replaceUnicode msg] Nothing -- lazy evaluation
return () hPutStrLn stderr msg
forkProcess $ executeFile "xmessage" True ["-default", "okay", replaceUnicode msg] Nothing
return ()
return (status == ExitSuccess) return (status == ExitSuccess)
else return True else return True
where getModTime f = E.catch (Just <$> getModificationTime f) (\(SomeException _) -> return Nothing) where getModTime f = E.catch (Just <$> getModificationTime f) (\(SomeException _) -> return Nothing)

View File

@@ -113,12 +113,18 @@ usage = do
-- --
buildLaunch :: IO () buildLaunch :: IO ()
buildLaunch = do buildLaunch = do
recompile False
dir <- getXMonadDataDir
args <- getArgs
whoami <- getProgName whoami <- getProgName
let compiledConfig = "xmonad-"++arch++"-"++os 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 executeFile (dir </> compiledConfig) False args Nothing
sendRestart :: IO () sendRestart :: IO ()