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 ()