使用$(shell)时NMake返回错误

时间:2014-09-17 21:23:51

标签: windows shell powershell build nmake

我是nmake的新手,需要修改构建脚本。我想执行一个命令并将结果捕获到一个变量中,然后在整个脚本中使用该变量。但是,当尝试使用shell命令时,我收到以下错误消息:

makefile(4) : fatal error U1000: syntax error : ')' missing in macro invocation
Stop.

我整理了一行脚本来测试shell命令。

生成文件:

CMDRESULT = $(shell hostname)

all:
    echo $(CMDRESULT)

这是使用的nmake的版本:

>nmake /?

Microsoft (R) Program Maintenance Utility Version 11.00.60610.1
Copyright (C) Microsoft Corporation.  All rights reserved.

nmake是否支持shell命令? 在nmake中有另一个选项来执行命令并捕获结果吗?

2 个答案:

答案 0 :(得分:3)

如果输出包含单行文本,则可以使用临时文件读取输出到nmake变量的其他程序。也可以使用外部脚本来修改多个线路输出并使此解决方案正常工作。读取单行输出到nmake变量的示例:

!IF [hostname>hostname.tmp] == 0
H_NAME = \
!INCLUDE hostname.tmp
!IF [del hostname.tmp] == 0
!ENDIF
!ENDIF

[for execution]用于执行某些命令并比较程序的return code。它在预处理期间完成。在此处描述的hack之后"Can't figure out how to read file from nmake"用于从临时文件中读取单行。

答案 1 :(得分:1)

没有。 Microsoft NMAKE无法调用函数(如shell)。 $运算符仅扩展Nmake变量。

Shell也不是标准的make builtin。这是一个gnu make扩展。

Nmake只允许以两种方式调用(shell)命令,作为要作为构建的一部分执行的命令或在预处理期间执行。如果在预处理期间调用,则只能返回退出代码。

您可以执行以下操作:

!IF [..dos command..] != 0 
   command
!ENDIF

或者你可以这样做:

all: 
   if comparison command

用于调用命令并与字符串进行比较的DOS / Windows命令并不简单,而且是一个单独的问题。

<强>更新

我只是想展示一个如何实现这个目标的例子,因为我的原始答案有点简洁:

虽然这是一个老问题,但有一种方法可以做所要求的事情;它就像批处理文件中的所有内容一样令人费解!

必须使用make导入环境变量和预处理器可以调用命令,然后递归调用Makefile这一事实的组合机制。它假设Makefile被称为Makefile(没有扩展名,这是默认的)。

!IFNDEF MAKE
MAKE=NMAKE
!ENDIF
!IFNDEF SHELLVALUE
!   IF [echo off && FOR /F "usebackq" %i IN (`hostname`) DO  SET SHELLVALUE=%i && $(MAKE)  /$(MAKEFLAGS) /nologo /f $(MAKEDIR)\Makefile && exit /b  ] == 0
!     MESSAGE Make completed
!   ELSE
!     ERROR Error in nmake
!   ENDIF
!ELSE
# $(SHELLVALUE) now contains the string returned from the command USERNAME
!MESSAGE Shellvalue is $(SHELLVALUE)
#      Put the parts of the makefile that depend on SHELLVALUE here
!ENDIF
#
# To be a valid makefile it must have some rules to perform
all:
     @echo;$(SHELLVALUE)

是的,我知道它很可怕,但它确实演示了如何使用任何shell命令而不仅仅是hostname来完成该技术。