繁体   English   中英

`echo.` 在 Windows 上的 Make 失败

[英]`echo.` Fails in Make on Windows

背景

我正在尝试编写一个半便携式 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
   

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

process_begin: CreateProcess(NULL, echo., ...) failed.

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

解释

我很确定问题出在 make 实现了对隐式 shell 命令的手动查找并正在检测echo. 作为命令而不是echo 产生的错误是它没有在环境路径中找到echo..exe或等效的命令或可执行文件,从而触发上述错误。

问题

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

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

我写了便携式Makefile和便携式脚本。 您可以在不制作其他脚本的情况下实现您的目标。 你可以在任何一个上下文中使用语法正确的东西。

echo;

这将在NMake和Bash中的Windows上的批处理文件中回显空白行,或者在unix或Gnu make上回显。 当然这就是你需要的一切吗?

如果您可以在工作目录中安排包含单个空白行的文本文件,则more blank.txt将以合理的OS独立方式显示空白行。

另外,我刚发现可能有所帮助。 我想你可以创建你的echo..bat批处理文件,但是给它这些内容:

@echo off
echo[

单个脚本可以在Windows批处理和Linux Bash中运行吗?

或者忘记脆弱的echo..bat想法并制作一个名为blank.bat的通用shell脚本/批处理文件:

:; echo ""
:<<"::CMDLITERAL"
@echo.
::CMDLITERAL

我在Windows中创建了这个文件,然后复制到Linux和OSX。 使用正确的权限,它将在所有三个中输出一个空行!

我也遇到了一个非常相似的错误。 我发现的问题出在 PATH 环境变量中。 我的 PATH 变量中有一个空条目。

PATH=<path1>;;<path2>

只需删除第二个分号,即可消除错误。 我认为根本原因在于“CreateProcess”和“SearchPath”API。 我认为它在搜索可执行文件时无法处理空条目。 虽然不是 100% 肯定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM