я понимаю - это перекомпиляция при изменении зависимостей. Зависимости таргета могут быть перечислены после двоеточия.
Обычно под изменением зависимости подразумевают изменение содержимого файла на который ссылается таргет. make проверяет это только при помощи времени модификации файла.
Иными словами, если зависимость моложе таргета, то таргет будет выполнен.
Вопрос: а есть ли другие случаи, когда тригерится таргет?
поменялся хидер, на который этот сишник ссылается
А почему это именно другой случай, не описанный мною выше, когда меняется файл и соответственно его атрибут "время изменения"?
В @probuildsystems
#include "file.h" int main(){ printf("Hello"); return 0; } А меняешь file.h. Насколько я помню, make умеет вытаскивать список зависимостей (инклюдов) из gcc/clang (возможно спец опциями компиляторов) и отслеживать их изменение. Не факт, что это будет сделано явно (не помню)
Интересно, понял. Ты наверное пытаешься сказать об автоматической генерации правил и, возможно, о неявных таргетах. Есть такое, да. Например, gcc может cc -M main.c сгенерировать такое правило: main.o : main.c file.h https://www.gnu.org/software/make/manual/html_node/Automatic-Prerequisites.html А за счёт неявных правил тебе не нужно писать правило для main.c https://www.gnu.org/software/make/manual/html_node/Implicit-Rules.html Однако в итоге make будет руководствоваться временем модификации файла (хедер или .c). Мне же интересно вот что: существуют ли другие поводы, кроме более свежего времени модификации зависимости, для запуска правила?
https://www.gnu.org/software/make/manual/html_node/How-Make-Works.html - тут есть какие-то доп правила для Yacc & Bison. Да и в принципе описано то, как оно работает
Да, это документация по make. Неплохо кстати написано. Рекомендую. Если вдруг кто-то знает/сталкивался с запуском правила не потому что время файла новее, будет интересно узнать.
Выбросьте вы свой make
Хорошо, спасибо. А почему?
потому что портянку на make легко заменяет cmake в 10 строк и он намного понятее чем ручное жонглирование зависимостями а если надо что-то специфическое - генераторы, etc все достаточно просто делается
Портянку на мейке для локальной сборки обычно заменяет цмак в 2-3 строки, и только если надо что-то более серьезное там размер растет.
Понял, спасибо. Интересно. Пока выбрасываю make, процесс не очень быстрый, всё же позволю себе немного поискать случаи запуска правила, когда время модификации зависимости не поменялось. Интересно всё-таки :)
ну это вам решать. но будете смотреть на cmake - то все начиная с версии 3, когда появились нормальные таргеты
Обсуждают сегодня