CMakeLists.txt 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. cmake_minimum_required(VERSION 3.2 FATAL_ERROR)
  2. cmake_policy(VERSION 3.2)
  3. set(GLM_VERSION "0.9.9")
  4. project(glm VERSION ${GLM_VERSION} LANGUAGES CXX)
  5. list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
  6. include(GNUInstallDirs)
  7. include(CMakePackageConfigHelpers)
  8. enable_testing()
  9. option(GLM_QUIET "No CMake Message" OFF)
  10. option(BUILD_SHARED_LIBS "Build shared library" ON)
  11. option(BUILD_STATIC_LIBS "Build static library" ON)
  12. option(GLM_TEST_ENABLE_CXX_98 "Enable C++ 98" OFF)
  13. option(GLM_TEST_ENABLE_CXX_11 "Enable C++ 11" OFF)
  14. option(GLM_TEST_ENABLE_CXX_14 "Enable C++ 14" OFF)
  15. option(GLM_TEST_ENABLE_CXX_17 "Enable C++ 17" OFF)
  16. option(GLM_TEST_ENABLE_CXX_20 "Enable C++ 20" OFF)
  17. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  18. if(GLM_TEST_ENABLE_CXX_20)
  19. set(CMAKE_CXX_STANDARD 20)
  20. add_definitions(-DGLM_FORCE_CXX2A)
  21. if(NOT GLM_QUIET)
  22. message(STATUS "GLM: Build with C++20 features")
  23. endif()
  24. elseif(GLM_TEST_ENABLE_CXX_17)
  25. set(CMAKE_CXX_STANDARD 17)
  26. add_definitions(-DGLM_FORCE_CXX17)
  27. if(NOT GLM_QUIET)
  28. message(STATUS "GLM: Build with C++17 features")
  29. endif()
  30. elseif(GLM_TEST_ENABLE_CXX_14)
  31. set(CMAKE_CXX_STANDARD 14)
  32. add_definitions(-DGLM_FORCE_CXX14)
  33. if(NOT GLM_QUIET)
  34. message(STATUS "GLM: Build with C++14 features")
  35. endif()
  36. elseif(GLM_TEST_ENABLE_CXX_11)
  37. set(CMAKE_CXX_STANDARD 11)
  38. add_definitions(-DGLM_FORCE_CXX11)
  39. if(NOT GLM_QUIET)
  40. message(STATUS "GLM: Build with C++11 features")
  41. endif()
  42. elseif(GLM_TEST_ENABLE_CXX_98)
  43. set(CMAKE_CXX_STANDARD 98)
  44. add_definitions(-DGLM_FORCE_CXX98)
  45. if(NOT GLM_QUIET)
  46. message(STATUS "GLM: Build with C++98 features")
  47. endif()
  48. endif()
  49. option(GLM_TEST_ENABLE_LANG_EXTENSIONS "Enable language extensions" OFF)
  50. option(GLM_DISABLE_AUTO_DETECTION "Enable language extensions" OFF)
  51. if(GLM_DISABLE_AUTO_DETECTION)
  52. add_definitions(-DGLM_FORCE_PLATFORM_UNKNOWN -DGLM_FORCE_COMPILER_UNKNOWN -DGLM_FORCE_ARCH_UNKNOWN -DGLM_FORCE_CXX_UNKNOWN)
  53. endif()
  54. if(GLM_TEST_ENABLE_LANG_EXTENSIONS)
  55. set(CMAKE_CXX_EXTENSIONS ON)
  56. if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "GNU"))
  57. add_compile_options(-fms-extensions)
  58. endif()
  59. message(STATUS "GLM: Build with C++ language extensions")
  60. else()
  61. set(CMAKE_CXX_EXTENSIONS OFF)
  62. if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  63. add_compile_options(/Za)
  64. if(MSVC15)
  65. add_compile_options(/permissive-)
  66. endif()
  67. endif()
  68. endif()
  69. option(GLM_TEST_ENABLE_FAST_MATH "Enable fast math optimizations" OFF)
  70. if(GLM_TEST_ENABLE_FAST_MATH)
  71. if(NOT GLM_QUIET)
  72. message(STATUS "GLM: Build with fast math optimizations")
  73. endif()
  74. if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "GNU"))
  75. add_compile_options(-ffast-math)
  76. elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  77. add_compile_options(/fp:fast)
  78. endif()
  79. else()
  80. if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  81. add_compile_options(/fp:precise)
  82. endif()
  83. endif()
  84. option(GLM_TEST_ENABLE "Build unit tests" ON)
  85. option(GLM_TEST_ENABLE_SIMD_SSE2 "Enable SSE2 optimizations" OFF)
  86. option(GLM_TEST_ENABLE_SIMD_SSE3 "Enable SSE3 optimizations" OFF)
  87. option(GLM_TEST_ENABLE_SIMD_SSSE3 "Enable SSSE3 optimizations" OFF)
  88. option(GLM_TEST_ENABLE_SIMD_SSE4_1 "Enable SSE 4.1 optimizations" OFF)
  89. option(GLM_TEST_ENABLE_SIMD_SSE4_2 "Enable SSE 4.2 optimizations" OFF)
  90. option(GLM_TEST_ENABLE_SIMD_AVX "Enable AVX optimizations" OFF)
  91. option(GLM_TEST_ENABLE_SIMD_AVX2 "Enable AVX2 optimizations" OFF)
  92. option(GLM_TEST_FORCE_PURE "Force 'pure' instructions" OFF)
  93. if(GLM_TEST_FORCE_PURE)
  94. add_definitions(-DGLM_FORCE_PURE)
  95. if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
  96. add_compile_options(-mfpmath=387)
  97. endif()
  98. message(STATUS "GLM: No SIMD instruction set")
  99. elseif(GLM_TEST_ENABLE_SIMD_AVX2)
  100. add_definitions(-DGLM_FORCE_PURE)
  101. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  102. add_compile_options(-mavx2)
  103. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  104. add_compile_options(/QxAVX2)
  105. elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  106. add_compile_options(/arch:AVX2)
  107. endif()
  108. message(STATUS "GLM: AVX2 instruction set")
  109. elseif(GLM_TEST_ENABLE_SIMD_AVX)
  110. add_definitions(-DGLM_FORCE_INTRINSICS)
  111. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  112. add_compile_options(-mavx)
  113. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  114. add_compile_options(/QxAVX)
  115. elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  116. add_compile_options(/arch:AVX)
  117. endif()
  118. message(STATUS "GLM: AVX instruction set")
  119. elseif(GLM_TEST_ENABLE_SIMD_SSE4_2)
  120. add_definitions(-DGLM_FORCE_INTRINSICS)
  121. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  122. add_compile_options(-msse4.2)
  123. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  124. add_compile_options(/QxSSE4.2)
  125. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  126. add_compile_options(/arch:SSE2) # VC doesn't support SSE4.2
  127. endif()
  128. message(STATUS "GLM: SSE4.2 instruction set")
  129. elseif(GLM_TEST_ENABLE_SIMD_SSE4_1)
  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(-msse4.1)
  133. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  134. add_compile_options(/QxSSE4.1)
  135. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  136. add_compile_options(/arch:SSE2) # VC doesn't support SSE4.1
  137. endif()
  138. message(STATUS "GLM: SSE4.1 instruction set")
  139. elseif(GLM_TEST_ENABLE_SIMD_SSSE3)
  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(-mssse3)
  143. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  144. add_compile_options(/QxSSSE3)
  145. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  146. add_compile_options(/arch:SSE2) # VC doesn't support SSSE3
  147. endif()
  148. message(STATUS "GLM: SSSE3 instruction set")
  149. elseif(GLM_TEST_ENABLE_SIMD_SSE3)
  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(-msse3)
  153. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  154. add_compile_options(/QxSSE3)
  155. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  156. add_compile_options(/arch:SSE2) # VC doesn't support SSE3
  157. endif()
  158. message(STATUS "GLM: SSE3 instruction set")
  159. elseif(GLM_TEST_ENABLE_SIMD_SSE2)
  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(-msse2)
  163. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  164. add_compile_options(/QxSSE2)
  165. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  166. add_compile_options(/arch:SSE2)
  167. endif()
  168. message(STATUS "GLM: SSE2 instruction set")
  169. endif()
  170. # Compiler and default options
  171. if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  172. if(NOT GLM_QUIET)
  173. message("GLM: Clang - ${CMAKE_CXX_COMPILER_ID} compiler")
  174. endif()
  175. add_compile_options(-Werror -Weverything)
  176. 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)
  177. 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)
  178. elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
  179. if(NOT GLM_QUIET)
  180. message("GLM: GCC - ${CMAKE_CXX_COMPILER_ID} compiler")
  181. endif()
  182. add_compile_options(-O2)
  183. add_compile_options(-Wno-long-long)
  184. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  185. if(NOT GLM_QUIET)
  186. message("GLM: Intel - ${CMAKE_CXX_COMPILER_ID} compiler")
  187. endif()
  188. elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  189. if(NOT GLM_QUIET)
  190. message("GLM: Visual C++ - ${CMAKE_CXX_COMPILER_ID} compiler")
  191. endif()
  192. add_compile_options(/W4 /WX)
  193. add_compile_options(/wd4309 /wd4324 /wd4389 /wd4127 /wd4267 /wd4146 /wd4201 /wd4464 /wd4514 /wd4701 /wd4820 /wd4365)
  194. add_definitions(-D_CRT_SECURE_NO_WARNINGS)
  195. endif()
  196. include_directories("${PROJECT_SOURCE_DIR}")
  197. add_subdirectory(glm)
  198. add_subdirectory(test)
  199. set(GLM_INSTALL_CONFIGDIR "${CMAKE_INSTALL_LIBDIR}/cmake/glm")
  200. install(DIRECTORY glm DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
  201. write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/glmConfigVersion.cmake" VERSION ${GLM_VERSION} COMPATIBILITY AnyNewerVersion)
  202. # build tree package config
  203. configure_file(cmake/glmBuildConfig.cmake.in glmConfig.cmake @ONLY)
  204. # install tree package config
  205. configure_package_config_file(
  206. cmake/glmConfig.cmake.in
  207. ${GLM_INSTALL_CONFIGDIR}/glmConfig.cmake
  208. INSTALL_DESTINATION ${GLM_INSTALL_CONFIGDIR}
  209. PATH_VARS CMAKE_INSTALL_INCLUDEDIR
  210. NO_CHECK_REQUIRED_COMPONENTS_MACRO)
  211. install(FILES
  212. "${CMAKE_CURRENT_BINARY_DIR}/${GLM_INSTALL_CONFIGDIR}/glmConfig.cmake"
  213. "${CMAKE_CURRENT_BINARY_DIR}/glmConfigVersion.cmake"
  214. DESTINATION ${GLM_INSTALL_CONFIGDIR})
  215. add_library(glm INTERFACE)
  216. target_include_directories(glm INTERFACE
  217. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  218. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
  219. install(TARGETS glm EXPORT glmTargets)
  220. export(EXPORT glmTargets FILE "${CMAKE_CURRENT_BINARY_DIR}/glmTargets.cmake")
  221. install(EXPORT glmTargets FILE glmTargets.cmake DESTINATION ${GLM_INSTALL_CONFIGDIR})
  222. # build pkg-config file
  223. configure_file("./cmake/glm.pc.in" "glm.pc" @ONLY)
  224. # install pkg-config file
  225. install(FILES "${CMAKE_CURRENT_BINARY_DIR}/glm.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
  226. export(PACKAGE glm)
  227. if(NOT TARGET uninstall)
  228. configure_file(
  229. ${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in
  230. ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
  231. IMMEDIATE @ONLY)
  232. add_custom_target(uninstall
  233. COMMAND ${CMAKE_COMMAND} -P
  234. ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
  235. endif()