背景
我正在尝试编写一个半可移植的Makefile,将在没有MinGW或Cygwin的Windows上使用。因此,我基本上必须坚持Windows提供的标准命令。我知道UnxUtils,但我想尽可能避免使用它们。此外,如果可以的话,我想避免编写任何特殊的批处理脚本。该解决方案将由许多不熟悉Linux、Windows或命令行构建系统的人在许多不同的计算机上使用,因此不能依赖环境路径并且无法进行其他安装。该解决方案将替换一个现有系统,在某些越来越需要的高级制作系统功能方面存在严重缺陷,因此我正在尝试通过避免任何新软件安装来最小化更改的影响。
问题
我遇到的问题与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
变量,使其更像echo的Linux版本,或替换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
echo..bat
的文件,其中只包含一行echo.
,那么就不会从makefile中得到错误。这表明我对makefile出错原因的分析是正确的。不幸的是,这个解决方案实际上会导致一个无限循环,因为echo..bat
文件会无限递归调用自身,所以这不是一个可行的解决方案。 - mtalexan