1# First step is to inherit all properties from gcc, as clang is compatible with most flags.
2include(${ZEPHYR_BASE}/cmake/compiler/gcc/compiler_flags.cmake)
3
4# Now, let's overwrite the flags that are different in clang.
5
6# No property flag, clang doesn't understand fortify at all
7set_compiler_property(PROPERTY security_fortify_compile_time)
8set_compiler_property(PROPERTY security_fortify_run_time)
9
10# No printf-return-value optimizations in clang
11set_compiler_property(PROPERTY no_printf_return_value)
12
13# No property flag, this is used by the POSIX arch based targets when building with the host libC,
14# But clang has problems compiling these with -fno-freestanding.
15check_set_compiler_property(PROPERTY hosted)
16
17# clang flags for coverage generation
18if (CONFIG_COVERAGE_NATIVE_SOURCE)
19  set_compiler_property(PROPERTY coverage -fprofile-instr-generate -fcoverage-mapping)
20else()
21  set_compiler_property(PROPERTY coverage --coverage -fno-inline)
22endif()
23
24# clang flag for colourful diagnostic messages
25set_compiler_property(PROPERTY diagnostic -fcolor-diagnostics)
26
27# clang flag to save temporary object files
28set_compiler_property(PROPERTY save_temps -save-temps)
29
30# clang doesn't handle the -T flag
31set_compiler_property(PROPERTY linker_script -Wl,-T)
32
33#######################################################
34# This section covers flags related to warning levels #
35#######################################################
36
37# clang option standard warning base in Zephyr
38check_set_compiler_property(PROPERTY warning_base
39                            -Wall
40                            -Wformat
41                            -Wformat-security
42                            -Wno-format-zero-length
43                            -Wno-unused-but-set-variable
44                            -Wno-typedef-redefinition
45                            -Wno-deprecated-non-prototype
46)
47
48# C implicit promotion rules will want to make floats into doubles very easily
49check_set_compiler_property(APPEND PROPERTY warning_base -Wdouble-promotion)
50
51check_set_compiler_property(APPEND PROPERTY warning_base -Wno-pointer-sign)
52
53# Prohibit void pointer arithmetic. Illegal in C99
54check_set_compiler_property(APPEND PROPERTY warning_base -Wpointer-arith)
55
56# clang options for warning levels 1, 2, 3, when using `-DW=[1|2|3]`
57set_compiler_property(PROPERTY warning_dw_1
58                      -Wextra
59                      -Wunused
60                      -Wno-unused-parameter
61                      -Wmissing-declarations
62                      -Wmissing-format-attribute
63)
64check_set_compiler_property(APPEND PROPERTY warning_dw_1
65                            -Wold-style-definition
66                            -Wmissing-prototypes
67                            -Wmissing-include-dirs
68                            -Wunused-but-set-variable
69                            -Wno-missing-field-initializers
70)
71
72set_compiler_property(PROPERTY warning_dw_2
73                      -Waggregate-return
74                      -Wcast-align
75                      -Wdisabled-optimization
76                      -Wnested-externs
77                      -Wshadow
78)
79
80check_set_compiler_property(APPEND PROPERTY warning_dw_2
81                            -Wlogical-op
82                            -Wmissing-field-initializers
83)
84
85set_compiler_property(PROPERTY warning_dw_3
86                      -Wbad-function-cast
87                      -Wcast-qual
88                      -Wconversion
89                      -Wpacked
90                      -Wpadded
91                      -Wpointer-arith
92                      -Wredundant-decls
93                      -Wswitch-default
94)
95
96check_set_compiler_property(APPEND PROPERTY warning_dw_3
97                            -Wpacked-bitfield-compat
98                            -Wvla
99)
100
101
102check_set_compiler_property(PROPERTY warning_extended
103                            #FIXME: need to fix all of those
104                            -Wno-sometimes-uninitialized
105                            -Wno-shift-overflow
106                            -Wno-missing-braces
107                            -Wno-self-assign
108                            -Wno-address-of-packed-member
109                            -Wno-unused-function
110                            -Wno-initializer-overrides
111                            -Wno-section
112                            -Wno-unknown-warning-option
113                            -Wno-unused-variable
114                            -Wno-format-invalid-specifier
115                            -Wno-gnu
116                            # comparison of unsigned expression < 0 is always false
117                            -Wno-tautological-compare
118)
119
120set_compiler_property(PROPERTY warning_error_coding_guideline
121                      -Werror=vla
122                      -Wimplicit-fallthrough
123                      -Wconversion
124                      -Woverride-init
125)
126
127set_compiler_property(PROPERTY no_global_merge "-mno-global-merge")
128