1 cmake_minimum_required (VERSION 3.0)
4 cmake_policy (SET CMP0042 NEW)
11 set (GLOG_MAJOR_VERSION 0)
12 set (GLOG_MINOR_VERSION 3)
13 set (GLOG_PATCH_VERSION 4)
16 ${GLOG_MAJOR_VERSION}.${GLOG_MINOR_VERSION}.${GLOG_PATCH_VERSION})
18 set (CPACK_PACKAGE_NAME glog)
19 set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "")
20 set (CPACK_PACKAGE_VERSION_MAJOR ${GLOG_MAJOR_VERSION})
21 set (CPACK_PACKAGE_VERSION_MINOR ${GLOG_MINOR_VERSION})
22 set (CPACK_PACKAGE_VERSION_PATCH ${GLOG_PATCH_VERSION})
23 set (CPACK_PACKAGE_VERSION ${GLOG_VERSION})
25 option (WITH_GFLAGS "Use gflags" ON)
27 list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
29 include (CMakePackageConfigHelpers)
31 include (CheckCSourceCompiles)
32 include (CheckCXXCompilerFlag)
33 include (CheckCXXSourceCompiles)
34 include (CheckFunctionExists)
35 include (CheckIncludeFile)
36 include (CheckIncludeFileCXX)
37 include (CheckLibraryExists)
38 include (CheckStructHasMember)
39 include (CheckSymbolExists)
40 include (CheckTypeSize)
41 include (DetermineGflagsNamespace)
43 set (CMAKE_THREAD_PREFER_PTHREAD 1)
49 set (HAVE_LIB_GFLAGS 1)
50 determine_gflags_namespace (gflags_NAMESPACE)
54 find_package (Threads)
56 check_include_file (dlfcn.h HAVE_DLFCN_H)
57 check_include_file (execinfo.h HAVE_EXECINFO_H)
58 check_include_file (glob.h HAVE_GLOB_H)
59 check_include_file (inttypes.h HAVE_INTTYPES_H)
60 check_include_file (libunwind.h HAVE_LIBUNWIND_H)
61 check_include_file (memory.h HAVE_MEMORY_H)
62 check_include_file (pwd.h HAVE_PWD_H)
63 check_include_file (stdint.h HAVE_STDINT_H)
64 check_include_file (stdlib.h HAVE_STDLIB_H)
65 check_include_file (string.h HAVE_STRING_H)
66 check_include_file (strings.h HAVE_STRINGS_H)
67 check_include_file (sys/stat.h HAVE_SYS_STAT_H)
68 check_include_file (sys/syscall.h HAVE_SYS_SYSCALL_H)
69 check_include_file (sys/time.h HAVE_SYS_TIME_H)
70 check_include_file (sys/types.h HAVE_SYS_TYPES_H)
71 check_include_file (sys/utsname.h HAVE_SYS_UTSNAME_H)
72 check_include_file (syscall.h HAVE_SYSCALL_H)
73 check_include_file (syslog.h HAVE_SYSLOG_H)
74 check_include_file (ucontext.h HAVE_UCONTEXT_H)
75 check_include_file (unistd.h HAVE_UNISTD_H)
76 check_include_file (unwind.h HAVE_UNWIND_H)
78 check_include_file_cxx ("ext/hash_map" HAVE_EXT_HASH_MAP)
79 check_include_file_cxx ("ext/hash_set" HAVE_EXT_HASH_SET)
80 check_include_file_cxx ("ext/slist" HAVE_EXT_SLIST)
81 check_include_file_cxx ("tr1/unordered_map" HAVE_TR1_UNORDERED_MAP)
82 check_include_file_cxx ("tr1/unordered_set" HAVE_TR1_UNORDERED_SET)
83 check_include_file_cxx ("unordered_map" HAVE_UNORDERED_MAP)
84 check_include_file_cxx ("unordered_set" HAVE_UNORDERED_SET)
86 check_type_size ("unsigned __int16" HAVE___UINT16)
87 check_type_size (u_int16_t HAVE_U_INT16_T)
88 check_type_size (uint16_t HAVE_UINT16_T)
90 check_function_exists (dladdr HAVE_DLADDR)
91 check_function_exists (fcntl HAVE_FCNTL)
92 check_function_exists (pread HAVE_PREAD)
93 check_function_exists (pwrite HAVE_PWRITE)
94 check_function_exists (sigaction HAVE_SIGACTION)
95 check_function_exists (sigaltstack HAVE_SIGALSTACK)
97 check_cxx_compiler_flag (-Wno-deprecated HAVE_NO_DEPRECATED)
99 # NOTE: Cannot use check_function_exists here since >=vc-14.0 can define
100 # snprintf as an inline function
101 check_symbol_exists (snprintf stdio.h HAVE_SNPRINTF)
103 check_library_exists (unwind get_static_proc_name "" HAVE_LIB_UNWIND)
105 check_c_source_compiles ("
107 static void foo(void) __attribute__ ((unused));
108 int main(void) { return 0; }
109 " HAVE___ATTRIBUTE__)
111 check_c_source_compiles ("
113 static void foo(void) __attribute__ ((visibility(\"default\")));
114 int main(void) { return 0; }
115 " HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
117 check_c_source_compiles ("
119 static void foo(void) __attribute__ ((visibility(\"hidden\")));
120 int main(void) { return 0; }
121 " HAVE___ATTRIBUTE__VISIBILITY_HIDDEN)
123 check_c_source_compiles ("
124 int main(void) { if (__builtin_expect(0, 0)) return 1; return 0; }
125 " HAVE___BUILTIN_EXPECT)
127 check_c_source_compiles ("
130 int a; if (__sync_val_compare_and_swap(&a, 0, 1)) return 1; return 0;
132 " HAVE___SYNC_VAL_COMPARE_AND_SWAP)
134 check_c_source_compiles ("
135 #define _XOPEN_SOURCE 500
140 pthread_rwlock_init(&l, NULL);
141 pthread_rwlock_rdlock(&l);
146 check_c_source_compiles ("
147 __declspec(selectany) int a;
148 int main(void) { return 0; }
151 check_cxx_source_compiles ("
153 vector<int> t; int main() { }
156 check_cxx_source_compiles ("
158 std::vector<int> t; int main() { }
161 check_cxx_source_compiles ("
163 std::ostream& operator<<(std::ostream&, struct s);
166 " HAVE_USING_OPERATOR)
168 check_cxx_source_compiles ("
169 namespace Outer { namespace Inner { int i = 0; }}
170 using namespace Outer::Inner;;
171 int main() { return i; }
179 "uc_regs->gregs[PT_NIP]"
194 set (_PC_HEADERS ucontext.h signal.h)
196 if (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
197 foreach (_PC_FIELD ${_PC_FIELDS})
198 foreach (_PC_HEADER ${_PC_HEADERS})
200 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/uctfield.c)
201 file (WRITE ${_TMP} "
202 #define _GNU_SOURCE 1
203 #include <${_PC_HEADER}>
207 return u.${_PC_FIELD} == 0;
210 try_compile (HAVE_PC_FROM_UCONTEXT ${CMAKE_CURRENT_BINARY_DIR} ${_TMP}
211 COMPILE_DEFINITIONS _GNU_SOURCE=1)
213 if (HAVE_PC_FROM_UCONTEXT)
214 set (PC_FROM_UCONTEXT ${_PC_FIELD} CACHE)
215 endif (HAVE_PC_FROM_UCONTEXT)
216 endforeach (_PC_HEADER)
217 endforeach (_PC_FIELD)
218 endif (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
220 if (STL_STD_NAMESPACE)
221 set (STL_NAMESPACE std)
222 else (STL_STD_NAMESPACE)
223 set (STL_NAMESPACE "")
224 endif (STL_STD_NAMESPACE)
226 set (GOOGLE_NAMESPACE google)
227 set (_START_GOOGLE_NAMESPACE_ "namespace ${GOOGLE_NAMESPACE} {")
228 set (_END_GOOGLE_NAMESPACE_ "}")
231 set (ac_cv_have___uint16 1)
233 set (ac_cv_have___uint16 0)
234 endif (HAVE___UINT16)
237 set (ac_cv_have_inttypes_h 1)
238 else (HAVE_INTTYPES_H)
239 set (ac_cv_have_inttypes_h 0)
240 endif (HAVE_INTTYPES_H)
243 set (ac_cv_have_libgflags 1)
244 else (HAVE_LIB_GFLAGS)
245 set (ac_cv_have_libgflags 0)
246 endif (HAVE_LIB_GFLAGS)
249 set (ac_cv_have_stdint_h 1)
251 set (ac_cv_have_stdint_h 0)
252 endif (HAVE_STDINT_H)
254 if (HAVE_SYS_TYPES_H)
255 set (ac_cv_have_systypes_h 1)
256 else (HAVE_SYS_TYPES_H)
257 set (ac_cv_have_systypes_h 0)
258 endif (HAVE_SYS_TYPES_H)
261 set (ac_cv_have_u_int16_t 1)
262 else (HAVE_U_INT16_T)
263 set (ac_cv_have_u_int16_t 0)
264 endif (HAVE_U_INT16_T)
267 set (ac_cv_have_uint16_t 1)
269 set (ac_cv_have_uint16_t 0)
270 endif (HAVE_UINT16_T)
273 set (ac_cv_have_unistd_h 1)
275 set (ac_cv_have_unistd_h 0)
276 endif (HAVE_UNISTD_H)
278 set (ac_google_namespace ${GOOGLE_NAMESPACE})
279 set (ac_google_end_namespace ${_END_GOOGLE_NAMESPACE_})
280 set (ac_google_start_namespace ${_START_GOOGLE_NAMESPACE_})
282 if (HAVE___ATTRIBUTE__)
283 set (ac_cv___attribute___noreturn "__attribute__((noreturn))")
284 set (ac_cv___attribute___noinline "__attribute__((noinline))")
285 elseif (HAVE___DECLSPEC)
286 set (ac_cv___attribute___noreturn "__declspec(noreturn)")
287 #set (ac_cv___attribute___noinline "__declspec(noinline)")
288 endif (HAVE___ATTRIBUTE__)
290 if (HAVE___BUILTIN_EXPECT)
291 set (ac_cv_have___builtin_expect 1)
292 else (HAVE___BUILTIN_EXPECT)
293 set (ac_cv_have___builtin_expect 0)
294 endif (HAVE___BUILTIN_EXPECT)
296 if (HAVE_USING_OPERATOR)
297 set (ac_cv_cxx_using_operator 1)
298 else (HAVE_USING_OPERATOR)
299 set (ac_cv_cxx_using_operator 0)
300 endif (HAVE_USING_OPERATOR)
302 set (SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
304 if (Threads_FOUND AND CMAKE_USE_PTHREADS_INIT)
306 endif (Threads_FOUND AND CMAKE_USE_PTHREADS_INIT)
308 set (TEST_SRC_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\")
310 configure_file (src/config.h.cmake.in config.h)
311 configure_file (src/glog/logging.h.in glog/logging.h @ONLY)
312 configure_file (src/glog/raw_logging.h.in glog/raw_logging.h @ONLY)
313 configure_file (src/glog/stl_logging.h.in glog/stl_logging.h @ONLY)
314 configure_file (src/glog/vlog_is_on.h.in glog/vlog_is_on.h @ONLY)
316 set (CMAKE_CXX_VISIBILITY_PRESET default)
317 set (CMAKE_VISIBILITY_INLINES_HIDDEN 1)
320 ${CMAKE_CURRENT_BINARY_DIR}/config.h
321 ${CMAKE_CURRENT_BINARY_DIR}/glog/logging.h
322 ${CMAKE_CURRENT_BINARY_DIR}/glog/raw_logging.h
323 ${CMAKE_CURRENT_BINARY_DIR}/glog/stl_logging.h
324 ${CMAKE_CURRENT_BINARY_DIR}/glog/vlog_is_on.h
325 src/glog/log_severity.h
330 src/base/commandlineflags.h
331 src/base/googleinit.h
345 list (APPEND GLOG_SRCS src/signalhandler.cc)
349 list (APPEND GLOG_SRCS
359 if (WIN32 AND HAVE_SNPRINTF)
360 set_property (SOURCE src/windows/port.cc APPEND PROPERTY COMPILE_DEFINITIONS
362 endif (WIN32 AND HAVE_SNPRINTF)
365 target_include_directories (glog PUBLIC ${gflags_INCLUDE_DIR})
366 target_link_libraries (glog PUBLIC ${gflags_LIBRARIES})
369 set_target_properties (glog PROPERTIES VERSION ${GLOG_MAJOR_VERSION})
370 set_target_properties (glog PROPERTIES SOVERSION ${GLOG_VERSION})
373 target_compile_definitions (glog PUBLIC GLOG_NO_ABBREVIATED_SEVERITIES)
376 set_target_properties (glog PROPERTIES PUBLIC_HEADER "${GLOG_PUBLIC_H}")
378 target_include_directories (glog BEFORE PUBLIC
379 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
380 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
381 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
382 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
385 target_include_directories (glog PUBLIC
386 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/windows>"
387 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/windows)
390 set_target_properties (glog PROPERTIES DEFINE_SYMBOL LIBGLOG_EXPORTS)
392 if (NOT BUILD_SHARED_LIBS)
393 target_compile_definitions (glog PUBLIC GOOGLE_GLOG_DLL_DECL=)
394 else (NOT BUILD_SHARED_LIBS)
395 target_compile_definitions (glog PRIVATE GOOGLE_GLOG_IS_A_DLL=1)
397 if (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
398 set (_EXPORT "__attribute__((visibility(\"default\")))")
400 elseif (HAVE___DECLSPEC)
401 set (_EXPORT "__declspec(dllexport)")
402 set (_IMPORT "__declspec(dllimport)")
403 endif (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
405 target_compile_definitions (glog PRIVATE
406 "GOOGLE_GLOG_DLL_DECL=${_EXPORT}")
407 target_compile_definitions (glog INTERFACE
408 "GOOGLE_GLOG_DLL_DECL=${_IMPORT}")
409 target_compile_definitions (glog INTERFACE
410 "GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS=${_IMPORT}")
411 endif (NOT BUILD_SHARED_LIBS)
414 target_link_libraries (glog PUBLIC ${CMAKE_THREAD_LIBS_INIT})
416 target_compile_definitions (glog PUBLIC NO_THREADS)
420 set (HAVE_STACKTRACE 1)
421 endif (HAVE_EXECINFO_H)
423 if (UNIX OR (APPLE AND HAVE_DLADDR))
424 set (HAVE_SYMBOLIZE 1)
425 endif (UNIX OR (APPLE AND HAVE_DLADDR))
429 add_executable (logging_unittest
430 src/logging_unittest.cc
433 target_link_libraries (logging_unittest PRIVATE glog)
435 add_executable (stl_logging_unittest
436 src/stl_logging_unittest.cc
439 target_link_libraries (stl_logging_unittest PRIVATE glog)
441 if (HAVE_NO_DEPRECATED)
442 set_property (TARGET stl_logging_unittest APPEND PROPERTY COMPILE_OPTIONS
444 endif (HAVE_NO_DEPRECATED)
446 if (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
447 target_compile_definitions (stl_logging_unittest PRIVATE
448 GLOG_STL_LOGGING_FOR_UNORDERED)
449 endif (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
451 if (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
452 target_compile_definitions (stl_logging_unittest PRIVATE
453 GLOG_STL_LOGGING_FOR_TR1_UNORDERED)
454 endif (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
456 if (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
457 target_compile_definitions (stl_logging_unittest PRIVATE
458 GLOG_STL_LOGGING_FOR_EXT_HASH)
459 endif (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
462 target_compile_definitions (stl_logging_unittest PRIVATE
463 GLOG_STL_LOGGING_FOR_EXT_SLIST)
464 endif (HAVE_EXT_SLIST)
467 add_executable (symbolize_unittest
468 src/symbolize_unittest.cc
471 target_link_libraries (symbolize_unittest PRIVATE glog)
472 endif (HAVE_SYMBOLIZE)
474 add_executable (demangle_unittest
475 src/demangle_unittest.cc
478 target_link_libraries (demangle_unittest PRIVATE glog)
481 add_executable (stacktrace_unittest
482 src/stacktrace_unittest.cc
485 target_link_libraries (stacktrace_unittest PRIVATE glog)
486 endif (HAVE_STACKTRACE)
488 add_executable (utilities_unittest
489 src/utilities_unittest.cc
492 target_link_libraries (utilities_unittest PRIVATE glog)
494 if (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
495 add_executable (signalhandler_unittest
496 src/signalhandler_unittest.cc
499 target_link_libraries (signalhandler_unittest PRIVATE glog)
500 endif (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
502 add_test (NAME demangle COMMAND demangle_unittest)
503 add_test (NAME logging COMMAND logging_unittest)
505 if (TARGET signalhandler_unittest)
506 add_test (NAME signalhandler COMMAND signalhandler_unittest)
507 endif (TARGET signalhandler_unittest)
509 if (TARGET stacktrace_unittest)
510 add_test (NAME stacktrace COMMAND stacktrace_unittest)
511 endif (TARGET stacktrace_unittest)
513 add_test (NAME stl_logging COMMAND stl_logging_unittest)
515 if (TARGET symbolize_unittest)
516 add_test (NAME symbolize COMMAND symbolize_unittest)
517 endif (TARGET symbolize_unittest)
519 install (TARGETS glog
521 RUNTIME DESTINATION bin
522 PUBLIC_HEADER DESTINATION include/glog
523 LIBRARY DESTINATION lib
524 ARCHIVE DESTINATION lib)
528 set (glog_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
529 set (glog_PACKAGE_DEPS)
532 set (glog_PACKAGE_DEPS
534 include (CMakeFindDependencyMacro)
536 find_dependency (gflags ${gflags_VERSION})
540 configure_package_config_file (glog-config.cmake.in
541 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake INSTALL_DESTINATION
542 lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
543 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
545 # The version file is the same both for build tree and install mode config
546 write_basic_package_version_file (glog-config-version.cmake VERSION
547 ${GLOG_VERSION} COMPATIBILITY SameMajorVersion)
551 set (glog_INCLUDE_DIR include)
553 configure_package_config_file (glog-config.cmake.in
554 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
555 INSTALL_DESTINATION lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
556 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
558 export (TARGETS glog FILE glog-targets.cmake)
559 export (PACKAGE glog)
562 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
563 ${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake
564 DESTINATION lib/cmake/glog)
566 install (EXPORT glog-targets DESTINATION lib/cmake/glog)