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)
31 list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
33 include (CMakePackageConfigHelpers)
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 (DetermineGflagsNamespace)
47 set (CMAKE_THREAD_PREFER_PTHREAD 1)
53 set (HAVE_LIB_GFLAGS 1)
54 determine_gflags_namespace (gflags_NAMESPACE)
58 find_package (Threads)
60 check_include_file (dlfcn.h HAVE_DLFCN_H)
61 check_include_file (execinfo.h HAVE_EXECINFO_H)
62 check_include_file (glob.h HAVE_GLOB_H)
63 check_include_file (inttypes.h HAVE_INTTYPES_H)
64 check_include_file (libunwind.h HAVE_LIBUNWIND_H)
65 check_include_file (memory.h HAVE_MEMORY_H)
66 check_include_file (pwd.h HAVE_PWD_H)
67 check_include_file (stdint.h HAVE_STDINT_H)
68 check_include_file (stdlib.h HAVE_STDLIB_H)
69 check_include_file (string.h HAVE_STRING_H)
70 check_include_file (strings.h HAVE_STRINGS_H)
71 check_include_file (sys/stat.h HAVE_SYS_STAT_H)
72 check_include_file (sys/syscall.h HAVE_SYS_SYSCALL_H)
73 check_include_file (sys/time.h HAVE_SYS_TIME_H)
74 check_include_file (sys/types.h HAVE_SYS_TYPES_H)
75 check_include_file (sys/utsname.h HAVE_SYS_UTSNAME_H)
76 check_include_file (syscall.h HAVE_SYSCALL_H)
77 check_include_file (syslog.h HAVE_SYSLOG_H)
78 check_include_file (ucontext.h HAVE_UCONTEXT_H)
79 check_include_file (unistd.h HAVE_UNISTD_H)
80 check_include_file (unwind.h HAVE_UNWIND_H)
82 check_include_file_cxx ("ext/hash_map" HAVE_EXT_HASH_MAP)
83 check_include_file_cxx ("ext/hash_set" HAVE_EXT_HASH_SET)
84 check_include_file_cxx ("ext/slist" HAVE_EXT_SLIST)
85 check_include_file_cxx ("tr1/unordered_map" HAVE_TR1_UNORDERED_MAP)
86 check_include_file_cxx ("tr1/unordered_set" HAVE_TR1_UNORDERED_SET)
87 check_include_file_cxx ("unordered_map" HAVE_UNORDERED_MAP)
88 check_include_file_cxx ("unordered_set" HAVE_UNORDERED_SET)
90 check_type_size ("unsigned __int16" HAVE___UINT16)
91 check_type_size (u_int16_t HAVE_U_INT16_T)
92 check_type_size (uint16_t HAVE_UINT16_T)
94 check_function_exists (dladdr HAVE_DLADDR)
95 check_function_exists (fcntl HAVE_FCNTL)
96 check_function_exists (pread HAVE_PREAD)
97 check_function_exists (pwrite HAVE_PWRITE)
98 check_function_exists (sigaction HAVE_SIGACTION)
99 check_function_exists (sigaltstack HAVE_SIGALSTACK)
101 check_cxx_compiler_flag (-Wno-deprecated HAVE_NO_DEPRECATED)
102 check_cxx_compiler_flag (-Wno-unnamed-type-template-args
103 HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
105 # NOTE: Cannot use check_function_exists here since >=vc-14.0 can define
106 # snprintf as an inline function
107 check_symbol_exists (snprintf stdio.h HAVE_SNPRINTF)
109 check_library_exists (unwind get_static_proc_name "" HAVE_LIB_UNWIND)
111 find_library (UNWIND_LIBRARY NAMES unwind DOC "unwind library")
112 mark_as_advanced (UNWIND_LIBRARY)
114 check_c_source_compiles ("
116 static void foo(void) __attribute__ ((unused));
117 int main(void) { return 0; }
118 " HAVE___ATTRIBUTE__)
120 check_c_source_compiles ("
122 static void foo(void) __attribute__ ((visibility(\"default\")));
123 int main(void) { return 0; }
124 " HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
126 check_c_source_compiles ("
128 static void foo(void) __attribute__ ((visibility(\"hidden\")));
129 int main(void) { return 0; }
130 " HAVE___ATTRIBUTE__VISIBILITY_HIDDEN)
132 check_c_source_compiles ("
133 int main(void) { if (__builtin_expect(0, 0)) return 1; return 0; }
134 " HAVE___BUILTIN_EXPECT)
136 check_c_source_compiles ("
139 int a; if (__sync_val_compare_and_swap(&a, 0, 1)) return 1; return 0;
141 " HAVE___SYNC_VAL_COMPARE_AND_SWAP)
143 check_c_source_compiles ("
144 #define _XOPEN_SOURCE 500
149 pthread_rwlock_init(&l, NULL);
150 pthread_rwlock_rdlock(&l);
155 check_c_source_compiles ("
156 __declspec(selectany) int a;
157 int main(void) { return 0; }
160 check_cxx_source_compiles ("
162 vector<int> t; int main() { }
165 check_cxx_source_compiles ("
167 std::vector<int> t; int main() { }
170 check_cxx_source_compiles ("
172 std::ostream& operator<<(std::ostream&, struct s);
175 " HAVE_USING_OPERATOR)
177 check_cxx_source_compiles ("
178 namespace Outer { namespace Inner { int i = 0; }}
179 using namespace Outer::Inner;;
180 int main() { return i; }
188 "uc_regs->gregs[PT_NIP]"
203 set (_PC_HEADERS ucontext.h signal.h)
205 if (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
206 foreach (_PC_FIELD ${_PC_FIELDS})
207 foreach (_PC_HEADER ${_PC_HEADERS})
209 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/uctfield.c)
210 file (WRITE ${_TMP} "
211 #define _GNU_SOURCE 1
212 #include <${_PC_HEADER}>
216 return u.${_PC_FIELD} == 0;
219 try_compile (HAVE_PC_FROM_UCONTEXT ${CMAKE_CURRENT_BINARY_DIR} ${_TMP}
220 COMPILE_DEFINITIONS _GNU_SOURCE=1)
222 if (HAVE_PC_FROM_UCONTEXT)
223 set (PC_FROM_UCONTEXT ${_PC_FIELD} CACHE)
224 endif (HAVE_PC_FROM_UCONTEXT)
225 endforeach (_PC_HEADER)
226 endforeach (_PC_FIELD)
227 endif (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
229 if (STL_STD_NAMESPACE)
230 set (STL_NAMESPACE std)
231 else (STL_STD_NAMESPACE)
232 set (STL_NAMESPACE "")
233 endif (STL_STD_NAMESPACE)
235 set (GOOGLE_NAMESPACE google)
236 set (_START_GOOGLE_NAMESPACE_ "namespace ${GOOGLE_NAMESPACE} {")
237 set (_END_GOOGLE_NAMESPACE_ "}")
240 set (ac_cv_have___uint16 1)
242 set (ac_cv_have___uint16 0)
243 endif (HAVE___UINT16)
246 set (ac_cv_have_inttypes_h 1)
247 else (HAVE_INTTYPES_H)
248 set (ac_cv_have_inttypes_h 0)
249 endif (HAVE_INTTYPES_H)
252 set (ac_cv_have_libgflags 1)
253 else (HAVE_LIB_GFLAGS)
254 set (ac_cv_have_libgflags 0)
255 endif (HAVE_LIB_GFLAGS)
258 set (ac_cv_have_stdint_h 1)
260 set (ac_cv_have_stdint_h 0)
261 endif (HAVE_STDINT_H)
263 if (HAVE_SYS_TYPES_H)
264 set (ac_cv_have_systypes_h 1)
265 else (HAVE_SYS_TYPES_H)
266 set (ac_cv_have_systypes_h 0)
267 endif (HAVE_SYS_TYPES_H)
270 set (ac_cv_have_u_int16_t 1)
271 else (HAVE_U_INT16_T)
272 set (ac_cv_have_u_int16_t 0)
273 endif (HAVE_U_INT16_T)
276 set (ac_cv_have_uint16_t 1)
278 set (ac_cv_have_uint16_t 0)
279 endif (HAVE_UINT16_T)
282 set (ac_cv_have_unistd_h 1)
284 set (ac_cv_have_unistd_h 0)
285 endif (HAVE_UNISTD_H)
287 set (ac_google_namespace ${GOOGLE_NAMESPACE})
288 set (ac_google_end_namespace ${_END_GOOGLE_NAMESPACE_})
289 set (ac_google_start_namespace ${_START_GOOGLE_NAMESPACE_})
291 if (HAVE___ATTRIBUTE__)
292 set (ac_cv___attribute___noreturn "__attribute__((noreturn))")
293 set (ac_cv___attribute___noinline "__attribute__((noinline))")
294 elseif (HAVE___DECLSPEC)
295 set (ac_cv___attribute___noreturn "__declspec(noreturn)")
296 #set (ac_cv___attribute___noinline "__declspec(noinline)")
297 endif (HAVE___ATTRIBUTE__)
299 if (HAVE___BUILTIN_EXPECT)
300 set (ac_cv_have___builtin_expect 1)
301 else (HAVE___BUILTIN_EXPECT)
302 set (ac_cv_have___builtin_expect 0)
303 endif (HAVE___BUILTIN_EXPECT)
305 if (HAVE_USING_OPERATOR)
306 set (ac_cv_cxx_using_operator 1)
307 else (HAVE_USING_OPERATOR)
308 set (ac_cv_cxx_using_operator 0)
309 endif (HAVE_USING_OPERATOR)
311 set (SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
313 if (Threads_FOUND AND CMAKE_USE_PTHREADS_INIT)
315 endif (Threads_FOUND AND CMAKE_USE_PTHREADS_INIT)
317 set (TEST_SRC_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\")
319 configure_file (src/config.h.cmake.in config.h)
320 configure_file (src/glog/logging.h.in glog/logging.h @ONLY)
321 configure_file (src/glog/raw_logging.h.in glog/raw_logging.h @ONLY)
322 configure_file (src/glog/stl_logging.h.in glog/stl_logging.h @ONLY)
323 configure_file (src/glog/vlog_is_on.h.in glog/vlog_is_on.h @ONLY)
325 set (CMAKE_CXX_VISIBILITY_PRESET default)
326 set (CMAKE_VISIBILITY_INLINES_HIDDEN 1)
329 ${CMAKE_CURRENT_BINARY_DIR}/config.h
330 ${CMAKE_CURRENT_BINARY_DIR}/glog/logging.h
331 ${CMAKE_CURRENT_BINARY_DIR}/glog/raw_logging.h
332 ${CMAKE_CURRENT_BINARY_DIR}/glog/stl_logging.h
333 ${CMAKE_CURRENT_BINARY_DIR}/glog/vlog_is_on.h
334 src/glog/log_severity.h
339 src/base/commandlineflags.h
340 src/base/googleinit.h
354 list (APPEND GLOG_SRCS src/signalhandler.cc)
358 list (APPEND GLOG_SRCS
369 target_link_libraries (glog PUBLIC ${UNWIND_LIBRARY})
370 endif (UNWIND_LIBRARY)
372 if (WIN32 AND HAVE_SNPRINTF)
373 set_property (SOURCE src/windows/port.cc APPEND PROPERTY COMPILE_DEFINITIONS
375 endif (WIN32 AND HAVE_SNPRINTF)
377 if (HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
378 target_compile_options (glog PUBLIC -Wno-unnamed-type-template-args)
379 endif (HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
382 target_include_directories (glog PUBLIC ${gflags_INCLUDE_DIR})
383 target_link_libraries (glog PUBLIC ${gflags_LIBRARIES})
385 if (NOT BUILD_SHARED_LIBS)
386 # Don't use __declspec(dllexport|dllimport) if this is a static build
387 targeT_compile_definitions (glog PUBLIC GFLAGS_DLL_DECLARE_FLAG= GFLAGS_DLL_DEFINE_FLAG=)
388 endif (NOT BUILD_SHARED_LIBS)
391 set_target_properties (glog PROPERTIES VERSION ${GLOG_MAJOR_VERSION})
392 set_target_properties (glog PROPERTIES SOVERSION ${GLOG_VERSION})
395 target_compile_definitions (glog PUBLIC GLOG_NO_ABBREVIATED_SEVERITIES)
398 set_target_properties (glog PROPERTIES PUBLIC_HEADER "${GLOG_PUBLIC_H}")
400 target_include_directories (glog BEFORE PUBLIC
401 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
402 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
403 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
404 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
407 target_include_directories (glog PUBLIC
408 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/windows>"
409 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/windows)
412 set_target_properties (glog PROPERTIES DEFINE_SYMBOL LIBGLOG_EXPORTS)
414 if (NOT BUILD_SHARED_LIBS)
415 target_compile_definitions (glog PUBLIC GOOGLE_GLOG_DLL_DECL=)
416 else (NOT BUILD_SHARED_LIBS)
417 target_compile_definitions (glog PRIVATE GOOGLE_GLOG_IS_A_DLL=1)
419 if (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
420 set (_EXPORT "__attribute__((visibility(\"default\")))")
422 elseif (HAVE___DECLSPEC)
423 set (_EXPORT "__declspec(dllexport)")
424 set (_IMPORT "__declspec(dllimport)")
425 endif (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
427 target_compile_definitions (glog PRIVATE
428 "GOOGLE_GLOG_DLL_DECL=${_EXPORT}")
429 target_compile_definitions (glog INTERFACE
430 "GOOGLE_GLOG_DLL_DECL=${_IMPORT}")
431 target_compile_definitions (glog INTERFACE
432 "GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS=${_IMPORT}")
433 endif (NOT BUILD_SHARED_LIBS)
436 target_link_libraries (glog PUBLIC ${CMAKE_THREAD_LIBS_INIT})
438 target_compile_definitions (glog PUBLIC NO_THREADS)
442 set (HAVE_STACKTRACE 1)
443 endif (HAVE_EXECINFO_H)
445 if (UNIX OR (APPLE AND HAVE_DLADDR))
446 set (HAVE_SYMBOLIZE 1)
447 endif (UNIX OR (APPLE AND HAVE_DLADDR))
451 add_executable (logging_unittest
452 src/logging_unittest.cc
455 target_link_libraries (logging_unittest PRIVATE glog)
457 add_executable (stl_logging_unittest
458 src/stl_logging_unittest.cc
461 target_link_libraries (stl_logging_unittest PRIVATE glog)
463 if (HAVE_NO_DEPRECATED)
464 set_property (TARGET stl_logging_unittest APPEND PROPERTY COMPILE_OPTIONS
466 endif (HAVE_NO_DEPRECATED)
468 if (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
469 target_compile_definitions (stl_logging_unittest PRIVATE
470 GLOG_STL_LOGGING_FOR_UNORDERED)
471 endif (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
473 if (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
474 target_compile_definitions (stl_logging_unittest PRIVATE
475 GLOG_STL_LOGGING_FOR_TR1_UNORDERED)
476 endif (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
478 if (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
479 target_compile_definitions (stl_logging_unittest PRIVATE
480 GLOG_STL_LOGGING_FOR_EXT_HASH)
481 endif (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
484 target_compile_definitions (stl_logging_unittest PRIVATE
485 GLOG_STL_LOGGING_FOR_EXT_SLIST)
486 endif (HAVE_EXT_SLIST)
489 add_executable (symbolize_unittest
490 src/symbolize_unittest.cc
493 target_link_libraries (symbolize_unittest PRIVATE glog)
494 endif (HAVE_SYMBOLIZE)
496 add_executable (demangle_unittest
497 src/demangle_unittest.cc
500 target_link_libraries (demangle_unittest PRIVATE glog)
503 add_executable (stacktrace_unittest
504 src/stacktrace_unittest.cc
507 target_link_libraries (stacktrace_unittest PRIVATE glog)
508 endif (HAVE_STACKTRACE)
510 add_executable (utilities_unittest
511 src/utilities_unittest.cc
514 target_link_libraries (utilities_unittest PRIVATE glog)
516 if (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
517 add_executable (signalhandler_unittest
518 src/signalhandler_unittest.cc
521 target_link_libraries (signalhandler_unittest PRIVATE glog)
522 endif (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
524 add_test (NAME demangle COMMAND demangle_unittest)
525 add_test (NAME logging COMMAND logging_unittest)
527 if (TARGET signalhandler_unittest)
528 add_test (NAME signalhandler COMMAND signalhandler_unittest)
529 endif (TARGET signalhandler_unittest)
531 if (TARGET stacktrace_unittest)
532 add_test (NAME stacktrace COMMAND stacktrace_unittest)
533 endif (TARGET stacktrace_unittest)
535 add_test (NAME stl_logging COMMAND stl_logging_unittest)
537 if (TARGET symbolize_unittest)
538 add_test (NAME symbolize COMMAND symbolize_unittest)
539 endif (TARGET symbolize_unittest)
541 install (TARGETS glog
543 RUNTIME DESTINATION bin
544 PUBLIC_HEADER DESTINATION include/glog
545 LIBRARY DESTINATION lib
546 ARCHIVE DESTINATION lib)
550 set (glog_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
551 set (glog_PACKAGE_DEPS)
554 set (glog_PACKAGE_DEPS
556 include (CMakeFindDependencyMacro)
558 find_dependency (gflags ${gflags_VERSION})
562 configure_package_config_file (glog-config.cmake.in
563 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake INSTALL_DESTINATION
564 lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
565 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
567 # The version file is the same both for build tree and install mode config
568 write_basic_package_version_file (glog-config-version.cmake VERSION
569 ${GLOG_VERSION} COMPATIBILITY SameMajorVersion)
573 set (glog_INCLUDE_DIR include)
575 configure_package_config_file (glog-config.cmake.in
576 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
577 INSTALL_DESTINATION lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
578 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
580 export (TARGETS glog FILE glog-targets.cmake)
581 export (PACKAGE glog)
584 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
585 ${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake
586 DESTINATION lib/cmake/glog)
588 install (EXPORT glog-targets DESTINATION lib/cmake/glog)