Проблема здесь заключается в относительно низком разрешении временных меток модификации файла, что вызывает путаницу в make, когда вы запускаете его дважды подряд очень быстро, как это делает ваш weird.sh
.
В частности, weird.sh
will:
- touch
foo1.c
- run make, который
- восстанавливает
foo1.o
и - восстанавливает
libmine.a
- touch
bar1.c
- run make, который
- восстанавливает
bar1.o
- возможно (см. Ниже) восстанавливает
libmine.a
Если время между шагом 2.2 и шагом 4.2 меньше, чем разрешение метки времени вашей файловой системы, то make видит, что libmine.a
уже имеет такую же метку времени как bar1.o
, и поэтому не перестраивает его.
Разрешение временной метки для файловой системы Linux ext3 составляет 1 секунду.Это объяснение от сопровождающего make описывает проблему более подробно, а также упоминает, что Solaris имеет лучшее разрешение метки времени, что, вероятно, объясняет, почему ваш пример работает там, как ожидалось.
Если это такпроблема для вас в реальном приложении, вы можете попробовать файловую систему ext4, которая имеет временные метки с наносекундным разрешением.В противном случае просто вставьте sleep 1
после каждой команды make в weird.sh
, и проблема исчезнет: -)