Linuxデスクトップを利用しはじめてからこれまでターミナルエミュレータとしてurxvtを利用してきた。のだが、どうもサロゲートペアに対応していない?ようで絵文字を表示できないのがやや気になるポイントであった。
普段から絵文字を入力することはないのでずっと放置していたのだけれど、最近「突撃! 隣のLinuxデスクトップ」という記事を書く中でstという軽量ターミナルエミュレータの存在を知り、絵文字もうまく表示されそうだったので利用してみることにした。
stは各種設定をconfig.hに書き込んでビルドするという硬派な設計になっている。つまり設定を変更するたびにビルドする必要がある。ArchWikiを眺めると
Consider maintaining your own config.h and PKGBUILD.
と書いてあり硬派だ…… と思う。
一応AURにはPKGBUILDがあるので、config.hを置いたディレクトリで BUILDDIR=$(pwd) yay -Sy st
みたいな感じで設定入りのstをビルドすることはできる。しかしまっさらな環境でこれを自動化するのは面倒なので、ArchWikiに書かれている通りPKGBUILDを飼うことにした。
ArchWikiのPKGBUILDページを眺めてだいたい雰囲気を掴んで、 cp /usr/share/pacman/PKGBUILD.proto ./PKGBUILD
してきて編集すればあまり詰まることはないかと思う。実際に書いたPKGBUILDは以下。
# Maintainer: Masayoshi Wada <developer@andantesoftware.com> pkgname=st pkgver=0.9 pkgrel=1 pkgdesc="A simple terminal implementation for X." arch=("x86_64") url="https://st.suckless.org" license=("MIT") depends=("libxft") source=("${pkgname}-${pkgver}::https://dl.suckless.org/$pkgname/$pkgname-$pkgver.tar.gz" "config.h") sha256sums=("f36359799734eae785becb374063f0be833cf22f88b4f169cd251b99324e08e7" "8c6e61cabdd083315863c77e72ef5f669496b24863c3f1420ce83af3927da53d") prepare() { cp "config.h" "$pkgname-$pkgver/config.h" } build() { cd "$pkgname-$pkgver" make } package() { cd "$pkgname-$pkgver" make PREFIX=/usr DESTDIR="$pkgdir/" install }
config.hを変更する度にsha256sumも変える必要があるのはややだるいが、ある程度カスタマイズしたら更新頻度は落ちるだろうからよしとする。
これでPKGBUILDファイルとconfig.hディレクトリを一緒に置いて makepkg -si
するだけでインストールできる状態になった。しかしこれをGitHubに置いていちいちcloneしてきてビルドするのも自動化するにはやや手間に見える。せっかくならビルド済のデータをGitHub Releasesから配信すれば良いのではないかと考えて、GitHub ActionsのWorkflowを書くことにした。書いたYAMLはこちら。
on: workflow_dispatch: permissions: contents: write jobs: release: name: Release runs-on: ubuntu-latest container: image: archlinux:latest steps: - name: Checkout uses: actions/checkout@v3 - name: Initialize run: | pacman -Syu --needed --noconfirm base-devel useradd builder -m echo "builder ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers chmod -R a+rw . - name: makepkg run: | sudo -H -u builder makepkg -sC --noconfirm - name: Parse .SRCINFO id: srcinfo run: | sudo -H -u builder makepkg --printsrcinfo > .SRCINFO echo "version=$(grep pkgver .SRCINFO | awk '{print $3}')-$(grep pkgrel .SRCINFO | awk '{print $3}')" >> $GITHUB_OUTPUT - name: Create new release uses: softprops/action-gh-release@v1 with: name: Release ${{ steps.srcinfo.outputs.version }} tag_name: ${{ steps.srcinfo.outputs.version }} files: st-${{ steps.srcinfo.outputs.version }}-x86_64.pkg.tar.zst
makepkgはrootで実行すると ERROR: Running makepkg as root is not allowed as it can cause permanent, catastrophic damage to your system.
というエラーを吐いて落ちるのでビルド専用のユーザを用意して利用している。バージョンの文字列を作るところはやや強引だけどPKGBUILDと二重管理したくなかったので .SRCINFO
を生成して読み取ってawkで抜き出す形にした。あたりが工夫ポイント。
最後にReleaseを新規に作成して成果物をアップロードしている。actions/upload-release-assetを使えばよいという記事を多く目にしたが、既にArchiveされていてsoftprops/action-gh-releaseを使えと書かれていたのでこれを利用した。tagを作ってpushするのでpermissionとして contents: write
を足す必要がある。
ということで、stをビルドしてGitHub Releasesの成果物として置いておくことができるようになった。あとはこれをダウンロードして sudo pacman -U st-0.9-1-x86_64.pkg.tar.zst
のような形でインストールすれば良い。
絵文字も表示できるようになって大満足。まだ何もカスタマイズしていない状態なのでざっくり好みの状態に整えていきたい。
リポジトリは以下にあるのでforkするなりなんなりしてご自由にお使いください。