CMakeLists.txt 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. cmake_minimum_required(VERSION 3.6 FATAL_ERROR)
  2. cmake_policy(VERSION 3.6)
  3. file(READ "glm/detail/setup.hpp" GLM_SETUP_FILE)
  4. string(REGEX MATCH "#define[ ]+GLM_VERSION_MAJOR[ ]+([0-9]+)" _ ${GLM_SETUP_FILE})
  5. set(GLM_VERSION_MAJOR "${CMAKE_MATCH_1}")
  6. string(REGEX MATCH "#define[ ]+GLM_VERSION_MINOR[ ]+([0-9]+)" _ ${GLM_SETUP_FILE})
  7. set(GLM_VERSION_MINOR "${CMAKE_MATCH_1}")
  8. string(REGEX MATCH "#define[ ]+GLM_VERSION_PATCH[ ]+([0-9]+)" _ ${GLM_SETUP_FILE})
  9. set(GLM_VERSION_PATCH "${CMAKE_MATCH_1}")
  10. string(REGEX MATCH "#define[ ]+GLM_VERSION_REVISION[ ]+([0-9]+)" _ ${GLM_SETUP_FILE})
  11. set(GLM_VERSION_REVISION "${CMAKE_MATCH_1}")
  12. set(GLM_VERSION ${GLM_VERSION_MAJOR}.${GLM_VERSION_MINOR}.${GLM_VERSION_PATCH})
  13. project(glm VERSION ${GLM_VERSION} LANGUAGES CXX)
  14. message(STATUS "GLM: Version " ${GLM_VERSION})
  15. set(GLM_IS_MASTER_PROJECT OFF)
  16. if (${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR})
  17. set(GLM_IS_MASTER_PROJECT ON)
  18. endif()
  19. option(GLM_BUILD_LIBRARY "Build dynamic/static library" ON)
  20. option(GLM_BUILD_TESTS "Build the test programs" ${GLM_IS_MASTER_PROJECT})
  21. option(GLM_BUILD_INSTALL "Generate the install target" ${GLM_IS_MASTER_PROJECT})
  22. include(GNUInstallDirs)
  23. option(GLM_ENABLE_CXX_98 "Enable C++ 98" OFF)
  24. option(GLM_ENABLE_CXX_11 "Enable C++ 11" OFF)
  25. option(GLM_ENABLE_CXX_14 "Enable C++ 14" OFF)
  26. option(GLM_ENABLE_CXX_17 "Enable C++ 17" OFF)
  27. option(GLM_ENABLE_CXX_20 "Enable C++ 20" OFF)
  28. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  29. if(GLM_ENABLE_CXX_20)
  30. set(CMAKE_CXX_STANDARD 20)
  31. add_definitions(-DGLM_FORCE_CXX20)
  32. if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  33. message(STATUS "GLM: Disable -Wc++98-compat warnings")
  34. add_compile_options(-Wno-c++98-compat)
  35. add_compile_options(-Wno-c++98-compat-pedantic)
  36. endif()
  37. if(NOT GLM_QUIET)
  38. message(STATUS "GLM: Build with C++20 features")
  39. endif()
  40. elseif(GLM_ENABLE_CXX_17)
  41. set(CMAKE_CXX_STANDARD 17)
  42. add_definitions(-DGLM_FORCE_CXX17)
  43. if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  44. message(STATUS "GLM: Disable -Wc++98-compat warnings")
  45. add_compile_options(-Wno-c++98-compat)
  46. add_compile_options(-Wno-c++98-compat-pedantic)
  47. endif()
  48. if(NOT GLM_QUIET)
  49. message(STATUS "GLM: Build with C++17 features")
  50. endif()
  51. elseif(GLM_ENABLE_CXX_14)
  52. set(CMAKE_CXX_STANDARD 14)
  53. add_definitions(-DGLM_FORCE_CXX14)
  54. if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  55. message(STATUS "GLM: Disable -Wc++98-compat warnings")
  56. add_compile_options(-Wno-c++98-compat)
  57. add_compile_options(-Wno-c++98-compat-pedantic)
  58. endif()
  59. if(NOT GLM_QUIET)
  60. message(STATUS "GLM: Build with C++14 features")
  61. endif()
  62. elseif(GLM_ENABLE_CXX_11)
  63. set(CMAKE_CXX_STANDARD 11)
  64. add_definitions(-DGLM_FORCE_CXX11)
  65. if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  66. message(STATUS "GLM: Disable -Wc++98-compat warnings")
  67. add_compile_options(-Wno-c++98-compat)
  68. add_compile_options(-Wno-c++98-compat-pedantic)
  69. endif()
  70. if(NOT GLM_QUIET)
  71. message(STATUS "GLM: Build with C++11 features")
  72. endif()
  73. elseif(GLM_ENABLE_CXX_98)
  74. set(CMAKE_CXX_STANDARD 98)
  75. add_definitions(-DGLM_FORCE_CXX98)
  76. if(NOT GLM_QUIET)
  77. message(STATUS "GLM: Build with C++98 features")
  78. endif()
  79. else()
  80. if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  81. message(STATUS "GLM: Disable -Wc++98-compat warnings")
  82. add_compile_options(-Wno-c++98-compat)
  83. add_compile_options(-Wno-c++98-compat-pedantic)
  84. endif()
  85. if(NOT GLM_QUIET)
  86. message(STATUS "GLM: Build with C++ features auto detection")
  87. endif()
  88. endif()
  89. option(GLM_ENABLE_LANG_EXTENSIONS "Enable language extensions" OFF)
  90. option(GLM_DISABLE_AUTO_DETECTION "Disable platform, compiler, arch and C++ language detection" OFF)
  91. if(GLM_DISABLE_AUTO_DETECTION)
  92. add_definitions(-DGLM_FORCE_PLATFORM_UNKNOWN -DGLM_FORCE_COMPILER_UNKNOWN -DGLM_FORCE_ARCH_UNKNOWN -DGLM_FORCE_CXX_UNKNOWN)
  93. endif()
  94. if(GLM_ENABLE_LANG_EXTENSIONS)
  95. set(CMAKE_CXX_EXTENSIONS ON)
  96. if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "GNU"))
  97. add_compile_options(-fms-extensions)
  98. endif()
  99. message(STATUS "GLM: Build with C++ language extensions")
  100. else()
  101. set(CMAKE_CXX_EXTENSIONS OFF)
  102. if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  103. add_compile_options(/Za)
  104. if(MSVC15)
  105. add_compile_options(/permissive-)
  106. endif()
  107. endif()
  108. endif()
  109. option(GLM_ENABLE_FAST_MATH "Enable fast math optimizations" OFF)
  110. if(GLM_ENABLE_FAST_MATH)
  111. if(NOT GLM_QUIET)
  112. message(STATUS "GLM: Build with fast math optimizations")
  113. endif()
  114. if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "GNU"))
  115. add_compile_options(-ffast-math)
  116. elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  117. add_compile_options(/fp:fast)
  118. endif()
  119. else()
  120. if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  121. add_compile_options(/fp:precise)
  122. endif()
  123. endif()
  124. option(GLM_ENABLE_SIMD_SSE2 "Enable SSE2 optimizations" OFF)
  125. option(GLM_ENABLE_SIMD_SSE3 "Enable SSE3 optimizations" OFF)
  126. option(GLM_ENABLE_SIMD_SSSE3 "Enable SSSE3 optimizations" OFF)
  127. option(GLM_ENABLE_SIMD_SSE4_1 "Enable SSE 4.1 optimizations" OFF)
  128. option(GLM_ENABLE_SIMD_SSE4_2 "Enable SSE 4.2 optimizations" OFF)
  129. option(GLM_ENABLE_SIMD_AVX "Enable AVX optimizations" OFF)
  130. option(GLM_ENABLE_SIMD_AVX2 "Enable AVX2 optimizations" OFF)
  131. option(GLM_FORCE_PURE "Force 'pure' instructions" OFF)
  132. if(GLM_FORCE_PURE)
  133. add_definitions(-DGLM_FORCE_PURE)
  134. if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
  135. add_compile_options(-mfpmath=387)
  136. endif()
  137. message(STATUS "GLM: No SIMD instruction set")
  138. elseif(GLM_ENABLE_SIMD_AVX2)
  139. add_definitions(-DGLM_FORCE_INTRINSICS)
  140. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  141. add_compile_options(-mavx2)
  142. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  143. add_compile_options(/QxAVX2)
  144. elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  145. add_compile_options(/arch:AVX2)
  146. endif()
  147. message(STATUS "GLM: AVX2 instruction set")
  148. elseif(GLM_ENABLE_SIMD_AVX)
  149. add_definitions(-DGLM_FORCE_INTRINSICS)
  150. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  151. add_compile_options(-mavx)
  152. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  153. add_compile_options(/QxAVX)
  154. elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  155. add_compile_options(/arch:AVX)
  156. endif()
  157. message(STATUS "GLM: AVX instruction set")
  158. elseif(GLM_ENABLE_SIMD_SSE4_2)
  159. add_definitions(-DGLM_FORCE_INTRINSICS)
  160. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  161. add_compile_options(-msse4.2)
  162. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  163. add_compile_options(/QxSSE4.2)
  164. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  165. add_compile_options(/arch:SSE2) # VC doesn't support SSE4.2
  166. endif()
  167. message(STATUS "GLM: SSE4.2 instruction set")
  168. elseif(GLM_ENABLE_SIMD_SSE4_1)
  169. add_definitions(-DGLM_FORCE_INTRINSICS)
  170. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  171. add_compile_options(-msse4.1)
  172. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  173. add_compile_options(/QxSSE4.1)
  174. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  175. add_compile_options(/arch:SSE2) # VC doesn't support SSE4.1
  176. endif()
  177. message(STATUS "GLM: SSE4.1 instruction set")
  178. elseif(GLM_ENABLE_SIMD_SSSE3)
  179. add_definitions(-DGLM_FORCE_INTRINSICS)
  180. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  181. add_compile_options(-mssse3)
  182. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  183. add_compile_options(/QxSSSE3)
  184. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  185. add_compile_options(/arch:SSE2) # VC doesn't support SSSE3
  186. endif()
  187. message(STATUS "GLM: SSSE3 instruction set")
  188. elseif(GLM_ENABLE_SIMD_SSE3)
  189. add_definitions(-DGLM_FORCE_INTRINSICS)
  190. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  191. add_compile_options(-msse3)
  192. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  193. add_compile_options(/QxSSE3)
  194. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  195. add_compile_options(/arch:SSE2) # VC doesn't support SSE3
  196. endif()
  197. message(STATUS "GLM: SSE3 instruction set")
  198. elseif(GLM_ENABLE_SIMD_SSE2)
  199. add_definitions(-DGLM_FORCE_INTRINSICS)
  200. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  201. add_compile_options(-msse2)
  202. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  203. add_compile_options(/QxSSE2)
  204. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  205. add_compile_options(/arch:SSE2)
  206. endif()
  207. message(STATUS "GLM: SSE2 instruction set")
  208. endif()
  209. add_subdirectory(glm)
  210. if (GLM_BUILD_TESTS)
  211. include(CTest)
  212. add_subdirectory(test)
  213. endif()
  214. if (GLM_BUILD_INSTALL)
  215. include(CPack)
  216. install(TARGETS glm-header-only glm EXPORT glm)
  217. install(
  218. DIRECTORY glm
  219. DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
  220. PATTERN "CMakeLists.txt" EXCLUDE
  221. )
  222. install(
  223. EXPORT glm
  224. NAMESPACE glm::
  225. DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/glm"
  226. FILE glmConfig.cmake
  227. )
  228. include(CMakePackageConfigHelpers)
  229. write_basic_package_version_file(
  230. "${CMAKE_CURRENT_BINARY_DIR}/glmConfigVersion.cmake"
  231. COMPATIBILITY AnyNewerVersion
  232. )
  233. install(
  234. FILES "${CMAKE_CURRENT_BINARY_DIR}/glmConfigVersion.cmake"
  235. DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/glm"
  236. )
  237. configure_file(
  238. "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
  239. "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  240. IMMEDIATE @ONLY
  241. )
  242. add_custom_target(
  243. uninstall
  244. "${CMAKE_COMMAND}" -P
  245. "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  246. )
  247. endif()