emacs-在龙芯UOS20旧世界设备上编译最新Emacs等软件
有的时候,你会操作一台龙芯UOS20的旧世界设备,并且想在上面编译一些软件。
1. 编译前准备
首先你需要掌握该设备的密码,然后获取该设备的开发者权限。
对于后者,UOS 论坛上有人做了一个小工具,安装后重启就自动打开了开发者权限,不用在线/离线激活。我们下载安装重启即可。
2. 编译最新Emacs
考虑到兼容性,我们选择关闭 Native-Comp 。并且对于 Linux 电脑上的 Emacs 来说,应该没有可感觉的速度影响吧。
2.1. 安装依赖
sudo apt-get update
sudo apt-get install -y \\
build-essential autoconf automake pkg-config texinfo \\
libgtk-3-dev libgnutls28-dev libjansson-dev libncurses-dev libxml2-dev \\
libharfbuzz-dev libcairo2-dev libfreetype6-dev libfontconfig1-dev \\
libx11-dev libxft-dev libxpm-dev libxrender-dev \\
libpng-dev libjpeg-dev libtiff-dev libgif-dev libwebp-dev librsvg2-dev \\
zlib1g-dev libsqlite3-dev liblcms2-dev libotf-dev libm17n-dev \\
libdbus-1-dev libsystemd-dev libacl1-dev libselinux1-dev libasound2-dev
2.2. 拉取并编译Emacs
最新正式版是 30.2 :
wget https://ftp.gnu.org/gnu/emacs/emacs-30.2.tar.xz
tar xf emacs-30.2.tar.xz && cd emacs-30.2
但我们也可以安装最新候选版或nightly 版本。这里以最新候选版 31.1-rc1 为例。如果用户想安装最新版,仅需将链接替换为指向 master.zip 的链接即可。
(这里考虑到链接可用性,启用了gh 加速链接)
wget "https://gh-proxy.org/https://github.com/emacs-mirror/emacs/archive/refs/tags/emacs-31.1-rc1.zip"
unzip emacs-31.1-rc1.zip && cd emacs-emacs-31.1-rc1
./autogen.sh
注意,直接从github 拉取的代码需要运行一次 autogen.sh ,但正式版不需要。
然后配置、编译并安装
./configure --prefix=/usr/local/emacs --with-x-toolkit=gtk3 --without-native-compilation --without-xwidgets --with-tree-sitter=no
make -j$(nproc)
sudo make install
最后将 emacs 的安装目录放进 PATH 中:
echo 'export PATH=/usr/local/emacs/bin:$PATH' >> ~/.bashrc
3. 编译安装 Syncthing 2.1.3
3.1. 安装旧世界的Golang
syncthing 是用Go 编写的,好消息是龙芯开源社区有针对旧世界发布 Golang,目前最新的是 1.26.4 版本。
我们在 1.26.4 的下载网页下载 loong64.tar 版本,然后按照「安装指南」替换本地的 Go 。
3.2. 安装依赖
sudo apt-get install -y wget ca-certificates git build-essential iproute2 iptables
3.3. 配置 Go 的全局变量
sudo tee /etc/profile.d/loong-go.sh >/dev/null <<'EOF'
export GOROOT=/usr/local/go
export PATH=/usr/local/go/bin:$PATH
export GOPROXY=https://goproxy.cn,direct
export GOTOOLCHAIN=local
EOF
source /etc/profile.d/loong-go.sh
go env -w GOPROXY=https://goproxy.cn,direct GOTOOLCHAIN=local
3.4. 编译安装 syncthing 2.1.3
mkdir -p ~/src && cd ~/src
git clone --depth 1 --branch v2.1.3 https://gh-proxy.org/https://github.com/syncthing/syncthing.git
cd syncthing
# 原生编译:开启 cgo,使用系统 gcc 编译 C 版 SQLite(官方推荐,性能好)
CGO_ENABLED=1 go run build.go -no-upgrade build
验证:
./syncthing --version # 期望输出 v2.1.3
3.5. 安装并配置 systemd 服务
sudo install -m 0755 syncthing /usr/local/bin/syncthing
# 使用仓库自带的 systemd 单元,并把路径改成 /usr/local/bin
sudo cp etc/linux-systemd/system/syncthing@.service /etc/systemd/system/syncthing@.service
sudo sed -i 's#ExecStart=/usr/bin/syncthing#ExecStart=/usr/local/bin/syncthing#' /etc/systemd/system/syncthing@.service
sudo systemctl daemon-reload
sudo systemctl enable --now syncthing@$(whoami).service
systemctl --no-pager --lines=20 status syncthing@$(whoami).service
syncthing 默认访问界面是 http://127.0.0.1:8384 。可以打开网页,看看是否成功启动。
4. 编译安装 Tailscale v1.100.0
v1.100.0 正好要求 go 1.26.4,是目前能用龙芯 Go 1.26.4 编译的最新稳定版。
4.1. 编译 Tailscale bin
mkdir -p ~/go/bin
export GOBIN=$HOME/go/bin
# 加 -ldflags="-s -w" 可把 30M+ 的二进制瘦身到 20M 左右,可省略
CGO_ENABLED=0 go install -ldflags="-s -w" tailscale.com/cmd/tailscale@v1.100.0
CGO_ENABLED=0 go install -ldflags="-s -w" tailscale.com/cmd/tailscaled@v1.100.0
4.2. 安装bin
sudo install -m 0755 $HOME/go/bin/tailscale /usr/bin/tailscale
sudo install -m 0755 $HOME/go/bin/tailscaled /usr/sbin/tailscaled
4.3. 配置 systemd 服务
sudo mkdir -p /etc/default
sudo tee /etc/default/tailscaled >/dev/null <<'EOF'
# Set the port to listen on for incoming VPN packets.
# Remote nodes will automatically be informed about the new port number,
# but you might want to configure this in order to set external firewall
# settings.
PORT="41641"
# Extra flags you might want to pass to tailscaled.
FLAGS=""
EOF
sudo tee /etc/systemd/system/tailscaled.service >/dev/null <<'EOF'
[Unit]
Description=Tailscale node agent
Documentation=https://tailscale.com/docs/
Wants=network-pre.target
After=network-pre.target NetworkManager.service systemd-resolved.service
[Service]
EnvironmentFile=/etc/default/tailscaled
ExecStart=/usr/sbin/tailscaled --state=/var/lib/tailscale/tailscaled.state --socket=/run/tailscale/tailscaled.sock --port=${PORT} $FLAGS
ExecStopPost=/usr/sbin/tailscaled --cleanup
Restart=on-failure
RuntimeDirectory=tailscale
RuntimeDirectoryMode=0755
StateDirectory=tailscale
StateDirectoryMode=0700
CacheDirectory=tailscale
CacheDirectoryMode=0750
Type=notify
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now tailscaled
systemctl --no-pager --lines=20 status tailscaled
4.4. 确保 TUN 可用并登录
ls -l /dev/net/tun
sudo modprobe tun
echo tun | sudo tee /etc/modules-load.d/tun.conf
sudo tailscale up
# 按输出提示打开浏览器完成登录;无 GUI 服务器可用 tailscale up 输出的 URL 在别的电脑上打开
sudo tailscale status
5. 编译安装 Jujutsu v0.35.0
5.1. 安装旧世界的Rust
根据龙芯开源社区的网站,目前最新的旧世界 Rust 版本为 1.92.0 。我们这里直接用官方 Rustup 命令安装:
curl --proto '=https' --tlsv1.2 -sSf https://rust-lang.loongnix.cn/rustup-init.sh | sh
然后按照操作提示更新一下变量:
source $HOME/.cargo/env
5.2. 编译安装 jujutsu v0.35.0
因为 jujutsu 并没有提供龙芯旧世界的官方预编译二进制文件,因此我们按照 Jujutsu 的官方手册,通过以下命令编译安装:
# To install the *prerelease* version from the main branch
cargo install --git https://github.com/jj-vcs/jj.git --locked --bin jj jj-cli
但是如果这样直接安装,会遇见 bstr 组件版本号报错的情况。目前最新的 jj v0.44.0 对 bstr 的版本号要求是 1.13.1 ,而旧世界的 Rust 工具链中能提供的最新版本为 1.12.1 。所以我们需要回退到 v0.35.0 的 jujutsu (这里贴心加入了 ghproxy 链接提速):
cargo install --git https://gh-proxy.org/https://github.com/jj-vcs/jj.git --tag v0.35.0 --locked --bin jj jj-cli
然后可以顺利编译安装。
6. 编译安装 Librime 1.8.5
由于librime 依赖一些开源库,因此我们首先需要添加社区维护的软件源。注意,在添加此软件源后不要执行任何全局升级的动作,否则可能影响系统某些软件,导致不能正常工作。
6.1. 添加社区软件源
# 1. 备份现有源(可选但建议)
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 2. 添加 Loongnix 20 稳定源
sudo tee /etc/apt/sources.list.d/loongnix20.list > /dev/null <<'EOF'
deb https://pkg.loongnix.cn/loongnix/20 DaoXiangHu-stable main contrib non-free
EOF
根据贴吧指南,需要导入公钥才可更新此软件源
gpg --recv-key A8C7C20CEDF1B817
gpg --output loongnix20.gpg --armor --export A8C7C20CEDF1B817
sudo apt-key add loongnix20.gpg
sudo apt update
6.2. 安装所需依赖
librime 有一些依赖的库,需要额外安装。
sudo apt install -y git build-essential cmake pkg-config libboost-all-dev libgoogle-glog-dev libleveldb-dev libmarisa-dev libopencc-dev libyaml-cpp-dev liblua5.3-dev libcapnp-dev libx11-dev capnproto
6.3. 获取 librime 1.8.5 和插件源码
git clone --depth 1 --branch 1.8.5 https://github.com/rime/librime.git
cd librime
# 插件目录名必须是 plugins/lua、plugins/octagram、plugins/predict、plugins/proto
git clone https://github.com/hchunhui/librime-lua.git plugins/lua
git -C plugins/lua checkout 03a2bd9
git clone https://github.com/lotem/librime-octagram.git plugins/octagram
git -C plugins/octagram checkout a6ced5a
git clone https://github.com/rime/librime-predict.git plugins/predict
git -C plugins/predict checkout e308495
git clone https://github.com/lotem/librime-proto.git plugins/proto
git -C plugins/proto checkout d92f572
6.4. 配置、编译并安装
配置cmake
cmake . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_TEST=OFF -DBUILD_SHARED_LIBS=ON -DBUILD_MERGED_PLUGINS=ON -DENABLE_EXTERNAL_PLUGINS=OFF
编译安装
cmake --build build -j"$(nproc)"
sudo cmake --install build
sudo ldconfig
如有必要,可以通过 fcitx -r 重启 fcitx 。