GNU Make の Make Cli Options における -S オプションの役割と使い方


GNU Makeの-Sオプションは、ソースファイルのみをコンパイルし、オブジェクトファイルのみを生成するためのオプションです。リンカ処理や実行は行われず、中間的なオブジェクトファイルのみが出力されます。

用途

-Sオプションは、主に以下の用途で使用されます。

  • 特定のコンパイラオプションのみを適用したい場合: リンカオプションの影響を受けずにコンパイルしたい場合
  • 中間ファイルの分析: コンパイル処理の詳細な挙動を調べたい場合
  • デバッグ: オブジェクトファイルをアセンブラレベルで確認したい場合

オプションの構文

make -S [ターゲット]
  • [ターゲット]: オプション適用対象のターゲット。省略時はMakefile内のallターゲットが適用対象となる
  • -S: オプション指定

オプションの動作

-Sオプションを指定すると、MakeはMakefile内の依存関係を解析し、必要なソースファイルをコンパイラに渡します。コンパイラはソースファイルをオブジェクトファイルに変換しますが、リンカ処理は行われず、オブジェクトファイルのみが出力されます。

以下のMakefileで、programという実行ファイルを作成する場合を考えてみましょう。

program: main.c
    gcc -o program main.c

main.o: main.c
    gcc -c main.c

このMakefileに対してmake -Sコマンドを実行すると、main.oというオブジェクトファイルのみが出力されます。

make -S
gcc -c main.c
  • -Sオプションと併用して、特定のコンパイラオプションを指定することができます。例えば、以下のコマンドは、main.cファイルをデバッグ情報付きでコンパイルし、オブジェクトファイルを出力します。
  • -Sオプションは、リンカオプション-Wl,-rと似ていますが、-Wl,-rオプションはリンカ処理前にオブジェクトファイルを結合するのみで、シンボル解決などのリンカ処理は行われます。
make -S -O2 -g main.o


Makefile

program: main.c
    gcc -o program main.c

main.o: main.c
    gcc -c main.c

main.c

#include <stdio.h>

int main() {
  printf("Hello, world!\n");
  return 0;
}

コマンドの実行

make -S

出力

gcc -c main.c

このコマンドを実行すると、main.oというオブジェクトファイルのみが出力されます。

  • コンパイラオプションは、Makefile内のレシピに追加することもできます。
  • この例では、gccコンパイラを使用しています。他のコンパイラを使用する場合は、コンパイラ名に置き換えてください。


GNU Makeの-Sオプションは、ソースファイルのみをコンパイルしてオブジェクトファイルのみを生成するオプションですが、状況によっては代替手段の方が適している場合があります。以下では、-Sオプションの代替方法についていくつか紹介します。

代替手段

  1. コンパイラオプションを使用する

多くのコンパイラは、ソースファイルのみをコンパイルしてオブジェクトファイルのみを生成するためのオプションを提供しています。例えば、gccコンパイラの場合、以下のオプションを使用できます。

gcc -c -o program main.c

このコマンドは、main.cファイルをコンパイルしてprogram.oというオブジェクトファイルを出力します。

  1. 中間ファイル生成ルールを使用する

Makefile内に中間ファイル生成ルールを定義することで、-Sオプションと同等の処理を行うことができます。例えば、以下のMakefileは、main.oというオブジェクトファイルを生成する中間ファイル生成ルールを定義しています。

program: main.o
    gcc -o program main.o

main.o: main.c
    gcc -c main.c

このMakefileでmakeコマンドを実行すると、main.oというオブジェクトファイルが出力されます。

  1. 別のビルドツールを使用する

CMakeなどの他のビルドツールは、-Sオプションと同等の機能を提供している場合があります。これらのツールを使用することで、より柔軟なビルド設定が可能になる場合があります。

各代替手段の比較

代替手段利点欠点
コンパイラオプションシンプルで分かりやすいコンパイラによってオプションが異なる
中間ファイル生成ルールMakefileの記述が冗長になる
別のビルドツール柔軟性が高い習得コストがかかる

最適な代替手段の選択

-Sオプションの代替手段を選択する際は、以下の要素を考慮する必要があります。

  • ビルドツールの習得コスト: CMakeなどの別のビルドツールを使用する場合は、習得コストがかかります。
  • Makefileの複雑さ: 中間ファイル生成ルールを使用すると、Makefileの記述が冗長になる場合があります。
  • 使用しているコンパイラ: コンパイラによって提供されるオプションが異なります。