如何在makefile中使用patsubst进行多次替换

时间:2017-08-10 07:54:31

标签: makefile gnu-make

我正在尝试使用patsubst

从makefile中的源文件生成目标文件列表
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))

我希望我的OBJ变量

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

在patsubst之后但是patsubst上面没有产生预期的结果。请帮忙。

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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 make函数库(仍然是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))