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)
32 list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
34 include (CMakePackageConfigHelpers)
36 include (CheckCSourceCompiles)
37 include (CheckCXXCompilerFlag)
38 include (CheckCXXSourceCompiles)
39 include (CheckFunctionExists)
40 include (CheckIncludeFile)
41 include (CheckIncludeFileCXX)
42 include (CheckLibraryExists)
43 include (CheckStructHasMember)
44 include (CheckSymbolExists)
45 include (CheckTypeSize)
46 include (DetermineGflagsNamespace)
48 set (CMAKE_THREAD_PREFER_PTHREAD 1)
54 set (HAVE_LIB_GFLAGS 1)
55 determine_gflags_namespace (gflags_NAMESPACE)
60 find_package (Threads)
63 check_include_file (dlfcn.h HAVE_DLFCN_H)
64 check_include_file (execinfo.h HAVE_EXECINFO_H)
65 check_include_file (glob.h HAVE_GLOB_H)
66 check_include_file (inttypes.h HAVE_INTTYPES_H)
67 check_include_file (libunwind.h HAVE_LIBUNWIND_H)
68 check_include_file (memory.h HAVE_MEMORY_H)
69 check_include_file (pwd.h HAVE_PWD_H)
70 check_include_file (stdint.h HAVE_STDINT_H)
71 check_include_file (stdlib.h HAVE_STDLIB_H)
72 check_include_file (string.h HAVE_STRING_H)
73 check_include_file (strings.h HAVE_STRINGS_H)
74 check_include_file (sys/stat.h HAVE_SYS_STAT_H)
75 check_include_file (sys/syscall.h HAVE_SYS_SYSCALL_H)
76 check_include_file (sys/time.h HAVE_SYS_TIME_H)
77 check_include_file (sys/types.h HAVE_SYS_TYPES_H)
78 check_include_file (sys/utsname.h HAVE_SYS_UTSNAME_H)
79 check_include_file (syscall.h HAVE_SYSCALL_H)
80 check_include_file (syslog.h HAVE_SYSLOG_H)
81 check_include_file (ucontext.h HAVE_UCONTEXT_H)
82 check_include_file (unistd.h HAVE_UNISTD_H)
83 check_include_file (unwind.h HAVE_UNWIND_H)
85 check_include_file_cxx ("ext/hash_map" HAVE_EXT_HASH_MAP)
86 check_include_file_cxx ("ext/hash_set" HAVE_EXT_HASH_SET)
87 check_include_file_cxx ("ext/slist" HAVE_EXT_SLIST)
88 check_include_file_cxx ("tr1/unordered_map" HAVE_TR1_UNORDERED_MAP)
89 check_include_file_cxx ("tr1/unordered_set" HAVE_TR1_UNORDERED_SET)
90 check_include_file_cxx ("unordered_map" HAVE_UNORDERED_MAP)
91 check_include_file_cxx ("unordered_set" HAVE_UNORDERED_SET)
93 check_type_size ("unsigned __int16" HAVE___UINT16)
94 check_type_size (u_int16_t HAVE_U_INT16_T)
95 check_type_size (uint16_t HAVE_UINT16_T)
97 check_function_exists (dladdr HAVE_DLADDR)
98 check_function_exists (fcntl HAVE_FCNTL)
99 check_function_exists (pread HAVE_PREAD)
100 check_function_exists (pwrite HAVE_PWRITE)
101 check_function_exists (sigaction HAVE_SIGACTION)
102 check_function_exists (sigaltstack HAVE_SIGALSTACK)
104 # NOTE gcc does not fail if you pass a non-existent -Wno-* option as an
105 # argument. However, it will happily fail if you pass the corresponding -W*
106 # option. So, we check whether options that disable warnings exist by testing
107 # the availability of the corresponding option that enables the warning. This
108 # eliminates the need to check for compiler for several (mainly Clang) options.
110 check_cxx_compiler_flag (-Wdeprecated HAVE_NO_DEPRECATED)
111 check_cxx_compiler_flag (-Wunnamed-type-template-args
112 HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
114 # NOTE: Cannot use check_function_exists here since >=vc-14.0 can define
115 # snprintf as an inline function
116 check_symbol_exists (snprintf stdio.h HAVE_SNPRINTF)
118 check_library_exists (unwind get_static_proc_name "" HAVE_LIB_UNWIND)
120 find_library (UNWIND_LIBRARY NAMES unwind DOC "unwind library")
121 mark_as_advanced (UNWIND_LIBRARY)
123 check_c_source_compiles ("
125 static void foo(void) __attribute__ ((unused));
126 int main(void) { return 0; }
127 " HAVE___ATTRIBUTE__)
129 check_c_source_compiles ("
131 static void foo(void) __attribute__ ((visibility(\"default\")));
132 int main(void) { return 0; }
133 " HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
135 check_c_source_compiles ("
137 static void foo(void) __attribute__ ((visibility(\"hidden\")));
138 int main(void) { return 0; }
139 " HAVE___ATTRIBUTE__VISIBILITY_HIDDEN)
141 check_c_source_compiles ("
142 int main(void) { if (__builtin_expect(0, 0)) return 1; return 0; }
143 " HAVE___BUILTIN_EXPECT)
145 check_c_source_compiles ("
148 int a; if (__sync_val_compare_and_swap(&a, 0, 1)) return 1; return 0;
150 " HAVE___SYNC_VAL_COMPARE_AND_SWAP)
152 check_c_source_compiles ("
153 #define _XOPEN_SOURCE 500
158 pthread_rwlock_init(&l, NULL);
159 pthread_rwlock_rdlock(&l);
164 check_c_source_compiles ("
165 __declspec(selectany) int a;
166 int main(void) { return 0; }
169 check_cxx_source_compiles ("
171 vector<int> t; int main() { }
174 check_cxx_source_compiles ("
176 std::vector<int> t; int main() { }
179 check_cxx_source_compiles ("
181 std::ostream& operator<<(std::ostream&, struct s);
184 " HAVE_USING_OPERATOR)
186 check_cxx_source_compiles ("
187 namespace Outer { namespace Inner { int i = 0; }}
188 using namespace Outer::Inner;;
189 int main() { return i; }
197 "uc_regs->gregs[PT_NIP]"
212 set (_PC_HEADERS ucontext.h signal.h)
214 if (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
215 foreach (_PC_FIELD ${_PC_FIELDS})
216 foreach (_PC_HEADER ${_PC_HEADERS})
218 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/uctfield.c)
219 file (WRITE ${_TMP} "
220 #define _GNU_SOURCE 1
221 #include <${_PC_HEADER}>
225 return u.${_PC_FIELD} == 0;
228 try_compile (HAVE_PC_FROM_UCONTEXT ${CMAKE_CURRENT_BINARY_DIR} ${_TMP}
229 COMPILE_DEFINITIONS _GNU_SOURCE=1)
231 if (HAVE_PC_FROM_UCONTEXT)
232 set (PC_FROM_UCONTEXT ${_PC_FIELD} CACHE)
233 endif (HAVE_PC_FROM_UCONTEXT)
234 endforeach (_PC_HEADER)
235 endforeach (_PC_FIELD)
236 endif (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
238 if (STL_STD_NAMESPACE)
239 set (STL_NAMESPACE std)
240 else (STL_STD_NAMESPACE)
241 set (STL_NAMESPACE "")
242 endif (STL_STD_NAMESPACE)
244 set (GOOGLE_NAMESPACE google)
245 set (_START_GOOGLE_NAMESPACE_ "namespace ${GOOGLE_NAMESPACE} {")
246 set (_END_GOOGLE_NAMESPACE_ "}")
249 set (ac_cv_have___uint16 1)
251 set (ac_cv_have___uint16 0)
252 endif (HAVE___UINT16)
255 set (ac_cv_have_inttypes_h 1)
256 else (HAVE_INTTYPES_H)
257 set (ac_cv_have_inttypes_h 0)
258 endif (HAVE_INTTYPES_H)
261 set (ac_cv_have_libgflags 1)
262 else (HAVE_LIB_GFLAGS)
263 set (ac_cv_have_libgflags 0)
264 endif (HAVE_LIB_GFLAGS)
267 set (ac_cv_have_stdint_h 1)
269 set (ac_cv_have_stdint_h 0)
270 endif (HAVE_STDINT_H)
272 if (HAVE_SYS_TYPES_H)
273 set (ac_cv_have_systypes_h 1)
274 else (HAVE_SYS_TYPES_H)
275 set (ac_cv_have_systypes_h 0)
276 endif (HAVE_SYS_TYPES_H)
279 set (ac_cv_have_u_int16_t 1)
280 else (HAVE_U_INT16_T)
281 set (ac_cv_have_u_int16_t 0)
282 endif (HAVE_U_INT16_T)
285 set (ac_cv_have_uint16_t 1)
287 set (ac_cv_have_uint16_t 0)
288 endif (HAVE_UINT16_T)
291 set (ac_cv_have_unistd_h 1)
293 set (ac_cv_have_unistd_h 0)
294 endif (HAVE_UNISTD_H)
296 set (ac_google_namespace ${GOOGLE_NAMESPACE})
297 set (ac_google_end_namespace ${_END_GOOGLE_NAMESPACE_})
298 set (ac_google_start_namespace ${_START_GOOGLE_NAMESPACE_})
300 if (HAVE___ATTRIBUTE__)
301 set (ac_cv___attribute___noreturn "__attribute__((noreturn))")
302 set (ac_cv___attribute___noinline "__attribute__((noinline))")
303 elseif (HAVE___DECLSPEC)
304 set (ac_cv___attribute___noreturn "__declspec(noreturn)")
305 #set (ac_cv___attribute___noinline "__declspec(noinline)")
306 endif (HAVE___ATTRIBUTE__)
308 if (HAVE___BUILTIN_EXPECT)
309 set (ac_cv_have___builtin_expect 1)
310 else (HAVE___BUILTIN_EXPECT)
311 set (ac_cv_have___builtin_expect 0)
312 endif (HAVE___BUILTIN_EXPECT)
314 if (HAVE_USING_OPERATOR)
315 set (ac_cv_cxx_using_operator 1)
316 else (HAVE_USING_OPERATOR)
317 set (ac_cv_cxx_using_operator 0)
318 endif (HAVE_USING_OPERATOR)
320 set (SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
322 if (WITH_THREADS AND Threads_FOUND)
323 if (CMAKE_USE_PTHREADS_INIT)
325 endif (CMAKE_USE_PTHREADS_INIT)
326 else (WITH_THREADS AND Threads_FOUND)
328 endif (WITH_THREADS AND Threads_FOUND)
330 set (TEST_SRC_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\")
332 configure_file (src/config.h.cmake.in config.h)
333 configure_file (src/glog/logging.h.in glog/logging.h @ONLY)
334 configure_file (src/glog/raw_logging.h.in glog/raw_logging.h @ONLY)
335 configure_file (src/glog/stl_logging.h.in glog/stl_logging.h @ONLY)
336 configure_file (src/glog/vlog_is_on.h.in glog/vlog_is_on.h @ONLY)
338 set (CMAKE_CXX_VISIBILITY_PRESET default)
339 set (CMAKE_VISIBILITY_INLINES_HIDDEN 1)
342 ${CMAKE_CURRENT_BINARY_DIR}/config.h
343 ${CMAKE_CURRENT_BINARY_DIR}/glog/logging.h
344 ${CMAKE_CURRENT_BINARY_DIR}/glog/raw_logging.h
345 ${CMAKE_CURRENT_BINARY_DIR}/glog/stl_logging.h
346 ${CMAKE_CURRENT_BINARY_DIR}/glog/vlog_is_on.h
347 src/glog/log_severity.h
352 src/base/commandlineflags.h
353 src/base/googleinit.h
367 list (APPEND GLOG_SRCS src/signalhandler.cc)
371 list (APPEND GLOG_SRCS
377 add_compile_options ($<$<BOOL:${HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS}>:-Wno-unnamed-type-template-args>)
384 target_link_libraries (glog PUBLIC ${UNWIND_LIBRARY})
385 endif (UNWIND_LIBRARY)
387 if (WIN32 AND HAVE_SNPRINTF)
388 set_property (SOURCE src/windows/port.cc APPEND PROPERTY COMPILE_DEFINITIONS
390 endif (WIN32 AND HAVE_SNPRINTF)
393 target_include_directories (glog PUBLIC ${gflags_INCLUDE_DIR})
394 target_link_libraries (glog PUBLIC ${gflags_LIBRARIES})
396 if (NOT BUILD_SHARED_LIBS)
397 # Don't use __declspec(dllexport|dllimport) if this is a static build
398 targeT_compile_definitions (glog PUBLIC GFLAGS_DLL_DECLARE_FLAG= GFLAGS_DLL_DEFINE_FLAG=)
399 endif (NOT BUILD_SHARED_LIBS)
402 set_target_properties (glog PROPERTIES VERSION ${GLOG_MAJOR_VERSION})
403 set_target_properties (glog PROPERTIES SOVERSION ${GLOG_VERSION})
406 target_compile_definitions (glog PUBLIC GLOG_NO_ABBREVIATED_SEVERITIES)
409 set_target_properties (glog PROPERTIES PUBLIC_HEADER "${GLOG_PUBLIC_H}")
411 target_include_directories (glog BEFORE PUBLIC
412 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
413 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
414 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
415 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
418 target_include_directories (glog PUBLIC
419 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/windows>"
420 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/windows)
423 set_target_properties (glog PROPERTIES DEFINE_SYMBOL LIBGLOG_EXPORTS)
425 if (NOT BUILD_SHARED_LIBS)
426 target_compile_definitions (glog PUBLIC GOOGLE_GLOG_DLL_DECL=)
427 else (NOT BUILD_SHARED_LIBS)
428 target_compile_definitions (glog PRIVATE GOOGLE_GLOG_IS_A_DLL=1)
430 if (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
431 set (_EXPORT "__attribute__((visibility(\"default\")))")
433 elseif (HAVE___DECLSPEC)
434 set (_EXPORT "__declspec(dllexport)")
435 set (_IMPORT "__declspec(dllimport)")
436 endif (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
438 target_compile_definitions (glog PRIVATE
439 "GOOGLE_GLOG_DLL_DECL=${_EXPORT}")
440 target_compile_definitions (glog INTERFACE
441 "GOOGLE_GLOG_DLL_DECL=${_IMPORT}")
442 target_compile_definitions (glog INTERFACE
443 "GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS=${_IMPORT}")
444 endif (NOT BUILD_SHARED_LIBS)
447 set (HAVE_STACKTRACE 1)
448 endif (HAVE_EXECINFO_H)
450 if (UNIX OR (APPLE AND HAVE_DLADDR))
451 set (HAVE_SYMBOLIZE 1)
452 endif (UNIX OR (APPLE AND HAVE_DLADDR))
456 add_executable (logging_unittest
457 src/logging_unittest.cc
460 target_link_libraries (logging_unittest PRIVATE glog)
462 add_executable (stl_logging_unittest
463 src/stl_logging_unittest.cc
466 target_link_libraries (stl_logging_unittest PRIVATE glog)
468 if (HAVE_NO_DEPRECATED)
469 set_property (TARGET stl_logging_unittest APPEND PROPERTY COMPILE_OPTIONS
471 endif (HAVE_NO_DEPRECATED)
473 if (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
474 target_compile_definitions (stl_logging_unittest PRIVATE
475 GLOG_STL_LOGGING_FOR_UNORDERED)
476 endif (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
478 if (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
479 target_compile_definitions (stl_logging_unittest PRIVATE
480 GLOG_STL_LOGGING_FOR_TR1_UNORDERED)
481 endif (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
483 if (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
484 target_compile_definitions (stl_logging_unittest PRIVATE
485 GLOG_STL_LOGGING_FOR_EXT_HASH)
486 endif (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
489 target_compile_definitions (stl_logging_unittest PRIVATE
490 GLOG_STL_LOGGING_FOR_EXT_SLIST)
491 endif (HAVE_EXT_SLIST)
494 add_executable (symbolize_unittest
495 src/symbolize_unittest.cc
498 target_link_libraries (symbolize_unittest PRIVATE glog)
499 endif (HAVE_SYMBOLIZE)
501 add_executable (demangle_unittest
502 src/demangle_unittest.cc
505 target_link_libraries (demangle_unittest PRIVATE glog)
508 add_executable (stacktrace_unittest
509 src/stacktrace_unittest.cc
512 target_link_libraries (stacktrace_unittest PRIVATE glog)
513 endif (HAVE_STACKTRACE)
515 add_executable (utilities_unittest
516 src/utilities_unittest.cc
519 target_link_libraries (utilities_unittest PRIVATE glog)
521 if (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
522 add_executable (signalhandler_unittest
523 src/signalhandler_unittest.cc
526 target_link_libraries (signalhandler_unittest PRIVATE glog)
527 endif (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
529 add_test (NAME demangle COMMAND demangle_unittest)
530 add_test (NAME logging COMMAND logging_unittest)
532 if (TARGET signalhandler_unittest)
533 add_test (NAME signalhandler COMMAND signalhandler_unittest)
534 endif (TARGET signalhandler_unittest)
536 if (TARGET stacktrace_unittest)
537 add_test (NAME stacktrace COMMAND stacktrace_unittest)
538 endif (TARGET stacktrace_unittest)
540 add_test (NAME stl_logging COMMAND stl_logging_unittest)
542 if (TARGET symbolize_unittest)
543 add_test (NAME symbolize COMMAND symbolize_unittest)
544 endif (TARGET symbolize_unittest)
546 install (TARGETS glog
548 RUNTIME DESTINATION bin
549 PUBLIC_HEADER DESTINATION include/glog
550 LIBRARY DESTINATION lib
551 ARCHIVE DESTINATION lib)
555 set (glog_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
556 set (glog_PACKAGE_DEPS)
559 set (glog_PACKAGE_DEPS
561 include (CMakeFindDependencyMacro)
563 find_dependency (gflags ${gflags_VERSION})
567 configure_package_config_file (glog-config.cmake.in
568 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake INSTALL_DESTINATION
569 lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
570 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
572 # The version file is the same both for build tree and install mode config
573 write_basic_package_version_file (glog-config-version.cmake VERSION
574 ${GLOG_VERSION} COMPATIBILITY SameMajorVersion)
578 set (glog_INCLUDE_DIR include)
580 configure_package_config_file (glog-config.cmake.in
581 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
582 INSTALL_DESTINATION lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
583 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
585 export (TARGETS glog FILE glog-targets.cmake)
586 export (PACKAGE glog)
589 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
590 ${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake
591 DESTINATION lib/cmake/glog)
593 install (EXPORT glog-targets DESTINATION lib/cmake/glog)