mirror of
https://github.com/xmonad/xmonad.git
synced 2025-07-31 04:01:52 -07:00
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:
12
CHANGES.md
12
CHANGES.md
@@ -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
|
||||||
|
@@ -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)
|
||||||
|
@@ -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 ()
|
||||||
|
Reference in New Issue
Block a user