2017-01-10 2 views
0

У меня есть два файла, как показано ниже (из команды tree).В Makefile, как заставить функцию подстановки работать для файлов во всех путях, заданных переменной VPATH

. 
|-- Makefile 
|-- dir1 
| `-- file1.c 
`-- dir2 
    `-- file2.c 

Я хотел компилировать файлы в каталоге dir1 и dir2, поэтому я написал Makefile, как показано ниже.

VPATH = dir1:dir2 
CFILES := ${wildcard *.v} 
$(info CFILES = ${CFILES}) 

выход:

CFILES = 

Так wildcar функция автоматически не искать пути, установленные переменной VPATH.
Если я конкретно напишу путь в подстановочной функции, он работает.

CFILES := ${wildcard dir1/*.c dir2/*.c} <== this makes it work 
$(info CFILES = ${CFILES}) 

выход:

CFILES = dir1/file1.c dir2/file2.c 

Я хочу добавить только существующие пути к Makefile, но есть ли способ, что я могу использовать функцию подстановки для путей, установленных VPATH? (Предположим, мне нужно удалить некоторые файлы из списка компиляции, так что мне нужен список файлов. Просто любопытно ..)

+0

похоже, что вы не можете. Подробности здесь http://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make –

ответ

0

Вы можете использовать функции преобразования текста Make, чтобы превратить список каталогов в нужную команду подстановки. Взгляните на GNU Make manual, они даже используют извлечение каталогов VPATH в своих примерах. Рассмотрим что-то вроде:

$(wildcard $(addsuffix /*.c,$(subst :, ,$(VPATH)) 

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

Также рассмотрите, что вы хотите, если файлы с тем же именем отображаются в разных каталогах!

Смежные вопросы