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 include (CMakePackageConfigHelpers)
29 include (CheckCSourceCompiles)
30 include (CheckCXXCompilerFlag)
31 include (CheckCXXSourceCompiles)
32 include (CheckFunctionExists)
33 include (CheckIncludeFile)
34 include (CheckIncludeFileCXX)
35 include (CheckLibraryExists)
36 include (CheckStructHasMember)
37 include (CheckSymbolExists)
38 include (CheckTypeSize)
40 set (CMAKE_THREAD_PREFER_PTHREAD 1)
46 set (HAVE_LIB_GFLAGS 1)
50 find_package (Threads)
52 check_include_file (dlfcn.h HAVE_DLFCN_H)
53 check_include_file (execinfo.h HAVE_EXECINFO_H)
54 check_include_file (glob.h HAVE_GLOB_H)
55 check_include_file (inttypes.h HAVE_INTTYPES_H)
56 check_include_file (libunwind.h HAVE_LIBUNWIND_H)
57 check_include_file (memory.h HAVE_MEMORY_H)
58 check_include_file (pwd.h HAVE_PWD_H)
59 check_include_file (stdint.h HAVE_STDINT_H)
60 check_include_file (stdlib.h HAVE_STDLIB_H)
61 check_include_file (string.h HAVE_STRING_H)
62 check_include_file (strings.h HAVE_STRINGS_H)
63 check_include_file (sys/stat.h HAVE_SYS_STAT_H)
64 check_include_file (sys/syscall.h HAVE_SYS_SYSCALL_H)
65 check_include_file (sys/time.h HAVE_SYS_TIME_H)
66 check_include_file (sys/types.h HAVE_SYS_TYPES_H)
67 check_include_file (sys/utsname.h HAVE_SYS_UTSNAME_H)
68 check_include_file (syscall.h HAVE_SYSCALL_H)
69 check_include_file (syslog.h HAVE_SYSLOG_H)
70 check_include_file (ucontext.h HAVE_UCONTEXT_H)
71 check_include_file (unistd.h HAVE_UNISTD_H)
72 check_include_file (unwind.h HAVE_UNWIND_H)
74 check_include_file_cxx ("ext/hash_map" HAVE_EXT_HASH_MAP)
75 check_include_file_cxx ("ext/hash_set" HAVE_EXT_HASH_SET)
76 check_include_file_cxx ("ext/slist" HAVE_EXT_SLIST)
77 check_include_file_cxx ("tr1/unordered_map" HAVE_TR1_UNORDERED_MAP)
78 check_include_file_cxx ("tr1/unordered_set" HAVE_TR1_UNORDERED_SET)
79 check_include_file_cxx ("unordered_map" HAVE_UNORDERED_MAP)
80 check_include_file_cxx ("unordered_set" HAVE_UNORDERED_SET)
82 check_type_size ("unsigned __int16" HAVE___UINT16)
83 check_type_size (u_int16_t HAVE_U_INT16_T)
84 check_type_size (uint16_t HAVE_UINT16_T)
86 check_function_exists (dladdr HAVE_DLADDR)
87 check_function_exists (fcntl HAVE_FCNTL)
88 check_function_exists (pread HAVE_PREAD)
89 check_function_exists (pwrite HAVE_PWRITE)
90 check_function_exists (sigaction HAVE_SIGACTION)
91 check_function_exists (sigaltstack HAVE_SIGALSTACK)
93 check_cxx_compiler_flag (-Wno-deprecated HAVE_NO_DEPRECATED)
95 # NOTE: Cannot use check_function_exists here since >=vc-14.0 can define
96 # snprintf as an inline function
97 check_symbol_exists (snprintf stdio.h HAVE_SNPRINTF)
99 check_library_exists (unwind get_static_proc_name "" HAVE_LIB_UNWIND)
101 check_c_source_compiles ("
103 static void foo(void) __attribute__ ((unused));
104 int main(void) { return 0; }
105 " HAVE___ATTRIBUTE__)
107 check_c_source_compiles ("
109 static void foo(void) __attribute__ ((visibility(\"default\")));
110 int main(void) { return 0; }
111 " HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
113 check_c_source_compiles ("
115 static void foo(void) __attribute__ ((visibility(\"hidden\")));
116 int main(void) { return 0; }
117 " HAVE___ATTRIBUTE__VISIBILITY_HIDDEN)
119 check_c_source_compiles ("
120 int main(void) { if (__builtin_expect(0, 0)) return 1; return 0; }
121 " HAVE___BUILTIN_EXPECT)
123 check_c_source_compiles ("
126 int a; if (__sync_val_compare_and_swap(&a, 0, 1)) return 1; return 0;
128 " HAVE___SYNC_VAL_COMPARE_AND_SWAP)
130 check_c_source_compiles ("
131 #define _XOPEN_SOURCE 500
136 pthread_rwlock_init(&l, NULL);
137 pthread_rwlock_rdlock(&l);
142 check_c_source_compiles ("
143 __declspec(selectany) int a;
144 int main(void) { return 0; }
147 check_cxx_source_compiles ("
149 vector<int> t; int main() { }
152 check_cxx_source_compiles ("
154 std::vector<int> t; int main() { }
157 check_cxx_source_compiles ("
159 std::ostream& operator<<(std::ostream&, struct s);
162 " HAVE_USING_OPERATOR)
164 check_cxx_source_compiles ("
165 namespace Outer { namespace Inner { int i = 0; }}
166 using namespace Outer::Inner;;
167 int main() { return i; }
175 "uc_regs->gregs[PT_NIP]"
190 set (_PC_HEADERS ucontext.h signal.h)
192 if (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
193 foreach (_PC_FIELD ${_PC_FIELDS})
194 foreach (_PC_HEADER ${_PC_HEADERS})
196 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/uctfield.c)
197 file (WRITE ${_TMP} "
198 #define _GNU_SOURCE 1
199 #include <${_PC_HEADER}>
203 return u.${_PC_FIELD} == 0;
206 try_compile (HAVE_PC_FROM_UCONTEXT ${CMAKE_CURRENT_BINARY_DIR} ${_TMP}
207 COMPILE_DEFINITIONS _GNU_SOURCE=1)
209 if (HAVE_PC_FROM_UCONTEXT)
210 set (PC_FROM_UCONTEXT ${_PC_FIELD} CACHE)
211 endif (HAVE_PC_FROM_UCONTEXT)
212 endforeach (_PC_HEADER)
213 endforeach (_PC_FIELD)
214 endif (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
216 if (STL_STD_NAMESPACE)
217 set (STL_NAMESPACE std)
218 else (STL_STD_NAMESPACE)
219 set (STL_NAMESPACE "")
220 endif (STL_STD_NAMESPACE)
222 set (GOOGLE_NAMESPACE google)
223 set (_START_GOOGLE_NAMESPACE_ "namespace ${GOOGLE_NAMESPACE} {")
224 set (_END_GOOGLE_NAMESPACE_ "}")
227 set (ac_cv_have___uint16 1)
229 set (ac_cv_have___uint16 0)
230 endif (HAVE___UINT16)
233 set (ac_cv_have_inttypes_h 1)
234 else (HAVE_INTTYPES_H)
235 set (ac_cv_have_inttypes_h 0)
236 endif (HAVE_INTTYPES_H)
239 set (ac_cv_have_libgflags 1)
240 else (HAVE_LIB_GFLAGS)
241 set (ac_cv_have_libgflags 0)
242 endif (HAVE_LIB_GFLAGS)
245 set (ac_cv_have_stdint_h 1)
247 set (ac_cv_have_stdint_h 0)
248 endif (HAVE_STDINT_H)
250 if (HAVE_SYS_TYPES_H)
251 set (ac_cv_have_systypes_h 1)
252 else (HAVE_SYS_TYPES_H)
253 set (ac_cv_have_systypes_h 0)
254 endif (HAVE_SYS_TYPES_H)
257 set (ac_cv_have_u_int16_t 1)
258 else (HAVE_U_INT16_T)
259 set (ac_cv_have_u_int16_t 0)
260 endif (HAVE_U_INT16_T)
263 set (ac_cv_have_uint16_t 1)
265 set (ac_cv_have_uint16_t 0)
266 endif (HAVE_UINT16_T)
269 set (ac_cv_have_unistd_h 1)
271 set (ac_cv_have_unistd_h 0)
272 endif (HAVE_UNISTD_H)
274 set (ac_google_namespace ${GOOGLE_NAMESPACE})
275 set (ac_google_end_namespace ${_END_GOOGLE_NAMESPACE_})
276 set (ac_google_start_namespace ${_START_GOOGLE_NAMESPACE_})
278 if (HAVE___ATTRIBUTE__)
279 set (ac_cv___attribute___noreturn "__attribute__((noreturn))")
280 set (ac_cv___attribute___noinline "__attribute__((noinline))")
281 elseif (HAVE___DECLSPEC)
282 set (ac_cv___attribute___noreturn "__declspec(noreturn)")
283 #set (ac_cv___attribute___noinline "__declspec(noinline)")
284 endif (HAVE___ATTRIBUTE__)
286 if (HAVE___BUILTIN_EXPECT)
287 set (ac_cv_have___builtin_expect 1)
288 else (HAVE___BUILTIN_EXPECT)
289 set (ac_cv_have___builtin_expect 0)
290 endif (HAVE___BUILTIN_EXPECT)
292 if (HAVE_USING_OPERATOR)
293 set (ac_cv_cxx_using_operator 1)
294 else (HAVE_USING_OPERATOR)
295 set (ac_cv_cxx_using_operator 0)
296 endif (HAVE_USING_OPERATOR)
298 set (SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
300 if (Threads_FOUND AND CMAKE_USE_PTHREADS_INIT)
302 endif (Threads_FOUND AND CMAKE_USE_PTHREADS_INIT)
304 set (TEST_SRC_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\")
306 configure_file (src/config.h.cmake.in config.h)
307 configure_file (src/glog/logging.h.in glog/logging.h @ONLY)
308 configure_file (src/glog/raw_logging.h.in glog/raw_logging.h @ONLY)
309 configure_file (src/glog/stl_logging.h.in glog/stl_logging.h @ONLY)
310 configure_file (src/glog/vlog_is_on.h.in glog/vlog_is_on.h @ONLY)
312 set (CMAKE_CXX_VISIBILITY_PRESET default)
313 set (CMAKE_VISIBILITY_INLINES_HIDDEN 1)
316 ${CMAKE_CURRENT_BINARY_DIR}/config.h
317 ${CMAKE_CURRENT_BINARY_DIR}/glog/logging.h
318 ${CMAKE_CURRENT_BINARY_DIR}/glog/raw_logging.h
319 ${CMAKE_CURRENT_BINARY_DIR}/glog/stl_logging.h
320 ${CMAKE_CURRENT_BINARY_DIR}/glog/vlog_is_on.h
321 src/glog/log_severity.h
326 src/base/commandlineflags.h
327 src/base/googleinit.h
341 list (APPEND GLOG_SRCS src/signalhandler.cc)
345 list (APPEND GLOG_SRCS
355 if (WIN32 AND HAVE_SNPRINTF)
356 set_property (SOURCE src/windows/port.cc APPEND PROPERTY COMPILE_DEFINITIONS
358 endif (WIN32 AND HAVE_SNPRINTF)
361 target_include_directories (glog PUBLIC ${gflags_INCLUDE_DIR})
362 target_link_libraries (glog PUBLIC ${gflags_LIBRARIES})
365 set_target_properties (glog PROPERTIES VERSION ${GLOG_MAJOR_VERSION})
366 set_target_properties (glog PROPERTIES SOVERSION ${GLOG_VERSION})
369 target_compile_definitions (glog PUBLIC GLOG_NO_ABBREVIATED_SEVERITIES)
372 set_target_properties (glog PROPERTIES PUBLIC_HEADER "${GLOG_PUBLIC_H}")
374 target_include_directories (glog BEFORE PUBLIC
375 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
376 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
377 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
378 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
381 target_include_directories (glog PUBLIC
382 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/windows>"
383 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/windows)
386 set_target_properties (glog PROPERTIES DEFINE_SYMBOL LIBGLOG_EXPORTS)
388 if (NOT BUILD_SHARED_LIBS)
389 target_compile_definitions (glog PUBLIC GOOGLE_GLOG_DLL_DECL=)
390 else (NOT BUILD_SHARED_LIBS)
391 target_compile_definitions (glog PRIVATE GOOGLE_GLOG_IS_A_DLL=1)
393 if (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
394 set (_EXPORT "__attribute__((visibility(\"default\")))")
396 elseif (HAVE___DECLSPEC)
397 set (_EXPORT "__declspec(dllexport)")
398 set (_IMPORT "__declspec(dllimport)")
399 endif (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
401 target_compile_definitions (glog PRIVATE
402 "GOOGLE_GLOG_DLL_DECL=${_EXPORT}")
403 target_compile_definitions (glog INTERFACE
404 "GOOGLE_GLOG_DLL_DECL=${_IMPORT}")
405 target_compile_definitions (glog INTERFACE
406 "GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS=${_IMPORT}")
407 endif (NOT BUILD_SHARED_LIBS)
410 target_link_libraries (glog PUBLIC ${CMAKE_THREAD_LIBS_INIT})
412 target_compile_definitions (glog PUBLIC NO_THREADS)
416 set (HAVE_STACKTRACE 1)
417 endif (HAVE_EXECINFO_H)
419 if (UNIX OR (APPLE AND HAVE_DLADDR))
420 set (HAVE_SYMBOLIZE 1)
421 endif (UNIX OR (APPLE AND HAVE_DLADDR))
425 add_executable (logging_unittest
426 src/logging_unittest.cc
429 target_link_libraries (logging_unittest PRIVATE glog)
431 add_executable (stl_logging_unittest
432 src/stl_logging_unittest.cc
435 target_link_libraries (stl_logging_unittest PRIVATE glog)
437 if (HAVE_NO_DEPRECATED)
438 set_property (TARGET stl_logging_unittest APPEND PROPERTY COMPILE_OPTIONS
440 endif (HAVE_NO_DEPRECATED)
442 if (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
443 target_compile_definitions (stl_logging_unittest PRIVATE
444 GLOG_STL_LOGGING_FOR_UNORDERED)
445 endif (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
447 if (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
448 target_compile_definitions (stl_logging_unittest PRIVATE
449 GLOG_STL_LOGGING_FOR_TR1_UNORDERED)
450 endif (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
452 if (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
453 target_compile_definitions (stl_logging_unittest PRIVATE
454 GLOG_STL_LOGGING_FOR_EXT_HASH)
455 endif (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
458 target_compile_definitions (stl_logging_unittest PRIVATE
459 GLOG_STL_LOGGING_FOR_EXT_SLIST)
460 endif (HAVE_EXT_SLIST)
463 add_executable (symbolize_unittest
464 src/symbolize_unittest.cc
467 target_link_libraries (symbolize_unittest PRIVATE glog)
468 endif (HAVE_SYMBOLIZE)
470 add_executable (demangle_unittest
471 src/demangle_unittest.cc
474 target_link_libraries (demangle_unittest PRIVATE glog)
477 add_executable (stacktrace_unittest
478 src/stacktrace_unittest.cc
481 target_link_libraries (stacktrace_unittest PRIVATE glog)
482 endif (HAVE_STACKTRACE)
484 add_executable (utilities_unittest
485 src/utilities_unittest.cc
488 target_link_libraries (utilities_unittest PRIVATE glog)
490 if (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
491 add_executable (signalhandler_unittest
492 src/signalhandler_unittest.cc
495 target_link_libraries (signalhandler_unittest PRIVATE glog)
496 endif (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
498 add_test (NAME demangle COMMAND demangle_unittest)
499 add_test (NAME logging COMMAND logging_unittest)
501 if (TARGET signalhandler_unittest)
502 add_test (NAME signalhandler COMMAND signalhandler_unittest)
503 endif (TARGET signalhandler_unittest)
505 if (TARGET stacktrace_unittest)
506 add_test (NAME stacktrace COMMAND stacktrace_unittest)
507 endif (TARGET stacktrace_unittest)
509 add_test (NAME stl_logging COMMAND stl_logging_unittest)
511 if (TARGET symbolize_unittest)
512 add_test (NAME symbolize COMMAND symbolize_unittest)
513 endif (TARGET symbolize_unittest)
515 install (TARGETS glog
517 RUNTIME DESTINATION bin
518 PUBLIC_HEADER DESTINATION include/glog
519 LIBRARY DESTINATION lib
520 ARCHIVE DESTINATION lib)
524 set (glog_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
525 set (glog_PACKAGE_DEPS)
528 set (glog_PACKAGE_DEPS
530 include (CMakeFindDependencyMacro)
532 find_dependency (gflags ${gflags_VERSION})
536 configure_package_config_file (glog-config.cmake.in
537 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake INSTALL_DESTINATION
538 lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
539 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
541 # The version file is the same both for build tree and install mode config
542 write_basic_package_version_file (glog-config-version.cmake VERSION
543 ${GLOG_VERSION} COMPATIBILITY SameMajorVersion)
547 set (glog_INCLUDE_DIR include)
549 configure_package_config_file (glog-config.cmake.in
550 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
551 INSTALL_DESTINATION lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
552 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
554 export (TARGETS glog FILE glog-targets.cmake)
555 export (PACKAGE glog)
558 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
559 ${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake
560 DESTINATION lib/cmake/glog)
562 install (EXPORT glog-targets DESTINATION lib/cmake/glog)