diff options
| author | ruki <[email protected]> | 2026-05-09 23:08:21 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2026-05-09 23:08:21 +0800 |
| commit | 1944d222ae4315762e6a920f021f586324095d9d (patch) | |
| tree | bab4056d86bffbc20488f0aeb16b71ee5a729e4e | |
| parent | b101a0cb501986cfb775c3df65e8285776b31f68 (diff) | |
improve to find ascend
| -rw-r--r-- | xmake/modules/detect/sdks/find_ascend.lua | 127 | ||||
| -rw-r--r-- | xmake/modules/detect/tools/find_bisheng.lua | 8 | ||||
| -rw-r--r-- | xmake/toolchains/ascendc/check.lua | 67 |
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 |
