Skip to content

Commit b726826

Browse files
committed
separate handling of Clang and AppleClang in CMake [skip ci]
1 parent 15424d0 commit b726826

6 files changed

Lines changed: 40 additions & 58 deletions

File tree

Makefile

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ endif
4545

4646
RDYNAMIC?=-rdynamic
4747
# Set the CPPCHK_GLIBCXX_DEBUG flag. This flag is not used in release Makefiles.
48-
# The _GLIBCXX_DEBUG define doesn't work in Cygwin or other Win32 systems.
4948
ifndef COMSPEC
5049
ifeq ($(VERBOSE),1)
5150
$(info COMSPEC not found)
@@ -74,10 +73,7 @@ ifdef WINNT
7473
ifeq ($(VERBOSE),1)
7574
$(info WINNT found)
7675
endif
77-
#### Maybe Windows
78-
ifndef CPPCHK_GLIBCXX_DEBUG
79-
CPPCHK_GLIBCXX_DEBUG=
80-
endif # !CPPCHK_GLIBCXX_DEBUG
76+
#### May be Windows
8177

8278
ifeq ($(VERBOSE),1)
8379
$(info MSYSTEM=$(MSYSTEM))
@@ -99,22 +95,14 @@ else # !WINNT
9995
$(info uname_S=$(uname_S))
10096
endif
10197

102-
ifeq ($(uname_S),Linux)
103-
ifndef CPPCHK_GLIBCXX_DEBUG
104-
CPPCHK_GLIBCXX_DEBUG=-D_GLIBCXX_DEBUG
105-
endif # !CPPCHK_GLIBCXX_DEBUG
106-
endif # Linux
107-
108-
ifeq ($(uname_S),GNU/kFreeBSD)
109-
ifndef CPPCHK_GLIBCXX_DEBUG
110-
CPPCHK_GLIBCXX_DEBUG=-D_GLIBCXX_DEBUG
111-
endif # !CPPCHK_GLIBCXX_DEBUG
112-
endif # GNU/kFreeBSD
113-
11498
LDFLAGS+=-pthread
11599

116100
endif # WINNT
117101

102+
ifndef CPPCHK_GLIBCXX_DEBUG
103+
CPPCHK_GLIBCXX_DEBUG=-D_GLIBCXX_DEBUG
104+
endif # !CPPCHK_GLIBCXX_DEBUG
105+
118106
ifdef CYGWIN
119107
ifeq ($(VERBOSE),1)
120108
$(info CYGWIN found)
@@ -128,9 +116,6 @@ ifndef CXX
128116
CXX=g++
129117
endif
130118

131-
ifeq (clang++, $(findstring clang++,$(CXX)))
132-
CPPCHK_GLIBCXX_DEBUG=
133-
endif
134119
ifndef CXXFLAGS
135120
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
136121
endif

cmake/compilerCheck.cmake

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
22
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1)
33
message(ERROR "GCC >= 5.1 required - detected ${CMAKE_CXX_COMPILER_VERSION} not supported")
44
endif()
5-
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
5+
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
66
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.5)
77
message(ERROR "Clang >= 3.5 required - detected ${CMAKE_CXX_COMPILER_VERSION} not supported")
88
endif()
9+
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
10+
# TODO: AppleClang versions do not align with Clang versions - add check for proper version
911
elseif(MSVC)
1012
if(MSVC_VERSION VERSION_LESS 1900)
1113
message(ERROR "Visual Studio >= 2015 (19.0) required - detected ${MSVC_VERSION} not supported")
1214
endif()
15+
else()
16+
message(WARNING "Unknown compiler ${CMAKE_CXX_COMPILER_ID}")
1317
endif()

cmake/compilerDefinitions.cmake

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,30 @@ if(MSVC)
88
add_definitions(-DWIN32_LEAN_MEAN)
99
endif()
1010

11-
# TODO: this should probably apply to the compiler and not the platform - I think it is only "broken" with MinGW
12-
# TODO: AppleClang only has libc++
13-
# TODO: what about clang-cl and native Win32 clang?
14-
if(CPPCHK_GLIBCXX_DEBUG AND UNIX AND CMAKE_BUILD_TYPE STREQUAL "Debug")
15-
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
16-
if(USE_LIBCXX)
17-
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 18)
18-
add_definitions(-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG)
19-
else()
20-
add_definitions(-D_LIBCPP_ENABLE_ASSERTIONS=1)
21-
endif()
22-
# TODO: also add _LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS?
23-
endif()
24-
else()
25-
# TODO: check if this can be enabled again for Clang - also done in Makefile
11+
# libstdc++-specific flags
12+
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR (NOT USE_LIBCXX AND CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
13+
if(CPPCHK_GLIBCXX_DEBUG AND CMAKE_BUILD_TYPE STREQUAL "Debug")
2614
add_definitions(-D_GLIBCXX_DEBUG)
2715
endif()
2816
endif()
2917

30-
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND USE_LIBCXX)
18+
# TODO: what about clang-cl?
19+
# libc++-specific flags - AppleClang only has libc++
20+
if ((USE_LIBCXX AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
3121
add_definitions(-D_LIBCPP_REMOVE_TRANSITIVE_INCLUDES)
22+
23+
if(CPPCHK_GLIBCXX_DEBUG AND CMAKE_BUILD_TYPE STREQUAL "Debug")
24+
# TODO: AppleClang versions do not align with Clang versions - add check for proper version
25+
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 18)
26+
add_definitions(-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG)
27+
else()
28+
add_definitions(-D_LIBCPP_ENABLE_ASSERTIONS=1)
29+
endif()
30+
# TODO: also add _LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS?
31+
else()
32+
# TODO: check if this can be enabled again for Clang - also done in Makefile
33+
add_definitions(-D_GLIBCXX_DEBUG)
34+
endif()
3235
endif()
3336

3437
if(HAVE_RULES)

cmake/options.cmake

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ if (NOT USE_BOOST AND USE_BOOST_INT128)
104104
endif()
105105
option(USE_LIBCXX "Use libc++ instead of libstdc++" OFF)
106106

107+
if(USE_LIBCXX AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
108+
message(FATAL_ERROR "libc++ can only be used with a Clang-based compiler")
109+
endif()
110+
107111
option(NO_UNIX_SIGNAL_HANDLING "Disable usage of Unix Signal Handling" OFF)
108112
option(NO_UNIX_BACKTRACE_SUPPORT "Disable usage of Unix Backtrace support" OFF)
109113
option(NO_WINDOWS_SEH "Disable usage of Windows SEH" OFF)

lib/config.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@
9696
# define UNUSED
9797
#endif
9898

99+
// TODO: AppleClang versions do not align with Clang versions - add check for proper version
99100
// warn_unused
100101
#if __has_cpp_attribute (gnu::warn_unused) || \
101102
(defined(__clang__) && (__clang_major__ >= 15))
@@ -115,6 +116,7 @@
115116
# define DEPRECATED
116117
#endif
117118

119+
// TODO: AppleClang versions do not align with Clang versions - add check for proper version
118120
// returns_nonnull
119121
#if __has_cpp_attribute (gnu::returns_nonnull)
120122
# define RET_NONNULL [[gnu::returns_nonnull]]

tools/dmake/dmake.cpp

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,6 @@ int main(int argc, char **argv)
638638

639639
// The _GLIBCXX_DEBUG doesn't work in cygwin or other Win32 systems.
640640
fout << "# Set the CPPCHK_GLIBCXX_DEBUG flag. This flag is not used in release Makefiles.\n"
641-
<< "# The _GLIBCXX_DEBUG define doesn't work in Cygwin or other Win32 systems.\n"
642641
<< "ifndef COMSPEC\n"
643642
<< " ifeq ($(VERBOSE),1)\n"
644643
<< " $(info COMSPEC not found)\n"
@@ -667,10 +666,7 @@ int main(int argc, char **argv)
667666
<< " ifeq ($(VERBOSE),1)\n"
668667
<< " $(info WINNT found)\n"
669668
<< " endif\n"
670-
<< " #### Maybe Windows\n"
671-
<< " ifndef CPPCHK_GLIBCXX_DEBUG\n"
672-
<< " CPPCHK_GLIBCXX_DEBUG=\n"
673-
<< " endif # !CPPCHK_GLIBCXX_DEBUG\n"
669+
<< " #### May be Windows\n"
674670
<< "\n"
675671
<< " ifeq ($(VERBOSE),1)\n"
676672
<< " $(info MSYSTEM=$(MSYSTEM))\n"
@@ -692,21 +688,13 @@ int main(int argc, char **argv)
692688
<< " $(info uname_S=$(uname_S))\n"
693689
<< " endif\n"
694690
<< "\n"
695-
<< " ifeq ($(uname_S),Linux)\n"
696-
<< " ifndef CPPCHK_GLIBCXX_DEBUG\n"
697-
<< " CPPCHK_GLIBCXX_DEBUG=-D_GLIBCXX_DEBUG\n"
698-
<< " endif # !CPPCHK_GLIBCXX_DEBUG\n"
699-
<< " endif # Linux\n"
700-
<< "\n"
701-
<< " ifeq ($(uname_S),GNU/kFreeBSD)\n"
702-
<< " ifndef CPPCHK_GLIBCXX_DEBUG\n"
703-
<< " CPPCHK_GLIBCXX_DEBUG=-D_GLIBCXX_DEBUG\n"
704-
<< " endif # !CPPCHK_GLIBCXX_DEBUG\n"
705-
<< " endif # GNU/kFreeBSD\n"
706-
<< "\n"
707691
<< " LDFLAGS+=-pthread\n"
708692
<< "\n"
709693
<< "endif # WINNT\n"
694+
<< "\n"
695+
<< "ifndef CPPCHK_GLIBCXX_DEBUG\n"
696+
<< " CPPCHK_GLIBCXX_DEBUG=-D_GLIBCXX_DEBUG\n"
697+
<< "endif # !CPPCHK_GLIBCXX_DEBUG\n"
710698
<< "\n";
711699

712700
fout << "ifdef CYGWIN\n"
@@ -719,11 +707,7 @@ int main(int argc, char **argv)
719707
<< "endif # CYGWIN\n"
720708
<< "\n";
721709

722-
// skip "-D_GLIBCXX_DEBUG" if clang, since it breaks the build
723710
makeConditionalVariable(fout, "CXX", "g++");
724-
fout << "ifeq (clang++, $(findstring clang++,$(CXX)))\n"
725-
<< " CPPCHK_GLIBCXX_DEBUG=\n"
726-
<< "endif\n";
727711

728712
// Makefile settings..
729713
if (release) {

0 commit comments

Comments
 (0)