NMAKE使用$时返回错误(壳)

问题描述 投票:4回答:2

我是新来执行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另一种选择执行命令,并捕获结果呢?

windows shell powershell build nmake
2个回答
4
投票

这是可能的,如果输出包含单个文本行改为另一个节目输出到使用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"描述的黑客用来读取临时文件的一行。


2
投票

否。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

© www.soinside.com 2019 - 2024. All rights reserved.