让我说我的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命令中使用空格...我正在努力在前进的道路上...
答案 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)))