/3rd_party/llvm/cmake/modules/HandleLLVMOptions.cmake

https://code.google.com/p/softart/ · CMake · 299 lines · 233 code · 27 blank · 39 comment · 41 complexity · 689dd068d4edf289d0b56f62673a6a7e MD5 · raw file

  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. include(AddLLVMDefinitions)
  5. include(CheckCCompilerFlag)
  6. include(CheckCXXCompilerFlag)
  7. if( CMAKE_COMPILER_IS_GNUCXX )
  8. set(LLVM_COMPILER_IS_GCC_COMPATIBLE ON)
  9. elseif( MSVC )
  10. set(LLVM_COMPILER_IS_GCC_COMPATIBLE OFF)
  11. elseif( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
  12. set(LLVM_COMPILER_IS_GCC_COMPATIBLE ON)
  13. endif()
  14. if( LLVM_ENABLE_ASSERTIONS )
  15. # MSVC doesn't like _DEBUG on release builds. See PR 4379.
  16. if( NOT MSVC )
  17. add_definitions( -D_DEBUG )
  18. endif()
  19. # On non-Debug builds cmake automatically defines NDEBUG, so we
  20. # explicitly undefine it:
  21. if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" )
  22. add_definitions( -UNDEBUG )
  23. # Also remove /D NDEBUG to avoid MSVC warnings about conflicting defines.
  24. set(REGEXP_NDEBUG "(^| )[/-]D *NDEBUG($| )")
  25. string (REGEX REPLACE "${REGEXP_NDEBUG}" " "
  26. CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
  27. string (REGEX REPLACE "${REGEXP_NDEBUG}" " "
  28. CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
  29. string (REGEX REPLACE "${REGEXP_NDEBUG}" " "
  30. CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}")
  31. endif()
  32. else()
  33. if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
  34. if( NOT MSVC_IDE AND NOT XCODE )
  35. add_definitions( -DNDEBUG )
  36. endif()
  37. endif()
  38. endif()
  39. if(WIN32)
  40. if(CYGWIN)
  41. set(LLVM_ON_WIN32 0)
  42. set(LLVM_ON_UNIX 1)
  43. else(CYGWIN)
  44. set(LLVM_ON_WIN32 1)
  45. set(LLVM_ON_UNIX 0)
  46. endif(CYGWIN)
  47. set(LTDL_SHLIB_EXT ".dll")
  48. set(EXEEXT ".exe")
  49. # Maximum path length is 160 for non-unicode paths
  50. set(MAXPATHLEN 160)
  51. else(WIN32)
  52. if(UNIX)
  53. set(LLVM_ON_WIN32 0)
  54. set(LLVM_ON_UNIX 1)
  55. if(APPLE)
  56. set(LTDL_SHLIB_EXT ".dylib")
  57. else(APPLE)
  58. set(LTDL_SHLIB_EXT ".so")
  59. endif(APPLE)
  60. set(EXEEXT "")
  61. # FIXME: Maximum path length is currently set to 'safe' fixed value
  62. set(MAXPATHLEN 2024)
  63. else(UNIX)
  64. MESSAGE(SEND_ERROR "Unable to determine platform")
  65. endif(UNIX)
  66. endif(WIN32)
  67. function(add_flag_or_print_warning flag)
  68. check_c_compiler_flag(${flag} C_SUPPORTS_FLAG)
  69. check_cxx_compiler_flag(${flag} CXX_SUPPORTS_FLAG)
  70. if (C_SUPPORTS_FLAG AND CXX_SUPPORTS_FLAG)
  71. message(STATUS "Building with ${flag}")
  72. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}" PARENT_SCOPE)
  73. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}" PARENT_SCOPE)
  74. else()
  75. message(WARNING "${flag} is not supported.")
  76. endif()
  77. endfunction()
  78. function(append value)
  79. foreach(variable ${ARGN})
  80. set(${variable} "${${variable}} ${value}" PARENT_SCOPE)
  81. endforeach(variable)
  82. endfunction()
  83. function(append_if condition value)
  84. if (${condition})
  85. foreach(variable ${ARGN})
  86. set(${variable} "${${variable}} ${value}" PARENT_SCOPE)
  87. endforeach(variable)
  88. endif()
  89. endfunction()
  90. macro(add_flag_if_supported flag)
  91. check_c_compiler_flag(${flag} C_SUPPORTS_FLAG)
  92. append_if(C_SUPPORTS_FLAG "${flag}" CMAKE_C_FLAGS)
  93. check_cxx_compiler_flag(${flag} CXX_SUPPORTS_FLAG)
  94. append_if(CXX_SUPPORTS_FLAG "${flag}" CMAKE_CXX_FLAGS)
  95. endmacro()
  96. if( LLVM_ENABLE_PIC )
  97. if( XCODE )
  98. # Xcode has -mdynamic-no-pic on by default, which overrides -fPIC. I don't
  99. # know how to disable this, so just force ENABLE_PIC off for now.
  100. message(WARNING "-fPIC not supported with Xcode.")
  101. elseif( WIN32 OR CYGWIN)
  102. # On Windows all code is PIC. MinGW warns if -fPIC is used.
  103. else()
  104. add_flag_or_print_warning("-fPIC")
  105. if( WIN32 OR CYGWIN)
  106. # MinGW warns if -fvisibility-inlines-hidden is used.
  107. else()
  108. check_cxx_compiler_flag("-fvisibility-inlines-hidden" SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG)
  109. append_if(SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG "-fvisibility-inlines-hidden" CMAKE_CXX_FLAGS)
  110. endif()
  111. endif()
  112. endif()
  113. if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
  114. # TODO: support other platforms and toolchains.
  115. if( LLVM_BUILD_32_BITS )
  116. message(STATUS "Building 32 bits executables and libraries.")
  117. add_llvm_definitions( -m32 )
  118. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32")
  119. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -m32")
  120. set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -m32")
  121. endif( LLVM_BUILD_32_BITS )
  122. endif( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
  123. # On Win32 using MS tools, provide an option to set the number of parallel jobs
  124. # to use.
  125. if( MSVC_IDE )
  126. set(LLVM_COMPILER_JOBS "0" CACHE STRING
  127. "Number of parallel compiler jobs. 0 means use all processors. Default is 0.")
  128. if( NOT LLVM_COMPILER_JOBS STREQUAL "1" )
  129. if( LLVM_COMPILER_JOBS STREQUAL "0" )
  130. add_llvm_definitions( /MP )
  131. else()
  132. if (MSVC10)
  133. message(FATAL_ERROR
  134. "Due to a bug in CMake only 0 and 1 is supported for "
  135. "LLVM_COMPILER_JOBS when generating for Visual Studio 2010")
  136. else()
  137. message(STATUS "Number of parallel compiler jobs set to " ${LLVM_COMPILER_JOBS})
  138. add_llvm_definitions( /MP${LLVM_COMPILER_JOBS} )
  139. endif()
  140. endif()
  141. else()
  142. message(STATUS "Parallel compilation disabled")
  143. endif()
  144. endif()
  145. if( MSVC )
  146. include(ChooseMSVCCRT)
  147. if( NOT (${CMAKE_VERSION} VERSION_LESS 2.8.11) )
  148. # set stack reserved size to ~10MB
  149. # CMake previously automatically set this value for MSVC builds, but the
  150. # behavior was changed in CMake 2.8.11 (Issue 12437) to use the MSVC default
  151. # value (1 MB) which is not enough for us in tasks such as parsing recursive
  152. # C++ templates in Clang.
  153. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:10000000")
  154. endif()
  155. if( MSVC10 )
  156. # MSVC 10 will complain about headers in the STL not being exported, but
  157. # will not complain in MSVC 11.
  158. add_llvm_definitions(
  159. -wd4275 # Suppress 'An exported class was derived from a class that was not exported.'
  160. )
  161. elseif( MSVC11 )
  162. add_llvm_definitions(-D_VARIADIC_MAX=10)
  163. endif()
  164. # Add definitions that make MSVC much less annoying.
  165. add_llvm_definitions(
  166. # For some reason MS wants to deprecate a bunch of standard functions...
  167. -D_CRT_SECURE_NO_DEPRECATE
  168. -D_CRT_SECURE_NO_WARNINGS
  169. -D_CRT_NONSTDC_NO_DEPRECATE
  170. -D_CRT_NONSTDC_NO_WARNINGS
  171. -D_SCL_SECURE_NO_DEPRECATE
  172. -D_SCL_SECURE_NO_WARNINGS
  173. # Disabled warnings.
  174. -wd4146 # Suppress 'unary minus operator applied to unsigned type, result still unsigned'
  175. -wd4180 # Suppress 'qualifier applied to function type has no meaning; ignored'
  176. -wd4244 # Suppress ''argument' : conversion from 'type1' to 'type2', possible loss of data'
  177. -wd4267 # Suppress ''var' : conversion from 'size_t' to 'type', possible loss of data'
  178. -wd4345 # Suppress 'behavior change: an object of POD type constructed with an initializer of the form () will be default-initialized'
  179. -wd4351 # Suppress 'new behavior: elements of array 'array' will be default initialized'
  180. -wd4355 # Suppress ''this' : used in base member initializer list'
  181. -wd4503 # Suppress ''identifier' : decorated name length exceeded, name was truncated'
  182. -wd4624 # Suppress ''derived class' : destructor could not be generated because a base class destructor is inaccessible'
  183. -wd4800 # Suppress ''type' : forcing value to bool 'true' or 'false' (performance warning)'
  184. -wd4291 # Suppress ''declaration' : no matching operator delete found; memory will not be freed if initialization throws an exception'
  185. # Promoted warnings.
  186. -w14062 # Promote 'enumerator in switch of enum is not handled' to level 1 warning.
  187. # Promoted warnings to errors.
  188. -we4238 # Promote 'nonstandard extension used : class rvalue used as lvalue' to error.
  189. )
  190. # Enable warnings
  191. if (LLVM_ENABLE_WARNINGS)
  192. add_llvm_definitions( /W4 )
  193. if (LLVM_ENABLE_PEDANTIC)
  194. # No MSVC equivalent available
  195. endif (LLVM_ENABLE_PEDANTIC)
  196. endif (LLVM_ENABLE_WARNINGS)
  197. if (LLVM_ENABLE_WERROR)
  198. add_llvm_definitions( /WX )
  199. endif (LLVM_ENABLE_WERROR)
  200. elseif( LLVM_COMPILER_IS_GCC_COMPATIBLE )
  201. if (LLVM_ENABLE_WARNINGS)
  202. append("-Wall -W -Wno-unused-parameter -Wwrite-strings" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
  203. # Turn off missing field initializer warnings for gcc to avoid noise from
  204. # false positives with empty {}. Turn them on otherwise (they're off by
  205. # default for clang).
  206. check_cxx_compiler_flag("-Wmissing-field-initializers" CXX_SUPPORTS_MISSING_FIELD_INITIALIZERS_FLAG)
  207. if (CXX_SUPPORTS_MISSING_FIELD_INITIALIZERS_FLAG)
  208. if (CMAKE_COMPILER_IS_GNUCXX)
  209. append("-Wno-missing-field-initializers" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
  210. else()
  211. append("-Wmissing-field-initializers" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
  212. endif()
  213. endif()
  214. append_if(LLVM_ENABLE_PEDANTIC "-pedantic -Wno-long-long" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
  215. check_cxx_compiler_flag("-Werror -Wcovered-switch-default" CXX_SUPPORTS_COVERED_SWITCH_DEFAULT_FLAG)
  216. append_if(CXX_SUPPORTS_COVERED_SWITCH_DEFAULT_FLAG "-Wcovered-switch-default" CMAKE_CXX_FLAGS)
  217. check_c_compiler_flag("-Werror -Wcovered-switch-default" C_SUPPORTS_COVERED_SWITCH_DEFAULT_FLAG)
  218. append_if(C_SUPPORTS_COVERED_SWITCH_DEFAULT_FLAG "-Wcovered-switch-default" CMAKE_C_FLAGS)
  219. append_if(USE_NO_UNINITIALIZED "-Wno-uninitialized" CMAKE_CXX_FLAGS)
  220. append_if(USE_NO_MAYBE_UNINITIALIZED "-Wno-maybe-uninitialized" CMAKE_CXX_FLAGS)
  221. check_cxx_compiler_flag("-Werror -Wnon-virtual-dtor" CXX_SUPPORTS_NON_VIRTUAL_DTOR_FLAG)
  222. append_if(CXX_SUPPORTS_NON_VIRTUAL_DTOR_FLAG "-Wnon-virtual-dtor" CMAKE_CXX_FLAGS)
  223. endif (LLVM_ENABLE_WARNINGS)
  224. if (LLVM_ENABLE_WERROR)
  225. add_llvm_definitions( -Werror )
  226. endif (LLVM_ENABLE_WERROR)
  227. endif( MSVC )
  228. macro(append_common_sanitizer_flags)
  229. # Append -fno-omit-frame-pointer and turn on debug info to get better
  230. # stack traces.
  231. add_flag_if_supported("-fno-omit-frame-pointer")
  232. if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
  233. NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
  234. add_flag_if_supported("-gline-tables-only")
  235. endif()
  236. # Use -O1 even in debug mode, otherwise sanitizers slowdown is too large.
  237. if (uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
  238. add_flag_if_supported("-O1")
  239. endif()
  240. endmacro()
  241. # Turn on sanitizers if necessary.
  242. if(LLVM_USE_SANITIZER)
  243. if (LLVM_ON_UNIX)
  244. if (LLVM_USE_SANITIZER STREQUAL "Address")
  245. append_common_sanitizer_flags()
  246. add_flag_or_print_warning("-fsanitize=address")
  247. elseif (LLVM_USE_SANITIZER MATCHES "Memory(WithOrigins)?")
  248. append_common_sanitizer_flags()
  249. add_flag_or_print_warning("-fsanitize=memory")
  250. if(LLVM_USE_SANITIZER STREQUAL "MemoryWithOrigins")
  251. add_flag_or_print_warning("-fsanitize-memory-track-origins")
  252. endif()
  253. else()
  254. message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${LLVM_USE_SANITIZER}")
  255. endif()
  256. else()
  257. message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.")
  258. endif()
  259. endif()
  260. # Turn on -gsplit-dwarf if requested
  261. if(LLVM_USE_SPLIT_DWARF)
  262. add_llvm_definitions("-gsplit-dwarf")
  263. endif()
  264. add_llvm_definitions( -D__STDC_CONSTANT_MACROS )
  265. add_llvm_definitions( -D__STDC_FORMAT_MACROS )
  266. add_llvm_definitions( -D__STDC_LIMIT_MACROS )
  267. # clang doesn't print colored diagnostics when invoked from Ninja
  268. if (UNIX AND
  269. CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND
  270. CMAKE_GENERATOR STREQUAL "Ninja")
  271. append("-fcolor-diagnostics" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
  272. endif()