4

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

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

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

4

4 回答 4

9

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 都是完整的示例:

!IF !EXISTS(foo.txt)
!ERROR Unable to locate foo.
!ELSE
!MESSAGE I Found foo!
!ENDIF
于 2013-09-12T21:09:31.740 回答
8

只是为了增加 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 文件的参数。在此示例中,参数是名为 的 makefile 变量的内容CS_SOURCE。就我而言,这只是项目中的文件名列表。Makefile 变量也将在临时文件的文本中展开。您可以看到我指的是编译器 ( _CSC) 和其他一些符号。

在 .cmd 代码中,您可以执行 for 循环、if 语句以及您喜欢的任何操作。这是一个常规的 .cmd 文件。

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

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

于 2010-12-22T22:22:04.903 回答
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构造来执行类似操作。

于 2010-12-20T04:25:34.230 回答
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

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

于 2019-08-28T14:23:53.280 回答