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

From: Siyuan Chen <[email-masked]>
Date: Tue, 1 Apr 2025 22:34:49 +0800

I found another way to workaround:

```
(defun my/compile ()
  (interactive)
  (compile "C:/msys64/usr/bin/bash --login -c ls"))
```

Keep ·shell-file-name‘ unchanged.

This avoids having to set the `compilation-environment' manually. Except
that the *compilation* buffer will output the message:

which: no bash in ((null))

but it doesn't seem to affect compilation.

Best regards,
Siyuan Chen

On Tue, Apr 1, 2025 at 9:58 PM Siyuan Chen <[email-masked]> wrote:

> Background:
>
> 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")
>     ))
> ```
> NOTE: You can think of "ls" as a compilation command such as "stack build"
> in Haskell.
>
> 3. Evaluate Last S-expression.
>
> 4. M-x my/compile
>
> The *compilation* buffer lists the files normally.
>
> 5. Press 'g' in the *compilation* buffer, i.e. `recompile'.
>
> The expected behavior: List the files again.
>
> The actual behavior: Compilation exited abnormally.
>
> The problem is that `recompile' does not realize that `shell-file-name'
> has been updated to bash. It still uses the default cmdproxy.
>
> 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.
>
> Best regards,
> Siyuan Chen
>