Я знаю, что могу в любой момент прервать make
процесс без необходимости перекомпилировать все дерево исходников. Как я знаю, make
цель компилируется , только если она еще не скомпилирована или исходный код изменен после последней компиляции.
Но если я прерву make
, то наверняка будет один или несколько (в зависимости от уровня параллелизма) наполовину готовых двоичных файлов. Что с ними делать при следующем запуске make
? Или это завершает текущую цель, когда я нажимаю Ctrl+, Cчтобы избежать частично скомпилированных двоичных файлов?
11
Ответы:
Проще говоря, вы можете думать о
make
наличии (возможно, большого) количества шагов, где каждый шаг принимает в качестве входных данных несколько файлов и создает один файл в качестве выходных.Шаг может быть «компилировать
file.c
вfile.o
» или «использоватьld
для ссылкиmain.o
иfile.o
вprogram
». Если прерватьmake
с CtrlC, то шаг в настоящее время выполнения будет прерван , который будет (или должен) удалить выходной файл , он работает на. Обычно там не осталось "полу-готовых двоичных файлов".При перезапуске
make
он будет смотреть на временные метки всех входных и выходных файлов и перезапускать шаги, где:Как правило, это означает, что если выполнение шага занимает много времени (это редко встречается на современных компьютерах, но
ld
шаг для больших программ может легко занять много минут, когда онmake
был разработан), то остановка и перезапускmake
начнут этот шаг с самого начала.Реальность вашего среднего
Makefile
значительно сложнее, чем приведенное выше описание, но основные принципы те же.источник
Ctrl+ Cвызывает
SIGINT
отправку в запущенный процесс. Этот сигнал может быть пойман процессом. В исходном коде make вы можете найти ловушку для этого сигнала вcommands.c
:remove_intermediates()
это функция очисткиmake
, смотрите определение здесь:И позже в функции, которую вы видите, они будут эффективно удалены:
Вывод: как правило, не бойтесь прерывать компиляцию
make
. Если это не неуловимый сигнал (SIGKILL, SIGSEGV, SIGSTOP
), он выполнит очистку промежуточных файлов.источник
SIGSEGV
можно поймать на многих Unices.Когда что-то останавливается
make
(будь то Ctrl-C, завершение работы или даже команда, которая не работает), уже выполненная работа остается. При пересчетеmake
делает как всегда: он вычисляет, что еще нужно сделать (потому что файл изменился илиmake
никогда не должен был его обрабатывать, не имеет значения) и продолжает работу.Вышеприведенное описание явно предполагает, что соответствующие
Makefile
описания и команды должны выполняться правильно, поэтому все, что нужно (пере) сделать, это.источник