xmake.lua 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. package("llvm")
  2. set_kind("toolchain")
  3. set_homepage("https://llvm.org/")
  4. set_description("The LLVM Compiler Infrastructure")
  5. add_configs("shared", {description = "Build shared library.", default = false, type = "boolean", readonly = true})
  6. add_configs("all", {description = "Enable all projects.", default = false, type = "boolean"})
  7. add_configs("bolt", {description = "Enable bolt project.", default = false, type = "boolean"})
  8. add_configs("clang", {description = "Enable clang project.", default = true, type = "boolean"})
  9. add_configs("clang-tools-extra", {description = "Enable extra clang tools project.", default = false, type = "boolean"})
  10. add_configs("libclc", {description = "Enable libclc project.", default = false, type = "boolean"})
  11. add_configs("lld", {description = "Enable lld project.", default = false, type = "boolean"})
  12. add_configs("lldb", {description = "Enable lldb project.", default = false, type = "boolean"})
  13. add_configs("polly", {description = "Enable polly project.", default = false, type = "boolean"})
  14. add_configs("pstl", {description = "Enable pstl project.", default = false, type = "boolean"})
  15. add_configs("mlir", {description = "Enable mlir project.", default = false, type = "boolean"})
  16. add_configs("flang", {description = "Enable flang project.", default = false, type = "boolean"})
  17. add_configs("compiler-rt", {description = "Enable compiler-rt runtime.", default = true, type = "boolean"})
  18. add_configs("libunwind", {description = "Enable libunwind runtime.", default = true, type = "boolean"})
  19. add_configs("libc", {description = "Enable libc runtime.", default = false, type = "boolean"})
  20. add_configs("libcxx", {description = "Enable libcxx runtime.", default = true, type = "boolean"})
  21. add_configs("libcxxabi", {description = "Enable libcxxabi runtime.", default = true, type = "boolean"})
  22. add_configs("openmp", {description = "Enable openmp runtime.", default = false, type = "boolean"})
  23. if on_source then
  24. on_source(function (package)
  25. local precompiled = false
  26. if package:is_plat("windows") then
  27. if package:is_arch("x86") then
  28. package:set("urls", "https://github.com/xmake-mirror/llvm-windows/releases/download/$(version)/clang+llvm-$(version)-win32.zip")
  29. package:add("versions", "11.0.0", "268043ae0b656cf6272ccb9b8e3f21f51170b74ed8997ddc0b99587983b821ca")
  30. package:add("versions", "14.0.0", "63afc3c472cb279978c5a7efc25b8783a700aeb416df67886b7057eba52a8742")
  31. package:add("versions", "15.0.7", "8dbabb2194404220f8641b4b18b24b36eca0ae751380c23fc7743097e205b95f")
  32. package:add("versions", "16.0.6", "5e1f560f75e7a4c7a6509cf7d9a28b4543e7afcb4bcf4f747e9f208f0efa6818")
  33. package:add("versions", "17.0.6", "ce78b510603cb3b347788d2f52978e971cf5f55559151ca13a73fd400ad80c41")
  34. package:add("versions", "18.1.1", "1e21b088b1f86aebb4a2e4ad473d1892dccab53ecbe06947f31c6fa56a078bf5")
  35. package:add("versions", "21.1.0", "36b9a55e237b2db404aa621aacb8538b56dabc6f49b8927dc1109e8123524d5f")
  36. precompiled = true
  37. else
  38. package:set("urls", "https://github.com/xmake-mirror/llvm-windows/releases/download/$(version)/clang+llvm-$(version)-win64.zip")
  39. package:add("versions", "11.0.0", "db5b3a44f8f784ebc71f716b54eb63c0d8d21aead12449f36291ab00820271c7")
  40. package:add("versions", "14.0.0", "c1e1ddf11aa73c58073956d9217086550544328ed5e6ec64c1a709badb231711")
  41. package:add("versions", "15.0.7", "7d29ca82f8b73e9973209e90428ec9f3fbd3b01925bd26e34f59e959e9ea7eb3")
  42. package:add("versions", "16.0.6", "7adb1a630b6cc676a4b983aca9b01e67f770556c6e960e9ee9aa7752c8beb8a3")
  43. package:add("versions", "17.0.6", "c480a4c280234b91f7796a1b73b18134ae62fe7c88d2d0c33312d33cb2999187")
  44. package:add("versions", "18.1.1", "7040c7a02529bc0c683896d4f851138b700d8aa8f40c5f48503b10f4cc2dc180")
  45. package:add("versions", "21.1.0", "130d0067de849be36c0ec84c6d515bd310cab324a4cc95d8cc71a1d3c6c730f4")
  46. precompiled = true
  47. end
  48. end
  49. if not precompiled then
  50. package:set("urls", "https://github.com/llvm/llvm-project/releases/download/llvmorg-$(version)/llvm-project-$(version).src.tar.xz")
  51. package:add("versions", "11.0.0", "b7b639fc675fa1c86dd6d0bc32267be9eb34451748d2efd03f674b773000e92b")
  52. package:add("versions", "14.0.0", "35ce9edbc8f774fe07c8f4acdf89ec8ac695c8016c165dd86b8d10e7cba07e23")
  53. package:add("versions", "15.0.7", "8b5fcb24b4128cf04df1b0b9410ce8b1a729cb3c544e6da885d234280dedeac6")
  54. package:add("versions", "16.0.5", "37f540124b9cfd4680666e649f557077f9937c9178489cea285a672e714b2863")
  55. package:add("versions", "16.0.6", "ce5e71081d17ce9e86d7cbcfa28c4b04b9300f8fb7e78422b1feb6bc52c3028e")
  56. package:add("versions", "17.0.6", "58a8818c60e6627064f312dbf46c02d9949956558340938b71cf731ad8bc0813")
  57. package:add("versions", "18.1.1", "8f34c6206be84b186b4b31f47e1b52758fa38348565953fad453d177ef34c0ad")
  58. package:add("versions", "21.1.0", "1672e3efb4c2affd62dbbe12ea898b28a451416c7d95c1bd0190c26cbe878825")
  59. end
  60. end)
  61. else
  62. -- After xmake v2.9.5, we'll remove it.
  63. local precompiled = false
  64. if is_plat("windows") then
  65. if is_arch("x86") then
  66. set_urls("https://github.com/xmake-mirror/llvm-windows/releases/download/$(version)/clang+llvm-$(version)-win32.zip")
  67. add_versions("11.0.0", "268043ae0b656cf6272ccb9b8e3f21f51170b74ed8997ddc0b99587983b821ca")
  68. add_versions("14.0.0", "63afc3c472cb279978c5a7efc25b8783a700aeb416df67886b7057eba52a8742")
  69. add_versions("15.0.7", "8dbabb2194404220f8641b4b18b24b36eca0ae751380c23fc7743097e205b95f")
  70. add_versions("16.0.6", "5e1f560f75e7a4c7a6509cf7d9a28b4543e7afcb4bcf4f747e9f208f0efa6818")
  71. add_versions("17.0.6", "ce78b510603cb3b347788d2f52978e971cf5f55559151ca13a73fd400ad80c41")
  72. add_versions("18.1.1", "1e21b088b1f86aebb4a2e4ad473d1892dccab53ecbe06947f31c6fa56a078bf5")
  73. add_versions("21.1.0", "36b9a55e237b2db404aa621aacb8538b56dabc6f49b8927dc1109e8123524d5f")
  74. precompiled = true
  75. else
  76. set_urls("https://github.com/xmake-mirror/llvm-windows/releases/download/$(version)/clang+llvm-$(version)-win64.zip")
  77. add_versions("11.0.0", "db5b3a44f8f784ebc71f716b54eb63c0d8d21aead12449f36291ab00820271c7")
  78. add_versions("14.0.0", "c1e1ddf11aa73c58073956d9217086550544328ed5e6ec64c1a709badb231711")
  79. add_versions("15.0.7", "7d29ca82f8b73e9973209e90428ec9f3fbd3b01925bd26e34f59e959e9ea7eb3")
  80. add_versions("16.0.6", "7adb1a630b6cc676a4b983aca9b01e67f770556c6e960e9ee9aa7752c8beb8a3")
  81. add_versions("17.0.6", "c480a4c280234b91f7796a1b73b18134ae62fe7c88d2d0c33312d33cb2999187")
  82. add_versions("18.1.1", "7040c7a02529bc0c683896d4f851138b700d8aa8f40c5f48503b10f4cc2dc180")
  83. add_versions("21.1.0", "130d0067de849be36c0ec84c6d515bd310cab324a4cc95d8cc71a1d3c6c730f4")
  84. precompiled = true
  85. end
  86. end
  87. if not precompiled then
  88. set_urls("https://github.com/llvm/llvm-project/releases/download/llvmorg-$(version)/llvm-project-$(version).src.tar.xz")
  89. add_versions("11.0.0", "b7b639fc675fa1c86dd6d0bc32267be9eb34451748d2efd03f674b773000e92b")
  90. add_versions("14.0.0", "35ce9edbc8f774fe07c8f4acdf89ec8ac695c8016c165dd86b8d10e7cba07e23")
  91. add_versions("15.0.7", "8b5fcb24b4128cf04df1b0b9410ce8b1a729cb3c544e6da885d234280dedeac6")
  92. add_versions("16.0.5", "37f540124b9cfd4680666e649f557077f9937c9178489cea285a672e714b2863")
  93. add_versions("16.0.6", "ce5e71081d17ce9e86d7cbcfa28c4b04b9300f8fb7e78422b1feb6bc52c3028e")
  94. add_versions("17.0.6", "58a8818c60e6627064f312dbf46c02d9949956558340938b71cf731ad8bc0813")
  95. add_versions("18.1.1", "8f34c6206be84b186b4b31f47e1b52758fa38348565953fad453d177ef34c0ad")
  96. add_versions("21.1.0", "1672e3efb4c2affd62dbbe12ea898b28a451416c7d95c1bd0190c26cbe878825")
  97. end
  98. end
  99. on_load(function (package)
  100. if not package:is_plat("windows", "msys") then
  101. package:add("deps", "cmake")
  102. package:add("deps", "python 3.x", {kind = "binary", host = true})
  103. package:add("deps", "zlib", "libffi", {host = true})
  104. end
  105. if package:is_plat("linux") then
  106. package:add("deps", "binutils", {host = true}) -- needed for gold and strip
  107. end
  108. if package:is_plat("linux", "bsd") then
  109. if package:config("openmp") then
  110. package:add("deps", "libelf", {host = true})
  111. end
  112. end
  113. -- add components
  114. if package:is_library() then
  115. local components = {"mlir", "clang", "libunwind"}
  116. for _, name in ipairs(components) do
  117. if package:config(name) or package:config("all") then
  118. package:add("components", name, {deps = "base"})
  119. end
  120. end
  121. package:add("components", "base", {default = true})
  122. end
  123. end)
  124. on_fetch("fetch")
  125. on_install("windows", "msys", function (package)
  126. os.cp("*", package:installdir())
  127. end)
  128. on_install("linux", "macosx", "bsd", function (package)
  129. local projects = {
  130. "bolt",
  131. "clang",
  132. "clang-tools-extra",
  133. "libclc",
  134. "lld",
  135. "lldb",
  136. "openmp",
  137. "polly",
  138. "pstl",
  139. "mlir",
  140. "flang",
  141. "openmp"
  142. }
  143. local projects_enabled = {}
  144. if package:config("all") then
  145. table.insert(projects_enabled, "all")
  146. else
  147. for _, project in ipairs(projects) do
  148. if package:config(project) then
  149. table.insert(projects_enabled, project)
  150. end
  151. end
  152. end
  153. local runtimes = {
  154. "compiler-rt",
  155. "libc",
  156. "libunwind",
  157. "libcxx",
  158. "libcxxabi"
  159. }
  160. local runtimes_enabled = {}
  161. for _, runtime in ipairs(runtimes) do
  162. if package:config(runtime) then
  163. table.insert(runtimes_enabled, runtime)
  164. end
  165. end
  166. local configs = {
  167. "-DCMAKE_BUILD_TYPE=Release",
  168. "-DLLVM_ENABLE_PROJECTS=" .. table.concat(projects_enabled, ";"),
  169. "-DLLVM_ENABLE_RUNTIMES=" .. table.concat(runtimes_enabled, ";"),
  170. "-DLLVM_POLLY_LINK_INTO_TOOLS=ON",
  171. "-DLLVM_BUILD_EXTERNAL_COMPILER_RT=ON",
  172. "-DLLVM_LINK_LLVM_DYLIB=ON",
  173. "-DLLVM_ENABLE_EH=ON",
  174. "-DLLVM_ENABLE_FFI=ON",
  175. "-DLLVM_ENABLE_RTTI=ON",
  176. "-DLLVM_INCLUDE_DOCS=OFF",
  177. "-DLLVM_INCLUDE_TESTS=OFF",
  178. "-DLLVM_INSTALL_UTILS=ON",
  179. "-DLLVM_ENABLE_Z3_SOLVER=OFF",
  180. "-DLLVM_OPTIMIZED_TABLEGEN=ON",
  181. "-DLLVM_TARGETS_TO_BUILD=all",
  182. "-DFFI_INCLUDE_DIR=" .. package:dep("libffi"):installdir("include"),
  183. "-DFFI_LIBRARY_DIR=" .. package:dep("libffi"):installdir("lib"),
  184. "-DLLDB_USE_SYSTEM_DEBUGSERVER=ON",
  185. "-DLLDB_ENABLE_PYTHON=OFF",
  186. "-DLLDB_ENABLE_LUA=OFF",
  187. "-DLLDB_ENABLE_LZMA=OFF",
  188. "-DLIBOMP_INSTALL_ALIASES=OFF"
  189. }
  190. table.insert(configs, "-DLLVM_CREATE_XCODE_TOOLCHAIN=" .. (package:is_plat("macosx") and "ON" or "OFF")) -- TODO
  191. table.insert(configs, "-DLLVM_BUILD_LLVM_C_DYLIB=" .. (package:is_plat("macosx") and "ON" or "OFF"))
  192. if package:has_tool("cxx", "clang", "clangxx") then
  193. table.insert(configs, "-DLLVM_ENABLE_LIBCXX=ON")
  194. else
  195. table.insert(configs, "-DLLVM_ENABLE_LIBCXX=OFF")
  196. table.insert(configs, "-DCLANG_DEFAULT_CXX_STDLIB=libstdc++")
  197. -- enable llvm gold plugin for LTO
  198. local binutils = package:dep("binutils")
  199. if binutils then
  200. table.insert(configs, "-DLLVM_BINUTILS_INCDIR=" .. binutils:installdir("include"))
  201. end
  202. end
  203. os.cd("llvm")
  204. import("package.tools.cmake").install(package, configs)
  205. end)
  206. on_component("mlir", "components.mlir")
  207. on_component("clang", "components.clang")
  208. on_component("libunwind", "components.libunwind")
  209. on_component("base", "components.base")
  210. on_test(function (package)
  211. if package:is_toolchain() and not package:is_cross() then
  212. if not package:is_plat("windows") then
  213. os.vrun("llvm-config --version")
  214. end
  215. if package:config("clang") then
  216. os.vrun("clang --version")
  217. end
  218. end
  219. end)