diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..add5152 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,117 @@ +cmake_minimum_required(VERSION 3.16) + +file(STRINGS "src/btop.cpp" BTOP_VERSION_LINE REGEX "Version[ \\t\\r\\n]*=[ \\t\\r\\n]*\"[^\"]+\"") +string(REGEX REPLACE "^.*Version[ \\t\\r\\n]*=[ \\t\\r\\n]*\"([^\"]+)\".*$" "\\1" BTOP_VERSION "${BTOP_VERSION_LINE}") + +message(STATUS "btop version: ${BTOP_VERSION}") + +project( + "btop" + VERSION ${BTOP_VERSION} + DESCRIPTION "Resource monitor that shows usage and stats for processor, memory, disks, network and processes." + HOMEPAGE_URL "https://github.com/aristocratos/btop" + LANGUAGES CXX +) + +if (CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(PLATFORM_SRCS_GLOB "src/linux/*.cpp") +elseif (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + set(PLATFORM_SRCS_GLOB "src/freebsd/*.cpp") +elseif (APPLE) + set(PLATFORM_SRCS_GLOB "src/osx/*.cpp") +else () + message(FATAL_ERROR "Unsupported System: ${CMAKE_SYSTEM_NAME}") +endif () + +file(GLOB SRCS CONFIGURE_DEPENDS "src/*.cpp" CONFIGURE_DEPENDS "${PLATFORM_SRCS_GLOB}") + +add_executable(btop ${SRCS}) + +target_include_directories(btop PRIVATE include src) +target_compile_features(btop PUBLIC cxx_std_20) + +set(THREADS_PREFER_PTHREAD_FLAG ON) +find_package(Threads REQUIRED) +target_link_libraries(btop PRIVATE Threads::Threads) + +include(CheckCXXCompilerFlag) +include(CheckLinkerFlag.cmake) + +function(target_compile_options_if_supported) + list(SUBLIST ARGV 2 -1 COMPILE_OPTIONS) + foreach (COMPILE_OPTION ${COMPILE_OPTIONS}) + string(MAKE_C_IDENTIFIER ${COMPILE_OPTION} OPTION_ID) + check_cxx_compiler_flag(${COMPILE_OPTION} CXX_COMPILER_OPTION_CHECK_${OPTION_ID}) + if (CXX_COMPILER_OPTION_CHECK_${OPTION_ID}) + target_compile_options(${ARGV0} ${ARGV1} ${COMPILE_OPTION}) + endif () + endforeach () +endfunction() + +function(target_link_options_if_supported) + list(SUBLIST ARGV 2 -1 LINK_OPTIONS) + foreach (LINK_OPTION ${LINK_OPTIONS}) + string(MAKE_C_IDENTIFIER ${LINK_OPTION} OPTION_ID) + check_linker_flag(CXX ${LINK_OPTION} CXX_LINK_OPTION_CHECK_${OPTION_ID}) + if (CXX_LINK_OPTION_CHECK_${OPTION_ID}) + target_link_options(${ARGV0} ${ARGV1} ${LINK_OPTION}) + endif () + endforeach () +endfunction() + +target_compile_options_if_supported(btop PRIVATE -Wall -Wextra -pedantic -fcf-protection -cfguard) +target_link_options_if_supported(btop PRIVATE -fexceptions -fstack-protector -fstack-clash-protection) + +if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug") + target_compile_options_if_supported(btop PRIVATE -ftree-loop-vectorize -flto) + target_link_options_if_supported(btop PRIVATE -flto -s) +endif () + +target_compile_definitions(btop PRIVATE _FORTIFY_SOURCE=2 _GLIBCXX_ASSERTIONS) + +if (APPLE) + target_link_options(btop PRIVATE -framework IOKit -framework CoreFoundation) +endif () + +option(STATIC "statically linked executable" OFF) + +if (STATIC) + set(CMAKE_REQUIRED_LINK_OPTIONS -static -Werror -Wl,--fatal-warnings) + check_cxx_source_compiles("#include + int main() { struct passwd* x = getpwuid(0); }" STATIC_GETPWUID) + if (NOT STATIC_GETPWUID) + target_compile_definitions(btop PRIVATE STATIC_BUILD) + endif () + target_link_options_if_supported(btop PRIVATE -static -static-libgcc -static-libstdc++) +endif () + +set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Nobody ") +set(CPACK_DEBIAN_PACKAGE_SECTION "utils") + +include(CPack) + +install( + TARGETS btop RUNTIME + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE +) +install( + FILES "README.md" + DESTINATION "share/btop/" + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ +) +install( + FILES "CHANGELOG.md" + DESTINATION "share/btop/" + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ +) +install( + FILES "LICENSE" + DESTINATION "share/btop/" + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ +) +install( + DIRECTORY "themes" + DESTINATION "share/btop/" + DIRECTORY_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE + FILE_PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ +) diff --git a/CheckLinkerFlag.cmake b/CheckLinkerFlag.cmake new file mode 100644 index 0000000..9448147 --- /dev/null +++ b/CheckLinkerFlag.cmake @@ -0,0 +1,68 @@ + +# CheckLinkerFlag +# ------------------ +# +# Checks whether a compiler supports a given linker flag. +# + +include(CheckCSourceCompiles) +include(CheckCXXSourceCompiles) +include(CheckFortranSourceCompiles) + +include(CMakeCheckCompilerFlagCommonPatterns) + +# FLAG: the linker flag to check +# LANGUAGE: the language to test it on. C, CXX, or Fortran +# RESULT: return variable + +macro(check_linker_flag LANGUAGE FLAG RESULT) + if (NOT DEFINED ${RESULT}) + set(OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}") + set(CMAKE_REQUIRED_FLAGS "${FLAG}") + # Normalize locale during test compilation. + set(_CheckLinkerFlag_LOCALE_VARS LC_ALL LC_MESSAGES LANG) + foreach (v ${_CheckLinkerFlag_LOCALE_VARS}) + set(_CheckLinkerFlag_SAVED_${v} "$ENV{${v}}") + set(ENV{${v}} C) + endforeach () + + CHECK_COMPILER_FLAG_COMMON_PATTERNS(_CheckLinkerFlag_COMMON_PATTERNS) + + if ("${LANGUAGE}" STREQUAL C) + + CHECK_C_SOURCE_COMPILES( + "int main(void) { return 0; }" ${RESULT} + # Some compilers do not fail with a bad flag + FAIL_REGEX "command line option .* is valid for .* but not for C" # GNU + ${_CheckLinkerFlag_COMMON_PATTERNS} + ) + elseif ("${LANGUAGE}" STREQUAL CXX) + check_cxx_source_compiles( + "int main(void) { return 0; }" ${RESULT} + # Some compilers do not fail with a bad flag + FAIL_REGEX "command line option .* is valid for .* but not for C" # GNU + ${_CheckLinkerFlag_COMMON_PATTERNS} + ) + elseif ("${LANGUAGE}" STREQUAL Fortran) + check_fortran_source_compiles( + "program test + print *, \'Hello, world\' + end program test" + ${RESULT} + # Some compilers do not fail with a bad flag + FAIL_REGEX "command line option .* is valid for .* but not for Fortran" # GNU + ${_CheckLinkerFlag_COMMON_PATTERNS}) + else () + message(FATAL_ERROR "Invalid LANGUAGE argument ${LANGUAGE}") + endif () + + foreach (v ${_CheckCCompilerFlag_LOCALE_VARS}) + set(ENV{${v}} ${_CheckCCompilerFlag_SAVED_${v}}) + unset(_CheckCCompilerFlag_SAVED_${v}) + endforeach () + unset(_CheckCCompilerFlag_LOCALE_VARS) + unset(_CheckCCompilerFlag_COMMON_PATTERNS) + + set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}") + endif () +endmacro(check_linker_flag) \ No newline at end of file diff --git a/PKGBUILD b/PKGBUILD index 37c7765..dd4d450 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -1,4 +1,5 @@ -# Maintainer: Canony +# Maintainer: Edgar +# Contributor: Canony # Contributor: Caleb Maclennan pkgname=btop @@ -8,16 +9,26 @@ pkgdesc='A monitor of system resourecs, bpytop ported to C++' arch=(x86_64 aarch64) url="https://github.com/aristocratos/$pkgname" license=(Apache) -depends=(coreutils sed ) -makedepends=(build-essential gcc-10 g++-10) +depends=(coreutils sed) +makedepends=(cmake build-essential gcc-10 g++-10) _archive="$pkgname-$pkgver" -source=("$_archive.tar.gz::$url/archive/v$pkgver.tar.gz") -sha256sums=('59a87b9d0bb0f5010d53f0ac72ddee9fd7b5a4039bce51b94b262313e946df02') - +source=("$_archive.tar.gz::$url/archive/v$pkgver.tar.gz" "CMakeLists.txt" "CheckLinkerFlag.cmake") +sha256sums=('59a87b9d0bb0f5010d53f0ac72ddee9fd7b5a4039bce51b94b262313e946df02' 'SKIP' 'SKIP') build() { cd "$_archive" - make CXX=g++-10 all + + cp -f "$srcdir/CMakeLists.txt" . + cp -f "$srcdir/CheckLinkerFlag.cmake" . + + cmake . \ + -DCMAKE_C_COMPILER=gcc-10 \ + -DCMAKE_CXX_COMPILER=g++-10 \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DSTATIC=ON + + make -j$(nproc) } package() {