GNU make и файлы из будущего

При очередной сборке OpenWrt я нарвался на довольно своеобразный сбой: после обновления исходников с svn up и привычного запуска make menuconfig сначала в консоль напечатался ворох предупреждений о проблемах со временными метками на файлах, а затем make завис.

Данные сообщения имеют следующий характерный вид:

...
make: Warning: File `/srv/openwrt/trunk/include/toplevel.mk' has modification time 12975 s in the future
make[2]: Warning: File `tools/Makefile' has modification time 12970 s in the future
make[2]: warning:  Clock skew detected.  Your build may be incomplete.
make[1]: Warning: File `/srv/openwrt/trunk/include/package-ipkg.mk' has modification time 12971 s in the future
Collecting package info: done
make[1]: warning:  Clock skew detected.  Your build may be incomplete.
make[2]: Warning: File `tools/Makefile' has modification time 12949 s in the future
make[2]: warning:  Clock skew detected.  Your build may be incomplete.
make[1]: Warning: File `target/linux/cns21xx/Makefile' has modification time 12954 s in the future
Collecting target info: target/linux/cns21xx

Не дождавшись за несколько минут окончания выполнения данной команды, я сбросил процесс при помощи Ctrl+C.

Слова File `X’ has modification time Y s in the future в сопровождении Clock skew detected. недвусмысленно намекают на то, что make не в восторге от файлов, временная метка которых расположена позже текущего момента времени. Стало быть, проблема в этом.

Конечно, можно было бы просто дождаться того срока, когда временная метка на “проблемных” файлах переместится в более разумное прошлое. И хотя в данном случае ждать пришлось бы не так долго – всего около 4 часов, – расхождения во времени могут быть и более длительными, да и тратить лишние несколько часов на ожидание нерационально. Поэтому изобретаем простой велосипед при помощи следующих команд:

# touch currtime
# find . -newer currtime -exec touch {} \;
# rm currtime

Мы создаем новый пустой файл, после чего командой find ищем файлы, промаркированные новее только что созданного. При обнаружении таковых на них выполняется команда touch, изменяющая их временную метку на текущее время. Затем удаляем временный файл. Проверяем – теперь make вновь работает как положено.

В данном случае эта проблема возникла по причине того, что сборочный сервер очень долгое время не запускался и имел существенную рассинхронизацию системного времени. На момент выполнения команды svn up автоматическая синхронизация часов с ntpd все еще не произошла, а на момент попытки запуска make время уже стало откорректировано. Из-за этого обновленные файлы стали иметь временную метку в будущем, что расстроило представление make о целостности вселенной и повергло его в глубокую грусть.

This entry was posted in Разное and tagged , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>