xmake.lua 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package("msvc")
  2. set_kind("toolchain")
  3. set_homepage("https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/")
  4. set_description("Microsoft Visual C/C++ Compiler")
  5. if set_installtips then
  6. set_installtips("Do you accept the license agreement? https://go.microsoft.com/fwlink/?LinkId=2179911")
  7. end
  8. add_versions("14.43.17+13", "dummy")
  9. add_versions("14.42.17+12", "dummy")
  10. add_versions("14.41.17+11", "dummy")
  11. add_versions("14.40.17+10", "dummy")
  12. add_versions("14.39.17+9", "dummy")
  13. add_versions("14.38.17+8", "dummy")
  14. add_versions("14.37.17+7", "dummy")
  15. add_versions("14.36.17+6", "dummy")
  16. add_versions("14.35.17+5", "dummy")
  17. add_versions("14.34.17+4", "dummy")
  18. add_versions("14.33.17+3", "dummy")
  19. add_versions("14.32.17+2", "dummy")
  20. add_versions("14.31.17+1", "dummy")
  21. add_versions("14.30.17+0", "dummy")
  22. add_versions("14.29.16+11", "dummy")
  23. add_configs("preview", {description = "The Preview Version", type = "boolean"})
  24. add_configs("target", {description = "The Target architecture", type = "string", values = {"x64", "x86", "arm", "arm64"}})
  25. add_configs("sdkver", {description = "The Windows SDK Version", type = "string", values = {
  26. "10.0.26100",
  27. "10.0.22621",
  28. "10.0.22000",
  29. "10.0.20348",
  30. "10.0.19041",
  31. "10.0.18362"}})
  32. on_load(function (package)
  33. if not package:is_precompiled() then
  34. if is_host("windows") then
  35. package:add("deps", "portable_build_tools")
  36. elseif is_host("linux", "macosx") then
  37. package:add("deps", "python 3.x", {private = true, kind = "binary"})
  38. package:add("deps", "msvc-wine")
  39. -- package:add("deps", "msitools", {private = true, kind = "binary"})
  40. wprint("If extracting the msi package fails, please install `msitools` first.")
  41. end
  42. end
  43. end)
  44. on_fetch("@windows", "@msys", function (package, opt)
  45. if opt.system then
  46. -- TODO maybe we need to improve it
  47. if not package:config("sdkver") and not package:config("target") and not package:config("preview") then
  48. local msvc = package:toolchain("msvc")
  49. if msvc and msvc:check() then
  50. return {}
  51. end
  52. end
  53. end
  54. end)
  55. on_install("@windows", "@msys", function (package)
  56. import("core.base.semver")
  57. local argv = {"accept_license"}
  58. local sdkver = semver.new(package:config("sdkver") or "10.0.26100")
  59. if package:config("preview") then
  60. table.insert(argv, "preview")
  61. end
  62. table.insert(argv, "msvc=" .. package:version_str():replace("+", ".", {plain = true}))
  63. table.insert(argv, "sdk=" .. sdkver:patch())
  64. table.insert(argv, "host=" .. os.arch())
  65. table.insert(argv, "env=none")
  66. table.insert(argv, "path=" .. package:installdir())
  67. table.insert(argv, "target=" .. (package:config("target") or os.arch()))
  68. -- @note It downloads the official binary source
  69. -- https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/
  70. -- https://github.com/Data-Oriented-House/PortableBuildTools/blob/3a2cd42b1de75da63ad30a55982d8dff3c36aa45/source.c#L724
  71. os.vrunv("PortableBuildTools.exe", argv)
  72. end)
  73. on_install("@linux", "@macosx", function (package)
  74. local argv = {"--accept-license"}
  75. if package:config("preview") then
  76. table.insert(argv, "--preview")
  77. end
  78. local msvc_version = package:version()
  79. if msvc_version:patch() == 17 then
  80. wprint("Currently, only downloading the latest version of msvc is supported.")
  81. -- use latest version first
  82. -- FIXME:
  83. -- Fetching https://aka.ms/vs/17/release/channel
  84. -- Got toplevel manifest for 17.13.4
  85. -- Loaded installer manifest for 17.13.4
  86. -- Unsupported MSVC toolchain version 17.13
  87. else
  88. table.insert(argv, "--major")
  89. table.insert(argv, msvc_version:patch())
  90. table.insert(argv, "--msvc-version")
  91. table.insert(argv, format("%s.%s", msvc_version:patch(), msvc_version:build()[1]))
  92. end
  93. if package:config("sdkver") then
  94. table.insert(argv, "--sdk-version")
  95. table.insert(argv, package:config("sdkver"))
  96. end
  97. if package:config("target") then
  98. table.insert(argv, "--architecture")
  99. table.insert(argv, package:config("target"))
  100. end
  101. table.insert(argv, "--dest")
  102. table.insert(argv, package:installdir())
  103. local msvc_wine = package:dep("msvc-wine"):installdir()
  104. os.vrunv("python3", table.join(path.join(msvc_wine, "bin/vsdownload.py"), argv))
  105. os.vrunv("sh", {path.join(msvc_wine, "bin/install.sh"), package:installdir()})
  106. end)
  107. on_test(function (package)
  108. if is_host("windows") then
  109. assert(os.isfile(path.join(package:installdir(), "devcmd.bat")))
  110. elseif is_host("linux", "macosx") then
  111. local target = package:config("target") or "x64"
  112. assert(os.isfile(path.join(package:installdir(), format("bin/%s/cl.exe", target))))
  113. end
  114. end)