From b7268268282bbed8595a204f58c2a17e61ef6692 Mon Sep 17 00:00:00 2001 From: firewave Date: Mon, 31 Mar 2025 11:04:57 +0200 Subject: [PATCH] separate handling of `Clang` and `AppleClang` in CMake [skip ci] --- Makefile | 25 +++++------------------ cmake/compilerCheck.cmake | 6 +++++- cmake/compilerDefinitions.cmake | 35 ++++++++++++++++++--------------- cmake/options.cmake | 4 ++++ lib/config.h | 2 ++ tools/dmake/dmake.cpp | 26 +++++------------------- 6 files changed, 40 insertions(+), 58 deletions(-) diff --git a/Makefile b/Makefile index 37156d357af..f9f9dc1973b 100644 --- a/Makefile +++ b/Makefile @@ -45,7 +45,6 @@ endif RDYNAMIC?=-rdynamic # Set the CPPCHK_GLIBCXX_DEBUG flag. This flag is not used in release Makefiles. -# The _GLIBCXX_DEBUG define doesn't work in Cygwin or other Win32 systems. ifndef COMSPEC ifeq ($(VERBOSE),1) $(info COMSPEC not found) @@ -74,10 +73,7 @@ ifdef WINNT ifeq ($(VERBOSE),1) $(info WINNT found) endif - #### Maybe Windows - ifndef CPPCHK_GLIBCXX_DEBUG - CPPCHK_GLIBCXX_DEBUG= - endif # !CPPCHK_GLIBCXX_DEBUG + #### May be Windows ifeq ($(VERBOSE),1) $(info MSYSTEM=$(MSYSTEM)) @@ -99,22 +95,14 @@ else # !WINNT $(info uname_S=$(uname_S)) endif - ifeq ($(uname_S),Linux) - ifndef CPPCHK_GLIBCXX_DEBUG - CPPCHK_GLIBCXX_DEBUG=-D_GLIBCXX_DEBUG - endif # !CPPCHK_GLIBCXX_DEBUG - endif # Linux - - ifeq ($(uname_S),GNU/kFreeBSD) - ifndef CPPCHK_GLIBCXX_DEBUG - CPPCHK_GLIBCXX_DEBUG=-D_GLIBCXX_DEBUG - endif # !CPPCHK_GLIBCXX_DEBUG - endif # GNU/kFreeBSD - LDFLAGS+=-pthread endif # WINNT +ifndef CPPCHK_GLIBCXX_DEBUG + CPPCHK_GLIBCXX_DEBUG=-D_GLIBCXX_DEBUG +endif # !CPPCHK_GLIBCXX_DEBUG + ifdef CYGWIN ifeq ($(VERBOSE),1) $(info CYGWIN found) @@ -128,9 +116,6 @@ ifndef CXX CXX=g++ endif -ifeq (clang++, $(findstring clang++,$(CXX))) - CPPCHK_GLIBCXX_DEBUG= -endif ifndef CXXFLAGS CXXFLAGS=-pedantic -Wall -Wextra -Wcast-qual -Wfloat-equal -Wmissing-declarations -Wmissing-format-attribute -Wno-long-long -Wpacked -Wredundant-decls -Wundef -Wno-sign-compare -Wno-multichar -Woverloaded-virtual -g endif diff --git a/cmake/compilerCheck.cmake b/cmake/compilerCheck.cmake index 47c8fc1245e..beb154db5eb 100644 --- a/cmake/compilerCheck.cmake +++ b/cmake/compilerCheck.cmake @@ -2,12 +2,16 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1) message(ERROR "GCC >= 5.1 required - detected ${CMAKE_CXX_COMPILER_VERSION} not supported") endif() -elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.5) message(ERROR "Clang >= 3.5 required - detected ${CMAKE_CXX_COMPILER_VERSION} not supported") endif() +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + # TODO: AppleClang versions do not align with Clang versions - add check for proper version elseif(MSVC) if(MSVC_VERSION VERSION_LESS 1900) message(ERROR "Visual Studio >= 2015 (19.0) required - detected ${MSVC_VERSION} not supported") endif() +else() + message(WARNING "Unknown compiler ${CMAKE_CXX_COMPILER_ID}") endif() diff --git a/cmake/compilerDefinitions.cmake b/cmake/compilerDefinitions.cmake index 4967c282336..123280eee21 100644 --- a/cmake/compilerDefinitions.cmake +++ b/cmake/compilerDefinitions.cmake @@ -8,27 +8,30 @@ if(MSVC) add_definitions(-DWIN32_LEAN_MEAN) endif() -# TODO: this should probably apply to the compiler and not the platform - I think it is only "broken" with MinGW -# TODO: AppleClang only has libc++ -# TODO: what about clang-cl and native Win32 clang? -if(CPPCHK_GLIBCXX_DEBUG AND UNIX AND CMAKE_BUILD_TYPE STREQUAL "Debug") - if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - if(USE_LIBCXX) - if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 18) - add_definitions(-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG) - else() - add_definitions(-D_LIBCPP_ENABLE_ASSERTIONS=1) - endif() - # TODO: also add _LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS? - endif() - else() - # TODO: check if this can be enabled again for Clang - also done in Makefile +# libstdc++-specific flags +if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR (NOT USE_LIBCXX AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")) + if(CPPCHK_GLIBCXX_DEBUG AND CMAKE_BUILD_TYPE STREQUAL "Debug") add_definitions(-D_GLIBCXX_DEBUG) endif() endif() -if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND USE_LIBCXX) +# TODO: what about clang-cl? +# libc++-specific flags - AppleClang only has libc++ +if ((USE_LIBCXX AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") add_definitions(-D_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) + + if(CPPCHK_GLIBCXX_DEBUG AND CMAKE_BUILD_TYPE STREQUAL "Debug") + # TODO: AppleClang versions do not align with Clang versions - add check for proper version + if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 18) + add_definitions(-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG) + else() + add_definitions(-D_LIBCPP_ENABLE_ASSERTIONS=1) + endif() + # TODO: also add _LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS? + else() + # TODO: check if this can be enabled again for Clang - also done in Makefile + add_definitions(-D_GLIBCXX_DEBUG) + endif() endif() if(HAVE_RULES) diff --git a/cmake/options.cmake b/cmake/options.cmake index 7de7cb360f6..35de2b6b4d2 100644 --- a/cmake/options.cmake +++ b/cmake/options.cmake @@ -104,6 +104,10 @@ if (NOT USE_BOOST AND USE_BOOST_INT128) endif() option(USE_LIBCXX "Use libc++ instead of libstdc++" OFF) +if(USE_LIBCXX AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") + message(FATAL_ERROR "libc++ can only be used with a Clang-based compiler") +endif() + option(NO_UNIX_SIGNAL_HANDLING "Disable usage of Unix Signal Handling" OFF) option(NO_UNIX_BACKTRACE_SUPPORT "Disable usage of Unix Backtrace support" OFF) option(NO_WINDOWS_SEH "Disable usage of Windows SEH" OFF) diff --git a/lib/config.h b/lib/config.h index 1b217e4546d..57ac39cc59f 100644 --- a/lib/config.h +++ b/lib/config.h @@ -96,6 +96,7 @@ # define UNUSED #endif +// TODO: AppleClang versions do not align with Clang versions - add check for proper version // warn_unused #if __has_cpp_attribute (gnu::warn_unused) || \ (defined(__clang__) && (__clang_major__ >= 15)) @@ -115,6 +116,7 @@ # define DEPRECATED #endif +// TODO: AppleClang versions do not align with Clang versions - add check for proper version // returns_nonnull #if __has_cpp_attribute (gnu::returns_nonnull) # define RET_NONNULL [[gnu::returns_nonnull]] diff --git a/tools/dmake/dmake.cpp b/tools/dmake/dmake.cpp index f8869f2eba7..f153cd4dc6b 100644 --- a/tools/dmake/dmake.cpp +++ b/tools/dmake/dmake.cpp @@ -638,7 +638,6 @@ int main(int argc, char **argv) // The _GLIBCXX_DEBUG doesn't work in cygwin or other Win32 systems. fout << "# Set the CPPCHK_GLIBCXX_DEBUG flag. This flag is not used in release Makefiles.\n" - << "# The _GLIBCXX_DEBUG define doesn't work in Cygwin or other Win32 systems.\n" << "ifndef COMSPEC\n" << " ifeq ($(VERBOSE),1)\n" << " $(info COMSPEC not found)\n" @@ -667,10 +666,7 @@ int main(int argc, char **argv) << " ifeq ($(VERBOSE),1)\n" << " $(info WINNT found)\n" << " endif\n" - << " #### Maybe Windows\n" - << " ifndef CPPCHK_GLIBCXX_DEBUG\n" - << " CPPCHK_GLIBCXX_DEBUG=\n" - << " endif # !CPPCHK_GLIBCXX_DEBUG\n" + << " #### May be Windows\n" << "\n" << " ifeq ($(VERBOSE),1)\n" << " $(info MSYSTEM=$(MSYSTEM))\n" @@ -692,21 +688,13 @@ int main(int argc, char **argv) << " $(info uname_S=$(uname_S))\n" << " endif\n" << "\n" - << " ifeq ($(uname_S),Linux)\n" - << " ifndef CPPCHK_GLIBCXX_DEBUG\n" - << " CPPCHK_GLIBCXX_DEBUG=-D_GLIBCXX_DEBUG\n" - << " endif # !CPPCHK_GLIBCXX_DEBUG\n" - << " endif # Linux\n" - << "\n" - << " ifeq ($(uname_S),GNU/kFreeBSD)\n" - << " ifndef CPPCHK_GLIBCXX_DEBUG\n" - << " CPPCHK_GLIBCXX_DEBUG=-D_GLIBCXX_DEBUG\n" - << " endif # !CPPCHK_GLIBCXX_DEBUG\n" - << " endif # GNU/kFreeBSD\n" - << "\n" << " LDFLAGS+=-pthread\n" << "\n" << "endif # WINNT\n" + << "\n" + << "ifndef CPPCHK_GLIBCXX_DEBUG\n" + << " CPPCHK_GLIBCXX_DEBUG=-D_GLIBCXX_DEBUG\n" + << "endif # !CPPCHK_GLIBCXX_DEBUG\n" << "\n"; fout << "ifdef CYGWIN\n" @@ -719,11 +707,7 @@ int main(int argc, char **argv) << "endif # CYGWIN\n" << "\n"; - // skip "-D_GLIBCXX_DEBUG" if clang, since it breaks the build makeConditionalVariable(fout, "CXX", "g++"); - fout << "ifeq (clang++, $(findstring clang++,$(CXX)))\n" - << " CPPCHK_GLIBCXX_DEBUG=\n" - << "endif\n"; // Makefile settings.. if (release) {