首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用$(shell)时NMake返回错误

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

Stack Overflow用户
提问于 2014-09-18 05:23:51
回答 2查看 2.2K关注 0票数 4

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

代码语言:javascript
复制
makefile(4) : fatal error U1000: syntax error : ')' missing in macro invocation
Stop.

我编写了一个一行脚本来测试shell命令。

Makefile:

代码语言:javascript
复制
CMDRESULT = $(shell hostname)

all:
    echo $(CMDRESULT)

下面是使用的nmake版本:

代码语言:javascript
复制
>nmake /?

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

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

EN

回答 2

Stack Overflow用户

发布于 2015-03-04 00:50:42

如果输出包含一行文本,则可以使用临时文件将另一个程序的输出读取到nmake变量中。还可以使用外部脚本修改多行输出并使此解决方案工作。将单行输出读取到nmake变量的示例:

代码语言:javascript
复制
!IF [hostname>hostname.tmp] == 0
H_NAME = \
!INCLUDE hostname.tmp
!IF [del hostname.tmp] == 0
!ENDIF
!ENDIF

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

票数 5
EN

Stack Overflow用户

发布于 2014-12-23 07:24:38

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

Shell也不是一个标准的make内置工具。这是一个gnu make扩展。

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

您可以执行以下操作:

代码语言:javascript
复制
!IF [..dos command..] != 0 
   command
!ENDIF

或者你可以这样做:

代码语言:javascript
复制
all: 
   if comparison command

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

更新:

我只是想展示一个如何真正实现这一点的例子,因为我最初的回答有点简洁:

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

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

代码语言:javascript
复制
!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)

是的,我知道这很可怕,但它确实演示了如何做到这一点,这可以用任何外壳命令来完成,而不仅仅是hostname

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25900574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档