Makefile: нужно сделать цель перед включением другого make-файла - PullRequest
0 голосов
/ 28 января 2011

Часть моего Makefile:

CPUDEPS=./mydeps.cpu
(...)
deps: $(CPUDEPS)

$(CPUDEPS): $(CCFILES)
 @echo [DEPS] CPU
 $(CMDECHO)makedepend -Y -s'# CPU sources dependencies generated with "make deps"' \
  -w4096 -f- -- $(CFLAGS) -- $^ 2> /dev/null > $(CPUDEPS)
(...)
sinclude $(CPUDEPS)

Задача 1 : включения выполняются на первом этапе обработки, цели на втором этапе; Итак, если ./mydeps.cpu не существует, и я "делаю deps", сначала я получаю сообщение об ошибке

Makefile:335: ./mydeps.cpu: No such file or directory

Я скрываю ошибку, используя sinclude вместо include, но проблема все еще здесь: включен старый файл, а не только что созданный. Нужно запустить его дважды, чтобы включить обновленный файл. Это потому, что make выполняет двухфазную обработку; Есть ли какой-нибудь способ сказать make, чтобы завершить целевой deps до анализа включений?

Проблема 2 : даже если файл ./mydeps.cpu не существует и make deps фактически создает его, я всегда получаю «make: ничего не делать для deps». Это не происходит с другими целями. Я не понимаю, почему и как этого избежать.

Ответы [ 2 ]

1 голос
/ 28 января 2011

Проблема 1 не существует: перед созданием цели make автоматически перестраивает make-файлы (с неявными правилами, если явное правило не предусмотрено). Таким образом, наличие правила для make-файла гарантирует, что оно всегда будет в актуальном состоянии, поэтому нет необходимости запускать deps дважды. Кроме того, поскольку CPUDEPS является make-файлом, он будет обновляться автоматически перед выполнением любого другого правила, поэтому зависимости всегда будут обновляться при необходимости, а make deps не требуется. Вы, вероятно, можете заметить это самостоятельно, наблюдая, как эхом выводится строка [DEPS], если какой-либо из CCFILES станет более новым, чем файл зависимости.

Для Задачи 2 добавление чего-либо в рецепт гарантирует, что make не будет жаловаться на то, что ему нечего делать. Если больше ничего нет, вы можете использовать что-то вроде @echo OK, чтобы оставить отзыв пользователю, или просто @true, если вы предпочитаете абсолютно бесшумный режим.

1 голос
/ 28 января 2011

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

Основная причина, лежащая в основе этого правила:

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

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

...