Обманка Makefile с использованием VPATH и включает - PullRequest
2 голосов
/ 16 марта 2010

Я играю с файлами make и переменной VPATH. По сути, я беру исходные файлы из нескольких разных мест (указанных VPATH) и компилирую их в текущий каталог, используя просто список .o-файлов, которые мне нужны.

Пока все хорошо, теперь я генерирую информацию о зависимостях в файл с именем .depend и включаю его. Gnumake попытается использовать правила, определенные до сих пор, для создания включенного файла, если он не существует, так что все в порядке. По сути, мой make-файл выглядит так.

VPATH=A/source:B/source:C/source

objects=first.o second.o third.o

executable: $(objects)

.depend: $(objects:.o=.c)
    $(CC) -MM $^ > $@

include .depend

Теперь по вопросу, могу ли я каким-либо образом подавить создание файла .depend? В настоящее время я работаю в прозрачной среде -> sloooow, поэтому я бы предпочел, чтобы при обновлении информации о зависимостях он был немного под контролем.

Это более или менее академическое упражнение, так как я мог бы просто обернуть вещь в сценарий, который касается файла .depend перед выполнением make (что делает его более новым, чем любой исходный файл), но было бы интересно узнать, если Я могу как-то подавить это, используя «чистую» make.

Я не могу удалить зависимость от исходных файлов (то есть просто используя .depend:), так как я в зависимости от переменной $^, чтобы сделать для меня разрешение VPATH.

Если бы был какой-либо способ обновлять зависимости только в результате обновленных директив #include, это было бы еще лучше, конечно .. Но я не задерживаю дыхание для этого ..:)

1 Ответ

2 голосов
/ 16 марта 2010

Если вы не хотите переделывать .depend каждый раз, у вас не должно быть правила для этого. Обратите внимание, что когда вам действительно нужно переделать файл зависимостей, вы также должны переделать объектный файл (это не мое понимание, оно взято из Advanced Auto-Dependency Generation , и мне потребовалось некоторое время, чтобы понять его ). Поэтому создайте .depend в правиле связывания, используя цель PHONY:

DEPEND_FILE = .depend
# put this command in the executable rule
    $(MAKE) DEPENDENCIES

.PHONY: DEPENDENCIES
DEPENDENCIES: $(objects:.o=.c)
    $(CC) -MM $^ > $(DEPEND_FILE)

-include $(DEPEND_FILE)

Вы можете сделать вещи более эффективными, имея отдельные зависимые файлы, по одному для каждого объекта, чтобы при изменении не приходилось пересчитывать зависимости всех объектов:

# put this command in the %.o rule
    $(CC) -MM $< > $*.d

-include *.d

(РЕДАКТИРОВАТЬ: только что исправил глупую ошибку.)

...