1 cmake_minimum_required (VERSION 3.0)
4 cmake_policy (SET CMP0042 NEW)
8 cmake_policy (SET CMP0063 NEW)
11 project(glog VERSION 0.3.5 LANGUAGES C CXX)
13 set (CPACK_PACKAGE_NAME glog)
14 set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "")
15 set (CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
16 set (CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
17 set (CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
18 set (CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
20 option (WITH_GFLAGS "Use gflags" ON)
21 option (WITH_THREADS "Enable multithreading support" ON)
22 option (WITH_TLS "Enable Thread Local Storage (TLS) support" ON)
24 list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
26 include (CheckCSourceCompiles)
27 include (CheckCXXCompilerFlag)
28 include (CheckCXXSourceCompiles)
29 include (CheckFunctionExists)
30 include (CheckIncludeFile)
31 include (CheckIncludeFileCXX)
32 include (CheckLibraryExists)
33 include (CheckStructHasMember)
34 include (CheckSymbolExists)
35 include (CheckTypeSize)
36 include (CMakePackageConfigHelpers)
39 include (DetermineGflagsNamespace)
40 include (GNUInstallDirs)
42 set (CMAKE_DEBUG_POSTFIX d)
43 set (CMAKE_THREAD_PREFER_PTHREAD 1)
46 find_package (gflags 2.2.0)
49 set (HAVE_LIB_GFLAGS 1)
50 determine_gflags_namespace (gflags_NAMESPACE)
55 find_package (Threads)
58 check_include_file (dlfcn.h HAVE_DLFCN_H)
59 check_include_file (execinfo.h HAVE_EXECINFO_H)
60 check_include_file (glob.h HAVE_GLOB_H)
61 check_include_file (inttypes.h HAVE_INTTYPES_H)
62 check_include_file (libunwind.h HAVE_LIBUNWIND_H)
63 check_include_file (memory.h HAVE_MEMORY_H)
64 check_include_file (pwd.h HAVE_PWD_H)
65 check_include_file (stdint.h HAVE_STDINT_H)
66 check_include_file (stdlib.h HAVE_STDLIB_H)
67 check_include_file (string.h HAVE_STRING_H)
68 check_include_file (strings.h HAVE_STRINGS_H)
69 check_include_file (sys/stat.h HAVE_SYS_STAT_H)
70 check_include_file (sys/syscall.h HAVE_SYS_SYSCALL_H)
71 check_include_file (sys/time.h HAVE_SYS_TIME_H)
72 check_include_file (sys/types.h HAVE_SYS_TYPES_H)
73 check_include_file (sys/utsname.h HAVE_SYS_UTSNAME_H)
74 check_include_file (syscall.h HAVE_SYSCALL_H)
75 check_include_file (syslog.h HAVE_SYSLOG_H)
76 check_include_file (ucontext.h HAVE_UCONTEXT_H)
77 check_include_file (unistd.h HAVE_UNISTD_H)
78 check_include_file (unwind.h HAVE_UNWIND_H)
79 check_include_file (pwd.h HAVE_PWD_H)
81 check_include_file_cxx ("ext/hash_map" HAVE_EXT_HASH_MAP)
82 check_include_file_cxx ("ext/hash_set" HAVE_EXT_HASH_SET)
83 check_include_file_cxx ("ext/slist" HAVE_EXT_SLIST)
84 check_include_file_cxx ("tr1/unordered_map" HAVE_TR1_UNORDERED_MAP)
85 check_include_file_cxx ("tr1/unordered_set" HAVE_TR1_UNORDERED_SET)
86 check_include_file_cxx ("unordered_map" HAVE_UNORDERED_MAP)
87 check_include_file_cxx ("unordered_set" HAVE_UNORDERED_SET)
89 check_type_size ("unsigned __int16" HAVE___UINT16)
90 check_type_size (u_int16_t HAVE_U_INT16_T)
91 check_type_size (uint16_t HAVE_UINT16_T)
93 check_function_exists (dladdr HAVE_DLADDR)
94 check_function_exists (fcntl HAVE_FCNTL)
95 check_function_exists (pread HAVE_PREAD)
96 check_function_exists (pwrite HAVE_PWRITE)
97 check_function_exists (sigaction HAVE_SIGACTION)
98 check_function_exists (sigaltstack HAVE_SIGALSTACK)
100 # NOTE gcc does not fail if you pass a non-existent -Wno-* option as an
101 # argument. However, it will happily fail if you pass the corresponding -W*
102 # option. So, we check whether options that disable warnings exist by testing
103 # the availability of the corresponding option that enables the warning. This
104 # eliminates the need to check for compiler for several (mainly Clang) options.
106 check_cxx_compiler_flag (-Wdeprecated HAVE_NO_DEPRECATED)
107 check_cxx_compiler_flag (-Wunnamed-type-template-args
108 HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
110 # NOTE: Cannot use check_function_exists here since >=vc-14.0 can define
111 # snprintf as an inline function
112 check_symbol_exists (snprintf stdio.h HAVE_SNPRINTF)
114 check_library_exists (unwind get_static_proc_name "" HAVE_LIB_UNWIND)
116 find_library (UNWIND_LIBRARY NAMES unwind DOC "unwind library")
117 mark_as_advanced (UNWIND_LIBRARY)
119 check_c_source_compiles ("
121 static void foo(void) __attribute__ ((unused));
122 int main(void) { return 0; }
123 " HAVE___ATTRIBUTE__)
125 check_c_source_compiles ("
127 static void foo(void) __attribute__ ((visibility(\"default\")));
128 int main(void) { return 0; }
129 " HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
131 check_c_source_compiles ("
133 static void foo(void) __attribute__ ((visibility(\"hidden\")));
134 int main(void) { return 0; }
135 " HAVE___ATTRIBUTE__VISIBILITY_HIDDEN)
137 check_c_source_compiles ("
138 int main(void) { if (__builtin_expect(0, 0)) return 1; return 0; }
139 " HAVE___BUILTIN_EXPECT)
141 check_c_source_compiles ("
144 int a; if (__sync_val_compare_and_swap(&a, 0, 1)) return 1; return 0;
146 " HAVE___SYNC_VAL_COMPARE_AND_SWAP)
148 check_c_source_compiles ("
149 #define _XOPEN_SOURCE 500
154 pthread_rwlock_init(&l, NULL);
155 pthread_rwlock_rdlock(&l);
160 check_c_source_compiles ("
161 __declspec(selectany) int a;
162 int main(void) { return 0; }
165 check_cxx_source_compiles ("
167 vector<int> t; int main() { }
170 check_cxx_source_compiles ("
172 std::vector<int> t; int main() { }
175 check_cxx_source_compiles ("
177 std::ostream& operator<<(std::ostream&, struct s);
180 " HAVE_USING_OPERATOR)
182 check_cxx_source_compiles ("
183 namespace Outer { namespace Inner { int i = 0; }}
184 using namespace Outer::Inner;;
185 int main() { return i; }
188 check_cxx_source_compiles ("
193 check_cxx_source_compiles ("
194 __declspec(thread) int tls;
198 check_cxx_source_compiles ("
199 thread_local int tls;
204 # Cygwin does not support the thread attribute. Don't bother.
206 set (GLOG_THREAD_LOCAL_STORAGE "__thread")
207 elseif (HAVE_MSVC_TLS)
208 set (GLOG_THREAD_LOCAL_STORAGE "__declspec(thread)")
209 elseif (HAVE_CXX11_TLS)
210 set (GLOG_THREAD_LOCAL_STORAGE thread_local)
219 "uc_regs->gregs[PT_NIP]"
234 set (_PC_HEADERS ucontext.h signal.h)
236 if (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
237 foreach (_PC_FIELD ${_PC_FIELDS})
238 foreach (_PC_HEADER ${_PC_HEADERS})
240 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/uctfield.c)
241 file (WRITE ${_TMP} "
242 #define _GNU_SOURCE 1
243 #include <${_PC_HEADER}>
247 return u.${_PC_FIELD} == 0;
250 try_compile (HAVE_PC_FROM_UCONTEXT ${CMAKE_CURRENT_BINARY_DIR} ${_TMP}
251 COMPILE_DEFINITIONS _GNU_SOURCE=1)
253 if (HAVE_PC_FROM_UCONTEXT)
254 set (PC_FROM_UCONTEXT ${_PC_FIELD} CACHE)
255 endif (HAVE_PC_FROM_UCONTEXT)
256 endforeach (_PC_HEADER)
257 endforeach (_PC_FIELD)
258 endif (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
260 if (STL_STD_NAMESPACE)
261 set (STL_NAMESPACE std)
262 else (STL_STD_NAMESPACE)
263 set (STL_NAMESPACE "")
264 endif (STL_STD_NAMESPACE)
266 set (GOOGLE_NAMESPACE google)
267 set (_START_GOOGLE_NAMESPACE_ "namespace ${GOOGLE_NAMESPACE} {")
268 set (_END_GOOGLE_NAMESPACE_ "}")
271 set (ac_cv_have___uint16 1)
273 set (ac_cv_have___uint16 0)
274 endif (HAVE___UINT16)
277 set (ac_cv_have_inttypes_h 1)
278 else (HAVE_INTTYPES_H)
279 set (ac_cv_have_inttypes_h 0)
280 endif (HAVE_INTTYPES_H)
283 set (ac_cv_have_libgflags 1)
284 else (HAVE_LIB_GFLAGS)
285 set (ac_cv_have_libgflags 0)
286 endif (HAVE_LIB_GFLAGS)
289 set (ac_cv_have_stdint_h 1)
291 set (ac_cv_have_stdint_h 0)
292 endif (HAVE_STDINT_H)
294 if (HAVE_SYS_TYPES_H)
295 set (ac_cv_have_systypes_h 1)
296 else (HAVE_SYS_TYPES_H)
297 set (ac_cv_have_systypes_h 0)
298 endif (HAVE_SYS_TYPES_H)
301 set (ac_cv_have_u_int16_t 1)
302 else (HAVE_U_INT16_T)
303 set (ac_cv_have_u_int16_t 0)
304 endif (HAVE_U_INT16_T)
307 set (ac_cv_have_uint16_t 1)
309 set (ac_cv_have_uint16_t 0)
310 endif (HAVE_UINT16_T)
313 set (ac_cv_have_unistd_h 1)
315 set (ac_cv_have_unistd_h 0)
316 endif (HAVE_UNISTD_H)
318 set (ac_google_namespace ${GOOGLE_NAMESPACE})
319 set (ac_google_end_namespace ${_END_GOOGLE_NAMESPACE_})
320 set (ac_google_start_namespace ${_START_GOOGLE_NAMESPACE_})
322 if (HAVE___ATTRIBUTE__)
323 set (ac_cv___attribute___noreturn "__attribute__((noreturn))")
324 set (ac_cv___attribute___noinline "__attribute__((noinline))")
325 elseif (HAVE___DECLSPEC)
326 set (ac_cv___attribute___noreturn "__declspec(noreturn)")
327 #set (ac_cv___attribute___noinline "__declspec(noinline)")
328 endif (HAVE___ATTRIBUTE__)
330 if (HAVE___BUILTIN_EXPECT)
331 set (ac_cv_have___builtin_expect 1)
332 else (HAVE___BUILTIN_EXPECT)
333 set (ac_cv_have___builtin_expect 0)
334 endif (HAVE___BUILTIN_EXPECT)
336 if (HAVE_USING_OPERATOR)
337 set (ac_cv_cxx_using_operator 1)
338 else (HAVE_USING_OPERATOR)
339 set (ac_cv_cxx_using_operator 0)
340 endif (HAVE_USING_OPERATOR)
342 set (SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
344 if (WITH_THREADS AND Threads_FOUND)
345 if (CMAKE_USE_PTHREADS_INIT)
347 endif (CMAKE_USE_PTHREADS_INIT)
348 else (WITH_THREADS AND Threads_FOUND)
350 endif (WITH_THREADS AND Threads_FOUND)
352 set (TEST_SRC_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\")
354 configure_file (src/config.h.cmake.in config.h)
355 configure_file (src/glog/logging.h.in glog/logging.h @ONLY)
356 configure_file (src/glog/raw_logging.h.in glog/raw_logging.h @ONLY)
357 configure_file (src/glog/stl_logging.h.in glog/stl_logging.h @ONLY)
358 configure_file (src/glog/vlog_is_on.h.in glog/vlog_is_on.h @ONLY)
360 set (CMAKE_CXX_VISIBILITY_PRESET default)
361 set (CMAKE_VISIBILITY_INLINES_HIDDEN 1)
364 ${CMAKE_CURRENT_BINARY_DIR}/glog/logging.h
365 ${CMAKE_CURRENT_BINARY_DIR}/glog/raw_logging.h
366 ${CMAKE_CURRENT_BINARY_DIR}/glog/stl_logging.h
367 ${CMAKE_CURRENT_BINARY_DIR}/glog/vlog_is_on.h
368 src/glog/log_severity.h
373 src/base/commandlineflags.h
374 src/base/googleinit.h
387 if (HAVE_PTHREAD OR WIN32)
388 list (APPEND GLOG_SRCS src/signalhandler.cc)
389 endif (HAVE_PTHREAD OR WIN32)
392 list (APPEND GLOG_SRCS
398 add_compile_options ($<$<BOOL:${HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS}>:-Wno-unnamed-type-template-args>)
403 add_library(glog::glog ALIAS glog)
405 set_target_properties (glog PROPERTIES POSITION_INDEPENDENT_CODE ON)
408 target_link_libraries (glog PUBLIC ${UNWIND_LIBRARY})
409 endif (UNWIND_LIBRARY)
412 target_link_libraries (glog PUBLIC ${CMAKE_THREAD_LIBS_INIT})
415 if (WIN32 AND HAVE_SNPRINTF)
416 set_property (SOURCE src/windows/port.cc APPEND PROPERTY COMPILE_DEFINITIONS
418 endif (WIN32 AND HAVE_SNPRINTF)
421 target_link_libraries (glog PUBLIC gflags)
423 if (NOT BUILD_SHARED_LIBS)
424 # Don't use __declspec(dllexport|dllimport) if this is a static build
425 targeT_compile_definitions (glog PUBLIC GFLAGS_DLL_DECLARE_FLAG= GFLAGS_DLL_DEFINE_FLAG=)
426 endif (NOT BUILD_SHARED_LIBS)
429 set_target_properties (glog PROPERTIES VERSION ${PROJECT_VERSION})
430 set_target_properties (glog PROPERTIES SOVERSION ${PROJECT_VERSION_MAJOR})
433 target_compile_definitions (glog PUBLIC GLOG_NO_ABBREVIATED_SEVERITIES)
436 set_target_properties (glog PROPERTIES PUBLIC_HEADER "${GLOG_PUBLIC_H}")
438 set (_glog_CMake_BINDIR ${CMAKE_INSTALL_BINDIR})
439 set (_glog_CMake_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR})
440 set (_glog_CMake_LIBDIR ${CMAKE_INSTALL_LIBDIR})
441 set (_glog_CMake_INSTALLDIR ${_glog_CMake_LIBDIR}/cmake/glog)
443 target_include_directories (glog BEFORE PUBLIC
444 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
445 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
446 "$<INSTALL_INTERFACE:${_glog_CMake_INCLUDE_DIR}>"
447 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
448 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
451 target_include_directories (glog PUBLIC
452 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/windows>"
453 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/windows)
456 set_target_properties (glog PROPERTIES DEFINE_SYMBOL LIBGLOG_EXPORTS)
458 if (NOT BUILD_SHARED_LIBS)
459 target_compile_definitions (glog PUBLIC GOOGLE_GLOG_DLL_DECL=)
460 else (NOT BUILD_SHARED_LIBS)
461 target_compile_definitions (glog PRIVATE GOOGLE_GLOG_IS_A_DLL=1)
463 if (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
464 set (_EXPORT "__attribute__((visibility(\"default\")))")
466 elseif (HAVE___DECLSPEC)
467 set (_EXPORT "__declspec(dllexport)")
468 set (_IMPORT "__declspec(dllimport)")
469 endif (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
471 target_compile_definitions (glog PRIVATE
472 "GOOGLE_GLOG_DLL_DECL=${_EXPORT}")
473 target_compile_definitions (glog INTERFACE
474 "GOOGLE_GLOG_DLL_DECL=${_IMPORT}")
475 target_compile_definitions (glog INTERFACE
476 "GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS=${_IMPORT}")
477 endif (NOT BUILD_SHARED_LIBS)
480 set (HAVE_STACKTRACE 1)
481 endif (HAVE_EXECINFO_H)
484 set (HAVE_STACKTRACE 1)
485 set (HAVE_SYMBOLIZE 1)
488 if (UNIX OR (APPLE AND HAVE_DLADDR))
489 set (HAVE_SYMBOLIZE 1)
490 endif (UNIX OR (APPLE AND HAVE_DLADDR))
495 add_executable (logging_unittest
496 src/logging_unittest.cc
499 target_link_libraries (logging_unittest PRIVATE glog)
501 add_executable (stl_logging_unittest
502 src/stl_logging_unittest.cc
505 target_link_libraries (stl_logging_unittest PRIVATE glog)
507 if (HAVE_NO_DEPRECATED)
508 set_property (TARGET stl_logging_unittest APPEND PROPERTY COMPILE_OPTIONS
510 endif (HAVE_NO_DEPRECATED)
512 if (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
513 target_compile_definitions (stl_logging_unittest PRIVATE
514 GLOG_STL_LOGGING_FOR_UNORDERED)
515 endif (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
517 if (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
518 target_compile_definitions (stl_logging_unittest PRIVATE
519 GLOG_STL_LOGGING_FOR_TR1_UNORDERED)
520 endif (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
522 if (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
523 target_compile_definitions (stl_logging_unittest PRIVATE
524 GLOG_STL_LOGGING_FOR_EXT_HASH)
525 endif (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
528 target_compile_definitions (stl_logging_unittest PRIVATE
529 GLOG_STL_LOGGING_FOR_EXT_SLIST)
530 endif (HAVE_EXT_SLIST)
533 add_executable (symbolize_unittest
534 src/symbolize_unittest.cc
537 target_link_libraries (symbolize_unittest PRIVATE glog)
538 endif (HAVE_SYMBOLIZE)
540 add_executable (demangle_unittest
541 src/demangle_unittest.cc
544 target_link_libraries (demangle_unittest PRIVATE glog)
547 add_executable (stacktrace_unittest
548 src/stacktrace_unittest.cc
551 target_link_libraries (stacktrace_unittest PRIVATE glog)
552 endif (HAVE_STACKTRACE)
554 add_executable (utilities_unittest
555 src/utilities_unittest.cc
558 target_link_libraries (utilities_unittest PRIVATE glog)
560 if (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
561 add_executable (signalhandler_unittest
562 src/signalhandler_unittest.cc
565 target_link_libraries (signalhandler_unittest PRIVATE glog)
566 endif (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
568 add_test (NAME demangle COMMAND demangle_unittest)
569 add_test (NAME logging COMMAND logging_unittest)
571 if (TARGET signalhandler_unittest)
572 add_test (NAME signalhandler COMMAND signalhandler_unittest)
573 endif (TARGET signalhandler_unittest)
575 if (TARGET stacktrace_unittest)
576 add_test (NAME stacktrace COMMAND stacktrace_unittest)
577 endif (TARGET stacktrace_unittest)
579 add_test (NAME stl_logging COMMAND stl_logging_unittest)
581 if (TARGET symbolize_unittest)
582 add_test (NAME symbolize COMMAND symbolize_unittest)
583 endif (TARGET symbolize_unittest)
584 endif (BUILD_TESTING)
586 install (TARGETS glog
588 RUNTIME DESTINATION ${_glog_CMake_BINDIR}
589 PUBLIC_HEADER DESTINATION ${_glog_CMake_INCLUDE_DIR}/glog
590 LIBRARY DESTINATION ${_glog_CMake_LIBDIR}
591 ARCHIVE DESTINATION ${_glog_CMake_LIBDIR})
593 set (glog_POLICY_VERSION 3.0)
596 # Ensure clients locate only the package config and not third party find
597 # modules having the same name. This avoid cmake_policy PUSH/POP errors.
598 if (CMAKE_VERSION VERSION_LESS 3.9)
599 set (gflags_DEPENDENCY "find_dependency (gflags ${gflags_VERSION})")
600 else (CMAKE_VERSION VERSION_LESS 3.9)
601 # Passing additional find_package arguments to find_dependency is possible
602 # starting with CMake 3.9.
603 set (glog_POLICY_VERSION 3.9)
604 set (gflags_DEPENDENCY "find_dependency (gflags ${gflags_VERSION} NO_MODULE)")
605 endif (CMAKE_VERSION VERSION_LESS 3.9)
608 configure_package_config_file (glog-config.cmake.in
609 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake
610 INSTALL_DESTINATION ${_glog_CMake_INSTALLDIR}
611 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
613 write_basic_package_version_file (glog-config-version.cmake VERSION
614 ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion)
616 export (TARGETS glog NAMESPACE glog:: FILE glog-targets.cmake)
617 export (PACKAGE glog)
620 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake
621 ${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake
622 DESTINATION ${_glog_CMake_INSTALLDIR})
624 install (EXPORT glog-targets NAMESPACE glog:: DESTINATION
625 ${_glog_CMake_INSTALLDIR})