gmake получает список объектных файлов из нескольких каталогов - PullRequest
6 голосов
/ 14 ноября 2010

Я не знаю много вещей из 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

Ответы [ 2 ]

5 голосов
/ 14 ноября 2010

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

Чтобы получить все файлы из разных каталогов, можно предложить использовать 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)

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

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

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

0 голосов
/ 15 ноября 2010

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

...