我有一个项目,我想在一个带有Microsoft Visual Studio和GCC的Windows系统上编译。我有一个环境变量用于选择要使用的编译器(例如COMPILER = VS或COMPILER = GCC)。第一个问题是GCC的“include选项”是-I,而Visual Studio的include选项是/ I.
因此,我有一个变量,指定所需的包含选项标志:
ifeq ($(COMPILER), VS)
INCLUDE_DELIMITER = /I
else
INCLUDE_DELIMITER = -I
endif
现在我建立一个需要包含的路径列表:
COMPILER_INCLUDE_PATH = "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include"
UCRT_INCLUDE_PATH = "C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt"
UM_INCLUDE_PATH = "C:\Program Files (x86)\Windows Kits\8.1\Include\um"
WINFAMILY_INCLUDE_PATH = "C:\Program Files (x86)\Windows Kits\8.1\Include\shared"
INCLUDE_LIST = $(COMPILER_INCLUDE_PATH) $(UCRT_INCLUDE_PATH) $(UM_INCLUDE_PATH) $(WINFAMILY_INCLUDE_PATH)
所以现在INCLUDE_LIST是一个带引号的字符串列表(由于windows路径中的空格)。如何创建一个变量,为每个字符串添加INCLUDE_DELIMITER(特定于编译器)?
我试过了:
INCLUDES = $(patsubst, "%", $(INCLUDE_DELIMITER)"%", $(INCLUDE_LIST))
没有avial。我也尝试过:
INCLUDES = $(foreach d, $(INCLUDE_LIST), $(INCLUDE_DELIMITER)$d)
但这导致INCLUDE_LIST中的每个空格都被检测为新单词。
答案 0 :(得分:1)
首先,我不知道你的问题是否是拼写错误,但语法是$(patsubst <pat>,<pat>,<words>)
; patsubst
关键字后面没有逗号。
其次,一般来说,GNU make无法处理其功能中的空白。 %
中的patsubst
引用分隔字的每个空格,因此$(INCLUDE_LIST)
扩展中的字词将为:first "C:\Program
,next { {1}},下一个Files
等。这些都不会匹配模式(x86)\Microsoft
。
您可以尝试这样做:
"%"
第三,你真的不想在GNU make的参数中使用反斜杠。幸运的是,包括Visual Studio在内的大多数Windows工具都会在路径名分隔符和反斜杠中接受正斜杠。我建议您切换到使用它们。