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})
374 if (NOT BUILD_SHARED_LIBS)
375 # Don't use __declspec(dllexport|dllimport) if this is a static build
376 targeT_compile_definitions (glog PUBLIC GFLAGS_DLL_DECLARE_FLAG= GFLAGS_DLL_DEFINE_FLAG=)
377 endif (NOT BUILD_SHARED_LIBS)
380 set_target_properties (glog PROPERTIES VERSION ${GLOG_MAJOR_VERSION})
381 set_target_properties (glog PROPERTIES SOVERSION ${GLOG_VERSION})
384 target_compile_definitions (glog PUBLIC GLOG_NO_ABBREVIATED_SEVERITIES)
387 set_target_properties (glog PROPERTIES PUBLIC_HEADER "${GLOG_PUBLIC_H}")
389 target_include_directories (glog BEFORE PUBLIC
390 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
391 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
392 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
393 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
396 target_include_directories (glog PUBLIC
397 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/windows>"
398 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/windows)
401 set_target_properties (glog PROPERTIES DEFINE_SYMBOL LIBGLOG_EXPORTS)
403 if (NOT BUILD_SHARED_LIBS)
404 target_compile_definitions (glog PUBLIC GOOGLE_GLOG_DLL_DECL=)
405 else (NOT BUILD_SHARED_LIBS)
406 target_compile_definitions (glog PRIVATE GOOGLE_GLOG_IS_A_DLL=1)
408 if (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
409 set (_EXPORT "__attribute__((visibility(\"default\")))")
411 elseif (HAVE___DECLSPEC)
412 set (_EXPORT "__declspec(dllexport)")
413 set (_IMPORT "__declspec(dllimport)")
414 endif (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT)
416 target_compile_definitions (glog PRIVATE
417 "GOOGLE_GLOG_DLL_DECL=${_EXPORT}")
418 target_compile_definitions (glog INTERFACE
419 "GOOGLE_GLOG_DLL_DECL=${_IMPORT}")
420 target_compile_definitions (glog INTERFACE
421 "GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS=${_IMPORT}")
422 endif (NOT BUILD_SHARED_LIBS)
425 target_link_libraries (glog PUBLIC ${CMAKE_THREAD_LIBS_INIT})
427 target_compile_definitions (glog PUBLIC NO_THREADS)
431 set (HAVE_STACKTRACE 1)
432 endif (HAVE_EXECINFO_H)
434 if (UNIX OR (APPLE AND HAVE_DLADDR))
435 set (HAVE_SYMBOLIZE 1)
436 endif (UNIX OR (APPLE AND HAVE_DLADDR))
440 add_executable (logging_unittest
441 src/logging_unittest.cc
444 target_link_libraries (logging_unittest PRIVATE glog)
446 add_executable (stl_logging_unittest
447 src/stl_logging_unittest.cc
450 target_link_libraries (stl_logging_unittest PRIVATE glog)
452 if (HAVE_NO_DEPRECATED)
453 set_property (TARGET stl_logging_unittest APPEND PROPERTY COMPILE_OPTIONS
455 endif (HAVE_NO_DEPRECATED)
457 if (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
458 target_compile_definitions (stl_logging_unittest PRIVATE
459 GLOG_STL_LOGGING_FOR_UNORDERED)
460 endif (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET)
462 if (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
463 target_compile_definitions (stl_logging_unittest PRIVATE
464 GLOG_STL_LOGGING_FOR_TR1_UNORDERED)
465 endif (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET)
467 if (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
468 target_compile_definitions (stl_logging_unittest PRIVATE
469 GLOG_STL_LOGGING_FOR_EXT_HASH)
470 endif (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET)
473 target_compile_definitions (stl_logging_unittest PRIVATE
474 GLOG_STL_LOGGING_FOR_EXT_SLIST)
475 endif (HAVE_EXT_SLIST)
478 add_executable (symbolize_unittest
479 src/symbolize_unittest.cc
482 target_link_libraries (symbolize_unittest PRIVATE glog)
483 endif (HAVE_SYMBOLIZE)
485 add_executable (demangle_unittest
486 src/demangle_unittest.cc
489 target_link_libraries (demangle_unittest PRIVATE glog)
492 add_executable (stacktrace_unittest
493 src/stacktrace_unittest.cc
496 target_link_libraries (stacktrace_unittest PRIVATE glog)
497 endif (HAVE_STACKTRACE)
499 add_executable (utilities_unittest
500 src/utilities_unittest.cc
503 target_link_libraries (utilities_unittest PRIVATE glog)
505 if (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
506 add_executable (signalhandler_unittest
507 src/signalhandler_unittest.cc
510 target_link_libraries (signalhandler_unittest PRIVATE glog)
511 endif (HAVE_STACKTRACE AND HAVE_SYMBOLIZE)
513 add_test (NAME demangle COMMAND demangle_unittest)
514 add_test (NAME logging COMMAND logging_unittest)
516 if (TARGET signalhandler_unittest)
517 add_test (NAME signalhandler COMMAND signalhandler_unittest)
518 endif (TARGET signalhandler_unittest)
520 if (TARGET stacktrace_unittest)
521 add_test (NAME stacktrace COMMAND stacktrace_unittest)
522 endif (TARGET stacktrace_unittest)
524 add_test (NAME stl_logging COMMAND stl_logging_unittest)
526 if (TARGET symbolize_unittest)
527 add_test (NAME symbolize COMMAND symbolize_unittest)
528 endif (TARGET symbolize_unittest)
530 install (TARGETS glog
532 RUNTIME DESTINATION bin
533 PUBLIC_HEADER DESTINATION include/glog
534 LIBRARY DESTINATION lib
535 ARCHIVE DESTINATION lib)
539 set (glog_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
540 set (glog_PACKAGE_DEPS)
543 set (glog_PACKAGE_DEPS
545 include (CMakeFindDependencyMacro)
547 find_dependency (gflags ${gflags_VERSION})
551 configure_package_config_file (glog-config.cmake.in
552 ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake INSTALL_DESTINATION
553 lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
554 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
556 # The version file is the same both for build tree and install mode config
557 write_basic_package_version_file (glog-config-version.cmake VERSION
558 ${GLOG_VERSION} COMPATIBILITY SameMajorVersion)
562 set (glog_INCLUDE_DIR include)
564 configure_package_config_file (glog-config.cmake.in
565 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
566 INSTALL_DESTINATION lib/cmake/glog PATH_VARS glog_INCLUDE_DIR
567 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
569 export (TARGETS glog FILE glog-targets.cmake)
570 export (PACKAGE glog)
573 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/glog-config.cmake
574 ${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake
575 DESTINATION lib/cmake/glog)
577 install (EXPORT glog-targets DESTINATION lib/cmake/glog)