blob: 9cef463c4a8f5687288f1ab0e4fa8910a79775ff [file] [log] [blame]
Austin Schuh1eb16d12015-09-06 17:21:56 -07001## Utility CMake functions.
2
3# ----------------------------------------------------------------------------
4## Convert boolean value to 0 or 1
5macro (bool_to_int VAR)
6 if (${VAR})
7 set (${VAR} 1)
8 else ()
9 set (${VAR} 0)
10 endif ()
11endmacro ()
12
13# ----------------------------------------------------------------------------
14## Extract version numbers from version string.
15function (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)
42endfunction ()
43
44# ----------------------------------------------------------------------------
45## Configure public header files
46function (configure_headers out)
47 set (tmp)
48 foreach (src IN LISTS ARGN)
49 if (IS_ABSOLUTE "${src}")
50 list (APPEND tmp "${src}")
51 elseif (EXISTS "${PROJECT_SOURCE_DIR}/src/${src}.in")
52 configure_file ("${PROJECT_SOURCE_DIR}/src/${src}.in" "${PROJECT_BINARY_DIR}/include/${GFLAGS_INCLUDE_DIR}/${src}" @ONLY)
53 list (APPEND tmp "${PROJECT_BINARY_DIR}/include/${GFLAGS_INCLUDE_DIR}/${src}")
54 else ()
55 configure_file ("${PROJECT_SOURCE_DIR}/src/${src}" "${PROJECT_BINARY_DIR}/include/${GFLAGS_INCLUDE_DIR}/${src}" COPYONLY)
56 list (APPEND tmp "${PROJECT_BINARY_DIR}/include/${GFLAGS_INCLUDE_DIR}/${src}")
57 endif ()
58 endforeach ()
59 set (${out} "${tmp}" PARENT_SCOPE)
60endfunction ()
61
62# ----------------------------------------------------------------------------
63## Configure source files with .in suffix
64function (configure_sources out)
65 set (tmp)
66 foreach (src IN LISTS ARGN)
67 if (src MATCHES ".h$" AND EXISTS "${PROJECT_SOURCE_DIR}/src/${src}.in")
68 configure_file ("${PROJECT_SOURCE_DIR}/src/${src}.in" "${PROJECT_BINARY_DIR}/include/${GFLAGS_INCLUDE_DIR}/${src}" @ONLY)
69 list (APPEND tmp "${PROJECT_BINARY_DIR}/include/${GFLAGS_INCLUDE_DIR}/${src}")
70 else ()
71 list (APPEND tmp "${PROJECT_SOURCE_DIR}/src/${src}")
72 endif ()
73 endforeach ()
74 set (${out} "${tmp}" PARENT_SCOPE)
75endfunction ()
76
77# ----------------------------------------------------------------------------
78## Add usage test
79#
80# Using PASS_REGULAR_EXPRESSION and FAIL_REGULAR_EXPRESSION would
81# do as well, but CMake/CTest does not allow us to specify an
82# expected exit status. Moreover, the execute_test.cmake script
83# sets environment variables needed by the --fromenv/--tryfromenv tests.
84macro (add_gflags_test name expected_rc expected_output unexpected_output cmd)
85 set (args "--test_tmpdir=${PROJECT_BINARY_DIR}/Testing/Temporary"
86 "--srcdir=${PROJECT_SOURCE_DIR}/test")
87 add_test (
88 NAME ${name}
89 COMMAND "${CMAKE_COMMAND}" "-DCOMMAND:STRING=$<TARGET_FILE:${cmd}>;${args};${ARGN}"
90 "-DEXPECTED_RC:STRING=${expected_rc}"
91 "-DEXPECTED_OUTPUT:STRING=${expected_output}"
92 "-DUNEXPECTED_OUTPUT:STRING=${unexpected_output}"
93 -P "${PROJECT_SOURCE_DIR}/cmake/execute_test.cmake"
94 WORKING_DIRECTORY "${GFLAGS_FLAGFILES_DIR}"
95 )
96endmacro ()