在GNU Make的makefile中,我使用这个习惯来测试文件是否存在:
static:
ifeq ($(wildcard $(FileName)),)
# do something when the file doesn't exist
else
# do something different when it does
endif
但它在NMake(fatal error U1000: syntax error : ')' missing in macro invocation
)中不起作用。我怎样才能更换它?如果替换在两个构建系统中都有效,那将是完美的。
答案 0 :(得分:6)
只是为了添加Jack Kelly的建议,你可以在CMD.EXE shell中进行测试。 NMake还包括创建临时.cmd文件并执行它的能力。
这是(n)makefile语法的一个示例,我将其用于“检查语法”目标。它通过编译来检查多文件项目中单个C#源文件中的语法。
check-syntax :
<<flymake-build.cmd $(CS_SOURCE)
SETLOCAL ENABLEDELAYEDEXPANSION
set errorlevel=
for %%I in (%*) do if NOT x%%I == x$(FLYMAKE_ORIGINAL) (
set filesToBuild=!filesToBuild! %%I
)
$(_CSC) /t:module $(LIBSREF) $(FLYMAKE_CHECK) !filesToBuild!
ENDLOCAL && exit /b %errorlevel%
<<
“flymake-build.cmd”是创建的临时cmd文件的名称。双尖括号(<<
)表示在执行文件之前进入临时文件的内容的开头和结尾。
第一行后的文件是传递给.cmd文件的参数。在此示例中,参数是名为CS_SOURCE
的makefile变量的内容。在我的例子中,这只是项目中的文件名列表。 Makefile变量也将在临时文件的文本中展开。您可以看到我引用了编译器(_CSC
)和其他一些符号。
在.cmd代码中,你可以为循环,if语句,你喜欢的任何东西做。这是一个普通的.cmd文件。
如果您希望nmake响应.cmd文件中的命令生成的错误(例如,终止构建),那么您需要使用exit /b
方法来结束cmd。
我在某个黑暗的角落找到了相关的文档,所以我想我会在这里分享一般的说明。 (编辑:here's the link。)
答案 1 :(得分:5)
Nmake可以运行预处理程序指令:
http://msdn.microsoft.com/en-us/library/7y32zxwh.aspx
条件可能有所不同,但Exists()就是其中之一:
http://msdn.microsoft.com/en-us/library/8t2e8d78.aspx
!IF EXISTS(foo.txt)
最后,您使用命令行http://msdn.microsoft.com/en-us/library/wkxa7sac.aspx
!IF [cmd /C IF NOT EXIST "foo.txt" exit 1]
无论哪种方式,这都应该有效,使用其中之一!如上所示是完整的例子:
!IF !EXISTS(foo.txt)
!ERROR Unable to locate foo.
!ELSE
!MESSAGE I Found foo!
!ENDIF
答案 2 :(得分:2)
在shell级别而不是Makefile级别执行此操作。如果你可以依赖posix工具:
static:
@if test -f $(FileName); then \
echo something; \
else \
echo some other thing; \
fi
注意到所有行的连续标记。
如果您需要在CMD.EXE
中执行此操作,那么也许您可以使用IF EXIST $(FileName) COMMAND ELSE COMMAND
构造进行类似操作。
答案 3 :(得分:1)
csharptest.net 的答案几乎是正确的,但缺少关于命令和指令之间的缩进规则差异的微小细节:
static:
!if exists($(FileName))
@echo $(FileName) does exist!
#^^^ DO MIND THE INDENTATION HERE, a command shall fail otherwise!
#
!else
!error $(FileName) does not exist!
#^^^^^ !directives don't have to be indented, though.
#
!endif
奇怪的是,它可以是exist
(如官方文档中所述)或exists
,以达到相同的效果。