Support compiling with clang 16 or above. Bug: https://bugs.gentoo.org/839318 Upstream Commit: https://github.com/aristocratos/btop/commit/7e50b03e391a346b2b6ce92be332c58d91f75a000w With hunks from: From af7d5086fce8d995f3f8b10677d107a1124a12bf Mon Sep 17 00:00:00 2001 From: "Jakob P. Liljenberg" Date: Thu, 15 Jun 2023 17:45:05 +0200 Subject: [PATCH] Merge pull request #510 from nobounce/LLVM --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -#* Btop++ makefile v1.5 +#* Btop++ makefile v1.6 BANNER = \n \033[38;5;196m██████\033[38;5;240m╗ \033[38;5;196m████████\033[38;5;240m╗ \033[38;5;196m██████\033[38;5;240m╗ \033[38;5;196m██████\033[38;5;240m╗\n \033[38;5;160m██\033[38;5;239m╔══\033[38;5;160m██\033[38;5;239m╗╚══\033[38;5;160m██\033[38;5;239m╔══╝\033[38;5;160m██\033[38;5;239m╔═══\033[38;5;160m██\033[38;5;239m╗\033[38;5;160m██\033[38;5;239m╔══\033[38;5;160m██\033[38;5;239m╗ \033[38;5;160m██\033[38;5;239m╗ \033[38;5;160m██\033[38;5;239m╗\n \033[38;5;124m██████\033[38;5;238m╔╝ \033[38;5;124m██\033[38;5;238m║ \033[38;5;124m██\033[38;5;238m║ \033[38;5;124m██\033[38;5;238m║\033[38;5;124m██████\033[38;5;238m╔╝ \033[38;5;124m██████\033[38;5;238m╗\033[38;5;124m██████\033[38;5;238m╗\n \033[38;5;88m██\033[38;5;237m╔══\033[38;5;88m██\033[38;5;237m╗ \033[38;5;88m██\033[38;5;237m║ \033[38;5;88m██\033[38;5;237m║ \033[38;5;88m██\033[38;5;237m║\033[38;5;88m██\033[38;5;237m╔═══╝ ╚═\033[38;5;88m██\033[38;5;237m╔═╝╚═\033[38;5;88m██\033[38;5;237m╔═╝\n \033[38;5;52m██████\033[38;5;236m╔╝ \033[38;5;52m██\033[38;5;236m║ ╚\033[38;5;52m██████\033[38;5;236m╔╝\033[38;5;52m██\033[38;5;236m║ ╚═╝ ╚═╝\n \033[38;5;235m╚═════╝ ╚═╝ ╚═════╝ ╚═╝ \033[1;3;38;5;240mMakefile v1.5\033[0m @@ -39,6 +39,46 @@ endif override PLATFORM_LC := $(shell echo $(PLATFORM) | tr '[:upper:]' '[:lower:]') +#? Compiler and Linker +ifeq ($(shell $(CXX) --version | grep clang >/dev/null 2>&1; echo $$?),0) + override CXX_IS_CLANG := true +endif +override CXX_VERSION := $(shell $(CXX) -dumpfullversion -dumpversion || echo 0) +override CXX_VERSION_MAJOR := $(shell echo $(CXX_VERSION) | cut -d '.' -f 1) + +CLANG_WORKS = false +GCC_WORKS = false + +#? Supported is Clang 16.0.0 and later +ifeq ($(CXX_IS_CLANG),true) + ifneq ($(shell test $(CXX_VERSION_MAJOR) -lt 16; echo $$?),0) + CLANG_WORKS := true + endif +endif +ifeq ($(CLANG_WORKS),false) + #? Try to find a newer GCC version + ifeq ($(shell command -v g++-12 >/dev/null; echo $$?),0) + CXX := g++-12 + else ifeq ($(shell command -v g++-11 >/dev/null; echo $$?),0) + CXX := g++-11 + else ifeq ($(shell command -v g++11 >/dev/null; echo $$?),0) + CXX := g++11 + else ifeq ($(shell command -v g++ >/dev/null; echo $$?),0) + CXX := g++ + endif + override CXX_VERSION := $(shell $(CXX) -dumpfullversion -dumpversion || echo 0) + override CXX_VERSION_MAJOR := $(shell echo $(CXX_VERSION) | cut -d '.' -f 1) + ifneq ($(shell test $(CXX_VERSION_MAJOR) -lt 10; echo $$?),0) + GCC_WORKS := true + endif +endif + +ifeq ($(CLANG_WORKS),false) + ifeq ($(GCC_WORKS),false) +$(error $(shell printf "\033[1;91mERROR: \033[97mCompiler too old. (Requires Clang 16.0.0, GCC 10.1.0)\033[0m")) + endif +endif + #? Any flags added to TESTFLAGS must not contain whitespace for the testing to work override TESTFLAGS := -fexceptions -fstack-clash-protection -fcf-protection ifneq ($(PLATFORM) $(ARCH),macos arm64) @@ -46,7 +86,13 @@ ifneq ($(PLATFORM) $(ARCH),macos arm64) endif ifeq ($(STATIC),true) - override ADDFLAGS += -static-libgcc -static-libstdc++ + ifeq ($(CXX_IS_CLANG),true) + ifeq ($(shell $(CXX) -print-target-triple | grep gnu >/dev/null; echo $$?),0) +$(error $(shell printf "\033[1;91mERROR: \033[97m$(CXX) can't statically link glibc\033[0m")) + endif + else + override ADDFLAGS += -static-libgcc -static-libstdc++ + endif ifneq ($(PLATFORM),macos) override ADDFLAGS += -DSTATIC_BUILD -static -Wl,--fatal-warnings endif @@ -62,33 +108,6 @@ else override VERBOSE := true endif -#? Compiler and Linker -ifeq ($(shell command -v g++-12 >/dev/null; echo $$?),0) - CXX := g++-12 -else ifeq ($(shell command -v g++-11 >/dev/null; echo $$?),0) - CXX := g++-11 -else ifeq ($(shell command -v g++11 >/dev/null; echo $$?),0) - CXX := g++11 -else ifeq ($(shell command -v g++ >/dev/null; echo $$?),0) - CXX := g++ -endif -override CXX_VERSION := $(shell $(CXX) -dumpfullversion -dumpversion || echo 0) - -#? Try to make sure we are using GCC/G++ version 11 or later if not instructed to use g++-10 -ifeq ($(CXX),g++) - ifeq ($(shell g++ --version | grep clang >/dev/null 2>&1; echo $$?),0) - V_MAJOR := 0 - else - V_MAJOR := $(shell echo $(CXX_VERSION) | cut -f1 -d".") - endif - ifneq ($(shell test $(V_MAJOR) -ge 11; echo $$?),0) - ifeq ($(shell command -v g++-11 >/dev/null; echo $$?),0) - override CXX := g++-11 - override CXX_VERSION := $(shell $(CXX) -dumpfullversion -dumpversion || echo 0) - endif - endif -endif - #? Pull in platform specific source files and get thread count ifeq ($(PLATFORM_LC),linux) PLATFORM_DIR := linux @@ -115,6 +134,13 @@ ifeq ($(THREADS),1) override THREADS := auto endif +#? LTO command line +ifeq ($(CLANG_WORKS),true) + LTO := thin +else + LTO := $(THREADS) +endif + #? The Directories, Source, Includes, Objects and Binary SRCDIR := src INCDIR := include @@ -130,8 +156,8 @@ override GOODFLAGS := $(foreach flag,$(TESTFLAGS),$(strip $(shell echo "int main #? Flags, Libraries and Includes override REQFLAGS := -std=c++20 WARNFLAGS := -Wall -Wextra -pedantic -OPTFLAGS := -O2 -ftree-loop-vectorize -flto=$(THREADS) +OPTFLAGS := -O2 -ftree-vectorize -flto=$(LTO) LDCXXFLAGS := -pthread -D_FORTIFY_SOURCE=2 -D_GLIBCXX_ASSERTIONS -D_FILE_OFFSET_BITS=64 $(GOODFLAGS) $(ADDFLAGS) override CXXFLAGS += $(REQFLAGS) $(LDCXXFLAGS) $(OPTFLAGS) $(WARNFLAGS) override LDFLAGS += $(LDCXXFLAGS) $(OPTFLAGS) $(WARNFLAGS) INC := -I$(INCDIR) -I$(SRCDIR) --- a/src/btop.cpp +++ b/src/btop.cpp @@ -37,6 +37,11 @@ tab-size = 4 #include #include #endif +#if !defined(__clang__) && __GNUC__ < 11 + #include +#else + #include +#endif #include #include @@ -321,14 +326,12 @@ namespace Runner { atomic coreNum_reset (false); //* Setup semaphore for triggering thread to do work -#if __GNUC__ < 11 - #include +#if !defined(__clang__) && __GNUC__ < 11 sem_t do_work; inline void thread_sem_init() { sem_init(&do_work, 0, 0); } inline void thread_wait() { sem_wait(&do_work); } inline void thread_trigger() { sem_post(&do_work); } #else - #include std::binary_semaphore do_work(0); inline void thread_sem_init() { ; } inline void thread_wait() { do_work.acquire(); } --- a/src/btop_tools.cpp +++ b/src/btop_tools.cpp @@ -17,6 +17,7 @@ tab-size = 4 */ #include +#include #include #include #include --- a/src/btop.cpp +++ b/src/btop.cpp @@ -657,7 +657,7 @@ namespace Runner { << Term::sync_end << flush; } //* ----------------------------------------------- THREAD LOOP ----------------------------------------------- - pthread_exit(NULL); + return {}; } //? ------------------------------------------ Secondary thread end ----------------------------------------------- -- 2.41.0