Atlas - sdlcompilers.cmake
Home / ext / SDL / cmake Lines: 1 | Size: 8726 bytes [Download] [Show on GitHub] [Search similar files] [Raw] [Raw (proxy)][FILE BEGIN]1macro(SDL_DetectCompiler) 2 set(USE_CLANG FALSE) 3 set(USE_GCC FALSE) 4 set(USE_INTELCC FALSE) 5 set(USE_QCC FALSE) 6 set(USE_TCC FALSE) 7 if(CMAKE_C_COMPILER_ID MATCHES "Clang|IntelLLVM") 8 set(USE_CLANG TRUE) 9 # Visual Studio 2019 v16.2 added support for Clang/LLVM. 10 # Check if a Visual Studio project is being generated with the Clang toolset. 11 if(MSVC) 12 set(MSVC_CLANG TRUE) 13 endif() 14 elseif(CMAKE_COMPILER_IS_GNUCC) 15 set(USE_GCC TRUE) 16 elseif(CMAKE_C_COMPILER_ID MATCHES "^Intel$") 17 set(USE_INTELCC TRUE) 18 elseif(CMAKE_C_COMPILER_ID MATCHES "QCC") 19 set(USE_QCC TRUE) 20 elseif(CMAKE_C_COMPILER_ID MATCHES "TinyCC") 21 set(USE_TCC TRUE) 22 endif() 23endmacro() 24 25function(sdl_target_compile_option_all_languages TARGET OPTION) 26 target_compile_options(${TARGET} PRIVATE "$<$<COMPILE_LANGUAGE:C,CXX>:${OPTION}>") 27 if(CMAKE_OBJC_COMPILER) 28 target_compile_options(${TARGET} PRIVATE "$<$<COMPILE_LANGUAGE:OBJC>:${OPTION}>") 29 endif() 30endfunction() 31 32macro(cached_check_c_compiler_flag _arg _var) 33 if(NOT DEFINED "${_var}") 34 check_c_compiler_flag("${_arg}" "${_var}" ${ARGN}) 35 endif() 36endmacro() 37 38function(SDL_AddCommonCompilerFlags TARGET) 39 option(SDL_WERROR "Enable -Werror" OFF) 40 41 get_property(TARGET_TYPE TARGET "${TARGET}" PROPERTY TYPE) 42 if(MSVC) 43 cmake_push_check_state() 44 cached_check_c_compiler_flag("/W3" COMPILER_SUPPORTS_W3) 45 if(COMPILER_SUPPORTS_W3) 46 target_compile_options(${TARGET} PRIVATE "$<$<COMPILE_LANGUAGE:C,CXX>:/W3>") 47 endif() 48 cmake_pop_check_state() 49 endif() 50 51 if(USE_GCC OR USE_CLANG OR USE_INTELCC OR USE_QCC OR USE_TCC) 52 if(MINGW) 53 # See if GCC's -gdwarf-4 is supported 54 # See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101377 for why this is needed on Windows 55 cmake_push_check_state() 56 cached_check_c_compiler_flag("-gdwarf-4" HAVE_GDWARF_4) 57 if(HAVE_GDWARF_4) 58 target_compile_options(${TARGET} PRIVATE "$<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:-gdwarf-4>") 59 endif() 60 cmake_pop_check_state() 61 endif() 62 63 # Check for -Wall first, so later things can override pieces of it. 64 # Note: clang-cl treats -Wall as -Weverything (which is very loud), 65 # /W3 as -Wall, and /W4 as -Wall -Wextra. So: /W3 is enough. 66 cached_check_c_compiler_flag(-Wall HAVE_GCC_WALL) 67 if(MSVC_CLANG) 68 target_compile_options(${TARGET} PRIVATE "/W3") 69 elseif(HAVE_GCC_WALL) 70 sdl_target_compile_option_all_languages(${TARGET} "-Wall") 71 if(HAIKU) 72 sdl_target_compile_option_all_languages(${TARGET} "-Wno-multichar") 73 endif() 74 endif() 75 76 cached_check_c_compiler_flag(-Wundef HAVE_GCC_WUNDEF) 77 if(HAVE_GCC_WUNDEF) 78 sdl_target_compile_option_all_languages(${TARGET} "-Wundef") 79 endif() 80 81 cached_check_c_compiler_flag(-Wfloat-conversion HAVE_GCC_WFLOAT_CONVERSION) 82 if(HAVE_GCC_WFLOAT_CONVERSION) 83 sdl_target_compile_option_all_languages(${TARGET} "-Wfloat-conversion") 84 endif() 85 86 cached_check_c_compiler_flag(-fno-strict-aliasing HAVE_GCC_NO_STRICT_ALIASING) 87 if(HAVE_GCC_NO_STRICT_ALIASING) 88 sdl_target_compile_option_all_languages(${TARGET} "-fno-strict-aliasing") 89 endif() 90 91 cached_check_c_compiler_flag(-Wdocumentation HAVE_GCC_WDOCUMENTATION) 92 if(HAVE_GCC_WDOCUMENTATION) 93 if(SDL_WERROR) 94 cached_check_c_compiler_flag(-Werror=documentation HAVE_GCC_WERROR_DOCUMENTATION) 95 if(HAVE_GCC_WERROR_DOCUMENTATION) 96 sdl_target_compile_option_all_languages(${TARGET} "-Werror=documentation") 97 endif() 98 endif() 99 sdl_target_compile_option_all_languages(${TARGET} "-Wdocumentation") 100 endif() 101 102 cached_check_c_compiler_flag(-Wdocumentation-unknown-command HAVE_GCC_WDOCUMENTATION_UNKNOWN_COMMAND) 103 if(HAVE_GCC_WDOCUMENTATION_UNKNOWN_COMMAND) 104 if(SDL_WERROR) 105 cached_check_c_compiler_flag(-Werror=documentation-unknown-command HAVE_GCC_WERROR_DOCUMENTATION_UNKNOWN_COMMAND) 106 if(HAVE_GCC_WERROR_DOCUMENTATION_UNKNOWN_COMMAND) 107 sdl_target_compile_option_all_languages(${TARGET} "-Werror=documentation-unknown-command") 108 endif() 109 endif() 110 sdl_target_compile_option_all_languages(${TARGET} "-Wdocumentation-unknown-command") 111 endif() 112 113 cached_check_c_compiler_flag(-fcomment-block-commands=threadsafety HAVE_GCC_COMMENT_BLOCK_COMMANDS) 114 if(HAVE_GCC_COMMENT_BLOCK_COMMANDS) 115 sdl_target_compile_option_all_languages(${TARGET} "-fcomment-block-commands=threadsafety") 116 else() 117 cached_check_c_compiler_flag(/clang:-fcomment-block-commands=threadsafety HAVE_CLANG_COMMENT_BLOCK_COMMANDS) 118 if(HAVE_CLANG_COMMENT_BLOCK_COMMANDS) 119 sdl_target_compile_option_all_languages(${TARGET} "/clang:-fcomment-block-commands=threadsafety") 120 endif() 121 endif() 122 123 cached_check_c_compiler_flag(-Wshadow HAVE_GCC_WSHADOW) 124 if(HAVE_GCC_WSHADOW) 125 sdl_target_compile_option_all_languages(${TARGET} "-Wshadow") 126 endif() 127 128 cached_check_c_compiler_flag(-Wunused-local-typedefs HAVE_GCC_WUNUSED_LOCAL_TYPEDEFS) 129 if(HAVE_GCC_WUNUSED_LOCAL_TYPEDEFS) 130 sdl_target_compile_option_all_languages(${TARGET} "-Wno-unused-local-typedefs") 131 endif() 132 133 cached_check_c_compiler_flag(-Wimplicit-fallthrough HAVE_GCC_WIMPLICIT_FALLTHROUGH) 134 if(HAVE_GCC_WIMPLICIT_FALLTHROUGH) 135 sdl_target_compile_option_all_languages(${TARGET} "-Wimplicit-fallthrough") 136 endif() 137 endif() 138 139 if(SDL_WERROR) 140 if(MSVC) 141 cached_check_c_compiler_flag(/WX HAVE_WX) 142 if(HAVE_WX) 143 target_compile_options(${TARGET} PRIVATE "$<$<COMPILE_LANGUAGE:C,CXX>:/WX>") 144 endif() 145 elseif(USE_GCC OR USE_CLANG OR USE_INTELCC OR USE_QNX) 146 cached_check_c_compiler_flag(-Werror HAVE_WERROR) 147 if(HAVE_WERROR) 148 sdl_target_compile_option_all_languages(${TARGET} "-Werror") 149 endif() 150 151 if(TARGET_TYPE STREQUAL "SHARED_LIBRARY") 152 check_linker_flag(C "-Wl,--no-undefined-version" LINKER_SUPPORTS_NO_UNDEFINED_VERSION) 153 if(LINKER_SUPPORTS_NO_UNDEFINED_VERSION) 154 target_link_options(${TARGET} PRIVATE "-Wl,--no-undefined-version") 155 endif() 156 endif() 157 endif() 158 159 if(NOT (APPLE OR MSVC)) 160 if(SDL_WERROR) 161 get_property(target_type TARGET ${TARGET} PROPERTY TYPE) 162 if(target_type MATCHES "SHARED_LIBRARY|MODULE_LIBRARY") 163 check_linker_flag(C "-Wl,-fatal-warnings" LINKER_SUPPORTS_WL_FATAL_WARNINGS) 164 if(LINKER_SUPPORTS_WL_FATAL_WARNINGS) 165 target_link_options(${TARGET} PRIVATE "-Wl,-fatal-warnings") 166 endif() 167 endif() 168 endif() 169 endif() 170 endif() 171 172 if(USE_CLANG) 173 cached_check_c_compiler_flag("-fcolor-diagnostics" COMPILER_SUPPORTS_FCOLOR_DIAGNOSTICS) 174 if(COMPILER_SUPPORTS_FCOLOR_DIAGNOSTICS) 175 sdl_target_compile_option_all_languages(${TARGET} "-fcolor-diagnostics") 176 endif() 177 else() 178 cached_check_c_compiler_flag("-fdiagnostics-color=always" COMPILER_SUPPORTS_FDIAGNOSTICS_COLOR_ALWAYS) 179 if(COMPILER_SUPPORTS_FDIAGNOSTICS_COLOR_ALWAYS) 180 sdl_target_compile_option_all_languages(${TARGET} "-fdiagnostics-color=always") 181 endif() 182 endif() 183 184 if(USE_TCC) 185 sdl_target_compile_option_all_languages(${TARGET} "-DSTBI_NO_SIMD") 186 endif() 187endfunction() 188 189function(check_x86_source_compiles BODY VAR) 190 if(ARGN) 191 message(FATAL_ERROR "Unknown arguments: ${ARGN}") 192 endif() 193 if(APPLE_MULTIARCH AND (SDL_CPU_X86 OR SDL_CPU_X64)) 194 set(test_conditional 1) 195 else() 196 set(test_conditional 0) 197 endif() 198 check_c_source_compiles(" 199 #if ${test_conditional} 200 # if defined(__i386__) || defined(__x86_64__) 201 # define test_enabled 1 202 # else 203 # define test_enabled 0 /* feign success in Apple multi-arch configs */ 204 # endif 205 #else /* test normally */ 206 # define test_enabled 1 207 #endif 208 #if test_enabled 209 ${BODY} 210 #else 211 int main(int argc, char *argv[]) { 212 (void)argc; 213 (void)argv; 214 return 0; 215 } 216 #endif" ${VAR}) 217endfunction() 218 219function(check_arm_source_compiles BODY VAR) 220 if(ARGN) 221 message(FATAL_ERROR "Unknown arguments: ${ARGN}") 222 endif() 223 if(APPLE_MULTIARCH AND (SDL_CPU_ARM32 OR SDL_CPU_ARM64)) 224 set(test_conditional 1) 225 else() 226 set(test_conditional 0) 227 endif() 228 check_c_source_compiles(" 229 #if ${test_conditional} 230 # if defined(__arm__) || defined(__aarch64__) 231 # define test_enabled 1 232 # else 233 # define test_enabled 0 /* feign success in Apple multi-arch configs */ 234 # endif 235 #else /* test normally */ 236 # define test_enabled 1 237 #endif 238 #if test_enabled 239 ${BODY} 240 #else 241 int main(int argc, char *argv[]) { 242 (void)argc; 243 (void)argv; 244 return 0; 245 } 246 #endif" ${VAR}) 247endfunction() 248[FILE END](C) 2025 0x4248 (C) 2025 4248 Media and 4248 Systems, All part of 0x4248 See LICENCE files for more information. Not all files are by 0x4248 always check Licencing.