CLI 上的 NMake 宏定义,其中包含一个空格

Posted

技术标签:

【中文标题】CLI 上的 NMake 宏定义,其中包含一个空格【英文标题】:NMake macro definition on CLI which contains a space 【发布时间】:2015-08-25 13:00:03 【问题描述】:

我有一个需要设置输出路径的 Makefile。

我现在用

nmake /nologo /f Makefile outdir=%OUTDIR% LANGID=%1 ISO=%2

但如果输出路径包含空格(%OUTPUT% 不包含引号),则此方法不起作用。

另外在nmake的命令行参数解析器中似乎有一个bug,所以

nmake /nologo /f Makefile outdir="%OUTDIR%" LANGID=%1 ISO=%2

nmake /nologo /f Makefile "outdir=%OUTDIR%" LANGID=%1 ISO=%2

也不行。在这些情况下,outdir 将被设置为 [outdir]" LANGID=[VALUE1] ISO=[VALUE2](我在 cli 中在括号中提供的值)并且根本无法识别 LANGIDISO

现在我正在使用(丑陋的)解决方法(注意只有双引号)

nmake /nologo /f Makefile LANGID=%1 ISO=%2 outdir="%OUTDIR%

但是,这仅在只有一个命令行参数有空格时才有效。

如何正确地将路径传递给 nmake,以便它们在内部有空间的情况下也能正常工作?

【问题讨论】:

【参考方案1】:

在调用 NMAKE 时,我没有发现空格有任何特殊问题。但是,使用以反斜杠结尾的目录路径调用 NMAKE 存在问题,因为它充当转义字符!

我已经尝试过这个示例 Makefile:

!MESSAGE Makeflags=$(MAKEFLAGS)
!MESSAGE OUTDIR=$(OUTDIR) LANGID=$(LANGID) ISO=$(ISO)
OD=$(OUTDIR)
LI=$(LANGID)
IS=$(ISO)

# To be a valid makefile it must have some rules to perform
all:
    @echo;OUTDIR=$(OUTDIR) LANGID=$(LANGID) ISO=$(ISO)
    @echo;OUTDIR=$(OD)     LANGID=$(LI)     ISO=$(IS)

当从命令提示符运行时,我们得到:

C:\Users\Brian>nmake /NOLOGO  "OUTDIR=C:\Program Files\\" "LANGID=C Sharp" "ISO=ISO 8601"
Makeflags=L
OUTDIR=C:\Program Files\ LANGID=C Sharp ISO=ISO 8601
OUTDIR=C:\Program Files\ LANGID=C Sharp ISO=ISO 8601
OUTDIR=C:\Program Files\ LANGID=C Sharp ISO=ISO 8601

您可以看到空格已正确转换为宏值。但是,您也可以看到路径名中尾随反斜杠的问题。如果我没有正确转义,则会出现错误:

C:\Users\Brian>nmake /NOLOGO  "OUTDIR=C:\Program Files\" "LANGID=C Sharp" "ISO=I
SO 8601"
NMAKE : fatal error U1001: Syntaxfehler: ungueltiges Zeichen ' ' in Makro
Stop.

因此,任何调用 NMAKE 的批处理文件都必须仔细编写以防止出现这种特定情况。

为了完整性;虽然它们没有解决您的问题,但它们可能是有用的参考:

所以问题:How to escape white space in nmake

特殊字符和转义字符在 NMAKE 中的作用在 manual 中有介绍。

【讨论】:

以上是关于CLI 上的 NMake 宏定义,其中包含一个空格的主要内容,如果未能解决你的问题,请参考以下文章

nmake 警告 U4006:特殊宏未定义:'$@"'

nmake 根据目标修改宏

nmake 根据目标修改宏

将宏传递给 nmake

nmake.exe:有没有办法从宏中指定的一组文件中排除一个文件?

nmake 中文件夹名和文件名的串联