Как проверить, существует ли файл в make файле
У меня есть шаблон makefile для компиляции одной DLL (для плагиновой системы).
Файл makefile выглядит следующим образом:
EXTRA_SRCS=file1 file2
include makefile.in
В makefile.in
у меня есть:
plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS))
Где plugin.os
- основной файл С++ для компиляции. Btw, окончание файлов .os
- это объектные файлы, скомпилированные для общей библиотеки (т.е. С помощью параметра -fpic
с gcc
)
Теперь проблема заключается в том, что дополнительные источники могут (но не обязательно) быть файлами заголовков. В идеале я хотел бы добавить их как зависимости для целевого plugin.os
и file.cpp
, но только если они существуют.
Метод должен работать как для окон, так и для linux, или, по крайней мере, адаптироваться к каждому из них. Тем не менее, я использую только версию GNU make.
Ответы
Ответ 1
Используйте функцию "подстановочные знаки":
$(wildcard *.h)
EDIT: чтобы соответствовать определенному списку, сделайте
$(wildcard $(HEADER_FILES))
Нет необходимости использовать $(filter...), функция подстановки автоматически фильтрует файлы, которые не существуют.
Ответ 2
Вы не указали, какой компилятор вы используете, но если у вас есть доступ к gcc/g++, вы можете использовать опцию -MM.
Что я делаю, это создать файл с расширением .d для каждого файла .c или .cpp, а затем "включить".d файлы. Я использую что-то подобное в моем Makefile:
%.d: %.c
gcc $(INCS) $(CFLAGS) -MM $< -MF [email protected]
%.d: %.cpp
g++ $(INCS) $(CXXFLAGS) -MM $< -MF [email protected]
Затем создаю зависимости вроде:
C_DEPS=$(C_SRCS:.c=.d)
CPP_DEPS=$(CPP_SRCS:.cpp=.d)
DEPS=$(C_DEPS) $(CPP_DEPS)
и это в нижней части Makefile:
include $(DEPS)
Является ли это тем видом поведения, которым вы занимаетесь? Красота этого метода заключается в том, что даже если вы используете компилятор, отличный от GNU, для компиляции, компиляторы GNU хорошо выполняют вычисления зависимостей.
Ответ 3
Простой
$(filter $(wildcard *.h),$(HEADER_FILES))
делать то, что вы хотите?