CMakeLists.txt 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. option(GLM_QUIET "No CMake Message" OFF)
  2. option(BUILD_SHARED_LIBS "Build shared library" ON)
  3. option(BUILD_STATIC_LIBS "Build static library" ON)
  4. option(GLM_TEST_ENABLE_CXX_98 "Enable C++ 98" OFF)
  5. option(GLM_TEST_ENABLE_CXX_11 "Enable C++ 11" OFF)
  6. option(GLM_TEST_ENABLE_CXX_14 "Enable C++ 14" OFF)
  7. option(GLM_TEST_ENABLE_CXX_17 "Enable C++ 17" OFF)
  8. option(GLM_TEST_ENABLE_CXX_20 "Enable C++ 20" OFF)
  9. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  10. if(GLM_TEST_ENABLE_CXX_20)
  11. set(CMAKE_CXX_STANDARD 20)
  12. add_definitions(-DGLM_FORCE_CXX2A)
  13. if(NOT GLM_QUIET)
  14. message(STATUS "GLM: Build with C++20 features")
  15. endif()
  16. elseif(GLM_TEST_ENABLE_CXX_17)
  17. set(CMAKE_CXX_STANDARD 17)
  18. add_definitions(-DGLM_FORCE_CXX17)
  19. if(NOT GLM_QUIET)
  20. message(STATUS "GLM: Build with C++17 features")
  21. endif()
  22. elseif(GLM_TEST_ENABLE_CXX_14)
  23. set(CMAKE_CXX_STANDARD 14)
  24. add_definitions(-DGLM_FORCE_CXX14)
  25. if(NOT GLM_QUIET)
  26. message(STATUS "GLM: Build with C++14 features")
  27. endif()
  28. elseif(GLM_TEST_ENABLE_CXX_11)
  29. set(CMAKE_CXX_STANDARD 11)
  30. add_definitions(-DGLM_FORCE_CXX11)
  31. if(NOT GLM_QUIET)
  32. message(STATUS "GLM: Build with C++11 features")
  33. endif()
  34. elseif(GLM_TEST_ENABLE_CXX_98)
  35. set(CMAKE_CXX_STANDARD 98)
  36. add_definitions(-DGLM_FORCE_CXX98)
  37. if(NOT GLM_QUIET)
  38. message(STATUS "GLM: Build with C++98 features")
  39. endif()
  40. endif()
  41. option(GLM_TEST_ENABLE_LANG_EXTENSIONS "Enable language extensions" OFF)
  42. option(GLM_DISABLE_AUTO_DETECTION "Enable language extensions" OFF)
  43. if(GLM_DISABLE_AUTO_DETECTION)
  44. add_definitions(-DGLM_FORCE_PLATFORM_UNKNOWN -DGLM_FORCE_COMPILER_UNKNOWN -DGLM_FORCE_ARCH_UNKNOWN -DGLM_FORCE_CXX_UNKNOWN)
  45. endif()
  46. if(GLM_TEST_ENABLE_LANG_EXTENSIONS)
  47. set(CMAKE_CXX_EXTENSIONS ON)
  48. if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "GNU"))
  49. add_compile_options(-fms-extensions)
  50. endif()
  51. message(STATUS "GLM: Build with C++ language extensions")
  52. else()
  53. set(CMAKE_CXX_EXTENSIONS OFF)
  54. if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  55. add_compile_options(/Za)
  56. if(MSVC15)
  57. add_compile_options(/permissive-)
  58. endif()
  59. endif()
  60. endif()
  61. option(GLM_TEST_ENABLE_FAST_MATH "Enable fast math optimizations" OFF)
  62. if(GLM_TEST_ENABLE_FAST_MATH)
  63. if(NOT GLM_QUIET)
  64. message(STATUS "GLM: Build with fast math optimizations")
  65. endif()
  66. if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "GNU"))
  67. add_compile_options(-ffast-math)
  68. elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  69. add_compile_options(/fp:fast)
  70. endif()
  71. else()
  72. if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  73. add_compile_options(/fp:precise)
  74. endif()
  75. endif()
  76. option(GLM_TEST_ENABLE "Build unit tests" ON)
  77. option(GLM_TEST_ENABLE_SIMD_SSE2 "Enable SSE2 optimizations" OFF)
  78. option(GLM_TEST_ENABLE_SIMD_SSE3 "Enable SSE3 optimizations" OFF)
  79. option(GLM_TEST_ENABLE_SIMD_SSSE3 "Enable SSSE3 optimizations" OFF)
  80. option(GLM_TEST_ENABLE_SIMD_SSE4_1 "Enable SSE 4.1 optimizations" OFF)
  81. option(GLM_TEST_ENABLE_SIMD_SSE4_2 "Enable SSE 4.2 optimizations" OFF)
  82. option(GLM_TEST_ENABLE_SIMD_AVX "Enable AVX optimizations" OFF)
  83. option(GLM_TEST_ENABLE_SIMD_AVX2 "Enable AVX2 optimizations" OFF)
  84. option(GLM_TEST_FORCE_PURE "Force 'pure' instructions" OFF)
  85. if(GLM_TEST_FORCE_PURE)
  86. add_definitions(-DGLM_FORCE_PURE)
  87. if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
  88. add_compile_options(-mfpmath=387)
  89. endif()
  90. message(STATUS "GLM: No SIMD instruction set")
  91. elseif(GLM_TEST_ENABLE_SIMD_AVX2)
  92. add_definitions(-DGLM_FORCE_PURE)
  93. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  94. add_compile_options(-mavx2)
  95. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  96. add_compile_options(/QxAVX2)
  97. elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  98. add_compile_options(/arch:AVX2)
  99. endif()
  100. message(STATUS "GLM: AVX2 instruction set")
  101. elseif(GLM_TEST_ENABLE_SIMD_AVX)
  102. add_definitions(-DGLM_FORCE_INTRINSICS)
  103. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  104. add_compile_options(-mavx)
  105. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  106. add_compile_options(/QxAVX)
  107. elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  108. add_compile_options(/arch:AVX)
  109. endif()
  110. message(STATUS "GLM: AVX instruction set")
  111. elseif(GLM_TEST_ENABLE_SIMD_SSE4_2)
  112. add_definitions(-DGLM_FORCE_INTRINSICS)
  113. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  114. add_compile_options(-msse4.2)
  115. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  116. add_compile_options(/QxSSE4.2)
  117. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  118. add_compile_options(/arch:SSE2) # VC doesn't support SSE4.2
  119. endif()
  120. message(STATUS "GLM: SSE4.2 instruction set")
  121. elseif(GLM_TEST_ENABLE_SIMD_SSE4_1)
  122. add_definitions(-DGLM_FORCE_INTRINSICS)
  123. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  124. add_compile_options(-msse4.1)
  125. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  126. add_compile_options(/QxSSE4.1)
  127. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  128. add_compile_options(/arch:SSE2) # VC doesn't support SSE4.1
  129. endif()
  130. message(STATUS "GLM: SSE4.1 instruction set")
  131. elseif(GLM_TEST_ENABLE_SIMD_SSSE3)
  132. add_definitions(-DGLM_FORCE_INTRINSICS)
  133. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  134. add_compile_options(-mssse3)
  135. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  136. add_compile_options(/QxSSSE3)
  137. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  138. add_compile_options(/arch:SSE2) # VC doesn't support SSSE3
  139. endif()
  140. message(STATUS "GLM: SSSE3 instruction set")
  141. elseif(GLM_TEST_ENABLE_SIMD_SSE3)
  142. add_definitions(-DGLM_FORCE_INTRINSICS)
  143. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  144. add_compile_options(-msse3)
  145. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  146. add_compile_options(/QxSSE3)
  147. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  148. add_compile_options(/arch:SSE2) # VC doesn't support SSE3
  149. endif()
  150. message(STATUS "GLM: SSE3 instruction set")
  151. elseif(GLM_TEST_ENABLE_SIMD_SSE2)
  152. add_definitions(-DGLM_FORCE_INTRINSICS)
  153. if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  154. add_compile_options(-msse2)
  155. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  156. add_compile_options(/QxSSE2)
  157. elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND NOT CMAKE_CL_64)
  158. add_compile_options(/arch:SSE2)
  159. endif()
  160. message(STATUS "GLM: SSE2 instruction set")
  161. endif()
  162. # Compiler and default options
  163. if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  164. if(NOT GLM_QUIET)
  165. message("GLM: Clang - ${CMAKE_CXX_COMPILER_ID} compiler")
  166. endif()
  167. add_compile_options(-Werror -Weverything)
  168. 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)
  169. 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)
  170. elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
  171. if(NOT GLM_QUIET)
  172. message("GLM: GCC - ${CMAKE_CXX_COMPILER_ID} compiler")
  173. endif()
  174. add_compile_options(-O2)
  175. add_compile_options(-Wno-long-long)
  176. elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  177. if(NOT GLM_QUIET)
  178. message("GLM: Intel - ${CMAKE_CXX_COMPILER_ID} compiler")
  179. endif()
  180. elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  181. if(NOT GLM_QUIET)
  182. message("GLM: Visual C++ - ${CMAKE_CXX_COMPILER_ID} compiler")
  183. endif()
  184. add_compile_options(/W4 /WX)
  185. add_compile_options(/wd4309 /wd4324 /wd4389 /wd4127 /wd4267 /wd4146 /wd4201 /wd4464 /wd4514 /wd4701 /wd4820 /wd4365)
  186. add_definitions(-D_CRT_SECURE_NO_WARNINGS)
  187. endif()
  188. function(glmCreateTestGTC NAME)
  189. set(SAMPLE_NAME test-${NAME})
  190. add_executable(${SAMPLE_NAME} ${NAME}.cpp)
  191. add_test(
  192. NAME ${SAMPLE_NAME}
  193. COMMAND $<TARGET_FILE:${SAMPLE_NAME}> )
  194. target_link_libraries(${SAMPLE_NAME} PRIVATE glm::glm)
  195. endfunction()
  196. if(GLM_TEST_ENABLE)
  197. add_subdirectory(bug)
  198. add_subdirectory(core)
  199. add_subdirectory(ext)
  200. add_subdirectory(gtc)
  201. add_subdirectory(gtx)
  202. add_subdirectory(perf)
  203. endif()