Automake пересобирает исходный файл, если Makefile изменяется

При использовании системы сборки autoconf/automake, если флаги компилятора или другие переменные в Makefile.am (или даже более высоком уровне, например configure.ac) изменяются, исходные файлы C++, связанные с этим Makefile, не будут автоматически пересобраны. Это становится особенно важным, поскольку мы используем automake как часть системы непрерывной сборки, которая перекомпилирует только по мере необходимости.

Моя мысль заключалась в том, чтобы включить Makefile в качестве зависимости для файлов .o, что теоретически решит указанную выше проблему. Итак, пара вопросов:

Во-первых, можно ли добавить такое правило? Я бы предпочел не добавлять это настраиваемое правило в каждый файл Makefile.am, поэтому что-то, что можно было бы поместить в файл верхнего уровня (например, configure.ac), было бы здорово.

Во-вторых, недостатком этого подхода является то, что в некоторых случаях изменения в Makefile на самом деле не повлияли на компиляцию, поэтому в конечном итоге я буду пересобирать, когда это действительно не нужно. Думаю, я готов смириться с этим (или, по крайней мере, попробовать, чтобы увидеть, насколько это болезненно), чтобы иметь лучшую гарантию того, что мои сборки будут правильными, но есть ли лучший способ решить эту проблему? Я считаю, что clearmake решает эту проблему, сохраняя фактическую команду компилятора (вместе с другими зависимостями), а затем сравнивая текущую команду с предыдущей, чтобы определить, нужно ли регенерировать файл.


person Nathan Buckles    schedule 01.07.2011    source источник
comment
Пересборка вещей на основе измененной переменной makefile неверна, потому что она ломает такие вещи, как make install prefix=/some/other/prefix, которые необходимы для таких инструментов, как GNU stow.   -  person Jack Kelly    schedule 04.07.2011
comment
@JackKelly Я вижу, что в целом это было бы плохо, но для изменения определенных флагов, таких как AM_CPPFLAGS, кажется, что требуется перестройка. Например, если я изменю включение .../somelib-v2 на .../somelib-v3, код обязательно нужно будет перекомпилировать. Я был бы готов отказаться от настройки переменных в командной строке, если бы мог получить фактические изменения Makefile* для принудительной перекомпиляции.   -  person Nathan Buckles    schedule 05.07.2011


Ответы (1)


Если вы используете ccache (./configure CXX='ccache g++' или просто добавляете g++ к пути), ложные перестроения должны быть очень дешевыми и при этом безопасными. Также никогда не используйте макрос AM_MAINTAINER_MODE autoconf, который делает отслеживание зависимостей необязательным (зависит от флага --enable-maintainer-mode).

person Tobu    schedule 01.07.2011
comment
спасибо за указатель тобу. похоже, что ccache будет вызываться только тогда, когда правила makefile в противном случае вызывали бы компилятор? так что в случае, когда я меняю флаги сборки, а automake не обнаруживает необходимости перестроения, помогает ли ccache? извините, если я не в теме относительно того, как вписывается ccache. - person Nathan Buckles; 01.07.2011
comment
@Nathan Да, вам все еще нужно какое-то правило, чтобы *.o зависел от Makefiles. - person Tobu; 02.07.2011
comment
Спасибо за разъяснения. я собираюсь пометить вопрос как оставшийся без ответа в надежде, что кто-то может дать ответ на эту часть моего вопроса. - person Nathan Buckles; 02.07.2011
comment
--enable-maintainer-mode не отключает отслеживание зависимостей, это делает --disable-dependency-tracking. Режим сопровождающего управляет только правилами перестроения (обработка определений lex/yacc, переделка Makefile.in и т. д.): gnu.org/s/hello/manual/automake/maintainer_002dmode.html - person Jack Kelly; 04.07.2011