在NMake中测试文件是否存在

Ale*_*nov 4 nmake makefile

在GNU Make的makefile中,我使用这个习惯来测试文件是否存在:

static:
ifeq ($(wildcard $(FileName)),)
    # do something when the file doesn't exist
else
    # do something different when it does
endif
Run Code Online (Sandbox Code Playgroud)

但它在NMake(fatal error U1000: syntax error : ')' missing in macro invocation)中不起作用.我怎样才能更换它?如果替换在两个构建系统中都有效,那将是完美的.

Che*_*eso 7

只是为了添加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%
<<
Run Code Online (Sandbox Code Playgroud)

"flymake-build.cmd"是创建的临时cmd文件的名称.双尖括号(<<)表示在执行文件之前进入临时文件的内容的开头和结尾.

第一行文件名后面的内容是传递给.cmd文件的参数.在此示例中,参数是调用的makefile变量的内容CS_SOURCE.在我的例子中,这只是项目中的文件名列表.Makefile变量也将在临时文件的文本中展开.你可以看到我引用了编译器(_CSC)和其他一些符号.

在.cmd代码中,你可以为循环,if语句,你喜欢的任何东西做.这是一个普通的.cmd文件.

如果您希望nmake响应.cmd文件中的命令生成的错误(例如,终止构建),那么您需要使用该exit /b方法来结束cmd.

我在某个黑暗的角落里找到了这个文档,所以我想我会在这里分享一般说明.(编辑:这是链接.)


csh*_*net 6

Nmake可以运行预处理程序指令:

http://msdn.microsoft.com/en-us/library/7y32zxwh.aspx

条件可能会有所不同,但Exists()就是其中之一:

http://msdn.microsoft.com/en-us/library/8t2e8d78.aspx

!IF EXISTS(foo.txt)
Run Code Online (Sandbox Code Playgroud)

最后,您使用命令行,http://msdn.microsoft.com/en-us/library/wkxa7sac.aspx

!IF [cmd /C IF NOT EXIST "foo.txt" exit 1]
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,这应该工作,使用任何一个!如上面这里是完整的例子:

!IF !EXISTS(foo.txt)
!ERROR Unable to locate foo.
!ELSE
!MESSAGE I Found foo!
!ENDIF
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。它已经在DDK / WDK生成过程中使用了很长一段时间,其中build.exe是基于nmake.exe的构建过程的包装。 (2认同)

sun*_*oon 2

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
Run Code Online (Sandbox Code Playgroud)

奇怪的是,它可以是exist(如官方文档中给出的)或exists达到相同的效果。