gmake从多个目录中获取目标文件列表

时间:2010-11-14 17:08:40

标签: makefile gnu-make

我不知道很多makefile的东西,我一直在倾向于根据需要学习一些东西。

我的makefile最大的失败是我手动列出了所有文件,而这并不是我当前项目变得笨拙的问题。我有4个目录,每个目录都有源文件。

如何在不必手动列出的情况下获取所有目标文件列表。

这不起作用,但它显示了我一直在尝试做的事情。

VPATH = Lib GameCode Moot/Moot Moot/Impl

OBJS = $(subst .cpp, .o, $(VPATH))

foobar: $(OBJS)
    g++ -o $@ $^

%.o: %.cpp
    g++ -c $< -o $@ -I Moot 

clean:
    rm main.o lib.o foo.o foobar

2 个答案:

答案 0 :(得分:5)

就个人而言,我手动列出所有文件时从未遇到任何问题。与添加有用内容相比,将文件列入makefile所需的时间可以忽略不计。

要获取不同目录中的所有文件,可以建议使用wildcard function。因此my_sources:=$(wildcard *.cpp dir1/*.cpp)将使变量包含与通配符表达式匹配的源文件。

但是,我觉得通过shell使用通常的Linux find命令不太方便:

# Find all sources
my_sources:=$(shell find -iname '*.cpp')
# Make targets out of them
OBJS=$(my_sources:%.cpp=%.o)

查找比Make的内置wildcard更强大。您可能还希望使用其他shell功能(例如管道)来过滤find的输出(如果Make filter-out函数不够用)。或类似的东西,以避免过多的变量:

OBJS:=$(shell find -iname '*.cpp' | sed 's/\.cpp$/.o/')

你说出来了!

答案 1 :(得分:0)

使用VPATH或vpath不适用于您的问题..它提供了查找文件的搜索路径,但您仍需要列出文件。如果您只需要编译在这些目录中找到的所有.c / .cpp文件,那么这应该可以工作:

foobar: $(shell ls Lib/*.cpp) $(shell ls GameCode/*.cpp) $(shell ls Moot/Moot/*.cpp)  $(shell ls Moot/Impl/*cpp)
    g++ -o $@ $^

clean:
    rm foobar $(shell ls Lib/*.o) $(shell ls GameCode/*.o) $(shell ls Moot/Moot/*.o)  $(shell ls Moot/Impl/*o)

不需要VPATH信息,.o替换.cpp可以替代隐式规则。另外,不是使用ls而不是find,只能在specfified目录中查找。