1 ## Utility CMake functions.
3 # ----------------------------------------------------------------------------
4 ## Convert boolean value to 0 or 1
5 macro (bool_to_int VAR)
13 # ----------------------------------------------------------------------------
14 ## Extract version numbers from version string
15 function (version_numbers version major minor patch)
16 if (version MATCHES "([0-9]+)(\\.[0-9]+)?(\\.[0-9]+)?(rc[1-9][0-9]*|[a-z]+)?")
18 set (_major ${CMAKE_MATCH_1})
23 set (_minor ${CMAKE_MATCH_2})
24 string (REGEX REPLACE "^\\." "" _minor "${_minor}")
29 set (_patch ${CMAKE_MATCH_3})
30 string (REGEX REPLACE "^\\." "" _patch "${_patch}")
39 set ("${major}" "${_major}" PARENT_SCOPE)
40 set ("${minor}" "${_minor}" PARENT_SCOPE)
41 set ("${patch}" "${_patch}" PARENT_SCOPE)
44 # ----------------------------------------------------------------------------
45 ## Determine if cache entry exists
46 macro (gflags_is_cached retvar varname)
47 if (DEFINED ${varname})
48 get_property (${retvar} CACHE ${varname} PROPERTY TYPE SET)
54 # ----------------------------------------------------------------------------
55 ## Add gflags configuration variable
57 # The default value of the (cached) configuration value can be overridden either
58 # on the CMake command-line or the super-project by setting the GFLAGS_<varname>
59 # variable. When gflags is a subproject of another project (GFLAGS_IS_SUBPROJECT),
60 # the variable is not added to the CMake cache. Otherwise it is cached.
61 macro (gflags_define type varname docstring default)
63 message (FATAL_ERROR "gflags_variable: Too many macro arguments")
65 if (NOT DEFINED GFLAGS_${varname})
66 if (GFLAGS_IS_SUBPROJECT AND ARGC EQUAL 5)
67 set (GFLAGS_${varname} "${ARGV4}")
69 set (GFLAGS_${varname} "${default}")
72 if (GFLAGS_IS_SUBPROJECT)
73 if (NOT DEFINED ${varname})
74 set (${varname} "${GFLAGS_${varname}}")
77 set (${varname} "${GFLAGS_${varname}}" CACHE ${type} "${docstring}")
81 # ----------------------------------------------------------------------------
82 ## Set property of cached gflags configuration variable
83 macro (gflags_property varname property value)
84 gflags_is_cached (_cached ${varname})
86 if (property STREQUAL ADVANCED)
88 mark_as_advanced (FORCE ${varname})
90 mark_as_advanced (CLEAR ${varname})
93 set_property (CACHE ${varname} PROPERTY "${property}" "${value}")
99 # ----------------------------------------------------------------------------
100 ## Modify value of gflags configuration variable
101 macro (gflags_set varname value)
102 gflags_is_cached (_cached ${varname})
104 set_property (CACHE ${varname} PROPERTY VALUE "${value}")
106 set (${varname} "${value}")
111 # ----------------------------------------------------------------------------
112 ## Configure public header files
113 function (configure_headers out)
115 foreach (src IN LISTS ARGN)
116 if (IS_ABSOLUTE "${src}")
117 list (APPEND tmp "${src}")
118 elseif (EXISTS "${PROJECT_SOURCE_DIR}/src/${src}.in")
119 configure_file ("${PROJECT_SOURCE_DIR}/src/${src}.in" "${PROJECT_BINARY_DIR}/include/${GFLAGS_INCLUDE_DIR}/${src}" @ONLY)
120 list (APPEND tmp "${PROJECT_BINARY_DIR}/include/${GFLAGS_INCLUDE_DIR}/${src}")
122 configure_file ("${PROJECT_SOURCE_DIR}/src/${src}" "${PROJECT_BINARY_DIR}/include/${GFLAGS_INCLUDE_DIR}/${src}" COPYONLY)
123 list (APPEND tmp "${PROJECT_BINARY_DIR}/include/${GFLAGS_INCLUDE_DIR}/${src}")
126 set (${out} "${tmp}" PARENT_SCOPE)
129 # ----------------------------------------------------------------------------
130 ## Configure source files with .in suffix
131 function (configure_sources out)
133 foreach (src IN LISTS ARGN)
134 if (src MATCHES ".h$" AND EXISTS "${PROJECT_SOURCE_DIR}/src/${src}.in")
135 configure_file ("${PROJECT_SOURCE_DIR}/src/${src}.in" "${PROJECT_BINARY_DIR}/include/${GFLAGS_INCLUDE_DIR}/${src}" @ONLY)
136 list (APPEND tmp "${PROJECT_BINARY_DIR}/include/${GFLAGS_INCLUDE_DIR}/${src}")
138 list (APPEND tmp "${PROJECT_SOURCE_DIR}/src/${src}")
141 set (${out} "${tmp}" PARENT_SCOPE)
144 # ----------------------------------------------------------------------------
147 # Using PASS_REGULAR_EXPRESSION and FAIL_REGULAR_EXPRESSION would
148 # do as well, but CMake/CTest does not allow us to specify an
149 # expected exit status. Moreover, the execute_test.cmake script
150 # sets environment variables needed by the --fromenv/--tryfromenv tests.
151 macro (add_gflags_test name expected_rc expected_output unexpected_output cmd)
152 set (args "--test_tmpdir=${PROJECT_BINARY_DIR}/Testing/Temporary"
153 "--srcdir=${PROJECT_SOURCE_DIR}/test")
156 COMMAND "${CMAKE_COMMAND}" "-DCOMMAND:STRING=$<TARGET_FILE:${cmd}>;${args};${ARGN}"
157 "-DEXPECTED_RC:STRING=${expected_rc}"
158 "-DEXPECTED_OUTPUT:STRING=${expected_output}"
159 "-DUNEXPECTED_OUTPUT:STRING=${unexpected_output}"
160 -P "${PROJECT_SOURCE_DIR}/cmake/execute_test.cmake"
161 WORKING_DIRECTORY "${GFLAGS_FLAGFILES_DIR}"