GetDate.cmake 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. cmake_minimum_required(VERSION 2.2)
  2. macro(GET_DATE)
  3. #
  4. # All macro arguments are optional.
  5. # If there's an ARGV0, use it as GD_PREFIX. Default = 'GD_'
  6. # If there's an ARGV1, use it as ${GD_PREFIX}VERBOSE. Default = '0'
  7. #
  8. # If the date can be retrieved and parsed successfully, this macro
  9. # will set the following CMake variables:
  10. #
  11. # GD_PREFIX
  12. # ${GD_PREFIX}PREFIX (if '${GD_PREFIX}' is not 'GD_'...!)
  13. # ${GD_PREFIX}VERBOSE
  14. #
  15. # ${GD_PREFIX}CMD
  16. # ${GD_PREFIX}ARGS
  17. # ${GD_PREFIX}OV
  18. # ${GD_PREFIX}RV
  19. #
  20. # ${GD_PREFIX}REGEX
  21. # ${GD_PREFIX}YEAR
  22. # ${GD_PREFIX}MONTH
  23. # ${GD_PREFIX}DAY
  24. # ${GD_PREFIX}HOUR
  25. # ${GD_PREFIX}MINUTE
  26. # ${GD_PREFIX}SECOND
  27. # ${GD_PREFIX}FRACTIONAL_SECOND
  28. # ${GD_PREFIX}DAY_OF_WEEK
  29. #
  30. # Caller can then use these variables to construct names based on
  31. # date and time stamps...
  32. #
  33. # If there's an ARGV0, use it as GD_PREFIX:
  34. #
  35. set(GD_PREFIX "GD_")
  36. if(NOT "${ARGV0}" STREQUAL "")
  37. set(GD_PREFIX "${ARGV0}")
  38. endif()
  39. if(NOT "${GD_PREFIX}" STREQUAL "GD_")
  40. set(${GD_PREFIX}PREFIX "${GD_PREFIX}")
  41. endif()
  42. # If there's an ARGV1, use it as ${GD_PREFIX}VERBOSE:
  43. #
  44. set(${GD_PREFIX}VERBOSE "0")
  45. if(NOT "${ARGV1}" STREQUAL "")
  46. set(${GD_PREFIX}VERBOSE "${ARGV1}")
  47. endif()
  48. # Retrieve the current date and time in the format:
  49. #
  50. # Thu 01/12/2006 8:55:12.01
  51. # dow mm/dd/YYYY HH:MM:SS.ssssss
  52. #
  53. # Use "echo %DATE% %TIME%" on Windows.
  54. # Otherwise, try "date" as implemented on most Unix flavors.
  55. #
  56. if(WIN32)
  57. #
  58. # Use "cmd" shell with %DATE% and %TIME% support...
  59. # May need adjustment in different locales or for custom date/time formats
  60. # set in the Windows Control Panel.
  61. #
  62. set(${GD_PREFIX}CMD "cmd")
  63. set(${GD_PREFIX}ARGS "/c echo %DATE% %TIME%")
  64. else()
  65. #
  66. # Match the format returned by default in US English Windows:
  67. #
  68. set(${GD_PREFIX}CMD "date")
  69. set(${GD_PREFIX}ARGS "\"+%a %m/%d/%Y %H:%M:%S.00\"")
  70. endif()
  71. exec_program("${${GD_PREFIX}CMD}" "." ARGS "${${GD_PREFIX}ARGS}"
  72. OUTPUT_VARIABLE ${GD_PREFIX}OV RETURN_VALUE ${GD_PREFIX}RV
  73. )
  74. if(${GD_PREFIX}VERBOSE)
  75. message(STATUS "")
  76. message(STATUS "<GET_DATE>")
  77. message(STATUS "")
  78. message(STATUS "GD_PREFIX='${GD_PREFIX}'")
  79. if(NOT "${GD_PREFIX}" STREQUAL "GD_")
  80. message(STATUS "${GD_PREFIX}PREFIX='${${GD_PREFIX}PREFIX}'")
  81. endif()
  82. message(STATUS "${GD_PREFIX}VERBOSE='${${GD_PREFIX}VERBOSE}'")
  83. message(STATUS "")
  84. message(STATUS "${GD_PREFIX}CMD='${${GD_PREFIX}CMD}'")
  85. message(STATUS "${GD_PREFIX}ARGS='${${GD_PREFIX}ARGS}'")
  86. message(STATUS "${GD_PREFIX}OV='${${GD_PREFIX}OV}'")
  87. message(STATUS "${GD_PREFIX}RV='${${GD_PREFIX}RV}'")
  88. message(STATUS "")
  89. endif()
  90. if("${${GD_PREFIX}RV}" STREQUAL "0")
  91. #
  92. # Extract eight individual components by matching a regex with paren groupings.
  93. # Use the replace functionality and \\1 thru \\8 to extract components.
  94. #
  95. set(${GD_PREFIX}REGEX "([^ ]+) +([^/]+)/([^/]+)/([^ ]+) +([^:]+):([^:]+):([^\\.]+)\\.(.*)")
  96. string(REGEX REPLACE "${${GD_PREFIX}REGEX}" "\\1" ${GD_PREFIX}DAY_OF_WEEK "${${GD_PREFIX}OV}")
  97. string(REGEX REPLACE "${${GD_PREFIX}REGEX}" "\\2" ${GD_PREFIX}MONTH "${${GD_PREFIX}OV}")
  98. string(REGEX REPLACE "${${GD_PREFIX}REGEX}" "\\3" ${GD_PREFIX}DAY "${${GD_PREFIX}OV}")
  99. string(REGEX REPLACE "${${GD_PREFIX}REGEX}" "\\4" ${GD_PREFIX}YEAR "${${GD_PREFIX}OV}")
  100. string(REGEX REPLACE "${${GD_PREFIX}REGEX}" "\\5" ${GD_PREFIX}HOUR "${${GD_PREFIX}OV}")
  101. string(REGEX REPLACE "${${GD_PREFIX}REGEX}" "\\6" ${GD_PREFIX}MINUTE "${${GD_PREFIX}OV}")
  102. string(REGEX REPLACE "${${GD_PREFIX}REGEX}" "\\7" ${GD_PREFIX}SECOND "${${GD_PREFIX}OV}")
  103. string(REGEX REPLACE "${${GD_PREFIX}REGEX}" "\\8" ${GD_PREFIX}FRACTIONAL_SECOND "${${GD_PREFIX}OV}")
  104. #
  105. # Verify that extracted components don't have anything obviously
  106. # wrong with them... Emit warnings if something looks suspicious...
  107. #
  108. # Expecting a four digit year:
  109. #
  110. if(NOT "${${GD_PREFIX}YEAR}" MATCHES "^[0-9][0-9][0-9][0-9]$")
  111. message(STATUS "WARNING: Extracted ${GD_PREFIX}YEAR='${${GD_PREFIX}YEAR}' is not a four digit number...")
  112. endif()
  113. # Expecting month to be <= 12:
  114. #
  115. if(${${GD_PREFIX}MONTH} GREATER 12)
  116. message(STATUS "WARNING: Extracted ${GD_PREFIX}MONTH='${${GD_PREFIX}MONTH}' is greater than 12!")
  117. endif()
  118. # Expecting day to be <= 31:
  119. #
  120. if(${${GD_PREFIX}DAY} GREATER 31)
  121. message(STATUS "WARNING: Extracted ${GD_PREFIX}DAY='${${GD_PREFIX}DAY}' is greater than 31!")
  122. endif()
  123. # Expecting hour to be <= 23:
  124. #
  125. if(${${GD_PREFIX}HOUR} GREATER 23)
  126. message(STATUS "WARNING: Extracted ${GD_PREFIX}HOUR='${${GD_PREFIX}HOUR}' is greater than 23!")
  127. endif()
  128. # Expecting minute to be <= 59:
  129. #
  130. if(${${GD_PREFIX}MINUTE} GREATER 59)
  131. message(STATUS "WARNING: Extracted ${GD_PREFIX}MINUTE='${${GD_PREFIX}MINUTE}' is greater than 59!")
  132. endif()
  133. # Expecting second to be <= 59:
  134. #
  135. if(${${GD_PREFIX}SECOND} GREATER 59)
  136. message(STATUS "WARNING: Extracted ${GD_PREFIX}SECOND='${${GD_PREFIX}SECOND}' is greater than 59!")
  137. endif()
  138. # If individual components are single digit,
  139. # prepend a leading zero:
  140. #
  141. if("${${GD_PREFIX}YEAR}" MATCHES "^[0-9]$")
  142. set(${GD_PREFIX}YEAR "0${${GD_PREFIX}YEAR}")
  143. endif()
  144. if("${${GD_PREFIX}MONTH}" MATCHES "^[0-9]$")
  145. set(${GD_PREFIX}MONTH "0${${GD_PREFIX}MONTH}")
  146. endif()
  147. if("${${GD_PREFIX}DAY}" MATCHES "^[0-9]$")
  148. set(${GD_PREFIX}DAY "0${${GD_PREFIX}DAY}")
  149. endif()
  150. if("${${GD_PREFIX}HOUR}" MATCHES "^[0-9]$")
  151. set(${GD_PREFIX}HOUR "0${${GD_PREFIX}HOUR}")
  152. endif()
  153. if("${${GD_PREFIX}MINUTE}" MATCHES "^[0-9]$")
  154. set(${GD_PREFIX}MINUTE "0${${GD_PREFIX}MINUTE}")
  155. endif()
  156. if("${${GD_PREFIX}SECOND}" MATCHES "^[0-9]$")
  157. set(${GD_PREFIX}SECOND "0${${GD_PREFIX}SECOND}")
  158. endif()
  159. if(${GD_PREFIX}VERBOSE)
  160. message(STATUS "${GD_PREFIX}REGEX='${${GD_PREFIX}REGEX}'")
  161. message(STATUS "${GD_PREFIX}YEAR='${${GD_PREFIX}YEAR}'")
  162. message(STATUS "${GD_PREFIX}MONTH='${${GD_PREFIX}MONTH}'")
  163. message(STATUS "${GD_PREFIX}DAY='${${GD_PREFIX}DAY}'")
  164. message(STATUS "${GD_PREFIX}HOUR='${${GD_PREFIX}HOUR}'")
  165. message(STATUS "${GD_PREFIX}MINUTE='${${GD_PREFIX}MINUTE}'")
  166. message(STATUS "${GD_PREFIX}SECOND='${${GD_PREFIX}SECOND}'")
  167. message(STATUS "${GD_PREFIX}FRACTIONAL_SECOND='${${GD_PREFIX}FRACTIONAL_SECOND}'")
  168. message(STATUS "${GD_PREFIX}DAY_OF_WEEK='${${GD_PREFIX}DAY_OF_WEEK}'")
  169. message(STATUS "")
  170. message(STATUS "Counters that change...")
  171. message(STATUS "")
  172. message(STATUS "...very very quickly : ${${GD_PREFIX}YEAR}${${GD_PREFIX}MONTH}${${GD_PREFIX}DAY}${${GD_PREFIX}HOUR}${${GD_PREFIX}MINUTE}${${GD_PREFIX}SECOND}${${GD_PREFIX}FRACTIONAL_SECOND}")
  173. message(STATUS " every second : ${${GD_PREFIX}YEAR}${${GD_PREFIX}MONTH}${${GD_PREFIX}DAY}${${GD_PREFIX}HOUR}${${GD_PREFIX}MINUTE}${${GD_PREFIX}SECOND}")
  174. message(STATUS " daily : ${${GD_PREFIX}YEAR}${${GD_PREFIX}MONTH}${${GD_PREFIX}DAY}")
  175. message(STATUS " monthly : ${${GD_PREFIX}YEAR}${${GD_PREFIX}MONTH}")
  176. message(STATUS " annually : ${${GD_PREFIX}YEAR}")
  177. message(STATUS "")
  178. endif()
  179. else()
  180. message(SEND_ERROR "ERROR: macro(GET_DATE) failed. ${GD_PREFIX}CMD='${${GD_PREFIX}CMD}' ${GD_PREFIX}ARGS='${${GD_PREFIX}ARGS}' ${GD_PREFIX}OV='${${GD_PREFIX}OV}' ${GD_PREFIX}RV='${${GD_PREFIX}RV}'")
  181. endif()
  182. if(${GD_PREFIX}VERBOSE)
  183. message(STATUS "</GET_DATE>")
  184. message(STATUS "")
  185. endif()
  186. endmacro()
  187. macro(ADD_SECONDS sec)
  188. set(new_min ${${GD_PREFIX}MINUTE})
  189. set(new_hr ${${GD_PREFIX}HOUR})
  190. math(EXPR new_sec "${sec} + ${${GD_PREFIX}SECOND}")
  191. while(${new_sec} GREATER 60 OR ${new_sec} EQUAL 60)
  192. math(EXPR new_sec "${new_sec} - 60")
  193. math(EXPR new_min "${${GD_PREFIX}MINUTE} + 1")
  194. endwhile()
  195. while(${new_min} GREATER 60 OR ${new_min} EQUAL 60)
  196. math(EXPR new_min "${new_min} - 60")
  197. math(EXPR new_hr "${${GD_PREFIX}HOUR} + 1")
  198. endwhile()
  199. math(EXPR new_hr "${new_hr} % 24")
  200. # Pad the H, M, S if needed
  201. string(LENGTH ${new_sec} sec_len)
  202. string(LENGTH ${new_min} min_len)
  203. string(LENGTH ${new_hr} hr_len)
  204. if(${sec_len} EQUAL 1)
  205. set(new_sec "0${new_sec}")
  206. endif()
  207. if(${min_len} EQUAL 1)
  208. set(new_min "0${new_min}")
  209. endif()
  210. if(${hr_len} EQUAL 1)
  211. set(new_hr "0${new_hr}")
  212. endif()
  213. endmacro()