2013-07-12 4 views
5

с использованием C++получать время компиляции дату и время без макросов

компилировать свой код на автоматизированную графике и нужно использовать время, при котором код был скомпилирован в самом коде. В настоящее время я просто использую макросы __DATE__, __TIME__, чтобы получить дату и время компиляции. Однако это приводит к изменению двоичных файлов, даже если никаких изменений в исходный код (макросы не будут накапливаться во время компиляции), что не очень хорошо (я не хочу, чтобы настройка считала, что бинарный файл изменился, если никаких изменений не было к источнику).

Возможно ли получить время компиляции без использования каких-либо средств, которые могут привести к изменению источника?

Благодаря

+0

Помимо сохранения его в дополнительном файле, который не является частью сборки, я не думаю, что это возможно ... – Nbr44

+2

В таком случае вы можете захотеть, чтобы ваша сборка была построена только в том случае, если есть какие-либо изменения. Перекомпиляция только ради перекомпиляции, когда нет никаких изменений в каких-либо источниках, не имеет большого смысла. –

+2

(Примечание: вы должны отредактировать сообщение и добавить обратные ссылки вокруг имен макросов: «' ... the \ '__DATE __ \', \ '__TIME __ \' макросы ... '", потому что в настоящее время они отображаются полужирным шрифтом и без подчеркивания) –

ответ

3

Стандартных __DATE__ и __TIME__ макросов делать то, что вы наблюдаете, возвращаете зависимую строку времени.

Это зависит от системы (и, возможно, от компилятора) и, в частности, системы сборки (например, GNU make).

Возможным идея могла бы связать в отдельном файле меток времени, что-то вроде (в make синтаксисе)

timestamp.c: 
     date +'const char timestamp[]="%c";' > [email protected] 

program: $(OBJECTS) timestamp.c 
     $(LINKER.cc) $^ -o [email protected] $(LIBES) 
     rm -f timestamp.c 

timestamp.o затем регенерировать и ваш program будет перекомпоновывается на каждом make (так генерируемая программа действительно изменится, но большая часть кода -tru $(OBJECTS) сделает переменную-останется неизменной).


В качестве альтернативы, вы можете, например. регистрировать внутри некоторой базы данных или текстового файла журнала время связывания, например.

program: $(OBJECTS) 
     $(LINKER.cc) $^ -o [email protected] $(LIBES) 
     date +'[email protected] built at %c' >> /var/log/build.log 

(вы можете использовать logger вместо date, чтобы получить, что регистрируется в системном журнале)

Тогда генерируемая program не изменится, но вы вошли где-то накопление метки времени. BTW вы также можете зарегистрировать контрольную сумму (например, $(shell md5sum program) в синтаксисе make) вашей двоичной программы.

+0

Хм, разве это не приведет к тому, что результирующий двоичный файл изменится со сборки на сборку? Так как файл timestamp.c также изменится, и файл timestamp.0 будет связан в двоичном формате? –

+0

Мне нужно сделать так, чтобы окончательные двоичные файлы не менялись, если не произошло фактического изменения источника. –

+0

@ user1322488 Возьмите его первый фрагмент файла makefile, но затем измените строку timestamp.c, добавив зависимость. например 'timestamp.c: $ (OBJECTS)' Это приведет к восстановлению только timestamp.c, если он старше любого из объектов. –

0

Если вы используете двоичные файлы компиляции IN YOUR, у вас будет двоичное изменение.

Существует несколько решений, но я считаю, что основной задачей является то, что если вы регулярно перестраиваете двоичные файлы, это должно быть сделано только в случае фактических изменений (либо в системе сборки, либо в исходном коде). Поэтому сделайте это частью вашей системы сборки, чтобы проверить, есть ли какие-либо изменения, и ничего не строите, если никаких изменений нет. Простой способ сделать это - проверить, что такое «последняя версия» в системе управления версиями для исходного кода. Если последняя версия такая же, как и предыдущая, то ничего не нужно строить. Это сэкономит вам генерирующие сборки, которые идентичны (кроме метки времени сборки), и разрешит проблему storgin __DATE__ и __TIME__ в двоичном формате.

0

Мне непонятно, чего вы хотите.Если это последнее изменение времени файла, получение его будет зависеть от вашей системы и система сборки: что-то вроде -D $(shell ls -l --time-style=long-iso $< | awk '{ print $7, $8 }') может быть использовано в вызове компилятора с помощью GNU make под Linux, для примера . Но, конечно, это означает, что если файл include был изменен, но не источник, время и дата не будут отражать .

Смежные вопросы