あんパン

こしあん派

GitHub ActionsでstをビルドしてArch Linuxにインストールする

Linuxデスクトップを利用しはじめてからこれまでターミナルエミュレータとしてurxvtを利用してきた。のだが、どうもサロゲートペアに対応していない?ようで絵文字を表示できないのがやや気になるポイントであった。

普段から絵文字を入力することはないのでずっと放置していたのだけれど、最近「突撃! 隣のLinuxデスクトップ」という記事を書く中でstという軽量ターミナルエミュレータの存在を知り、絵文字もうまく表示されそうだったので利用してみることにした。

st.suckless.org

stは各種設定をconfig.hに書き込んでビルドするという硬派な設計になっている。つまり設定を変更するたびにビルドする必要がある。ArchWikiを眺めると

Consider maintaining your own config.h and PKGBUILD.

https://wiki.archlinux.org/title/st

と書いてあり硬派だ…… と思う。

一応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 のような形でインストールすれば良い。

stでは絵文字を表示できる

絵文字も表示できるようになって大満足。まだ何もカスタマイズしていない状態なのでざっくり好みの状態に整えていきたい。

リポジトリは以下にあるのでforkするなりなんなりしてご自由にお使いください。

github.com