Subject: bug#77430: compilation-start should remember shell-file-name

From: Eli Zaretskii <[email-masked]>
Date: Tue, 01 Apr 2025 17:46:37 +0300

> From: Siyuan Chen <[email-masked]>
> Date: Tue, 1 Apr 2025 21:42:21 +0800
> 
> Recently, I've been setting up a Haskell compilation environment with Emacs on Windows. The project
> depends on diagrams-cairo, which depends on GTK+, so I have to build it via msys64 with MINGW. It works
> well in a non Emacs environment, so I'd like to adapt it to the Emacs environment.
> 
> Everything is OK, except when I press 'g' in the *compilation* buffer.
> 
> To simplify the problem, below only the minimal test is provided.
> 
> Reproduce steps:
> 
> 1. Create a file test.el in E:/tmp
> 
> 2. Open that file and paste the following code
> ```
> (defun my/compile ()
>   (interactive)
>   (let ((shell-file-name "C:/msys64/usr/bin/bash")
>         (compilation-environment
> "PATH=/mingw64/bin:/usr/local/bin:/usr/bin:/bin:/c/Windows/System32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl")
> 
>         )
>     (compile "ls")
>     ))
> ```

Why cannot your my/compile function do this:

  (setq-local shell-file-name "C:/msys64/usr/bin/bash")

instead of let-binding it?

> I have created a patch to workaround the issue. It remembers the original `shell-file-name' in
> `compilation-start', so we can use it when we `recompile'.

Thanks, but I don't think it's TRT for 'compile' to record the shell
by default.  In your case, you want to use the same shell each time,
but that is not always true.  Since you already have a tailored
compilation command, I suggest that the same command does this job
for you.