Add: [NewGRF] Vehicle prop that allows refittability based on cargo class intersection.
[openttd-github.git] / cmake / CompileFlags.cmake
blob2f62a7b8b5b4d5380083f56f8372c6b571cb7864
1 # Macro which contains all bits to setup the compile flags correctly.
3 # compile_flags()
5 macro(compile_flags)
6     if(MSVC)
7         # "If /Zc:rvalueCast is specified, the compiler follows section 5.4 of the
8         # C++11 standard". We need C++11 for the way we use threads.
9         add_compile_options(/Zc:rvalueCast)
11         if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
12             add_compile_options(
13                 /Zc:preprocessor # Needed for __VA_OPT__() in macros.
14                 /MP # Enable multi-threaded compilation.
15                 /FC # Display the full path of source code files passed to the compiler in diagnostics.
16             )
17         endif()
18     endif()
20     # Our strings are UTF-8.
21     if(MSVC)
22         add_compile_options(/utf-8)
23     else()
24         add_compile_options(-finput-charset=utf-8)
25     endif()
27     # Add some -D flags for Debug builds. We cannot use add_definitions(), because
28     # it does not appear to support the $<> tags.
29     add_compile_options(
30         "$<$<CONFIG:Debug>:-D_DEBUG>"
31         "$<$<NOT:$<CONFIG:Debug>>:-D_FORTIFY_SOURCE=2>" # FORTIFY_SOURCE should only be used in non-debug builds (requires -O1+)
32     )
33     if(MINGW)
34         add_link_options(
35             "$<$<NOT:$<CONFIG:Debug>>:-fstack-protector>" # Prevent undefined references when _FORTIFY_SOURCE > 0
36         )
37         if(CMAKE_SIZEOF_VOID_P EQUAL 8)
38             add_compile_options(
39                 "$<$<CONFIG:Debug>:-Wa,-mbig-obj>" # Switch to pe-bigobj-x86-64 as x64 Debug builds push pe-x86-64 to the limits (linking errors with ASLR, ...)
40             )
41         endif()
42     endif()
44     # Prepare a generator that checks if we are not a debug, and don't have asserts
45     # on. We need this later on to set some compile options for stable releases.
46     set(IS_STABLE_RELEASE "$<AND:$<NOT:$<CONFIG:Debug>>,$<NOT:$<BOOL:${OPTION_USE_ASSERTS}>>>")
48     if(MSVC)
49         add_compile_options(
50             /W3
51             /w34100 # 'identifier' : unreferenced formal parameter
52             /w34189 # 'identifier' : local variable is initialized but not referenced
53         )
54         if(MSVC_VERSION GREATER 1929 AND MSVC_VERSION LESS 1937 AND CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
55             # Starting with version 19.30 (fixed in version 19.37), there is an optimisation bug, see #9966 for details
56             # This flag disables the broken optimisation to work around the bug
57             add_compile_options(/d2ssa-rse-)
58         endif()
59         if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
60             add_compile_options(
61                 -Wno-multichar
62             )
63         endif()
64     elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
65         add_compile_options(
66             -W
67             -Wall
68             -Wcast-qual
69             -Wextra
70             -Wsign-compare
71             -Wundef
72             -Wpointer-arith
73             -Wwrite-strings
74             -Wredundant-decls
75             -Wformat-security
76             -Wformat=2
77             -Winit-self
78             -Wnon-virtual-dtor
79             -Wsuggest-override
81             # We use 'ABCD' multichar for SaveLoad chunks identifiers
82             -Wno-multichar
83         )
85         # Ninja processes the output so the output from the compiler
86         # isn't directly to a terminal; hence, the default is
87         # non-coloured output. We can override this to get nicely
88         # coloured output, but since that might yield odd results with
89         # IDEs, we extract it to an option.
90         if(OPTION_FORCE_COLORED_OUTPUT)
91             if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
92                 add_compile_options (-fdiagnostics-color=always)
93             elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
94                 add_compile_options (-fcolor-diagnostics)
95             endif()
96         endif()
98         if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
99             include(CheckCXXCompilerFlag)
100             check_cxx_compiler_flag("-flifetime-dse=1" LIFETIME_DSE_FOUND)
102             add_compile_options(
103                 # GCC 4.2+ automatically assumes that signed overflows do
104                 # not occur in signed arithmetics, whereas we are not
105                 # sure that they will not happen. It furthermore complains
106                 # about its own optimized code in some places.
107                 "-fno-strict-overflow"
109                 # Prevent optimisation supposing enums are in a range specified by the standard
110                 # For details, see http://gcc.gnu.org/PR43680
111                 "-fno-tree-vrp"
113                 # -flifetime-dse=2 (default since GCC 6) doesn't play
114                 # well with our custom pool item allocator
115                 "$<$<BOOL:${LIFETIME_DSE_FOUND}>:-flifetime-dse=1>"
117                 # We have a fight between clang wanting std::move() and gcc not wanting it
118                 # and of course they both warn when the other compiler is happy
119                 "-Wno-redundant-move"
120             )
121         endif()
123         if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
124             if (NOT CMAKE_OSX_ARCHITECTURES STREQUAL "arm64")
125                 include(CheckCXXCompilerFlag)
126                 check_cxx_compiler_flag("-mno-sse4" NO_SSE4_FOUND)
128                 if(NO_SSE4_FOUND)
129                     add_compile_options(
130                         # Don't use SSE4 for general sources to increase compatibility.
131                         -mno-sse4
132                     )
133                 endif()
134             endif()
135         endif()
136     elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
137         add_compile_options(
138             -Wall
139             # warning #873: function ... ::operator new ... has no corresponding operator delete ...
140             -wd873
141             # warning #1292: unknown attribute "fallthrough"
142             -wd1292
143             # warning #1899: multicharacter character literal (potential portability problem)
144             -wd1899
145             # warning #2160: anonymous union qualifier is ignored
146             -wd2160
147         )
148     else()
149         message(FATAL_ERROR "No warning flags are set for this compiler yet; please consider creating a Pull Request to add support for this compiler.")
150     endif()
152     if(NOT WIN32 AND NOT HAIKU)
153         # rdynamic is used to get useful stack traces from crash reports.
154         set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -rdynamic")
155     endif()
156 endmacro()