c ++ makefile将prefeix附加到带空格的双引号项列表中

时间:2018-04-05 11:50:45

标签: c++ makefile whitespace gnu-make

让我说我的makefile中有这个:

FOLDERS = "C:\Program Files\some3rdpartytool\inc\thing1.h" \
          "C:\Program Files\some3rdpartytool\lib\libthing.lib" \
          "C:\data\data1.h" \

现在我希望INCLUDE包含:

INCLUDE = -I"C:\Program Files\some3rdpartytool\inc" \
          -I"C:\Program Files\some3rdpartytool\lib" \
          -I"C:\data" \

通常情况下这很简单 - 你只需要:

INCLUDE = $(addprefix -I, $(FOLDERS))
# you can also use the standard makefile function to take the folder path
# only - I just forget what it is off the top of my head...

但无论我做什么,这总是只适用于空白分隔列表(因为它的设计),所以我得到这样的东西:

INCLUDE = -I"C:\Program \
          -IFiles\some3rdpartytool\inc" \
          -I"C:\Program \
          -IFiles\some3rdpartytool\lib" \
          -I"C:\data" \

有没有标准的makefile方法呢? (标准==便携式),我希望这适用于Windows和Linux。

注意我确实考虑过替换任何''' - >'-I''但我似乎无法在subst命令中使用空格...我正在努力在前进的道路上...

2 个答案:

答案 0 :(得分:2)

好的,我们走了。

FOLDERS = "C:\Program Files\blah\thing1.h" \
          "C:\Program Files\blah\libthing.lib" \
          "C:\data\data1.h"

现在我们使用我从@MadScientist学习的技巧,定义一个包含空格的变量,并使用一个你自信的占位符不会出现在你的路径中,例如" SPACE"

E :=
S := $E $E

X1 := $(subst $(S),SPACE,$(FOLDERS))
# "C:\ProgramSPACEFiles\blah\thing1.h"SPACE"C:\ProgramSPACEFiles\...

这似乎取代了&#39>的所有实例。 ',包括路径之间的那些,所以我们将改变它们:

X2 := $(subst "SPACE","$(S)",$(X1))
# "C:\ProgramSPACEFiles\blah\thing1.h" "C:\ProgramSPACEFiles\...

然后添加" -I":

X3 := $(addprefix -I,$(X2))
# -I"C:\ProgramSPACEFiles\blah\thing1.h" -I"C:\ProgramSPACEFiles\...

然后改变" SPACE"回到' ':

X4 := $(subst SPACE,$(S),$(X3))
# -I"C:\Program Files\blah\thing1.h" -I"C:\Program Files...

答案 1 :(得分:1)

@ Beta的解决方案非常棒且通用。另一个更具体但可能更简单的选择是使用类似的东西:

FOLDERS = "C:\Program Files\some3rdpartytool\inc" \
          "C:\Program Files\some3rdpartytool\lib" \
          "C:\data"

INCLUDES := $(patsubst "C:%,-I"C:%,$(FOLDERS))

但当然如果您在C:驱动器之外有文件夹,则会失败。

最终选项更为通用,但仍有一些问题(它减少了空白是主要的一个,但我从来没有听说过多个连续空格的路径,所以也许这样就可以了)类似的东西:

INCLUDES := -I$(subst " "," -I",$(strip $(FOLDERS)))