2017-08-10 28 views
0

我试图用patsubst如何使用patsubst在生成文件做多重替换

OUT_DIR=Out/ 

SRC=../../../Client2.4/Client/src/BrokerModule/BrokerApp.cpp  
    ../../../Client2.4/Client/src/CommandMsgManager/CConfigModuleInfo.cpp 

OBJ:= $(patsubst %src/%.cpp,${OUT_DIR}$%.o,$(SRC)) 

我要生成从我的makefile文件的源文件的目标文件的列表中,我OBJ变量是

OBJ=Out/BrokerModule/BrokerApp.o Out/CommandMsgManager/CConfigModuleInfo.o 

patsubst后,但以上patsubst不产生预期的结果。请帮忙。

回答

1

有一些问题的patsubst使用,请参阅我的建议是其次,

OUT_DIR=Out/ 

SRC=../../../Client2.4/Client/src/BrokerModule/BrokerApp.cpp \ 
../../../Client2.4/Client/src/CommandMsgManager/CConfigModuleInfo.cpp 

# add the definition of src 
src=../../../Client2.4/Client/src/ 

# Modify the definition of OBJ 
OBJ:= $(patsubst ${src}%.cpp,${OUT_DIR}%.o,$(SRC)) 

筛选出的预谋${src}和附加.cpp,只保留 BrokerModule/BrokerApp.cpp & CommandMsgManager/CConfigModuleInfo.cpp

%被替换为与上一步中的%相匹配的文本。

+0

然后你可能没有使用确切的CWLiu建议。再次检查你的语法和'src','OUT_DIR'和'SRC'的定义。 –

+0

它已经在这里工作,应该没有问题与我的答案。 – CWLiu

+0

对不起,它正在工作。我犯了一些错误。谢谢CWLiu。 –

0

不幸的是Patsubst只能使用一个通配符处理模式。此外,您正尝试在文件级别上拆分路径名称,而不是通常的方式。这意味着,只要你不知道字符串中的/src/的前缀或后缀部分,你就不会运气,因为你永远不会说'替换未知的前缀并保留未知的后缀'(或相反方向)。 通常的解决方案是“知道”前缀:

OUT_DIR=Out/ 

SRC_PATH := ../../../Client2.4/Client/src 

SRC=../../../Client2.4/Client/src/BrokerModule/BrokerApp.cpp  \ 
    ../../../Client2.4/Client/src/CommandMsgManager/CConfigModuleInfo.cpp 

OBJ:= $(patsubst $(SRC_PATH)/%,${OUT_DIR}%,$(SRC)) 

$(info $(OBJ)) 

另一种解决方案是使用例如GNUmake table toolkit库功能(仍然是beta版,但你的问题可以解决):

include gmtt.mk 

OUT_DIR=Out 

SRC=../../../Client2.4/Client/src/BrokerModule/BrokerApp.cpp  \ 
    ../../../Client5.6/Client/src/CommandMsgManager/CConfigModuleInfo.cpp 

strip-till-last-src = src/$(call implode,$(call down-to,src/,$(call explode,/,$1))) 

OBJ:= $(foreach a-path,$(SRC),$(OUT_DIR)/$(call strip-till-last-src,$(a-path))) 

$(info $(OBJ))