Upgrade to Pro — share decks privately, control downloads, hide ads and more …

❄️ NixOS/nixpkgsにSATySFiサポートを実装する

❄️ NixOS/nixpkgsにSATySFiサポートを実装する

Nix meetup #2

Mutsuha Asada

March 09, 2025
Tweet

More Decks by Mutsuha Asada

Other Decks in Programming

Transcript

  1. 🎓 所属 ・筑波大学情報学群情報科学類 B3 🐣 興味 ・コンパイラやそのツールチェーン、ビルドシステム ・2年くらいNixOSとNixを利用している (2022/12~) ・ちょっとOSS活動

     ・NixOS/nix: 1 PR merged  ・NixOS/nixpkgs: 36 PRs merged, 197 PRs reviewed ・nixpkgs用のLinterを作りたいな〜と思っています  ・興味がある方、ぜひお話ししましょう! 自己紹介 @momeemt @mutsuha_asada https://momee.mt 2
  2. 概要 ・組版処理システムであるSATySFiのパッケージビルドをnixpkgsでサポートしたい ・そのためのderivationを追加する作業をしているので今日はそれについて話す  ・NixOS/nixpkgs #372555 ( 🚧 WIP 🚧) 📚

    目次 nixpkgsにおけるSATySFiサポートの現状 1. NixによるSATySFiビルドの先行研究 2. satyrographosInstallHookの実装(パッケージビルドのサポート) 3. パッケージの依存解決の実装(パッケージを利用可能にする) 4. 今後の課題・展望 5. まとめ 6. 3
  3. 先行研究① (AumyF/satyxin) ・パッケージをビルドするときに、setupHookにより環境変数SATYSFI_LIBPATHに  当該パッケージのパス($1/lib/satysfi)が追加される ・ドキュメントをビルドする際には、SATYSFI_LIBPATHをコンパイラに渡すことで  コンパイラがパッケージを見つけられるようにする ・ 👏 良い点  ・パッケージ名とパス、ソースを渡すだけでパッケージングができる

     ・わかりやすく明快 ・ ☹️ 機能不足な点  ・フォントやハッシュファイルなど、lib/satysfi/dist/packages 以外に配置するべきファイル   をコピーすることができない  ・複数のファイルを含むパッケージに対応できない  ・devShell環境ではコンパイラからパッケージが見えていない 12
  4. 先行研究② (SnO2WMaN/satyxin) ・ 👏 良い点  ・パッケージ名とパス、ソースを渡すだけでパッケージングができる  ・フォントやハッシュファイルなども含めてビルドできるので、   全てのSatyrographosに対応したSATySFiパッケージをパッケージングできる  ・複数のファイルを含むパッケージに対応◎  ・devShell環境でもコンパイラからパッケージが見える

    ・ ☹️ 機能不足な点  ・ハッシュファイルのマージスクリプトにバグがあり、ときおり壊れる  ・Satyrographosのビルドファイル(Satyristes)に   コピー対象のファイルが与えられている(library.source)が、明示的に記述する必要がある  ・ローカルに.satysfiDistを生成する必要がある(nix-direnvが実質的には必要) 17
  5. Satyristes ・library宣言の、特に sources が重要  ・ここに配置するべきソースとパスが記述されている  ・例えば、mypackageという名前のパッケージにおいて   (font “/dst” “/src”) は、/src

    配下のファイルを dist/fonts/mypackage/ 以下に配置する ・name はパスを特定するために必要 ・version, opam, dependencies, compatibility は無視できる ・そもそもこのファイルはS式によって記述されている  ・S式をパースできるライブラリを利用して該当の処理を行えば良さそう  ・今回はsexpdataというライブラリを用いてPythonスクリプトを書く 24
  6. /nix/store /nix/store/xxx-satysfi-0.0.11 bin lib share ~/.satysfi ~/doc/nix-meetup (プロジェクトルート) /nix/store/xxx-satysfi- zrbase-0.4.0

    /nix/store/xxx-satysfi- fss-0.2.0 $SATYSFI_LIBRARY シェル環境でコンパイラからパッケージが見えない ・AumyF/satyxinでは、セットアップフックで環境変数 SATYSFI_LIBRARY にパッケージの  パスが追記されるようにした上で、ビルド時にコンパイラにパスを渡していた  → この方法ではシェル環境ではいちいちコンパイラに引数を渡す必要があるし、   LSPなどのツールチェーンにも同様の手間が発生する 31 --config
  7. まとめ ・現在取り組んでいる、NixOS/nixpkgsへのSATySFiビルドサポートについて紹介した ・現状(nixpkgs 24.11)ではSATySFi本体とemacsの拡張機能のみが存在している状態であり、  環境構築を容易にするためにはSATySFiパッケージや周辺ツールの拡充が必要 ・特にSATySFiパッケージのパッケージングをサポートするderivationをnixpkgsに導入したい ・過去の事例としては、セットアップフックと環境変数を組み合わせてパッケージビルド、  ドキュメントビルドを提供するAumyF/satyxinや、より高度なビルダーや  パッケージセットを含むdistを生成する機能を提供するSnO2WMaN/satyxinなどがあった ・今回の発表では、Satyrographosのビルドファイルを用いてパッケージのインストール工程を

     共通化するフックであるsatyrographosInstallHookの実装と、  SATySFiへのパッケージオーバーロードを拡張する方法について説明した ・シェル環境でコンパイラからパッケージが見えるようにするために、SATySFiの  share/satysfi/distに依存パッケージを集めてきて、マージハッシュを行った上で格納した ・パッケージのドキュメントビルド、derivationが循環することの解消、YojsonやSatyristesの  仕様に適切に則った堅牢なスクリプトに修正していくことなどが今後の課題 44