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)
27 list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
29 include (CMakePackageConfigHelpers)
31 include (CheckCSourceCompiles)
32 include (CheckCXXCompilerFlag)
33 include (CheckCXXSourceCompiles)
34 include (CheckFunctionExists)
35 include (CheckIncludeFile)
36 include (CheckIncludeFileCXX)
37 include (CheckLibraryExists)
38 include (CheckStructHasMember)
39 include (CheckSymbolExists)
40 include (CheckTypeSize)
41 include (DetermineGflagsNamespace)
43 set (CMAKE_THREAD_PREFER_PTHREAD 1)
49 set (HAVE_LIB_GFLAGS 1)
50 determine_gflags_namespace (gflags_NAMESPACE)
54 find_package (Threads)
56 check_include_file (dlfcn.h HAVE_DLFCN_H)
57 check_include_file (execinfo.h HAVE_EXECINFO_H)
58 check_include_file (glob.h HAVE_GLOB_H)
59 check_include_file (inttypes.h HAVE_INTTYPES_H)
60 check_include_file (libunwind.h HAVE_LIBUNWIND_H)
61 check_include_file (memory.h HAVE_MEMORY_H)
62 check_include_file (pwd.h HAVE_PWD_H)
63 check_include_file (stdint.h HAVE_STDINT_H)
64 check_include_file (stdlib.h HAVE_STDLIB_H)
65 check_include_file (string.h HAVE_STRING_H)
66 check_include_file (strings.h HAVE_STRINGS_H)
67 check_include_file (sys/stat.h HAVE_SYS_STAT_H)
68 check_include_file (sys/syscall.h HAVE_SYS_SYSCALL_H)
69 check_include_file (sys/time.h HAVE_SYS_TIME_H)
70 check_include_file (sys/types.h HAVE_SYS_TYPES_H)
71 check_include_file (sys/utsname.h HAVE_SYS_UTSNAME_H)
72 check_include_file (syscall.h HAVE_SYSCALL_H)
73 check_include_file (syslog.h HAVE_SYSLOG_H)
74 check_include_file (ucontext.h HAVE_UCONTEXT_H)
75 check_include_file (unistd.h HAVE_UNISTD_H)
76 check_include_file (unwind.h HAVE_UNWIND_H)
78 check_include_file_cxx ("ext/hash_map" HAVE_EXT_HASH_MAP)
79 check_include_file_cxx ("ext/hash_set" HAVE_EXT_HASH_SET)
80 check_include_file_cxx ("ext/slist" HAVE_EXT_SLIST)
81 check_include_file_cxx ("tr1/unordered_map" HAVE_TR1_UNORDERED_MAP)
82 check_include_file_cxx ("tr1/unordered_set" HAVE_TR1_UNORDERED_SET)
83 check_include_file_cxx ("unordered_map" HAVE_UNORDERED_MAP)
84 check_include_file_cxx ("unordered_set" HAVE_UNORDERED_SET)
86 check_type_size ("unsigned __int16" HAVE___UINT16)
87 check_type_size (u_int16_t HAVE_U_INT16_T)
88 check_type_size (uint16_t HAVE_UINT16_T)
90 check_function_exists (dladdr HAVE_DLADDR)
91 check_function_exists (fcntl HAVE_FCNTL)
92 check_function_exists (pread HAVE_PREAD)
93 check_function_exists (pwrite HAVE_PWRITE)
94 check_function_exists (sigaction HAVE_SIGACTION)
95 check_function_exists (sigaltstack HAVE_SIGALSTACK)
97 check_cxx_compiler_flag (-Wno-deprecated HAVE_NO_DEPRECATED)
98 check_cxx_compiler_flag (-Wno-unnamed-type-template-args
99 HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
101 # NOTE: Cannot use check_function_exists here since >=vc-14.0 can define
102 # snprintf as an inline function
103 check_symbol_exists (snprintf stdio.h HAVE_SNPRINTF)
105 check_library_exists (unwind get_static_proc_name "" HAVE_LIB_UNWIND)
107 find_library (UNWIND_LIBRARY NAMES unwind DOC "unwind library")
108 mark_as_advanced (UNWIND_LIBRARY)
110 check_c_source_compiles ("
112 static void foo(void) __attribute__ ((unused));
113 int main(void) { return 0; }
114 " HAVE___ATTRIBUTE__)
116 check_c_source_compiles ("
118 static void foo(void) __attribute__ ((visibility(\"default\")));
119 int main(void) { return 0; }
120 " HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
122 check_c_source_compiles ("
124 static void foo(void) __attribute__ ((visibility(\"hidden\")));
125 int main(void) { return 0; }
126 " HAVE___ATTRIBUTE__VISIBILITY_HIDDEN)
128 check_c_source_compiles ("
129 int main(void) { if (__builtin_expect(0, 0)) return 1; return 0; }
130 " HAVE___BUILTIN_EXPECT)
132 check_c_source_compiles ("
135 int a; if (__sync_val_compare_and_swap(&a, 0, 1)) return 1; return 0;
137 " HAVE___SYNC_VAL_COMPARE_AND_SWAP)
139 check_c_source_compiles ("
140 #define _XOPEN_SOURCE 500
145 pthread_rwlock_init(&l, NULL);
146 pthread_rwlock_rdlock(&l);
151 check_c_source_compiles ("
152 __declspec(selectany) int a;
153 int main(void) { return 0; }
156 check_cxx_source_compiles ("
158 vector<int> t; int main() { }
161 check_cxx_source_compiles ("
163 std::vector<int> t; int main() { }
166 check_cxx_source_compiles ("
168 std::ostream& operator<<(std::ostream&, struct s);
171 " HAVE_USING_OPERATOR)
173 check_cxx_source_compiles ("
174 namespace Outer { namespace Inner { int i = 0; }}
175 using namespace Outer::Inner;;
176 int main() { return i; }
184 "uc_regs->gregs[PT_NIP]"
199 set (_PC_HEADERS ucontext.h signal.h)
201 if (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
202 foreach (_PC_FIELD ${_PC_FIELDS})
203 foreach (_PC_HEADER ${_PC_HEADERS})
205 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/uctfield.c)
206 file (WRITE ${_TMP} "
207 #define _GNU_SOURCE 1
208 #include <${_PC_HEADER}>
212 return u.${_PC_FIELD} == 0;
215 try_compile (HAVE_PC_FROM_UCONTEXT ${CMAKE_CURRENT_BINARY_DIR} ${_TMP}
216 COMPILE_DEFINITIONS _GNU_SOURCE=1)
218 if (HAVE_PC_FROM_UCONTEXT)
219 set (PC_FROM_UCONTEXT ${_PC_FIELD} CACHE)
220 endif (HAVE_PC_FROM_UCONTEXT)
221 endforeach (_PC_HEADER)
222 endforeach (_PC_FIELD)
223 endif (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
225 if (STL_STD_NAMESPACE)
226 set (STL_NAMESPACE std)
227 else (STL_STD_NAMESPACE)
228 set (STL_NAMESPACE "")
229 endif (STL_STD_NAMESPACE)
231 set (GOOGLE_NAMESPACE google)
232 set (_START_GOOGLE_NAMESPACE_ "namespace ${GOOGLE_NAMESPACE} {")
233 set (_END_GOOGLE_NAMESPACE_ "}")
236 set (ac_cv_have___uint16 1)
238 set (ac_cv_have___uint16 0)
239 endif (HAVE___UINT16)
242 set (ac_cv_have_inttypes_h 1)
243 else (HAVE_INTTYPES_H)
244 set (ac_cv_have_inttypes_h 0)
245 endif (HAVE_INTTYPES_H)
248 set (ac_cv_have_libgflags 1)
249 else (HAVE_LIB_GFLAGS)
250 set (ac_cv_have_libgflags 0)
251 endif (HAVE_LIB_GFLAGS)
254 set (ac_cv_have_stdint_h 1)
256 set (ac_cv_have_stdint_h 0)
257 endif (HAVE_STDINT_H)
259 if (HAVE_SYS_TYPES_H)
260 set (ac_cv_have_systypes_h 1)
261 else (HAVE_SYS_TYPES_H)
262 set (ac_cv_have_systypes_h 0)
263 endif (HAVE_SYS_TYPES_H)
266 set (ac_cv_have_u_int16_t 1)
267 else (HAVE_U_INT16_T)
268 set (ac_cv_have_u_int16_t 0)
269 endif (HAVE_U_INT16_T)
272 set (ac_cv_have_uint16_t 1)
274 set (ac_cv_have_uint16_t 0)
275 endif (HAVE_UINT16_T)
278 set (ac_cv_have_unistd_h 1)
280 set (ac_cv_have_unistd_h 0)
281 endif (HAVE_UNISTD_H)
283 set (ac_google_namespace ${GOOGLE_NAMESPACE})
284 set (ac_google_end_namespace ${_END_GOOGLE_NAMESPACE_})
285 set (ac_google_start_namespace ${_START_GOOGLE_NAMESPACE_})
287 if (HAVE___ATTRIBUTE__)
288 set (ac_cv___attribute___noreturn "__attribute__((noreturn))")
289 set (ac_cv___attribute___noinline "__attribute__((noinline))")
290 elseif (HAVE___DECLSPEC)
291 set (ac_cv___attribute___noreturn "__declspec(noreturn)")
292 #set (ac_cv___attribute___noinline "__declspec(noinline)")
293 endif (HAVE___ATTRIBUTE__)
295 if (HAVE___BUILTIN_EXPECT)
296 set (ac_cv_have___builtin_expect 1)
297 else (HAVE___BUILTIN_EXPECT)
298 set (ac_cv_have___builtin_expect 0)
299 endif (HAVE___BUILTIN_EXPECT)
301 if (HAVE_USING_OPERATOR)
302 set (ac_cv_cxx_using_operator 1)
303 else (HAVE_USING_OPERATOR)
304 set (ac_cv_cxx_using_operator 0)
305 endif (HAVE_USING_OPERATOR)
307 set (SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
309 if (Threads_FOUND AND CMAKE_USE_PTHREADS_INIT)
311 endif (Threads_FOUND AND CMAKE_USE_PTHREADS_INIT)
313 set (TEST_SRC_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\")
315 configure_file (src/config.h.cmake.in config.h)
316 configure_file (src/glog/logging.h.in glog/logging.h @ONLY)
317 configure_file (src/glog/raw_logging.h.in glog/raw_logging.h @ONLY)
318 configure_file (src/glog/stl_logging.h.in glog/stl_logging.h @ONLY)
319 configure_file (src/glog/vlog_is_on.h.in glog/vlog_is_on.h @ONLY)
321 set (CMAKE_CXX_VISIBILITY_PRESET default)
322 set (CMAKE_VISIBILITY_INLINES_HIDDEN 1)
325 ${CMAKE_CURRENT_BINARY_DIR}/config.h
326 ${CMAKE_CURRENT_BINARY_DIR}/glog/logging.h
327 ${CMAKE_CURRENT_BINARY_DIR}/glog/raw_logging.h
328 ${CMAKE_CURRENT_BINARY_DIR}/glog/stl_logging.h
329 ${CMAKE_CURRENT_BINARY_DIR}/glog/vlog_is_on.h
330 src/glog/log_severity.h
335 src/base/commandlineflags.h
336 src/base/googleinit.h
350 list (APPEND GLOG_SRCS src/signalhandler.cc)
354 list (APPEND GLOG_SRCS
365 target_link_libraries (glog PUBLIC ${UNWIND_LIBRARY})
366 endif (UNWIND_LIBRARY)
368 if (WIN32 AND HAVE_SNPRINTF)
369 set_property (SOURCE src/windows/port.cc APPEND PROPERTY COMPILE_DEFINITIONS
371 endif (WIN32 AND HAVE_SNPRINTF)
373 if (HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
374 target_compile_options (glog PUBLIC -Wno-unnamed-type-template-args)
375 endif (HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
378 target_include_directories (glog PUBLIC ${gflags_INCLUDE_DIR})
379 target_link_libraries (glog PUBLIC ${gflags_LIBRARIES})
381 if (NOT BUILD_SHARED_LIBS)
382 # Don't use __declspec(dllexport|dllimport) if this is a static build
383 targeT_compile_definitions (glog PUBLIC GFLAGS_DLL_DECLARE_FLAG= GFLAGS_DLL_DEFINE_FLAG=)
384 endif (NOT BUILD_SHARED_LIBS)
387 set_target_properties (glog PROPERTIES VERSION ${GLOG_MAJOR_VERSION})
388 set_target_properties (glog PROPERTIES SOVERSION ${GLOG_VERSION})
391 target_compile_definitions (glog PUBLIC GLOG_NO_ABBREVIATED_SEVERITIES)
394 set_target_properties (glog PROPERTIES PUBLIC_HEADER "${GLOG_PUBLIC_H}")
396 target_include_directories (glog BEFORE PUBLIC
397 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
398 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
399 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
400 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
403 target_include_directories (glog PUBLIC
404 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/windows>"
405 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/windows)
408 set_target_properties (glog PROPERTIES DEFINE_SYMBOL LIBGLOG_EXPORTS)
410 if (NOT BUILD_SHARED_LIBS)
411 target_compile_definitions (glog PUBLIC GOOGLE_GLOG_DLL_DECL=)
412 else (NOT BUILD_SHARED_LIBS)
413 target_compile_definitions (glog PRIVATE GOOGLE_GLOG_IS_A_DLL=1)
415 if (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
416 set (_EXPORT "__attribute__((visibility(\"default\")))")
418 elseif (HAVE___DECLSPEC)
419 set (_EXPORT "__declspec(dllexport)")
420 set (_IMPORT "__declspec(dllimport)")
421 endif (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
423 target_compile_definitions (glog PRIVATE
424 "GOOGLE_GLOG_DLL_DECL=${_EXPORT}")
425 target_compile_definitions (glog INTERFACE
426 "GOOGLE_GLOG_DLL_DECL=${_IMPORT}")
427 target_compile_definitions (glog INTERFACE
428 "GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS=${_IMPORT}")
429 endif (NOT BUILD_SHARED_LIBS)
432 target_link_libraries (glog PUBLIC ${CMAKE_THREAD_LIBS_INIT})
434 target_compile_definitions (glog PUBLIC NO_THREADS)
438 set (HAVE_STACKTRACE 1)
439 endif (HAVE_EXECINFO_H)
441 if (UNIX OR (APPLE AND HAVE_DLADDR))
442 set (HAVE_SYMBOLIZE 1)
443 endif (UNIX OR (APPLE AND HAVE_DLADDR))
447 add_executable (logging_unittest
448 src/logging_unittest.cc
451 target_link_libraries (logging_unittest PRIVATE glog)
453 add_executable (stl_logging_unittest
454 src/stl_logging_unittest.cc
457 target_link_libraries (stl_logging_unittest PRIVATE glog)
459 if (HAVE_NO_DEPRECATED)
460 set_property (TARGET stl_logging_unittest APPEND PROPERTY COMPILE_OPTIONS
462 endif (HAVE_NO_DEPRECATED)
464 if (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
465 target_compile_definitions (stl_logging_unittest PRIVATE
466 GLOG_STL_LOGGING_FOR_UNORDERED)
467 endif (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
469 if (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
470 target_compile_definitions (stl_logging_unittest PRIVATE
471 GLOG_STL_LOGGING_FOR_TR1_UNORDERED)
472 endif (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
474 if (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
475 target_compile_definitions (stl_logging_unittest PRIVATE
476 GLOG_STL_LOGGING_FOR_EXT_HASH)
477 endif (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
480 target_compile_definitions (stl_logging_unittest PRIVATE
481 GLOG_STL_LOGGING_FOR_EXT_SLIST)
482 endif (HAVE_EXT_SLIST)
485 add_executable (symbolize_unittest
486 src/symbolize_unittest.cc
489 target_link_libraries (symbolize_unittest PRIVATE glog)
490 endif (HAVE_SYMBOLIZE)
492 add_executable (demangle_unittest
493 src/demangle_unittest.cc
496 target_link_libraries (demangle_unittest PRIVATE glog)
499 add_executable (stacktrace_unittest
500 src/stacktrace_unittest.cc
503 target_link_libraries (stacktrace_unittest PRIVATE glog)
504 endif (HAVE_STACKTRACE)
506 add_executable (utilities_unittest
507 src/utilities_unittest.cc
510 target_link_libraries (utilities_unittest PRIVATE glog)
512 if (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
513 add_executable (signalhandler_unittest
514 src/signalhandler_unittest.cc
517 target_link_libraries (signalhandler_unittest PRIVATE glog)
518 endif (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
520 add_test (NAME demangle COMMAND demangle_unittest)
521 add_test (NAME logging COMMAND logging_unittest)
523 if (TARGET signalhandler_unittest)
524 add_test (NAME signalhandler COMMAND signalhandler_unittest)
525 endif (TARGET signalhandler_unittest)
527 if (TARGET stacktrace_unittest)
528 add_test (NAME stacktrace COMMAND stacktrace_unittest)
529 endif (TARGET stacktrace_unittest)
531 add_test (NAME stl_logging COMMAND stl_logging_unittest)
533 if (TARGET symbolize_unittest)
534 add_test (NAME symbolize COMMAND symbolize_unittest)
535 endif (TARGET symbolize_unittest)
537 install (TARGETS glog
539 RUNTIME DESTINATION bin
540 PUBLIC_HEADER DESTINATION include/glog
541 LIBRARY DESTINATION lib
542 ARCHIVE DESTINATION lib)
546 set (glog_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
547 set (glog_PACKAGE_DEPS)
550 set (glog_PACKAGE_DEPS
552 include (CMakeFindDependencyMacro)
554 find_dependency (gflags ${gflags_VERSION})
558 configure_package_config_file (glog-config.cmake.in
559 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake INSTALL_DESTINATION
560 lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
561 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
563 # The version file is the same both for build tree and install mode config
564 write_basic_package_version_file (glog-config-version.cmake VERSION
565 ${GLOG_VERSION} COMPATIBILITY SameMajorVersion)
569 set (glog_INCLUDE_DIR include)
571 configure_package_config_file (glog-config.cmake.in
572 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
573 INSTALL_DESTINATION lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
574 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
576 export (TARGETS glog FILE glog-targets.cmake)
577 export (PACKAGE glog)
580 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
581 ${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake
582 DESTINATION lib/cmake/glog)
584 install (EXPORT glog-targets DESTINATION lib/cmake/glog)