blob: bd0b3527d1b08d18b09c5f7f8725f397f53ec168 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
# HyBBX toolchain detection and portable warning flags.
#
# Supported compilers: GCC (primary), LLVM Clang.
# Supported OS families: Linux, *BSD (FreeBSD, NetBSD, OpenBSD, …), MacOS X+,
# Windows 10+ (MinGW/Clang), AmigaOS 3.9+ (cross-GCC). POSIX+ friendly.
include(CheckCCompilerFlag)
set(HYBBX_COMPILER_GCC FALSE)
set(HYBBX_COMPILER_CLANG FALSE)
set(HYBBX_COMPILER_APPLECLANG FALSE)
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
set(HYBBX_COMPILER_GCC TRUE)
elseif(CMAKE_C_COMPILER_ID STREQUAL "Clang")
if(CMAKE_C_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
message(FATAL_ERROR "HyBBX requires GCC or Clang.")
endif()
set(HYBBX_COMPILER_CLANG TRUE)
elseif(CMAKE_C_COMPILER_ID STREQUAL "AppleClang")
set(HYBBX_COMPILER_CLANG TRUE)
set(HYBBX_COMPILER_APPLECLANG TRUE)
elseif(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
message(FATAL_ERROR "HyBBX requires GCC or Clang.")
else()
message(WARNING
"HyBBX is developed with GCC (primary) and Clang. "
"Compiler '${CMAKE_C_COMPILER_ID}' is untested.")
endif()
function(hybbx_probe_c_flag flag out_var)
string(REGEX REPLACE "[^a-zA-Z0-9]+" "_" flag_id "${flag}")
set(cache_var "HYBBX_C_FLAG_${flag_id}")
if(NOT DEFINED ${cache_var})
check_c_compiler_flag("${flag}" ${cache_var})
endif()
if(${cache_var})
set(${out_var} TRUE PARENT_SCOPE)
else()
set(${out_var} FALSE PARENT_SCOPE)
endif()
endfunction()
function(hybbx_collect_supported_c_flags)
set(_candidates
-Wall
-Wextra
-Wpedantic
-Wformat=2
-Wstrict-prototypes
-Wmissing-prototypes
-Wwrite-strings
-Wshadow
-fno-strict-aliasing
)
if(NOT HYBBX_PLATFORM_AMIGAOS)
list(APPEND _candidates -fstack-protector-strong)
endif()
if(HYBBX_COMPILER_GCC)
list(APPEND _candidates
-Wduplicated-cond
-Wnull-dereference
-Wlogical-op
-Wformat-signedness
)
if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 8.0 AND NOT HYBBX_PLATFORM_AMIGAOS)
list(APPEND _candidates -fstack-clash-protection)
endif()
endif()
if(HYBBX_COMPILER_CLANG AND NOT HYBBX_COMPILER_APPLECLANG)
list(APPEND _candidates -Wno-gnu-zero-variadic-macro-arguments)
endif()
set(_supported "")
foreach(flag IN LISTS _candidates)
hybbx_probe_c_flag("${flag}" _ok)
if(_ok)
list(APPEND _supported "${flag}")
endif()
endforeach()
set(HYBBX_SUPPORTED_C_FLAGS "${_supported}" CACHE INTERNAL
"C warning/security flags supported by ${CMAKE_C_COMPILER_ID}")
endfunction()
hybbx_collect_supported_c_flags()
if(HYBBX_COMPILER_GCC)
message(STATUS "HyBBX compiler: GCC ${CMAKE_C_COMPILER_VERSION} (primary)")
elseif(HYBBX_COMPILER_CLANG)
message(STATUS "HyBBX compiler: Clang ${CMAKE_C_COMPILER_VERSION}")
else()
message(STATUS "HyBBX compiler: ${CMAKE_C_COMPILER_ID} ${CMAKE_C_COMPILER_VERSION}")
endif()
|