1 cmake_minimum_required (VERSION 3.0)
4 cmake_policy (SET CMP0042 NEW)
8 cmake_policy (SET CMP0063 NEW)
15 set (GLOG_MAJOR_VERSION 0)
16 set (GLOG_MINOR_VERSION 3)
17 set (GLOG_PATCH_VERSION 5)
20 ${GLOG_MAJOR_VERSION}.${GLOG_MINOR_VERSION}.${GLOG_PATCH_VERSION})
22 set (CPACK_PACKAGE_NAME glog)
23 set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "")
24 set (CPACK_PACKAGE_VERSION_MAJOR ${GLOG_MAJOR_VERSION})
25 set (CPACK_PACKAGE_VERSION_MINOR ${GLOG_MINOR_VERSION})
26 set (CPACK_PACKAGE_VERSION_PATCH ${GLOG_PATCH_VERSION})
27 set (CPACK_PACKAGE_VERSION ${GLOG_VERSION})
29 option (WITH_GFLAGS "Use gflags" ON)
30 option (WITH_THREADS "Enable multithreading support" ON)
31 option (WITH_TLS "Enable Thread Local Storage (TLS) support" ON)
33 list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
35 include (CheckCSourceCompiles)
36 include (CheckCXXCompilerFlag)
37 include (CheckCXXSourceCompiles)
38 include (CheckFunctionExists)
39 include (CheckIncludeFile)
40 include (CheckIncludeFileCXX)
41 include (CheckLibraryExists)
42 include (CheckStructHasMember)
43 include (CheckSymbolExists)
44 include (CheckTypeSize)
45 include (CMakePackageConfigHelpers)
48 include (DetermineGflagsNamespace)
49 include (GNUInstallDirs)
51 set (CMAKE_THREAD_PREFER_PTHREAD 1)
54 find_package (gflags 2.2.0)
57 set (HAVE_LIB_GFLAGS 1)
58 determine_gflags_namespace (gflags_NAMESPACE)
63 find_package (Threads)
66 check_include_file (dlfcn.h HAVE_DLFCN_H)
67 check_include_file (execinfo.h HAVE_EXECINFO_H)
68 check_include_file (glob.h HAVE_GLOB_H)
69 check_include_file (inttypes.h HAVE_INTTYPES_H)
70 check_include_file (libunwind.h HAVE_LIBUNWIND_H)
71 check_include_file (memory.h HAVE_MEMORY_H)
72 check_include_file (pwd.h HAVE_PWD_H)
73 check_include_file (stdint.h HAVE_STDINT_H)
74 check_include_file (stdlib.h HAVE_STDLIB_H)
75 check_include_file (string.h HAVE_STRING_H)
76 check_include_file (strings.h HAVE_STRINGS_H)
77 check_include_file (sys/stat.h HAVE_SYS_STAT_H)
78 check_include_file (sys/syscall.h HAVE_SYS_SYSCALL_H)
79 check_include_file (sys/time.h HAVE_SYS_TIME_H)
80 check_include_file (sys/types.h HAVE_SYS_TYPES_H)
81 check_include_file (sys/utsname.h HAVE_SYS_UTSNAME_H)
82 check_include_file (syscall.h HAVE_SYSCALL_H)
83 check_include_file (syslog.h HAVE_SYSLOG_H)
84 check_include_file (ucontext.h HAVE_UCONTEXT_H)
85 check_include_file (unistd.h HAVE_UNISTD_H)
86 check_include_file (unwind.h HAVE_UNWIND_H)
88 check_include_file_cxx ("ext/hash_map" HAVE_EXT_HASH_MAP)
89 check_include_file_cxx ("ext/hash_set" HAVE_EXT_HASH_SET)
90 check_include_file_cxx ("ext/slist" HAVE_EXT_SLIST)
91 check_include_file_cxx ("tr1/unordered_map" HAVE_TR1_UNORDERED_MAP)
92 check_include_file_cxx ("tr1/unordered_set" HAVE_TR1_UNORDERED_SET)
93 check_include_file_cxx ("unordered_map" HAVE_UNORDERED_MAP)
94 check_include_file_cxx ("unordered_set" HAVE_UNORDERED_SET)
96 check_type_size ("unsigned __int16" HAVE___UINT16)
97 check_type_size (u_int16_t HAVE_U_INT16_T)
98 check_type_size (uint16_t HAVE_UINT16_T)
100 check_function_exists (dladdr HAVE_DLADDR)
101 check_function_exists (fcntl HAVE_FCNTL)
102 check_function_exists (pread HAVE_PREAD)
103 check_function_exists (pwrite HAVE_PWRITE)
104 check_function_exists (sigaction HAVE_SIGACTION)
105 check_function_exists (sigaltstack HAVE_SIGALSTACK)
107 # NOTE gcc does not fail if you pass a non-existent -Wno-* option as an
108 # argument. However, it will happily fail if you pass the corresponding -W*
109 # option. So, we check whether options that disable warnings exist by testing
110 # the availability of the corresponding option that enables the warning. This
111 # eliminates the need to check for compiler for several (mainly Clang) options.
113 check_cxx_compiler_flag (-Wdeprecated HAVE_NO_DEPRECATED)
114 check_cxx_compiler_flag (-Wunnamed-type-template-args
115 HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
117 # NOTE: Cannot use check_function_exists here since >=vc-14.0 can define
118 # snprintf as an inline function
119 check_symbol_exists (snprintf stdio.h HAVE_SNPRINTF)
121 check_library_exists (unwind get_static_proc_name "" HAVE_LIB_UNWIND)
123 find_library (UNWIND_LIBRARY NAMES unwind DOC "unwind library")
124 mark_as_advanced (UNWIND_LIBRARY)
126 check_c_source_compiles ("
128 static void foo(void) __attribute__ ((unused));
129 int main(void) { return 0; }
130 " HAVE___ATTRIBUTE__)
132 check_c_source_compiles ("
134 static void foo(void) __attribute__ ((visibility(\"default\")));
135 int main(void) { return 0; }
136 " HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
138 check_c_source_compiles ("
140 static void foo(void) __attribute__ ((visibility(\"hidden\")));
141 int main(void) { return 0; }
142 " HAVE___ATTRIBUTE__VISIBILITY_HIDDEN)
144 check_c_source_compiles ("
145 int main(void) { if (__builtin_expect(0, 0)) return 1; return 0; }
146 " HAVE___BUILTIN_EXPECT)
148 check_c_source_compiles ("
151 int a; if (__sync_val_compare_and_swap(&a, 0, 1)) return 1; return 0;
153 " HAVE___SYNC_VAL_COMPARE_AND_SWAP)
155 check_c_source_compiles ("
156 #define _XOPEN_SOURCE 500
161 pthread_rwlock_init(&l, NULL);
162 pthread_rwlock_rdlock(&l);
167 check_c_source_compiles ("
168 __declspec(selectany) int a;
169 int main(void) { return 0; }
172 check_cxx_source_compiles ("
174 vector<int> t; int main() { }
177 check_cxx_source_compiles ("
179 std::vector<int> t; int main() { }
182 check_cxx_source_compiles ("
184 std::ostream& operator<<(std::ostream&, struct s);
187 " HAVE_USING_OPERATOR)
189 check_cxx_source_compiles ("
190 namespace Outer { namespace Inner { int i = 0; }}
191 using namespace Outer::Inner;;
192 int main() { return i; }
195 check_cxx_source_compiles ("
200 check_cxx_source_compiles ("
201 __declspec(thread) int tls;
205 check_cxx_source_compiles ("
206 thread_local int tls;
211 # Cygwin does not support the thread attribute. Don't bother.
213 set (GLOG_THREAD_LOCAL_STORAGE "__thread")
214 elseif (HAVE_MSVC_TLS)
215 set (GLOG_THREAD_LOCAL_STORAGE "__declspec(thread)")
216 elseif (HAVE_CXX11_TLS)
217 set (GLOG_THREAD_LOCAL_STORAGE thread_local)
226 "uc_regs->gregs[PT_NIP]"
241 set (_PC_HEADERS ucontext.h signal.h)
243 if (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
244 foreach (_PC_FIELD ${_PC_FIELDS})
245 foreach (_PC_HEADER ${_PC_HEADERS})
247 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/uctfield.c)
248 file (WRITE ${_TMP} "
249 #define _GNU_SOURCE 1
250 #include <${_PC_HEADER}>
254 return u.${_PC_FIELD} == 0;
257 try_compile (HAVE_PC_FROM_UCONTEXT ${CMAKE_CURRENT_BINARY_DIR} ${_TMP}
258 COMPILE_DEFINITIONS _GNU_SOURCE=1)
260 if (HAVE_PC_FROM_UCONTEXT)
261 set (PC_FROM_UCONTEXT ${_PC_FIELD} CACHE)
262 endif (HAVE_PC_FROM_UCONTEXT)
263 endforeach (_PC_HEADER)
264 endforeach (_PC_FIELD)
265 endif (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
267 if (STL_STD_NAMESPACE)
268 set (STL_NAMESPACE std)
269 else (STL_STD_NAMESPACE)
270 set (STL_NAMESPACE "")
271 endif (STL_STD_NAMESPACE)
273 set (GOOGLE_NAMESPACE google)
274 set (_START_GOOGLE_NAMESPACE_ "namespace ${GOOGLE_NAMESPACE} {")
275 set (_END_GOOGLE_NAMESPACE_ "}")
278 set (ac_cv_have___uint16 1)
280 set (ac_cv_have___uint16 0)
281 endif (HAVE___UINT16)
284 set (ac_cv_have_inttypes_h 1)
285 else (HAVE_INTTYPES_H)
286 set (ac_cv_have_inttypes_h 0)
287 endif (HAVE_INTTYPES_H)
290 set (ac_cv_have_libgflags 1)
291 else (HAVE_LIB_GFLAGS)
292 set (ac_cv_have_libgflags 0)
293 endif (HAVE_LIB_GFLAGS)
296 set (ac_cv_have_stdint_h 1)
298 set (ac_cv_have_stdint_h 0)
299 endif (HAVE_STDINT_H)
301 if (HAVE_SYS_TYPES_H)
302 set (ac_cv_have_systypes_h 1)
303 else (HAVE_SYS_TYPES_H)
304 set (ac_cv_have_systypes_h 0)
305 endif (HAVE_SYS_TYPES_H)
308 set (ac_cv_have_u_int16_t 1)
309 else (HAVE_U_INT16_T)
310 set (ac_cv_have_u_int16_t 0)
311 endif (HAVE_U_INT16_T)
314 set (ac_cv_have_uint16_t 1)
316 set (ac_cv_have_uint16_t 0)
317 endif (HAVE_UINT16_T)
320 set (ac_cv_have_unistd_h 1)
322 set (ac_cv_have_unistd_h 0)
323 endif (HAVE_UNISTD_H)
325 set (ac_google_namespace ${GOOGLE_NAMESPACE})
326 set (ac_google_end_namespace ${_END_GOOGLE_NAMESPACE_})
327 set (ac_google_start_namespace ${_START_GOOGLE_NAMESPACE_})
329 if (HAVE___ATTRIBUTE__)
330 set (ac_cv___attribute___noreturn "__attribute__((noreturn))")
331 set (ac_cv___attribute___noinline "__attribute__((noinline))")
332 elseif (HAVE___DECLSPEC)
333 set (ac_cv___attribute___noreturn "__declspec(noreturn)")
334 #set (ac_cv___attribute___noinline "__declspec(noinline)")
335 endif (HAVE___ATTRIBUTE__)
337 if (HAVE___BUILTIN_EXPECT)
338 set (ac_cv_have___builtin_expect 1)
339 else (HAVE___BUILTIN_EXPECT)
340 set (ac_cv_have___builtin_expect 0)
341 endif (HAVE___BUILTIN_EXPECT)
343 if (HAVE_USING_OPERATOR)
344 set (ac_cv_cxx_using_operator 1)
345 else (HAVE_USING_OPERATOR)
346 set (ac_cv_cxx_using_operator 0)
347 endif (HAVE_USING_OPERATOR)
349 set (SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
351 if (WITH_THREADS AND Threads_FOUND)
352 if (CMAKE_USE_PTHREADS_INIT)
354 endif (CMAKE_USE_PTHREADS_INIT)
355 else (WITH_THREADS AND Threads_FOUND)
357 endif (WITH_THREADS AND Threads_FOUND)
359 set (TEST_SRC_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\")
361 configure_file (src/config.h.cmake.in config.h)
362 configure_file (src/glog/logging.h.in glog/logging.h @ONLY)
363 configure_file (src/glog/raw_logging.h.in glog/raw_logging.h @ONLY)
364 configure_file (src/glog/stl_logging.h.in glog/stl_logging.h @ONLY)
365 configure_file (src/glog/vlog_is_on.h.in glog/vlog_is_on.h @ONLY)
367 set (CMAKE_CXX_VISIBILITY_PRESET default)
368 set (CMAKE_VISIBILITY_INLINES_HIDDEN 1)
371 ${CMAKE_CURRENT_BINARY_DIR}/config.h
372 ${CMAKE_CURRENT_BINARY_DIR}/glog/logging.h
373 ${CMAKE_CURRENT_BINARY_DIR}/glog/raw_logging.h
374 ${CMAKE_CURRENT_BINARY_DIR}/glog/stl_logging.h
375 ${CMAKE_CURRENT_BINARY_DIR}/glog/vlog_is_on.h
376 src/glog/log_severity.h
381 src/base/commandlineflags.h
382 src/base/googleinit.h
395 if (HAVE_PTHREAD OR WIN32)
396 list (APPEND GLOG_SRCS src/signalhandler.cc)
397 endif (HAVE_PTHREAD OR WIN32)
400 list (APPEND GLOG_SRCS
406 add_compile_options ($<$<BOOL:${HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS}>:-Wno-unnamed-type-template-args>)
412 set_target_properties (glog PROPERTIES POSITION_INDEPENDENT_CODE ON)
415 target_link_libraries (glog PUBLIC ${UNWIND_LIBRARY})
416 endif (UNWIND_LIBRARY)
419 target_link_libraries (glog PUBLIC ${CMAKE_THREAD_LIBS_INIT})
422 if (WIN32 AND HAVE_SNPRINTF)
423 set_property (SOURCE src/windows/port.cc APPEND PROPERTY COMPILE_DEFINITIONS
425 endif (WIN32 AND HAVE_SNPRINTF)
428 target_link_libraries (glog PUBLIC gflags)
430 if (NOT BUILD_SHARED_LIBS)
431 # Don't use __declspec(dllexport|dllimport) if this is a static build
432 targeT_compile_definitions (glog PUBLIC GFLAGS_DLL_DECLARE_FLAG= GFLAGS_DLL_DEFINE_FLAG=)
433 endif (NOT BUILD_SHARED_LIBS)
436 set_target_properties (glog PROPERTIES VERSION ${GLOG_MAJOR_VERSION})
437 set_target_properties (glog PROPERTIES SOVERSION ${GLOG_VERSION})
440 target_compile_definitions (glog PUBLIC GLOG_NO_ABBREVIATED_SEVERITIES)
443 set_target_properties (glog PROPERTIES PUBLIC_HEADER "${GLOG_PUBLIC_H}")
445 set (_glog_CMake_BINDIR ${CMAKE_INSTALL_BINDIR})
446 set (_glog_CMake_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR})
447 set (_glog_CMake_LIBDIR ${CMAKE_INSTALL_LIBDIR})
448 set (_glog_CMake_INSTALLDIR ${_glog_CMake_LIBDIR}/cmake/glog)
450 target_include_directories (glog BEFORE PUBLIC
451 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
452 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
453 "$<INSTALL_INTERFACE:${_glog_CMake_INCLUDE_DIR}>"
454 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
455 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
458 target_include_directories (glog PUBLIC
459 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/windows>"
460 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/windows)
463 set_target_properties (glog PROPERTIES DEFINE_SYMBOL LIBGLOG_EXPORTS)
465 if (NOT BUILD_SHARED_LIBS)
466 target_compile_definitions (glog PUBLIC GOOGLE_GLOG_DLL_DECL=)
467 else (NOT BUILD_SHARED_LIBS)
468 target_compile_definitions (glog PRIVATE GOOGLE_GLOG_IS_A_DLL=1)
470 if (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
471 set (_EXPORT "__attribute__((visibility(\"default\")))")
473 elseif (HAVE___DECLSPEC)
474 set (_EXPORT "__declspec(dllexport)")
475 set (_IMPORT "__declspec(dllimport)")
476 endif (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
478 target_compile_definitions (glog PRIVATE
479 "GOOGLE_GLOG_DLL_DECL=${_EXPORT}")
480 target_compile_definitions (glog INTERFACE
481 "GOOGLE_GLOG_DLL_DECL=${_IMPORT}")
482 target_compile_definitions (glog INTERFACE
483 "GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS=${_IMPORT}")
484 endif (NOT BUILD_SHARED_LIBS)
487 set (HAVE_STACKTRACE 1)
488 endif (HAVE_EXECINFO_H)
491 set (HAVE_STACKTRACE 1)
492 set (HAVE_SYMBOLIZE 1)
495 if (UNIX OR (APPLE AND HAVE_DLADDR))
496 set (HAVE_SYMBOLIZE 1)
497 endif (UNIX OR (APPLE AND HAVE_DLADDR))
502 add_executable (logging_unittest
503 src/logging_unittest.cc
506 target_link_libraries (logging_unittest PRIVATE glog)
508 add_executable (stl_logging_unittest
509 src/stl_logging_unittest.cc
512 target_link_libraries (stl_logging_unittest PRIVATE glog)
514 if (HAVE_NO_DEPRECATED)
515 set_property (TARGET stl_logging_unittest APPEND PROPERTY COMPILE_OPTIONS
517 endif (HAVE_NO_DEPRECATED)
519 if (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
520 target_compile_definitions (stl_logging_unittest PRIVATE
521 GLOG_STL_LOGGING_FOR_UNORDERED)
522 endif (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
524 if (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
525 target_compile_definitions (stl_logging_unittest PRIVATE
526 GLOG_STL_LOGGING_FOR_TR1_UNORDERED)
527 endif (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
529 if (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
530 target_compile_definitions (stl_logging_unittest PRIVATE
531 GLOG_STL_LOGGING_FOR_EXT_HASH)
532 endif (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
535 target_compile_definitions (stl_logging_unittest PRIVATE
536 GLOG_STL_LOGGING_FOR_EXT_SLIST)
537 endif (HAVE_EXT_SLIST)
540 add_executable (symbolize_unittest
541 src/symbolize_unittest.cc
544 target_link_libraries (symbolize_unittest PRIVATE glog)
545 endif (HAVE_SYMBOLIZE)
547 add_executable (demangle_unittest
548 src/demangle_unittest.cc
551 target_link_libraries (demangle_unittest PRIVATE glog)
554 add_executable (stacktrace_unittest
555 src/stacktrace_unittest.cc
558 target_link_libraries (stacktrace_unittest PRIVATE glog)
559 endif (HAVE_STACKTRACE)
561 add_executable (utilities_unittest
562 src/utilities_unittest.cc
565 target_link_libraries (utilities_unittest PRIVATE glog)
567 if (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
568 add_executable (signalhandler_unittest
569 src/signalhandler_unittest.cc
572 target_link_libraries (signalhandler_unittest PRIVATE glog)
573 endif (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
575 add_test (NAME demangle COMMAND demangle_unittest)
576 add_test (NAME logging COMMAND logging_unittest)
578 if (TARGET signalhandler_unittest)
579 add_test (NAME signalhandler COMMAND signalhandler_unittest)
580 endif (TARGET signalhandler_unittest)
582 if (TARGET stacktrace_unittest)
583 add_test (NAME stacktrace COMMAND stacktrace_unittest)
584 endif (TARGET stacktrace_unittest)
586 add_test (NAME stl_logging COMMAND stl_logging_unittest)
588 if (TARGET symbolize_unittest)
589 add_test (NAME symbolize COMMAND symbolize_unittest)
590 endif (TARGET symbolize_unittest)
591 endif (BUILD_TESTING)
593 install (TARGETS glog
595 RUNTIME DESTINATION ${_glog_CMake_BINDIR}
596 PUBLIC_HEADER DESTINATION ${_glog_CMake_INCLUDE_DIR}/glog
597 LIBRARY DESTINATION ${_glog_CMake_LIBDIR}
598 ARCHIVE DESTINATION ${_glog_CMake_LIBDIR})
601 set (gflags_DEPENDENCY "find_dependency (gflags ${gflags_VERSION})")
604 configure_package_config_file (glog-config.cmake.in
605 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake
606 INSTALL_DESTINATION ${_glog_CMake_INSTALLDIR}
607 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
609 write_basic_package_version_file (glog-config-version.cmake VERSION
610 ${GLOG_VERSION} COMPATIBILITY SameMajorVersion)
612 export (TARGETS glog NAMESPACE glog:: FILE glog-targets.cmake)
613 export (PACKAGE glog)
616 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake
617 ${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake
618 DESTINATION ${_glog_CMake_INSTALLDIR})
620 install (EXPORT glog-targets NAMESPACE glog:: DESTINATION
621 ${_glog_CMake_INSTALLDIR})