1 cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
3 # ----------------------------------------------------------------------------
5 set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
9 # ----------------------------------------------------------------------------
11 set (PROJECT_NAME "gflags")
12 set (PACKAGE_NAME "${PROJECT_NAME}")
13 set (PACKAGE_VERSION "2.1.0")
14 set (PACKAGE_STRING "${PROJECT_NAME} ${PACKAGE_VERSION}")
15 set (PACKAGE_TARNAME "${PROJECT_NAME}-${PACKAGE_VERSION}")
16 set (PACKAGE_BUGREPORT "https://code.google.com/p/gflags/issues/")
18 project (${PROJECT_NAME} CXX)
27 # ----------------------------------------------------------------------------
29 option (BUILD_SHARED_LIBS "Request build of shared libraries." OFF)
30 set (GFLAGS_SHARED_LIBS ${BUILD_SHARED_LIBS})
32 option (BUILD_gflags_LIB "Request build of the multi-threaded gflags library." ON)
33 option (BUILD_gflags_nothreads_LIB "Request build of the single-threaded gflags library." ON)
35 if (NOT BUILD_gflags_LIB AND NOT BUILD_gflags_nothreads_LIB)
36 message (FATAL_ERROR "At least one of BUILD_gflags_LIB and BUILD_gflags_nothreads_LIB must be ON.")
39 option (BUILD_NEGATIVE_COMPILATION_TESTS "Request addition of negative compilation tests." OFF)
40 mark_as_advanced(BUILD_NEGATIVE_COMPILATION_TESTS)
42 set (GFLAGS_NAMESPACE "gflags" CACHE STRING "C++ namespace identifier of gflags library.")
43 mark_as_advanced (GFLAGS_NAMESPACE)
45 mark_as_advanced (CLEAR CMAKE_INSTALL_PREFIX)
46 mark_as_advanced (CMAKE_CONFIGURATION_TYPES)
47 if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CXX_FLAGS AND NOT CMAKE_C_FLAGS)
49 CMAKE_BUILD_TYPE "Release"
50 CACHE STRING "Choose the type of build, options are: None (CMAKE_C_FLAGS and CMAKE_CXX_FLAGS used) Debug Release RelWithDebInfo MinSizeRel."
56 mark_as_advanced(CMAKE_OSX_ARCHITECTURES
57 CMAKE_OSX_DEPLOYMENT_TARGET
61 # ----------------------------------------------------------------------------
63 include (CheckTypeSize)
64 include (CheckIncludeFileCXX)
65 include (CheckCxxSymbolExists)
67 set (GFLAGS_INTTYPES_FORMAT "" CACHE STRING "Format of integer types: \"C99\" (uint32_t), \"BSD\" (u_int32_t), \"VC7\" (__int32)")
68 mark_as_advanced(GFLAGS_INTTYPES_FORMAT)
69 if (NOT GFLAGS_INTTYPES_FORMAT)
70 foreach (type IN ITEMS uint32_t u_int32_t __int32)
71 check_type_size (${type} SIZE LANGUAGE CXX)
73 set (HAVE_${type} TRUE)
75 set (HAVE_${type} FALSE)
79 set_property (CACHE GFLAGS_INTTYPES_FORMAT PROPERTY VALUE C99)
80 elseif (HAVE_u_int32_t)
81 set_property (CACHE GFLAGS_INTTYPES_FORMAT PROPERTY VALUE BSD)
82 set (GFLAGS_INTTYPES_FORMAT BSD)
84 set_property (CACHE GFLAGS_INTTYPES_FORMAT PROPERTY VALUE VC7)
86 mark_as_advanced (CLEAR GFLAGS_INTTYPES_FORMAT)
87 message (FATAL_ERROR "Do not know how to define a 32-bit integer quantity on your system!"
88 " Neither uint32_t, u_int32_t, nor __int32 seem to be available."
89 " Set GFLAGS_INTTYPES_FORMAT to either C99, BSD, or VC7 and try again.")
92 set ("GFLAGS_INTTYPES_FORMAT_${GFLAGS_INTTYPES_FORMAT}" TRUE)
94 foreach (fname IN ITEMS stdint sys/types fnmatch inttypes unistd sys/stat)
95 string (TOUPPER "${fname}" FNAME)
96 string (REGEX REPLACE "/" "_" FNAME "${FNAME}")
97 check_include_file_cxx ("${fname}.h" GFLAGS_HAVE_${FNAME}_H)
100 foreach (fname IN ITEMS strtoll strtoq)
101 string (TOUPPER "${fname}" FNAME)
102 check_cxx_symbol_exists ("${fname}" stdlib.h GFLAGS_HAVE_${FNAME})
105 set (CMAKE_THREAD_PREFER_PTHREAD TRUE)
106 find_package (ThreadsCxx)
107 if (Threads_FOUND AND CMAKE_USE_PTHREADS_INIT)
108 set (GFLAGS_HAVE_PTHREAD TRUE)
109 check_type_size (pthread_rwlock_t GFLAGS_HAVE_RWLOCK LANGUAGE CXX)
111 set (GFLAGS_HAVE_PTHREAD FALSE)
114 if (UNIX AND NOT GFLAGS_HAVE_PTHREAD AND BUILD_gflags_LIB)
115 set_property (CACHE BUILD_gflags_LIB PROPERTY VALUE OFF)
116 message (WARNING "Could not find the <pthread.h> header file."
117 " Disabling the build of the multi-threaded gflags library.")
120 # ----------------------------------------------------------------------------
121 # source files - excluding root subdirectory and/or .in suffix
125 "gflags_completions.h"
134 "gflags_reporting.cc"
135 "gflags_completions.cc"
139 list (APPEND PRIVATE_HDRS "windows_port.h")
140 list (APPEND GFLAGS_SRCS "windows_port.cc")
143 # ----------------------------------------------------------------------------
144 # configure source files
145 if (CMAKE_COMPILER_IS_GNUCXX)
146 set (GFLAGS_ATTRIBUTE_UNUSED "__attribute((unused))")
148 set (GFLAGS_ATTRIBUTE_UNUSED)
151 configure_headers (PUBLIC_HDRS ${PUBLIC_HDRS})
152 configure_sources (PRIVATE_HDRS ${PRIVATE_HDRS})
153 configure_sources (GFLAGS_SRCS ${GFLAGS_SRCS})
155 # ----------------------------------------------------------------------------
157 set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "bin")
158 set (CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")
159 set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY "lib")
161 # ----------------------------------------------------------------------------
163 include_directories ("${PROJECT_SOURCE_DIR}/src")
164 include_directories ("${PROJECT_BINARY_DIR}/include")
165 include_directories ("${PROJECT_BINARY_DIR}/include/${GFLAGS_NAMESPACE}")
168 if (BUILD_gflags_LIB)
169 add_library (gflags ${GFLAGS_SRCS} ${PRIVATE_HDRS} ${PUBLIC_HDRS})
170 if (WIN32 AND BUILD_SHARED_LIBS)
171 set_target_properties (gflags PROPERTIES COMPILE_DEFINITIONS GFLAGS_DLL_EXPORT)
173 list (APPEND LIB_TARGETS gflags)
175 if (BUILD_gflags_nothreads_LIB)
176 add_library (gflags_nothreads ${GFLAGS_SRCS} ${PRIVATE_HDRS} ${PUBLIC_HDRS})
177 if (WIN32 AND BUILD_SHARED_LIBS)
178 set_target_properties (gflags_nothreads PROPERTIES COMPILE_DEFINITIONS "GFLAGS_DLL_EXPORT;NO_THREADS")
180 set_target_properties (gflags_nothreads PROPERTIES COMPILE_DEFINITIONS NO_THREADS)
182 list (APPEND LIB_TARGETS gflags_nothreads)
185 # ----------------------------------------------------------------------------
188 set (RUNTIME_INSTALL_DIR Bin)
189 set (LIBRARY_INSTALL_DIR Lib)
190 set (INCLUDE_INSTALL_DIR Include)
191 set (CONFIG_INSTALL_DIR CMake)
193 set (RUNTIME_INSTALL_DIR bin)
194 set (LIBRARY_INSTALL_DIR lib)
195 set (INCLUDE_INSTALL_DIR include)
196 set (CONFIG_INSTALL_DIR lib/cmake/${PACKAGE_NAME})
199 install (TARGETS ${LIB_TARGETS} DESTINATION ${LIBRARY_INSTALL_DIR} EXPORT gflags-lib)
200 install (FILES ${PUBLIC_HDRS} DESTINATION ${INCLUDE_INSTALL_DIR}/${GFLAGS_NAMESPACE})
202 file (RELATIVE_PATH INSTALL_PREFIX_REL2CONFIG_DIR "${CMAKE_INSTALL_PREFIX}/${CONFIG_INSTALL_DIR}" "${CMAKE_INSTALL_PREFIX}")
203 configure_file (cmake/config.cmake.in "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config-install.cmake" @ONLY)
204 configure_file (cmake/version.cmake.in "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config-version.cmake" @ONLY)
207 FILES "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config-install.cmake"
208 RENAME ${PACKAGE_NAME}-config.cmake
209 DESTINATION ${CONFIG_INSTALL_DIR}
213 FILES "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config-version.cmake"
214 DESTINATION ${CONFIG_INSTALL_DIR}
217 install (EXPORT gflags-lib DESTINATION ${CONFIG_INSTALL_DIR} FILE ${PACKAGE_NAME}-export.cmake)
220 install (PROGRAMS src/gflags_completions.sh DESTINATION ${RUNTIME_INSTALL_DIR})
223 # ----------------------------------------------------------------------------
224 # support direct use of build tree
225 set (INSTALL_PREFIX_REL2CONFIG_DIR .)
226 export (TARGETS ${LIB_TARGETS} FILE "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-export.cmake")
227 export (PACKAGE gflags)
228 configure_file (cmake/config.cmake.in "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config.cmake" @ONLY)
230 # ----------------------------------------------------------------------------
231 # testing - MUST follow the generation of the build tree config file
235 add_subdirectory (test)