038baf3363efed3067963154d116cf2e57f4fde1
[platform/upstream/gflags.git] / cmake / utils.cmake
1 ## Utility CMake functions.
2
3 # ----------------------------------------------------------------------------
4 ## Convert boolean value to 0 or 1
5 macro (bool_to_int VAR)
6   if (${VAR})
7     set (${VAR} 1)
8   else ()
9     set (${VAR} 0)
10   endif ()
11 endmacro ()
12
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]+)?")
17     if (CMAKE_MATCH_1)
18       set (_major ${CMAKE_MATCH_1})
19     else ()
20       set (_major 0)
21     endif ()
22     if (CMAKE_MATCH_2)
23       set (_minor ${CMAKE_MATCH_2})
24       string (REGEX REPLACE "^\\." "" _minor "${_minor}")
25     else ()
26       set (_minor 0)
27     endif ()
28     if (CMAKE_MATCH_3)
29       set (_patch ${CMAKE_MATCH_3})
30       string (REGEX REPLACE "^\\." "" _patch "${_patch}")
31     else ()
32       set (_patch 0)
33     endif ()
34   else ()
35     set (_major 0)
36     set (_minor 0)
37     set (_patch 0)
38   endif ()
39   set ("${major}" "${_major}" PARENT_SCOPE)
40   set ("${minor}" "${_minor}" PARENT_SCOPE)
41   set ("${patch}" "${_patch}" PARENT_SCOPE)
42 endfunction ()
43
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)
49   else ()
50     set (${retvar} FALSE)
51   endif ()
52 endmacro ()
53
54 # ----------------------------------------------------------------------------
55 ## Add gflags configuration variable
56 #
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)
62   if (ARGC GREATER 5)
63     message (FATAL_ERROR "gflags_variable: Too many macro arguments")
64   endif ()
65   if (NOT DEFINED GFLAGS_${varname})
66     if (GFLAGS_IS_SUBPROJECT AND ARGC EQUAL 5)
67       set (GFLAGS_${varname} "${ARGV4}")
68     else ()
69       set (GFLAGS_${varname} "${default}")
70     endif ()
71   endif ()
72   if (GFLAGS_IS_SUBPROJECT)
73     if (NOT DEFINED ${varname})
74       set (${varname} "${GFLAGS_${varname}}")
75     endif ()
76   else ()
77     set (${varname} "${GFLAGS_${varname}}" CACHE ${type} "${docstring}")
78   endif ()
79 endmacro ()
80
81 # ----------------------------------------------------------------------------
82 ## Set property of cached gflags configuration variable
83 macro (gflags_property varname property value)
84   gflags_is_cached (_cached ${varname})
85   if (_cached)
86     if (property STREQUAL ADVANCED)
87       if (${value})
88         mark_as_advanced (FORCE ${varname})
89       else ()
90         mark_as_advanced (CLEAR ${varname})
91       endif ()
92     else ()
93       set_property (CACHE ${varname} PROPERTY "${property}" "${value}")
94     endif ()
95   endif ()
96   unset (_cached)
97 endmacro ()
98
99 # ----------------------------------------------------------------------------
100 ## Modify value of gflags configuration variable
101 macro (gflags_set varname value)
102   gflags_is_cached (_cached ${varname})
103   if (_cached)
104     set_property (CACHE ${varname} PROPERTY VALUE "${value}")
105   else ()
106     set (${varname} "${value}")
107   endif ()
108   unset (_cached)
109 endmacro ()
110
111 # ----------------------------------------------------------------------------
112 ## Configure public header files
113 function (configure_headers out)
114   set (tmp)
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}")
121     else ()
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}")
124     endif ()
125   endforeach ()
126   set (${out} "${tmp}" PARENT_SCOPE)
127 endfunction ()
128
129 # ----------------------------------------------------------------------------
130 ## Configure source files with .in suffix
131 function (configure_sources out)
132   set (tmp)
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}")
137     else ()
138       list (APPEND tmp "${PROJECT_SOURCE_DIR}/src/${src}")
139     endif ()
140   endforeach ()
141   set (${out} "${tmp}" PARENT_SCOPE)
142 endfunction ()
143
144 # ----------------------------------------------------------------------------
145 ## Add usage test
146 #
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")
154   add_test (
155     NAME    ${name}
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}"
162   )
163 endmacro ()