Как проверить, существует ли файл в 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))

делать то, что вы хотите?