开发者

gmake get list of object files from multiple directories

开发者 https://www.devze.com 2023-01-24 20:06 出处:网络
I dont know much makefile stuff I\'ve been tending to learn bits as required. The biggest failing of my makefiles is that I have been listing all the files manually, while this hasn\'t been a problem

I dont know much makefile stuff I've been tending to learn bits as required.

The biggest failing of my makefiles is that I have been listing all the files manually, while this hasn't been a problem my current project is getting unwieldy. I have 4 directories each with sources files.

How can I get all the object file 开发者_Go百科listing without having to list them manually.

This doesn't work, but it shows what I've been trying to do.

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


Personally, I never had any problem in listing all files manually. Listing a file to the makefile takes negligible time compared to adding filling it with useful content.

To get all files from different directories, one might suggest using wildcard function. So my_sources:=$(wildcard *.cpp dir1/*.cpp) will make the variable contain source files that match wildcard expression.

However, I find it less convenient than using usual Linux find command via shell:

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

Find is more powerful than Make's builtin wildcard. You might also want to use other shell capabilities, such as pipelines, for example, to filter output of find (if Make's filter-out function is not enough). Or something like this, to avoid excessive variables:

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

You name it!


Using VPATH or vpath will not work for your problem.. it provides a search path to find files but you still need to list the files. If you just need to compile all and any .c/.cpp files found in those directories then this should work:

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)

The VPATH info is not needed, the substitution of .o for .cpp can go as can the override of the implicit rule. Additionally, not the use of ls instead of find to look in, and only in, the specfified directory.

0

精彩评论

暂无评论...
验证码 换一张
取 消