2017-08-10 71 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))