Skip to content

Commit

Permalink
Add CMake support for Linux
Browse files Browse the repository at this point in the history
  • Loading branch information
imwints committed Aug 5, 2023
1 parent 1b126f5 commit e5ba8dc
Show file tree
Hide file tree
Showing 2 changed files with 180 additions and 1 deletion.
106 changes: 106 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
# SPDX-License-Identifier: Apache-2.0
#
# CMake configuration file for btop
cmake_minimum_required(VERSION 3.12)

# -O3 is not tested right now
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG" CACHE STRING INTERNAL)

# Disable in-source builds since they would override the Makefile
if("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
message(FATAL_ERROR "In-source build are disable to preserve btop's own Makefile")
endif()

project("btop"
VERSION 1.2.13
DESCRIPTION "A monitor of resources"
HOMEPAGE_URL "https://github.com/aristocratos/btop"
LANGUAGES CXX
)

set(CMAKE_COLOR_DIAGNOSTICS ON)
# When the build type is empty we can't properly fortify
if(CMAKE_BUILD_TYPE STREQUAL "")
set(CMAKE_BUILD_TYPE Release)
message(STATUS "Set build type to Release")
endif()

add_executable(btop
src/btop.cpp
src/btop_config.cpp
src/btop_draw.cpp
src/btop_input.cpp
src/btop_menu.cpp
src/btop_shared.cpp
src/btop_theme.cpp
src/btop_tools.cpp
)

# NOTE: Checks can be simplified with CMake 3.25
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
target_sources(btop PRIVATE
src/osx/btop_collect.cpp
src/osx/sensors.cpp
src/osx/smc.cpp
)
elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
target_sources(btop PRIVATE src/freebsd/btop_collect.cpp)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
target_sources(btop PRIVATE src/linux/btop_collect.cpp)
else()
message(FATAL_ERROR "${CMAKE_SYSTEM_NAME} is not supported")
endif()

option(BTOP_STATIC "Link btop statically" OFF)
if(BTOP_STATIC AND NOT MAKE_BUILD_TYPE STREQUAL "Debug")
target_compile_definitions(btop PRIVATE STATIC_BUILD)
target_link_options(btop PRIVATE -static)
endif()

option(BTOP_STRIP "Strip executable" ON)
if(BTOP_STRIP AND CMAKE_BUILD_TYPE STREQUAL "Release")
target_link_options(btop PRIVATE -s)
endif()

set_target_properties(btop PROPERTIES
CXX_STANDARD 20
CXX_STANDARD_REQUIRED ON
CXX_EXTENSIONS OFF
INTERPROCEDURAL_OPTIMIZATION ON
)

include(CheckCXXCompilerFlag)
check_cxx_compiler_flag(-fstack-protector CXX_HAS_FSTACK_PROTECTOR)
# TODO: enable more warnings in coordination with upstream
# TODO: filter out -fstack-clash-protection on arm chips
target_compile_options(btop PRIVATE -Wall -Wextra -Wpedantic
-ftree-vectorize -fstack-clash-protection -fcf-protection
$<$<BOOL:CXX_HAS_FSTACK_PROTECTOR>:-fstack-protector>
)

target_compile_definitions(btop PRIVATE
_FILE_OFFSET_BITS=64

_GLIBCXX_ASSERTIONS _LIBCPP_ENABLE_ASSERTIONS=1
# Only has an effect with optimizations enabled
$<$<NOT:$<CONFIG:Debug>>:_FORTIFY_SOURCE=2>
)

target_include_directories(btop SYSTEM PRIVATE include)

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(btop PRIVATE Threads::Threads)

if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
target_link_libraries(btop PRIVATE $<LINK_LIBRARY:FRAMEWORK,CoreFoundation)
target_link_libraries(btop PRIVATE $<LINK_LIBRARY:FRAMEWORK,IOKit)
elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
target_link_options(btop PRIVATE -lm -lkvm -ldevstat -Wl,-rpath=/usr/local/lib/gcc11)
endif()

install(TARGETS btop RUNTIME)
install(FILES "btop.desktop" DESTINATION "share/applications")
install(FILES "Img/icon.png" DESTINATION "share/icons/hicolor/48x48/apps" RENAME "btop.png")
install(FILES "Img/icon.svg" DESTINATION "share/icons/hicolor/scalable/apps" RENAME "btop.svg")
install(DIRECTORY "themes" DESTINATION "share/btop")
75 changes: 74 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,78 @@ Also needs a UTF8 locale and a font that covers:

The makefile also needs GNU coreutils and `sed` (should already be installed on any modern distribution).

For a `cmake` based build alternative see the [fork](https://github.com/jan-guenter/btop/tree/main) by @jan-guenter
<details>

<summary>

### With CMake

</summary>

1. **Install build dependencies**

Requires g++ / clang++, cmake, ninja and git

For example, with Debian Bookworm:

```bash
sudo apt install cmake git g++ ninja-build
```

2. **Clone the repository**

```bash
git clone https://github.com/aristocratos/btop.git && cd btop
``````
3. **Compile**
```bash
# Configure
cmake -B build -G Ninja
# Build
cmake --build build
```
This will automatically build a stripped release version of btop.
Some useful options to pass to the configure step:
| Configure flag | Description |
|---------------------------------|-------------------------------------------------------------------------|
| `-DCMAKE_INSTALL_PREFIX=<path>` | The installation prefix ('/usr/local' by default) |
| `-DBTOP_STATIC=<ON\|OFF>` | Enables static linking (OFF by default) |
| `-DBTOP_STRIP=<ON\|OFF>` | Strips symbols from the binary (ON by default for Release builds) |
To force a compiler, run `CXX=<compiler> cmake -B build -G Ninja`
4. **Install**
```bash
cmake --build build install
```
May require root priviliges
5. **Uninstall**
CMake doesn't generate an uninstall target by default. To remove installed files, run `cat build/install_manifest.txt | xargs rm -irv`
6. **Cleanup build directory**
```bash
cmake --build build -t clean
```
</details>
<details>
<summary>
### With Make
</summary>
1. **Install dependencies (example for Ubuntu 21.04 Hirsute)**
Expand Down Expand Up @@ -397,6 +468,8 @@ Also needs a UTF8 locale and a font that covers:
make help
```
</details>
## Compilation macOS OSX
Needs GCC 10 or higher, (GCC 11 or above strongly recommended for better CPU efficiency in the compiled binary).
Expand Down

0 comments on commit e5ba8dc

Please sign in to comment.