`echo。在Windows上制作失败

时间:2013-12-20 21:36:28

标签: windows build makefile

背景

我试图编写一个半便携式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会导致错误:

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

我已经看到一些解释说第三行不应该是空格而应该是@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

2 个答案:

答案 0 :(得分:4)

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

echo;

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

答案 1 :(得分:1)

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

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

@echo off
echo[

Single script to run in both Windows batch and Linux Bash?

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

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

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

相关问题