起因
玄铁语言(XuanTie-Lang)是一套中文编程语言,编译器驱动 xtc 是自举的;xtl 是它的工具链 CLI(Rust 编写,负责同步语言本体、拉取预编译核心二进制)。我平时在 Mac 上用,最近想让 ThinkPad(Arch Linux)也能跑,于是动手装。一路踩了六七个坑,最折腾的是中文目录名乱码,值得记下来。
环境与准备
- ThinkPad tp-e490,Arch Linux x86_64
- rustc 1.99.0 + cargo + git 都在 /usr/bin
- 目标:装好 xtl(工具链 CLI),能拉语言本体、能编译渲染窗口程序
xtl 是 Rust 单 bin crate,依赖 anyhow / notify / serde / ureq / sha2 / dirs 等,纯 Rust、无系统库依赖,理论上 cargo 编译就完事。问题出在网络。
坑一:crates.io 直连不通
ThinkPad 上 curl crates.io 返回 403。crates.io 对 HEAD 请求可能本来就拒绝,但不敢赌 GET 是否真的可用——cargo 拉依赖断在半路更难受。
解法:Mac 的 7890 端口代理开放了局域网访问,ThinkPad 走它:
export HTTPS_PROXY=http://<Mac局域网IP>:7890
export http_proxy=http://<Mac局域网IP>:7890
curl -sI -x http://<Mac局域网IP>:7890 https://crates.io # HTTP/1.1 200 Connection established
把 cli 源码打包(排除 target 目录)scp 到 ThinkPad 后编译:
cd cli && HTTPS_PROXY=http://<Mac局域网IP>:7890 cargo build --release
39 秒编译完成,比预想快。
坑二:~/.cargo/bin 不在 PATH
装好后 which xtl 找不到——Arch 默认 PATH 只含 /usr/local/bin、/usr/bin 等,不带 ~/.cargo/bin。追加一行:
echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.bashrc
注意确认 ~/.bash_profile 里有 [[ -f ~/.bashrc ]] && . ~/.bashrc——登录 shell 读的是 .bash_profile,只改 .bashrc 在部分终端里不生效。ThinkPad 上两者配合后,新终端即可用 xtl。
坑三:xtl fetch 报「xtl.lock 缺少 包.核心 段」
装了 xtl 后在任意目录跑 xtl fetch:
Error: xtl.lock 缺少 包.核心 段
请手动创建 xtl.lock,或运行:
echo '{"格式版本":1,...}' > xtl.lock
看源码才知道:xtl.lock 是当前工作目录里的文件(相对路径),不是全局配置。工具链的完整形态是在 xtl-toolchain 仓库根目录工作(lock 与语言本体 XuanTie-Lang/ 并列)。解法:
git clone https://atomgit.com/k4m7v2pz/xtl-toolchain.git
cd xtl-toolchain
xtl fetch
fetch 把本体同步到锁定提交(17ef9d3),预编译核心二进制从 bin 分支经 git clone 拉取、SHA256 校验通过,xtl.lock 的 binary.linux-x86_64 段自动更新。xtl version 能看到完整状态:26.10.7 + 三平台二进制 + 「来源: xtl-自建」。
坑四(最折腾):xtl fetch 解压出 #U 乱码目录
fetch 明明显示「拉取并解压完成」,但编译渲染程序时报:
编译错误: 无法解析铁铺包引用 '渲染'
查看核心目录 ~/.cache/xtl/core/linux-x86_64/xtc-package/lib/:
#U6570#U7ec4 # 这其实是「数组」
#U6e32#U67d3 # 这其实是「渲染」
HTTP
SQLite
UI
「渲染」的 Unicode 码点是 U+6E32 / U+67D3,#U6e32#U67d3 正是按码点转义的目录名。编译器按 lib/渲染 查找包,自然落空。
排查过程:
- python3 zipfile 读 zip:条目名是正常的「渲染」,UTF-8 flag(0x800)也已标记
- 同一个 zip 在 Mac 上用 unzip 解压完全正常
- 问题出在 xtl CLI 的解压方式:旧版用系统 tar 的 -xf 解 zip,Arch 上的 tar 是 bsdtar(libarchive),把 zip 中文条目名转成了 #U 码点形式
工具链侧把解压逻辑改成了 Rust zip crate(UTF-8 正确处理),并顺手补了 xtc 可执行位。新版 fetch 后 lib/ 下正常出现「数组」「渲染」。
中途还有个乌龙:给 ThinkPad 同步新源码时 scp 路径少写了 src/ 前缀,binary.rs 被放到仓库顶层而不是 src/ 目录下,ThinkPad 增量编译用的还是旧代码,白排查了一轮。同步源码时务必核对目标路径。
坑五:python3 解压丢可执行位(临时绕行踩的)
排查期间用 python3 zipfile 手动重解压核心包,结果 xtc 报 Permission denied——zipfile 不还原 unix 可执行位。临时 chmod +x 解决。最终版本由 xtl 自己解压并补位,不再需要手动处理。
坑六:渲染库——内置库成功,铁铺包仍失败
分发包更新到最新后(xtc 自述 v1.0-rc.3):
- 内置库路径(禁用 CWD 相对库与铁铺包后编译渲染程序):链接成功,产出 ELF 可执行文件。编译器自带 lib/渲染/ 含 libraylib.linux-amd64.a(ELF 平台库),按平台选库生效。
- 铁铺包路径(~/.tiepm/已安装/渲染/):仍链接失败——包内 libraylib.a 是 Windows COFF,Linux ld 报 undefined reference to
__imp_*(COFF 导入符号)。这是铁铺包本身缺 linux 平台库,等维护侧补齐。
结果验证
xtl version
# xtl 26.10.7
# 平台: linux x86_64 (linux-x86_64)
# 核心 提交编号: 17ef9d35a683
# 二进制 linux-x86_64: ... | 哈希: sha256:8d04750f... | 来源: xtl-自建
xtl fetch # 本体 + 二进制就位,SHA256 校验一致
避坑小结
- crates.io 直连不通:走局域网代理,export HTTPS_PROXY / http_proxy
- PATH:~/.cargo/bin 加进 .bashrc,并确认 .bash_profile 关联 .bashrc
- xtl.lock 是工作目录文件:在 xtl-toolchain 仓库根目录跑 xtl 命令
- 中文目录名乱码:确保 xtl 是解压改用 zip crate 的新版(26.10.7+);旧版在 Arch 上会把 zip 中文条目名解成 #U 码点乱码
- 手动 python3 解压核心后记得 chmod +x xtc
- 渲染程序:内置库路径已可用;铁铺包缺 linux ELF 库是上游包问题,非工具链问题
1万+




被折叠的 条评论
为什么被折叠?



