1CMAKE_MINIMUM_REQUIRED(VERSION 3.1 FATAL_ERROR) 2 3INCLUDE(GNUInstallDirs) 4 5# ---[ Project and semantic versioning. 6PROJECT(clog C CXX) 7 8# ---[ Options. 9SET(CLOG_RUNTIME_TYPE "default" CACHE STRING "Type of runtime library (shared, static, or default) to use") 10SET_PROPERTY(CACHE CLOG_RUNTIME_TYPE PROPERTY STRINGS default static shared) 11IF(ANDROID) 12 OPTION(CLOG_LOG_TO_STDIO "Log errors, warnings, and information to stdout/stderr" OFF) 13ELSE() 14 OPTION(CLOG_LOG_TO_STDIO "Log errors, warnings, and information to stdout/stderr" ON) 15ENDIF() 16OPTION(CLOG_BUILD_TESTS "Build clog tests" ON) 17OPTION(USE_SYSTEM_LIBS "Use system libraries instead of downloading and building them" OFF) 18OPTION(USE_SYSTEM_GOOGLETEST "Use system Google Test library instead of downloading and building it" ${USE_SYSTEM_LIBS}) 19 20# ---[ CMake options 21IF(CLOG_BUILD_TESTS) 22 ENABLE_TESTING() 23ENDIF() 24 25MACRO(CLOG_TARGET_RUNTIME_LIBRARY target) 26 IF(MSVC AND NOT CLOG_RUNTIME_TYPE STREQUAL "default") 27 IF(CLOG_RUNTIME_TYPE STREQUAL "shared") 28 TARGET_COMPILE_OPTIONS(${target} PRIVATE 29 "/MD$<$<CONFIG:Debug>:d>") 30 ELSEIF(CLOG_RUNTIME_TYPE STREQUAL "static") 31 TARGET_COMPILE_OPTIONS(${target} PRIVATE 32 "/MT$<$<CONFIG:Debug>:d>") 33 ENDIF() 34 ENDIF() 35ENDMACRO() 36 37# ---[ Download deps 38SET(CONFU_DEPENDENCIES_SOURCE_DIR ${CMAKE_SOURCE_DIR}/deps 39 CACHE PATH "Confu-style dependencies source directory") 40SET(CONFU_DEPENDENCIES_BINARY_DIR ${CMAKE_BINARY_DIR}/deps 41 CACHE PATH "Confu-style dependencies binary directory") 42 43IF(CLOG_BUILD_TESTS) 44 IF(USE_SYSTEM_GOOGLETEST) 45 FIND_PACKAGE(GTest REQUIRED) 46 ELSEIF(NOT DEFINED GOOGLETEST_SOURCE_DIR) 47 MESSAGE(STATUS "Downloading Google Test to ${CONFU_DEPENDENCIES_SOURCE_DIR}/googletest (define GOOGLETEST_SOURCE_DIR to avoid it)") 48 CONFIGURE_FILE(cmake/DownloadGoogleTest.cmake "${CONFU_DEPENDENCIES_BINARY_DIR}/googletest-download/CMakeLists.txt") 49 EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . 50 WORKING_DIRECTORY "${CONFU_DEPENDENCIES_BINARY_DIR}/googletest-download") 51 EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build . 52 WORKING_DIRECTORY "${CONFU_DEPENDENCIES_BINARY_DIR}/googletest-download") 53 SET(GOOGLETEST_SOURCE_DIR "${CONFU_DEPENDENCIES_SOURCE_DIR}/googletest" CACHE STRING "Google Test source directory") 54 ENDIF() 55ENDIF() 56 57# ---[ clog library 58ADD_LIBRARY(clog STATIC src/clog.c) 59SET_TARGET_PROPERTIES(clog PROPERTIES 60 C_STANDARD 99 61 C_EXTENSIONS NO) 62CLOG_TARGET_RUNTIME_LIBRARY(clog) 63SET_TARGET_PROPERTIES(clog PROPERTIES PUBLIC_HEADER include/clog.h) 64TARGET_INCLUDE_DIRECTORIES(clog PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>) 65IF(CLOG_LOG_TO_STDIO) 66 TARGET_COMPILE_DEFINITIONS(clog PRIVATE CLOG_LOG_TO_STDIO=1) 67ELSE() 68 TARGET_COMPILE_DEFINITIONS(clog PRIVATE CLOG_LOG_TO_STDIO=0) 69ENDIF() 70IF(ANDROID AND NOT CLOG_LOG_TO_STDIO) 71 TARGET_LINK_LIBRARIES(clog PRIVATE log) 72ENDIF() 73 74ADD_LIBRARY(cpuinfo::clog ALIAS clog) 75 76INSTALL(TARGETS clog 77 EXPORT cpuinfo-targets 78 LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" 79 ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" 80 PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") 81 82# ---[ clog tests 83IF(CLOG_BUILD_TESTS) 84 # ---[ Build google test 85 IF(NOT TARGET gtest AND NOT USE_SYSTEM_GOOGLETEST) 86 IF(MSVC AND NOT CLOG_RUNTIME_TYPE STREQUAL "static") 87 SET(gtest_force_shared_crt ON CACHE BOOL "" FORCE) 88 ENDIF() 89 ADD_SUBDIRECTORY( 90 "${GOOGLETEST_SOURCE_DIR}" 91 "${CONFU_DEPENDENCIES_BINARY_DIR}/googletest") 92 ENDIF() 93 94 ADD_EXECUTABLE(clog-test test/clog.cc) 95 SET_TARGET_PROPERTIES(clog-test PROPERTIES 96 CXX_STANDARD 11 97 CXX_EXTENSIONS NO) 98 CLOG_TARGET_RUNTIME_LIBRARY(clog-test) 99 TARGET_LINK_LIBRARIES(clog-test PRIVATE clog gtest gtest_main) 100 ADD_TEST(clog-test clog-test) 101ENDIF() 102