Как проверить, существует ли файл в make-файле
-
05-07-2019 - |
Вопрос
У меня есть шаблон make-файла для компиляции одной DLL (для системы плагинов). Makefile пользователя выглядит следующим образом:
EXTRA_SRCS=file1 file2
include makefile.in
В makefile.in
у меня есть:
plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS))
Где plugin.os
- это основной файл C ++ для компиляции. Между прочим, окончание файлов .os
- это объектные файлы, скомпилированные для разделяемой библиотеки (то есть с использованием опции -fpic
с gcc
)
Теперь проблема в том, что дополнительные источники, вероятно (но не обязательно) будут заголовочными файлами. В идеале я хотел бы добавить их в качестве зависимостей для цели file.cpp
и <=>, но только если они существуют.
Метод должен работать как для Windows, так и для Linux, или, по крайней мере, быть адаптируемым для каждого. Однако я использую только GNU-версию make.
Решение
Используйте " подстановочный знак " Функция:
$(wildcard *.h)
РЕДАКТИРОВАТЬ: чтобы соответствовать определенному списку, выполните
$(wildcard $(HEADER_FILES))
Нет необходимости использовать $ (фильтр ...), функция подстановки автоматически фильтрует файлы, которые не существуют.
Другие советы
Вы не указали, какой компилятор (ы) вы используете, но если у вас есть доступ к gcc / g ++, вы можете использовать опцию -MM. Р>
Я создаю файл с расширением .d для каждого файла .c или .cpp, а затем " include " .d файлы. Я использую что-то вроде этого в моем Makefile:
%.d: %.c
gcc $(INCS) $(CFLAGS) -MM $< -MF $@
%.d: %.cpp
g++ $(INCS) $(CXXFLAGS) -MM $< -MF $@
Затем я создаю зависимости следующим образом:
C_DEPS=$(C_SRCS:.c=.d)
CPP_DEPS=$(CPP_SRCS:.cpp=.d)
DEPS=$(C_DEPS) $(CPP_DEPS)
и это в нижней части Makefile:
include $(DEPS)
Это то поведение, за которое вы идете? Прелесть этого метода в том, что даже если вы используете компилятор не-GNU для фактической компиляции, компиляторы GNU хорошо справляются с вычислением зависимостей.
Делает ли простое
$(filter $(wildcard *.h),$(HEADER_FILES))
делай что хочешь?