cf4cbb8bba9365b15f8f78217e8478f56a76ede5
[platform/upstream/gflags.git] / CMakeLists.txt
1 cmake_minimum_required(VERSION 2.8.4 FATAL_ERROR)
2
3 # ----------------------------------------------------------------------------
4 # includes
5 set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
6
7 include (utils)
8
9 # ----------------------------------------------------------------------------
10 # package information
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/")
17
18 project (${PROJECT_NAME} CXX)
19
20 version_numbers (
21   ${PACKAGE_VERSION}
22     PACKAGE_VERSION_MAJOR
23     PACKAGE_VERSION_MINOR
24     PACKAGE_VERSION_PATCH
25 )
26
27 # ----------------------------------------------------------------------------
28 # configure options
29 option (BUILD_SHARED_LIBS "Request build of shared libraries." OFF)
30 set (GFLAGS_SHARED_LIBS ${BUILD_SHARED_LIBS})
31
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)
34
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.")
37 endif ()
38
39 option (BUILD_NEGATIVE_COMPILATION_TESTS "Request addition of negative compilation tests." OFF)
40 mark_as_advanced (BUILD_NEGATIVE_COMPILATION_TESTS)
41
42 set (GFLAGS_NAMESPACE "gflags" CACHE STRING "C++ namespace identifier of gflags library.")
43 mark_as_advanced (GFLAGS_NAMESPACE)
44
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)
48   set (
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."
51     FORCE
52   )
53 endif ()
54
55 if (APPLE)
56   mark_as_advanced(CMAKE_OSX_ARCHITECTURES
57                    CMAKE_OSX_DEPLOYMENT_TARGET
58                    CMAKE_OSX_SYSROOT)
59 endif ()
60
61 # ----------------------------------------------------------------------------
62 # system checks
63 include (CheckTypeSize)
64 include (CheckIncludeFileCXX)
65 include (CheckCXXSymbolExists)
66
67 set (GFLAGS_INTTYPES_FORMAT "" CACHE STRING "Format of integer types: \"C99\" (uint32_t), \"BSD\" (u_int32_t), \"VC7\" (__int32)")
68 set_property (CACHE GFLAGS_INTTYPES_FORMAT PROPERTY STRINGS "C99;BSD;VC7")
69 mark_as_advanced (GFLAGS_INTTYPES_FORMAT)
70 if (NOT GFLAGS_INTTYPES_FORMAT)
71   set (TYPES uint32_t u_int32_t)
72   if (MSVC)
73     list (INSERT TYPES 0 __int32)
74   endif ()
75   foreach (type IN LISTS TYPES)
76     check_type_size (${type} ${type} LANGUAGE CXX)
77     if (HAVE_${type})
78       break ()
79     endif ()
80   endforeach ()
81   if (HAVE_uint32_t)
82     set_property (CACHE GFLAGS_INTTYPES_FORMAT PROPERTY VALUE C99)
83   elseif (HAVE_u_int32_t)
84     set_property (CACHE GFLAGS_INTTYPES_FORMAT PROPERTY VALUE BSD)
85   elseif (HAVE___int32)
86     set_property (CACHE GFLAGS_INTTYPES_FORMAT PROPERTY VALUE VC7)
87   else ()
88     mark_as_advanced (CLEAR GFLAGS_INTTYPES_FORMAT)
89     message (FATAL_ERROR "Do not know how to define a 32-bit integer quantity on your system!"
90                          " Neither uint32_t, u_int32_t, nor __int32 seem to be available."
91                          " Set GFLAGS_INTTYPES_FORMAT to either C99, BSD, or VC7 and try again.")
92   endif ()
93 endif ()
94 set ("GFLAGS_INTTYPES_FORMAT_${GFLAGS_INTTYPES_FORMAT}" TRUE)
95
96 foreach (fname IN ITEMS stdint sys/types fnmatch inttypes unistd sys/stat)
97   string (TOUPPER "${fname}" FNAME)
98   string (REGEX REPLACE "/" "_" FNAME "${FNAME}")
99   check_include_file_cxx ("${fname}.h" GFLAGS_HAVE_${FNAME}_H)
100 endforeach ()
101
102 foreach (fname IN ITEMS strtoll strtoq)
103   string (TOUPPER "${fname}" FNAME)
104   check_cxx_symbol_exists ("${fname}" stdlib.h GFLAGS_HAVE_${FNAME})
105 endforeach ()
106
107 set (CMAKE_THREAD_PREFER_PTHREAD TRUE)
108 find_package (ThreadsCXX)
109 if (Threads_FOUND AND CMAKE_USE_PTHREADS_INIT)
110   set (GFLAGS_HAVE_PTHREAD TRUE)
111   check_type_size (pthread_rwlock_t GFLAGS_HAVE_RWLOCK LANGUAGE CXX)
112 else ()
113   set (GFLAGS_HAVE_PTHREAD FALSE)
114 endif ()
115
116 if (UNIX AND NOT GFLAGS_HAVE_PTHREAD AND BUILD_gflags_LIB)
117   set_property (CACHE BUILD_gflags_LIB PROPERTY VALUE OFF)
118   message (WARNING "Could not find the <pthread.h> header file."
119                    " Disabling the build of the multi-threaded gflags library.")
120 endif ()
121
122 # ----------------------------------------------------------------------------
123 # source files - excluding root subdirectory and/or .in suffix
124 set (PUBLIC_HDRS
125   "gflags.h"
126   "gflags_declare.h"
127   "gflags_completions.h"
128 )
129
130 set (PRIVATE_HDRS
131   "config.h"
132 )
133
134 set (GFLAGS_SRCS
135   "gflags.cc"
136   "gflags_reporting.cc"
137   "gflags_completions.cc"
138 )
139
140 if (WIN32)
141   list (APPEND PRIVATE_HDRS "windows_port.h")
142   list (APPEND GFLAGS_SRCS  "windows_port.cc")
143 endif ()
144
145 # ----------------------------------------------------------------------------
146 # configure source files
147 if (CMAKE_COMPILER_IS_GNUCXX)
148   set (GFLAGS_ATTRIBUTE_UNUSED "__attribute((unused))")
149 else ()
150   set (GFLAGS_ATTRIBUTE_UNUSED)
151 endif ()
152
153 configure_headers (PUBLIC_HDRS  ${PUBLIC_HDRS})
154 configure_sources (PRIVATE_HDRS ${PRIVATE_HDRS})
155 configure_sources (GFLAGS_SRCS  ${GFLAGS_SRCS})
156
157 # ----------------------------------------------------------------------------
158 # output directories
159 set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "bin")
160 set (CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")
161 set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY "lib")
162
163 # ----------------------------------------------------------------------------
164 # add library target
165 include_directories ("${PROJECT_SOURCE_DIR}/src")
166 include_directories ("${PROJECT_BINARY_DIR}/include")
167 include_directories ("${PROJECT_BINARY_DIR}/include/${GFLAGS_NAMESPACE}")
168
169 set (LIB_TARGETS)
170 if (BUILD_gflags_LIB)
171   add_library (gflags ${GFLAGS_SRCS} ${PRIVATE_HDRS} ${PUBLIC_HDRS})
172   if (WIN32 AND BUILD_SHARED_LIBS)
173     set_target_properties (gflags PROPERTIES COMPILE_DEFINITIONS GFLAGS_DLL_EXPORT)
174   endif ()
175   list (APPEND LIB_TARGETS gflags)
176 endif ()
177 if (BUILD_gflags_nothreads_LIB)
178   add_library (gflags_nothreads ${GFLAGS_SRCS} ${PRIVATE_HDRS} ${PUBLIC_HDRS})
179   if (WIN32 AND BUILD_SHARED_LIBS)
180     set_target_properties (gflags_nothreads PROPERTIES COMPILE_DEFINITIONS "GFLAGS_DLL_EXPORT;NO_THREADS")
181   else ()
182     set_target_properties (gflags_nothreads PROPERTIES COMPILE_DEFINITIONS NO_THREADS)
183   endif ()
184   list (APPEND LIB_TARGETS gflags_nothreads)
185 endif ()
186
187 # ----------------------------------------------------------------------------
188 # installation
189 if (WIN32)
190   set (RUNTIME_INSTALL_DIR Bin)
191   set (LIBRARY_INSTALL_DIR Lib)
192   set (INCLUDE_INSTALL_DIR Include)
193   set (CONFIG_INSTALL_DIR  CMake)
194 else ()
195   set (RUNTIME_INSTALL_DIR bin)
196   set (LIBRARY_INSTALL_DIR lib)
197   set (INCLUDE_INSTALL_DIR include)
198   set (CONFIG_INSTALL_DIR  lib/cmake/${PACKAGE_NAME})
199 endif ()
200
201 install (TARGETS ${LIB_TARGETS} DESTINATION ${LIBRARY_INSTALL_DIR} EXPORT gflags-lib)
202 install (FILES   ${PUBLIC_HDRS} DESTINATION ${INCLUDE_INSTALL_DIR}/${GFLAGS_NAMESPACE})
203
204 file (RELATIVE_PATH INSTALL_PREFIX_REL2CONFIG_DIR "${CMAKE_INSTALL_PREFIX}/${CONFIG_INSTALL_DIR}" "${CMAKE_INSTALL_PREFIX}")
205 configure_file (cmake/config.cmake.in  "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config-install.cmake" @ONLY)
206 configure_file (cmake/version.cmake.in "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config-version.cmake" @ONLY)
207
208 install (
209   FILES "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config-install.cmake"
210   RENAME ${PACKAGE_NAME}-config.cmake
211   DESTINATION ${CONFIG_INSTALL_DIR}
212 )
213
214 install (
215   FILES "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config-version.cmake"
216   DESTINATION ${CONFIG_INSTALL_DIR}
217 )
218
219 install (EXPORT gflags-lib DESTINATION ${CONFIG_INSTALL_DIR} FILE ${PACKAGE_NAME}-export.cmake)
220
221 if (UNIX)
222   install (PROGRAMS src/gflags_completions.sh DESTINATION ${RUNTIME_INSTALL_DIR})
223 endif ()
224
225 # ----------------------------------------------------------------------------
226 # support direct use of build tree
227 set (INSTALL_PREFIX_REL2CONFIG_DIR .)
228 export (TARGETS ${LIB_TARGETS} FILE "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-export.cmake")
229 export (PACKAGE gflags)
230 configure_file (cmake/config.cmake.in "${PROJECT_BINARY_DIR}/${PACKAGE_NAME}-config.cmake" @ONLY)
231
232 # ----------------------------------------------------------------------------
233 # testing - MUST follow the generation of the build tree config file
234 include (CTest)
235 if (BUILD_TESTING)
236   enable_testing ()
237   add_subdirectory (test)
238 endif ()