`echo.` 在 Windows 上的 Make 中失败

mta*_*xan 3 windows makefile build

背景

我正在尝试编写一个半便携式 Makefile,它将在没有 MinGW 或 Cygwin 的 Windows 上使用。因此,我几乎必须坚持使用 Windows 提供的标准命令。我知道 UnxUtils,但我想尽可能避免使用它们。此外,如果可以的话,我想避免编写任何特殊的批处理脚本。该解决方案将由对 Linux、Windows 或命令行构建系统不是特别熟悉的人在许多不同的计算机上使用,因此不能依赖环境路径并且不可能进行额外的安装。该解决方案将取代现有系统,该系统严重缺乏一些接近必需的更高级的 make 系统功能,所以我

问题

我遇到的问题与 make 如何解释用作规则一部分的 shell 命令有关。我只是想要echo一个空行,它也可以作为一些不同规则的一部分重定向到一个文件。在 Windows 中,回显空行的唯一方法是.在 echo 命令后立即添加一个,不带任何空格:echo.。当作为规则中的一行提供时,它会导致问题。

some_rule :
   @echo.
   @echo Text going to file > someFile.txt
   @echo. >> someFile.txt
   @echo Other text going to a file >> someFile.txt
   
Run Code Online (Sandbox Code Playgroud)

在提供的示例中,第一行@echo.和第三行@echo. >> someFile.txt导致错误:

process_begin: CreateProcess(NULL, echo., ...) failed.
Run Code Online (Sandbox Code Playgroud)

我已经看到一些解释说第三行不应该有空格,而应该是@echo.>> someFile.txt,但是当我测试它时没有区别。

解释

我很确定这个问题来自这样一个事实,即 make 实现了对隐式 shell 命令的手动查找,并且被检测echo.为命令而不是echo. 由此产生的错误是它echo..exe在环境路径中没有找到或等效于命令或可执行文件,从而触发了上面指出的错误。

如何将命令作为 makefile 规则的一部分来输出空行,以便在上述情况下工作?我的实际 makefile 看起来更像以下内容,我希望替换ECHO变量以使其更像 Linux 版本的 echo,或者替换NEWLINE变量以便它实际上可以以允许它的方式输出空行打印到终端或重定向到文件。

NEWLINE=echo.
ECHO=echo
SILENT=@

some_rule :
   $(SILENT)$(NEWLINE)
   $(SILENT)$(ECHO) Text going to file > someFile.txt
   $(SILENT)$(NEWLINE) >> someFile.txt
   $(SILENT)$(ECHO) Other text going to a file >> someFile.txt
Run Code Online (Sandbox Code Playgroud)

Bri*_*汤莱恩 5

我编写了可移植的 Makefile 和可移植的脚本。您无需编写另一个脚本即可实现您的愿望。您可以只使用在任一上下文中语法正确的东西。

echo;
Run Code Online (Sandbox Code Playgroud)

这将在 Windows 上的 NMake 和 Bash 或 unix 或 Gnu make 上的 sh 的两个批处理文件中回显一个空行。当然,这就是你所需要的全部吗?