OSS開発ツール/ツールチェイン

出典: フリー教科書『ウィキブックス(Wikibooks)』

ツールチェインは、ソフトウェア開発プロセスにおいて重要な役割を果たす一連のツールの組み合わせです。主に、コンパイル工程で使用されるツールで構成されます。

以下に、ツールチェインの主要な構成要素と代表的なツールを紹介します。

ar(1)
アーカイブ(静的ライブラリ)の操作を行うユーティリティ。複数のオブジェクトファイルをまとめてライブラリにする。ライブラリの作成、更新、展開などに使用される。
as(1)
アセンブラ。アセンブリ言語を機械語に変換するツール。ソースコードをコンパイルしてオブジェクトファイルを生成する。
gprof(1)
プログラムのプロファイリング情報を生成する。プログラムの実行時の関数呼び出しの回数や時間を計測し、性能のプロファイリングを行う。
ld(1)
リンカ。オブジェクトファイルやライブラリをリンクして実行可能ファイルや共有ライブラリを生成する。外部ライブラリの解決やアドレスの再配置を行う。
nm(1)
シンボル情報の表示を行う。オブジェクトファイルやライブラリに含まれるシンボルの一覧を表示する。
ranlib(1)
アーカイブファイルに索引を作成する。アーカイブ内のオブジェクトファイルの位置やサイズなどの情報をインデックス化し、高速なシンボル検索を可能にする。
size(1)
オブジェクトファイルのサイズ情報を表示する。セクションごとのサイズや合計サイズなどを表示し、プログラムのメモリ使用量などを確認する。
strings(1)
バイナリファイルからASCII文字列を抽出する。プログラム内に含まれるテキスト文字列や識別子などの情報を抽出して表示する。
strip(1)
実行可能ファイルや共有ライブラリからシンボル情報を削除する。ファイルサイズを削減し、セキュリティ向上や実行速度の向上を図る。

以下は、binutilsに含まれる主要なコマンドと、それに対応するGCC、LLVM、およびelfutilsのコマンドの対応関係を示した表です。

ツールとツールチェイン毎の対応
ツール binutils GCC LLVM elfutils 説明
addr2line addr2line addr2line llvm-addr2line eu-addr2line アドレスからソースファイルと行番号を特定
ar ar gcc-ar llvm-ar - アーカイブファイルの作成と操作
as as gcc llvm-as eu-as アセンブラ
c++filt c++filt c++filt llvm-cxxfilt - C++シンボルデマングリング
dwp dwp - llvm-dwp - DWARFプログラムの結合
elfedit elfedit - llvm-elfedit - ELFファイルの編集
gprof gprof gprof llvm-profdata - プロファイルデータの表示
ld ld gcc lld eu-ld リンカ
ld.bfd ld.bfd - - - BFDリンカ
ld.gold ld.gold - - - Goldリンカ
nm nm gcc-nm llvm-nm eu-nm シンボル情報の表示
objcopy objcopy objcopy llvm-objcopy - オブジェクトファイルの変換
objdump objdump objdump llvm-objdump eu-objdump オブジェクトファイルの解析
ranlib ranlib gcc-ranlib - - ライブラリ索引の作成
readelf readelf - - eu-readelf ELFファイル情報の表示
size size size llvm-size - オブジェクトファイルのサイズ情報表示
strings strings strings llvm-strings - バイナリファイルから文字列を抽出
strip strip strip llvm-strip - バイナリファイルからシンボルを削除
各ツールは異なるプロジェクトから提供されており、それぞれ独自の機能やオプションを持っています。使用する際には、それぞれのツールのドキュメントやマニュアルを参照することが重要です。

これらの機能を提供する代表的なツールには、次のようなものがあります。

binutils
binutilsは、GNUプロジェクトの一部として開発されたバイナリユーティリティツールのコレクションです。アセンブラ(as)、リンカ(ld)などが含まれます。
GCC
gcc-argcc-nmgcc-ranlibは、GCCに含まれるユーティリティで、アーカイブ操作やシンボル抽出、索引作成を行います。
LLVM
LLVMプロジェクトには、コンパイラのバックエンドとして機能するツールが含まれています。これには、lld(リンカ)、llvm-as(アセンブラ)、llvm-link(リンク)、llvm-nm(シンボル情報の抽出)などがあります。
elfutils
elfutilsは、ELF形式のバイナリファイルを操作するためのユーティリティ集合です。これには、eu-as(アセンブラ)、eu-ld(リンカ)、eu-nm(シンボル情報の抽出)などが含まれます。

これらのツールは、ソフトウェア開発のさまざまな段階で使用され、コンパイル工程を支援しています。ツールチェインの選択は、プロジェクトの要件や開発者の好みに応じて行われますが、これらのツールは広く利用されている信頼性の高いオプションです。

GCCとClangのLTO/PGO/PCH/C++モジュールの非互換性[編集]

GCCとClangのLTO(リンク時最適化)、PGO(プロファイルガイド最適化)、PCH(プリコンパイルヘッダー)、C++モジュールの間にはいくつかの非互換性があります。

LTO(リンク時最適化)
GCCとClangのLTOは、異なる形式で実装されています。そのため、GCCでビルドされたオブジェクトファイルとClangでビルドされたオブジェクトファイルを同時にリンクすることは困難です。
PGO(プロファイルガイド最適化)
GCCとClangのPGOは、プロファイル情報の収集方法や最適化手法が異なるため、同じプロファイル情報を使用しての最適化は困難です。
PCH(プリコンパイルヘッダー)
GCCとClangのPCH形式は異なります。そのため、互換性のあるPCHファイルを生成することはできません。
C++モジュール
GCCとClangのC++モジュールのサポートは異なります。特に、GCCのC++モジュールは実験的な機能であり、ClangのC++モジュールとは異なる形式で実装されています。

これらの非互換性のため、GCCとClangのプロジェクトやビルド間での相互運用性には注意が必要です。 特に、LTOやPGOなどの高度な最適化を使用する場合は、ツールチェーンを統一することが重要です。

言語処理系に統合されたツールチェイン[編集]

言語処理系に統合されたツールチェインは、言語のコンパイラやビルドツールなどのツールが言語処理系に含まれていることを指します。以下に、いくつかの言語の例を挙げます。

Go
Go言語における言語処理系に統合されたツールチェインには、以下のようなものがあります:
  • go build: ソースコードから実行可能なバイナリを生成します。
  • go run: ソースコードをコンパイルせずに直接実行します。
  • go test: ユニットテストを実行します。
  • go get: パッケージの取得や更新を行います。
  • go vet: コードの品質を検査し、潜在的な問題を見つけます。
  • go fmt: ソースコードをフォーマットします。
  • go doc: ドキュメントを生成し、パッケージの情報を表示します。
  • go mod: モジュール管理を行います。

これらのツールは、Go言語の標準ライブラリに含まれており、開発者が簡単に利用できます。

Zig
Zig言語のツールチェインには、言語処理系に統合された多くのツールが含まれています。以下はその一部です:
  • build: build.zigファイルからプロジェクトをビルドします。
  • init-exe: 現在のディレクトリに zig build アプリケーションを初期化します。
  • init-lib: 現在のディレクトリに zig build ライブラリを初期化します。
  • ast-check: 任意のファイルセット内で単純なコンパイルエラーを探します。
  • build-exe: ソースまたはオブジェクトファイルから実行可能ファイルを作成します。
  • build-lib: ソースまたはオブジェクトファイルからライブラリを作成します。
  • build-obj: ソースまたはオブジェクトファイルからオブジェクトファイルを作成します。
  • fmt: Zigのソースコードを標準の形式に書き直します。
  • run: 実行可能ファイルを作成してすぐに実行します。
  • test: テストビルドを作成し、実行します。
  • translate-c: CコードをZigコードに変換します。

その他にも、以下のようなドロップインツールがあります:

  • ar: ドロップインアーカイバーとしてZigを使用します。
  • cc: ドロップインCコンパイラとしてZigを使用します。
  • c++: ドロップインC++コンパイラとしてZigを使用します。
  • dlltool: dlltool.exeとしてZigを使用します。
  • lib: lib.exeとしてZigを使用します。
  • ranlib: ranlibとしてZigを使用します。
  • objcopy: objcopyとしてZigを使用します。

さらに、以下のコマンドも利用できます:

  • env: ライブラリパス、標準パス、キャッシュディレクトリ、およびバージョンを表示します。
  • help: ヘルプを表示して終了します。
  • libc: ネイティブlibcのパスファイルを表示または検証します。
  • targets: 利用可能なコンパイルターゲットをリストします。

これらのツールは、Zig言語の標準ライブラリとして提供されており、開発者がプロジェクトのビルド、テスト、およびドキュメント生成を簡単に行えるように設計されています。

これらの言語では、言語の主要なツールが言語処理系に統合されているため、開発者は追加のインストールや設定をする必要がありません。言語の公式ディストリビューションをダウンロードしてインストールするだけで、すぐにプロジェクトの開発を開始することができます。

ベストプラクティス[編集]

ツールチェインのベストプラクティスにはいくつかの重要な点があります。以下に、ソフトウェア開発プロセスでツールチェインを効果的に使用するためのいくつかのベストプラクティスを示します。

適切なツールの選択
プロジェクトのニーズに応じて、適切なコンパイラ、リンカ、デバッガなどのツールを選択します。プロジェクトの言語やターゲットプラットフォームによって異なる場合があります。
ツールチェインのバージョン管理
ツールチェインのバージョン管理を行います。特定のバージョンがプロジェクトにとって最適であるかどうかを確認し、必要に応じてバージョンを更新します。
ツールのカスタマイズ
必要に応じて、ツールチェインをカスタマイズしてプロジェクトの要件に合わせます。ビルドオプションや最適化設定などを調整することで、パフォーマンスやセキュリティを向上させることができます。
ドキュメントとトレーニング
チーム全体がツールチェインを適切に使用できるように、ドキュメントを作成し、トレーニングを提供します。新しいメンバーがプロジェクトに参加した場合や、新しいツールが導入された場合に特に重要です。
ツールの最新情報の追跡
ツールチェインの開発やリリースに関する最新情報を追跡し、新機能や改善点を活用します。これにより、プロジェクトの生産性や品質を向上させることができます。
バグレポートとフィードバック
問題やバグが発生した場合は、ツールの開発者にバグレポートを提出し、フィードバックを提供します。これにより、ツールの品質向上に貢献できます。

ツールチェインの適切な選択と管理は、ソフトウェア開発プロセスの効率性と品質に大きく影響します。これらのベスト:プラクティスを遵守することで、プロジェクトの成功に貢献することができます。