2014-12-16 6 views
2

Я учил себя GNU Сделал и подумал, что Redis Makefile научит меня кое-чему об этом инструменте.Как Redis Makefile содержит предварительные требования к файлам заголовков

Правило, которое компилирует исходный файл в объектный файл here:

%.o: %.c .make-prerequisites 
    $(REDIS_CC) -c $< 

Обратите внимание, что правило суффикс просто упоминает исходный файл C (с% .c) в качестве предварительного условия.

Но если добавить эхо в середине и запустить сделать:

%.o: %.c .make-prerequisites 
    echo $^ 
    $(REDIS_CC) -c $< 

Тогда первые несколько строк вывода из делают, как показано ниже:

cd src && make all 
make[1]: Entering directory `/home/cltpadmin/code/redis/src' 
echo adlist.c .make-prerequisites adlist.h zmalloc.h 
adlist.c .make-prerequisites adlist.h zmalloc.h 
CC adlist.o 

Как make знать, что adlist.c зависит от adlist.h и zmalloc.h?

+1

Возможно, это подробно описано в другой части файла makefile? –

+0

Я прочитал Makefile и не могу его найти. Отсюда вопрос. – ardsrk

+1

Предварительные требования для файла makefile объединяются со всех мест, где указан объект. Таким образом, 'tgt: pr1',' tgt: pr2', 'tgt: pr3' будет объединяться таким образом, что make знает, что' tgt' имеет 'pr1',' pr2' и 'pr3' в качестве предварительных условий. Вывод (объемный, как есть) из 'make -qp' может быть полезен при поиске других мест. –

ответ

2

Необходимые предпосылки взяты из строки 1 из Makefile.dep прилагаемого make-файла (включенного в строку 134).

Объект dep цели в строке 136 генерирует этот файл.

Это был довольно распространенный (хотя и полностью исключаемый) шаг для использования компилятора для генерации необходимого файла заголовка. Полагаю, что этот статический метод также имеет проблемы с условным заголовком.

Чтобы уточнить, «избегаемая» часть этого заключается в том, что это не обязательно отдельный шаг и статический файл зависимостей вообще. См. Advanced Auto-Dependency Generation для получения дополнительной информации об этой идее.

+0

О, я пропустил этот файл. Благодарю. – ardsrk

+0

Любая идея, почему автор определил цель .make-prequisites? Похоже, это не нужно. – ardsrk

+0

@ardsrk Мне нужно будет изучить его больше, но, похоже, он задействован в сохранении настроек конфигурации в другом включенном make-файле, когда вы используете правильные флаги. Посмотрите на три разных объекта '.make-prequisites'. –

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