Windows dmake中的shell命令添加'/S';

Windows dmake中的shell命令添加'/S';,windows,bash,makefile,mingw,porting,Windows,Bash,Makefile,Mingw,Porting,我正在用MinGW系统编译Xindydmake总是会因错误而消失,我已经将它缩小到Makefile中的几行。尝试在此服务器上运行dmake: SHELL = /bin/sh some-target: target=`echo info-recursive | sed s/-recursive//`; 如果使用的是常规Windows CMD而不是MinGW shell,则必须将shell变量的位置更改为指向类似“C:/MinGW/msys/1.0/sh.exe”的位置。无论如何,上述操作

我正在用MinGW系统编译Xindy
dmake
总是会因错误而消失,我已经将它缩小到Makefile中的几行。尝试在此服务器上运行dmake:

SHELL = /bin/sh
some-target:
    target=`echo info-recursive | sed s/-recursive//`;
如果使用的是常规Windows CMD而不是MinGW shell,则必须将shell变量的位置更改为指向类似“C:/MinGW/msys/1.0/sh.exe”的位置。无论如何,上述操作失败:

CreateProcess failed (2).
dmake: Error executing 'bin/sh /S /c "target=`echo info-recursive | sed s/-recursive//`;"': No such file or directory
dmake: Error code -1, while making 'some-target'
Sed和sh已安装,工作正常。当我尝试将给定命令作为错误消息本身的输出运行时,我得到以下结果:

$ /bin/sh /S /c "target=`echo info-recursive | sed s/-recursive//`;"
/bin/sh: /S: No such file or directory
因此,dmake(或其他什么)似乎正在向shell参数添加'/S/c',bash认为这是一个文件名,然后在找不到它时失败

有没有人对此有经验或知道如何解决此问题?

对dmake源代码的简要检查表明问题在于
$(SHELL)
设置得太晚,在启动时仍然为空(,第37行):

您可以通过向dmake命令行调用添加
SHELL=“C:/MinGW/msys/1.0/sh.exe”
来解决此问题


(我已经很多年没有使用过dmake了,所以这里可能会出错,但是如果你能得到一个看起来像自动配置的makefile来使用dmake,我会印象深刻,IIRC有点不同的味道。可能更容易找到GNU make或类似的产品。)

通常,
bash
sh
选项必须以“-”开头,因此,
/bin/sh-S-c“…”
是可以预期的。我一点也不知道MinGW,所以我说不出谁有错。用“/”而不是“-”并不让我太惊讶,因为很多Windows程序都是这样做的(尽管我不同意)。是的,我只是没有任何实践经验来说“dmake打错了/bin/sh”,尽管这是我的第一个猜测。是的,同意以上所有的/c(尤其是)应该是-c,但我也在看上面的行。“正在执行'path/to/sh…'”?那肯定是你的速记?您是否可以编辑以包含准确的错误消息?另外,(对我来说)还不清楚您是否正在使用
SHELL=C:/MinGW/msys/1.0/sh.exe
SHELL=/bin/sh
。最后,cygwin是您的后备命令行工具还是其他相关工具?这听起来像是cygwin会做的事情。(说清楚一点,我对Mingw的经验比cygwin多得多)。祝你好运。编辑以修复。我使用的是MinGW路径,它更为单向。Cygwin在任何地方都没有参与。是的,这似乎解决了眼前的问题,之后出现了许多其他问题。我以为MinGW是和dmake一起来的,而不是make(我觉得很傻),所以我用MinGW的make再试了一次,它看起来做得更好。
11  .IF $(SHELL) == $(NULL)
...
15     SHELL *:= $(COMSPEC)
...
...
35  .IF $(SHELL) == $(COMSPEC)
36  .IF $(COMSPEC:lf) == cmd.exe
37     SHELLFLAGS       *:= $(SWITCHAR)S $(SWITCHAR)c