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 (CheckCSourceCompiles)
35 include (CheckCXXCompilerFlag)
36 include (CheckCXXSourceCompiles)
37 include (CheckFunctionExists)
38 include (CheckIncludeFile)
39 include (CheckIncludeFileCXX)
40 include (CheckLibraryExists)
41 include (CheckStructHasMember)
42 include (CheckSymbolExists)
43 include (CheckTypeSize)
44 include (CMakePackageConfigHelpers)
47 include (DetermineGflagsNamespace)
48 include (GNUInstallDirs)
50 set (CMAKE_THREAD_PREFER_PTHREAD 1)
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; }
199 "uc_regs->gregs[PT_NIP]"
214 set (_PC_HEADERS ucontext.h signal.h)
216 if (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
217 foreach (_PC_FIELD ${_PC_FIELDS})
218 foreach (_PC_HEADER ${_PC_HEADERS})
220 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/uctfield.c)
221 file (WRITE ${_TMP} "
222 #define _GNU_SOURCE 1
223 #include <${_PC_HEADER}>
227 return u.${_PC_FIELD} == 0;
230 try_compile (HAVE_PC_FROM_UCONTEXT ${CMAKE_CURRENT_BINARY_DIR} ${_TMP}
231 COMPILE_DEFINITIONS _GNU_SOURCE=1)
233 if (HAVE_PC_FROM_UCONTEXT)
234 set (PC_FROM_UCONTEXT ${_PC_FIELD} CACHE)
235 endif (HAVE_PC_FROM_UCONTEXT)
236 endforeach (_PC_HEADER)
237 endforeach (_PC_FIELD)
238 endif (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
240 if (STL_STD_NAMESPACE)
241 set (STL_NAMESPACE std)
242 else (STL_STD_NAMESPACE)
243 set (STL_NAMESPACE "")
244 endif (STL_STD_NAMESPACE)
246 set (GOOGLE_NAMESPACE google)
247 set (_START_GOOGLE_NAMESPACE_ "namespace ${GOOGLE_NAMESPACE} {")
248 set (_END_GOOGLE_NAMESPACE_ "}")
251 set (ac_cv_have___uint16 1)
253 set (ac_cv_have___uint16 0)
254 endif (HAVE___UINT16)
257 set (ac_cv_have_inttypes_h 1)
258 else (HAVE_INTTYPES_H)
259 set (ac_cv_have_inttypes_h 0)
260 endif (HAVE_INTTYPES_H)
263 set (ac_cv_have_libgflags 1)
264 else (HAVE_LIB_GFLAGS)
265 set (ac_cv_have_libgflags 0)
266 endif (HAVE_LIB_GFLAGS)
269 set (ac_cv_have_stdint_h 1)
271 set (ac_cv_have_stdint_h 0)
272 endif (HAVE_STDINT_H)
274 if (HAVE_SYS_TYPES_H)
275 set (ac_cv_have_systypes_h 1)
276 else (HAVE_SYS_TYPES_H)
277 set (ac_cv_have_systypes_h 0)
278 endif (HAVE_SYS_TYPES_H)
281 set (ac_cv_have_u_int16_t 1)
282 else (HAVE_U_INT16_T)
283 set (ac_cv_have_u_int16_t 0)
284 endif (HAVE_U_INT16_T)
287 set (ac_cv_have_uint16_t 1)
289 set (ac_cv_have_uint16_t 0)
290 endif (HAVE_UINT16_T)
293 set (ac_cv_have_unistd_h 1)
295 set (ac_cv_have_unistd_h 0)
296 endif (HAVE_UNISTD_H)
298 set (ac_google_namespace ${GOOGLE_NAMESPACE})
299 set (ac_google_end_namespace ${_END_GOOGLE_NAMESPACE_})
300 set (ac_google_start_namespace ${_START_GOOGLE_NAMESPACE_})
302 if (HAVE___ATTRIBUTE__)
303 set (ac_cv___attribute___noreturn "__attribute__((noreturn))")
304 set (ac_cv___attribute___noinline "__attribute__((noinline))")
305 elseif (HAVE___DECLSPEC)
306 set (ac_cv___attribute___noreturn "__declspec(noreturn)")
307 #set (ac_cv___attribute___noinline "__declspec(noinline)")
308 endif (HAVE___ATTRIBUTE__)
310 if (HAVE___BUILTIN_EXPECT)
311 set (ac_cv_have___builtin_expect 1)
312 else (HAVE___BUILTIN_EXPECT)
313 set (ac_cv_have___builtin_expect 0)
314 endif (HAVE___BUILTIN_EXPECT)
316 if (HAVE_USING_OPERATOR)
317 set (ac_cv_cxx_using_operator 1)
318 else (HAVE_USING_OPERATOR)
319 set (ac_cv_cxx_using_operator 0)
320 endif (HAVE_USING_OPERATOR)
322 set (SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
324 if (WITH_THREADS AND Threads_FOUND)
325 if (CMAKE_USE_PTHREADS_INIT)
327 endif (CMAKE_USE_PTHREADS_INIT)
328 else (WITH_THREADS AND Threads_FOUND)
330 endif (WITH_THREADS AND Threads_FOUND)
332 set (TEST_SRC_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\")
334 configure_file (src/config.h.cmake.in config.h)
335 configure_file (src/glog/logging.h.in glog/logging.h @ONLY)
336 configure_file (src/glog/raw_logging.h.in glog/raw_logging.h @ONLY)
337 configure_file (src/glog/stl_logging.h.in glog/stl_logging.h @ONLY)
338 configure_file (src/glog/vlog_is_on.h.in glog/vlog_is_on.h @ONLY)
340 set (CMAKE_CXX_VISIBILITY_PRESET default)
341 set (CMAKE_VISIBILITY_INLINES_HIDDEN 1)
344 ${CMAKE_CURRENT_BINARY_DIR}/config.h
345 ${CMAKE_CURRENT_BINARY_DIR}/glog/logging.h
346 ${CMAKE_CURRENT_BINARY_DIR}/glog/raw_logging.h
347 ${CMAKE_CURRENT_BINARY_DIR}/glog/stl_logging.h
348 ${CMAKE_CURRENT_BINARY_DIR}/glog/vlog_is_on.h
349 src/glog/log_severity.h
354 src/base/commandlineflags.h
355 src/base/googleinit.h
369 list (APPEND GLOG_SRCS src/signalhandler.cc)
373 list (APPEND GLOG_SRCS
379 add_compile_options ($<$<BOOL:${HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS}>:-Wno-unnamed-type-template-args>)
385 set_target_properties (glog PROPERTIES POSITION_INDEPENDENT_CODE ON)
388 target_link_libraries (glog PUBLIC ${UNWIND_LIBRARY})
389 endif (UNWIND_LIBRARY)
392 target_link_libraries (glog PUBLIC ${CMAKE_THREAD_LIBS_INIT})
395 if (WIN32 AND HAVE_SNPRINTF)
396 set_property (SOURCE src/windows/port.cc APPEND PROPERTY COMPILE_DEFINITIONS
398 endif (WIN32 AND HAVE_SNPRINTF)
401 target_include_directories (glog PUBLIC $<BUILD_INTERFACE:${gflags_INCLUDE_DIR}>)
402 target_link_libraries (glog PUBLIC ${gflags_LIBRARIES})
404 if (NOT BUILD_SHARED_LIBS)
405 # Don't use __declspec(dllexport|dllimport) if this is a static build
406 targeT_compile_definitions (glog PUBLIC GFLAGS_DLL_DECLARE_FLAG= GFLAGS_DLL_DEFINE_FLAG=)
407 endif (NOT BUILD_SHARED_LIBS)
410 set_target_properties (glog PROPERTIES VERSION ${GLOG_MAJOR_VERSION})
411 set_target_properties (glog PROPERTIES SOVERSION ${GLOG_VERSION})
414 target_compile_definitions (glog PUBLIC GLOG_NO_ABBREVIATED_SEVERITIES)
417 set_target_properties (glog PROPERTIES PUBLIC_HEADER "${GLOG_PUBLIC_H}")
419 set (_glog_CMake_BINDIR ${CMAKE_INSTALL_BINDIR})
420 set (_glog_CMake_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR})
421 set (_glog_CMake_LIBDIR ${CMAKE_INSTALL_LIBDIR})
422 set (_glog_CMake_INSTALLDIR ${_glog_CMake_LIBDIR}/cmake/glog)
424 target_include_directories (glog BEFORE PUBLIC
425 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
426 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
427 "$<INSTALL_INTERFACE:${_glog_CMake_INCLUDE_DIR}>"
428 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
429 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
432 target_include_directories (glog PUBLIC
433 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/windows>"
434 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/windows)
437 set_target_properties (glog PROPERTIES DEFINE_SYMBOL LIBGLOG_EXPORTS)
439 if (NOT BUILD_SHARED_LIBS)
440 target_compile_definitions (glog PUBLIC GOOGLE_GLOG_DLL_DECL=)
441 else (NOT BUILD_SHARED_LIBS)
442 target_compile_definitions (glog PRIVATE GOOGLE_GLOG_IS_A_DLL=1)
444 if (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
445 set (_EXPORT "__attribute__((visibility(\"default\")))")
447 elseif (HAVE___DECLSPEC)
448 set (_EXPORT "__declspec(dllexport)")
449 set (_IMPORT "__declspec(dllimport)")
450 endif (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
452 target_compile_definitions (glog PRIVATE
453 "GOOGLE_GLOG_DLL_DECL=${_EXPORT}")
454 target_compile_definitions (glog INTERFACE
455 "GOOGLE_GLOG_DLL_DECL=${_IMPORT}")
456 target_compile_definitions (glog INTERFACE
457 "GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS=${_IMPORT}")
458 endif (NOT BUILD_SHARED_LIBS)
461 set (HAVE_STACKTRACE 1)
462 endif (HAVE_EXECINFO_H)
464 if (UNIX OR (APPLE AND HAVE_DLADDR))
465 set (HAVE_SYMBOLIZE 1)
466 endif (UNIX OR (APPLE AND HAVE_DLADDR))
471 add_executable (logging_unittest
472 src/logging_unittest.cc
475 target_link_libraries (logging_unittest PRIVATE glog)
477 add_executable (stl_logging_unittest
478 src/stl_logging_unittest.cc
481 target_link_libraries (stl_logging_unittest PRIVATE glog)
483 if (HAVE_NO_DEPRECATED)
484 set_property (TARGET stl_logging_unittest APPEND PROPERTY COMPILE_OPTIONS
486 endif (HAVE_NO_DEPRECATED)
488 if (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
489 target_compile_definitions (stl_logging_unittest PRIVATE
490 GLOG_STL_LOGGING_FOR_UNORDERED)
491 endif (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
493 if (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
494 target_compile_definitions (stl_logging_unittest PRIVATE
495 GLOG_STL_LOGGING_FOR_TR1_UNORDERED)
496 endif (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
498 if (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
499 target_compile_definitions (stl_logging_unittest PRIVATE
500 GLOG_STL_LOGGING_FOR_EXT_HASH)
501 endif (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
504 target_compile_definitions (stl_logging_unittest PRIVATE
505 GLOG_STL_LOGGING_FOR_EXT_SLIST)
506 endif (HAVE_EXT_SLIST)
509 add_executable (symbolize_unittest
510 src/symbolize_unittest.cc
513 target_link_libraries (symbolize_unittest PRIVATE glog)
514 endif (HAVE_SYMBOLIZE)
516 add_executable (demangle_unittest
517 src/demangle_unittest.cc
520 target_link_libraries (demangle_unittest PRIVATE glog)
523 add_executable (stacktrace_unittest
524 src/stacktrace_unittest.cc
527 target_link_libraries (stacktrace_unittest PRIVATE glog)
528 endif (HAVE_STACKTRACE)
530 add_executable (utilities_unittest
531 src/utilities_unittest.cc
534 target_link_libraries (utilities_unittest PRIVATE glog)
536 if (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
537 add_executable (signalhandler_unittest
538 src/signalhandler_unittest.cc
541 target_link_libraries (signalhandler_unittest PRIVATE glog)
542 endif (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
544 add_test (NAME demangle COMMAND demangle_unittest)
545 add_test (NAME logging COMMAND logging_unittest)
547 if (TARGET signalhandler_unittest)
548 add_test (NAME signalhandler COMMAND signalhandler_unittest)
549 endif (TARGET signalhandler_unittest)
551 if (TARGET stacktrace_unittest)
552 add_test (NAME stacktrace COMMAND stacktrace_unittest)
553 endif (TARGET stacktrace_unittest)
555 add_test (NAME stl_logging COMMAND stl_logging_unittest)
557 if (TARGET symbolize_unittest)
558 add_test (NAME symbolize COMMAND symbolize_unittest)
559 endif (TARGET symbolize_unittest)
560 endif (BUILD_TESTING)
562 install (TARGETS glog
564 RUNTIME DESTINATION ${_glog_CMake_BINDIR}
565 PUBLIC_HEADER DESTINATION ${_glog_CMake_INCLUDE_DIR}/glog
566 LIBRARY DESTINATION ${_glog_CMake_LIBDIR}
567 ARCHIVE DESTINATION ${_glog_CMake_LIBDIR})
570 set (gflags_DEPENDENCY "find_dependency (gflags ${gflags_VERSION})")
573 configure_package_config_file (glog-config.cmake.in
574 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake
575 INSTALL_DESTINATION ${_glog_CMake_INSTALLDIR}
576 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
578 write_basic_package_version_file (glog-config-version.cmake VERSION
579 ${GLOG_VERSION} COMPATIBILITY SameMajorVersion)
581 export (TARGETS glog NAMESPACE glog:: FILE glog-targets.cmake)
582 export (PACKAGE glog)
585 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake
586 ${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake
587 DESTINATION ${_glog_CMake_INSTALLDIR})
589 install (EXPORT glog-targets NAMESPACE glog:: DESTINATION
590 ${_glog_CMake_INSTALLDIR})