Рекурсивный поиск в VPATH? - PullRequest
0 голосов
/ 15 января 2019

Мой проект C ++ имеет исходные файлы, организованные во вложенных подкаталогах ./src. В моем make-файле есть шаблонное правило, которое компилирует все исходные файлы .cpp в объекты:

$(OBJDIR)/%.o: %.cpp makefile
    $(CXX) -c $< -o $@

Поскольку я использую этот шаблон, а не пишу правило компиляции для каждого исходного файла, мне нужно указать make рекурсивно просмотреть ./src для этих предварительных условий. Прямо сейчас у меня есть:

VPATH := $./src/:./src/folder1:./src/folder2:./src/folder3

Это работает, но выглядит довольно не элегантно, а также вызывает ошибки, когда я неизбежно забываю добавить в новую папку.

Надеюсь, у кого-то есть лучшее решение!

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Вы можете автоматизировать создание переменной VPATH, аналогичной вашей, с помощью поиска подкаталогов и замены пробелов двоеточиями:

space :=
space +=
VPATH := $(subst $(space),:,$(shell find src -type d))

Предполагается, что в ваших каталогах или именах файлов нет пробелов.

При таком подходе мне не ясно, что бы вы делали, если бы два исходных файла в двух разных подкаталогах имели одно и то же имя - но это, скорее, больше относится к вашей общей настройке, чем к вашему вопросу о VPATH конкретно.

О трюке с переменной $(space) см. Отличный Выход из запятой и пробела в блоге GNU Make .

0 голосов
/ 15 января 2019

Сам gmake не имеет никаких функций для рекурсивного обхода каталога, поэтому вам придется прибегнуть к $(shell ...):

VPATH := $(shell find src -type d -print | tr '\012' ':' | sed 's/:$$//')

Настройте скрипт оболочки, чтобы получить правильную семантику. Вы хотите использовать оператор :=, чтобы оценить это один раз.

...