Проблема с подстановочными символами в Makefile - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь написать make-файл для выборочного включения определенного файла.

Мне удалось заставить его работать со следующим:

OBJS := $(filter-out ./build/./src/class_1.cpp.o, $(OBJS))
OBJS := $(filter-out ./build/./src/class_2.cpp.o, $(OBJS))

OBJS_1 :=./build/./src/class_1.cpp.o $(OBJS)
OBJS_2 := ./build/./src/class_2.cpp.o $(OBJS)

Но я хотел бы сделать этоболее общий и использовать подстановочный знак.

Насколько я понимаю, должно работать следующее:

OBJS := $(filter-out $(wildcard ./build/./src/*), $(OBJS))

Я также пытался

OBJS := $(filter-out $(wildcard \./build/\./src/*), $(OBJS))

, но не уверен, что проблема со специальными символами или простобазовое понимание.

однако затем он жалуется на слишком много основных функций (класс 1 и класс 2).

Есть ли что-то, чего мне не хватает в моем понимании подстановочных знаков и фильтров в make?

Если я распечатываю значение $ (OBJS) с двумя разными подходами, значения совпадают, поэтому я не уверен, почему одно решение может работать, а другое - не удается.

Однако по какой-то причине OBJS_1, похоже, не получает фильтр, который был применен к $(OBJS)

1 Ответ

1 голос
/ 09 апреля 2019
Функция

$(wildcard ...) определяет, какие файлы действительно существуют в файловой системе (и некоторые или все файлы .o могут быть созданы во время выполнения make, поэтому результат будет отличаться в зависимости от последней команды).Это, безусловно, не то, что вам нужно.

В вашем случае вам нужно только выполнить подстановку строк, а шаблон 'match-all' для строк в make - это знак процента.Так должно быть:

OBJS:=$(filter-out ./build/./src/%,$(OBJS))

Также обратите внимание, что пробелы в make-файле могут иметь значение.Например, $(filter a, b) означает, что вторым аргументом является «b», а не просто «b».Даже если это не имеет значения в вашем случае, вам следует быть осторожнее с пробелами.

...