CMakeLists.txt 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  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. endif()
  80. option(GLM_ENABLE_LANG_EXTENSIONS "Enable language extensions" OFF)
  81. option(GLM_DISABLE_AUTO_DETECTION "Disable platform, compiler, arch and C++ language detection" OFF)
  82. if(GLM_DISABLE_AUTO_DETECTION)
  83. add_definitions(-DGLM_FORCE_PLATFORM_UNKNOWN -DGLM_FORCE_COMPILER_UNKNOWN -DGLM_FORCE_ARCH_UNKNOWN -DGLM_FORCE_CXX_UNKNOWN)
  84. endif()
  85. if(GLM_ENABLE_LANG_EXTENSIONS)
  86. set(CMAKE_CXX_EXTENSIONS ON)
  87. if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "GNU"))
  88. add_compile_options(-fms-extensions)
  89. endif()
  90. message(STATUS "GLM: Build with C++ language extensions")
  91. else()
  92. set(CMAKE_CXX_EXTENSIONS OFF)
  93. if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  94. add_compile_options(/Za)
  95. if(MSVC15)
  96. add_compile_options(/permissive-)
  97. endif()
  98. endif()
  99. endif()
  100. option(GLM_ENABLE_FAST_MATH "Enable fast math optimizations" OFF)
  101. if(GLM_ENABLE_FAST_MATH)
  102. if(NOT GLM_QUIET)
  103. message(STATUS "GLM: Build with fast math optimizations")
  104. endif()
  105. if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "GNU"))
  106. add_compile_options(-ffast-math)
  107. elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  108. add_compile_options(/fp:fast)
  109. endif()
  110. else()
  111. if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  112. add_compile_options(/fp:precise)
  113. endif()
  114. endif()
  115. option(GLM_ENABLE_SIMD_SSE2 "Enable SSE2 optimizations" OFF)
  116. option(GLM_ENABLE_SIMD_SSE3 "Enable SSE3 optimizations" OFF)
  117. option(GLM_ENABLE_SIMD_SSSE3 "Enable SSSE3 optimizations" OFF)
  118. option(GLM_ENABLE_SIMD_SSE4_1 "Enable SSE 4.1 optimizations" OFF)
  119. option(GLM_ENABLE_SIMD_SSE4_2 "Enable SSE 4.2 optimizations" OFF)
  120. option(GLM_ENABLE_SIMD_AVX "Enable AVX optimizations" OFF)
  121. option(GLM_ENABLE_SIMD_AVX2 "Enable AVX2 optimizations" OFF)
  122. option(GLM_FORCE_PURE "Force 'pure' instructions" OFF)
  123. if(GLM_FORCE_PURE)
  124. add_definitions(-DGLM_FORCE_PURE)
  125. if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
  126. add_compile_options(-mfpmath=387)
  127. endif()
  128. message(STATUS "GLM: No SIMD instruction set")
  129. elseif(GLM_ENABLE_SIMD_AVX2)
  130. add_definitions(-DGLM_FORCE_INTRINSICS)
  131. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  132. add_compile_options(-mavx2)
  133. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  134. add_compile_options(/QxAVX2)
  135. elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  136. add_compile_options(/arch:AVX2)
  137. endif()
  138. message(STATUS "GLM: AVX2 instruction set")
  139. elseif(GLM_ENABLE_SIMD_AVX)
  140. add_definitions(-DGLM_FORCE_INTRINSICS)
  141. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  142. add_compile_options(-mavx)
  143. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  144. add_compile_options(/QxAVX)
  145. elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  146. add_compile_options(/arch:AVX)
  147. endif()
  148. message(STATUS "GLM: AVX instruction set")
  149. elseif(GLM_ENABLE_SIMD_SSE4_2)
  150. add_definitions(-DGLM_FORCE_INTRINSICS)
  151. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  152. add_compile_options(-msse4.2)
  153. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  154. add_compile_options(/QxSSE4.2)
  155. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  156. add_compile_options(/arch:SSE2) # VC doesn't support SSE4.2
  157. endif()
  158. message(STATUS "GLM: SSE4.2 instruction set")
  159. elseif(GLM_ENABLE_SIMD_SSE4_1)
  160. add_definitions(-DGLM_FORCE_INTRINSICS)
  161. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  162. add_compile_options(-msse4.1)
  163. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  164. add_compile_options(/QxSSE4.1)
  165. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  166. add_compile_options(/arch:SSE2) # VC doesn't support SSE4.1
  167. endif()
  168. message(STATUS "GLM: SSE4.1 instruction set")
  169. elseif(GLM_ENABLE_SIMD_SSSE3)
  170. add_definitions(-DGLM_FORCE_INTRINSICS)
  171. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  172. add_compile_options(-mssse3)
  173. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  174. add_compile_options(/QxSSSE3)
  175. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  176. add_compile_options(/arch:SSE2) # VC doesn't support SSSE3
  177. endif()
  178. message(STATUS "GLM: SSSE3 instruction set")
  179. elseif(GLM_ENABLE_SIMD_SSE3)
  180. add_definitions(-DGLM_FORCE_INTRINSICS)
  181. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  182. add_compile_options(-msse3)
  183. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  184. add_compile_options(/QxSSE3)
  185. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  186. add_compile_options(/arch:SSE2) # VC doesn't support SSE3
  187. endif()
  188. message(STATUS "GLM: SSE3 instruction set")
  189. elseif(GLM_ENABLE_SIMD_SSE2)
  190. add_definitions(-DGLM_FORCE_INTRINSICS)
  191. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  192. add_compile_options(-msse2)
  193. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  194. add_compile_options(/QxSSE2)
  195. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  196. add_compile_options(/arch:SSE2)
  197. endif()
  198. message(STATUS "GLM: SSE2 instruction set")
  199. endif()
  200. # Compiler and default options
  201. if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  202. if(NOT GLM_QUIET)
  203. message("GLM: Clang - ${CMAKE_CXX_COMPILER_ID} compiler")
  204. endif()
  205. if(NOT GLM_DISABLE_AUTO_DETECTION)
  206. add_compile_options(-Werror -Weverything)
  207. endif()
  208. # add_compile_options(-Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-c++11-long-long -Wno-padded -Wno-gnu-anonymous-struct -Wno-nested-anon-types)
  209. # add_compile_options(-Wno-undefined-reinterpret-cast -Wno-sign-conversion -Wno-unused-variable -Wno-missing-prototypes -Wno-unreachable-code -Wno-missing-variable-declarations -Wno-sign-compare -Wno-global-constructors -Wno-unused-macros -Wno-format-nonliteral -Wno-float-equal)
  210. elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
  211. if(NOT GLM_QUIET)
  212. message("GLM: GCC - ${CMAKE_CXX_COMPILER_ID} compiler")
  213. endif()
  214. if(NOT GLM_DISABLE_AUTO_DETECTION)
  215. add_compile_options(-Werror)
  216. # add_compile_options(-Wpedantic)
  217. # add_compile_options(-Wall)
  218. # add_compile_options(-Wextra)
  219. endif()
  220. add_compile_options(-O2)
  221. #add_compile_options(-Wno-long-long)
  222. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  223. if(NOT GLM_QUIET)
  224. message("GLM: Intel - ${CMAKE_CXX_COMPILER_ID} compiler")
  225. endif()
  226. elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  227. if(NOT GLM_QUIET)
  228. message("GLM: Visual C++ - ${CMAKE_CXX_COMPILER_ID} compiler")
  229. endif()
  230. if(NOT GLM_DISABLE_AUTO_DETECTION)
  231. add_compile_options(/W4 /WX)
  232. endif()
  233. # add_compile_options(/wd4309 /wd4324 /wd4389 /wd4127 /wd4267 /wd4146 /wd4201 /wd4464 /wd4514 /wd4701 /wd4820 /wd4365)
  234. add_definitions(-D_CRT_SECURE_NO_WARNINGS)
  235. endif()
  236. add_subdirectory(glm)
  237. if (GLM_BUILD_TESTS)
  238. include(CTest)
  239. add_subdirectory(test)
  240. endif()
  241. if (GLM_BUILD_INSTALL)
  242. include(CPack)
  243. install(TARGETS glm-header-only glm EXPORT glm)
  244. install(
  245. DIRECTORY glm
  246. DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
  247. PATTERN "CMakeLists.txt" EXCLUDE
  248. )
  249. install(
  250. EXPORT glm
  251. NAMESPACE glm::
  252. DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/glm"
  253. FILE glmConfig.cmake
  254. )
  255. include(CMakePackageConfigHelpers)
  256. write_basic_package_version_file(
  257. "${CMAKE_CURRENT_BINARY_DIR}/glmConfigVersion.cmake"
  258. COMPATIBILITY AnyNewerVersion
  259. )
  260. install(
  261. FILES "${CMAKE_CURRENT_BINARY_DIR}/glmConfigVersion.cmake"
  262. DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/glm"
  263. )
  264. configure_file(
  265. "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
  266. "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  267. IMMEDIATE @ONLY
  268. )
  269. add_custom_target(
  270. uninstall
  271. "${CMAKE_COMMAND}" -P
  272. "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  273. )
  274. endif()