1 cmake_minimum_required (VERSION 2.8.4 FATAL_ERROR)
3 # ----------------------------------------------------------------------------
5 set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
8 # ----------------------------------------------------------------------------
10 set (PACKAGE_NAME "gflags")
11 set (PACKAGE_VERSION "2.1.1")
12 set (PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
13 set (PACKAGE_TARNAME "${PACKAGE_NAME}-${PACKAGE_VERSION}")
14 set (PACKAGE_BUGREPORT "https://code.google.com/p/gflags/issues/")
16 project (${PACKAGE_NAME} CXX)
25 set (PACKAGE_SOVERSION "${PACKAGE_VERSION_MAJOR}")
27 # ----------------------------------------------------------------------------
29 set (GFLAGS_NAMESPACE "${PACKAGE_NAME}" CACHE STRING "C++ namespace identifier of gflags library.")
30 set (GFLAGS_INCLUDE_DIR "${PACKAGE_NAME}" CACHE STRING "Include subdirectory of gflags header files.")
32 if (IS_ABSOLUTE GFLAGS_INCLUDE_DIR)
33 message (FATAL_ERROR "GFLAGS_INCLUDE_DIR must be a path relative to CMAKE_INSTALL_PREFIX/include")
35 if (GFLAGS_INCLUDE_DIR MATCHES "^\\.\\.[/\\]")
36 message (FATAL_ERROR "GFLAGS_INCLUDE_DIR must not start with parent directory reference (../)")
39 option (BUILD_SHARED_LIBS "Request build of shared libraries." OFF)
40 option (BUILD_STATIC_LIBS "Request build of static libraries (default if BUILD_SHARED_LIBS is OFF)." OFF)
41 option (BUILD_gflags_LIB "Request build of the multi-threaded gflags library." ON)
42 option (BUILD_gflags_nothreads_LIB "Request build of the single-threaded gflags library." ON)
43 option (BUILD_PACKAGING "Enable build of distribution packages using CPack." OFF)
44 option (BUILD_TESTING "Enable build of the unit tests and their execution using CTest." OFF)
45 option (BUILD_NC_TESTS "Request addition of negative compilation tests." OFF)
46 option (INSTALL_HEADERS "Request packaging of headers and other development files." ON)
48 mark_as_advanced (CLEAR CMAKE_INSTALL_PREFIX)
49 mark_as_advanced (CMAKE_CONFIGURATION_TYPES
56 mark_as_advanced(CMAKE_OSX_ARCHITECTURES
57 CMAKE_OSX_DEPLOYMENT_TARGET
61 if (NOT BUILD_SHARED_LIBS AND NOT BUILD_STATIC_LIBS)
62 set (BUILD_STATIC_LIBS ON)
64 if (NOT BUILD_gflags_LIB AND NOT BUILD_gflags_nothreads_LIB)
65 message (FATAL_ERROR "At least one of BUILD_gflags_LIB and BUILD_gflags_nothreads_LIB must be ON.")
68 if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CXX_FLAGS)
69 set_property (CACHE CMAKE_BUILD_TYPE PROPERTY VALUE Release)
72 # ----------------------------------------------------------------------------
74 include (CheckTypeSize)
75 include (CheckIncludeFileCXX)
76 include (CheckCXXSymbolExists)
78 if (WIN32 AND NOT CYGWIN)
85 set (HAVE_SYS_TYPES_H 1)
87 set (HAVE_STDDEF_H 1) # used by CheckTypeSize module
88 set (HAVE_INTTYPES_H 0)
90 set (HAVE_SYS_STAT_H 1)
91 set (HAVE_SHLWAPI_H 1)
93 foreach (fname IN ITEMS unistd stdint inttypes sys/types sys/stat fnmatch)
94 string (TOUPPER "${fname}" FNAME)
95 string (REPLACE "/" "_" FNAME "${FNAME}")
96 if (NOT HAVE_${FNAME}_H)
97 check_include_file_cxx ("${fname}.h" HAVE_${FNAME}_H)
100 # the following are used in #if directives not #ifdef
101 bool_to_int (HAVE_STDINT_H)
102 bool_to_int (HAVE_SYS_TYPES_H)
103 bool_to_int (HAVE_INTTYPES_H)
104 if (NOT HAVE_FNMATCH_H AND OS_WINDOWS)
105 check_include_file_cxx ("shlwapi.h" HAVE_SHLWAPI_H)
109 set (GFLAGS_INTTYPES_FORMAT "" CACHE STRING "Format of integer types: \"C99\" (uint32_t), \"BSD\" (u_int32_t), \"VC7\" (__int32)")
110 set_property (CACHE GFLAGS_INTTYPES_FORMAT PROPERTY STRINGS "C99;BSD;VC7")
111 mark_as_advanced (GFLAGS_INTTYPES_FORMAT)
112 if (NOT GFLAGS_INTTYPES_FORMAT)
113 set (TYPES uint32_t u_int32_t)
115 list (INSERT TYPES 0 __int32)
117 foreach (type IN LISTS TYPES)
118 check_type_size (${type} ${type} LANGUAGE CXX)
124 set_property (CACHE GFLAGS_INTTYPES_FORMAT PROPERTY VALUE C99)
125 elseif (HAVE_u_int32_t)
126 set_property (CACHE GFLAGS_INTTYPES_FORMAT PROPERTY VALUE BSD)
127 elseif (HAVE___int32)
128 set_property (CACHE GFLAGS_INTTYPES_FORMAT PROPERTY VALUE VC7)
130 mark_as_advanced (CLEAR GFLAGS_INTTYPES_FORMAT)
131 message (FATAL_ERROR "Do not know how to define a 32-bit integer quantity on your system!"
132 " Neither uint32_t, u_int32_t, nor __int32 seem to be available."
133 " Set GFLAGS_INTTYPES_FORMAT to either C99, BSD, or VC7 and try again.")
136 # use of special characters in strings to circumvent bug #0008226
137 if ("^${GFLAGS_INTTYPES_FORMAT}$" STREQUAL "^WIN$")
138 set_property (CACHE GFLAGS_INTTYPES_FORMAT PROPERTY VALUE VC7)
140 if (NOT GFLAGS_INTTYPES_FORMAT MATCHES "^(C99|BSD|VC7)$")
141 message (FATAL_ERROR "Invalid value for GFLAGS_INTTYPES_FORMAT! Choose one of \"C99\", \"BSD\", or \"VC7\"")
143 set (GFLAGS_INTTYPES_FORMAT_C99 0)
144 set (GFLAGS_INTTYPES_FORMAT_BSD 0)
145 set (GFLAGS_INTTYPES_FORMAT_VC7 0)
146 set ("GFLAGS_INTTYPES_FORMAT_${GFLAGS_INTTYPES_FORMAT}" 1)
152 check_cxx_symbol_exists (strtoll stdlib.h HAVE_STRTOLL)
153 if (NOT HAVE_STRTOLL)
154 check_cxx_symbol_exists (strtoq stdlib.h HAVE_STRTOQ)
158 set (CMAKE_THREAD_PREFER_PTHREAD TRUE)
159 find_package (ThreadsCXX)
160 if (Threads_FOUND AND CMAKE_USE_PTHREADS_INIT)
162 check_type_size (pthread_rwlock_t RWLOCK LANGUAGE CXX)
167 if (UNIX AND NOT HAVE_PTHREAD AND BUILD_gflags_LIB)
168 if (CMAKE_HAVE_PTHREAD_H)
173 message (FATAL_ERROR "Could not find pthread${what}. Check the log file"
174 "\n\t${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log"
175 "\nor disable the build of the multi-threaded gflags library (BUILD_gflags_LIB=OFF).")
178 # ----------------------------------------------------------------------------
179 # source files - excluding root subdirectory and/or .in suffix
183 "gflags_completions.h"
194 "gflags_reporting.cc"
195 "gflags_completions.cc"
199 list (APPEND PRIVATE_HDRS "windows_port.h")
200 list (APPEND GFLAGS_SRCS "windows_port.cc")
203 # ----------------------------------------------------------------------------
204 # configure source files
205 if (CMAKE_COMPILER_IS_GNUCXX)
206 set (GFLAGS_ATTRIBUTE_UNUSED "__attribute((unused))")
208 set (GFLAGS_ATTRIBUTE_UNUSED)
211 # whenever we build a shared library (DLL on Windows), configure the public
212 # headers of the API for use of this library rather than the optionally
213 # also build statically linked library; users can override GFLAGS_DLL_DECL
214 if (BUILD_SHARED_LIBS)
215 set (GFLAGS_IS_A_DLL 1)
217 set (GFLAGS_IS_A_DLL 0)
220 configure_headers (PUBLIC_HDRS ${PUBLIC_HDRS})
221 configure_sources (PRIVATE_HDRS ${PRIVATE_HDRS})
222 configure_sources (GFLAGS_SRCS ${GFLAGS_SRCS})
224 include_directories ("${PROJECT_SOURCE_DIR}/src")
225 include_directories ("${PROJECT_BINARY_DIR}/include")
226 include_directories ("${PROJECT_BINARY_DIR}/include/${GFLAGS_INCLUDE_DIR}")
228 # ----------------------------------------------------------------------------
230 set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "bin")
231 set (CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")
232 set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY "lib")
234 # ----------------------------------------------------------------------------
235 # add library targets
238 foreach (TYPE IN ITEMS STATIC SHARED)
239 if (BUILD_${TYPE}_LIBS)
240 # whether or not targets are a DLL
241 if (OS_WINDOWS AND "^${TYPE}$" STREQUAL "^SHARED$")
242 set (GFLAGS_IS_A_DLL 1)
244 set (GFLAGS_IS_A_DLL 0)
246 string (TOLOWER "${TYPE}" type)
247 # multi-threaded vs. single-threaded
248 foreach (opts IN ITEMS "" _nothreads)
249 if (BUILD_gflags${opts}_LIB)
250 add_library (gflags${opts}-${type} ${TYPE} ${GFLAGS_SRCS} ${PRIVATE_HDRS} ${PUBLIC_HDRS})
251 if (opts MATCHES "nothreads")
252 set (defines "GFLAGS_IS_A_DLL=${GFLAGS_IS_A_DLL};NOTHREADS")
254 set (defines "GFLAGS_IS_A_DLL=${GFLAGS_IS_A_DLL}")
255 if (CMAKE_USE_PTHREADS_INIT)
256 target_link_libraries (gflags${opts}-${type} ${CMAKE_THREAD_LIBS_INIT})
259 set_target_properties (
260 gflags${opts}-${type} PROPERTIES COMPILE_DEFINITIONS "${defines}"
261 OUTPUT_NAME "gflags${opts}"
262 VERSION "${PACKAGE_VERSION}"
263 SOVERSION "${PACKAGE_SOVERSION}"
266 target_link_libraries (gflags${opts}-${type} shlwapi.lib)
268 if (NOT TARGET gflags${opts})
269 add_custom_target (gflags${opts})
271 add_dependencies (gflags${opts} gflags${opts}-${type})
272 list (APPEND TARGETS gflags${opts}-${type})
278 # ----------------------------------------------------------------------------
281 set (RUNTIME_INSTALL_DIR Bin)
282 set (LIBRARY_INSTALL_DIR Lib)
283 set (INCLUDE_INSTALL_DIR Include)
284 set (CONFIG_INSTALL_DIR CMake)
286 set (RUNTIME_INSTALL_DIR bin)
287 # The LIB_INSTALL_DIR and LIB_SUFFIX variables are used by the Fedora
288 # package maintainers. Also package maintainers of other distribution
289 # packages need to be able to specify the name of the library directory.
290 if (NOT LIB_INSTALL_DIR)
291 set (LIB_INSTALL_DIR "lib${LIB_SUFFIX}")
293 set (LIBRARY_INSTALL_DIR "${LIB_INSTALL_DIR}"
294 CACHE PATH "Directory of installed libraries, e.g., \"lib64\""
296 mark_as_advanced (LIBRARY_INSTALL_DIR)
297 set (INCLUDE_INSTALL_DIR include)
298 set (CONFIG_INSTALL_DIR ${LIBRARY_INSTALL_DIR}/cmake/${PACKAGE_NAME})
301 file (RELATIVE_PATH INSTALL_PREFIX_REL2CONFIG_DIR "${CMAKE_INSTALL_PREFIX}/${CONFIG_INSTALL_DIR}" "${CMAKE_INSTALL_PREFIX}")
302 configure_file (cmake/config.cmake.in "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config-install.cmake" @ONLY)
303 configure_file (cmake/version.cmake.in "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config-version.cmake" @ONLY)
305 install (TARGETS ${TARGETS} DESTINATION ${LIBRARY_INSTALL_DIR} EXPORT gflags-lib)
307 install (FILES ${PUBLIC_HDRS} DESTINATION ${INCLUDE_INSTALL_DIR}/${GFLAGS_INCLUDE_DIR})
309 FILES "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config-install.cmake"
310 RENAME ${PACKAGE_NAME}-config.cmake
311 DESTINATION ${CONFIG_INSTALL_DIR}
314 FILES "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config-version.cmake"
315 DESTINATION ${CONFIG_INSTALL_DIR}
317 install (EXPORT gflags-lib DESTINATION ${CONFIG_INSTALL_DIR} FILE ${PACKAGE_NAME}-export.cmake)
319 install (PROGRAMS src/gflags_completions.sh DESTINATION ${RUNTIME_INSTALL_DIR})
323 # ----------------------------------------------------------------------------
324 # support direct use of build tree
325 set (INSTALL_PREFIX_REL2CONFIG_DIR .)
326 export (TARGETS ${TARGETS} FILE "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-export.cmake")
327 export (PACKAGE gflags)
328 configure_file (cmake/config.cmake.in "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config.cmake" @ONLY)
330 # ----------------------------------------------------------------------------
331 # testing - MUST follow the generation of the build tree config file
335 add_subdirectory (test)
338 # ----------------------------------------------------------------------------
342 if (NOT BUILD_SHARED_LIBS AND NOT INSTALL_HEADERS)
343 message (WARNING "Package will contain static libraries without headers!"
344 "\nRecommended options for generation of runtime package:"
345 "\n BUILD_SHARED_LIBS=ON"
346 "\n BUILD_STATIC_LIBS=OFF"
347 "\n INSTALL_HEADERS=OFF"
348 "\nRecommended options for generation of development package:"
349 "\n BUILD_SHARED_LIBS=ON"
350 "\n BUILD_STATIC_LIBS=ON"
351 "\n INSTALL_HEADERS=ON")
354 # default package generators
356 set (PACKAGE_GENERATOR "PackageMaker")
357 set (PACKAGE_SOURCE_GENERATOR "TGZ;ZIP")
359 set (PACKAGE_GENERATOR "DEB;RPM")
360 set (PACKAGE_SOURCE_GENERATOR "TGZ;ZIP")
362 set (PACKAGE_GENERATOR "ZIP")
363 set (PACKAGE_SOURCE_GENERATOR "ZIP")
366 # used package generators
367 set (CPACK_GENERATOR "${PACKAGE_GENERATOR}" CACHE STRING "List of binary package generators (CPack).")
368 set (CPACK_SOURCE_GENERATOR "${PACKAGE_SOURCE_GENERATOR}" CACHE STRING "List of source package generators (CPack).")
369 mark_as_advanced (CPACK_GENERATOR CPACK_SOURCE_GENERATOR)
371 # common package information
372 set (CPACK_PACKAGE_VENDOR "Andreas Schuh")
373 set (CPACK_PACKAGE_CONTACT "google-gflags@googlegroups.com")
374 set (CPACK_PACKAGE_NAME "${PACKAGE_NAME}")
375 set (CPACK_PACKAGE_VERSION "${PACKAGE_VERSION}")
376 set (CPACK_PACKAGE_VERSION_MAJOR "${PACKAGE_VERSION_MAJOR}")
377 set (CPACK_PACKAGE_VERSION_MINOR "${PACKAGE_VERSION_MINOR}")
378 set (CPACK_PACKAGE_VERSION_PATCH "${PACKAGE_VERSION_PATCH}")
379 set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "A commandline flags library that allows for distributed flags.")
380 set (CPACK_RESOURCE_FILE_WELCOME "${CMAKE_CURRENT_LIST_DIR}/README.txt")
381 set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_LIST_DIR}/COPYING.txt")
382 set (CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_LIST_DIR}/README.txt")
383 set (CPACK_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
384 set (CPACK_OUTPUT_FILE_PREFIX packages)
385 set (CPACK_PACKAGE_RELOCATABLE TRUE)
386 set (CPACK_MONOLITHIC_INSTALL TRUE)
388 # RPM package information -- used in cmake/package.cmake.in also for DEB
389 set (CPACK_RPM_PACKAGE_GROUP "Development/Libraries")
390 set (CPACK_RPM_PACKAGE_LICENSE "BSD")
391 set (CPACK_RPM_PACKAGE_URL "http://code.google.com/p/gflags")
392 set (CPACK_RPM_CHANGELOG_FILE "${CMAKE_CURRENT_LIST_DIR}/ChangeLog.txt")
395 set (CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_LIST_DIR}/doc/gflags.html")
397 set (CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_LIST_DIR}/cmake/README_runtime.txt")
400 # system/architecture
403 set (CPACK_SYSTEM_NAME "win64")
405 set (CPACK_SYSTEM_NAME "win32")
407 set (CPACK_PACKAGE_ARCHITECTURE)
409 set (CPACK_PACKAGE_ARCHITECTURE darwin)
411 string (TOLOWER "${CMAKE_SYSTEM_NAME}" CPACK_SYSTEM_NAME)
412 if (CMAKE_CXX_FLAGS MATCHES "-m32")
413 set (CPACK_PACKAGE_ARCHITECTURE i386)
416 COMMAND dpkg --print-architecture
418 OUTPUT_VARIABLE CPACK_PACKAGE_ARCHITECTURE
421 string (STRIP "${CPACK_PACKAGE_ARCHITECTURE}" CPACK_PACKAGE_ARCHITECTURE)
423 execute_process (COMMAND uname -m OUTPUT_VARIABLE CPACK_PACKAGE_ARCHITECTURE)
424 if (CPACK_PACKAGE_ARCHITECTURE MATCHES "x86_64")
425 set (CPACK_PACKAGE_ARCHITECTURE amd64)
427 set (CPACK_PACKAGE_ARCHITECTURE i386)
433 # source package settings
434 set (CPACK_SOURCE_TOPLEVEL_TAG "source")
435 set (CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
436 set (CPACK_SOURCE_IGNORE_FILES "/\\\\.git/;\\\\.swp$;\\\\.#;/#;\\\\.*~;cscope\\\\.*;/[Bb]uild[.+-_a-zA-Z0-9]*/")
438 # default binary package settings
439 set (CPACK_INCLUDE_TOPLEVEL_DIRECTORY TRUE)
440 set (CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_SYSTEM_NAME}")
441 if (CPACK_PACKAGE_ARCHITECTURE)
442 set (CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}-${CPACK_PACKAGE_ARCHITECTURE}")
445 # generator specific configuration file
447 # allow package maintainers to use their own configuration file
448 # $ cmake -DCPACK_PROJECT_CONFIG_FILE:FILE=/path/to/package/config
449 if (NOT CPACK_PROJECT_CONFIG_FILE)
451 "${CMAKE_CURRENT_LIST_DIR}/cmake/package.cmake.in"
452 "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-package.cmake" @ONLY
454 set (CPACK_PROJECT_CONFIG_FILE "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-package.cmake")
459 endif () # BUILD_PACKAGING