预先包含Windows包含带有变量include参数的makefile中的路径

时间:2016-11-13 23:14:01

标签: c++ c gcc makefile

我有一个项目,我想在一个带有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中的每个空格都被检测为新单词。

1 个答案:

答案 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工具都会在路径名分隔符和反斜杠中接受正斜杠。我建议您切换到使用它们。