如何在 NMake 中组合宏?

Posted

技术标签:

【中文标题】如何在 NMake 中组合宏?【英文标题】:How to combine macros in NMake? 【发布时间】:2016-03-07 20:50:52 【问题描述】:

我想在 NMake 中组合宏?我是这样开始的。

nmake -f C:\Users\Administrator\Desktop\build.makefile TEST

但是输出是

fatal error U1001: syntax error : illegal character '$' in macro Stop.

而不是-03

FLAGS_PLATFORM     = %PLATFORM%
FLAGS_BUILD_TYPE   = %BUILD_TYPE%

FLAGS_X86_RELEASE  = -O3
FLAGS_X86_DEBUG    = -O3

FLAGS_X64_RELEASE  = -O3
FLAGS_X64_DEBUG    = -O3

FLAGS_COMPILER_X86 = compiler.exe
FLAGS_COMPILER_X64 = compiler.exe

FLAGS  = $(FLAGS_$(FLAGS_PLATFORM)_$(FLAGS_BUILD_TYPE))

TEST:
     echo "$(FLAGS)"

【问题讨论】:

您的 FLAGS 行中有不平衡的括号。您也许可以使用类似:FLAGS = $(FLAGS_$(FLAGS_PLATFORM)_$(FLAGS_BUILD_TYPE)),但这可能是不允许的。 (make 的某些版本可能会接受它,例如 GNU make;许多其他版本不会。我不知道 NMake 落在哪里。) @JonathanLeffler 我用 GNU make 尝试过,但我得到的只是“”。 【参考方案1】:

使用 GNU make(3.81,在 Mac OS X 10.10.5 Yosemite 上运行),这个 makefile (example.mk) 可以工作:

FLAGS_PLATFORM     = X86
FLAGS_BUILD_TYPE   = DEBUG

FLAGS_X86_RELEASE  = -m32 -O3
FLAGS_X86_DEBUG    = -m32 -g

FLAGS_X64_RELEASE  = -m64 -O3
FLAGS_X64_DEBUG    = -m64 -g

FLAGS = $(FLAGS_$(FLAGS_PLATFORM)_$(FLAGS_BUILD_TYPE))

test:
        @echo "$(FLAGS)"

例如:

$ make -f example.mk
-m32 -g
$ make -f example.mk FLAGS_PLATFORM=X64 FLAGS_BUILD_TYPE=RELEASE
-m64 -O3
$ make -f example.mk FLAGS_PLATFORM=X64 
-m64 -g
$ make -f example.mk FLAGS_BUILD_TYPE=RELEASE
-m32 -O3
$ make -f example.mk FLAGS_PLATFORM=X86 FLAGS_BUILD_TYPE=DEBUG
-m32 -g
$

您可以将makefile 中内置的'n'match 默认值与命令行覆盖混合使用。如果您选择使用环境变量,在 Unix 上,您将在 makefile 中使用 $(PLATFORM) 而不是 %PLATFORM%(和 $(BUILD_TYPE) 而不是 %BUILD_TYPE%); make 导入所有环境变量(SHELL 除外)并将它们作为宏提供。

请注意,makefile 在 FLAGS_PLATFORM 和 FLAGS_BUILD_TYPE 宏之后没有尾随 cmets;这些破坏了构建变量名的努力(除非您使用命令行覆盖)。

这是否适用于 Windows 上的 GNU make,或适用于 NMake(在 Windows 上)超出了我的理解。

【讨论】:

以上是关于如何在 NMake 中组合宏?的主要内容,如果未能解决你的问题,请参考以下文章

nmake:当前工作目录是不是有内置宏?

nmake 根据目标修改宏

nmake 根据目标修改宏

nmake:如何为包含重新定义宏?

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

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