CMakeLists.txt 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. cmake_minimum_required(VERSION 3.15 FATAL_ERROR)
  2. project(JoltPhysics CXX)
  3. if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
  4. set(CMAKE_CONFIGURATION_TYPES "Debug;Release;Distribution")
  5. elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
  6. set(CMAKE_CONFIGURATION_TYPES "Debug;Release;ReleaseASAN;ReleaseUBSAN;ReleaseCoverage;Distribution")
  7. endif()
  8. if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
  9. # Fill in the path to the asan libraries
  10. set(CLANG_LIB_PATH "\"$(VSInstallDir)\\VC\\Tools\\Llvm\\x64\\lib\\clang\\${CMAKE_CXX_COMPILER_VERSION}\\lib\\windows\"")
  11. # 64 bit architecture
  12. set(CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE "x64")
  13. # Set runtime library
  14. set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
  15. # Set general compiler flags
  16. set(CMAKE_CXX_FLAGS "/std:c++17 /Zc:__cplusplus /GR- /Gm- /Wall /WX /EHsc /nologo /diagnostics:classic /FC /arch:AVX2 /fp:except- /Zc:inline /Zi /DWIN32 /D_WINDOWS /DUNICODE /D_UNICODE")
  17. # Set compiler flags for various configurations
  18. set(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /GS /Od /Ob0 /RTC1 /DJPH_PROFILE_ENABLED /DJPH_DEBUG_RENDERER")
  19. set(CMAKE_CXX_FLAGS_RELEASE "/DNDEBUG /GS- /GL /Gy /O2 /Oi /Ot /DJPH_PROFILE_ENABLED /DJPH_DEBUG_RENDERER")
  20. set(CMAKE_CXX_FLAGS_DISTRIBUTION "/DNDEBUG /GS- /GL /Gy /O2 /Oi /Ot")
  21. set(CMAKE_CXX_FLAGS_RELEASEASAN "/DNDEBUG /DJPH_PROFILE_ENABLED /DJPH_DISABLE_TEMP_ALLOCATOR /DJPH_DEBUG_RENDERER -fsanitize=address /Od")
  22. set(CMAKE_CXX_FLAGS_RELEASEUBSAN "/DNDEBUG /DJPH_PROFILE_ENABLED /DJPH_DEBUG_RENDERER -fsanitize=undefined,implicit-conversion")
  23. set(CMAKE_CXX_FLAGS_RELEASECOVERAGE "/DNDEBUG -fprofile-instr-generate -fcoverage-mapping")
  24. # Set linker flags
  25. set(CMAKE_EXE_LINKER_FLAGS "/machine:x64 /SUBSYSTEM:WINDOWS /ignore:4221 /DEBUG:FASTLINK")
  26. if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
  27. 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
  28. 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
  29. set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /DJPH_FLOATING_POINT_EXCEPTIONS_ENABLED")
  30. set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/INCREMENTAL:NO /LTCG:incremental /OPT:ICF /OPT:REF")
  31. set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "/LTCG")
  32. elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
  33. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /showFilenames -mavx2 -mfma -mf16c -mlzcnt -mpopcnt")
  34. 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")
  35. set(CMAKE_EXE_LINKER_FLAGS_RELEASEUBSAN "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LIBPATH:${CLANG_LIB_PATH}")
  36. set(CMAKE_EXE_LINKER_FLAGS_RELEASECOVERAGE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LIBPATH:${CLANG_LIB_PATH}")
  37. endif()
  38. elseif ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
  39. # Set general compiler flags (do not use -ffast-math since it cannot be turned off in a single compilation unit)
  40. set(CMAKE_CXX_FLAGS "-std=c++17 -I. -Wall -Werror")
  41. # Platform specific compiler flags
  42. if ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "AMD64")
  43. # X64
  44. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2 -mfma -mf16c -mlzcnt -mpopcnt")
  45. elseif ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")
  46. # ARM64
  47. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
  48. endif()
  49. # Set compiler flags for various configurations
  50. set(CMAKE_CXX_FLAGS_DEBUG "-g -D_DEBUG -DJPH_PROFILE_ENABLED -DJPH_DEBUG_RENDERER") # Clang reorders variables so that div by zero occurs if we enable exception checking
  51. set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -DJPH_PROFILE_ENABLED -DJPH_DEBUG_RENDERER")
  52. set(CMAKE_CXX_FLAGS_DISTRIBUTION "-O3 -DNDEBUG")
  53. set(CMAKE_CXX_FLAGS_RELEASEASAN "-DNDEBUG -DJPH_PROFILE_ENABLED -DJPH_DISABLE_TEMP_ALLOCATOR -DJPH_DEBUG_RENDERER -fsanitize=address")
  54. set(CMAKE_CXX_FLAGS_RELEASEUBSAN "-DNDEBUG -DJPH_PROFILE_ENABLED -DJPH_DEBUG_RENDERER -fsanitize=undefined,implicit-conversion")
  55. set(CMAKE_CXX_FLAGS_RELEASECOVERAGE "-DNDEBUG -fprofile-instr-generate -fcoverage-mapping")
  56. # Set linker flags
  57. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lpthread")
  58. endif()
  59. # Set linker flags
  60. set(CMAKE_EXE_LINKER_FLAGS_DISTRIBUTION "${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
  61. # Set repository root
  62. set(PHYSICS_REPO_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../)
  63. # Make Jolt Library
  64. include(${PHYSICS_REPO_ROOT}/Jolt/Jolt.cmake)
  65. # Create UnitTests executable
  66. include(${PHYSICS_REPO_ROOT}/UnitTests/UnitTests.cmake)
  67. add_executable(UnitTests ${UNIT_TESTS_SRC_FILES})
  68. target_include_directories(UnitTests PUBLIC ${JOLT_PHYSICS_ROOT} ${UNIT_TESTS_ROOT})
  69. target_link_libraries (UnitTests LINK_PUBLIC Jolt)
  70. if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
  71. target_link_options(UnitTests PUBLIC "/SUBSYSTEM:CONSOLE")
  72. endif()
  73. # Register unit tests as a test so that it can be run with:
  74. # ctest --output-on-failure
  75. enable_testing()
  76. add_test(UnitTests UnitTests)
  77. # Example 'Hello World' application
  78. include(${PHYSICS_REPO_ROOT}/HelloWorld/HelloWorld.cmake)
  79. add_executable(HelloWorld ${HELLO_WORLD_SRC_FILES})
  80. target_include_directories(HelloWorld PUBLIC ${JOLT_PHYSICS_ROOT} ${HELLO_WORLD_ROOT})
  81. target_link_libraries (HelloWorld LINK_PUBLIC Jolt)
  82. if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
  83. target_link_options(HelloWorld PUBLIC "/SUBSYSTEM:CONSOLE")
  84. endif()
  85. # Performance Test application
  86. include(${PHYSICS_REPO_ROOT}/PerformanceTest/PerformanceTest.cmake)
  87. add_executable(PerformanceTest ${PERFORMANCE_TEST_SRC_FILES})
  88. target_include_directories(PerformanceTest PUBLIC ${JOLT_PHYSICS_ROOT} ${PERFORMANCE_TEST_ROOT})
  89. target_link_libraries (PerformanceTest LINK_PUBLIC Jolt)
  90. if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
  91. target_link_options(PerformanceTest PUBLIC "/SUBSYSTEM:CONSOLE")
  92. endif()
  93. set_property(TARGET PerformanceTest PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${PHYSICS_REPO_ROOT}")
  94. if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
  95. # Windows only targets
  96. include(${PHYSICS_REPO_ROOT}/TestFramework/TestFramework.cmake)
  97. include(${PHYSICS_REPO_ROOT}/Samples/Samples.cmake)
  98. include(${PHYSICS_REPO_ROOT}/JoltViewer/JoltViewer.cmake)
  99. endif()