cmake_minimum_required (VERSION 3.0) if (POLICY CMP0042) cmake_policy (SET CMP0042 NEW) endif (POLICY CMP0042) if (POLICY CMP0063) cmake_policy (SET CMP0063 NEW) endif (POLICY CMP0063) project (google-glog) enable_testing () set (GLOG_MAJOR_VERSION 0) set (GLOG_MINOR_VERSION 3) set (GLOG_PATCH_VERSION 5) set (GLOG_VERSION ${GLOG_MAJOR_VERSION}.${GLOG_MINOR_VERSION}.${GLOG_PATCH_VERSION}) set (CPACK_PACKAGE_NAME glog) set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "") set (CPACK_PACKAGE_VERSION_MAJOR ${GLOG_MAJOR_VERSION}) set (CPACK_PACKAGE_VERSION_MINOR ${GLOG_MINOR_VERSION}) set (CPACK_PACKAGE_VERSION_PATCH ${GLOG_PATCH_VERSION}) set (CPACK_PACKAGE_VERSION ${GLOG_VERSION}) option (WITH_GFLAGS "Use gflags" ON) option (WITH_THREADS "Enable multithreading support" ON) list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) include (CheckCSourceCompiles) include (CheckCXXCompilerFlag) include (CheckCXXSourceCompiles) include (CheckFunctionExists) include (CheckIncludeFile) include (CheckIncludeFileCXX) include (CheckLibraryExists) include (CheckStructHasMember) include (CheckSymbolExists) include (CheckTypeSize) include (CMakePackageConfigHelpers) include (CPack) include (CTest) include (DetermineGflagsNamespace) set (CMAKE_THREAD_PREFER_PTHREAD 1) if (WITH_GFLAGS) find_package (gflags) if (gflags_FOUND) set (HAVE_LIB_GFLAGS 1) determine_gflags_namespace (gflags_NAMESPACE) endif (gflags_FOUND) endif (WITH_GFLAGS) if (WITH_THREADS) find_package (Threads) endif (WITH_THREADS) check_include_file (dlfcn.h HAVE_DLFCN_H) check_include_file (execinfo.h HAVE_EXECINFO_H) check_include_file (glob.h HAVE_GLOB_H) check_include_file (inttypes.h HAVE_INTTYPES_H) check_include_file (libunwind.h HAVE_LIBUNWIND_H) check_include_file (memory.h HAVE_MEMORY_H) check_include_file (pwd.h HAVE_PWD_H) check_include_file (stdint.h HAVE_STDINT_H) check_include_file (stdlib.h HAVE_STDLIB_H) check_include_file (string.h HAVE_STRING_H) check_include_file (strings.h HAVE_STRINGS_H) check_include_file (sys/stat.h HAVE_SYS_STAT_H) check_include_file (sys/syscall.h HAVE_SYS_SYSCALL_H) check_include_file (sys/time.h HAVE_SYS_TIME_H) check_include_file (sys/types.h HAVE_SYS_TYPES_H) check_include_file (sys/utsname.h HAVE_SYS_UTSNAME_H) check_include_file (syscall.h HAVE_SYSCALL_H) check_include_file (syslog.h HAVE_SYSLOG_H) check_include_file (ucontext.h HAVE_UCONTEXT_H) check_include_file (unistd.h HAVE_UNISTD_H) check_include_file (unwind.h HAVE_UNWIND_H) check_include_file_cxx ("ext/hash_map" HAVE_EXT_HASH_MAP) check_include_file_cxx ("ext/hash_set" HAVE_EXT_HASH_SET) check_include_file_cxx ("ext/slist" HAVE_EXT_SLIST) check_include_file_cxx ("tr1/unordered_map" HAVE_TR1_UNORDERED_MAP) check_include_file_cxx ("tr1/unordered_set" HAVE_TR1_UNORDERED_SET) check_include_file_cxx ("unordered_map" HAVE_UNORDERED_MAP) check_include_file_cxx ("unordered_set" HAVE_UNORDERED_SET) check_type_size ("unsigned __int16" HAVE___UINT16) check_type_size (u_int16_t HAVE_U_INT16_T) check_type_size (uint16_t HAVE_UINT16_T) check_function_exists (dladdr HAVE_DLADDR) check_function_exists (fcntl HAVE_FCNTL) check_function_exists (pread HAVE_PREAD) check_function_exists (pwrite HAVE_PWRITE) check_function_exists (sigaction HAVE_SIGACTION) check_function_exists (sigaltstack HAVE_SIGALSTACK) # NOTE gcc does not fail if you pass a non-existent -Wno-* option as an # argument. However, it will happily fail if you pass the corresponding -W* # option. So, we check whether options that disable warnings exist by testing # the availability of the corresponding option that enables the warning. This # eliminates the need to check for compiler for several (mainly Clang) options. check_cxx_compiler_flag (-Wdeprecated HAVE_NO_DEPRECATED) check_cxx_compiler_flag (-Wunnamed-type-template-args HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS) # NOTE: Cannot use check_function_exists here since >=vc-14.0 can define # snprintf as an inline function check_symbol_exists (snprintf stdio.h HAVE_SNPRINTF) check_library_exists (unwind get_static_proc_name "" HAVE_LIB_UNWIND) find_library (UNWIND_LIBRARY NAMES unwind DOC "unwind library") mark_as_advanced (UNWIND_LIBRARY) check_c_source_compiles (" #include static void foo(void) __attribute__ ((unused)); int main(void) { return 0; } " HAVE___ATTRIBUTE__) check_c_source_compiles (" #include static void foo(void) __attribute__ ((visibility(\"default\"))); int main(void) { return 0; } " HAVE___ATTRIBUTE__VISIBILITY_DEFAULT) check_c_source_compiles (" #include static void foo(void) __attribute__ ((visibility(\"hidden\"))); int main(void) { return 0; } " HAVE___ATTRIBUTE__VISIBILITY_HIDDEN) check_c_source_compiles (" int main(void) { if (__builtin_expect(0, 0)) return 1; return 0; } " HAVE___BUILTIN_EXPECT) check_c_source_compiles (" int main(void) { int a; if (__sync_val_compare_and_swap(&a, 0, 1)) return 1; return 0; } " HAVE___SYNC_VAL_COMPARE_AND_SWAP) check_c_source_compiles (" #define _XOPEN_SOURCE 500 #include int main(void) { pthread_rwlock_t l; pthread_rwlock_init(&l, NULL); pthread_rwlock_rdlock(&l); return 0; } " HAVE_RWLOCK) check_c_source_compiles (" __declspec(selectany) int a; int main(void) { return 0; } " HAVE___DECLSPEC) check_cxx_source_compiles (" #include vector t; int main() { } " STL_NO_NAMESPACE) check_cxx_source_compiles (" #include std::vector t; int main() { } " STL_STD_NAMESPACE) check_cxx_source_compiles (" #include std::ostream& operator<<(std::ostream&, struct s); using ::operator<<; int main() { } " HAVE_USING_OPERATOR) check_cxx_source_compiles (" namespace Outer { namespace Inner { int i = 0; }} using namespace Outer::Inner;; int main() { return i; } " HAVE_NAMESPACES) set (_PC_FIELDS "gregs[REG_PC]" "gregs[REG_EIP]" "gregs[REG_RIP]" "sc_ip" "uc_regs->gregs[PT_NIP]" "gregs[R15]" "arm_pc" "mc_eip" "mc_rip" "__gregs[REG_EIP]" "__gregs[REG_RIP]" "ss.eip" "__ss.__eip" "ss.rip" "__ss.__rip" "ss.srr0" "__ss.__srr0" ) set (_PC_HEADERS ucontext.h signal.h) if (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT) foreach (_PC_FIELD ${_PC_FIELDS}) foreach (_PC_HEADER ${_PC_HEADERS}) set (_TMP ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/uctfield.c) file (WRITE ${_TMP} " #define _GNU_SOURCE 1 #include <${_PC_HEADER}> int main(void) { ucontext_t u; return u.${_PC_FIELD} == 0; } ") try_compile (HAVE_PC_FROM_UCONTEXT ${CMAKE_CURRENT_BINARY_DIR} ${_TMP} COMPILE_DEFINITIONS _GNU_SOURCE=1) if (HAVE_PC_FROM_UCONTEXT) set (PC_FROM_UCONTEXT ${_PC_FIELD} CACHE) endif (HAVE_PC_FROM_UCONTEXT) endforeach (_PC_HEADER) endforeach (_PC_FIELD) endif (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT) if (STL_STD_NAMESPACE) set (STL_NAMESPACE std) else (STL_STD_NAMESPACE) set (STL_NAMESPACE "") endif (STL_STD_NAMESPACE) set (GOOGLE_NAMESPACE google) set (_START_GOOGLE_NAMESPACE_ "namespace ${GOOGLE_NAMESPACE} {") set (_END_GOOGLE_NAMESPACE_ "}") if (HAVE___UINT16) set (ac_cv_have___uint16 1) else (HAVE___UINT16) set (ac_cv_have___uint16 0) endif (HAVE___UINT16) if (HAVE_INTTYPES_H) set (ac_cv_have_inttypes_h 1) else (HAVE_INTTYPES_H) set (ac_cv_have_inttypes_h 0) endif (HAVE_INTTYPES_H) if (HAVE_LIB_GFLAGS) set (ac_cv_have_libgflags 1) else (HAVE_LIB_GFLAGS) set (ac_cv_have_libgflags 0) endif (HAVE_LIB_GFLAGS) if (HAVE_STDINT_H) set (ac_cv_have_stdint_h 1) else (HAVE_STDINT_H) set (ac_cv_have_stdint_h 0) endif (HAVE_STDINT_H) if (HAVE_SYS_TYPES_H) set (ac_cv_have_systypes_h 1) else (HAVE_SYS_TYPES_H) set (ac_cv_have_systypes_h 0) endif (HAVE_SYS_TYPES_H) if (HAVE_U_INT16_T) set (ac_cv_have_u_int16_t 1) else (HAVE_U_INT16_T) set (ac_cv_have_u_int16_t 0) endif (HAVE_U_INT16_T) if (HAVE_UINT16_T) set (ac_cv_have_uint16_t 1) else (HAVE_UINT16_T) set (ac_cv_have_uint16_t 0) endif (HAVE_UINT16_T) if (HAVE_UNISTD_H) set (ac_cv_have_unistd_h 1) else (HAVE_UNISTD_H) set (ac_cv_have_unistd_h 0) endif (HAVE_UNISTD_H) set (ac_google_namespace ${GOOGLE_NAMESPACE}) set (ac_google_end_namespace ${_END_GOOGLE_NAMESPACE_}) set (ac_google_start_namespace ${_START_GOOGLE_NAMESPACE_}) if (HAVE___ATTRIBUTE__) set (ac_cv___attribute___noreturn "__attribute__((noreturn))") set (ac_cv___attribute___noinline "__attribute__((noinline))") elseif (HAVE___DECLSPEC) set (ac_cv___attribute___noreturn "__declspec(noreturn)") #set (ac_cv___attribute___noinline "__declspec(noinline)") endif (HAVE___ATTRIBUTE__) if (HAVE___BUILTIN_EXPECT) set (ac_cv_have___builtin_expect 1) else (HAVE___BUILTIN_EXPECT) set (ac_cv_have___builtin_expect 0) endif (HAVE___BUILTIN_EXPECT) if (HAVE_USING_OPERATOR) set (ac_cv_cxx_using_operator 1) else (HAVE_USING_OPERATOR) set (ac_cv_cxx_using_operator 0) endif (HAVE_USING_OPERATOR) set (SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P}) if (WITH_THREADS AND Threads_FOUND) if (CMAKE_USE_PTHREADS_INIT) set (HAVE_PTHREAD 1) endif (CMAKE_USE_PTHREADS_INIT) else (WITH_THREADS AND Threads_FOUND) set (NO_THREADS 1) endif (WITH_THREADS AND Threads_FOUND) set (TEST_SRC_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\") configure_file (src/config.h.cmake.in config.h) configure_file (src/glog/logging.h.in glog/logging.h @ONLY) configure_file (src/glog/raw_logging.h.in glog/raw_logging.h @ONLY) configure_file (src/glog/stl_logging.h.in glog/stl_logging.h @ONLY) configure_file (src/glog/vlog_is_on.h.in glog/vlog_is_on.h @ONLY) set (CMAKE_CXX_VISIBILITY_PRESET default) set (CMAKE_VISIBILITY_INLINES_HIDDEN 1) set (GLOG_PUBLIC_H ${CMAKE_CURRENT_BINARY_DIR}/config.h ${CMAKE_CURRENT_BINARY_DIR}/glog/logging.h ${CMAKE_CURRENT_BINARY_DIR}/glog/raw_logging.h ${CMAKE_CURRENT_BINARY_DIR}/glog/stl_logging.h ${CMAKE_CURRENT_BINARY_DIR}/glog/vlog_is_on.h src/glog/log_severity.h ) set (GLOG_SRCS ${GLOG_PUBLIC_H} src/base/commandlineflags.h src/base/googleinit.h src/base/mutex.h src/demangle.cc src/demangle.h src/logging.cc src/raw_logging.cc src/symbolize.cc src/symbolize.h src/utilities.cc src/utilities.h src/vlog_is_on.cc ) if (HAVE_PTHREAD) list (APPEND GLOG_SRCS src/signalhandler.cc) endif (HAVE_PTHREAD) if (WIN32) list (APPEND GLOG_SRCS src/windows/port.cc src/windows/port.h ) endif (WIN32) add_compile_options ($<$:-Wno-unnamed-type-template-args>) add_library (glog ${GLOG_SRCS} ) set_target_properties (glog PROPERTIES POSITION_INDEPENDENT_CODE ON) if (UNWIND_LIBRARY) target_link_libraries (glog PUBLIC ${UNWIND_LIBRARY}) endif (UNWIND_LIBRARY) if (HAVE_PTHREAD) target_link_libraries (glog PUBLIC ${CMAKE_THREAD_LIBS_INIT}) endif (HAVE_PTHREAD) if (WIN32 AND HAVE_SNPRINTF) set_property (SOURCE src/windows/port.cc APPEND PROPERTY COMPILE_DEFINITIONS HAVE_SNPRINTF) endif (WIN32 AND HAVE_SNPRINTF) if (gflags_FOUND) target_include_directories (glog PUBLIC $) target_link_libraries (glog PUBLIC ${gflags_LIBRARIES}) if (NOT BUILD_SHARED_LIBS) # Don't use __declspec(dllexport|dllimport) if this is a static build targeT_compile_definitions (glog PUBLIC GFLAGS_DLL_DECLARE_FLAG= GFLAGS_DLL_DEFINE_FLAG=) endif (NOT BUILD_SHARED_LIBS) endif (gflags_FOUND) set_target_properties (glog PROPERTIES VERSION ${GLOG_MAJOR_VERSION}) set_target_properties (glog PROPERTIES SOVERSION ${GLOG_VERSION}) if (WIN32) target_compile_definitions (glog PUBLIC GLOG_NO_ABBREVIATED_SEVERITIES) endif (WIN32) set_target_properties (glog PROPERTIES PUBLIC_HEADER "${GLOG_PUBLIC_H}") target_include_directories (glog BEFORE PUBLIC "$" "$" "$" PRIVATE ${CMAKE_CURRENT_BINARY_DIR} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src) if (WIN32) target_include_directories (glog PUBLIC "$" PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/windows) endif (WIN32) set_target_properties (glog PROPERTIES DEFINE_SYMBOL LIBGLOG_EXPORTS) if (NOT BUILD_SHARED_LIBS) target_compile_definitions (glog PUBLIC GOOGLE_GLOG_DLL_DECL=) else (NOT BUILD_SHARED_LIBS) target_compile_definitions (glog PRIVATE GOOGLE_GLOG_IS_A_DLL=1) if (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT) set (_EXPORT "__attribute__((visibility(\"default\")))") set (_IMPORT "") elseif (HAVE___DECLSPEC) set (_EXPORT "__declspec(dllexport)") set (_IMPORT "__declspec(dllimport)") endif (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT) target_compile_definitions (glog PRIVATE "GOOGLE_GLOG_DLL_DECL=${_EXPORT}") target_compile_definitions (glog INTERFACE "GOOGLE_GLOG_DLL_DECL=${_IMPORT}") target_compile_definitions (glog INTERFACE "GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS=${_IMPORT}") endif (NOT BUILD_SHARED_LIBS) if (HAVE_EXECINFO_H) set (HAVE_STACKTRACE 1) endif (HAVE_EXECINFO_H) if (UNIX OR (APPLE AND HAVE_DLADDR)) set (HAVE_SYMBOLIZE 1) endif (UNIX OR (APPLE AND HAVE_DLADDR)) # Unit testing if (BUILD_TESTING) add_executable (logging_unittest src/logging_unittest.cc ) target_link_libraries (logging_unittest PRIVATE glog) add_executable (stl_logging_unittest src/stl_logging_unittest.cc ) target_link_libraries (stl_logging_unittest PRIVATE glog) if (HAVE_NO_DEPRECATED) set_property (TARGET stl_logging_unittest APPEND PROPERTY COMPILE_OPTIONS -Wno-deprecated) endif (HAVE_NO_DEPRECATED) if (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET) target_compile_definitions (stl_logging_unittest PRIVATE GLOG_STL_LOGGING_FOR_UNORDERED) endif (HAVE_UNORDERED_MAP AND HAVE_UNORDERED_SET) if (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET) target_compile_definitions (stl_logging_unittest PRIVATE GLOG_STL_LOGGING_FOR_TR1_UNORDERED) endif (HAVE_TR1_UNORDERED_MAP AND HAVE_TR1_UNORDERED_SET) if (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET) target_compile_definitions (stl_logging_unittest PRIVATE GLOG_STL_LOGGING_FOR_EXT_HASH) endif (HAVE_EXT_HASH_MAP AND HAVE_EXT_HASH_SET) if (HAVE_EXT_SLIST) target_compile_definitions (stl_logging_unittest PRIVATE GLOG_STL_LOGGING_FOR_EXT_SLIST) endif (HAVE_EXT_SLIST) if (HAVE_SYMBOLIZE) add_executable (symbolize_unittest src/symbolize_unittest.cc ) target_link_libraries (symbolize_unittest PRIVATE glog) endif (HAVE_SYMBOLIZE) add_executable (demangle_unittest src/demangle_unittest.cc ) target_link_libraries (demangle_unittest PRIVATE glog) if (HAVE_STACKTRACE) add_executable (stacktrace_unittest src/stacktrace_unittest.cc ) target_link_libraries (stacktrace_unittest PRIVATE glog) endif (HAVE_STACKTRACE) add_executable (utilities_unittest src/utilities_unittest.cc ) target_link_libraries (utilities_unittest PRIVATE glog) if (HAVE_STACKTRACE AND HAVE_SYMBOLIZE) add_executable (signalhandler_unittest src/signalhandler_unittest.cc ) target_link_libraries (signalhandler_unittest PRIVATE glog) endif (HAVE_STACKTRACE AND HAVE_SYMBOLIZE) add_test (NAME demangle COMMAND demangle_unittest) add_test (NAME logging COMMAND logging_unittest) if (TARGET signalhandler_unittest) add_test (NAME signalhandler COMMAND signalhandler_unittest) endif (TARGET signalhandler_unittest) if (TARGET stacktrace_unittest) add_test (NAME stacktrace COMMAND stacktrace_unittest) endif (TARGET stacktrace_unittest) add_test (NAME stl_logging COMMAND stl_logging_unittest) if (TARGET symbolize_unittest) add_test (NAME symbolize COMMAND symbolize_unittest) endif (TARGET symbolize_unittest) endif (BUILD_TESTING) install (TARGETS glog EXPORT glog-targets RUNTIME DESTINATION bin PUBLIC_HEADER DESTINATION include/glog LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) if (gflags_FOUND) set (gflags_DEPENDENCY "find_dependency (gflags ${gflags_VERSION})") endif (gflags_FOUND) configure_package_config_file (glog-config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake INSTALL_DESTINATION lib/cmake/glog NO_CHECK_REQUIRED_COMPONENTS_MACRO) write_basic_package_version_file (glog-config-version.cmake VERSION ${GLOG_VERSION} COMPATIBILITY SameMajorVersion) export (TARGETS glog NAMESPACE glog:: FILE glog-targets.cmake) export (PACKAGE glog) install (FILES ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake ${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake DESTINATION lib/cmake/glog) install (EXPORT glog-targets NAMESPACE glog:: DESTINATION lib/cmake/glog)