0Pricing
C Academy · レッスン

Makefile

ビルドを自動化します。

「Makefile」はCoddyKit上の無料C Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。

Makefileを使う理由

gccコマンドを手入力していると、すぐに管理できなくなります。makeは、プロジェクトのビルド方法を記述したMakefileを読み取り、必要なコマンドだけを実行します。

最大の特徴は、入力が出力より新しい場合にだけファイルを再ビルドすることです。これにより、コンパイル時間を大幅に短縮できます。

ルールの構成

ルールは、ターゲット、その前提条件、レシピの3つの部分で構成されます。

レシピの行は、スペースではなく実際のTAB文字で始める必要があります。これはMakefileで最もよくあるミスです。

target: prerequisite1 prerequisite2
	<TAB>command to build target

最初のMakefile

これは2つのソースファイルからappをビルドします。引数なしでmakeを実行すると、最初のターゲットがビルドされます。

前回のビルド以降にどちらのソースも変更されていなければ、makeは「up to date」と表示して何もしません。

app: main.c math_utils.c
	gcc main.c math_utils.c -o app

コンパイルルールの分離

各オブジェクトファイルを個別にビルドすると、1つのファイルを変更したとき、そのファイルだけが再コンパイルされます。

makeは依存関係グラフに従います。main.cを変更すると、main.oと最終的なリンク処理だけが再実行されます。

app: main.o math_utils.o
	gcc main.o math_utils.o -o app

main.o: main.c math_utils.h
	gcc -c main.c

math_utils.o: math_utils.c math_utils.h
	gcc -c math_utils.c

変数

変数を使うと、同じ記述を繰り返さずに済みます。先頭で定義し、$(NAME)で展開します。

これで、コンパイラーやフラグを1か所で変更できるようになります。

CC = gcc
CFLAGS = -Wall -Wextra -g

app: main.o math_utils.o
	$(CC) main.o math_utils.o -o app

自動変数

makeは、レシピ内で使える省略記法を提供します。

  • $@ — ターゲット名
  • $^ — すべての前提条件
  • $< — 最初の前提条件

これらを使うと、レシピを簡潔かつ正確に保てます。

app: main.o math_utils.o
	$(CC) $^ -o $@

main.o: main.c
	$(CC) $(CFLAGS) -c $< -o $@

パターンルール

1つのパターンルールで、すべての.cファイルを対応する.oファイルにコンパイルできます。そのため、ファイルごとにルールを書く必要がありません。

%は任意のステムに一致します。$<や$@と組み合わせることで、完全に汎用的に使えます。

%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

Phonyターゲット

cleanのようなターゲットは、その名前のファイルを生成しません。.PHONYとして宣言すると、「clean」という名前のファイルが存在していても、makeは常に実行します。

cleanはビルド成果物を削除し、クリーンビルドを強制します。

.PHONY: clean
clean:
	rm -f *.o app

完全なMakefile

ここまでの内容をまとめると、変数、パターンルール、リンクルール、phonyなcleanターゲットを使います。

ファイルごとの編集を行わなくても、多数のファイルに対応できます。

CC = gcc
CFLAGS = -Wall -Wextra -g
OBJS = main.o math_utils.o

app: $(OBJS)
	$(CC) $^ -o $@

%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

.PHONY: clean
clean:
	rm -f $(OBJS) app

makeの判断方法

makeはタイムスタンプを比較します。前提条件のいずれかの更新時刻が新しい場合、またはターゲットが存在しない場合、ターゲットは再ビルドされます。

これが、ヘッダーの依存関係を列挙することが重要な理由です。ヘッダーを編集すると、依存するすべてのオブジェクトが正しく再ビルドされます。

複数のターゲットとデフォルト

Makefileの最初のターゲットがデフォルトになります。引数なしでmakeと入力したときに実行されるターゲットです。慣例的にallという名前にします。

また、make cleanやmake testのように、ターゲット名を指定して特定のターゲットをビルドすることもできます。これにより、1つのMakefileに便利なエントリーポイントを複数用意できます。

.PHONY: all
all: app

test: app
	./app --selftest

クイックチェック

典型的なMakefileのエラーを診断してみましょう。

まとめ

これで、makeを使ってビルドを自動化できるようになりました。

  • ルールは、ターゲット、前提条件、TABでインデントしたレシピで構成されます
  • 変数と自動変数($@ $^ $<)で重複した記述を減らせます
  • パターンルール(%.o: %.c)ですべてのファイルを汎用的に処理できます
  • .PHONYでcleanのようなファイルを生成しないターゲットを示します
  • makeはタイムスタンプに基づき、古くなったものだけを再ビルドします

次は、静的ライブラリと共有ライブラリをビルドします。

よくある質問

「Makefile」レッスンは無料ですか?

はい。「Makefile」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。

「Makefile」で何を学びますか?

ビルドを自動化します。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「Makefile」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC Academyレッスンでコードを書いて実行できますか?

はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 条件付きコンパイル
  2. 複数ファイルのプロジェクト
  3. Makefile
  4. 静的ライブラリと共有ライブラリ
← C Academyに戻る