オープンソースの Nix エコシステムは、 Nix の実験的な dynamic derivations 機能を活用してコンパイルワークフローを革新することを約束する nix-ninja というツールで、エキサイティングな発展を目撃しています。この革新は、特に複雑なビルドシステムを扱う開発者コミュニティの間で大きな関心を集めています。
Dynamic Derivations:安定版リリースへの道
コミュニティで最も議論されている側面の一つは、 Nix における dynamic derivations の安定化のタイムラインです。現在、 nix-ninja はまだリリースされていない Nix のバージョンの実験的機能に依存しており、これらの機能がいつ公式にサポートされるかという疑問が生じています。
dynamic derivations に関わる Nix の中核開発者は、ロードマップについていくつかの明確な説明を提供しており、 dynamic derivations はしばらくの間実験的機能の状態にあるコンテンツアドレッシング derivations に依存していると説明しています。しかし、集中的な努力と範囲管理により、近い将来の安定化は達成可能かもしれません。開発者は、残りの作業について、主な目標に取り組む前に完了しなければならない一連の一見無関係なタスクを指す「ヤクの毛刈り」であるにもかかわらず、実際には膨大な量ではないと特徴づけています。
複雑なビルドのパフォーマンス可能性
nix-ninja のパフォーマンスへの影響は特に有望です。このツールは、ビルドグラフのどこかで単一の C/C++ ファイルを変更した場合、そのファイルのみを再コンパイルし、影響を受ける実行ファイルや共有ライブラリのみを再リンクする真の増分コンパイルを可能にすることを目指しています。
まだ開発中ですが、初期のテストでは、増分コンパイルタスクにおける Nix のサンドボックスのオーバーヘッドは無視できるレベルであることが示されています。ただし、( Nix の bison パーサーのような)生成されたソースファイルに依存するターゲットの適切な処理など、一部の機能はまだ欠けており、現在オープンな問題として追跡されています。
「長期的な最終目標は、ヘッダーを変更せず、システム全体のビルドグラフのどこかで単一の C/C++ のみを変更した場合、そのファイルだけを迅速に再コンパイルし、出力オブジェクトファイルが組み込まれている実行ファイル/共有ライブラリだけを再リンクすることです。」
nix-ninjaの主な特徴
- ninja.buildファイルを解析し、コンパイル単位ごとに派生物(derivation)を生成
- 細かい増分性のために、ビルド入力と出力をコンテンツアドレス指定の派生物に保存
- ninjaと互換性のあるCLI(ドロップイン置き換えとして使用可能)
- ローカルでの実行またはNix派生物内での実行をサポート
要件
- 以下の実験的機能を有効にしたNix:
- nix-command
- dynamic-derivations
- ca-derivations
- recursive-nix
開発マイルストーン
- 0.1.0: 正確性に焦点を当てた最初のリリース
- 0.2.0: 増分ビルドを生産的にするための主要なパフォーマンス機能
Ninja ビルドファイルへの戦略的焦点
開発者たちは特に Ninja ビルドファイルをターゲットにすることを選択しました。これは戦略的な決断であることが証明されています。ビルドグラフ表現として Ninja をサポートすることで、 nix-ninja は CMake 、 meson 、 premake 、 gn など、 Ninja ファイルを出力する多数の人気のあるビルドシステムと連携することができます。
このアプローチは、 Nix 自体が meson を使用し Ninja ファイルを出力するため、 Nix コミュニティにとって特に関連性があります。この選択により、 LLVM や Chromium のような増分コンパイルから最も恩恵を受ける大規模プロジェクトから始めて、エコシステム全体のビルドパフォーマンスを改善するための段階的で協力的なアプローチが可能になります。
nix-ninja が正確性に焦点を当てた 0.1.0 マイルストーンとその後のパフォーマンス機能を対象とした 0.2.0 リリースに向けて開発を続ける中、このプロジェクトは既存のビルドシステムの大規模な書き換えを必要とせずに Nix ビルドをより効率的にするための有望なステップを表しています。複雑なコードベースを扱う開発者にとって、このツールはコンパイル時間を短縮し、 Nix のコンテンツアドレス指定 derivations を通じてより細かい増分性を提供することで、生産性を大幅に向上させる可能性があります。
参考: nix-ninja