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)
50 set (CMAKE_THREAD_PREFER_PTHREAD 1)
53 find_package (gflags 2.2.0)
56 set (HAVE_LIB_GFLAGS 1)
57 determine_gflags_namespace (gflags_NAMESPACE)
62 find_package (Threads)
65 check_include_file (dlfcn.h HAVE_DLFCN_H)
66 check_include_file (execinfo.h HAVE_EXECINFO_H)
67 check_include_file (glob.h HAVE_GLOB_H)
68 check_include_file (inttypes.h HAVE_INTTYPES_H)
69 check_include_file (libunwind.h HAVE_LIBUNWIND_H)
70 check_include_file (memory.h HAVE_MEMORY_H)
71 check_include_file (pwd.h HAVE_PWD_H)
72 check_include_file (stdint.h HAVE_STDINT_H)
73 check_include_file (stdlib.h HAVE_STDLIB_H)
74 check_include_file (string.h HAVE_STRING_H)
75 check_include_file (strings.h HAVE_STRINGS_H)
76 check_include_file (sys/stat.h HAVE_SYS_STAT_H)
77 check_include_file (sys/syscall.h HAVE_SYS_SYSCALL_H)
78 check_include_file (sys/time.h HAVE_SYS_TIME_H)
79 check_include_file (sys/types.h HAVE_SYS_TYPES_H)
80 check_include_file (sys/utsname.h HAVE_SYS_UTSNAME_H)
81 check_include_file (syscall.h HAVE_SYSCALL_H)
82 check_include_file (syslog.h HAVE_SYSLOG_H)
83 check_include_file (ucontext.h HAVE_UCONTEXT_H)
84 check_include_file (unistd.h HAVE_UNISTD_H)
85 check_include_file (unwind.h HAVE_UNWIND_H)
87 check_include_file_cxx ("ext/hash_map" HAVE_EXT_HASH_MAP)
88 check_include_file_cxx ("ext/hash_set" HAVE_EXT_HASH_SET)
89 check_include_file_cxx ("ext/slist" HAVE_EXT_SLIST)
90 check_include_file_cxx ("tr1/unordered_map" HAVE_TR1_UNORDERED_MAP)
91 check_include_file_cxx ("tr1/unordered_set" HAVE_TR1_UNORDERED_SET)
92 check_include_file_cxx ("unordered_map" HAVE_UNORDERED_MAP)
93 check_include_file_cxx ("unordered_set" HAVE_UNORDERED_SET)
95 check_type_size ("unsigned __int16" HAVE___UINT16)
96 check_type_size (u_int16_t HAVE_U_INT16_T)
97 check_type_size (uint16_t HAVE_UINT16_T)
99 check_function_exists (dladdr HAVE_DLADDR)
100 check_function_exists (fcntl HAVE_FCNTL)
101 check_function_exists (pread HAVE_PREAD)
102 check_function_exists (pwrite HAVE_PWRITE)
103 check_function_exists (sigaction HAVE_SIGACTION)
104 check_function_exists (sigaltstack HAVE_SIGALSTACK)
106 # NOTE gcc does not fail if you pass a non-existent -Wno-* option as an
107 # argument. However, it will happily fail if you pass the corresponding -W*
108 # option. So, we check whether options that disable warnings exist by testing
109 # the availability of the corresponding option that enables the warning. This
110 # eliminates the need to check for compiler for several (mainly Clang) options.
112 check_cxx_compiler_flag (-Wdeprecated HAVE_NO_DEPRECATED)
113 check_cxx_compiler_flag (-Wunnamed-type-template-args
114 HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
116 # NOTE: Cannot use check_function_exists here since >=vc-14.0 can define
117 # snprintf as an inline function
118 check_symbol_exists (snprintf stdio.h HAVE_SNPRINTF)
120 check_library_exists (unwind get_static_proc_name "" HAVE_LIB_UNWIND)
122 find_library (UNWIND_LIBRARY NAMES unwind DOC "unwind library")
123 mark_as_advanced (UNWIND_LIBRARY)
125 check_c_source_compiles ("
127 static void foo(void) __attribute__ ((unused));
128 int main(void) { return 0; }
129 " HAVE___ATTRIBUTE__)
131 check_c_source_compiles ("
133 static void foo(void) __attribute__ ((visibility(\"default\")));
134 int main(void) { return 0; }
135 " HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
137 check_c_source_compiles ("
139 static void foo(void) __attribute__ ((visibility(\"hidden\")));
140 int main(void) { return 0; }
141 " HAVE___ATTRIBUTE__VISIBILITY_HIDDEN)
143 check_c_source_compiles ("
144 int main(void) { if (__builtin_expect(0, 0)) return 1; return 0; }
145 " HAVE___BUILTIN_EXPECT)
147 check_c_source_compiles ("
150 int a; if (__sync_val_compare_and_swap(&a, 0, 1)) return 1; return 0;
152 " HAVE___SYNC_VAL_COMPARE_AND_SWAP)
154 check_c_source_compiles ("
155 #define _XOPEN_SOURCE 500
160 pthread_rwlock_init(&l, NULL);
161 pthread_rwlock_rdlock(&l);
166 check_c_source_compiles ("
167 __declspec(selectany) int a;
168 int main(void) { return 0; }
171 check_cxx_source_compiles ("
173 vector<int> t; int main() { }
176 check_cxx_source_compiles ("
178 std::vector<int> t; int main() { }
181 check_cxx_source_compiles ("
183 std::ostream& operator<<(std::ostream&, struct s);
186 " HAVE_USING_OPERATOR)
188 check_cxx_source_compiles ("
189 namespace Outer { namespace Inner { int i = 0; }}
190 using namespace Outer::Inner;;
191 int main() { return i; }
194 check_cxx_source_compiles ("
195 __declspec(thread) int tls;
199 check_cxx_source_compiles ("
200 thread_local int tls;
204 check_cxx_source_compiles ("
205 __attribute__((thread)) int tls;
211 set (GLOG_THREAD_LOCAL_STORAGE "__attribute__((thread))")
212 elseif (HAVE_MSVC_TLS)
213 set (GLOG_THREAD_LOCAL_STORAGE "__declspec(thread)")
214 elseif (HAVE_CXX11_TLS)
215 set (GLOG_THREAD_LOCAL_STORAGE thread_local)
216 endif (HAVE_CYGWIN_TLS)
224 "uc_regs->gregs[PT_NIP]"
239 set (_PC_HEADERS ucontext.h signal.h)
241 if (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
242 foreach (_PC_FIELD ${_PC_FIELDS})
243 foreach (_PC_HEADER ${_PC_HEADERS})
245 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/uctfield.c)
246 file (WRITE ${_TMP} "
247 #define _GNU_SOURCE 1
248 #include <${_PC_HEADER}>
252 return u.${_PC_FIELD} == 0;
255 try_compile (HAVE_PC_FROM_UCONTEXT ${CMAKE_CURRENT_BINARY_DIR} ${_TMP}
256 COMPILE_DEFINITIONS _GNU_SOURCE=1)
258 if (HAVE_PC_FROM_UCONTEXT)
259 set (PC_FROM_UCONTEXT ${_PC_FIELD} CACHE)
260 endif (HAVE_PC_FROM_UCONTEXT)
261 endforeach (_PC_HEADER)
262 endforeach (_PC_FIELD)
263 endif (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
265 if (STL_STD_NAMESPACE)
266 set (STL_NAMESPACE std)
267 else (STL_STD_NAMESPACE)
268 set (STL_NAMESPACE "")
269 endif (STL_STD_NAMESPACE)
271 set (GOOGLE_NAMESPACE google)
272 set (_START_GOOGLE_NAMESPACE_ "namespace ${GOOGLE_NAMESPACE} {")
273 set (_END_GOOGLE_NAMESPACE_ "}")
276 set (ac_cv_have___uint16 1)
278 set (ac_cv_have___uint16 0)
279 endif (HAVE___UINT16)
282 set (ac_cv_have_inttypes_h 1)
283 else (HAVE_INTTYPES_H)
284 set (ac_cv_have_inttypes_h 0)
285 endif (HAVE_INTTYPES_H)
288 set (ac_cv_have_libgflags 1)
289 else (HAVE_LIB_GFLAGS)
290 set (ac_cv_have_libgflags 0)
291 endif (HAVE_LIB_GFLAGS)
294 set (ac_cv_have_stdint_h 1)
296 set (ac_cv_have_stdint_h 0)
297 endif (HAVE_STDINT_H)
299 if (HAVE_SYS_TYPES_H)
300 set (ac_cv_have_systypes_h 1)
301 else (HAVE_SYS_TYPES_H)
302 set (ac_cv_have_systypes_h 0)
303 endif (HAVE_SYS_TYPES_H)
306 set (ac_cv_have_u_int16_t 1)
307 else (HAVE_U_INT16_T)
308 set (ac_cv_have_u_int16_t 0)
309 endif (HAVE_U_INT16_T)
312 set (ac_cv_have_uint16_t 1)
314 set (ac_cv_have_uint16_t 0)
315 endif (HAVE_UINT16_T)
318 set (ac_cv_have_unistd_h 1)
320 set (ac_cv_have_unistd_h 0)
321 endif (HAVE_UNISTD_H)
323 set (ac_google_namespace ${GOOGLE_NAMESPACE})
324 set (ac_google_end_namespace ${_END_GOOGLE_NAMESPACE_})
325 set (ac_google_start_namespace ${_START_GOOGLE_NAMESPACE_})
327 if (HAVE___ATTRIBUTE__)
328 set (ac_cv___attribute___noreturn "__attribute__((noreturn))")
329 set (ac_cv___attribute___noinline "__attribute__((noinline))")
330 elseif (HAVE___DECLSPEC)
331 set (ac_cv___attribute___noreturn "__declspec(noreturn)")
332 #set (ac_cv___attribute___noinline "__declspec(noinline)")
333 endif (HAVE___ATTRIBUTE__)
335 if (HAVE___BUILTIN_EXPECT)
336 set (ac_cv_have___builtin_expect 1)
337 else (HAVE___BUILTIN_EXPECT)
338 set (ac_cv_have___builtin_expect 0)
339 endif (HAVE___BUILTIN_EXPECT)
341 if (HAVE_USING_OPERATOR)
342 set (ac_cv_cxx_using_operator 1)
343 else (HAVE_USING_OPERATOR)
344 set (ac_cv_cxx_using_operator 0)
345 endif (HAVE_USING_OPERATOR)
347 set (SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
349 if (WITH_THREADS AND Threads_FOUND)
350 if (CMAKE_USE_PTHREADS_INIT)
352 endif (CMAKE_USE_PTHREADS_INIT)
353 else (WITH_THREADS AND Threads_FOUND)
355 endif (WITH_THREADS AND Threads_FOUND)
357 set (TEST_SRC_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\")
359 configure_file (src/config.h.cmake.in config.h)
360 configure_file (src/glog/logging.h.in glog/logging.h @ONLY)
361 configure_file (src/glog/raw_logging.h.in glog/raw_logging.h @ONLY)
362 configure_file (src/glog/stl_logging.h.in glog/stl_logging.h @ONLY)
363 configure_file (src/glog/vlog_is_on.h.in glog/vlog_is_on.h @ONLY)
365 set (CMAKE_CXX_VISIBILITY_PRESET default)
366 set (CMAKE_VISIBILITY_INLINES_HIDDEN 1)
369 ${CMAKE_CURRENT_BINARY_DIR}/config.h
370 ${CMAKE_CURRENT_BINARY_DIR}/glog/logging.h
371 ${CMAKE_CURRENT_BINARY_DIR}/glog/raw_logging.h
372 ${CMAKE_CURRENT_BINARY_DIR}/glog/stl_logging.h
373 ${CMAKE_CURRENT_BINARY_DIR}/glog/vlog_is_on.h
374 src/glog/log_severity.h
379 src/base/commandlineflags.h
380 src/base/googleinit.h
393 if (HAVE_PTHREAD OR WIN32)
394 list (APPEND GLOG_SRCS src/signalhandler.cc)
395 endif (HAVE_PTHREAD OR WIN32)
398 list (APPEND GLOG_SRCS
404 add_compile_options ($<$<BOOL:${HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS}>:-Wno-unnamed-type-template-args>)
410 set_target_properties (glog PROPERTIES POSITION_INDEPENDENT_CODE ON)
413 target_link_libraries (glog PUBLIC ${UNWIND_LIBRARY})
414 endif (UNWIND_LIBRARY)
417 target_link_libraries (glog PUBLIC ${CMAKE_THREAD_LIBS_INIT})
420 if (WIN32 AND HAVE_SNPRINTF)
421 set_property (SOURCE src/windows/port.cc APPEND PROPERTY COMPILE_DEFINITIONS
423 endif (WIN32 AND HAVE_SNPRINTF)
426 target_link_libraries (glog PUBLIC gflags)
428 if (NOT BUILD_SHARED_LIBS)
429 # Don't use __declspec(dllexport|dllimport) if this is a static build
430 targeT_compile_definitions (glog PUBLIC GFLAGS_DLL_DECLARE_FLAG= GFLAGS_DLL_DEFINE_FLAG=)
431 endif (NOT BUILD_SHARED_LIBS)
434 set_target_properties (glog PROPERTIES VERSION ${GLOG_MAJOR_VERSION})
435 set_target_properties (glog PROPERTIES SOVERSION ${GLOG_VERSION})
438 target_compile_definitions (glog PUBLIC GLOG_NO_ABBREVIATED_SEVERITIES)
441 set_target_properties (glog PROPERTIES PUBLIC_HEADER "${GLOG_PUBLIC_H}")
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:include>"
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 bin
589 PUBLIC_HEADER DESTINATION include/glog
590 LIBRARY DESTINATION lib
591 ARCHIVE DESTINATION lib)
594 set (gflags_DEPENDENCY "find_dependency (gflags ${gflags_VERSION})")
597 configure_package_config_file (glog-config.cmake.in
598 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake
599 INSTALL_DESTINATION lib/cmake/glog
600 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
602 write_basic_package_version_file (glog-config-version.cmake VERSION
603 ${GLOG_VERSION} COMPATIBILITY SameMajorVersion)
605 export (TARGETS glog NAMESPACE glog:: FILE glog-targets.cmake)
606 export (PACKAGE glog)
609 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake
610 ${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake
611 DESTINATION lib/cmake/glog)
613 install (EXPORT glog-targets NAMESPACE glog:: DESTINATION lib/cmake/glog)