1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
|
cmake_minimum_required(VERSION 3.12)
# https://cmake.org/cmake/help/latest/policy/CMP0177.html
if(POLICY CMP0177)
cmake_policy(SET CMP0177 NEW)
endif()
project(cpu-x
VERSION "5.4.0"
LANGUAGES C CXX
)
# Check for x86 CPU
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$|(x86)|(X86)|(amd64)|(AMD64)")
set(CPU_ISA_X86 TRUE)
else()
set(CPU_ISA_X86 FALSE)
endif(CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$|(x86)|(X86)|(amd64)|(AMD64)")
# Check for ARM CPU
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv.*|aarch64")
set(CPU_ISA_ARM TRUE)
else()
set(CPU_ISA_ARM FALSE)
endif(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv.*|aarch64")
# Check if platform is supported
if(NOT CMAKE_SYSTEM_NAME MATCHES "Linux|FreeBSD")
message(WARNING "'${CMAKE_SYSTEM_NAME}' system is not officially supported by CPU-X, some features will not be available.")
endif(NOT CMAKE_SYSTEM_NAME MATCHES "Linux|FreeBSD")
if(NOT CPU_ISA_X86 AND NOT CPU_ISA_ARM)
message(WARNING "'${CMAKE_SYSTEM_PROCESSOR}' processor is not officially supported by CPU-X, some features will not be available.")
endif(NOT CPU_ISA_X86 AND NOT CPU_ISA_ARM)
### DEFAULT CONFIG
# Global variables
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
include(GNUInstallDirs)
# Avoid to put files under /usr/libexec or /usr/local/libexec on Linux when the path does not exist
# On FreeBSD, /usr/local/libexec is missing under Poudriere (https://gitlab.com/FreeBSD/freebsd-ports/-/commit/eb6c9c8c4aa5981078c6b9b69527ecdaee5f22c9)
if(CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT EXISTS ${CMAKE_INSTALL_FULL_LIBEXECDIR})
set(CMAKE_INSTALL_LIBEXECDIR lib/${CMAKE_PROJECT_NAME})
set(CMAKE_INSTALL_FULL_LIBEXECDIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBEXECDIR})
endif(CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT EXISTS ${CMAKE_INSTALL_FULL_LIBEXECDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/output/bin/)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/output/lib/)
set(CMAKE_DATA_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/output/data/)
set(CPU_X_DATA_DIRECTORY ${CMAKE_INSTALL_FULL_DATADIR}/${CMAKE_PROJECT_NAME}/)
set(APP_EXEC ${CMAKE_PROJECT_NAME})
set(DAEMON_EXEC ${CMAKE_PROJECT_NAME}-daemon)
set(DAEMON_PATH ${CMAKE_INSTALL_FULL_LIBEXECDIR}/${DAEMON_EXEC})
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
set(DAEMON_SOCKET "/run/cpu-x.sock")
else()
set(DAEMON_SOCKET "/var/run/cpu-x.sock")
endif(CMAKE_SYSTEM_NAME MATCHES "Linux")
set(CMAKE_COLOR_DIAGNOSTICS ON)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wpedantic -Wno-unused-result -Wno-psabi")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall -Wextra -Wuninitialized -Wformat -Wformat-security -Wstrict-prototypes")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra -Wuninitialized -Wformat -Wformat-security")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now")
# Options
option(WITH_GTK "Build support for GUI in GTK3+" ON)
option(WITH_NCURSES "Build support for TUI in NCurses" ON)
option(WITH_GETTEXT "Build support for internationalization" ON)
option(WITH_LIBCPUID "Use Libcpuid library" ON)
option(WITH_LIBPCI "Use Libpci library" ON)
option(WITH_LIBEGL "Use Libegl library" ON)
option(WITH_VULKAN "Use Vulkan library" ON)
option(WITH_OPENCL "Use OpenCL library" ON)
option(WITH_LIBPROCPS "Use Libprocps library" ON)
option(WITH_LIBSTATGRAB "Use Libstatgrab library" ON)
option(WITH_DMIDECODE "Built-in Dmidecode" ON)
if(CPU_ISA_X86)
option(WITH_BANDWIDTH "Built-in Bandwidth" ON) # Bandwidth is only supported on x86 CPUs (requires cache size)
else()
set(WITH_BANDWIDTH OFF)
endif(CPU_ISA_X86)
option(FORCE_LIBSTATGRAB "Force use of Libstatgrab instead of Libprocps (GNU/Linux system)" OFF)
option(APPIMAGE "Enable workarounds for AppImage" OFF)
option(FLATPAK "Enable workarounds for Flatpak" OFF)
# Colours
string(ASCII 27 Esc)
set(ColourReset "${Esc}[m")
set(ColourBold "${Esc}[1m")
set(Red "${Esc}[31m")
set(Green "${Esc}[32m")
set(Yellow "${Esc}[33m")
set(Blue "${Esc}[34m")
set(Magenta "${Esc}[35m")
set(Cyan "${Esc}[36m")
set(White "${Esc}[37m")
set(BoldRed "${Esc}[1;31m")
set(BoldGreen "${Esc}[1;32m")
set(BoldYellow "${Esc}[1;33m")
set(BoldBlue "${Esc}[1;34m")
set(BoldMagenta "${Esc}[1;35m")
set(BoldCyan "${Esc}[1;36m")
set(BoldWhite "${Esc}[1;37m")
### FUNCTIONS
# Credits to jtanx: https://gist.github.com/jtanx/96ded5e050d5ee5b19804195ee5cf5f9
# Function: pad_string(output str padchar length)
# Add padding to a string
# @output: variable name for output string
# @str: input string
# @padchar: character used for padding
# @length: padding length
function(pad_string output str padchar length)
string(LENGTH "${str}" _strlen)
math(EXPR _strlen "${length} - ${_strlen}")
if(_strlen GREATER 0)
if(${CMAKE_VERSION} VERSION_LESS "3.14")
unset(_pad)
foreach(_i RANGE 1 ${_strlen}) # inclusive
string(APPEND _pad ${padchar})
endforeach()
else()
string(REPEAT ${padchar} ${_strlen} _pad)
endif()
string(APPEND str ${_pad})
endif()
set(${output} "${str}" PARENT_SCOPE)
endfunction()
### MACROS
# Macro: print_config(libname libver withstate)
# Print the state of CPU-X features: in bold green if enabled, else bold red.
# @libname: library name (e.g. GTK)
# @libver: library version (e.g. XXXXX_VERSION)
# @withstate: the CMake option which allows to disable this feature (e.g. WITH_XXXXX)
macro(print_config libname libver withstate)
pad_string(lib_string ${libname} " " 15)
if(${withstate})
message("${BoldCyan}** ${lib_string}${ColourReset}\tsupport is ${BoldGreen}enabled${ColourReset} (version is ${libver})")
add_definitions(-DHAS_${libname}=1 -D${libname}_VERSION="${libver}")
else(${withstate})
message("${BoldCyan}** ${lib_string}${ColourReset}\tsupport is ${BoldRed}disabled${ColourReset}")
add_definitions(-DHAS_${libname}=0 -D${libname}_VERSION=NULL)
endif(${withstate})
endmacro(print_config)
### HELPERS / SUBDIRECTORIES
set(GIT_REVISION "")
if(DEFINED ENV{GITHUB_SHA})
set(GIT_REVISION "+git-$ENV{GITHUB_SHA}")
elseif(EXISTS ${CMAKE_SOURCE_DIR}/.git)
find_package(Git)
if(GIT_FOUND)
execute_process(COMMAND sh -c "${GIT_EXECUTABLE} describe --long --tags --exclude continuous --abbrev=40 --dirty | cut --delimiter=- --fields=2-"
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
OUTPUT_VARIABLE GIT_DESCRIBE_REVISION
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(GIT_DESCRIBE_REVISION STREQUAL "")
message(WARNING "Unknown Git revision.")
else(GIT_DESCRIBE_REVISION STREQUAL "")
set(GIT_REVISION "+git-r${GIT_DESCRIBE_REVISION}")
endif(GIT_DESCRIBE_REVISION STREQUAL "")
else(GIT_FOUND)
message(WARNING "Git package not found, GIT_REVISION cannot be set.")
endif(GIT_FOUND)
endif()
enable_testing()
find_package(PkgConfig REQUIRED)
find_package(Threads REQUIRED)
find_package(Backtrace REQUIRED)
find_package(Filesystem REQUIRED)
if(WITH_GETTEXT)
find_package(Gettext REQUIRED)
if(${CMAKE_VERSION} VERSION_GREATER "3.1")
find_package(Intl REQUIRED)
endif(${CMAKE_VERSION} VERSION_GREATER "3.1")
endif(WITH_GETTEXT)
#include(CheckSymbolExists)
#include(CheckStructHasMember)
#include(CheckCSourceCompiles)
include(CheckCSourceRuns)
#include(CheckIncludeFile)
include(CheckLanguage)
add_subdirectory(data)
add_subdirectory(po)
add_subdirectory(src)
add_subdirectory(tests)
### UNINSTALL TARGET
configure_file("${CMAKE_MODULE_PATH}/cmake_uninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
IMMEDIATE @ONLY
)
add_custom_target(uninstall
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
)
|