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 check_c_source_compiles ("
109 static void foo(void) __attribute__ ((unused));
110 int main(void) { return 0; }
111 " HAVE___ATTRIBUTE__)
113 check_c_source_compiles ("
115 static void foo(void) __attribute__ ((visibility(\"default\")));
116 int main(void) { return 0; }
117 " HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
119 check_c_source_compiles ("
121 static void foo(void) __attribute__ ((visibility(\"hidden\")));
122 int main(void) { return 0; }
123 " HAVE___ATTRIBUTE__VISIBILITY_HIDDEN)
125 check_c_source_compiles ("
126 int main(void) { if (__builtin_expect(0, 0)) return 1; return 0; }
127 " HAVE___BUILTIN_EXPECT)
129 check_c_source_compiles ("
132 int a; if (__sync_val_compare_and_swap(&a, 0, 1)) return 1; return 0;
134 " HAVE___SYNC_VAL_COMPARE_AND_SWAP)
136 check_c_source_compiles ("
137 #define _XOPEN_SOURCE 500
142 pthread_rwlock_init(&l, NULL);
143 pthread_rwlock_rdlock(&l);
148 check_c_source_compiles ("
149 __declspec(selectany) int a;
150 int main(void) { return 0; }
153 check_cxx_source_compiles ("
155 vector<int> t; int main() { }
158 check_cxx_source_compiles ("
160 std::vector<int> t; int main() { }
163 check_cxx_source_compiles ("
165 std::ostream& operator<<(std::ostream&, struct s);
168 " HAVE_USING_OPERATOR)
170 check_cxx_source_compiles ("
171 namespace Outer { namespace Inner { int i = 0; }}
172 using namespace Outer::Inner;;
173 int main() { return i; }
181 "uc_regs->gregs[PT_NIP]"
196 set (_PC_HEADERS ucontext.h signal.h)
198 if (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
199 foreach (_PC_FIELD ${_PC_FIELDS})
200 foreach (_PC_HEADER ${_PC_HEADERS})
202 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/uctfield.c)
203 file (WRITE ${_TMP} "
204 #define _GNU_SOURCE 1
205 #include <${_PC_HEADER}>
209 return u.${_PC_FIELD} == 0;
212 try_compile (HAVE_PC_FROM_UCONTEXT ${CMAKE_CURRENT_BINARY_DIR} ${_TMP}
213 COMPILE_DEFINITIONS _GNU_SOURCE=1)
215 if (HAVE_PC_FROM_UCONTEXT)
216 set (PC_FROM_UCONTEXT ${_PC_FIELD} CACHE)
217 endif (HAVE_PC_FROM_UCONTEXT)
218 endforeach (_PC_HEADER)
219 endforeach (_PC_FIELD)
220 endif (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
222 if (STL_STD_NAMESPACE)
223 set (STL_NAMESPACE std)
224 else (STL_STD_NAMESPACE)
225 set (STL_NAMESPACE "")
226 endif (STL_STD_NAMESPACE)
228 set (GOOGLE_NAMESPACE google)
229 set (_START_GOOGLE_NAMESPACE_ "namespace ${GOOGLE_NAMESPACE} {")
230 set (_END_GOOGLE_NAMESPACE_ "}")
233 set (ac_cv_have___uint16 1)
235 set (ac_cv_have___uint16 0)
236 endif (HAVE___UINT16)
239 set (ac_cv_have_inttypes_h 1)
240 else (HAVE_INTTYPES_H)
241 set (ac_cv_have_inttypes_h 0)
242 endif (HAVE_INTTYPES_H)
245 set (ac_cv_have_libgflags 1)
246 else (HAVE_LIB_GFLAGS)
247 set (ac_cv_have_libgflags 0)
248 endif (HAVE_LIB_GFLAGS)
251 set (ac_cv_have_stdint_h 1)
253 set (ac_cv_have_stdint_h 0)
254 endif (HAVE_STDINT_H)
256 if (HAVE_SYS_TYPES_H)
257 set (ac_cv_have_systypes_h 1)
258 else (HAVE_SYS_TYPES_H)
259 set (ac_cv_have_systypes_h 0)
260 endif (HAVE_SYS_TYPES_H)
263 set (ac_cv_have_u_int16_t 1)
264 else (HAVE_U_INT16_T)
265 set (ac_cv_have_u_int16_t 0)
266 endif (HAVE_U_INT16_T)
269 set (ac_cv_have_uint16_t 1)
271 set (ac_cv_have_uint16_t 0)
272 endif (HAVE_UINT16_T)
275 set (ac_cv_have_unistd_h 1)
277 set (ac_cv_have_unistd_h 0)
278 endif (HAVE_UNISTD_H)
280 set (ac_google_namespace ${GOOGLE_NAMESPACE})
281 set (ac_google_end_namespace ${_END_GOOGLE_NAMESPACE_})
282 set (ac_google_start_namespace ${_START_GOOGLE_NAMESPACE_})
284 if (HAVE___ATTRIBUTE__)
285 set (ac_cv___attribute___noreturn "__attribute__((noreturn))")
286 set (ac_cv___attribute___noinline "__attribute__((noinline))")
287 elseif (HAVE___DECLSPEC)
288 set (ac_cv___attribute___noreturn "__declspec(noreturn)")
289 #set (ac_cv___attribute___noinline "__declspec(noinline)")
290 endif (HAVE___ATTRIBUTE__)
292 if (HAVE___BUILTIN_EXPECT)
293 set (ac_cv_have___builtin_expect 1)
294 else (HAVE___BUILTIN_EXPECT)
295 set (ac_cv_have___builtin_expect 0)
296 endif (HAVE___BUILTIN_EXPECT)
298 if (HAVE_USING_OPERATOR)
299 set (ac_cv_cxx_using_operator 1)
300 else (HAVE_USING_OPERATOR)
301 set (ac_cv_cxx_using_operator 0)
302 endif (HAVE_USING_OPERATOR)
304 set (SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
306 if (Threads_FOUND AND CMAKE_USE_PTHREADS_INIT)
308 endif (Threads_FOUND AND CMAKE_USE_PTHREADS_INIT)
310 set (TEST_SRC_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\")
312 configure_file (src/config.h.cmake.in config.h)
313 configure_file (src/glog/logging.h.in glog/logging.h @ONLY)
314 configure_file (src/glog/raw_logging.h.in glog/raw_logging.h @ONLY)
315 configure_file (src/glog/stl_logging.h.in glog/stl_logging.h @ONLY)
316 configure_file (src/glog/vlog_is_on.h.in glog/vlog_is_on.h @ONLY)
318 set (CMAKE_CXX_VISIBILITY_PRESET default)
319 set (CMAKE_VISIBILITY_INLINES_HIDDEN 1)
322 ${CMAKE_CURRENT_BINARY_DIR}/config.h
323 ${CMAKE_CURRENT_BINARY_DIR}/glog/logging.h
324 ${CMAKE_CURRENT_BINARY_DIR}/glog/raw_logging.h
325 ${CMAKE_CURRENT_BINARY_DIR}/glog/stl_logging.h
326 ${CMAKE_CURRENT_BINARY_DIR}/glog/vlog_is_on.h
327 src/glog/log_severity.h
332 src/base/commandlineflags.h
333 src/base/googleinit.h
347 list (APPEND GLOG_SRCS src/signalhandler.cc)
351 list (APPEND GLOG_SRCS
361 if (WIN32 AND HAVE_SNPRINTF)
362 set_property (SOURCE src/windows/port.cc APPEND PROPERTY COMPILE_DEFINITIONS
364 endif (WIN32 AND HAVE_SNPRINTF)
366 if (HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
367 target_compile_options (glog PUBLIC -Wno-unnamed-type-template-args)
368 endif (HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS)
371 target_include_directories (glog PUBLIC ${gflags_INCLUDE_DIR})
372 target_link_libraries (glog PUBLIC ${gflags_LIBRARIES})
375 set_target_properties (glog PROPERTIES VERSION ${GLOG_MAJOR_VERSION})
376 set_target_properties (glog PROPERTIES SOVERSION ${GLOG_VERSION})
379 target_compile_definitions (glog PUBLIC GLOG_NO_ABBREVIATED_SEVERITIES)
382 set_target_properties (glog PROPERTIES PUBLIC_HEADER "${GLOG_PUBLIC_H}")
384 target_include_directories (glog BEFORE PUBLIC
385 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
386 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
387 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
388 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
391 target_include_directories (glog PUBLIC
392 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/windows>"
393 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/windows)
396 set_target_properties (glog PROPERTIES DEFINE_SYMBOL LIBGLOG_EXPORTS)
398 if (NOT BUILD_SHARED_LIBS)
399 target_compile_definitions (glog PUBLIC GOOGLE_GLOG_DLL_DECL=)
400 else (NOT BUILD_SHARED_LIBS)
401 target_compile_definitions (glog PRIVATE GOOGLE_GLOG_IS_A_DLL=1)
403 if (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
404 set (_EXPORT "__attribute__((visibility(\"default\")))")
406 elseif (HAVE___DECLSPEC)
407 set (_EXPORT "__declspec(dllexport)")
408 set (_IMPORT "__declspec(dllimport)")
409 endif (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
411 target_compile_definitions (glog PRIVATE
412 "GOOGLE_GLOG_DLL_DECL=${_EXPORT}")
413 target_compile_definitions (glog INTERFACE
414 "GOOGLE_GLOG_DLL_DECL=${_IMPORT}")
415 target_compile_definitions (glog INTERFACE
416 "GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS=${_IMPORT}")
417 endif (NOT BUILD_SHARED_LIBS)
420 target_link_libraries (glog PUBLIC ${CMAKE_THREAD_LIBS_INIT})
422 target_compile_definitions (glog PUBLIC NO_THREADS)
426 set (HAVE_STACKTRACE 1)
427 endif (HAVE_EXECINFO_H)
429 if (UNIX OR (APPLE AND HAVE_DLADDR))
430 set (HAVE_SYMBOLIZE 1)
431 endif (UNIX OR (APPLE AND HAVE_DLADDR))
435 add_executable (logging_unittest
436 src/logging_unittest.cc
439 target_link_libraries (logging_unittest PRIVATE glog)
441 add_executable (stl_logging_unittest
442 src/stl_logging_unittest.cc
445 target_link_libraries (stl_logging_unittest PRIVATE glog)
447 if (HAVE_NO_DEPRECATED)
448 set_property (TARGET stl_logging_unittest APPEND PROPERTY COMPILE_OPTIONS
450 endif (HAVE_NO_DEPRECATED)
452 if (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
453 target_compile_definitions (stl_logging_unittest PRIVATE
454 GLOG_STL_LOGGING_FOR_UNORDERED)
455 endif (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
457 if (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
458 target_compile_definitions (stl_logging_unittest PRIVATE
459 GLOG_STL_LOGGING_FOR_TR1_UNORDERED)
460 endif (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
462 if (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
463 target_compile_definitions (stl_logging_unittest PRIVATE
464 GLOG_STL_LOGGING_FOR_EXT_HASH)
465 endif (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
468 target_compile_definitions (stl_logging_unittest PRIVATE
469 GLOG_STL_LOGGING_FOR_EXT_SLIST)
470 endif (HAVE_EXT_SLIST)
473 add_executable (symbolize_unittest
474 src/symbolize_unittest.cc
477 target_link_libraries (symbolize_unittest PRIVATE glog)
478 endif (HAVE_SYMBOLIZE)
480 add_executable (demangle_unittest
481 src/demangle_unittest.cc
484 target_link_libraries (demangle_unittest PRIVATE glog)
487 add_executable (stacktrace_unittest
488 src/stacktrace_unittest.cc
491 target_link_libraries (stacktrace_unittest PRIVATE glog)
492 endif (HAVE_STACKTRACE)
494 add_executable (utilities_unittest
495 src/utilities_unittest.cc
498 target_link_libraries (utilities_unittest PRIVATE glog)
500 if (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
501 add_executable (signalhandler_unittest
502 src/signalhandler_unittest.cc
505 target_link_libraries (signalhandler_unittest PRIVATE glog)
506 endif (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
508 add_test (NAME demangle COMMAND demangle_unittest)
509 add_test (NAME logging COMMAND logging_unittest)
511 if (TARGET signalhandler_unittest)
512 add_test (NAME signalhandler COMMAND signalhandler_unittest)
513 endif (TARGET signalhandler_unittest)
515 if (TARGET stacktrace_unittest)
516 add_test (NAME stacktrace COMMAND stacktrace_unittest)
517 endif (TARGET stacktrace_unittest)
519 add_test (NAME stl_logging COMMAND stl_logging_unittest)
521 if (TARGET symbolize_unittest)
522 add_test (NAME symbolize COMMAND symbolize_unittest)
523 endif (TARGET symbolize_unittest)
525 install (TARGETS glog
527 RUNTIME DESTINATION bin
528 PUBLIC_HEADER DESTINATION include/glog
529 LIBRARY DESTINATION lib
530 ARCHIVE DESTINATION lib)
534 set (glog_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
535 set (glog_PACKAGE_DEPS)
538 set (glog_PACKAGE_DEPS
540 include (CMakeFindDependencyMacro)
542 find_dependency (gflags ${gflags_VERSION})
546 configure_package_config_file (glog-config.cmake.in
547 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake INSTALL_DESTINATION
548 lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
549 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
551 # The version file is the same both for build tree and install mode config
552 write_basic_package_version_file (glog-config-version.cmake VERSION
553 ${GLOG_VERSION} COMPATIBILITY SameMajorVersion)
557 set (glog_INCLUDE_DIR include)
559 configure_package_config_file (glog-config.cmake.in
560 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
561 INSTALL_DESTINATION lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
562 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
564 export (TARGETS glog FILE glog-targets.cmake)
565 export (PACKAGE glog)
568 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
569 ${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake
570 DESTINATION lib/cmake/glog)
572 install (EXPORT glog-targets DESTINATION lib/cmake/glog)