При очередной сборке 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 о целостности вселенной и повергло его в глубокую грусть.
It’s awessome dude!