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 4)
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 (CMakePackageConfigHelpers)
37 include (CheckCSourceCompiles)
38 include (CheckCXXCompilerFlag)
39 include (CheckCXXSourceCompiles)
40 include (CheckFunctionExists)
41 include (CheckIncludeFile)
42 include (CheckIncludeFileCXX)
43 include (CheckLibraryExists)
44 include (CheckStructHasMember)
45 include (CheckSymbolExists)
46 include (CheckTypeSize)
47 include (DetermineGflagsNamespace)
49 set (CMAKE_THREAD_PREFER_PTHREAD 1)
55 set (HAVE_LIB_GFLAGS 1)
56 determine_gflags_namespace (gflags_NAMESPACE)
61 find_package (Threads)
64 check_include_file (dlfcn.h HAVE_DLFCN_H)
65 check_include_file (execinfo.h HAVE_EXECINFO_H)
66 check_include_file (glob.h HAVE_GLOB_H)
67 check_include_file (inttypes.h HAVE_INTTYPES_H)
68 check_include_file (libunwind.h HAVE_LIBUNWIND_H)
69 check_include_file (memory.h HAVE_MEMORY_H)
70 check_include_file (pwd.h HAVE_PWD_H)
71 check_include_file (stdint.h HAVE_STDINT_H)
72 check_include_file (stdlib.h HAVE_STDLIB_H)
73 check_include_file (string.h HAVE_STRING_H)
74 check_include_file (strings.h HAVE_STRINGS_H)
75 check_include_file (sys/stat.h HAVE_SYS_STAT_H)
76 check_include_file (sys/syscall.h HAVE_SYS_SYSCALL_H)
77 check_include_file (sys/time.h HAVE_SYS_TIME_H)
78 check_include_file (sys/types.h HAVE_SYS_TYPES_H)
79 check_include_file (sys/utsname.h HAVE_SYS_UTSNAME_H)
80 check_include_file (syscall.h HAVE_SYSCALL_H)
81 check_include_file (syslog.h HAVE_SYSLOG_H)
82 check_include_file (ucontext.h HAVE_UCONTEXT_H)
83 check_include_file (unistd.h HAVE_UNISTD_H)
84 check_include_file (unwind.h HAVE_UNWIND_H)
86 check_include_file_cxx ("ext/hash_map" HAVE_EXT_HASH_MAP)
87 check_include_file_cxx ("ext/hash_set" HAVE_EXT_HASH_SET)
88 check_include_file_cxx ("ext/slist" HAVE_EXT_SLIST)
89 check_include_file_cxx ("tr1/unordered_map" HAVE_TR1_UNORDERED_MAP)
90 check_include_file_cxx ("tr1/unordered_set" HAVE_TR1_UNORDERED_SET)
91 check_include_file_cxx ("unordered_map" HAVE_UNORDERED_MAP)
92 check_include_file_cxx ("unordered_set" HAVE_UNORDERED_SET)
94 check_type_size ("unsigned __int16" HAVE___UINT16)
95 check_type_size (u_int16_t HAVE_U_INT16_T)
96 check_type_size (uint16_t HAVE_UINT16_T)
98 check_function_exists (dladdr HAVE_DLADDR)
99 check_function_exists (fcntl HAVE_FCNTL)
100 check_function_exists (pread HAVE_PREAD)
101 check_function_exists (pwrite HAVE_PWRITE)
102 check_function_exists (sigaction HAVE_SIGACTION)
103 check_function_exists (sigaltstack HAVE_SIGALSTACK)
105 check_cxx_compiler_flag (-Wno-deprecated HAVE_NO_DEPRECATED)
106 check_cxx_compiler_flag (-Wno-unnamed-type-template-args
107 HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
109 # NOTE: Cannot use check_function_exists here since >=vc-14.0 can define
110 # snprintf as an inline function
111 check_symbol_exists (snprintf stdio.h HAVE_SNPRINTF)
113 check_library_exists (unwind get_static_proc_name "" HAVE_LIB_UNWIND)
115 find_library (UNWIND_LIBRARY NAMES unwind DOC "unwind library")
116 mark_as_advanced (UNWIND_LIBRARY)
118 check_c_source_compiles ("
120 static void foo(void) __attribute__ ((unused));
121 int main(void) { return 0; }
122 " HAVE___ATTRIBUTE__)
124 check_c_source_compiles ("
126 static void foo(void) __attribute__ ((visibility(\"default\")));
127 int main(void) { return 0; }
128 " HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
130 check_c_source_compiles ("
132 static void foo(void) __attribute__ ((visibility(\"hidden\")));
133 int main(void) { return 0; }
134 " HAVE___ATTRIBUTE__VISIBILITY_HIDDEN)
136 check_c_source_compiles ("
137 int main(void) { if (__builtin_expect(0, 0)) return 1; return 0; }
138 " HAVE___BUILTIN_EXPECT)
140 check_c_source_compiles ("
143 int a; if (__sync_val_compare_and_swap(&a, 0, 1)) return 1; return 0;
145 " HAVE___SYNC_VAL_COMPARE_AND_SWAP)
147 check_c_source_compiles ("
148 #define _XOPEN_SOURCE 500
153 pthread_rwlock_init(&l, NULL);
154 pthread_rwlock_rdlock(&l);
159 check_c_source_compiles ("
160 __declspec(selectany) int a;
161 int main(void) { return 0; }
164 check_cxx_source_compiles ("
166 vector<int> t; int main() { }
169 check_cxx_source_compiles ("
171 std::vector<int> t; int main() { }
174 check_cxx_source_compiles ("
176 std::ostream& operator<<(std::ostream&, struct s);
179 " HAVE_USING_OPERATOR)
181 check_cxx_source_compiles ("
182 namespace Outer { namespace Inner { int i = 0; }}
183 using namespace Outer::Inner;;
184 int main() { return i; }
187 check_cxx_source_compiles ("
188 __declspec(thread) int tls;
192 check_cxx_source_compiles ("
193 thread_local int tls;
197 check_cxx_source_compiles ("
198 __attribute__((thread)) int tls;
204 set (GLOG_THREAD_LOCAL_STORAGE "__attribute__((thread))")
205 elseif (HAVE_MSVC_TLS)
206 set (GLOG_THREAD_LOCAL_STORAGE "__declspec(thread)")
207 elseif (HAVE_CXX11_TLS)
208 set (GLOG_THREAD_LOCAL_STORAGE thread_local)
209 endif (HAVE_CYGWIN_TLS)
217 "uc_regs->gregs[PT_NIP]"
232 set (_PC_HEADERS ucontext.h signal.h)
234 if (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
235 foreach (_PC_FIELD ${_PC_FIELDS})
236 foreach (_PC_HEADER ${_PC_HEADERS})
238 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/uctfield.c)
239 file (WRITE ${_TMP} "
240 #define _GNU_SOURCE 1
241 #include <${_PC_HEADER}>
245 return u.${_PC_FIELD} == 0;
248 try_compile (HAVE_PC_FROM_UCONTEXT ${CMAKE_CURRENT_BINARY_DIR} ${_TMP}
249 COMPILE_DEFINITIONS _GNU_SOURCE=1)
251 if (HAVE_PC_FROM_UCONTEXT)
252 set (PC_FROM_UCONTEXT ${_PC_FIELD} CACHE)
253 endif (HAVE_PC_FROM_UCONTEXT)
254 endforeach (_PC_HEADER)
255 endforeach (_PC_FIELD)
256 endif (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
258 if (STL_STD_NAMESPACE)
259 set (STL_NAMESPACE std)
260 else (STL_STD_NAMESPACE)
261 set (STL_NAMESPACE "")
262 endif (STL_STD_NAMESPACE)
264 set (GOOGLE_NAMESPACE google)
265 set (_START_GOOGLE_NAMESPACE_ "namespace ${GOOGLE_NAMESPACE} {")
266 set (_END_GOOGLE_NAMESPACE_ "}")
269 set (ac_cv_have___uint16 1)
271 set (ac_cv_have___uint16 0)
272 endif (HAVE___UINT16)
275 set (ac_cv_have_inttypes_h 1)
276 else (HAVE_INTTYPES_H)
277 set (ac_cv_have_inttypes_h 0)
278 endif (HAVE_INTTYPES_H)
281 set (ac_cv_have_libgflags 1)
282 else (HAVE_LIB_GFLAGS)
283 set (ac_cv_have_libgflags 0)
284 endif (HAVE_LIB_GFLAGS)
287 set (ac_cv_have_stdint_h 1)
289 set (ac_cv_have_stdint_h 0)
290 endif (HAVE_STDINT_H)
292 if (HAVE_SYS_TYPES_H)
293 set (ac_cv_have_systypes_h 1)
294 else (HAVE_SYS_TYPES_H)
295 set (ac_cv_have_systypes_h 0)
296 endif (HAVE_SYS_TYPES_H)
299 set (ac_cv_have_u_int16_t 1)
300 else (HAVE_U_INT16_T)
301 set (ac_cv_have_u_int16_t 0)
302 endif (HAVE_U_INT16_T)
305 set (ac_cv_have_uint16_t 1)
307 set (ac_cv_have_uint16_t 0)
308 endif (HAVE_UINT16_T)
311 set (ac_cv_have_unistd_h 1)
313 set (ac_cv_have_unistd_h 0)
314 endif (HAVE_UNISTD_H)
316 set (ac_google_namespace ${GOOGLE_NAMESPACE})
317 set (ac_google_end_namespace ${_END_GOOGLE_NAMESPACE_})
318 set (ac_google_start_namespace ${_START_GOOGLE_NAMESPACE_})
320 if (HAVE___ATTRIBUTE__)
321 set (ac_cv___attribute___noreturn "__attribute__((noreturn))")
322 set (ac_cv___attribute___noinline "__attribute__((noinline))")
323 elseif (HAVE___DECLSPEC)
324 set (ac_cv___attribute___noreturn "__declspec(noreturn)")
325 #set (ac_cv___attribute___noinline "__declspec(noinline)")
326 endif (HAVE___ATTRIBUTE__)
328 if (HAVE___BUILTIN_EXPECT)
329 set (ac_cv_have___builtin_expect 1)
330 else (HAVE___BUILTIN_EXPECT)
331 set (ac_cv_have___builtin_expect 0)
332 endif (HAVE___BUILTIN_EXPECT)
334 if (HAVE_USING_OPERATOR)
335 set (ac_cv_cxx_using_operator 1)
336 else (HAVE_USING_OPERATOR)
337 set (ac_cv_cxx_using_operator 0)
338 endif (HAVE_USING_OPERATOR)
340 set (SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
342 if (WITH_THREADS AND Threads_FOUND)
343 if (CMAKE_USE_PTHREADS_INIT)
345 endif (CMAKE_USE_PTHREADS_INIT)
346 else (WITH_THREADS AND Threads_FOUND)
348 endif (WITH_THREADS AND Threads_FOUND)
350 set (TEST_SRC_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\")
352 configure_file (src/config.h.cmake.in config.h)
353 configure_file (src/glog/logging.h.in glog/logging.h @ONLY)
354 configure_file (src/glog/raw_logging.h.in glog/raw_logging.h @ONLY)
355 configure_file (src/glog/stl_logging.h.in glog/stl_logging.h @ONLY)
356 configure_file (src/glog/vlog_is_on.h.in glog/vlog_is_on.h @ONLY)
358 set (CMAKE_CXX_VISIBILITY_PRESET default)
359 set (CMAKE_VISIBILITY_INLINES_HIDDEN 1)
362 ${CMAKE_CURRENT_BINARY_DIR}/config.h
363 ${CMAKE_CURRENT_BINARY_DIR}/glog/logging.h
364 ${CMAKE_CURRENT_BINARY_DIR}/glog/raw_logging.h
365 ${CMAKE_CURRENT_BINARY_DIR}/glog/stl_logging.h
366 ${CMAKE_CURRENT_BINARY_DIR}/glog/vlog_is_on.h
367 src/glog/log_severity.h
372 src/base/commandlineflags.h
373 src/base/googleinit.h
387 list (APPEND GLOG_SRCS src/signalhandler.cc)
391 list (APPEND GLOG_SRCS
402 target_link_libraries (glog PUBLIC ${UNWIND_LIBRARY})
403 endif (UNWIND_LIBRARY)
406 target_link_libraries (glog PUBLIC ${CMAKE_THREAD_LIBS_INIT})
409 if (WIN32 AND HAVE_SNPRINTF)
410 set_property (SOURCE src/windows/port.cc APPEND PROPERTY COMPILE_DEFINITIONS
412 endif (WIN32 AND HAVE_SNPRINTF)
414 if (HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
415 target_compile_options (glog PUBLIC -Wno-unnamed-type-template-args)
416 endif (HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
419 target_include_directories (glog PUBLIC ${gflags_INCLUDE_DIR})
420 target_link_libraries (glog PUBLIC ${gflags_LIBRARIES})
422 if (NOT BUILD_SHARED_LIBS)
423 # Don't use __declspec(dllexport|dllimport) if this is a static build
424 targeT_compile_definitions (glog PUBLIC GFLAGS_DLL_DECLARE_FLAG= GFLAGS_DLL_DEFINE_FLAG=)
425 endif (NOT BUILD_SHARED_LIBS)
428 set_target_properties (glog PROPERTIES VERSION ${GLOG_MAJOR_VERSION})
429 set_target_properties (glog PROPERTIES SOVERSION ${GLOG_VERSION})
432 target_compile_definitions (glog PUBLIC GLOG_NO_ABBREVIATED_SEVERITIES)
435 set_target_properties (glog PROPERTIES PUBLIC_HEADER "${GLOG_PUBLIC_H}")
437 target_include_directories (glog BEFORE PUBLIC
438 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
439 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
440 "$<INSTALL_INTERFACE:include>"
441 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
442 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
445 target_include_directories (glog PUBLIC
446 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/windows>"
447 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/windows)
450 set_target_properties (glog PROPERTIES DEFINE_SYMBOL LIBGLOG_EXPORTS)
452 if (NOT BUILD_SHARED_LIBS)
453 target_compile_definitions (glog PUBLIC GOOGLE_GLOG_DLL_DECL=)
454 else (NOT BUILD_SHARED_LIBS)
455 target_compile_definitions (glog PRIVATE GOOGLE_GLOG_IS_A_DLL=1)
457 if (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
458 set (_EXPORT "__attribute__((visibility(\"default\")))")
460 elseif (HAVE___DECLSPEC)
461 set (_EXPORT "__declspec(dllexport)")
462 set (_IMPORT "__declspec(dllimport)")
463 endif (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
465 target_compile_definitions (glog PRIVATE
466 "GOOGLE_GLOG_DLL_DECL=${_EXPORT}")
467 target_compile_definitions (glog INTERFACE
468 "GOOGLE_GLOG_DLL_DECL=${_IMPORT}")
469 target_compile_definitions (glog INTERFACE
470 "GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS=${_IMPORT}")
471 endif (NOT BUILD_SHARED_LIBS)
474 set (HAVE_STACKTRACE 1)
475 endif (HAVE_EXECINFO_H)
477 if (UNIX OR (APPLE AND HAVE_DLADDR))
478 set (HAVE_SYMBOLIZE 1)
479 endif (UNIX OR (APPLE AND HAVE_DLADDR))
483 add_executable (logging_unittest
484 src/logging_unittest.cc
487 target_link_libraries (logging_unittest PRIVATE glog)
489 add_executable (stl_logging_unittest
490 src/stl_logging_unittest.cc
493 target_link_libraries (stl_logging_unittest PRIVATE glog)
495 if (HAVE_NO_DEPRECATED)
496 set_property (TARGET stl_logging_unittest APPEND PROPERTY COMPILE_OPTIONS
498 endif (HAVE_NO_DEPRECATED)
500 if (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
501 target_compile_definitions (stl_logging_unittest PRIVATE
502 GLOG_STL_LOGGING_FOR_UNORDERED)
503 endif (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
505 if (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
506 target_compile_definitions (stl_logging_unittest PRIVATE
507 GLOG_STL_LOGGING_FOR_TR1_UNORDERED)
508 endif (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
510 if (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
511 target_compile_definitions (stl_logging_unittest PRIVATE
512 GLOG_STL_LOGGING_FOR_EXT_HASH)
513 endif (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
516 target_compile_definitions (stl_logging_unittest PRIVATE
517 GLOG_STL_LOGGING_FOR_EXT_SLIST)
518 endif (HAVE_EXT_SLIST)
521 add_executable (symbolize_unittest
522 src/symbolize_unittest.cc
525 target_link_libraries (symbolize_unittest PRIVATE glog)
526 endif (HAVE_SYMBOLIZE)
528 add_executable (demangle_unittest
529 src/demangle_unittest.cc
532 target_link_libraries (demangle_unittest PRIVATE glog)
535 add_executable (stacktrace_unittest
536 src/stacktrace_unittest.cc
539 target_link_libraries (stacktrace_unittest PRIVATE glog)
540 endif (HAVE_STACKTRACE)
542 add_executable (utilities_unittest
543 src/utilities_unittest.cc
546 target_link_libraries (utilities_unittest PRIVATE glog)
548 if (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
549 add_executable (signalhandler_unittest
550 src/signalhandler_unittest.cc
553 target_link_libraries (signalhandler_unittest PRIVATE glog)
554 endif (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
556 add_test (NAME demangle COMMAND demangle_unittest)
557 add_test (NAME logging COMMAND logging_unittest)
559 if (TARGET signalhandler_unittest)
560 add_test (NAME signalhandler COMMAND signalhandler_unittest)
561 endif (TARGET signalhandler_unittest)
563 if (TARGET stacktrace_unittest)
564 add_test (NAME stacktrace COMMAND stacktrace_unittest)
565 endif (TARGET stacktrace_unittest)
567 add_test (NAME stl_logging COMMAND stl_logging_unittest)
569 if (TARGET symbolize_unittest)
570 add_test (NAME symbolize COMMAND symbolize_unittest)
571 endif (TARGET symbolize_unittest)
573 install (TARGETS glog
575 RUNTIME DESTINATION bin
576 PUBLIC_HEADER DESTINATION include/glog
577 LIBRARY DESTINATION lib
578 ARCHIVE DESTINATION lib)
582 set (glog_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
583 set (glog_PACKAGE_DEPS)
586 set (glog_PACKAGE_DEPS
588 include (CMakeFindDependencyMacro)
590 find_dependency (gflags ${gflags_VERSION})
594 configure_package_config_file (glog-config.cmake.in
595 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake INSTALL_DESTINATION
596 lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
597 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
599 # The version file is the same both for build tree and install mode config
600 write_basic_package_version_file (glog-config-version.cmake VERSION
601 ${GLOG_VERSION} COMPATIBILITY SameMajorVersion)
605 set (glog_INCLUDE_DIR include)
607 configure_package_config_file (glog-config.cmake.in
608 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
609 INSTALL_DESTINATION lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
610 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
612 export (TARGETS glog FILE glog-targets.cmake)
613 export (PACKAGE glog)
616 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
617 ${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake
618 DESTINATION lib/cmake/glog)
620 install (EXPORT glog-targets DESTINATION lib/cmake/glog)