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)
87 check_include_file (pwd.h HAVE_PWD_H)
89 check_include_file_cxx ("ext/hash_map" HAVE_EXT_HASH_MAP)
90 check_include_file_cxx ("ext/hash_set" HAVE_EXT_HASH_SET)
91 check_include_file_cxx ("ext/slist" HAVE_EXT_SLIST)
92 check_include_file_cxx ("tr1/unordered_map" HAVE_TR1_UNORDERED_MAP)
93 check_include_file_cxx ("tr1/unordered_set" HAVE_TR1_UNORDERED_SET)
94 check_include_file_cxx ("unordered_map" HAVE_UNORDERED_MAP)
95 check_include_file_cxx ("unordered_set" HAVE_UNORDERED_SET)
97 check_type_size ("unsigned __int16" HAVE___UINT16)
98 check_type_size (u_int16_t HAVE_U_INT16_T)
99 check_type_size (uint16_t HAVE_UINT16_T)
101 check_function_exists (dladdr HAVE_DLADDR)
102 check_function_exists (fcntl HAVE_FCNTL)
103 check_function_exists (pread HAVE_PREAD)
104 check_function_exists (pwrite HAVE_PWRITE)
105 check_function_exists (sigaction HAVE_SIGACTION)
106 check_function_exists (sigaltstack HAVE_SIGALSTACK)
108 # NOTE gcc does not fail if you pass a non-existent -Wno-* option as an
109 # argument. However, it will happily fail if you pass the corresponding -W*
110 # option. So, we check whether options that disable warnings exist by testing
111 # the availability of the corresponding option that enables the warning. This
112 # eliminates the need to check for compiler for several (mainly Clang) options.
114 check_cxx_compiler_flag (-Wdeprecated HAVE_NO_DEPRECATED)
115 check_cxx_compiler_flag (-Wunnamed-type-template-args
116 HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
118 # NOTE: Cannot use check_function_exists here since >=vc-14.0 can define
119 # snprintf as an inline function
120 check_symbol_exists (snprintf stdio.h HAVE_SNPRINTF)
122 check_library_exists (unwind get_static_proc_name "" HAVE_LIB_UNWIND)
124 find_library (UNWIND_LIBRARY NAMES unwind DOC "unwind library")
125 mark_as_advanced (UNWIND_LIBRARY)
127 check_c_source_compiles ("
129 static void foo(void) __attribute__ ((unused));
130 int main(void) { return 0; }
131 " HAVE___ATTRIBUTE__)
133 check_c_source_compiles ("
135 static void foo(void) __attribute__ ((visibility(\"default\")));
136 int main(void) { return 0; }
137 " HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
139 check_c_source_compiles ("
141 static void foo(void) __attribute__ ((visibility(\"hidden\")));
142 int main(void) { return 0; }
143 " HAVE___ATTRIBUTE__VISIBILITY_HIDDEN)
145 check_c_source_compiles ("
146 int main(void) { if (__builtin_expect(0, 0)) return 1; return 0; }
147 " HAVE___BUILTIN_EXPECT)
149 check_c_source_compiles ("
152 int a; if (__sync_val_compare_and_swap(&a, 0, 1)) return 1; return 0;
154 " HAVE___SYNC_VAL_COMPARE_AND_SWAP)
156 check_c_source_compiles ("
157 #define _XOPEN_SOURCE 500
162 pthread_rwlock_init(&l, NULL);
163 pthread_rwlock_rdlock(&l);
168 check_c_source_compiles ("
169 __declspec(selectany) int a;
170 int main(void) { return 0; }
173 check_cxx_source_compiles ("
175 vector<int> t; int main() { }
178 check_cxx_source_compiles ("
180 std::vector<int> t; int main() { }
183 check_cxx_source_compiles ("
185 std::ostream& operator<<(std::ostream&, struct s);
188 " HAVE_USING_OPERATOR)
190 check_cxx_source_compiles ("
191 namespace Outer { namespace Inner { int i = 0; }}
192 using namespace Outer::Inner;;
193 int main() { return i; }
196 check_cxx_source_compiles ("
201 check_cxx_source_compiles ("
202 __declspec(thread) int tls;
206 check_cxx_source_compiles ("
207 thread_local int tls;
212 # Cygwin does not support the thread attribute. Don't bother.
214 set (GLOG_THREAD_LOCAL_STORAGE "__thread")
215 elseif (HAVE_MSVC_TLS)
216 set (GLOG_THREAD_LOCAL_STORAGE "__declspec(thread)")
217 elseif (HAVE_CXX11_TLS)
218 set (GLOG_THREAD_LOCAL_STORAGE thread_local)
227 "uc_regs->gregs[PT_NIP]"
242 set (_PC_HEADERS ucontext.h signal.h)
244 if (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
245 foreach (_PC_FIELD ${_PC_FIELDS})
246 foreach (_PC_HEADER ${_PC_HEADERS})
248 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/uctfield.c)
249 file (WRITE ${_TMP} "
250 #define _GNU_SOURCE 1
251 #include <${_PC_HEADER}>
255 return u.${_PC_FIELD} == 0;
258 try_compile (HAVE_PC_FROM_UCONTEXT ${CMAKE_CURRENT_BINARY_DIR} ${_TMP}
259 COMPILE_DEFINITIONS _GNU_SOURCE=1)
261 if (HAVE_PC_FROM_UCONTEXT)
262 set (PC_FROM_UCONTEXT ${_PC_FIELD} CACHE)
263 endif (HAVE_PC_FROM_UCONTEXT)
264 endforeach (_PC_HEADER)
265 endforeach (_PC_FIELD)
266 endif (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
268 if (STL_STD_NAMESPACE)
269 set (STL_NAMESPACE std)
270 else (STL_STD_NAMESPACE)
271 set (STL_NAMESPACE "")
272 endif (STL_STD_NAMESPACE)
274 set (GOOGLE_NAMESPACE google)
275 set (_START_GOOGLE_NAMESPACE_ "namespace ${GOOGLE_NAMESPACE} {")
276 set (_END_GOOGLE_NAMESPACE_ "}")
279 set (ac_cv_have___uint16 1)
281 set (ac_cv_have___uint16 0)
282 endif (HAVE___UINT16)
285 set (ac_cv_have_inttypes_h 1)
286 else (HAVE_INTTYPES_H)
287 set (ac_cv_have_inttypes_h 0)
288 endif (HAVE_INTTYPES_H)
291 set (ac_cv_have_libgflags 1)
292 else (HAVE_LIB_GFLAGS)
293 set (ac_cv_have_libgflags 0)
294 endif (HAVE_LIB_GFLAGS)
297 set (ac_cv_have_stdint_h 1)
299 set (ac_cv_have_stdint_h 0)
300 endif (HAVE_STDINT_H)
302 if (HAVE_SYS_TYPES_H)
303 set (ac_cv_have_systypes_h 1)
304 else (HAVE_SYS_TYPES_H)
305 set (ac_cv_have_systypes_h 0)
306 endif (HAVE_SYS_TYPES_H)
309 set (ac_cv_have_u_int16_t 1)
310 else (HAVE_U_INT16_T)
311 set (ac_cv_have_u_int16_t 0)
312 endif (HAVE_U_INT16_T)
315 set (ac_cv_have_uint16_t 1)
317 set (ac_cv_have_uint16_t 0)
318 endif (HAVE_UINT16_T)
321 set (ac_cv_have_unistd_h 1)
323 set (ac_cv_have_unistd_h 0)
324 endif (HAVE_UNISTD_H)
326 set (ac_google_namespace ${GOOGLE_NAMESPACE})
327 set (ac_google_end_namespace ${_END_GOOGLE_NAMESPACE_})
328 set (ac_google_start_namespace ${_START_GOOGLE_NAMESPACE_})
330 if (HAVE___ATTRIBUTE__)
331 set (ac_cv___attribute___noreturn "__attribute__((noreturn))")
332 set (ac_cv___attribute___noinline "__attribute__((noinline))")
333 elseif (HAVE___DECLSPEC)
334 set (ac_cv___attribute___noreturn "__declspec(noreturn)")
335 #set (ac_cv___attribute___noinline "__declspec(noinline)")
336 endif (HAVE___ATTRIBUTE__)
338 if (HAVE___BUILTIN_EXPECT)
339 set (ac_cv_have___builtin_expect 1)
340 else (HAVE___BUILTIN_EXPECT)
341 set (ac_cv_have___builtin_expect 0)
342 endif (HAVE___BUILTIN_EXPECT)
344 if (HAVE_USING_OPERATOR)
345 set (ac_cv_cxx_using_operator 1)
346 else (HAVE_USING_OPERATOR)
347 set (ac_cv_cxx_using_operator 0)
348 endif (HAVE_USING_OPERATOR)
350 set (SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
352 if (WITH_THREADS AND Threads_FOUND)
353 if (CMAKE_USE_PTHREADS_INIT)
355 endif (CMAKE_USE_PTHREADS_INIT)
356 else (WITH_THREADS AND Threads_FOUND)
358 endif (WITH_THREADS AND Threads_FOUND)
360 set (TEST_SRC_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\")
362 configure_file (src/config.h.cmake.in config.h)
363 configure_file (src/glog/logging.h.in glog/logging.h @ONLY)
364 configure_file (src/glog/raw_logging.h.in glog/raw_logging.h @ONLY)
365 configure_file (src/glog/stl_logging.h.in glog/stl_logging.h @ONLY)
366 configure_file (src/glog/vlog_is_on.h.in glog/vlog_is_on.h @ONLY)
368 set (CMAKE_CXX_VISIBILITY_PRESET default)
369 set (CMAKE_VISIBILITY_INLINES_HIDDEN 1)
372 ${CMAKE_CURRENT_BINARY_DIR}/config.h
373 ${CMAKE_CURRENT_BINARY_DIR}/glog/logging.h
374 ${CMAKE_CURRENT_BINARY_DIR}/glog/raw_logging.h
375 ${CMAKE_CURRENT_BINARY_DIR}/glog/stl_logging.h
376 ${CMAKE_CURRENT_BINARY_DIR}/glog/vlog_is_on.h
377 src/glog/log_severity.h
382 src/base/commandlineflags.h
383 src/base/googleinit.h
396 if (HAVE_PTHREAD OR WIN32)
397 list (APPEND GLOG_SRCS src/signalhandler.cc)
398 endif (HAVE_PTHREAD OR WIN32)
401 list (APPEND GLOG_SRCS
407 add_compile_options ($<$<BOOL:${HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS}>:-Wno-unnamed-type-template-args>)
413 set_target_properties (glog PROPERTIES POSITION_INDEPENDENT_CODE ON)
416 target_link_libraries (glog PUBLIC ${UNWIND_LIBRARY})
417 endif (UNWIND_LIBRARY)
420 target_link_libraries (glog PUBLIC ${CMAKE_THREAD_LIBS_INIT})
423 if (WIN32 AND HAVE_SNPRINTF)
424 set_property (SOURCE src/windows/port.cc APPEND PROPERTY COMPILE_DEFINITIONS
426 endif (WIN32 AND HAVE_SNPRINTF)
429 target_link_libraries (glog PUBLIC gflags)
431 if (NOT BUILD_SHARED_LIBS)
432 # Don't use __declspec(dllexport|dllimport) if this is a static build
433 targeT_compile_definitions (glog PUBLIC GFLAGS_DLL_DECLARE_FLAG= GFLAGS_DLL_DEFINE_FLAG=)
434 endif (NOT BUILD_SHARED_LIBS)
437 set_target_properties (glog PROPERTIES VERSION ${GLOG_MAJOR_VERSION})
438 set_target_properties (glog PROPERTIES SOVERSION ${GLOG_VERSION})
441 target_compile_definitions (glog PUBLIC GLOG_NO_ABBREVIATED_SEVERITIES)
444 set_target_properties (glog PROPERTIES PUBLIC_HEADER "${GLOG_PUBLIC_H}")
446 set (_glog_CMake_BINDIR ${CMAKE_INSTALL_BINDIR})
447 set (_glog_CMake_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR})
448 set (_glog_CMake_LIBDIR ${CMAKE_INSTALL_LIBDIR})
449 set (_glog_CMake_INSTALLDIR ${_glog_CMake_LIBDIR}/cmake/glog)
451 target_include_directories (glog BEFORE PUBLIC
452 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
453 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
454 "$<INSTALL_INTERFACE:${_glog_CMake_INCLUDE_DIR}>"
455 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
456 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
459 target_include_directories (glog PUBLIC
460 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/windows>"
461 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/windows)
464 set_target_properties (glog PROPERTIES DEFINE_SYMBOL LIBGLOG_EXPORTS)
466 if (NOT BUILD_SHARED_LIBS)
467 target_compile_definitions (glog PUBLIC GOOGLE_GLOG_DLL_DECL=)
468 else (NOT BUILD_SHARED_LIBS)
469 target_compile_definitions (glog PRIVATE GOOGLE_GLOG_IS_A_DLL=1)
471 if (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
472 set (_EXPORT "__attribute__((visibility(\"default\")))")
474 elseif (HAVE___DECLSPEC)
475 set (_EXPORT "__declspec(dllexport)")
476 set (_IMPORT "__declspec(dllimport)")
477 endif (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
479 target_compile_definitions (glog PRIVATE
480 "GOOGLE_GLOG_DLL_DECL=${_EXPORT}")
481 target_compile_definitions (glog INTERFACE
482 "GOOGLE_GLOG_DLL_DECL=${_IMPORT}")
483 target_compile_definitions (glog INTERFACE
484 "GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS=${_IMPORT}")
485 endif (NOT BUILD_SHARED_LIBS)
488 set (HAVE_STACKTRACE 1)
489 endif (HAVE_EXECINFO_H)
492 set (HAVE_STACKTRACE 1)
493 set (HAVE_SYMBOLIZE 1)
496 if (UNIX OR (APPLE AND HAVE_DLADDR))
497 set (HAVE_SYMBOLIZE 1)
498 endif (UNIX OR (APPLE AND HAVE_DLADDR))
503 add_executable (logging_unittest
504 src/logging_unittest.cc
507 target_link_libraries (logging_unittest PRIVATE glog)
509 add_executable (stl_logging_unittest
510 src/stl_logging_unittest.cc
513 target_link_libraries (stl_logging_unittest PRIVATE glog)
515 if (HAVE_NO_DEPRECATED)
516 set_property (TARGET stl_logging_unittest APPEND PROPERTY COMPILE_OPTIONS
518 endif (HAVE_NO_DEPRECATED)
520 if (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
521 target_compile_definitions (stl_logging_unittest PRIVATE
522 GLOG_STL_LOGGING_FOR_UNORDERED)
523 endif (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
525 if (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
526 target_compile_definitions (stl_logging_unittest PRIVATE
527 GLOG_STL_LOGGING_FOR_TR1_UNORDERED)
528 endif (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
530 if (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
531 target_compile_definitions (stl_logging_unittest PRIVATE
532 GLOG_STL_LOGGING_FOR_EXT_HASH)
533 endif (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
536 target_compile_definitions (stl_logging_unittest PRIVATE
537 GLOG_STL_LOGGING_FOR_EXT_SLIST)
538 endif (HAVE_EXT_SLIST)
541 add_executable (symbolize_unittest
542 src/symbolize_unittest.cc
545 target_link_libraries (symbolize_unittest PRIVATE glog)
546 endif (HAVE_SYMBOLIZE)
548 add_executable (demangle_unittest
549 src/demangle_unittest.cc
552 target_link_libraries (demangle_unittest PRIVATE glog)
555 add_executable (stacktrace_unittest
556 src/stacktrace_unittest.cc
559 target_link_libraries (stacktrace_unittest PRIVATE glog)
560 endif (HAVE_STACKTRACE)
562 add_executable (utilities_unittest
563 src/utilities_unittest.cc
566 target_link_libraries (utilities_unittest PRIVATE glog)
568 if (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
569 add_executable (signalhandler_unittest
570 src/signalhandler_unittest.cc
573 target_link_libraries (signalhandler_unittest PRIVATE glog)
574 endif (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
576 add_test (NAME demangle COMMAND demangle_unittest)
577 add_test (NAME logging COMMAND logging_unittest)
579 if (TARGET signalhandler_unittest)
580 add_test (NAME signalhandler COMMAND signalhandler_unittest)
581 endif (TARGET signalhandler_unittest)
583 if (TARGET stacktrace_unittest)
584 add_test (NAME stacktrace COMMAND stacktrace_unittest)
585 endif (TARGET stacktrace_unittest)
587 add_test (NAME stl_logging COMMAND stl_logging_unittest)
589 if (TARGET symbolize_unittest)
590 add_test (NAME symbolize COMMAND symbolize_unittest)
591 endif (TARGET symbolize_unittest)
592 endif (BUILD_TESTING)
594 install (TARGETS glog
596 RUNTIME DESTINATION ${_glog_CMake_BINDIR}
597 PUBLIC_HEADER DESTINATION ${_glog_CMake_INCLUDE_DIR}/glog
598 LIBRARY DESTINATION ${_glog_CMake_LIBDIR}
599 ARCHIVE DESTINATION ${_glog_CMake_LIBDIR})
602 set (gflags_DEPENDENCY "find_dependency (gflags ${gflags_VERSION})")
605 configure_package_config_file (glog-config.cmake.in
606 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake
607 INSTALL_DESTINATION ${_glog_CMake_INSTALLDIR}
608 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
610 write_basic_package_version_file (glog-config-version.cmake VERSION
611 ${GLOG_VERSION} COMPATIBILITY SameMajorVersion)
613 export (TARGETS glog NAMESPACE glog:: FILE glog-targets.cmake)
614 export (PACKAGE glog)
617 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake
618 ${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake
619 DESTINATION ${_glog_CMake_INSTALLDIR})
621 install (EXPORT glog-targets NAMESPACE glog:: DESTINATION
622 ${_glog_CMake_INSTALLDIR})