我正在尝试使用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上面没有产生预期的结果。请帮忙。
答案 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))