PR:この記事にはアフィリエイトリンクが含まれます。
ヘッダーを一行直しただけなのに、毎回すべてをコンパイル。ビルド待ちが長いと修正の勢いまで削られますよね。Makefileを見直せば、必要な処理だけを実行できる場合があります。
GNU Makeは、ソースの変更を見ながらビルド手順を動かすツールです。ルールの考え方をつかめば、小さなCプログラムから複数のライブラリを含む構成まで応用できます。
依存関係やパターンルール、並列ビルドは、ビルドの正しさと待ち時間を左右します。学習に役立つ4冊も、Makeの扱いの深さに注目して紹介します。
書籍の早見表
四冊は、Makefileを体系的に学ぶ本と、CやAutotoolsを学ぶ途中でMakeを扱う本に分かれます。得られる知識の範囲もそれぞれ異なります。
| 書籍 | 向く読者 | Makeの扱い | 参考価格 |
|---|---|---|---|
GNU Make(第3版) | ルールを体系的に学びたい人 | 依存関係から大規模構成まで | 3,080円(税込) |
Autotools, 2nd Edition | ポータブルなビルド構成を扱う人 | Automakeなどと連携 | $49.95 |
Linux System Programming Techniques | LinuxでCを保守する人 | GCCを使った実例 | — |
Learn C Programming, 2nd Edition | C初学者 | 複数ファイルのビルド入門 | £36.99 |
Make自体を学ぶ軸には『GNU Make(第3版)』がおすすめです。ほかの三冊では、Linux、C言語、Autotoolsを学びながらMakeを使う場面も扱います。
価格は参考価格・定価の目安で、時期や販売店によって変わります。円、米ドル、英ポンドでは通貨も販売形態も異なるため、購入時には各販売店の表示を確認してください。
Makefileの仕事
Makefileには作りたい成果物と生成に必要なファイル、実行するコマンドを書きます。たとえば実行ファイルが複数のオブジェクトファイルに依存する関係を記すと、Makeが更新の必要な処理を判断します。
Makeが見る手掛かりは、ターゲットと前提ファイルの更新時刻です。前提ファイルのほうが新しければターゲットを作り直します。変更のないソースまで再コンパイルせずに済むのが利点です。
特別な指定がなければ、最初の通常ターゲットが既定のゴールになります。allを先頭に置く構成はよく見かけますね。Makefileの先頭で標準の動作が決まるので、意図しないファイルを指定しないよう注意しましょう。
依存関係を正す
依存関係はビルドの正しさに直結します。app: main.o io.oと書けば、appの生成に二つのオブジェクトファイルが必要だと示せます。実行ファイルをリンクするレシピも、このターゲットに結び付きます。
見落としやすいのがヘッダーです。Cのソースが読み込むヘッダーも依存関係に含めないと、修正後に再コンパイルされず、古い定義を含む実行ファイルが残ることがあります。
依存関係を手で保つのが大変なら、GCCの-MMD -MPなどを使って.dファイルを生成できます。Makefileから依存ファイルを読み込めば、ヘッダーの追加や変更もビルドに反映しやすくなります。
ルールを見通す
ルールはターゲットと前提ファイル、レシピから成ります。レシピの字下げには通常タブを使います。空白と見分けにくくエラーになることもあるため、最初に押さえておきたい書式です。
複数のCファイルに同じコンパイル手順を使うなら、%.o: %.cのようなパターンルールが便利です。自動変数の$@はターゲット、$<は最初の前提ファイルを指します。共通コマンドを一つにまとめられます。
cleanのように実ファイルを作らない処理は、.PHONY: cleanで宣言します。同名のファイルが作業ディレクトリにあると、掃除のターゲットが最新と判定されて動かないことがあります。この指定で衝突を防げます。
並列ビルドの条件
依存関係を正しく書けていれば、make -jで独立した処理を並行して進められます。ビルドは速くなりますが、逐次実行では気づかなかった依存漏れが表に出る場合もあります。
出力先のディレクトリを先に作る必要があるときは、ディレクトリのターゲットを用意します。| build/のような順序のみの前提なら準備を先行させつつ、ディレクトリの更新時刻を理由に成果物を作り直さずに済みます。
レシピ内の複数行にも注意が必要です。特別な設定がなければ各行は別々のシェルで実行されるため、ある行で移動したディレクトリは次の行に引き継がれません。シェルの状態に頼らず、処理の関係が分かる形に整えましょう。
変数と構成の整理
コンパイラやオプションを変数にまとめると、環境ごとの調整がしやすくなります。CC、CFLAGS、LDFLAGSなどを使い分け、コンパイル用とリンク用の指定を分けておくと、後から追いやすいですよ。
GNU Makeの=は参照時に値を展開し、:=は定義時に展開します。この違いは変数を組み合わせたときに表れます。値が思いどおりか迷ったら、実際のコマンドを表示して確かめるのが確実です。
サブディレクトリごとにMakeを再帰的に呼ぶ方式は、構成を分けて理解しやすい反面、プロジェクト全体の依存関係を見渡しにくくなることがあります。規模が大きくなるほど、分割する場所とMakeに見せる依存関係が保守性を左右します。
GNU Make(第3版)
『GNU Make(第3版)』は、オライリー・ジャパン刊の日本語書籍です。Robert Mecklenburg著、矢吹道郎監訳、菊池彰訳。304頁で、2005年12月23日に発行されました。日本語で基礎から応用まで学びたい人におすすめです。
本書はターゲットと必須項目、依存関係の検証、再構築を最小限にする考え方を扱います。パターンルールや静的パターンルール、自動変数も登場。ターゲット固有・パターン固有変数も取り上げており、Makefileを読む際に役立ちます。
再帰的・非再帰的なMakeや、大規模プロジェクトの配置、構築とテストの自動化にも触れています。CとC++の依存生成や複数のバイナリツリーも対象です。希望小売価格は3,080円(税込)が目安。2005年刊なので、新しいGNU Makeの版に合わせる場合は出版社の目次・正誤表や公式マニュアルも確認してください。
Autotools第2版
『Autotools, 2nd Edition: A Practitioner’s Guide to GNU Autoconf, Automake, and Libtool』は、John Calcote著、No Starch Press刊の英語書籍です。2019年11月発行で584頁。紙版には電子書籍が付属します。
主題はGNU Autoconf、Automake、Libtoolの連携です。AutomakeでポータブルなMakefileを生成する方法や、基本的なMakefileからAutotools構成へ移す流れを扱います。Jupiterと相互依存する四つのプロジェクトを含むFLAIMの例も収録しています。
Unix系OSとWindowsでの移植性、pkg-configによる依存関係の確認、Autotools利用時の問題解決も範囲です。定価の目安は$49.95。手書きルールを学ぶならGNU Make本を先に、配布可能なビルド構成への移行も担うなら本書を加えるのがおすすめです。
Linux本の補助線
『Linux System Programming Techniques』はJack-Benny Persson著、Packt刊の書籍です。2021年発行で432頁。Linux上でCとGCCを使うシステムプログラミングを扱い、第1章ではGCCとGNU Makeを導入します。第3章にはMakeによるコンパイルが登場します。
Makefileの例はGCCオプションを含む汎用的なものから始まります。シンプルな構成や、さらに高度な例も収録。Linuxのプログラムを保守する人なら、コンパイル手順を追いながらMakeと周辺ツールの関係をつかめるでしょう。
Makeのルールを体系的に掘り下げるには、本書の範囲は限られます。依存関係や変数を深く学ぶならGNU Make本を軸にし、Linux固有のプログラミングも一緒に学びたい人には本書がおすすめです。
C入門書とMake
『Learn C Programming』第2版はJeff Szuhay著、Packt刊のC言語入門書です。2022年8月発行で742頁あります。第26章「Building Multi-File Programs with Make」でMakeを扱い、章末には質問も掲載されています。
Makeの章では、複数ファイルのプログラムを組み立てる基本を学べます。マクロやターゲット、依存関係とアクションも扱います。Cの基礎学習にビルド入門を加えたい人におすすめです。
定価の目安は£36.99。MakeはC入門書の一章なので、複雑な既存Makefileの調査やパターンルールの応用まで学ぶには範囲が限られます。Cの基礎とMakeの初歩を一緒に進める用途に合います。
結論
Makefileを仕事で読み書きするための一冊なら、『GNU Make(第3版)』がおすすめです。依存関係、自動変数、ルール設計から大規模構成まで日本語で通して学べます。断片的なサンプルをつなぐ段階から先へ進みたい人に合う本です。
新しいGNU Makeの版に関する情報は公式マニュアルで補い、実務のMakefileを手元で確かめながら読むと知識が定着しやすくなります。Autotoolsへの移行も担う人は第2版を追加。CやLinux自体を学ぶのが中心なら、対応する入門書を選べます。
価格は参考価格を目安にし、購入時点の販売価格を確認してください。Makeの仕組みを固めるなら専用書、開発分野と一緒に学ぶなら各入門書。目的に合わせて選べば、実務で使う知識につながります。
Amazon の PC をスコア化してみた
Amazonにある8〜14インチの小型WindowsタブレットやノートPCを、スペック別にスコア化して比較・ランキング。





