gmake получить список объектных файлов из нескольких каталогов

Я не знаю много материала makefile, который я стремился изучить битами по мере необходимости.

Самый большой недостаток моих make-файлов заключается в том, что я составлял список всех файлов вручную, хотя это не было проблемой, потому что мой текущий проект становится громоздким. У меня есть 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

person Community    schedule 14.11.2010    source источник


Ответы (2)


Лично у меня никогда не было проблем с перечислением всех файлов вручную. Перечисление файла в makefile занимает незначительное время по сравнению с добавлением в него полезного содержимого.

Чтобы получить все файлы из разных каталогов, можно предложить использовать wildcard function< /а>. Таким образом, my_sources:=$(wildcard *.cpp dir1/*.cpp) заставит переменную содержать исходные файлы, соответствующие подстановочному выражению.

Однако я нахожу это менее удобным, чем использование обычной команды Linux find через оболочку:

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

Find более мощный, чем встроенный в Make wildcard. Вы также можете захотеть использовать другие возможности оболочки, такие как конвейеры, например, для фильтрации вывода find (если функции Make filter-out недостаточно). Или что-то вроде этого, чтобы избежать лишних переменных:

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

Вы называете это!

person P Shved    schedule 14.11.2010
comment
В OS X вы должны добавить текущий каталог после команды find. Например: find . -iname '*.cpp'. - person deepak; 30.07.2013

Использование 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 для поиска и только в указанном каталоге.

person Spaceghost    schedule 15.11.2010