1 cmake_minimum_required (VERSION 3.0)
4 cmake_policy (SET CMP0042 NEW)
11 set (GLOG_MAJOR_VERSION 0)
12 set (GLOG_MINOR_VERSION 3)
13 set (GLOG_PATCH_VERSION 4)
16 ${GLOG_MAJOR_VERSION}.${GLOG_MINOR_VERSION}.${GLOG_PATCH_VERSION})
18 set (CPACK_PACKAGE_NAME glog)
19 set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "")
20 set (CPACK_PACKAGE_VERSION_MAJOR ${GLOG_MAJOR_VERSION})
21 set (CPACK_PACKAGE_VERSION_MINOR ${GLOG_MINOR_VERSION})
22 set (CPACK_PACKAGE_VERSION_PATCH ${GLOG_PATCH_VERSION})
23 set (CPACK_PACKAGE_VERSION ${GLOG_VERSION})
25 option (WITH_GFLAGS "Use gflags" ON)
26 option (WITH_THREADS "Enable multithreading support" ON)
28 list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
30 include (CMakePackageConfigHelpers)
32 include (CheckCSourceCompiles)
33 include (CheckCXXCompilerFlag)
34 include (CheckCXXSourceCompiles)
35 include (CheckFunctionExists)
36 include (CheckIncludeFile)
37 include (CheckIncludeFileCXX)
38 include (CheckLibraryExists)
39 include (CheckStructHasMember)
40 include (CheckSymbolExists)
41 include (CheckTypeSize)
42 include (DetermineGflagsNamespace)
44 set (CMAKE_THREAD_PREFER_PTHREAD 1)
50 set (HAVE_LIB_GFLAGS 1)
51 determine_gflags_namespace (gflags_NAMESPACE)
56 find_package (Threads)
59 check_include_file (dlfcn.h HAVE_DLFCN_H)
60 check_include_file (execinfo.h HAVE_EXECINFO_H)
61 check_include_file (glob.h HAVE_GLOB_H)
62 check_include_file (inttypes.h HAVE_INTTYPES_H)
63 check_include_file (libunwind.h HAVE_LIBUNWIND_H)
64 check_include_file (memory.h HAVE_MEMORY_H)
65 check_include_file (pwd.h HAVE_PWD_H)
66 check_include_file (stdint.h HAVE_STDINT_H)
67 check_include_file (stdlib.h HAVE_STDLIB_H)
68 check_include_file (string.h HAVE_STRING_H)
69 check_include_file (strings.h HAVE_STRINGS_H)
70 check_include_file (sys/stat.h HAVE_SYS_STAT_H)
71 check_include_file (sys/syscall.h HAVE_SYS_SYSCALL_H)
72 check_include_file (sys/time.h HAVE_SYS_TIME_H)
73 check_include_file (sys/types.h HAVE_SYS_TYPES_H)
74 check_include_file (sys/utsname.h HAVE_SYS_UTSNAME_H)
75 check_include_file (syscall.h HAVE_SYSCALL_H)
76 check_include_file (syslog.h HAVE_SYSLOG_H)
77 check_include_file (ucontext.h HAVE_UCONTEXT_H)
78 check_include_file (unistd.h HAVE_UNISTD_H)
79 check_include_file (unwind.h HAVE_UNWIND_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 check_cxx_compiler_flag (-Wno-deprecated HAVE_NO_DEPRECATED)
101 check_cxx_compiler_flag (-Wno-unnamed-type-template-args
102 HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
104 # NOTE: Cannot use check_function_exists here since >=vc-14.0 can define
105 # snprintf as an inline function
106 check_symbol_exists (snprintf stdio.h HAVE_SNPRINTF)
108 check_library_exists (unwind get_static_proc_name "" HAVE_LIB_UNWIND)
110 find_library (UNWIND_LIBRARY NAMES unwind DOC "unwind library")
111 mark_as_advanced (UNWIND_LIBRARY)
113 check_c_source_compiles ("
115 static void foo(void) __attribute__ ((unused));
116 int main(void) { return 0; }
117 " HAVE___ATTRIBUTE__)
119 check_c_source_compiles ("
121 static void foo(void) __attribute__ ((visibility(\"default\")));
122 int main(void) { return 0; }
123 " HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
125 check_c_source_compiles ("
127 static void foo(void) __attribute__ ((visibility(\"hidden\")));
128 int main(void) { return 0; }
129 " HAVE___ATTRIBUTE__VISIBILITY_HIDDEN)
131 check_c_source_compiles ("
132 int main(void) { if (__builtin_expect(0, 0)) return 1; return 0; }
133 " HAVE___BUILTIN_EXPECT)
135 check_c_source_compiles ("
138 int a; if (__sync_val_compare_and_swap(&a, 0, 1)) return 1; return 0;
140 " HAVE___SYNC_VAL_COMPARE_AND_SWAP)
142 check_c_source_compiles ("
143 #define _XOPEN_SOURCE 500
148 pthread_rwlock_init(&l, NULL);
149 pthread_rwlock_rdlock(&l);
154 check_c_source_compiles ("
155 __declspec(selectany) int a;
156 int main(void) { return 0; }
159 check_cxx_source_compiles ("
161 vector<int> t; int main() { }
164 check_cxx_source_compiles ("
166 std::vector<int> t; int main() { }
169 check_cxx_source_compiles ("
171 std::ostream& operator<<(std::ostream&, struct s);
174 " HAVE_USING_OPERATOR)
176 check_cxx_source_compiles ("
177 namespace Outer { namespace Inner { int i = 0; }}
178 using namespace Outer::Inner;;
179 int main() { return i; }
187 "uc_regs->gregs[PT_NIP]"
202 set (_PC_HEADERS ucontext.h signal.h)
204 if (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
205 foreach (_PC_FIELD ${_PC_FIELDS})
206 foreach (_PC_HEADER ${_PC_HEADERS})
208 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/uctfield.c)
209 file (WRITE ${_TMP} "
210 #define _GNU_SOURCE 1
211 #include <${_PC_HEADER}>
215 return u.${_PC_FIELD} == 0;
218 try_compile (HAVE_PC_FROM_UCONTEXT ${CMAKE_CURRENT_BINARY_DIR} ${_TMP}
219 COMPILE_DEFINITIONS _GNU_SOURCE=1)
221 if (HAVE_PC_FROM_UCONTEXT)
222 set (PC_FROM_UCONTEXT ${_PC_FIELD} CACHE)
223 endif (HAVE_PC_FROM_UCONTEXT)
224 endforeach (_PC_HEADER)
225 endforeach (_PC_FIELD)
226 endif (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
228 if (STL_STD_NAMESPACE)
229 set (STL_NAMESPACE std)
230 else (STL_STD_NAMESPACE)
231 set (STL_NAMESPACE "")
232 endif (STL_STD_NAMESPACE)
234 set (GOOGLE_NAMESPACE google)
235 set (_START_GOOGLE_NAMESPACE_ "namespace ${GOOGLE_NAMESPACE} {")
236 set (_END_GOOGLE_NAMESPACE_ "}")
239 set (ac_cv_have___uint16 1)
241 set (ac_cv_have___uint16 0)
242 endif (HAVE___UINT16)
245 set (ac_cv_have_inttypes_h 1)
246 else (HAVE_INTTYPES_H)
247 set (ac_cv_have_inttypes_h 0)
248 endif (HAVE_INTTYPES_H)
251 set (ac_cv_have_libgflags 1)
252 else (HAVE_LIB_GFLAGS)
253 set (ac_cv_have_libgflags 0)
254 endif (HAVE_LIB_GFLAGS)
257 set (ac_cv_have_stdint_h 1)
259 set (ac_cv_have_stdint_h 0)
260 endif (HAVE_STDINT_H)
262 if (HAVE_SYS_TYPES_H)
263 set (ac_cv_have_systypes_h 1)
264 else (HAVE_SYS_TYPES_H)
265 set (ac_cv_have_systypes_h 0)
266 endif (HAVE_SYS_TYPES_H)
269 set (ac_cv_have_u_int16_t 1)
270 else (HAVE_U_INT16_T)
271 set (ac_cv_have_u_int16_t 0)
272 endif (HAVE_U_INT16_T)
275 set (ac_cv_have_uint16_t 1)
277 set (ac_cv_have_uint16_t 0)
278 endif (HAVE_UINT16_T)
281 set (ac_cv_have_unistd_h 1)
283 set (ac_cv_have_unistd_h 0)
284 endif (HAVE_UNISTD_H)
286 set (ac_google_namespace ${GOOGLE_NAMESPACE})
287 set (ac_google_end_namespace ${_END_GOOGLE_NAMESPACE_})
288 set (ac_google_start_namespace ${_START_GOOGLE_NAMESPACE_})
290 if (HAVE___ATTRIBUTE__)
291 set (ac_cv___attribute___noreturn "__attribute__((noreturn))")
292 set (ac_cv___attribute___noinline "__attribute__((noinline))")
293 elseif (HAVE___DECLSPEC)
294 set (ac_cv___attribute___noreturn "__declspec(noreturn)")
295 #set (ac_cv___attribute___noinline "__declspec(noinline)")
296 endif (HAVE___ATTRIBUTE__)
298 if (HAVE___BUILTIN_EXPECT)
299 set (ac_cv_have___builtin_expect 1)
300 else (HAVE___BUILTIN_EXPECT)
301 set (ac_cv_have___builtin_expect 0)
302 endif (HAVE___BUILTIN_EXPECT)
304 if (HAVE_USING_OPERATOR)
305 set (ac_cv_cxx_using_operator 1)
306 else (HAVE_USING_OPERATOR)
307 set (ac_cv_cxx_using_operator 0)
308 endif (HAVE_USING_OPERATOR)
310 set (SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
312 if (WITH_THREADS AND Threads_FOUND)
313 if (CMAKE_USE_PTHREADS_INIT)
315 endif (CMAKE_USE_PTHREADS_INIT)
316 else (WITH_THREADS AND Threads_FOUND)
318 endif (WITH_THREADS AND Threads_FOUND)
320 set (TEST_SRC_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\")
322 configure_file (src/config.h.cmake.in config.h)
323 configure_file (src/glog/logging.h.in glog/logging.h @ONLY)
324 configure_file (src/glog/raw_logging.h.in glog/raw_logging.h @ONLY)
325 configure_file (src/glog/stl_logging.h.in glog/stl_logging.h @ONLY)
326 configure_file (src/glog/vlog_is_on.h.in glog/vlog_is_on.h @ONLY)
328 set (CMAKE_CXX_VISIBILITY_PRESET default)
329 set (CMAKE_VISIBILITY_INLINES_HIDDEN 1)
332 ${CMAKE_CURRENT_BINARY_DIR}/config.h
333 ${CMAKE_CURRENT_BINARY_DIR}/glog/logging.h
334 ${CMAKE_CURRENT_BINARY_DIR}/glog/raw_logging.h
335 ${CMAKE_CURRENT_BINARY_DIR}/glog/stl_logging.h
336 ${CMAKE_CURRENT_BINARY_DIR}/glog/vlog_is_on.h
337 src/glog/log_severity.h
342 src/base/commandlineflags.h
343 src/base/googleinit.h
357 list (APPEND GLOG_SRCS src/signalhandler.cc)
361 list (APPEND GLOG_SRCS
372 target_link_libraries (glog PUBLIC ${UNWIND_LIBRARY})
373 endif (UNWIND_LIBRARY)
375 if (WIN32 AND HAVE_SNPRINTF)
376 set_property (SOURCE src/windows/port.cc APPEND PROPERTY COMPILE_DEFINITIONS
378 endif (WIN32 AND HAVE_SNPRINTF)
380 if (HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
381 target_compile_options (glog PUBLIC -Wno-unnamed-type-template-args)
382 endif (HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
385 target_include_directories (glog PUBLIC ${gflags_INCLUDE_DIR})
386 target_link_libraries (glog PUBLIC ${gflags_LIBRARIES})
388 if (NOT BUILD_SHARED_LIBS)
389 # Don't use __declspec(dllexport|dllimport) if this is a static build
390 targeT_compile_definitions (glog PUBLIC GFLAGS_DLL_DECLARE_FLAG= GFLAGS_DLL_DEFINE_FLAG=)
391 endif (NOT BUILD_SHARED_LIBS)
394 set_target_properties (glog PROPERTIES VERSION ${GLOG_MAJOR_VERSION})
395 set_target_properties (glog PROPERTIES SOVERSION ${GLOG_VERSION})
398 target_compile_definitions (glog PUBLIC GLOG_NO_ABBREVIATED_SEVERITIES)
401 set_target_properties (glog PROPERTIES PUBLIC_HEADER "${GLOG_PUBLIC_H}")
403 target_include_directories (glog BEFORE PUBLIC
404 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
405 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
406 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
407 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
410 target_include_directories (glog PUBLIC
411 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/windows>"
412 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/windows)
415 set_target_properties (glog PROPERTIES DEFINE_SYMBOL LIBGLOG_EXPORTS)
417 if (NOT BUILD_SHARED_LIBS)
418 target_compile_definitions (glog PUBLIC GOOGLE_GLOG_DLL_DECL=)
419 else (NOT BUILD_SHARED_LIBS)
420 target_compile_definitions (glog PRIVATE GOOGLE_GLOG_IS_A_DLL=1)
422 if (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
423 set (_EXPORT "__attribute__((visibility(\"default\")))")
425 elseif (HAVE___DECLSPEC)
426 set (_EXPORT "__declspec(dllexport)")
427 set (_IMPORT "__declspec(dllimport)")
428 endif (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
430 target_compile_definitions (glog PRIVATE
431 "GOOGLE_GLOG_DLL_DECL=${_EXPORT}")
432 target_compile_definitions (glog INTERFACE
433 "GOOGLE_GLOG_DLL_DECL=${_IMPORT}")
434 target_compile_definitions (glog INTERFACE
435 "GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS=${_IMPORT}")
436 endif (NOT BUILD_SHARED_LIBS)
439 set (HAVE_STACKTRACE 1)
440 endif (HAVE_EXECINFO_H)
442 if (UNIX OR (APPLE AND HAVE_DLADDR))
443 set (HAVE_SYMBOLIZE 1)
444 endif (UNIX OR (APPLE AND HAVE_DLADDR))
448 add_executable (logging_unittest
449 src/logging_unittest.cc
452 target_link_libraries (logging_unittest PRIVATE glog)
454 add_executable (stl_logging_unittest
455 src/stl_logging_unittest.cc
458 target_link_libraries (stl_logging_unittest PRIVATE glog)
460 if (HAVE_NO_DEPRECATED)
461 set_property (TARGET stl_logging_unittest APPEND PROPERTY COMPILE_OPTIONS
463 endif (HAVE_NO_DEPRECATED)
465 if (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
466 target_compile_definitions (stl_logging_unittest PRIVATE
467 GLOG_STL_LOGGING_FOR_UNORDERED)
468 endif (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
470 if (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
471 target_compile_definitions (stl_logging_unittest PRIVATE
472 GLOG_STL_LOGGING_FOR_TR1_UNORDERED)
473 endif (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
475 if (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
476 target_compile_definitions (stl_logging_unittest PRIVATE
477 GLOG_STL_LOGGING_FOR_EXT_HASH)
478 endif (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
481 target_compile_definitions (stl_logging_unittest PRIVATE
482 GLOG_STL_LOGGING_FOR_EXT_SLIST)
483 endif (HAVE_EXT_SLIST)
486 add_executable (symbolize_unittest
487 src/symbolize_unittest.cc
490 target_link_libraries (symbolize_unittest PRIVATE glog)
491 endif (HAVE_SYMBOLIZE)
493 add_executable (demangle_unittest
494 src/demangle_unittest.cc
497 target_link_libraries (demangle_unittest PRIVATE glog)
500 add_executable (stacktrace_unittest
501 src/stacktrace_unittest.cc
504 target_link_libraries (stacktrace_unittest PRIVATE glog)
505 endif (HAVE_STACKTRACE)
507 add_executable (utilities_unittest
508 src/utilities_unittest.cc
511 target_link_libraries (utilities_unittest PRIVATE glog)
513 if (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
514 add_executable (signalhandler_unittest
515 src/signalhandler_unittest.cc
518 target_link_libraries (signalhandler_unittest PRIVATE glog)
519 endif (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
521 add_test (NAME demangle COMMAND demangle_unittest)
522 add_test (NAME logging COMMAND logging_unittest)
524 if (TARGET signalhandler_unittest)
525 add_test (NAME signalhandler COMMAND signalhandler_unittest)
526 endif (TARGET signalhandler_unittest)
528 if (TARGET stacktrace_unittest)
529 add_test (NAME stacktrace COMMAND stacktrace_unittest)
530 endif (TARGET stacktrace_unittest)
532 add_test (NAME stl_logging COMMAND stl_logging_unittest)
534 if (TARGET symbolize_unittest)
535 add_test (NAME symbolize COMMAND symbolize_unittest)
536 endif (TARGET symbolize_unittest)
538 install (TARGETS glog
540 RUNTIME DESTINATION bin
541 PUBLIC_HEADER DESTINATION include/glog
542 LIBRARY DESTINATION lib
543 ARCHIVE DESTINATION lib)
547 set (glog_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
548 set (glog_PACKAGE_DEPS)
551 set (glog_PACKAGE_DEPS
553 include (CMakeFindDependencyMacro)
555 find_dependency (gflags ${gflags_VERSION})
559 configure_package_config_file (glog-config.cmake.in
560 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake INSTALL_DESTINATION
561 lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
562 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
564 # The version file is the same both for build tree and install mode config
565 write_basic_package_version_file (glog-config-version.cmake VERSION
566 ${GLOG_VERSION} COMPATIBILITY SameMajorVersion)
570 set (glog_INCLUDE_DIR include)
572 configure_package_config_file (glog-config.cmake.in
573 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
574 INSTALL_DESTINATION lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
575 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
577 export (TARGETS glog FILE glog-targets.cmake)
578 export (PACKAGE glog)
581 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
582 ${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake
583 DESTINATION lib/cmake/glog)
585 install (EXPORT glog-targets DESTINATION lib/cmake/glog)