2
0

CMakeLists.txt 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. cmake_minimum_required(VERSION 3.15 FATAL_ERROR)
  2. project(JoltPhysics CXX)
  3. # Ability to turn ON/OFF individual applications
  4. option(TARGET_UNIT_TESTS "Build Unit Tests" ON)
  5. option(TARGET_HELLO_WORLD "Build Hello World" ON)
  6. option(TARGET_PERFORMANCE_TEST "Build Performance Test" ON)
  7. # Select X86 processor features to use (if everything is off it will be SSE2 compatible)
  8. option(USE_SSE4_1 "Enable SSE4.1" ON)
  9. option(USE_SSE4_2 "Enable SSE4.2" ON)
  10. option(USE_AVX "Enable AVX" ON)
  11. option(USE_AVX2 "Enable AVX2" ON)
  12. option(USE_LZCNT "Enable LZCNT" ON)
  13. option(USE_TZCNT "Enable TZCNT" ON)
  14. option(USE_F16C "Enable F16C" ON)
  15. option(USE_FMADD "Enable FMADD" ON)
  16. if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
  17. set(CMAKE_CONFIGURATION_TYPES "Debug;Release;Distribution")
  18. elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
  19. set(CMAKE_CONFIGURATION_TYPES "Debug;Release;ReleaseASAN;ReleaseUBSAN;ReleaseCoverage;Distribution")
  20. endif()
  21. if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
  22. # Fill in the path to the asan libraries
  23. set(CLANG_LIB_PATH "\"$(VSInstallDir)\\VC\\Tools\\Llvm\\x64\\lib\\clang\\${CMAKE_CXX_COMPILER_VERSION}\\lib\\windows\"")
  24. # 64 bit architecture
  25. set(CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE "x64")
  26. # Set runtime library
  27. set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
  28. # Set general compiler flags
  29. set(CMAKE_CXX_FLAGS "/std:c++17 /Zc:__cplusplus /GR- /Gm- /Wall /WX /EHsc /nologo /diagnostics:classic /FC /fp:except- /Zc:inline /Zi /DWIN32 /D_WINDOWS /DUNICODE /D_UNICODE")
  30. # Set compiler flags for various configurations
  31. set(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /GS /Od /Ob0 /RTC1 /DJPH_PROFILE_ENABLED /DJPH_DEBUG_RENDERER")
  32. set(CMAKE_CXX_FLAGS_RELEASE "/DNDEBUG /GS- /GL /Gy /O2 /Oi /Ot /DJPH_PROFILE_ENABLED /DJPH_DEBUG_RENDERER")
  33. set(CMAKE_CXX_FLAGS_DISTRIBUTION "/DNDEBUG /GS- /GL /Gy /O2 /Oi /Ot")
  34. set(CMAKE_CXX_FLAGS_RELEASEASAN "/DNDEBUG /DJPH_PROFILE_ENABLED /DJPH_DISABLE_TEMP_ALLOCATOR /DJPH_DEBUG_RENDERER -fsanitize=address /Od")
  35. set(CMAKE_CXX_FLAGS_RELEASEUBSAN "/DNDEBUG /DJPH_PROFILE_ENABLED /DJPH_DEBUG_RENDERER -fsanitize=undefined,implicit-conversion")
  36. set(CMAKE_CXX_FLAGS_RELEASECOVERAGE "/DNDEBUG -fprofile-instr-generate -fcoverage-mapping")
  37. # Set linker flags
  38. set(CMAKE_EXE_LINKER_FLAGS "/machine:x64 /SUBSYSTEM:WINDOWS /ignore:4221 /DEBUG:FASTLINK")
  39. if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
  40. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /fp:fast") # Clang doesn't use fast math because it cannot be turned off inside a single compilation unit
  41. if (USE_AVX2)
  42. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
  43. elseif (USE_AVX)
  44. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX")
  45. endif()
  46. if (USE_SSE4_1)
  47. add_compile_definitions(JPH_USE_SSE4_1)
  48. endif()
  49. if (USE_SSE4_2)
  50. add_compile_definitions(JPH_USE_SSE4_2)
  51. endif()
  52. if (USE_LZCNT)
  53. add_compile_definitions(JPH_USE_LZCNT)
  54. endif()
  55. if (USE_TZCNT)
  56. add_compile_definitions(JPH_USE_TZCNT)
  57. endif()
  58. if (USE_F16C)
  59. add_compile_definitions(JPH_USE_F16C)
  60. endif()
  61. if (USE_FMADD)
  62. add_compile_definitions(JPH_USE_FMADD)
  63. endif()
  64. set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /DJPH_FLOATING_POINT_EXCEPTIONS_ENABLED") # Clang turns Float2 into a vector sometimes causing floating point exceptions
  65. set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /DJPH_FLOATING_POINT_EXCEPTIONS_ENABLED")
  66. set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/INCREMENTAL:NO /LTCG:incremental /OPT:ICF /OPT:REF")
  67. set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "/LTCG")
  68. elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
  69. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /showFilenames")
  70. if (USE_AVX2)
  71. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2 -mbmi -mpopcnt -mlzcnt -mf16c -mfma")
  72. elseif (USE_AVX)
  73. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx -mpopcnt")
  74. elseif (USE_SSE4_2)
  75. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -mpopcnt")
  76. elseif (USE_SSE4_1)
  77. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1")
  78. else ()
  79. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2")
  80. endif()
  81. if (USE_LZCNT)
  82. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mlzcnt")
  83. endif()
  84. if (USE_TZCNT)
  85. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mbmi")
  86. endif()
  87. if (USE_F16C)
  88. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mf16c")
  89. endif()
  90. if (USE_FMADD)
  91. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfma")
  92. endif()
  93. set(CMAKE_EXE_LINKER_FLAGS_RELEASEASAN "/SUBSYSTEM:CONSOLE /LIBPATH:${CLANG_LIB_PATH} clang_rt.asan-x86_64.lib -wholearchive:clang_rt.asan-x86_64.lib clang_rt.asan_cxx-x86_64.lib -wholearchive:clang_rt.asan_cxx-x86_64.lib")
  94. set(CMAKE_EXE_LINKER_FLAGS_RELEASEUBSAN "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LIBPATH:${CLANG_LIB_PATH}")
  95. set(CMAKE_EXE_LINKER_FLAGS_RELEASECOVERAGE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LIBPATH:${CLANG_LIB_PATH}")
  96. endif()
  97. elseif ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" OR "${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin" OR "${CMAKE_SYSTEM_NAME}" STREQUAL "iOS")
  98. # Set general compiler flags (do not use -ffast-math since it cannot be turned off in a single compilation unit)
  99. set(CMAKE_CXX_FLAGS "-g -std=c++17 -I. -Wall -Werror")
  100. if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  101. # Somehow -Wcomment doesn't want to be turned off from code and we need this because Doxygen MathJax uses it
  102. # Also turn off automatic fused multiply add contractions, there doesn't seem to be a way to do this selectively through the macro JPH_PRECISE_MATH_OFF
  103. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-comment -ffp-contract=off")
  104. endif()
  105. # Platform specific compiler flags
  106. if ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "AMD64")
  107. # X64
  108. if (USE_AVX2)
  109. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2 -mbmi -mpopcnt -mlzcnt -mf16c -mfma")
  110. elseif (USE_AVX)
  111. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx -mpopcnt")
  112. elseif (USE_SSE4_2)
  113. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -mpopcnt")
  114. elseif (USE_SSE_4_1)
  115. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1")
  116. else()
  117. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2")
  118. endif()
  119. if (USE_LZCNT)
  120. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mlzcnt")
  121. endif()
  122. if (USE_TZCNT)
  123. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mbmi")
  124. endif()
  125. if (USE_F16C)
  126. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mf16c")
  127. endif()
  128. if (USE_FMADD)
  129. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfma")
  130. endif()
  131. elseif ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")
  132. # ARM64
  133. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
  134. endif()
  135. # Set compiler flags for various configurations
  136. set(CMAKE_CXX_FLAGS_DEBUG "-D_DEBUG -DJPH_PROFILE_ENABLED -DJPH_DEBUG_RENDERER") # Clang reorders variables so that div by zero occurs if we enable exception checking
  137. set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -DJPH_PROFILE_ENABLED -DJPH_DEBUG_RENDERER")
  138. set(CMAKE_CXX_FLAGS_DISTRIBUTION "-O3 -DNDEBUG")
  139. set(CMAKE_CXX_FLAGS_RELEASEASAN "-DNDEBUG -DJPH_PROFILE_ENABLED -DJPH_DISABLE_TEMP_ALLOCATOR -DJPH_DEBUG_RENDERER -fsanitize=address")
  140. set(CMAKE_CXX_FLAGS_RELEASEUBSAN "-DNDEBUG -DJPH_PROFILE_ENABLED -DJPH_DEBUG_RENDERER -fsanitize=undefined,implicit-conversion")
  141. set(CMAKE_CXX_FLAGS_RELEASECOVERAGE "-DNDEBUG -fprofile-instr-generate -fcoverage-mapping")
  142. # Set linker flags
  143. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread")
  144. endif()
  145. # Set linker flags
  146. set(CMAKE_EXE_LINKER_FLAGS_DISTRIBUTION "${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
  147. # Set repository root
  148. set(PHYSICS_REPO_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../)
  149. # Make Jolt Library
  150. include(${PHYSICS_REPO_ROOT}/Jolt/Jolt.cmake)
  151. if (IOS)
  152. # Ensure that we enable SSE4.2 for the x86_64 build, CMAKE_SYSTEM_PROCESSOR is not set for iOS
  153. set_property(TARGET Jolt PROPERTY XCODE_ATTRIBUTE_OTHER_CPLUSPLUSFLAGS[arch=x86_64] "$(inherited) -msse4.2 -mpopcnt")
  154. endif()
  155. if (TARGET_UNIT_TESTS)
  156. # Create UnitTests executable
  157. include(${PHYSICS_REPO_ROOT}/UnitTests/UnitTests.cmake)
  158. add_executable(UnitTests ${UNIT_TESTS_SRC_FILES})
  159. target_include_directories(UnitTests PUBLIC ${JOLT_PHYSICS_ROOT} ${UNIT_TESTS_ROOT})
  160. target_link_libraries (UnitTests LINK_PUBLIC Jolt)
  161. if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
  162. target_link_options(UnitTests PUBLIC "/SUBSYSTEM:CONSOLE")
  163. endif()
  164. if (IOS)
  165. # Set the bundle information
  166. set_property(TARGET UnitTests PROPERTY MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/iOS/UnitTestsInfo.plist")
  167. set_property(TARGET UnitTests PROPERTY XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.joltphysics.unittests")
  168. # Ensure that we enable SSE4.2 for the x86_64 build, CMAKE_SYSTEM_PROCESSOR is not set for iOS
  169. set_property(TARGET UnitTests PROPERTY XCODE_ATTRIBUTE_OTHER_CPLUSPLUSFLAGS[arch=x86_64] "$(inherited) -msse4.2 -mpopcnt")
  170. endif()
  171. # Register unit tests as a test so that it can be run with:
  172. # ctest --output-on-failure
  173. enable_testing()
  174. add_test(UnitTests UnitTests)
  175. endif()
  176. if (TARGET_HELLO_WORLD)
  177. # Example 'Hello World' application
  178. include(${PHYSICS_REPO_ROOT}/HelloWorld/HelloWorld.cmake)
  179. add_executable(HelloWorld ${HELLO_WORLD_SRC_FILES})
  180. target_include_directories(HelloWorld PUBLIC ${JOLT_PHYSICS_ROOT} ${HELLO_WORLD_ROOT})
  181. target_link_libraries (HelloWorld LINK_PUBLIC Jolt)
  182. if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
  183. target_link_options(HelloWorld PUBLIC "/SUBSYSTEM:CONSOLE")
  184. endif()
  185. endif()
  186. if (TARGET_PERFORMANCE_TEST)
  187. # Performance Test application
  188. include(${PHYSICS_REPO_ROOT}/PerformanceTest/PerformanceTest.cmake)
  189. add_executable(PerformanceTest ${PERFORMANCE_TEST_SRC_FILES})
  190. target_include_directories(PerformanceTest PUBLIC ${JOLT_PHYSICS_ROOT} ${PERFORMANCE_TEST_ROOT})
  191. target_link_libraries (PerformanceTest LINK_PUBLIC Jolt)
  192. if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
  193. target_link_options(PerformanceTest PUBLIC "/SUBSYSTEM:CONSOLE")
  194. endif()
  195. set_property(TARGET PerformanceTest PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${PHYSICS_REPO_ROOT}")
  196. endif()
  197. if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
  198. # Windows only targets
  199. include(${PHYSICS_REPO_ROOT}/TestFramework/TestFramework.cmake)
  200. include(${PHYSICS_REPO_ROOT}/Samples/Samples.cmake)
  201. include(${PHYSICS_REPO_ROOT}/JoltViewer/JoltViewer.cmake)
  202. endif()