xmake.lua 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. package("joltphysics")
  2. set_homepage("https://github.com/jrouwe/JoltPhysics")
  3. set_description("A multi core friendly rigid body physics and collision detection library suitable for games and VR applications.")
  4. set_license("MIT")
  5. add_urls("https://github.com/jrouwe/JoltPhysics/archive/refs/tags/$(version).tar.gz",
  6. "https://github.com/jrouwe/JoltPhysics.git")
  7. add_versions("v5.1.0", "525c9d6fb79471b3995f9d621c9f843e71470aed286872c4d4065c1f7b7d049a")
  8. add_versions("v5.0.0", "5231953d1b1d5b9cb617facf86341a11337e1cd04456949af6911b917a1646cb")
  9. add_versions("v4.0.2", "046baf71d05e47de7a530ce5d58a587a93ea7e9ea1ef8bf3ff80238fb95650ae")
  10. add_versions("v4.0.1", "e0bb4fa07047ca9c38bd71262427ad2972a7f45f8dff74587f73457f3b60df82")
  11. add_versions("v4.0.0", "f8449ec72ffaadf423eeb80e0814f3ba14227bcf7f06cb9f3cbcfb3499a57b33")
  12. add_versions("v3.0.1", "7ebb40bf2dddbcf0515984582aaa197ddd06e97581fd55b98cb64f91b243b8a6")
  13. add_versions("v3.0.0", "f8d756ae3471a32f2ee7e07475df2f7a34752f0fdd05e9a7ed2e7ce3dcdcd574")
  14. add_versions("v2.0.1", "96ae2e8691c4802e56bf2587da30f2cc86b8abe82a78bc2398065bd87dd718af")
  15. -- patch for SSE instructions not enabled in 32bits mode
  16. add_patches("v5.0.0", "https://github.com/jrouwe/JoltPhysics/commit/ebccdcbfae6b60e37480aa203d0781d26e437fbc.patch", "274f3a3ccbe2af8c1d94a66a96c894340764da2b447a13c43a665930c2d56337")
  17. -- patch for visibility attributes (fixes compilation in shared mode on GCC <13)
  18. add_patches("v4.0.0", "https://github.com/jrouwe/JoltPhysics/commit/b084d8f9054d78cb50bc851cc4db505462c4c634.patch", "a8f5da0bc5d4a1011771016be2ad1cdb00d4c40dd0909ef6ae4a1d1c95e8e251")
  19. -- patch for missing standard include (fixes Fedora compilation)
  20. add_patches("v3.0.1", path.join(os.scriptdir(), "patches", "v3.0.1", "fix_fedora.patch"), "12be1294669852a9f15cb01a636fde72fb5f36b59cbcc1d4f931d76c454c3150")
  21. add_patches("v3.0.0", path.join(os.scriptdir(), "patches", "v3.0.1", "fix_fedora.patch"), "12be1294669852a9f15cb01a636fde72fb5f36b59cbcc1d4f931d76c454c3150")
  22. add_patches("v2.0.1", path.join(os.scriptdir(), "patches", "v3.0.1", "fix_fedora.patch"), "12be1294669852a9f15cb01a636fde72fb5f36b59cbcc1d4f931d76c454c3150")
  23. -- patches for Android/ARMv7 and VS2019 ARM64 support
  24. add_patches("v2.0.1", path.join(os.scriptdir(), "patches", "v2.0.1", "android_fixes.patch"), "43b3d38ea5a01c281ad7b580859acaf0b30eac9a7bdc271a54199fcc88b8d491")
  25. add_patches("v2.0.1", path.join(os.scriptdir(), "patches", "v2.0.1", "armv7.patch"), "cbc59db0a0c786d473a05e84ed6f980c5288e531af44923864648c4471ccbd88")
  26. add_patches("v2.0.1", path.join(os.scriptdir(), "patches", "v2.0.1", "msvc_arm.patch"), "f6d368787ae7259dfbece7e8f1c1ba6af4d39f0f7c09a0f15186882bd827ed15")
  27. add_configs("cross_platform_deterministic", { description = "Turns on behavior to attempt cross platform determinism", default = false, type = "boolean" })
  28. add_configs("debug_renderer", { description = "Adds support to draw lines and triangles, used to be able to debug draw the state of the world", default = true, type = "boolean" })
  29. add_configs("double_precision", { description = "Compiles the library so that all positions are stored in doubles instead of floats. This makes larger worlds possible", default = false, type = "boolean" })
  30. add_configs("object_layer_bits", {description = "Number of bits to use in ObjectLayer. Can be 16 or 32.", default = "16", type = "string", values = {"16", "32"}})
  31. add_configs("object_stream", { description = "Compile the ObjectStream class and RTTI attribute information", default = true, type = "boolean" })
  32. add_configs("symbols", { description = "When turning this option on, the library will be compiled with debug symbols", default = false, type = "boolean" })
  33. if is_arch("i386", "x86", "x64", "x86_64") then
  34. add_configs("inst_avx", { description = "Enable AVX CPU instructions (x86/x64 only)", default = false, type = "boolean" })
  35. add_configs("inst_avx2", { description = "Enable AVX2 CPU instructions (x86/x64 only)", default = false, type = "boolean" })
  36. add_configs("inst_avx512", { description = "Enable AVX512F+AVX512VL CPU instructions (x86/x64 only)", default = false, type = "boolean" })
  37. add_configs("inst_f16c", { description = "Enable half float CPU instructions (x86/x64 only)", default = false, type = "boolean" })
  38. add_configs("inst_fmadd", { description = "Enable fused multiply add CPU instructions (x86/x64 only)", default = false, type = "boolean" })
  39. add_configs("inst_lzcnt", { description = "Enable the lzcnt CPU instruction (x86/x64 only)", default = false, type = "boolean" })
  40. add_configs("inst_sse4_1", { description = "Enable SSE4.1 CPU instructions (x86/x64 only)", default = false, type = "boolean" })
  41. add_configs("inst_sse4_2", { description = "Enable SSE4.2 CPU instructions (x86/x64 only)", default = false, type = "boolean" })
  42. add_configs("inst_tzcnt", { description = "Enable the tzcnt CPU instruction (x86/x64 only)", default = false, type = "boolean" })
  43. end
  44. if is_plat("linux", "macosx", "iphoneos", "bsd", "wasm") then
  45. add_syslinks("pthread")
  46. end
  47. if is_plat("mingw") and is_subhost("msys") then
  48. add_extsources("pacman::jolt-physics")
  49. end
  50. on_load(function (package)
  51. local version = package:version()
  52. if not version or version:ge("3.0.0") then
  53. package:add("deps", "cmake")
  54. package:add("defines", "JPH_OBJECT_LAYER_BITS=" .. package:config("object_layer_bits"))
  55. end
  56. if package:is_plat("windows") and not package:config("shared") then
  57. package:add("syslinks", "advapi32")
  58. end
  59. package:add("defines", "JPH_PROFILE_ENABLED")
  60. if package:is_plat("windows") then
  61. package:add("defines", "JPH_FLOATING_POINT_EXCEPTIONS_ENABLED")
  62. end
  63. if package:config("cross_platform_deterministic") then
  64. package:add("defines", "JPH_CROSS_PLATFORM_DETERMINISTIC")
  65. end
  66. if package:config("debug_renderer") then
  67. package:add("defines", "JPH_DEBUG_RENDERER")
  68. end
  69. if package:config("double_precision") then
  70. package:add("defines", "JPH_DOUBLE_PRECISION")
  71. end
  72. if package:config("shared") then
  73. package:add("defines", "JPH_SHARED_LIBRARY")
  74. end
  75. if not package:is_debug() then
  76. package:add("defines", "JPH_NO_DEBUG")
  77. end
  78. if package:config("object_stream") then
  79. package:add("defines", "JPH_OBJECT_STREAM")
  80. end
  81. if package:is_arch("i386", "x86", "x64", "x86_64") then
  82. -- add instruction sets (from https://github.com/jrouwe/JoltPhysics/blob/4cd52055e09160affcafa557b39520331bf0d034/Jolt/Jolt.cmake#L602)
  83. if package:is_plat("windows") then
  84. if package:config("inst_avx512") then
  85. package:add("cxxflags", "/arch:AVX512")
  86. elseif package:config("inst_avx2") then
  87. package:add("cxxflags", "/arch:AVX2")
  88. elseif package:config("inst_avx") then
  89. package:add("cxxflags", "/arch:AVX2")
  90. end
  91. else
  92. if package:config("inst_avx512") then
  93. package:add("cxxflags", "-mavx512f", "-mavx512vl", "-mavx512dq", "-mavx2", "-mbmi", "-mpopcnt", "-mlzcnt", "-mf16c")
  94. elseif package:config("inst_avx2") then
  95. package:add("cxxflags", "-mavx2", "-mbmi", "-mpopcnt", "-mlzcnt", "-mf16c")
  96. elseif package:config("inst_avx") then
  97. package:add("cxxflags", "-mavx", "-mpopcnt")
  98. elseif package:config("inst_sse4_2") then
  99. package:add("cxxflags", "-msse4.2", "-mpopcnt")
  100. elseif package:config("inst_sse4_1") then
  101. package:add("cxxflags", "-msse4.1")
  102. else
  103. package:add("cxxflags", "-msse2")
  104. end
  105. if package:config("inst_lzcnt") then
  106. package:add("cxxflags", "-mlzcnt")
  107. end
  108. if package:config("inst_tzcnt") then
  109. package:add("cxxflags", "-mbmi")
  110. end
  111. if package:config("inst_f16c") then
  112. package:add("cxxflags", "-mf16c")
  113. end
  114. if package:config("inst_fmadd") and not package:config("cross_platform_deterministic") then
  115. package:add("cxxflags", "-mfma")
  116. end
  117. package:add("cxxflags", "-mfpmath=sse")
  118. end
  119. if package:config("inst_avx512") then
  120. package:add("defines", "JPH_USE_AVX512")
  121. end
  122. if package:config("inst_avx2") then
  123. package:add("defines", "JPH_USE_AVX2")
  124. end
  125. if package:config("inst_avx") then
  126. package:add("defines", "JPH_USE_AVX")
  127. end
  128. if package:config("inst_sse4_1") then
  129. package:add("defines", "JPH_USE_SSE4_1")
  130. end
  131. if package:config("inst_sse4_2") then
  132. package:add("defines", "JPH_USE_SSE4_2")
  133. end
  134. if package:config("inst_lzcnt") then
  135. package:add("defines", "JPH_USE_LZCNT")
  136. end
  137. if package:config("inst_tzcnt") then
  138. package:add("defines", "JPH_USE_TZCNT")
  139. end
  140. if package:config("inst_f16c") then
  141. package:add("defines", "JPH_USE_F16C")
  142. end
  143. if package:config("inst_fmadd") and not package:config("cross_platform_deterministic") then
  144. package:add("defines", "JPH_USE_FMADD")
  145. end
  146. end
  147. end)
  148. on_install("windows", "mingw", "linux", "macosx", "iphoneos", "android", "wasm", "bsd", function (package)
  149. -- Jolt CMakeLists had no install target/support for custom msvc runtime until 3.0.0
  150. local version = package:version()
  151. if not version or version:ge("3.0.0") then
  152. os.cd("Build")
  153. local configs = {
  154. "-DENABLE_ALL_WARNINGS=OFF",
  155. "-DINTERPROCEDURAL_OPTIMIZATION=OFF",
  156. "-DTARGET_UNIT_TESTS=OFF",
  157. "-DTARGET_HELLO_WORLD=OFF",
  158. "-DTARGET_PERFORMANCE_TEST=OFF",
  159. "-DTARGET_SAMPLES=OFF",
  160. "-DTARGET_VIEWER=OFF",
  161. "-DUSE_STATIC_MSVC_RUNTIME_LIBRARY=OFF",
  162. "-DOVERRIDE_CXX_FLAGS=OFF"
  163. }
  164. table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:debug() and "Debug" or "Release"))
  165. table.insert(configs, "-DBUILD_SHARED_LIBS=" .. (package:config("shared") and "ON" or "OFF"))
  166. table.insert(configs, "-DCROSS_PLATFORM_DETERMINISTIC=" .. (package:config("cross_platform_deterministic") and "ON" or "OFF"))
  167. table.insert(configs, "-DDOUBLE_PRECISION=" .. (package:config("double_precision") and "ON" or "OFF"))
  168. table.insert(configs, "-DENABLE_OBJECT_STREAM=" .. (package:config("object_stream") and "ON" or "OFF"))
  169. table.insert(configs, "-DGENERATE_DEBUG_SYMBOLS=" .. ((package:debug() or package:config("symbols")) and "ON" or "OFF"))
  170. table.insert(configs, "-DOBJECT_LAYER_BITS=" .. package:config("object_layer_bits"))
  171. table.insert(configs, "-DUSE_AVX=" .. (package:config("inst_avx") and "ON" or "OFF"))
  172. table.insert(configs, "-DUSE_AVX2=" .. (package:config("inst_avx2") and "ON" or "OFF"))
  173. table.insert(configs, "-DUSE_AVX512=" .. (package:config("inst_avx512") and "ON" or "OFF"))
  174. table.insert(configs, "-DUSE_F16C=" .. (package:config("inst_f16c") and "ON" or "OFF"))
  175. table.insert(configs, "-DUSE_FMADD=" .. (package:config("inst_fmadd") and "ON" or "OFF"))
  176. table.insert(configs, "-DUSE_LZCNT=" .. (package:config("inst_lzcnt") and "ON" or "OFF"))
  177. table.insert(configs, "-DUSE_SSE4_1=" .. (package:config("inst_sse4_1") and "ON" or "OFF"))
  178. table.insert(configs, "-DUSE_SSE4_2=" .. (package:config("inst_sse4_2") and "ON" or "OFF"))
  179. table.insert(configs, "-DUSE_TZCNT=" .. (package:config("inst_tzcnt") and "ON" or "OFF"))
  180. -- https://github.com/jrouwe/JoltPhysics/issues/1133
  181. if package:is_plat("wasm") then
  182. table.insert(configs, "-DEMSCRIPTEN_SYSTEM_PROCESSOR=" .. package:targetarch())
  183. elseif package:is_plat("mingw") or (package:is_plat("linux", "macosx", "cross") and package:is_cross()) then
  184. table.insert(configs, "-DCMAKE_SYSTEM_PROCESSOR=" .. package:targetarch())
  185. end
  186. import("package.tools.cmake").install(package, configs)
  187. else
  188. os.cp(path.join(os.scriptdir(), "port", "xmake.lua"), "xmake.lua")
  189. local configs = {}
  190. configs.cross_platform_deterministic = package:config("cross_platform_deterministic")
  191. configs.debug_renderer = package:config("debug_renderer")
  192. configs.double_precision = package:config("double_precision")
  193. if package:is_arch("x86", "x64", "x86_64") then
  194. configs.inst_avx = package:config("inst_avx")
  195. configs.inst_avx2 = package:config("inst_avx2")
  196. configs.inst_avx512 = package:config("inst_avx512")
  197. configs.inst_f16c = package:config("inst_f16c")
  198. configs.inst_fmadd = package:config("inst_fmadd")
  199. configs.inst_lzcnt = package:config("inst_lzcnt")
  200. configs.inst_sse4_1 = package:config("inst_sse4_1")
  201. configs.inst_sse4_2 = package:config("inst_sse4_2")
  202. configs.inst_tzcnt = package:config("inst_tzcnt")
  203. end
  204. import("package.tools.xmake").install(package, configs)
  205. end
  206. end)
  207. on_test(function (package)
  208. assert(package:check_cxxsnippets({test = [[
  209. #include <cstdarg>
  210. void trace_impl(const char* fmt, ...) {
  211. va_list list;
  212. va_start(list, fmt);
  213. char buffer[1024];
  214. vsnprintf(buffer, sizeof(buffer), fmt, list);
  215. va_end(list);
  216. };
  217. bool AssertFailedImpl(const char *inExpression, const char *inMessage, const char *inFile, JPH::uint inLine)
  218. {
  219. // Breakpoint
  220. return true;
  221. };
  222. void test() {
  223. JPH::RegisterDefaultAllocator();
  224. JPH::Trace = &trace_impl;
  225. JPH_IF_ENABLE_ASSERTS(JPH::AssertFailed = &AssertFailedImpl;)
  226. JPH::PhysicsSystem physics_system;
  227. physics_system.OptimizeBroadPhase();
  228. }
  229. ]]}, {configs = {languages = "c++17"}, includes = {"Jolt/Jolt.h", "Jolt/Physics/PhysicsSystem.h"}}))
  230. end)