我有一种情况需要将库中的一些源文件编译到我自己的程序中。源文件所在的目录不可由我写入。相反,我有一个本地“构建”目录,所有工作都已完成。
问题是我正在翻译路径。源文件已命名,例如xxxx.cpp
和yyyy.cpp
,它们位于/path/to/source/xxxx/xxxx.cpp
和/path/to/source/yyyy/yyyy.cpp
。
使用$(patsubst ...)我很乐意将这些路径转换为build/xxxx/xxxx.cpp
等,但我无法将其删除第一个xxxx
。
我可以制作一个匹配这样的目标:
build/%.o: /path/to/source/%/%.cpp
$(CXX) ...
......但我根本无法工作。我猜它不喜欢目标后半部分的双通配符。
名称的“来源”是一个变量,只有“xxxx”和“yyyy”:
SYS_LIBS = xxxx yyyy
有关如何使这样的事情发挥作用的任何建议吗?
哦,我需要它是一个“通用”解决方案 - 这将是许多使用这个文件库的项目中包含的makefile,因此不能选择手工制作每个文件的目标。我无法预测库中会有哪些文件。
答案 0 :(得分:0)
一种简单的方法是使用vpath让我们自己查找文件。你只需定义
vpath %.cpp /path/to/source
vpath %.cpp /path/to/source2
vpath %.cpp /path/to/source3
build/%.o : %.cpp
$(CXX)
您可以定义多个路径来源,但是如果在多个文件夹中有相同的文件(例如path_to_source1和path_to_source2中的a.cpp),请小心
答案 1 :(得分:0)
就像Bruce所说,我个人会使用vpath
。如果/path/to/source/
下有许多目录,您可以使用
SRCS = $(wildcard /path/to/source/*)
vpath %.cpp $(SRCS)
(只要目录只从那里下降一级,这就有效。如果有/path/to/source/foo/bar/zzzz/zzzz.cpp
之类的内容,那么你将不得不依赖find
之类的东西。)
如果您真的想要进行路径翻译,可以这样做:
X := $(patsubst %.cpp,build/%.o,$(notdir $(X)))
或者(我不知道你为什么要这样做,但你可以):
X := $(shell echo $(X) | sed 's|.*/\(.*\)\.cpp|build/\1\.o|')