запрос makefile - PullRequest
       28

запрос makefile

0 голосов
/ 04 июня 2009

У меня есть несколько вопросов о make-файлах. Я определил свою собственную версию файла зависимостей (.d), создав его в коде и назвав его .dd (выглядит как обычный файл зависимостей .c за исключением того, что это для некоторого внутреннего формата файла). Теперь этот файл я включил в make-файл с помощью оператора include. (Существует целая куча этих файлов, поэтому я определил это как правило, которое использует subst для замены расширения по мере необходимости.)

Теперь предположим, что файл X зависит от файла Y, то есть X.dd содержит ссылку на файл Y. Теперь, насколько я понимаю, всякий раз, когда я запускаю make и программа проходит через include и обнаруживает, что Y был обновлен, он каким-то образом перекомпилируется это, чтобы отразить изменения в X.

Мой вопрос и проблема в том, что, когда замечено это изменение метки времени в Y, происходит перезапуск, чтобы включить изменения. Как именно решаются файлы зависимостей такого рода. Также файл X не является типичным файлом .c или .cc. Итак, как будет обрабатываться файл при изменении его зависимости.

Проблема, с которой я сталкиваюсь, заключается в том, что если файл Y изменен / затронут, файл X не перекомпилируется. Также, если я коснусь файла X, он перекомпилируется просто отлично. Также, как и ожидалось, при касании make-файла все перекомпилируется соответствующим образом.

Эта ошибка заставляет меня несколько дней чесать голову, поэтому любая помощь будет оценена.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Привет

Шишир

Ответы [ 2 ]

0 голосов
/ 05 июня 2009

Мой вопрос и проблема в том, что, когда замечено это изменение метки времени в Y, происходит перезапуск, чтобы включить изменения.

GNU make считывает временные метки файлов один раз при запуске. Если вы не вызовете его явно (например, вызовом make или $ MAKE из make-файла), он не будет перепроверять временные метки после выполнения команд.

Итак, как будет обрабатываться файл при изменении его зависимости.

Все файлы обрабатываются одинаково; make просто имеет несколько встроенных правил для некоторых типов файлов. Зависимости обрабатываются одинаково для всех типов файлов.

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

Я буду использовать файлы c в качестве примера, поскольку вы уже знаете, как должны работать их зависимости. Предположим, у вас есть файл foo.c (исходный код), который компилируется в foo.o (целевой), и чьи зависимости указаны в foo.d. Для этого примера, скажем, если изменится bar.h или baz.h, мы хотим перестроить foo.o.

foo.d должен содержать что-то вроде:

foo.o : bar.h baz.h

И ваш makefile будет читать

%.o:%.c
       $(CC) -c $< -o $@

include foo.d

Ваши симптомы звучат так, словно у вас есть файл foo.d, содержащий:

foo.c: bar.h baz.h
    ^

Или что-то совершенно не связанное с левой стороны, такое, что make не видит зависимости от foo.o. Если вы запустите make -p и выполните поиск foo.o в выходных данных, вы увидите, что, по мнению make, зависит от содержимого вашего make-файла.

0 голосов
/ 04 июня 2009

Предполагается, что X.boy генерируется из X.src (и Y.boy из Y.src), а затем работает следующим образом:

Makefile: все: X.boy Y.boy

# for the example I will generate .boy with cp
%.boy: %.src
    cp $< $@

include X.dd

X.dd: X.boy: Y.src

Это тогда дает:

$make
cp X.src X.boy
cp Y.src Y.boy

$touch X.src
$make
cp X.src X.boy

$touch Y.src
$make
cp X.src X.boy
cp Y.src Y.boy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...