棘手的“制造”目标要求

时间:2011-08-29 09:50:05

标签: makefile gnu-make

我有一种情况需要将库中的一些源文件编译到我自己的程序中。源文件所在的目录不可由我写入。相反,我有一个本地“构建”目录,所有工作都已完成。

问题是我正在翻译路径。源文件已命名,例如xxxx.cppyyyy.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,因此不能选择手工制作每个文件的目标。我无法预测库中会有哪些文件。

2 个答案:

答案 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|')