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 check_cxx_compiler_flag (-Wno-deprecated HAVE_NO_DEPRECATED)
105 check_cxx_compiler_flag (-Wno-unnamed-type-template-args
106 HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
108 # NOTE: Cannot use check_function_exists here since >=vc-14.0 can define
109 # snprintf as an inline function
110 check_symbol_exists (snprintf stdio.h HAVE_SNPRINTF)
112 check_library_exists (unwind get_static_proc_name "" HAVE_LIB_UNWIND)
114 find_library (UNWIND_LIBRARY NAMES unwind DOC "unwind library")
115 mark_as_advanced (UNWIND_LIBRARY)
117 check_c_source_compiles ("
119 static void foo(void) __attribute__ ((unused));
120 int main(void) { return 0; }
121 " HAVE___ATTRIBUTE__)
123 check_c_source_compiles ("
125 static void foo(void) __attribute__ ((visibility(\"default\")));
126 int main(void) { return 0; }
127 " HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
129 check_c_source_compiles ("
131 static void foo(void) __attribute__ ((visibility(\"hidden\")));
132 int main(void) { return 0; }
133 " HAVE___ATTRIBUTE__VISIBILITY_HIDDEN)
135 check_c_source_compiles ("
136 int main(void) { if (__builtin_expect(0, 0)) return 1; return 0; }
137 " HAVE___BUILTIN_EXPECT)
139 check_c_source_compiles ("
142 int a; if (__sync_val_compare_and_swap(&a, 0, 1)) return 1; return 0;
144 " HAVE___SYNC_VAL_COMPARE_AND_SWAP)
146 check_c_source_compiles ("
147 #define _XOPEN_SOURCE 500
152 pthread_rwlock_init(&l, NULL);
153 pthread_rwlock_rdlock(&l);
158 check_c_source_compiles ("
159 __declspec(selectany) int a;
160 int main(void) { return 0; }
163 check_cxx_source_compiles ("
165 vector<int> t; int main() { }
168 check_cxx_source_compiles ("
170 std::vector<int> t; int main() { }
173 check_cxx_source_compiles ("
175 std::ostream& operator<<(std::ostream&, struct s);
178 " HAVE_USING_OPERATOR)
180 check_cxx_source_compiles ("
181 namespace Outer { namespace Inner { int i = 0; }}
182 using namespace Outer::Inner;;
183 int main() { return i; }
191 "uc_regs->gregs[PT_NIP]"
206 set (_PC_HEADERS ucontext.h signal.h)
208 if (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
209 foreach (_PC_FIELD ${_PC_FIELDS})
210 foreach (_PC_HEADER ${_PC_HEADERS})
212 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/uctfield.c)
213 file (WRITE ${_TMP} "
214 #define _GNU_SOURCE 1
215 #include <${_PC_HEADER}>
219 return u.${_PC_FIELD} == 0;
222 try_compile (HAVE_PC_FROM_UCONTEXT ${CMAKE_CURRENT_BINARY_DIR} ${_TMP}
223 COMPILE_DEFINITIONS _GNU_SOURCE=1)
225 if (HAVE_PC_FROM_UCONTEXT)
226 set (PC_FROM_UCONTEXT ${_PC_FIELD} CACHE)
227 endif (HAVE_PC_FROM_UCONTEXT)
228 endforeach (_PC_HEADER)
229 endforeach (_PC_FIELD)
230 endif (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
232 if (STL_STD_NAMESPACE)
233 set (STL_NAMESPACE std)
234 else (STL_STD_NAMESPACE)
235 set (STL_NAMESPACE "")
236 endif (STL_STD_NAMESPACE)
238 set (GOOGLE_NAMESPACE google)
239 set (_START_GOOGLE_NAMESPACE_ "namespace ${GOOGLE_NAMESPACE} {")
240 set (_END_GOOGLE_NAMESPACE_ "}")
243 set (ac_cv_have___uint16 1)
245 set (ac_cv_have___uint16 0)
246 endif (HAVE___UINT16)
249 set (ac_cv_have_inttypes_h 1)
250 else (HAVE_INTTYPES_H)
251 set (ac_cv_have_inttypes_h 0)
252 endif (HAVE_INTTYPES_H)
255 set (ac_cv_have_libgflags 1)
256 else (HAVE_LIB_GFLAGS)
257 set (ac_cv_have_libgflags 0)
258 endif (HAVE_LIB_GFLAGS)
261 set (ac_cv_have_stdint_h 1)
263 set (ac_cv_have_stdint_h 0)
264 endif (HAVE_STDINT_H)
266 if (HAVE_SYS_TYPES_H)
267 set (ac_cv_have_systypes_h 1)
268 else (HAVE_SYS_TYPES_H)
269 set (ac_cv_have_systypes_h 0)
270 endif (HAVE_SYS_TYPES_H)
273 set (ac_cv_have_u_int16_t 1)
274 else (HAVE_U_INT16_T)
275 set (ac_cv_have_u_int16_t 0)
276 endif (HAVE_U_INT16_T)
279 set (ac_cv_have_uint16_t 1)
281 set (ac_cv_have_uint16_t 0)
282 endif (HAVE_UINT16_T)
285 set (ac_cv_have_unistd_h 1)
287 set (ac_cv_have_unistd_h 0)
288 endif (HAVE_UNISTD_H)
290 set (ac_google_namespace ${GOOGLE_NAMESPACE})
291 set (ac_google_end_namespace ${_END_GOOGLE_NAMESPACE_})
292 set (ac_google_start_namespace ${_START_GOOGLE_NAMESPACE_})
294 if (HAVE___ATTRIBUTE__)
295 set (ac_cv___attribute___noreturn "__attribute__((noreturn))")
296 set (ac_cv___attribute___noinline "__attribute__((noinline))")
297 elseif (HAVE___DECLSPEC)
298 set (ac_cv___attribute___noreturn "__declspec(noreturn)")
299 #set (ac_cv___attribute___noinline "__declspec(noinline)")
300 endif (HAVE___ATTRIBUTE__)
302 if (HAVE___BUILTIN_EXPECT)
303 set (ac_cv_have___builtin_expect 1)
304 else (HAVE___BUILTIN_EXPECT)
305 set (ac_cv_have___builtin_expect 0)
306 endif (HAVE___BUILTIN_EXPECT)
308 if (HAVE_USING_OPERATOR)
309 set (ac_cv_cxx_using_operator 1)
310 else (HAVE_USING_OPERATOR)
311 set (ac_cv_cxx_using_operator 0)
312 endif (HAVE_USING_OPERATOR)
314 set (SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
316 if (WITH_THREADS AND Threads_FOUND)
317 if (CMAKE_USE_PTHREADS_INIT)
319 endif (CMAKE_USE_PTHREADS_INIT)
320 else (WITH_THREADS AND Threads_FOUND)
322 endif (WITH_THREADS AND Threads_FOUND)
324 set (TEST_SRC_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\")
326 configure_file (src/config.h.cmake.in config.h)
327 configure_file (src/glog/logging.h.in glog/logging.h @ONLY)
328 configure_file (src/glog/raw_logging.h.in glog/raw_logging.h @ONLY)
329 configure_file (src/glog/stl_logging.h.in glog/stl_logging.h @ONLY)
330 configure_file (src/glog/vlog_is_on.h.in glog/vlog_is_on.h @ONLY)
332 set (CMAKE_CXX_VISIBILITY_PRESET default)
333 set (CMAKE_VISIBILITY_INLINES_HIDDEN 1)
336 ${CMAKE_CURRENT_BINARY_DIR}/config.h
337 ${CMAKE_CURRENT_BINARY_DIR}/glog/logging.h
338 ${CMAKE_CURRENT_BINARY_DIR}/glog/raw_logging.h
339 ${CMAKE_CURRENT_BINARY_DIR}/glog/stl_logging.h
340 ${CMAKE_CURRENT_BINARY_DIR}/glog/vlog_is_on.h
341 src/glog/log_severity.h
346 src/base/commandlineflags.h
347 src/base/googleinit.h
361 list (APPEND GLOG_SRCS src/signalhandler.cc)
365 list (APPEND GLOG_SRCS
376 target_link_libraries (glog PUBLIC ${UNWIND_LIBRARY})
377 endif (UNWIND_LIBRARY)
380 target_link_libraries (glog PUBLIC ${CMAKE_THREAD_LIBS_INIT})
383 if (WIN32 AND HAVE_SNPRINTF)
384 set_property (SOURCE src/windows/port.cc APPEND PROPERTY COMPILE_DEFINITIONS
386 endif (WIN32 AND HAVE_SNPRINTF)
388 if (HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
389 target_compile_options (glog PUBLIC -Wno-unnamed-type-template-args)
390 endif (HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
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 "$<INSTALL_INTERFACE:include>"
415 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
416 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
419 target_include_directories (glog PUBLIC
420 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/windows>"
421 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/windows)
424 set_target_properties (glog PROPERTIES DEFINE_SYMBOL LIBGLOG_EXPORTS)
426 if (NOT BUILD_SHARED_LIBS)
427 target_compile_definitions (glog PUBLIC GOOGLE_GLOG_DLL_DECL=)
428 else (NOT BUILD_SHARED_LIBS)
429 target_compile_definitions (glog PRIVATE GOOGLE_GLOG_IS_A_DLL=1)
431 if (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
432 set (_EXPORT "__attribute__((visibility(\"default\")))")
434 elseif (HAVE___DECLSPEC)
435 set (_EXPORT "__declspec(dllexport)")
436 set (_IMPORT "__declspec(dllimport)")
437 endif (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
439 target_compile_definitions (glog PRIVATE
440 "GOOGLE_GLOG_DLL_DECL=${_EXPORT}")
441 target_compile_definitions (glog INTERFACE
442 "GOOGLE_GLOG_DLL_DECL=${_IMPORT}")
443 target_compile_definitions (glog INTERFACE
444 "GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS=${_IMPORT}")
445 endif (NOT BUILD_SHARED_LIBS)
448 set (HAVE_STACKTRACE 1)
449 endif (HAVE_EXECINFO_H)
451 if (UNIX OR (APPLE AND HAVE_DLADDR))
452 set (HAVE_SYMBOLIZE 1)
453 endif (UNIX OR (APPLE AND HAVE_DLADDR))
457 add_executable (logging_unittest
458 src/logging_unittest.cc
461 target_link_libraries (logging_unittest PRIVATE glog)
463 add_executable (stl_logging_unittest
464 src/stl_logging_unittest.cc
467 target_link_libraries (stl_logging_unittest PRIVATE glog)
469 if (HAVE_NO_DEPRECATED)
470 set_property (TARGET stl_logging_unittest APPEND PROPERTY COMPILE_OPTIONS
472 endif (HAVE_NO_DEPRECATED)
474 if (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
475 target_compile_definitions (stl_logging_unittest PRIVATE
476 GLOG_STL_LOGGING_FOR_UNORDERED)
477 endif (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
479 if (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
480 target_compile_definitions (stl_logging_unittest PRIVATE
481 GLOG_STL_LOGGING_FOR_TR1_UNORDERED)
482 endif (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
484 if (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
485 target_compile_definitions (stl_logging_unittest PRIVATE
486 GLOG_STL_LOGGING_FOR_EXT_HASH)
487 endif (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
490 target_compile_definitions (stl_logging_unittest PRIVATE
491 GLOG_STL_LOGGING_FOR_EXT_SLIST)
492 endif (HAVE_EXT_SLIST)
495 add_executable (symbolize_unittest
496 src/symbolize_unittest.cc
499 target_link_libraries (symbolize_unittest PRIVATE glog)
500 endif (HAVE_SYMBOLIZE)
502 add_executable (demangle_unittest
503 src/demangle_unittest.cc
506 target_link_libraries (demangle_unittest PRIVATE glog)
509 add_executable (stacktrace_unittest
510 src/stacktrace_unittest.cc
513 target_link_libraries (stacktrace_unittest PRIVATE glog)
514 endif (HAVE_STACKTRACE)
516 add_executable (utilities_unittest
517 src/utilities_unittest.cc
520 target_link_libraries (utilities_unittest PRIVATE glog)
522 if (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
523 add_executable (signalhandler_unittest
524 src/signalhandler_unittest.cc
527 target_link_libraries (signalhandler_unittest PRIVATE glog)
528 endif (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
530 add_test (NAME demangle COMMAND demangle_unittest)
531 add_test (NAME logging COMMAND logging_unittest)
533 if (TARGET signalhandler_unittest)
534 add_test (NAME signalhandler COMMAND signalhandler_unittest)
535 endif (TARGET signalhandler_unittest)
537 if (TARGET stacktrace_unittest)
538 add_test (NAME stacktrace COMMAND stacktrace_unittest)
539 endif (TARGET stacktrace_unittest)
541 add_test (NAME stl_logging COMMAND stl_logging_unittest)
543 if (TARGET symbolize_unittest)
544 add_test (NAME symbolize COMMAND symbolize_unittest)
545 endif (TARGET symbolize_unittest)
547 install (TARGETS glog
549 RUNTIME DESTINATION bin
550 PUBLIC_HEADER DESTINATION include/glog
551 LIBRARY DESTINATION lib
552 ARCHIVE DESTINATION lib)
556 set (glog_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
557 set (glog_PACKAGE_DEPS)
560 set (glog_PACKAGE_DEPS
562 include (CMakeFindDependencyMacro)
564 find_dependency (gflags ${gflags_VERSION})
568 configure_package_config_file (glog-config.cmake.in
569 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake INSTALL_DESTINATION
570 lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
571 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
573 # The version file is the same both for build tree and install mode config
574 write_basic_package_version_file (glog-config-version.cmake VERSION
575 ${GLOG_VERSION} COMPATIBILITY SameMajorVersion)
579 set (glog_INCLUDE_DIR include)
581 configure_package_config_file (glog-config.cmake.in
582 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
583 INSTALL_DESTINATION lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
584 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
586 export (TARGETS glog FILE glog-targets.cmake)
587 export (PACKAGE glog)
590 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
591 ${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake
592 DESTINATION lib/cmake/glog)
594 install (EXPORT glog-targets DESTINATION lib/cmake/glog)