1 # This CMake module is responsible for interpreting the user defined LLVM_ 2 # options and executing the appropriate CMake commands to realize the users' 3 # selections. 4 5 include(HandleLLVMStdlib) 6 include(AddLLVMDefinitions) 7 include(CheckCCompilerFlag) 8 include(CheckCXXCompilerFlag) 9 10 if(NOT LLVM_FORCE_USE_OLD_TOOLCHAIN) 11 if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") 12 if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7) 13 message(FATAL_ERROR "Host GCC version must be at least 4.7!") 14 endif() 15 elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") 16 if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.1) 17 message(FATAL_ERROR "Host Clang version must be at least 3.1!") 18 endif() 19 20 # Also test that we aren't using too old of a version of libstdc++ with the 21 # Clang compiler. This is tricky as there is no real way to check the 22 # version of libstdc++ directly. Instead we test for a known bug in 23 # libstdc++4.6 that is fixed in libstdc++4.7. 24 if(NOT LLVM_ENABLE_LIBCXX) 25 set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) 26 set(OLD_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) 27 set(CMAKE_REQUIRED_FLAGS "-std=c++0x") 28 if (ANDROID) 29 set(CMAKE_REQUIRED_LIBRARIES "atomic") 30 endif() 31 check_cxx_source_compiles(" 32 #include <atomic> 33 std::atomic<float> x(0.0f); 34 int main() { return (float)x; }" 35 LLVM_NO_OLD_LIBSTDCXX) 36 if(NOT LLVM_NO_OLD_LIBSTDCXX) 37 message(FATAL_ERROR "Host Clang must be able to find libstdc++4.7 or newer!") 38 endif() 39 set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) 40 set(CMAKE_REQUIRED_LIBRARIES ${OLD_CMAKE_REQUIRED_LIBRARIES}) 41 endif() 42 elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") 43 if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 17.0) 44 message(FATAL_ERROR "Host Visual Studio must be at least 2012 (MSVC 17.0)") 45 endif() 46 endif() 47 endif() 48 49 if( LLVM_ENABLE_ASSERTIONS ) 50 # MSVC doesn't like _DEBUG on release builds. See PR 4379. 51 if( NOT MSVC ) 52 add_definitions( -D_DEBUG ) 53 endif() 54 # On non-Debug builds cmake automatically defines NDEBUG, so we 55 # explicitly undefine it: 56 if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" ) 57 add_definitions( -UNDEBUG ) 58 # Also remove /D NDEBUG to avoid MSVC warnings about conflicting defines. 59 foreach (flags_var_to_scrub 60 CMAKE_CXX_FLAGS_RELEASE 61 CMAKE_CXX_FLAGS_RELWITHDEBINFO 62 CMAKE_CXX_FLAGS_MINSIZEREL 63 CMAKE_C_FLAGS_RELEASE 64 CMAKE_C_FLAGS_RELWITHDEBINFO 65 CMAKE_C_FLAGS_MINSIZEREL) 66 string (REGEX REPLACE "(^| )[/-]D *NDEBUG($| )" " " 67 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}") 68 endforeach() 69 endif() 70 endif() 71 72 if(WIN32) 73 set(LLVM_HAVE_LINK_VERSION_SCRIPT 0) 74 if(CYGWIN) 75 set(LLVM_ON_WIN32 0) 76 set(LLVM_ON_UNIX 1) 77 else(CYGWIN) 78 set(LLVM_ON_WIN32 1) 79 set(LLVM_ON_UNIX 0) 80 endif(CYGWIN) 81 # Maximum path length is 160 for non-unicode paths 82 set(MAXPATHLEN 160) 83 else(WIN32) 84 if(UNIX) 85 set(LLVM_ON_WIN32 0) 86 set(LLVM_ON_UNIX 1) 87 if(APPLE) 88 set(LLVM_HAVE_LINK_VERSION_SCRIPT 0) 89 else(APPLE) 90 set(LLVM_HAVE_LINK_VERSION_SCRIPT 1) 91 endif(APPLE) 92 # FIXME: Maximum path length is currently set to 'safe' fixed value 93 set(MAXPATHLEN 2024) 94 else(UNIX) 95 MESSAGE(SEND_ERROR "Unable to determine platform") 96 endif(UNIX) 97 endif(WIN32) 98 99 set(EXEEXT ${CMAKE_EXECUTABLE_SUFFIX}) 100 set(LTDL_SHLIB_EXT ${CMAKE_SHARED_LIBRARY_SUFFIX}) 101 102 # We use *.dylib rather than *.so on darwin. 103 set(LLVM_PLUGIN_EXT ${CMAKE_SHARED_LIBRARY_SUFFIX}) 104 105 if(APPLE) 106 # Darwin-specific linker flags for loadable modules. 107 set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-flat_namespace -Wl,-undefined -Wl,suppress") 108 endif() 109 110 function(append value) 111 foreach(variable ${ARGN}) 112 set(${variable} "${${variable}} ${value}" PARENT_SCOPE) 113 endforeach(variable) 114 endfunction() 115 116 function(append_if condition value) 117 if (${condition}) 118 foreach(variable ${ARGN}) 119 set(${variable} "${${variable}} ${value}" PARENT_SCOPE) 120 endforeach(variable) 121 endif() 122 endfunction() 123 124 macro(add_flag_if_supported flag name) 125 check_c_compiler_flag("-Werror ${flag}" "C_SUPPORTS_${name}") 126 append_if("C_SUPPORTS_${name}" "${flag}" CMAKE_C_FLAGS) 127 check_cxx_compiler_flag("-Werror ${flag}" "CXX_SUPPORTS_${name}") 128 append_if("CXX_SUPPORTS_${name}" "${flag}" CMAKE_CXX_FLAGS) 129 endmacro() 130 131 function(add_flag_or_print_warning flag name) 132 check_c_compiler_flag("-Werror ${flag}" "C_SUPPORTS_${name}") 133 check_cxx_compiler_flag("-Werror ${flag}" "CXX_SUPPORTS_${name}") 134 if ("C_SUPPORTS_${name}" AND "CXX_SUPPORTS_${name}") 135 message(STATUS "Building with ${flag}") 136 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}" PARENT_SCOPE) 137 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}" PARENT_SCOPE) 138 else() 139 message(WARNING "${flag} is not supported.") 140 endif() 141 endfunction() 142 143 if( LLVM_ENABLE_PIC ) 144 if( XCODE ) 145 # Xcode has -mdynamic-no-pic on by default, which overrides -fPIC. I don't 146 # know how to disable this, so just force ENABLE_PIC off for now. 147 message(WARNING "-fPIC not supported with Xcode.") 148 elseif( WIN32 OR CYGWIN) 149 # On Windows all code is PIC. MinGW warns if -fPIC is used. 150 else() 151 add_flag_or_print_warning("-fPIC" FPIC) 152 153 if( WIN32 OR CYGWIN) 154 # MinGW warns if -fvisibility-inlines-hidden is used. 155 else() 156 check_cxx_compiler_flag("-fvisibility-inlines-hidden" SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG) 157 append_if(SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG "-fvisibility-inlines-hidden" CMAKE_CXX_FLAGS) 158 endif() 159 endif() 160 endif() 161 162 if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 ) 163 # TODO: support other platforms and toolchains. 164 if( LLVM_BUILD_32_BITS ) 165 message(STATUS "Building 32 bits executables and libraries.") 166 add_llvm_definitions( -m32 ) 167 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32") 168 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -m32") 169 set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -m32") 170 endif( LLVM_BUILD_32_BITS ) 171 endif( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 ) 172 173 if( XCODE ) 174 # For Xcode enable several build settings that correspond to 175 # many warnings that are on by default in Clang but are 176 # not enabled for historical reasons. For versions of Xcode 177 # that do not support these options they will simply 178 # be ignored. 179 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_ABOUT_RETURN_TYPE "YES") 180 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_ABOUT_MISSING_NEWLINE "YES") 181 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNUSED_VALUE "YES") 182 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNUSED_VARIABLE "YES") 183 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_SIGN_COMPARE "YES") 184 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNUSED_FUNCTION "YES") 185 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED "YES") 186 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS "YES") 187 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNINITIALIZED_AUTOS "YES") 188 set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_BOOL_CONVERSION "YES") 189 set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_EMPTY_BODY "YES") 190 set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_ENUM_CONVERSION "YES") 191 set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_INT_CONVERSION "YES") 192 set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_CONSTANT_CONVERSION "YES") 193 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_NON_VIRTUAL_DESTRUCTOR "YES") 194 endif() 195 196 # On Win32 using MS tools, provide an option to set the number of parallel jobs 197 # to use. 198 if( MSVC_IDE ) 199 set(LLVM_COMPILER_JOBS "0" CACHE STRING 200 "Number of parallel compiler jobs. 0 means use all processors. Default is 0.") 201 if( NOT LLVM_COMPILER_JOBS STREQUAL "1" ) 202 if( LLVM_COMPILER_JOBS STREQUAL "0" ) 203 add_llvm_definitions( /MP ) 204 else() 205 message(STATUS "Number of parallel compiler jobs set to " ${LLVM_COMPILER_JOBS}) 206 add_llvm_definitions( /MP${LLVM_COMPILER_JOBS} ) 207 endif() 208 else() 209 message(STATUS "Parallel compilation disabled") 210 endif() 211 endif() 212 213 if( MSVC ) 214 include(ChooseMSVCCRT) 215 216 if( NOT (${CMAKE_VERSION} VERSION_LESS 2.8.11) ) 217 # set stack reserved size to ~10MB 218 # CMake previously automatically set this value for MSVC builds, but the 219 # behavior was changed in CMake 2.8.11 (Issue 12437) to use the MSVC default 220 # value (1 MB) which is not enough for us in tasks such as parsing recursive 221 # C++ templates in Clang. 222 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:10000000") 223 endif() 224 225 if( MSVC11 ) 226 add_llvm_definitions(-D_VARIADIC_MAX=10) 227 endif() 228 229 # Add definitions that make MSVC much less annoying. 230 add_llvm_definitions( 231 # For some reason MS wants to deprecate a bunch of standard functions... 232 -D_CRT_SECURE_NO_DEPRECATE 233 -D_CRT_SECURE_NO_WARNINGS 234 -D_CRT_NONSTDC_NO_DEPRECATE 235 -D_CRT_NONSTDC_NO_WARNINGS 236 -D_SCL_SECURE_NO_DEPRECATE 237 -D_SCL_SECURE_NO_WARNINGS 238 239 # Disabled warnings. 240 -wd4146 # Suppress 'unary minus operator applied to unsigned type, result still unsigned' 241 -wd4180 # Suppress 'qualifier applied to function type has no meaning; ignored' 242 -wd4244 # Suppress ''argument' : conversion from 'type1' to 'type2', possible loss of data' 243 -wd4267 # Suppress ''var' : conversion from 'size_t' to 'type', possible loss of data' 244 -wd4291 # Suppress ''declaration' : no matching operator delete found; memory will not be freed if initialization throws an exception' 245 -wd4345 # Suppress 'behavior change: an object of POD type constructed with an initializer of the form () will be default-initialized' 246 -wd4351 # Suppress 'new behavior: elements of array 'array' will be default initialized' 247 -wd4355 # Suppress ''this' : used in base member initializer list' 248 -wd4503 # Suppress ''identifier' : decorated name length exceeded, name was truncated' 249 -wd4624 # Suppress ''derived class' : destructor could not be generated because a base class destructor is inaccessible' 250 -wd4722 # Suppress 'function' : destructor never returns, potential memory leak 251 -wd4800 # Suppress ''type' : forcing value to bool 'true' or 'false' (performance warning)' 252 253 # Promoted warnings. 254 -w14062 # Promote 'enumerator in switch of enum is not handled' to level 1 warning. 255 256 # Promoted warnings to errors. 257 -we4238 # Promote 'nonstandard extension used : class rvalue used as lvalue' to error. 258 ) 259 260 # Enable warnings 261 if (LLVM_ENABLE_WARNINGS) 262 add_llvm_definitions( /W4 ) 263 if (LLVM_ENABLE_PEDANTIC) 264 # No MSVC equivalent available 265 endif (LLVM_ENABLE_PEDANTIC) 266 endif (LLVM_ENABLE_WARNINGS) 267 if (LLVM_ENABLE_WERROR) 268 add_llvm_definitions( /WX ) 269 endif (LLVM_ENABLE_WERROR) 270 elseif( LLVM_COMPILER_IS_GCC_COMPATIBLE ) 271 if (LLVM_ENABLE_WARNINGS) 272 append("-Wall -W -Wno-unused-parameter -Wwrite-strings" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 273 274 # Turn off missing field initializer warnings for gcc to avoid noise from 275 # false positives with empty {}. Turn them on otherwise (they're off by 276 # default for clang). 277 check_cxx_compiler_flag("-Wmissing-field-initializers" CXX_SUPPORTS_MISSING_FIELD_INITIALIZERS_FLAG) 278 if (CXX_SUPPORTS_MISSING_FIELD_INITIALIZERS_FLAG) 279 if (CMAKE_COMPILER_IS_GNUCXX) 280 append("-Wno-missing-field-initializers" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 281 else() 282 append("-Wmissing-field-initializers" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 283 endif() 284 endif() 285 286 append_if(LLVM_ENABLE_PEDANTIC "-pedantic -Wno-long-long" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 287 add_flag_if_supported("-Wcovered-switch-default" COVERED_SWITCH_DEFAULT_FLAG) 288 append_if(USE_NO_UNINITIALIZED "-Wno-uninitialized" CMAKE_CXX_FLAGS) 289 append_if(USE_NO_MAYBE_UNINITIALIZED "-Wno-maybe-uninitialized" CMAKE_CXX_FLAGS) 290 check_cxx_compiler_flag("-Werror -Wnon-virtual-dtor" CXX_SUPPORTS_NON_VIRTUAL_DTOR_FLAG) 291 append_if(CXX_SUPPORTS_NON_VIRTUAL_DTOR_FLAG "-Wnon-virtual-dtor" CMAKE_CXX_FLAGS) 292 293 # Check if -Wcomment is OK with an // comment ending with '\' if the next 294 # line is also a // comment. 295 set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) 296 set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} -Werror -Wcomment) 297 CHECK_C_SOURCE_COMPILES("// \\\\\\n//\\nint main() {return 0;}" 298 C_WCOMMENT_ALLOWS_LINE_WRAP) 299 set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) 300 if (NOT C_WCOMMENT_ALLOWS_LINE_WRAP) 301 append("-Wno-comment" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 302 endif() 303 endif (LLVM_ENABLE_WARNINGS) 304 append_if(LLVM_ENABLE_WERROR "-Werror" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 305 if (NOT LLVM_ENABLE_TIMESTAMPS) 306 add_flag_if_supported("-Werror=date-time" WERROR_DATE_TIME) 307 endif () 308 if (LLVM_ENABLE_CXX1Y) 309 check_cxx_compiler_flag("-std=c++1y" CXX_SUPPORTS_CXX1Y) 310 append_if(CXX_SUPPORTS_CXX1Y "-std=c++1y" CMAKE_CXX_FLAGS) 311 else() 312 check_cxx_compiler_flag("-std=c++11" CXX_SUPPORTS_CXX11) 313 if (CXX_SUPPORTS_CXX11) 314 if (CYGWIN OR MINGW) 315 # MinGW and Cygwin are a bit stricter and lack things like 316 # 'strdup', 'stricmp', etc in c++11 mode. 317 append("-std=gnu++11" CMAKE_CXX_FLAGS) 318 else() 319 append("-std=c++11" CMAKE_CXX_FLAGS) 320 endif() 321 else() 322 message(FATAL_ERROR "LLVM requires C++11 support but the '-std=c++11' flag isn't supported.") 323 endif() 324 endif() 325 endif( MSVC ) 326 327 macro(append_common_sanitizer_flags) 328 # Append -fno-omit-frame-pointer and turn on debug info to get better 329 # stack traces. 330 add_flag_if_supported("-fno-omit-frame-pointer" FNO_OMIT_FRAME_POINTER) 331 if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND 332 NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO") 333 add_flag_if_supported("-gline-tables-only" GLINE_TABLES_ONLY) 334 endif() 335 # Use -O1 even in debug mode, otherwise sanitizers slowdown is too large. 336 if (uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") 337 add_flag_if_supported("-O1" O1) 338 endif() 339 endmacro() 340 341 # Turn on sanitizers if necessary. 342 if(LLVM_USE_SANITIZER) 343 if (LLVM_ON_UNIX) 344 if (LLVM_USE_SANITIZER STREQUAL "Address") 345 append_common_sanitizer_flags() 346 append("-fsanitize=address" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 347 elseif (LLVM_USE_SANITIZER MATCHES "Memory(WithOrigins)?") 348 append_common_sanitizer_flags() 349 append("-fsanitize=memory" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 350 if(LLVM_USE_SANITIZER STREQUAL "MemoryWithOrigins") 351 append("-fsanitize-memory-track-origins" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 352 endif() 353 else() 354 message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${LLVM_USE_SANITIZER}") 355 endif() 356 else() 357 message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.") 358 endif() 359 endif() 360 361 # Turn on -gsplit-dwarf if requested 362 if(LLVM_USE_SPLIT_DWARF) 363 add_llvm_definitions("-gsplit-dwarf") 364 endif() 365 366 add_llvm_definitions( -D__STDC_CONSTANT_MACROS ) 367 add_llvm_definitions( -D__STDC_FORMAT_MACROS ) 368 add_llvm_definitions( -D__STDC_LIMIT_MACROS ) 369 370 # clang doesn't print colored diagnostics when invoked from Ninja 371 if (UNIX AND 372 CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND 373 CMAKE_GENERATOR STREQUAL "Ninja") 374 append("-fcolor-diagnostics" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 375 endif() 376 377 # Add flags for add_dead_strip(). 378 # FIXME: With MSVS, consider compiling with /Gy and linking with /OPT:REF? 379 # But MinSizeRel seems to add that automatically, so maybe disable these 380 # flags instead if LLVM_NO_DEAD_STRIP is set. 381 if(NOT CYGWIN AND NOT WIN32) 382 if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 383 check_c_compiler_flag("-Werror -fno-function-sections" C_SUPPORTS_FNO_FUNCTION_SECTIONS) 384 if (C_SUPPORTS_FNO_FUNCTION_SECTIONS) 385 # Don't add -ffunction-section if it can be disabled with -fno-function-sections. 386 # Doing so will break sanitizers. 387 add_flag_if_supported("-ffunction-sections" FFUNCTION_SECTIONS) 388 endif() 389 add_flag_if_supported("-fdata-sections" FDATA_SECTIONS) 390 endif() 391 endif() 392 393 if(CYGWIN OR MINGW) 394 # Prune --out-implib from executables. It doesn't make sense even 395 # with --export-all-symbols. 396 string(REGEX REPLACE "-Wl,--out-implib,[^ ]+ " " " 397 CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINK_EXECUTABLE}") 398 string(REGEX REPLACE "-Wl,--out-implib,[^ ]+ " " " 399 CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE}") 400 endif() 401 402 if(MSVC) 403 # Remove flags here, for exceptions and RTTI. 404 # Each target property or source property should be responsible to control 405 # them. 406 # CL.EXE complains to override flags like "/GR /GR-". 407 string(REGEX REPLACE "(^| ) */EH[-cs]+ *( |$)" "\\1 \\2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") 408 string(REGEX REPLACE "(^| ) */GR-? *( |$)" "\\1 \\2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") 409 endif() 410 411 # Plugin support 412 # FIXME: Make this configurable. 413 if(WIN32 OR CYGWIN) 414 # DLL platform(s) don't support plugins. 415 set(LLVM_ENABLE_PLUGINS OFF) 416 else() 417 set(LLVM_ENABLE_PLUGINS ON) 418 endif() 419