Как проверить, существует ли файл в make-файле - PullRequest
15 голосов
/ 30 октября 2008

У меня есть шаблон 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)

Теперь проблема в том, что дополнительные источники, вероятно (но не обязательно) будут заголовочными файлами. В идеале я хотел бы добавить их как зависимости для цели plugin.os и file.cpp, но только если они существуют.

Метод должен работать как для Windows, так и для Linux, или, по крайней мере, быть адаптируемым для каждого. Однако я использую только GNU-версию make.

Ответы [ 3 ]

19 голосов
/ 30 октября 2008

Используйте функцию «подстановочный знак»:

$(wildcard *.h)

РЕДАКТИРОВАТЬ: чтобы соответствовать определенному списку, выполните

$(wildcard $(HEADER_FILES))

Нет необходимости использовать $ (фильтр ...), функция подстановки автоматически фильтрует файлы, которые не существуют.

5 голосов
/ 30 октября 2008

Вы не указали, какой компилятор (ы) вы используете, но если у вас есть доступ к gcc / g ++, вы можете использовать опцию -MM.

Я создаю файл с расширением .d для каждого файла .c или .cpp, а затем «включаю» файлы .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 хорошо справляются с вычислением зависимостей.

3 голосов
/ 30 октября 2008

делает простой

$(filter $(wildcard *.h),$(HEADER_FILES))

делай что хочешь?

...