diff options
| author | vkensou <[email protected]> | 2024-03-05 23:16:29 +0800 |
|---|---|---|
| committer | vkensou <[email protected]> | 2024-03-05 23:16:29 +0800 |
| commit | 1180d360196457e57920fd0e6d866ddf654c488e (patch) | |
| tree | fcb58d325cf5369318a449b0f0ab860eb9f193ce /xmake/modules | |
| parent | b02da01326793d01af304f912f243a2b38b5bd92 (diff) | |
optimize wasi-sdk detect
Diffstat (limited to 'xmake/modules')
| -rw-r--r-- | xmake/modules/detect/sdks/find_wasisdk.lua | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/xmake/modules/detect/sdks/find_wasisdk.lua b/xmake/modules/detect/sdks/find_wasisdk.lua new file mode 100644 index 000000000..fee876716 --- /dev/null +++ b/xmake/modules/detect/sdks/find_wasisdk.lua @@ -0,0 +1,94 @@ +-- +-- @author vkensou +-- @file find_wasisdk.lua +-- + +-- imports +import("core.base.semver") +import("core.base.option") +import("core.base.global") +import("core.project.config") +import("core.cache.detectcache") +import("lib.detect.find_file") + +-- find wasm-ld directory +function _find_wasm_ld(sdkdir) + local subdirs = {} + table.insert(subdirs, "bin") + + local paths = {} + if sdkdir then + table.insert(paths, sdkdir) + end + table.insert(paths, "$(env WASI_SDK_PATH)") + + local wasm_ldname = (is_host("windows") and "wasm-ld.exe" or "wasm-ld") + local wasm_ld = find_file(wasm_ldname, paths, {suffixes = subdirs}) + if wasm_ld then + return path.directory(wasm_ld) + end +end + +-- find wasi-sdk +function _find_wasisdk(sdkdir) + + -- find bin directory + local bindir = _find_wasm_ld(sdkdir) + if not bindir or path.filename(bindir) ~= "bin" then + return {} + end + + -- find sdk root directory + sdkdir = path.directory(bindir) + if not sdkdir then + return {} + end + + return {sdkdir = sdkdir, bindir = bindir} +end + +-- find wasi-sdk directory +-- +-- @param sdkdir the wasi-sdk directory +-- @param opt the argument options, e.g. {force = true} +-- +-- @return the sdk toolchains. e.g. {sdkdir = ..} +-- +-- @code +-- +-- local sdk = find_wasisdk("~/wasi-sdk") +-- +-- @endcode +-- +function main(sdkdir, opt) + + -- init arguments + opt = opt or {} + + -- attempt to load cache first + local key = "detect.sdks.find_wasisdk" + local cacheinfo = detectcache:get(key) or {} + if not opt.force and cacheinfo.sdk and cacheinfo.sdk.sdkdir and os.isdir(cacheinfo.sdk.sdkdir) then + return cacheinfo.sdk + end + + -- find sdk + local sdk = _find_wasisdk(sdkdir or config.get("wasi_sdk") or global.get("wasi_sdk")) + if sdk and sdk.sdkdir and sdk.bindir then + config.set("wasi_sdk", sdk.sdkdir, {force = true, readonly = true}) + if opt.verbose or option.get("verbose") then + cprint("checking for wasi-sdk directory ... ${color.success}%s", sdk.sdkdir) + end + + else + if opt.verbose or option.get("verbose") then + cprint("checking for wasi-sdk directory ... ${color.nothing}${text.nothing}") + end + end + + -- save to cache + cacheinfo.sdk = sdk or false + detectcache:set(key, cacheinfo) + detectcache:save() + return sdk +end |
