2013-06-25 2 views
9

Каковы возможности узнать во время компиляции время и дату (BUILDTIME), чтобы включить в двоичные файлы (исполняемые файлы/библиотеки) информацию о моменте, в котором они были созданы, переносимым образом?Возможно ли получить время (дня) и дату во время компиляции?

У нас есть решение, использующее sh.exe, и требует установки msys под Windows, но мне было интересно, можно ли без него обойтись.

Поиск таких вещей, как «время сборки/дата», «время и дата компиляции» не привели к какому-либо релевантному результату.

Edit:

Когда я узнал о __TIME__, это было тогда возможно найти этот вопрос ранее был задан: Recording the time when you compile a source

ответ

11

Стандартные макросы __DATE__ и __TIME__ макросы делают работу.

Будьте осторожны, чтобы это предоставило вам дату компиляции файла, где они используются. Не дата ссылки. Таким образом, вы должны обрабатывать файл touch каждый раз, когда он создается, или сделать шаг предварительной сборки в MSVC.

The C99 standard says:

6.10.8 Predefined macro names

The following macro names shall be defined by the implementation:

  • __DATE__ : The date of translation of the preprocessing translation unit: a character string literal of the form "Mmm dd yyyy", where the names of the months are the same as those generated by the asctime function, and the first character of dd is a space character if the value is less than 10. If the date of translation is not available, an implementation-defined valid date shall be supplied.
  • __TIME__ : The time of translation of the preprocessing translation unit: a character string literal of the form "hh:mm:ss" as in the time generated by the asctime function. If the time of translation is not available, an implementation-defined valid time shall be supplied.

Я скопировал текст C99 здесь, но эти макросы гораздо старше, чем C99 ... мне не удалось найти стандартный текст для старого C ...

+0

Не только GCC или MVS поддерживают эти макросы, но и любой компилятор ANSI C. На практике вы можете предположить, что все компиляторы C/C++ поддерживают их. –

+0

Правильно. Исправлена. –

+0

@ смысл-материи и Маттье: Можно ли ссылаться на это? Это самое близкое, что я мог найти: http://c0x.coding-guidelines.com/6.10.8.html – Antonio

1

Вы всегда можете написать программу 5-линии, которая вызывает time и strftime и выводит, что в файл, а не с помощью sh. [Я использовал этот подход для обновления «номеров сборки» и/или «номера версии» в прошлом].

1

В дополнение к макросам __DATE__ и __TIME__ вы можете передать значение своей программе во время сборки с помощью макроса.

В вашем Makefile вы можете передать дату во время сборки в макросе:

gcc -Wall -DBUILD_TIME=`date +%d%m%y_%T` tst.c -o tst 

(или использовать любой другой формат date)

затем stringify в вашем коде:

#define STR(x) STR1(x) 
#define STR1(x) #x 

printf("%s\n", STR(BUILD_TIME)); // display build time 
+0

Хороший, но я не думаю, что он переносится в Windows/MinGW, не так ли? – Antonio

+0

@ Антонио отлично работает с MinGW – ouah

+0

build> gcc -Wall -DBUILD_TIME = 'date +% d% m% y_% T' tst.c -o tst gcc: +% d% m% y_% T': Нет таких файла или каталога. , , , , , , tst.c: 4: 8: ошибка: ожидаемые спецификаторы декларации или «...» перед строкой. , , , , , , , , tst.c: 4: 16: ошибка: ожидаемые спецификаторы декларации или «...» перед строкой. , , , , , , Может быть, у вас есть что-то еще? Как получить новую строку в поле комментариев?!? :) – Antonio

-1

Лучшим решением является то, что вы делаете: используйте sh через MSYS, который также предоставляется Git для Windows 2.x в настоящее время и, таким образом, очень широко доступный.

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

touch не доступна на Windows, но есть обходные, что cmd содружественная:

copy /b filename.ext +,, 

(https://superuser.com/questions/10426/windows-equivalent-of-the-linux-command-touch#764721)

Тогда есть проблема, что __DATE__ фиксировано-формат. Хотите строку даты в формате 20180129? Очень жаль. Вы застряли в длинной форме, как это предусмотрено вашим компилятором. Некоторые компиляторы даже локализуют его: в одном проекте, над которым я работал, строка __DATE__ содержала японские символы, когда приложение было создано на машине, установленной в японском языке.

Так что, имея в виду все это, вы можете просто придерживаться MSYS/CoreUtils как широко доступной зависимости. Прими это. Есть тонкая аккуратная магия шага, которую вы можете сделать быстро и легко, используя BASH, который поставляется с Git для Windows, и эти шаги сборки мгновенно перекрестно совместимы с Linux/Mac тоже!