mirror of
https://github.com/aristocratos/btop.git
synced 2024-09-29 22:51:35 +02:00
Merge pull request #671 from imwints/cmake-gpu
Bring GPU support to CMake and improve how Make handles the ROCm library build
This commit is contained in:
commit
d1384c9341
@ -3,7 +3,7 @@
|
|||||||
# CMake configuration for btop
|
# CMake configuration for btop
|
||||||
#
|
#
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.12)
|
cmake_minimum_required(VERSION 3.20)
|
||||||
|
|
||||||
# Disable in-source builds since they would override the Makefile
|
# Disable in-source builds since they would override the Makefile
|
||||||
if("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
|
if("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
@ -32,28 +32,29 @@ set(CMAKE_COLOR_DIAGNOSTICS ON)
|
|||||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
|
|
||||||
# Options
|
# Options
|
||||||
|
include(CMakeDependentOption)
|
||||||
option(BTOP_STATIC "Link btop statically" OFF)
|
option(BTOP_STATIC "Link btop statically" OFF)
|
||||||
option(BTOP_LTO "Enable LTO" ON)
|
option(BTOP_LTO "Enable LTO" ON)
|
||||||
option(BTOP_USE_MOLD "Use mold to link btop" OFF)
|
option(BTOP_USE_MOLD "Use mold to link btop" OFF)
|
||||||
option(BTOP_PEDANTIC "Enable a bunch of additional warnings" OFF)
|
option(BTOP_PEDANTIC "Enable a bunch of additional warnings" OFF)
|
||||||
option(BTOP_WERROR "Compile with warnings as errors" OFF)
|
option(BTOP_WERROR "Compile with warnings as errors" OFF)
|
||||||
|
option(BTOP_GPU "Enable GPU support" ON)
|
||||||
|
cmake_dependent_option(BTOP_RSMI_STATIC "Link statically to ROCm SMI" OFF "BTOP_GPU" OFF)
|
||||||
|
|
||||||
if(BTOP_STATIC)
|
if(BTOP_STATIC)
|
||||||
# Set this before calling find_package
|
# Set this before calling find_package
|
||||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
|
|
||||||
find_package(devstat REQUIRED)
|
|
||||||
find_package(kvm REQUIRED)
|
|
||||||
if(BTOP_STATIC)
|
|
||||||
find_package(elf REQUIRED)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(CheckCXXCompilerFlag)
|
include(CheckCXXCompilerFlag)
|
||||||
|
include(CheckIncludeFileCXX)
|
||||||
include(CheckIPOSupported)
|
include(CheckIPOSupported)
|
||||||
|
|
||||||
|
check_include_file_cxx(ranges CXX_HAS_RANGES)
|
||||||
|
if(NOT CXX_HAS_RANGES)
|
||||||
|
message(FATAL_ERROR "The compiler doesn't support <ranges>")
|
||||||
|
endif()
|
||||||
|
|
||||||
add_executable(btop
|
add_executable(btop
|
||||||
src/btop.cpp
|
src/btop.cpp
|
||||||
src/btop_config.cpp
|
src/btop_config.cpp
|
||||||
@ -132,6 +133,36 @@ target_compile_definitions(btop PRIVATE
|
|||||||
$<$<NOT:$<CONFIG:Debug>>:_FORTIFY_SOURCE=2>
|
$<$<NOT:$<CONFIG:Debug>>:_FORTIFY_SOURCE=2>
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Enable GPU support
|
||||||
|
if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND BTOP_GPU)
|
||||||
|
target_compile_definitions(btop PRIVATE GPU_SUPPORT)
|
||||||
|
|
||||||
|
if(BTOP_RSMI_STATIC)
|
||||||
|
# ROCm doesn't properly add it's folders to the module path
|
||||||
|
# if `CMAKE_MODULE_PATH` is already set
|
||||||
|
# We could also manully append ROCm's path here
|
||||||
|
set(_CMAKE_MODULE_PATH CMAKE_MODULE_PATH)
|
||||||
|
unset(CMAKE_MODULE_PATH)
|
||||||
|
|
||||||
|
# NOTE: This might be problematic in the future if other sub projects
|
||||||
|
# depend on this or if btop starts producing libraries
|
||||||
|
# Build a static ROCm library
|
||||||
|
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
|
||||||
|
|
||||||
|
add_subdirectory(lib/rocm_smi_lib EXCLUDE_FROM_ALL)
|
||||||
|
|
||||||
|
add_library(ROCm INTERFACE)
|
||||||
|
# Export ROCm's properties to a CMake target (which should've been done by ROCm :-/)
|
||||||
|
target_compile_definitions(ROCm INTERFACE RSMI_STATIC)
|
||||||
|
target_include_directories(ROCm INTERFACE lib/rocm_smi_lib/include)
|
||||||
|
target_link_libraries(ROCm INTERFACE rocm_smi64)
|
||||||
|
|
||||||
|
set(CMAKE_MODULE_PATH _CMAKE_MODULE_PATH)
|
||||||
|
|
||||||
|
target_link_libraries(btop PRIVATE ROCm)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
target_include_directories(btop SYSTEM PRIVATE include)
|
target_include_directories(btop SYSTEM PRIVATE include)
|
||||||
|
|
||||||
# mold
|
# mold
|
||||||
@ -153,8 +184,11 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
|||||||
target_link_libraries(btop PRIVATE $<LINK_LIBRARY:FRAMEWORK,CoreFoundation)
|
target_link_libraries(btop PRIVATE $<LINK_LIBRARY:FRAMEWORK,CoreFoundation)
|
||||||
target_link_libraries(btop PRIVATE $<LINK_LIBRARY:FRAMEWORK,IOKit)
|
target_link_libraries(btop PRIVATE $<LINK_LIBRARY:FRAMEWORK,IOKit)
|
||||||
elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
|
||||||
|
find_package(devstat REQUIRED)
|
||||||
|
find_package(kvm REQUIRED)
|
||||||
target_link_libraries(btop PRIVATE devstat::devstat kvm::kvm)
|
target_link_libraries(btop PRIVATE devstat::devstat kvm::kvm)
|
||||||
if(BTOP_STATIC)
|
if(BTOP_STATIC)
|
||||||
|
find_package(elf REQUIRED)
|
||||||
target_link_libraries(btop PRIVATE elf::elf)
|
target_link_libraries(btop PRIVATE elf::elf)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
23
Makefile
23
Makefile
@ -218,7 +218,8 @@ endif
|
|||||||
P := %%
|
P := %%
|
||||||
|
|
||||||
ifeq ($(VERBOSE),true)
|
ifeq ($(VERBOSE),true)
|
||||||
override SUPPRESS := 1>/dev/null
|
# Doesn't work with `&>`
|
||||||
|
override SUPPRESS := > /dev/null 2> /dev/null
|
||||||
else
|
else
|
||||||
override SUPPRESS :=
|
override SUPPRESS :=
|
||||||
endif
|
endif
|
||||||
@ -274,11 +275,13 @@ directories:
|
|||||||
clean:
|
clean:
|
||||||
@printf "\033[1;91mRemoving: \033[1;97mbuilt objects...\033[0m\n"
|
@printf "\033[1;91mRemoving: \033[1;97mbuilt objects...\033[0m\n"
|
||||||
@rm -rf $(BUILDDIR)
|
@rm -rf $(BUILDDIR)
|
||||||
|
@cmake --build lib/rocm_smi_lib/build --target clean &> /dev/null || true
|
||||||
|
|
||||||
#? Clean Objects and Binaries
|
#? Clean Objects and Binaries
|
||||||
distclean: clean
|
distclean: clean
|
||||||
@printf "\033[1;91mRemoving: \033[1;97mbuilt binaries...\033[0m\n"
|
@printf "\033[1;91mRemoving: \033[1;97mbuilt binaries...\033[0m\n"
|
||||||
@rm -rf $(TARGETDIR)
|
@rm -rf $(TARGETDIR)
|
||||||
|
@rm -rf lib/rocm_smi_lib/build
|
||||||
|
|
||||||
install:
|
install:
|
||||||
@printf "\033[1;92mInstalling binary to: \033[1;97m$(DESTDIR)$(PREFIX)/bin/btop\n"
|
@printf "\033[1;92mInstalling binary to: \033[1;97m$(DESTDIR)$(PREFIX)/bin/btop\n"
|
||||||
@ -326,20 +329,24 @@ uninstall:
|
|||||||
|
|
||||||
#? Compile rocm_smi
|
#? Compile rocm_smi
|
||||||
ifeq ($(GPU_SUPPORT)$(RSMI_STATIC),truetrue)
|
ifeq ($(GPU_SUPPORT)$(RSMI_STATIC),truetrue)
|
||||||
|
ROCM_DIR ?= lib/rocm_smi_lib
|
||||||
|
ROCM_BUILD_DIR := $(ROCM_DIR)/build
|
||||||
|
ifeq ($(DEBUG),true)
|
||||||
|
BUILD_TYPE := Debug
|
||||||
|
else
|
||||||
|
BUILD_TYPE := Release
|
||||||
|
endif
|
||||||
.ONESHELL:
|
.ONESHELL:
|
||||||
rocm_smi:
|
rocm_smi:
|
||||||
@printf "\n\033[1;92mBuilding ROCm SMI static library\033[37m...\033[0m\n"
|
@printf "\n\033[1;92mBuilding ROCm SMI static library\033[37m...\033[0m\n"
|
||||||
@TSTAMP=$$(date +%s 2>/dev/null || echo "0")
|
@TSTAMP=$$(date +%s 2>/dev/null || echo "0")
|
||||||
@mkdir -p lib/rocm_smi_lib/build
|
|
||||||
@cd lib/rocm_smi_lib/build
|
|
||||||
@$(QUIET) || printf "\033[1;97mRunning CMake...\033[0m\n"
|
@$(QUIET) || printf "\033[1;97mRunning CMake...\033[0m\n"
|
||||||
@cmake .. $(SUPPRESS) || { printf "\033[1;91mCMake failed, continuing build without statically linking ROCm SMI\033[37m...\033[0m\n"; exit 0; }
|
CXX=$(CXX) cmake -S $(ROCM_DIR) -B $(ROCM_BUILD_DIR) -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -DCMAKE_POLICY_DEFAULT_CMP0069=NEW -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -DBUILD_SHARED_LIBS=OFF $(SUPPRESS) || { printf "\033[1;91mCMake failed, continuing build without statically linking ROCm SMI\033[37m...\033[0m\n"; exit 0; }
|
||||||
@$(QUIET) || printf "\n\033[1;97mBuilding and linking...\033[0m\n"
|
@$(QUIET) || printf "\n\033[1;97mBuilding and linking...\033[0m\n"
|
||||||
@$(MAKE) $(SUPPRESS) || { printf "\033[1;91mMake failed, continuing build without statically linking ROCm SMI\033[37m...\033[0m\n"; exit 0; }
|
@cmake --build $(ROCM_BUILD_DIR) -j -t rocm_smi64 $(SUPPRESS) || { printf "\033[1;91mMake failed, continuing build without statically linking ROCm SMI\033[37m...\033[0m\n"; exit 0; }
|
||||||
@ar -crs rocm_smi/librocm_smi64.a $$(find rocm_smi -name '*.o') $(SURPRESS) || { printf "\033[1;91mFailed to pack ROCm SMI into static library, continuing build without statically linking ROCm SMI\033[37m...\033[0m\n"; exit 0; }
|
@printf "\033[1;92m100$(P)\033[10D\033[5C-> \033[1;37m$(ROCM_BUILD_DIR)/rocm_smi/librocm_smi64.a \033[1;93m(\033[1;97m$$(du -ah $(ROCM_BUILD_DIR)/rocm_smi/librocm_smi64.a | cut -f1)iB\033[1;93m)\033[0m\n"
|
||||||
@printf "\033[1;92m100$(P)\033[10D\033[5C-> \033[1;37mrocm_smi/librocm_smi64.a \033[100D\033[38C\033[1;93m(\033[1;97m$$(du -ah rocm_smi/librocm_smi64.a | cut -f1)iB\033[1;93m)\033[0m\n"
|
|
||||||
@printf "\033[1;92mROCm SMI build complete in \033[92m(\033[97m$$($(DATE_CMD) -d @$$(expr $$(date +%s 2>/dev/null || echo "0") - $(TIMESTAMP) 2>/dev/null) -u +%Mm:%Ss 2>/dev/null | sed 's/^00m://' || echo "unknown")\033[92m)\033[0m\n"
|
@printf "\033[1;92mROCm SMI build complete in \033[92m(\033[97m$$($(DATE_CMD) -d @$$(expr $$(date +%s 2>/dev/null || echo "0") - $(TIMESTAMP) 2>/dev/null) -u +%Mm:%Ss 2>/dev/null | sed 's/^00m://' || echo "unknown")\033[92m)\033[0m\n"
|
||||||
@$(eval override LDFLAGS += lib/rocm_smi_lib/build/rocm_smi/librocm_smi64.a -DRSMI_STATIC) # TODO: this seems to execute every time, no matter if the compilation failed or succeeded
|
@$(eval override LDFLAGS += $(ROCM_BUILD_DIR)/rocm_smi/librocm_smi64.a -DRSMI_STATIC) # TODO: this seems to execute every time, no matter if the compilation failed or succeeded
|
||||||
@$(eval override CXXFLAGS += -DRSMI_STATIC)
|
@$(eval override CXXFLAGS += -DRSMI_STATIC)
|
||||||
else
|
else
|
||||||
rocm_smi:
|
rocm_smi:
|
||||||
|
@ -340,7 +340,7 @@ Also needs a UTF8 locale and a font that covers:
|
|||||||
|
|
||||||
For x86_64 Linux the flag `GPU_SUPPORT` is automatically set to `true`, to manually disable gpu support set the flag to false, like:
|
For x86_64 Linux the flag `GPU_SUPPORT` is automatically set to `true`, to manually disable gpu support set the flag to false, like:
|
||||||
|
|
||||||
`make GPU_SUPPORT=false`
|
`make GPU_SUPPORT=false` (or `cmake -DBTOP_GPU=false` with CMake)
|
||||||
|
|
||||||
* **NVIDIA**
|
* **NVIDIA**
|
||||||
|
|
||||||
@ -503,6 +503,8 @@ Also needs a UTF8 locale and a font that covers:
|
|||||||
| `-DBTOP_USE_MOLD=<ON\|OFF>` | Use mold to link btop (OFF by default) |
|
| `-DBTOP_USE_MOLD=<ON\|OFF>` | Use mold to link btop (OFF by default) |
|
||||||
| `-DBTOP_PEDANTIC=<ON\|OFF>` | Compile with additional warnings (OFF by default) |
|
| `-DBTOP_PEDANTIC=<ON\|OFF>` | Compile with additional warnings (OFF by default) |
|
||||||
| `-DBTOP_WERROR=<ON\|OFF>` | Compile with warnings as errors (OFF by default) |
|
| `-DBTOP_WERROR=<ON\|OFF>` | Compile with warnings as errors (OFF by default) |
|
||||||
|
| `-DBTOP_GPU=<ON\|OFF>` | Enable GPU support (ON by default) |
|
||||||
|
| `-DBTOP_RSMI_STATIC=<ON\|OFF>` | Build and link the ROCm SMI library statically (OFF by default) |
|
||||||
| `-DCMAKE_INSTALL_PREFIX=<path>` | The installation prefix ('/usr/local' by default) |
|
| `-DCMAKE_INSTALL_PREFIX=<path>` | The installation prefix ('/usr/local' by default) |
|
||||||
|
|
||||||
To force a compiler, run `CXX=<compiler> cmake -B build -G Ninja`
|
To force a compiler, run `CXX=<compiler> cmake -B build -G Ninja`
|
||||||
|
Loading…
Reference in New Issue
Block a user