diff options
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 848 |
1 files changed, 848 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000000..79b4d9ed61c9 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,848 @@ +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(glog VERSION 0.4.0 LANGUAGES C CXX) + +set (CPACK_PACKAGE_NAME glog) +set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "") +set (CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) +set (CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) +set (CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH}) +set (CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) + +option (WITH_GFLAGS "Use gflags" ON) +option (WITH_THREADS "Enable multithreading support" ON) +option (WITH_TLS "Enable Thread Local Storage (TLS) support" ON) +option (BUILD_SHARED_LIBS "Build shared libraries" OFF) +option (PRINT_UNSYMBOLIZED_STACK_TRACES + "Print file offsets in traces instead of symbolizing" OFF) +option (WITH_PKGCONFIG "Enable pkg-config support" ON) +option (WITH_UNWIND "Enable libunwind support" ON) +option (WITH_SYMBOLIZE "Enable symbolize module" ON) + +if (NOT WITH_UNWIND) + set (CMAKE_DISABLE_FIND_PACKAGE_Unwind ON) +endif (NOT WITH_UNWIND) + +if (NOT WITH_THREADS) + set (CMAKE_DISABLE_FIND_PACKAGE_Threads ON) +endif (NOT WITH_THREADS) + +list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) + +include (CheckCSourceCompiles) +include (CheckCXXCompilerFlag) +include (CheckCXXSourceCompiles) +include (CheckCXXSourceRuns) +include (CheckFunctionExists) +include (CheckIncludeFile) +include (CheckIncludeFileCXX) +include (CheckLibraryExists) +include (CheckStructHasMember) +include (CheckSymbolExists) +include (CheckTypeSize) +include (CMakePackageConfigHelpers) +include (CMakePushCheckState) +include (CPack) +include (CTest) +include (DetermineGflagsNamespace) +include (GetCacheVariables) +include (GNUInstallDirs) + +set (CMAKE_DEBUG_POSTFIX d) +set (CMAKE_THREAD_PREFER_PTHREAD 1) + +if (WITH_GFLAGS) + find_package (gflags 2.2.0) + + if (gflags_FOUND) + set (HAVE_LIB_GFLAGS 1) + determine_gflags_namespace (gflags_NAMESPACE) + endif (gflags_FOUND) +endif (WITH_GFLAGS) + +find_package (Threads) +find_package (Unwind) + +if (Unwind_FOUND) + set (HAVE_LIB_UNWIND 1) + set (HAVE_UNWIND_H 1) +endif (Unwind_FOUND) + +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 (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 (sys/wait.h HAVE_SYS_WAIT_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 (pwd.h HAVE_PWD_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 (dbghelp UnDecorateSymbolName "" HAVE_DBGHELP) + +check_c_source_compiles (" +#include <stdlib.h> +static void foo(void) __attribute__ ((unused)); +int main(void) { return 0; } +" HAVE___ATTRIBUTE__) + +check_c_source_compiles (" +#include <stdlib.h> +static void foo(void) __attribute__ ((visibility(\"default\"))); +int main(void) { return 0; } +" HAVE___ATTRIBUTE__VISIBILITY_DEFAULT) + +check_c_source_compiles (" +#include <stdlib.h> +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 <pthread.h> +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> +vector<int> t; int main() { } +" STL_NO_NAMESPACE) + +check_cxx_source_compiles (" +#include <vector> +std::vector<int> t; int main() { } +" STL_STD_NAMESPACE) + +check_cxx_source_compiles (" +#include <iostream> +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) + +check_cxx_source_compiles (" +__thread int tls; +int main() { } +" HAVE_GCC_TLS) + +check_cxx_source_compiles (" +__declspec(thread) int tls; +int main() { } +" HAVE_MSVC_TLS) + +check_cxx_source_compiles (" +thread_local int tls; +int main() { } +" HAVE_CXX11_TLS) + +check_cxx_source_compiles (" +#include <type_traits> +std::aligned_storage<sizeof(char), alignof(char)>::type data; +int main() { } +" HAVE_ALIGNED_STORAGE) + +if (WITH_TLS) + # Cygwin does not support the thread attribute. Don't bother. + if (HAVE_GCC_TLS) + set (GLOG_THREAD_LOCAL_STORAGE "__thread") + elseif (HAVE_MSVC_TLS) + set (GLOG_THREAD_LOCAL_STORAGE "__declspec(thread)") + elseif (HAVE_CXX11_TLS) + set (GLOG_THREAD_LOCAL_STORAGE thread_local) + endif (HAVE_GCC_TLS) +endif (WITH_TLS) + +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) + +if (HAVE_EXECINFO_H) + set (HAVE_STACKTRACE 1) +endif (HAVE_EXECINFO_H) + +if (WITH_SYMBOLIZE) + if (WIN32 OR CYGWIN) + cmake_push_check_state (RESET) + set (CMAKE_REQUIRED_LIBRARIES DbgHelp) + + check_cxx_source_runs ([=[ + #include <windows.h> + #include <dbghelp.h> + #include <cstdlib> + + void foobar() { } + + int main() + { + HANDLE process = GetCurrentProcess(); + + if (!SymInitialize(process, NULL, TRUE)) + return EXIT_FAILURE; + + char buf[sizeof(SYMBOL_INFO) + MAX_SYM_NAME]; + SYMBOL_INFO *symbol = reinterpret_cast<SYMBOL_INFO *>(buf); + symbol->SizeOfStruct = sizeof(SYMBOL_INFO); + symbol->MaxNameLen = MAX_SYM_NAME; + + void* const pc = reinterpret_cast<void*>(&foobar); + BOOL ret = SymFromAddr(process, reinterpret_cast<DWORD64>(pc), 0, symbol); + + return ret ? EXIT_SUCCESS : EXIT_FAILURE; + } + ]=] HAVE_SYMBOLIZE) + + cmake_pop_check_state () + + if (HAVE_SYMBOLIZE) + set (HAVE_STACKTRACE 1) + endif (HAVE_SYMBOLIZE) + elseif (UNIX OR (APPLE AND HAVE_DLADDR)) + set (HAVE_SYMBOLIZE 1) + endif (WIN32 OR CYGWIN) +endif (WITH_SYMBOLIZE) + +check_cxx_source_compiles (" +#include <cstdlib> +#include <time.h> +int main() +{ + time_t timep; + struct tm result; + localtime_r(&timep, &result); + return EXIT_SUCCESS; +} +" HAVE_LOCALTIME_R) + +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) +if (WITH_PKGCONFIG) + set (VERSION ${PROJECT_VERSION}) + set (prefix ${CMAKE_INSTALL_PREFIX}) + set (exec_prefix ${CMAKE_INSTALL_FULL_BINDIR}) + set (libdir ${CMAKE_INSTALL_FULL_LIBDIR}) + set (includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR}) + + configure_file ( + "${PROJECT_SOURCE_DIR}/libglog.pc.in" + "${PROJECT_BINARY_DIR}/libglog.pc" + @ONLY + ) + + unset (VERSION) + unset (prefix) + unset (exec_prefix) + unset (libdir) + unset (includedir) +endif (WITH_PKGCONFIG) + +set (CMAKE_CXX_VISIBILITY_PRESET default) +set (CMAKE_VISIBILITY_INLINES_HIDDEN 1) + +set (GLOG_PUBLIC_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 OR WIN32) + list (APPEND GLOG_SRCS src/signalhandler.cc) +endif (HAVE_PTHREAD OR WIN32) + +if (WIN32) + list (APPEND GLOG_SRCS + src/windows/port.cc + src/windows/port.h + ) +endif (WIN32) + +add_compile_options ($<$<AND:$<BOOL:${HAVE_NO_UNNAMED_TYPE_TEMPLATE_ARGS}>,$<NOT:$<CXX_COMPILER_ID:GNU>>>:-Wno-unnamed-type-template-args>) + +set (_glog_CMake_BINDIR ${CMAKE_INSTALL_BINDIR}) +set (_glog_CMake_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR}) +set (_glog_CMake_LIBDIR ${CMAKE_INSTALL_LIBDIR}) +set (_glog_CMake_INSTALLDIR ${_glog_CMake_LIBDIR}/cmake/glog) + +set (_glog_CMake_DIR glog/cmake) +set (_glog_CMake_DATADIR ${CMAKE_INSTALL_DATAROOTDIR}/${_glog_CMake_DIR}) +set (_glog_BINARY_CMake_DATADIR + ${CMAKE_CURRENT_BINARY_DIR}/${_glog_CMake_DATADIR}) + +# Add additional CMake find modules here. +set (_glog_CMake_MODULES) + +if (Unwind_FOUND) + # Copy the module only if libunwind is actually used. + list (APPEND _glog_CMake_MODULES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindUnwind.cmake) +endif (Unwind_FOUND) + +# Generate file name for each module in the binary directory +foreach (_file ${_glog_CMake_MODULES}) + get_filename_component (_module "${_file}" NAME) + + list (APPEND _glog_BINARY_CMake_MODULES + ${_glog_BINARY_CMake_DATADIR}/${_module}) +endforeach (_file) + +if (_glog_CMake_MODULES) + # Copy modules to binary directory during the build + add_custom_command (OUTPUT ${_glog_BINARY_CMake_MODULES} + COMMAND ${CMAKE_COMMAND} -E make_directory + ${_glog_BINARY_CMake_DATADIR} + COMMAND ${CMAKE_COMMAND} -E copy ${_glog_CMake_MODULES} + ${_glog_BINARY_CMake_DATADIR} + DEPENDS ${_glog_CMake_MODULES} + COMMENT "Copying find modules..." + ) +endif (_glog_CMake_MODULES) + +add_library (glog + ${GLOG_SRCS} + ${_glog_BINARY_CMake_MODULES} +) + +add_library(glog::glog ALIAS glog) + +set_target_properties (glog PROPERTIES POSITION_INDEPENDENT_CODE ON) + +if (Unwind_FOUND) + target_link_libraries (glog PUBLIC unwind::unwind) + set (Unwind_DEPENDENCY "find_dependency (Unwind ${Unwind_VERSION})") +endif (Unwind_FOUND) + +if (HAVE_DBGHELP) + target_link_libraries (glog PUBLIC dbghelp) +endif (HAVE_DBGHELP) + +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_link_libraries (glog PUBLIC gflags) + + 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 ${PROJECT_VERSION}) +set_target_properties (glog PROPERTIES SOVERSION ${PROJECT_VERSION_MAJOR}) + +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 + "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>" + "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>" + "$<INSTALL_INTERFACE:${_glog_CMake_INCLUDE_DIR}>" + PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src) + +if (WIN32) + target_include_directories (glog PUBLIC + "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/windows>" + 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___DECLSPEC) + set (_EXPORT "__declspec(dllexport)") + set (_IMPORT "__declspec(dllimport)") + elseif (HAVE___ATTRIBUTE__VISIBILITY_DEFAULT) + set (_EXPORT "__attribute__((visibility(\"default\")))") + set (_IMPORT "") + endif (HAVE___DECLSPEC) + + 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) + +# 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) + set_tests_properties(stacktrace PROPERTIES TIMEOUT 30) + 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) + + # Generate an initial cache + + get_cache_variables (_CACHEVARS EXCLUDE CMAKE_MAKE_PROGRAM) + + set (_INITIAL_CACHE + ${CMAKE_CURRENT_BINARY_DIR}/test_package_config/glog_package_config_initial_cache.cmake) + + # Package config test + + add_test (NAME cmake_package_config_init COMMAND ${CMAKE_COMMAND} + -DTEST_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}/test_package_config + -DINITIAL_CACHE=${_INITIAL_CACHE} + -DCACHEVARS=${_CACHEVARS} + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/TestInitPackageConfig.cmake + ) + + add_test (NAME cmake_package_config_generate COMMAND ${CMAKE_COMMAND} + -DPATH=$ENV{PATH} + -DINITIAL_CACHE=${_INITIAL_CACHE} + -DTEST_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}/test_package_config/working_config + -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}/src/package_config_unittest/working_config + -DPACKAGE_DIR=${CMAKE_CURRENT_BINARY_DIR} + -DGENERATOR=${CMAKE_GENERATOR} + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/TestPackageConfig.cmake + ) + + add_test (NAME cmake_package_config_build COMMAND + ${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR}/test_package_config/working_config + ) + + add_test (NAME cmake_package_config_cleanup COMMAND ${CMAKE_COMMAND} -E + remove_directory + ${CMAKE_CURRENT_BINARY_DIR}/test_package_config + ) + + # Fixtures setup + set_tests_properties (cmake_package_config_init PROPERTIES FIXTURES_SETUP + cmake_package_config) + set_tests_properties (cmake_package_config_generate PROPERTIES FIXTURES_SETUP + cmake_package_config_working) + + # Fixtures cleanup + set_tests_properties (cmake_package_config_cleanup PROPERTIES FIXTURES_CLEANUP + cmake_package_config) + + # Fixture requirements + set_tests_properties (cmake_package_config_generate PROPERTIES + FIXTURES_REQUIRED cmake_package_config) + set_tests_properties (cmake_package_config_build PROPERTIES + FIXTURES_REQUIRED "cmake_package_config;cmake_package_config_working") +endif (BUILD_TESTING) + +install (TARGETS glog + EXPORT glog-targets + RUNTIME DESTINATION ${_glog_CMake_BINDIR} + PUBLIC_HEADER DESTINATION ${_glog_CMake_INCLUDE_DIR}/glog + LIBRARY DESTINATION ${_glog_CMake_LIBDIR} + ARCHIVE DESTINATION ${_glog_CMake_LIBDIR}) + +if (WITH_PKGCONFIG) + install ( + FILES "${PROJECT_BINARY_DIR}/libglog.pc" + DESTINATION "${_glog_CMake_LIBDIR}/pkgconfig" + ) +endif (WITH_PKGCONFIG) + +set (glog_CMake_VERSION 3.0) + +if (gflags_FOUND) + # Ensure clients locate only the package config and not third party find + # modules having the same name. This avoid cmake_policy PUSH/POP errors. + if (CMAKE_VERSION VERSION_LESS 3.9) + set (gflags_DEPENDENCY "find_dependency (gflags ${gflags_VERSION})") + else (CMAKE_VERSION VERSION_LESS 3.9) + # Passing additional find_package arguments to find_dependency is possible + # starting with CMake 3.9. + set (glog_CMake_VERSION 3.9) + set (gflags_DEPENDENCY "find_dependency (gflags ${gflags_VERSION} NO_MODULE)") + endif (CMAKE_VERSION VERSION_LESS 3.9) +endif (gflags_FOUND) + +configure_package_config_file (glog-config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake + INSTALL_DESTINATION ${_glog_CMake_INSTALLDIR} + NO_CHECK_REQUIRED_COMPONENTS_MACRO) + +write_basic_package_version_file (glog-config-version.cmake VERSION + ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion) + +export (TARGETS glog NAMESPACE glog:: FILE glog-targets.cmake) +export (PACKAGE glog) + +get_filename_component (_PREFIX "${CMAKE_INSTALL_PREFIX}" ABSOLUTE) + +# Directory containing the find modules relative to the config install +# directory. +file (RELATIVE_PATH glog_REL_CMake_MODULES + ${_PREFIX}/${_glog_CMake_INSTALLDIR} + ${_PREFIX}/${_glog_CMake_DATADIR}/glog-modules.cmake) + +get_filename_component (glog_REL_CMake_DATADIR ${glog_REL_CMake_MODULES} + DIRECTORY) + +set (glog_FULL_CMake_DATADIR + ${CMAKE_CURRENT_BINARY_DIR}/${_glog_CMake_DATADIR}) + +configure_file (glog-modules.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/glog-modules.cmake @ONLY) + +install (CODE +" +set (glog_FULL_CMake_DATADIR \"\\\${CMAKE_CURRENT_LIST_DIR}/${glog_REL_CMake_DATADIR}\") +configure_file (${CMAKE_CURRENT_SOURCE_DIR}/glog-modules.cmake.in + \"${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/glog-modules.cmake\" @ONLY) +file (INSTALL + \"${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/glog-modules.cmake\" + DESTINATION + \"\${CMAKE_INSTALL_PREFIX}/${_glog_CMake_INSTALLDIR}\") +" + COMPONENT Development +) + +install (FILES + ${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake + ${CMAKE_CURRENT_BINARY_DIR}/glog-modules.cmake + DESTINATION ${_glog_CMake_INSTALLDIR}) + +# Find modules in share/glog/cmake +install (DIRECTORY ${_glog_BINARY_CMake_DATADIR} + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/glog + COMPONENT Development + FILES_MATCHING PATTERN "*.cmake" +) + +install (EXPORT glog-targets NAMESPACE glog:: DESTINATION + ${_glog_CMake_INSTALLDIR}) |