Можно ли использовать имена каталогов в шаблонах GNU make? - PullRequest
0 голосов
/ 15 октября 2018

У меня есть несколько драйверов устройств: исходный код каждого устройства находится в подкаталоге с тем же именем, что и устройство:

devices/foo/foo.c
devices/bar/bar.c

Если я настроил отдельное GNU, создайте правило дляна каждом устройстве, подобном этому, оно работает:

obj/foo.o: devices/foo/foo.c
    $(CC) $(CFLAGS) devices/foo/foo.c -o obj/foo.o

Если я настрою такой шаблон создания, он не сможет определить, как создать файл.Я предполагаю, что проблема заключается в использовании% в качестве имени подкаталога.

obj/%.o: devices/%/%.c
    $(CC) $(CFLAGS) $< -o $@ 

Есть ли какой-нибудь способ, которым я могу настроить шаблон для этого?

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Другой подход заключается в определении следующей функции expand в вашем make-файле:

expand = devices/$1/$1.c

Затем, включив вторичное расширение , вы можете вызватьэта функция для определения предпосылок цели на основе ствола, которая находится в $*:

.SECONDEXPANSION:
obj/%.o: $$(call expand,$$*)
    $(CC) $(CFLAGS) $< -o $@
0 голосов
/ 15 октября 2018

В шаблоне может быть только один %. правила соответствия немного сложны.Однако сопоставление происходит только на целевой (левой) стороне, поэтому один шаблон не может быть использован для поиска в нескольких каталогах нужного предварительного условия.

В качестве обходного пути можно создать правило шаблона для каждогокаталог.GNU make будет использовать первое шаблонное правило, для которого фактически существует предварительное условие.Вы также можете использовать переменную VPATH или директиву vpath для поиска в нескольких каталогах.

Обратите внимание, что все эти конструкции значительно замедляют работу GNU, исделать make-файлы труднее писать и отлаживать.В конце концов, может быть лучшим компромиссом (с точки зрения производительности и накладных расходов на обслуживание) является создание простого make-файла, состоящего только из правил, не относящихся к шаблону.

...