summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2026-05-09 23:08:21 +0800
committerruki <[email protected]>2026-05-09 23:08:21 +0800
commit1944d222ae4315762e6a920f021f586324095d9d (patch)
treebab4056d86bffbc20488f0aeb16b71ee5a729e4e
parentb101a0cb501986cfb775c3df65e8285776b31f68 (diff)
improve to find ascend
-rw-r--r--xmake/modules/detect/sdks/find_ascend.lua127
-rw-r--r--xmake/modules/detect/tools/find_bisheng.lua8
-rw-r--r--xmake/toolchains/ascendc/check.lua67
3 files changed, 149 insertions, 53 deletions
diff --git a/xmake/modules/detect/sdks/find_ascend.lua b/xmake/modules/detect/sdks/find_ascend.lua
new file mode 100644
index 000000000..5e659d19d
--- /dev/null
+++ b/xmake/modules/detect/sdks/find_ascend.lua
@@ -0,0 +1,127 @@
+--!A cross-platform build utility based on Lua
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015-present, Xmake Open Source Community.
+--
+-- @author wuzhenqing
+-- @file find_ascend.lua
+--
+
+-- imports
+import("core.base.option")
+import("core.base.global")
+import("core.project.config")
+import("core.cache.detectcache")
+
+-- map host arch to CANN host tool subdirectory
+function _host_archdir(arch)
+ local host_archdirs = {
+ x86_64 = "x86_64-linux"
+ , x64 = "x86_64-linux"
+ , arm64 = "aarch64-linux"
+ , aarch64 = "aarch64-linux"
+ }
+ return host_archdirs[arch]
+end
+
+-- find ascend sdk root directory
+function _find_sdkdir(sdkdir)
+ if not sdkdir then
+ sdkdir = os.getenv("ASCEND_HOME_PATH") or os.getenv("ASCEND_TOOLKIT_HOME")
+ end
+ if sdkdir and os.isdir(sdkdir) then
+ return path.absolute(sdkdir)
+ end
+end
+
+-- find ascend sdk
+function _find_ascend(sdkdir)
+ sdkdir = _find_sdkdir(sdkdir)
+ if not sdkdir then
+ return
+ end
+
+ local archdir = _host_archdir(os.arch())
+ if not archdir then
+ return
+ end
+
+ local hostroot = path.join(sdkdir, archdir)
+ if not os.isdir(hostroot) then
+ return
+ end
+
+ local bindir = path.join(hostroot, "bin")
+ local libdir = path.join(hostroot, "lib64")
+ if not os.isexec(path.join(bindir, "bisheng")) then
+ return
+ end
+
+ return {sdkdir = sdkdir,
+ hostroot = hostroot,
+ bindir = bindir,
+ libdir = libdir,
+ host_archdir = archdir}
+end
+
+-- find Ascend SDK
+--
+-- @param sdkdir the Ascend SDK directory (optional, e.g. /usr/local/Ascend/ascend-toolkit/latest)
+-- @param opt the argument options, e.g. {verbose = true, force = false}
+--
+-- @return the Ascend SDK info, e.g. {sdkdir, hostroot, bindir, libdir, host_archdir}
+--
+-- @code
+--
+-- local ascend = find_ascend()
+-- local ascend = find_ascend("/usr/local/Ascend/ascend-toolkit/latest")
+--
+-- @endcode
+--
+function main(sdkdir, opt)
+
+ -- init arguments
+ opt = opt or {}
+
+ -- attempt to load cache first
+ local key = "detect.sdks.find_ascend"
+ local cacheinfo = detectcache:get(key) or {}
+ if not opt.force and cacheinfo.ascend and cacheinfo.ascend.sdkdir and os.isdir(cacheinfo.ascend.sdkdir) then
+ return cacheinfo.ascend
+ end
+
+ -- find ascend
+ local ascend = _find_ascend(sdkdir or config.get("ascend") or global.get("ascend") or config.get("sdk"))
+ if ascend then
+
+ -- save to config
+ config.set("ascend", ascend.sdkdir, {force = true, readonly = true})
+
+ -- trace
+ if opt.verbose or option.get("verbose") then
+ cprint("checking for Ascend SDK directory ... ${color.success}%s", ascend.sdkdir)
+ end
+ else
+
+ -- trace
+ if opt.verbose or option.get("verbose") then
+ cprint("checking for Ascend SDK directory ... ${color.nothing}${text.nothing}")
+ end
+ end
+
+ -- save to cache
+ cacheinfo.ascend = ascend or false
+ detectcache:set(key, cacheinfo)
+ return ascend
+end
diff --git a/xmake/modules/detect/tools/find_bisheng.lua b/xmake/modules/detect/tools/find_bisheng.lua
index f5832b09e..ac2fcd0e9 100644
--- a/xmake/modules/detect/tools/find_bisheng.lua
+++ b/xmake/modules/detect/tools/find_bisheng.lua
@@ -24,14 +24,14 @@ import("lib.detect.find_programver")
-- find bisheng
--
--- @param opt the argument options, e.g. {version = true}
+-- @param opt the argument options, e.g. {paths = {"..."}, version = true}
--
-- @return program, version
--
-- @code
--
-- local bisheng = find_bisheng()
--- local bisheng, version = find_bisheng({version = true})
+-- local bisheng, version = find_bisheng({paths = {"/path/to/bin"}, version = true})
--
-- @endcode
--
@@ -39,8 +39,8 @@ function main(opt)
opt = opt or {}
opt.norunfile = true
local program = find_program(opt.program or "bisheng", opt)
- local version = nil
- if program and opt and opt.version then
+ local version
+ if program and opt.version then
version = find_programver(program, opt)
end
return program, version
diff --git a/xmake/toolchains/ascendc/check.lua b/xmake/toolchains/ascendc/check.lua
index 60df001db..65d79834b 100644
--- a/xmake/toolchains/ascendc/check.lua
+++ b/xmake/toolchains/ascendc/check.lua
@@ -20,17 +20,7 @@
-- imports
import("lib.detect.find_tool")
-
--- map host architecture to CANN host tool directory
-function _host_archdir(arch)
- local host_archdirs = {
- x86_64 = "x86_64-linux"
- , x64 = "x86_64-linux"
- , arm64 = "aarch64-linux"
- , aarch64 = "aarch64-linux"
- }
- return host_archdirs[arch]
-end
+import("detect.sdks.find_ascend")
-- check the ascendc toolchain
function main(toolchain)
@@ -38,53 +28,32 @@ function main(toolchain)
return false
end
- -- resolve sdkdir: --sdk= > ASCEND_HOME_PATH > ASCEND_TOOLKIT_HOME
- local sdkroot = toolchain:sdkdir()
- if not sdkroot then
- sdkroot = os.getenv("ASCEND_HOME_PATH") or os.getenv("ASCEND_TOOLKIT_HOME")
- end
- if not sdkroot or not os.isdir(sdkroot) then
- return false
- end
- sdkroot = path.absolute(sdkroot)
-
- -- map host arch to CANN host directory
- local host_arch = os.arch()
- local host_archdir = _host_archdir(host_arch)
- if not host_archdir then
+ -- locate the Ascend SDK and derive its host layout
+ local ascend = find_ascend(toolchain:sdkdir())
+ if not ascend then
return false
end
- local hostroot = path.join(sdkroot, host_archdir)
- if not os.isdir(hostroot) then
+ -- llvm-ar must sit next to bisheng (used as the static linker)
+ if not os.isexec(path.join(ascend.bindir, "llvm-ar")) then
return false
end
- -- check required executables
- local bindir = path.join(hostroot, "bin")
- local bisheng_bin = path.join(bindir, "bisheng")
- local llvm_ar = path.join(bindir, "llvm-ar")
- if not os.isexec(bisheng_bin) or not os.isexec(llvm_ar) then
- return false
- end
-
- -- ensure bisheng can load its own shared libraries during version check
- local host_libdir = path.join(hostroot, "lib64")
- local ld_library_path = os.getenv("LD_LIBRARY_PATH") or ""
- local envs = {
- LD_LIBRARY_PATH = ld_library_path ~= "" and
- (host_libdir .. path.envsep() .. ld_library_path) or host_libdir
- }
-
- -- use find_tool (unified interface) instead of find_bisheng directly
- local result = find_tool("bisheng", {program = bisheng_bin, version = true, envs = envs})
+ -- probe bisheng to confirm it actually runs (catches broken installs).
+ -- pass bindir via paths and inject LD_LIBRARY_PATH so bisheng can load
+ -- its own shared libraries during the version probe.
+ local ld = os.getenv("LD_LIBRARY_PATH") or ""
+ local result = find_tool("bisheng", {
+ paths = {ascend.bindir},
+ envs = {LD_LIBRARY_PATH = ld ~= "" and (ascend.libdir .. path.envsep() .. ld) or ascend.libdir},
+ version = true})
if not result or not result.program then
return false
end
- toolchain:config_set("sdkdir", sdkroot)
- toolchain:config_set("bindir", bindir)
- toolchain:config_set("hostroot", hostroot)
- cprint("checking for Huawei Ascend C Toolchain (host: %s) ... ${color.success}${text.success}", host_arch)
+ toolchain:config_set("sdkdir", ascend.sdkdir)
+ toolchain:config_set("bindir", ascend.bindir)
+ toolchain:config_set("hostroot", ascend.hostroot)
+ cprint("checking for Huawei Ascend C Toolchain (host: %s) ... ${color.success}${text.success}", ascend.host_archdir)
return true
end