summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2021-07-17 00:56:17 +0800
committerruki <[email protected]>2021-07-17 00:56:17 +0800
commit57e7da648670b1358cd760b1eed30c1365d880ce (patch)
treefcf0feb630821fcd8e5d49132884813ee1688594
parent376d0b99dc87c5f07e71b43f3a420f121039ad37 (diff)
improve to select artifacts for msvc
-rw-r--r--xmake/modules/private/action/require/impl/package.lua66
1 files changed, 61 insertions, 5 deletions
diff --git a/xmake/modules/private/action/require/impl/package.lua b/xmake/modules/private/action/require/impl/package.lua
index 844847558..a7a541d96 100644
--- a/xmake/modules/private/action/require/impl/package.lua
+++ b/xmake/modules/private/action/require/impl/package.lua
@@ -26,6 +26,7 @@ import("core.base.hashset")
import("private.utils.progress")
import("core.cache.memcache")
import("core.project.project")
+import("core.tool.toolchain")
import("core.package.package", {alias = "core_package"})
import("devel.git")
import("private.action.require.impl.repository")
@@ -528,6 +529,64 @@ function _inherit_parent_configs(requireinfo, package, parentinfo)
end
end
+-- select artifacts for msvc
+function _select_artifacts_for_msvc(package, artifacts_manifest)
+ local msvc
+ for _, instance in ipairs(package:toolchains()) do
+ if instance:name() == "msvc" then
+ msvc = instance
+ break
+ end
+ end
+ if not msvc then
+ msvc = toolchain.load("msvc", {plat = package:plat(), arch = package:arch()})
+ end
+ local vcvars = msvc:config("vcvars")
+ if vcvars then
+ local vs_toolset = vcvars.VCToolsVersion
+ if vs_toolset and semver.is_valid(vs_toolset) then
+ local vs_toolset_semver = semver.new(vs_toolset)
+ local msvc_version = "vc" .. vs_toolset_semver:major() .. tostring(vs_toolset_semver:minor()):sub(1, 1)
+ local buildid = package:plat() .. "-" .. package:arch() .. "-" .. msvc_version .. "-" .. package:buildhash()
+ local artifacts_info = artifacts_manifest[buildid]
+ if artifacts_info then
+ -- toolset is backwards compatible
+ --
+ -- @see https://github.com/xmake-io/xmake/issues/1513
+ -- https://docs.microsoft.com/en-us/cpp/porting/binary-compat-2015-2017?view=msvc-160
+ if artifacts_info.toolset and semver.compare(vs_toolset, artifacts_info.toolset) < 0 then
+ return
+ end
+ local vs_sdkver = vcvars.WindowsSDKVersion
+ if vs_sdkver and artifacts_info.sdkver and semver.compare(vs_sdkver, artifacts_info.sdkver) < 0 then
+ return
+ end
+ return artifacts_info
+ end
+ end
+ end
+end
+
+-- select artifacts for generic
+function _select_artifacts_for_generic(package, artifacts_manifest)
+ local buildid = package:plat() .. "-" .. package:arch() .. "-" .. package:buildhash()
+ return artifacts_manifest[buildid]
+end
+
+-- select to use precompiled artifacts?
+function _select_artifacts(package, artifacts_manifest)
+ local artifacts_info
+ local _, toolname = package:tool("ld")
+ if toolname == "link" then -- for msvc
+ artifacts_info = _select_artifacts_for_msvc(package, artifacts_manifest)
+ else
+ artifacts_info = _select_artifacts_for_generic(package, artifacts_manifest)
+ end
+ if artifacts_info then
+ package:artifacts_set(artifacts_info)
+ end
+end
+
-- load required packages
function _load_package(packagename, requireinfo, opt)
@@ -625,14 +684,11 @@ function _load_package(packagename, requireinfo, opt)
_check_package_configurations(package)
-- save artifacts info, we need add it at last before buildhash need depend on package configurations
+ -- it will switch to install precompiled binary package from xmake-mirror/build-artifacts
if from_repo and not option.get("build") and not requireinfo.build then
local artifacts_manifest = repository.artifacts_manifest(packagename, version)
if artifacts_manifest then
- local buildid = package:plat() .. "-" .. package:arch() .. "-" .. package:buildhash()
- local artifacts_info = artifacts_manifest[buildid]
- if artifacts_info then
- package:artifacts_set(artifacts_info)
- end
+ _select_artifacts(package, artifacts_manifest)
end
end