2010-03-16 2 views
2

Я играю с файлами make и переменной VPATH. В принципе, я захватываю исходные файлы из нескольких разных мест (указанных VPATH) и компилирую их в текущий каталог, используя только список .o-файлов, которые я хочу.Makefile trickery using VPATH и включают

Пока все хорошо, теперь я генерирую информацию о зависимостях в файл под названием «.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 $^ > [email protected] 

include .depend 

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

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

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

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

+0

Почему не оборачивать '.depend: ...' 'цель в if' директиву работы? –

+0

@Pavel: интересно, я никогда об этом не думал. – falstro

ответ

2

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

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 

(EDIT: просто исправлен тупой ошибки.)

+0

ooh .. это последнее время очень хорошо думаю. есть флаг gcc (-MD) для генерации файлов зависимостей при компиляции, поэтому вам не нужно дважды запускать его через препроцессор. – falstro

+0

Я принял это, потому что он вдохновил меня на то, что я сделал, у меня есть отдельные .d-файлы для каждого объекта, скомпилировав каждый объект с помощью -MMD. И '-ключить * .d'. Это приводит к срабатыванию перекомпиляции при необходимости, создавая зависимости как побочный продукт. Никакая работа не выполняется, когда это не требуется. Отлично! – falstro

Смежные вопросы