CMakeLists.txt 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. cmake_minimum_required(VERSION 3.0)
  2. cmake_policy(SET CMP0028 NEW) # Double colon in target name means ALIAS or IMPORTED target.
  3. cmake_policy(SET CMP0048 NEW) # The ``project()`` command manages VERSION variables.
  4. if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
  5. message(FATAL_ERROR "You don't want to configure in the source directory!")
  6. endif()
  7. if(NOT DEFINED CMAKE_BUILD_TYPE)
  8. set(CMAKE_BUILD_TYPE Release CACHE STRING
  9. "Choose the type of build, options are: None Debug Release RelWithDebug RelWithDebInfo MinSizeRel."
  10. FORCE)
  11. endif()
  12. # read version parts from version.h
  13. file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/Vc/version.h _version_lines REGEX "^#define Vc_VERSION_STRING ")
  14. string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" _version_matches "${_version_lines}")
  15. project(Vc VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}" LANGUAGES C CXX)
  16. #set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
  17. set(disabled_targets)
  18. include (VcMacros)
  19. include (AddTargetProperty)
  20. include (OptimizeForArchitecture)
  21. vc_determine_compiler()
  22. if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "(i686|x86|AMD64|amd64)")
  23. set(Vc_X86 TRUE)
  24. elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "(arm|aarch32|aarch64)")
  25. message(WARNING "No optimized implementation of the Vc types available for ${CMAKE_SYSTEM_PROCESSOR}")
  26. set(Vc_ARM TRUE)
  27. else()
  28. message(WARNING "No optimized implementation of the Vc types available for ${CMAKE_SYSTEM_PROCESSOR}")
  29. endif()
  30. option(USE_CCACHE "If enabled, ccache will be used (if it exists on the system) to speed up recompiles." OFF)
  31. if(USE_CCACHE)
  32. find_program(CCACHE_COMMAND ccache)
  33. if(CCACHE_COMMAND)
  34. mark_as_advanced(CCACHE_COMMAND)
  35. set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_COMMAND}")
  36. endif()
  37. endif()
  38. # TODO: check that 'decltype' compiles
  39. # TODO: check that 'constexpr' compiles
  40. if(NOT Vc_COMPILER_IS_MSVC) # MSVC doesn't provide a switch to turn C++11 on/off AFAIK
  41. AddCompilerFlag("-std=c++14" CXX_RESULT _ok CXX_FLAGS CMAKE_CXX_FLAGS)
  42. if(NOT _ok)
  43. AddCompilerFlag("-std=c++1y" CXX_RESULT _ok CXX_FLAGS CMAKE_CXX_FLAGS)
  44. if(NOT _ok)
  45. AddCompilerFlag("-std=c++11" CXX_RESULT _ok CXX_FLAGS CMAKE_CXX_FLAGS)
  46. if(NOT _ok)
  47. AddCompilerFlag("-std=c++0x" CXX_RESULT _ok CXX_FLAGS CMAKE_CXX_FLAGS)
  48. if(NOT _ok)
  49. message(FATAL_ERROR "Vc 1.x requires C++11, better even C++14. It seems this is not available. If this was incorrectly determined please notify vc-devel@compeng.uni-frankfurt.de")
  50. endif()
  51. endif()
  52. endif()
  53. endif()
  54. elseif(Vc_MSVC_VERSION LESS 180021114)
  55. message(FATAL_ERROR "Vc 1.x requires C++11 support. This requires at least Visual Studio 2013 with the Nov 2013 CTP.")
  56. endif()
  57. if(Vc_COMPILER_IS_GCC)
  58. if(Vc_GCC_VERSION VERSION_GREATER "5.0.0" AND Vc_GCC_VERSION VERSION_LESS "6.0.0")
  59. UserWarning("GCC 5 goes into an endless loop comiling example_scaling_scalar. Therefore, this target is disabled.")
  60. list(APPEND disabled_targets
  61. example_scaling_scalar
  62. )
  63. endif()
  64. elseif(Vc_COMPILER_IS_MSVC)
  65. if(MSVC_VERSION LESS 1700)
  66. # MSVC before 2012 has a broken std::vector::resize implementation. STL + Vc code will probably not compile.
  67. # UserWarning in VcMacros.cmake
  68. list(APPEND disabled_targets
  69. stlcontainer_sse
  70. stlcontainer_avx
  71. )
  72. endif()
  73. # Disable warning "C++ exception specification ignored except to indicate a function is not __declspec(nothrow)"
  74. # MSVC emits the warning for the _UnitTest_Compare desctructor which needs the throw declaration so that it doesn't std::terminate
  75. AddCompilerFlag("/wd4290")
  76. endif()
  77. vc_set_preferred_compiler_flags(WARNING_FLAGS BUILDTYPE_FLAGS)
  78. add_definitions(${Vc_DEFINITIONS})
  79. add_compile_options(${Vc_COMPILE_FLAGS})
  80. if(Vc_COMPILER_IS_INTEL)
  81. # per default icc is not IEEE compliant, but we need that for verification
  82. AddCompilerFlag("-fp-model source")
  83. endif()
  84. if(CMAKE_BUILD_TYPE STREQUAL "" AND NOT CMAKE_CXX_FLAGS MATCHES "-O[123]")
  85. message(STATUS "WARNING! It seems you are compiling without optimization. Please set CMAKE_BUILD_TYPE.")
  86. endif(CMAKE_BUILD_TYPE STREQUAL "" AND NOT CMAKE_CXX_FLAGS MATCHES "-O[123]")
  87. include_directories(${CMAKE_CURRENT_SOURCE_DIR}) # ${CMAKE_CURRENT_SOURCE_DIR}/include)
  88. add_custom_target(other VERBATIM)
  89. add_custom_target(Scalar COMMENT "build Scalar code" VERBATIM)
  90. add_custom_target(SSE COMMENT "build SSE code" VERBATIM)
  91. add_custom_target(AVX COMMENT "build AVX code" VERBATIM)
  92. add_custom_target(AVX2 COMMENT "build AVX2 code" VERBATIM)
  93. AddCompilerFlag(-ftemplate-depth=128 CXX_FLAGS CMAKE_CXX_FLAGS)
  94. set(libvc_compile_flags "-DVc_COMPILE_LIB")
  95. AddCompilerFlag("-fPIC" CXX_FLAGS libvc_compile_flags)
  96. # -fstack-protector is the default of GCC, but at least Ubuntu changes the default to -fstack-protector-strong, which is crazy
  97. AddCompilerFlag("-fstack-protector" CXX_FLAGS libvc_compile_flags)
  98. set(_srcs src/const.cpp)
  99. if(Vc_X86)
  100. list(APPEND _srcs src/cpuid.cpp src/support_x86.cpp)
  101. vc_compile_for_all_implementations(_srcs src/trigonometric.cpp ONLY SSE2 SSE3 SSSE3 SSE4_1 AVX SSE+XOP+FMA4 AVX+XOP+FMA4 AVX+XOP+FMA AVX+FMA AVX2+FMA+BMI2)
  102. vc_compile_for_all_implementations(_srcs src/sse_sorthelper.cpp ONLY SSE2 SSE4_1 AVX AVX2+FMA+BMI2)
  103. vc_compile_for_all_implementations(_srcs src/avx_sorthelper.cpp ONLY AVX AVX2+FMA+BMI2)
  104. elseif(Vc_ARM)
  105. list(APPEND _srcs src/support_dummy.cpp)
  106. else()
  107. list(APPEND _srcs src/support_dummy.cpp)
  108. endif()
  109. add_library(Vc STATIC ${_srcs})
  110. set_property(TARGET Vc APPEND PROPERTY COMPILE_OPTIONS ${libvc_compile_flags})
  111. add_target_property(Vc LABELS "other")
  112. if(XCODE)
  113. # TODO: document what this does and why it has no counterpart in the non-XCODE logic
  114. set_target_properties(Vc PROPERTIES XCODE_ATTRIBUTE_GCC_INLINES_ARE_PRIVATE_EXTERN "NO")
  115. set_target_properties(Vc PROPERTIES XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN "YES")
  116. set_target_properties(Vc PROPERTIES XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++0x")
  117. set_target_properties(Vc PROPERTIES XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++")
  118. elseif(UNIX AND Vc_COMPILER_IS_CLANG)
  119. # On UNIX (Linux) the standard library used by default typically is libstdc++ (GCC).
  120. # To get the full clang deal we rather want to build against libc++. This requires
  121. # additionally the libc++abi and libsupc++ libraries in all linker invokations.
  122. option(USE_LIBC++ "Use libc++ instead of the system default C++ standard library." OFF)
  123. if(USE_LIBC++)
  124. AddCompilerFlag(-stdlib=libc++ CXX_FLAGS CMAKE_CXX_FLAGS CXX_RESULT _use_libcxx)
  125. if(_use_libcxx)
  126. find_library(LIBC++ABI c++abi)
  127. mark_as_advanced(LIBC++ABI)
  128. if(LIBC++ABI)
  129. set(CMAKE_REQUIRED_LIBRARIES "${LIBC++ABI};supc++")
  130. CHECK_CXX_SOURCE_COMPILES("#include <stdexcept>
  131. #include <iostream>
  132. void foo() {
  133. std::cout << 'h' << std::flush << std::endl;
  134. throw std::exception();
  135. }
  136. int main() {
  137. try { foo(); }
  138. catch (int) { return 0; }
  139. return 1;
  140. }" libcxx_compiles)
  141. unset(CMAKE_REQUIRED_LIBRARIES)
  142. if(libcxx_compiles)
  143. link_libraries(${LIBC++ABI} supc++)
  144. endif()
  145. endif()
  146. endif()
  147. else()
  148. CHECK_CXX_SOURCE_COMPILES("#include <tuple>
  149. std::tuple<int> f() { std::tuple<int> r; return r; }
  150. int main() { return 0; }
  151. " tuple_sanity)
  152. if (NOT tuple_sanity)
  153. message(FATAL_ERROR "Clang and std::tuple brokenness detected. Please update your compiler.")
  154. endif()
  155. endif()
  156. endif()
  157. add_dependencies(other Vc)
  158. target_include_directories(Vc
  159. PUBLIC
  160. $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>
  161. $<INSTALL_INTERFACE:include>
  162. )
  163. install(TARGETS Vc EXPORT VcTargets DESTINATION lib${LIB_SUFFIX})
  164. install(DIRECTORY Vc/ DESTINATION include/Vc FILES_MATCHING REGEX "/*.(h|tcc|def)$")
  165. install(FILES
  166. Vc/Allocator
  167. Vc/IO
  168. Vc/Memory
  169. Vc/SimdArray
  170. Vc/Utils
  171. Vc/Vc
  172. Vc/algorithm
  173. Vc/array
  174. Vc/iterators
  175. Vc/limits
  176. Vc/simdize
  177. Vc/span
  178. Vc/type_traits
  179. Vc/vector
  180. DESTINATION include/Vc)
  181. # Generate and install CMake package and modules
  182. include(CMakePackageConfigHelpers)
  183. set(PACKAGE_INSTALL_DESTINATION
  184. lib${LIB_SUFFIX}/cmake/${PROJECT_NAME}
  185. )
  186. install(EXPORT ${PROJECT_NAME}Targets
  187. NAMESPACE ${PROJECT_NAME}::
  188. DESTINATION ${PACKAGE_INSTALL_DESTINATION}
  189. EXPORT_LINK_INTERFACE_LIBRARIES
  190. )
  191. write_basic_package_version_file(
  192. ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}ConfigVersion.cmake
  193. VERSION ${PROJECT_VERSION}
  194. COMPATIBILITY AnyNewerVersion
  195. )
  196. configure_package_config_file(
  197. ${CMAKE_SOURCE_DIR}/KFParticle/Vc/cmake/${PROJECT_NAME}Config.cmake.in
  198. ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}Config.cmake
  199. INSTALL_DESTINATION ${PACKAGE_INSTALL_DESTINATION}
  200. PATH_VARS CMAKE_INSTALL_PREFIX
  201. )
  202. install(FILES
  203. cmake/UserWarning.cmake
  204. cmake/VcMacros.cmake
  205. cmake/AddCompilerFlag.cmake
  206. cmake/CheckCCompilerFlag.cmake
  207. cmake/CheckCXXCompilerFlag.cmake
  208. cmake/OptimizeForArchitecture.cmake
  209. cmake/FindVc.cmake
  210. ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}Config.cmake
  211. ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}ConfigVersion.cmake
  212. DESTINATION ${PACKAGE_INSTALL_DESTINATION}
  213. )
  214. #Release# option(BUILD_TESTING "Build the testing tree." OFF)
  215. #include (CTest)
  216. #configure_file(${CMAKE_SOURCE_DIR}/CTestCustom.cmake ${CMAKE_BINARY_DIR}/CTestCustom.cmake COPYONLY)
  217. #if(BUILD_TESTING)
  218. # add_custom_target(build_tests ALL VERBATIM)
  219. # add_subdirectory(tests)
  220. #endif(BUILD_TESTING)
  221. #set(BUILD_EXAMPLES FALSE CACHE BOOL "Build examples.")
  222. #if(BUILD_EXAMPLES)
  223. # add_subdirectory(examples)
  224. #endif(BUILD_EXAMPLES)
  225. # Hide Vc_IMPL as it is only meant for users of Vc
  226. mark_as_advanced(Vc_IMPL)
  227. find_program(BIN_CAT cat)
  228. mark_as_advanced(BIN_CAT)
  229. if(BIN_CAT)
  230. file(REMOVE ${CMAKE_BINARY_DIR}/help.txt)
  231. add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/help.txt
  232. COMMAND ${CMAKE_MAKE_PROGRAM} help > ${CMAKE_BINARY_DIR}/help.txt
  233. VERBATIM
  234. )
  235. add_custom_target(cached_help
  236. ${BIN_CAT} ${CMAKE_BINARY_DIR}/help.txt
  237. DEPENDS ${CMAKE_BINARY_DIR}/help.txt
  238. VERBATIM
  239. )
  240. endif()