我是新来执行nmake和需要修改构建脚本。我想执行一个命令,并捕获结果将随后在整个脚本中使用的变量。但是当试图利用我收到以下错误消息的shell命令:
makefile(4) : fatal error U1000: syntax error : ')' missing in macro invocation
Stop.
我组建了一个一行脚本来测试shell命令。
Makefile文件:
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另一种选择执行命令,并捕获结果呢?
这是可能的,如果输出包含单个文本行改为另一个节目输出到使用temporay文件NMAKE变量。也可以使用外部脚本修改多个线路输出,使这个解决方案的工作。一个例子来读取单个线路输出到执行nmake变量:
!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"描述的黑客用来读取临时文件的一行。
否。Microsoft NMAKE不能调用函数(如外壳)。 $操作符只扩大NMAKE变量。
壳牌也没有一个标准的制定内置。这是一个GNU扩展化妆。
NMAKE只允许的(壳)的调用以两种方式命令,无论是作为一个命令作为构建的一部分或预加工期间被执行。如果预处理期间调用可以只返回退出代码。
你可以做到以下几点:
!IF [..dos command..] != 0
command
!ENDIF
或者你可以这样做:
all:
if comparison command
在DOS / Windows命令来调用命令,并比较字符串是不平凡的,是一个单独的问题。
更新:
我只是想展示如何真正实现这是我原来的答复是有点简洁的例子:
尽管这是一个老问题,有做的是问的方法;它只是迂回,像在批处理文件中的一切!
一个人使用的事实相结合的机制,使进口的环境变量和预处理程序可以调用命令,然后递归调用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
。