Eli Zaretskii wrote:

I don't know who benefits from it but so far nobody dared to
document it, either.

I'm not sure it should be documented: the Windows port just behaves
the same as the Unix original.  Here's the relevant fragment executed
by Make on Unix (job.c, around line 2100):

# ifdef __EMX__
        ...
# else
        shell = getenv ("SHELL");
# endif
        if (shell == 0)
          shell = default_shell;

and default_shell is "/bin/sh" on Unix, see line 74 in the same file.

The same is done around line 2355 in job.c:

 if (shell == 0)
   shell = default_shell;

Granted, the code in the Windows port that does the equivalent is more
complicated, but the net effect, as far as user is concerned, is the
same: sh.exe is used if it is available.
I think there is a difference in behavior here. On a UNIX system if '/bin/sh' were to be missing, Make would still attempt to exec '/bin/sh' and then would report the error. However, On Windows, Make has a fallback plan: It execs 'cmd.exe' instead. I'm sure some will object to this, but perhaps it would make sense for Make to issue an error on Windows if an 'sh.exe' cannot be found and therefore require a SHELL assignment in order to use 'cmd.exe'. This would keep Makefiles portable in the sense that it removes the environmental uncertainty caused by the addition or removal of a directory containing an 'sh.exe' from one's PATH. Makefiles that use 'cmd' syntax would therefore require a SHELL assignment just like Makefiles using 'perl' syntax require a SHELL
assignment to 'perl(.exe)'

Certainly it conflicts with the general rule that for makefile portability reasons the SHELL to be used shall not depend on individual environment settings.

The OP's report was not about SHELL in the environment, it was about
setting SHELL in the Makefile.  Certainly, you won't claim that Make
ignores _that_ on Unix, would you?

And if by ``individual environment settings'' you mean the value of
PATH, then I don't see how Make can do better, since, unlike on Posix
platforms, there's no "/bin" directory on your garden-variety Windows
box.  So it looks along PATH, which is a reasonable thing to do, IMO.
Absolutely agreed that searching along PATH makes sense on Windows here. If we wanted to be pedantic, Make could do this on UNIX as well. However, doing so would generally be considered a security issue since a rogue 'sh' could be inserted in a directory in one's PATH without them realizing it. If we really wanted to make the behaivors the same without compromising secutiry, we could look for the correct shell by first trying '/bin/sh' (%SystemDrive%\bin\sh.exe on Windows), and if that fails, then look for an 'sh'
('sh.exe' on Windows) in PATH.


_______________________________________________
Make-w32 mailing list
Make-w32@gnu.org
http://lists.gnu.org/mailman/listinfo/make-w32

_______________________________________________
Make-w32 mailing list
Make-w32@gnu.org
http://lists.gnu.org/mailman/listinfo/make-w32

Reply via email to