我试图编写一个半便携式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
答案 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。使用正确的权限,它将在所有三个中输出一个空行!