Я пытаюсь написать 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)
$(wildcard ...)
функция находит, какие файлы на самом деле существуют в файловой системе (и некоторые или все файлы .o могут быть созданы во время выполнения make, поэтому результат будет отличаться в зависимости от последней команды). Это, безусловно, не то, что вы хотите.
В вашем случае вам нужно только выполнить подстановку строк, а шаблон «совпадение всех» для строк в make является знаком процента. Так должно быть:
OBJS:=$(filter-out ./build/./src/%,$(OBJS))
Также обратите внимание, что пробелы в make-файле могут иметь значение. Например, $(filter a, b)
означает, что вторым аргументом является «b», а не просто «b». Хотя в вашем случае это не имеет значения, с пробелами следует быть осторожнее.
Мне удалось заставить его работать, поместив файлы, которые я хотел контролировать, в свои собственные, но не уверен, как бы я решил это, не сделав этого.
Спасибо за ответ. Я должен был быть более конкретным в отношении того, что я пытаюсь сделать. Я хочу отфильтровать файлы только в этом каталоге (а не в подкаталогах). Это, похоже, не работало правильно. Но это определенно ставит меня на правильный путь.