CMakeLists.txt 9.7 KB

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