Чтобы немного расширить решение JesperE.
Пусть объектный файл зависит от всех целей, от которых зависит исполняемый файл (кроме себя).
Таким образом, если все исполняемые файлы зависят от объектов, то JesperE будет полностью корректным.
В противном случае вы можете перестроить исполняемый файл без обновления метки времени, в случае, если изменяется одна из других зависимостей, но не изменяется ни один из ваших объектных файлов. Таким образом, две вещи, упомянутые в вопросе, «имеет время / дату последней сборки» и «перестроены, если какой-либо из источников был скомпилирован», на самом деле не одно и то же, поэтому это зависит от того, что вы хотите.
В качестве примеров можно привести библиотеку, с которой вы статически ссылаетесь, или какой-то скрипт, который используется для создания ссылок и который сильно меняется, поэтому для удобства разработчиков была сделана зависимость.
Это по-прежнему не обновит временную метку, если вы просто удалите исполняемый файл и перестроите его (возможно, из-за того, что что-то изменилось, что имеет отношение, но не является зависимостью, например, потому что вы взяли последнюю версию компоновщика или вы что-то изменилось в среде, которая влияет на компоновщик и / или make-файл). Поэтому лучше всего скомпилировать объект как часть правила построения исполняемого файла, например:
blah.exe : whatever
rm -f version.o
$(CC) $(CFLAGS) -c version.c
$(CC) $(CFLAGS) $(OBJFILES) version.o -o blah.exe
или что-то еще (вероятно, не .exe, если вы используете make, но вы никогда не знаете). На самом деле обработка ошибок здесь немного хитрая, поскольку version.o не будет удален, если последняя строка не удалась.
Я бы также добавил, что если вы собираетесь выпустить что-то для пользователей (я имею в виду кого-то, кто находится на расстоянии более 10 футов от вашего стола), возможно, в любом случае лучше создать с нуля, а не просто запустить make обновить и отправить его. В противном случае довольно легко испортить make-файл, чтобы вы пропустили зависимость, случайно создали «смешанную версию» и не имели возможности воспроизвести то, что вы отправили.
Ранее я выполнял сборку make-файлов, чтобы номер версии был намеренно саботирован (установлен на «0.0 private build»), если он был собран разработчиком - только сервер сборки установил параметр, используемый для включения правильного номера версии. Для этого проекта просто не имело смысла ставить число на что-то, что не было проверено из-под контроля исходного кода тегами и не было сконструировано оттуда.