Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
GNU Makeの使い方 / How to use GNU Make
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
kaityo256
PRO
April 14, 2026
Programming
5.6k
16
Share
GNU Makeの使い方 / How to use GNU Make
研究室ハンズオン資料
kaityo256
PRO
April 14, 2026
More Decks by kaityo256
See All by kaityo256
この講義について / 00-setup
kaityo256
PRO
2
300
GitHubによるWebアプリケーションのデプロイ / 07-github-deploy
kaityo256
PRO
1
230
演習:Gitの基本操作 / 04-git-basic
kaityo256
PRO
0
410
演習:Gitの応用操作 / 05-git-advanced
kaityo256
PRO
0
250
演習:GitHubの基本操作 / 06-github-basic
kaityo256
PRO
0
260
バージョン管理とは / 01-a-vcs
kaityo256
PRO
1
270
Gitの仕組みと用語 / 01-b-term
kaityo256
PRO
0
260
計算物理におけるGitの使い方 / 01-c-compphys
kaityo256
PRO
2
540
コマンドラインの使い方 / 01-d-cli
kaityo256
PRO
0
130
Other Decks in Programming
See All in Programming
「効かない!」依存性注入(DI)を活用したAPI Platformのエラーハンドリング奮闘記
mkmk884
0
310
Smarter Angular mit Transformers.js & Prompt API
christianliebel
PRO
1
120
ローカルで稼働するAI エージェントを超えて / beyond-local-ai-agents
gawa
2
250
年間50登壇、単著出版、雑誌寄稿、Podcast出演、YouTube、CM、カンファレンス主催……全部やってみたので面白さ等を比較してみよう / I’ve tried them all, so let’s compare how interesting they are.
nrslib
4
720
AIエージェントで業務改善してみた
taku271
0
480
我々はなぜ「層」を分けるのか〜「関心の分離」と「抽象化」で手に入れる変更に強いシンプルな設計〜 #phperkaigi / PHPerKaigi 2026
shogogg
2
810
Radical Imagining - LIFT 2025-2027 Policy Agenda
lift1998
0
250
AI時代のPhpStorm最新事情 #phpcon_odawara
yusuke
0
110
今こそ押さえておきたい アマゾンウェブサービス(AWS)の データベースの基礎 おもクラ #6版
satoshi256kbyte
1
230
脱 雰囲気実装!AgentCoreを良い感じにWEBアプリケーションに組み込むために
takuyay0ne
3
440
条件判定に名前、つけてますか? #phperkaigi #c
77web
2
970
Strategy for Finding a Problem for OSS: With Real Examples
kibitan
0
140
Featured
See All Featured
Leo the Paperboy
mayatellez
6
1.6k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
The Cost Of JavaScript in 2023
addyosmani
55
9.8k
We Are The Robots
honzajavorek
0
210
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
410
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.8k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
96
The Curse of the Amulet
leimatthew05
1
11k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.3k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
210
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Transcript
1 39 GNU Makeの使い方 慶應義塾大学理工学部物理情報工学科 渡辺 ハンズオン用リポジトリ https://github.com/kaityo256/make_tutorial
2 39 Makeとはなにか • プログラムのビルドを自動化してくれる • 依存関係を認識してくれる • インストールなどの作業も自動化できる ビルドツールの一つ
コード開発にはビルドツールは必須 他には、CMake、Rake (Ruby)、 SCons (Python)、Ant (Java)など多数
3 39 なぜビルドツールが必要か? 人間は間違える生き物だから
4 39 依存関係のあるタスク 装置AとBからなるシステムがあり Aの電源を入れてからBの電源を 入れないとBが壊れてしまう 装置A 装置B
5 39 ありがちな解決策 テプラによる注意喚起 ↓ 装置Bの電源確認!!! ←Bが上がるまで押さない!
6 39 ありがちな解決策 ↓ 装置Bの電源確認!!! 危機管理を人間の注意力に依存してはならない ←Bが上がるまで押さない!
7 39 正しい解決策 「これを押せば良い」というボタンを一つ作る とにかくボタンを押せば よしなに解決してくれる のひとつ
8 39 正しい解決策 「これを押せば良い」というボタンを一つ作る 装置Bをチェック OFFなら電源ON 装置Bが立ち上がったら 装置Aの電源ON 内部では依存関係を認識し、正しく処理 のひとつ
9 39 C++の分割コンパイル 以下の3つのファイルを考える #include "param.hpp" #include <cstdio> void show(void);
int main(void) { printf("main: N is %d\n", N); show(); } const int N = 10; #include "param.hpp" #include <cstdio> void show(void){ printf("sub: N is %d\n",N); } param.hpp main.cpp sub.cpp
10 39 C++の分割コンパイル ビルド方法 g++ -c main.cpp g++ -c sub.cpp
g++ main.o sub.o 依存関係 param.hpp main.cpp sub.cpp main.o sub.o a.out インクルード コンパイル コンパイル リンク 実行結果 $ ./a.out main: N is 10 sub: N is 10
11 39 C++の分割コンパイル const int N = 5; param.hppを書き換える g++
-c sub.cpp g++ main.o sub.o main.cppのコンパイルを忘れてリンクしてしまった 実行結果 $ ./a.out main: N is 10 sub: N is 5 const int N = 10; 共通の定数であるはずの値が同じプログラムで異なる値になってしまった
12 39 C++の分割コンパイル これを修正したら param.hpp main.cpp sub.cpp main.o sub.o a.out
インクルード コンパイル コンパイル リンク この二つともコンパイルしなおさないといけない 「◦◦したら◦◦しなければならない」は危険信号 ファイルの依存関係を人間が把握するのは困難 依存関係の把握し、必要なファイルだけ コンパイルされるようMakefileで設定
13 39 Makefileの記述の仕方 Makeでは、条件とコマンドを「ルール」として記述する ルールは、ターゲット、前提条件、コマンドから構成される ターゲット: 前提条件 コマンド ターゲット 実現したいこと、作りたいもの
前提条件 実現していなければならないこと コマンド 前提条件が満たされているとき、 ターゲットを作るために必要なこと タブ
14 39 C++の分割コンパイル まずは手順をそのままMakefileに書く all: a.out a.out: main.o sub.o g++
main.o sub.o main.o: main.cpp g++ -c main.cpp sub.o: sub.cpp g++ -c sub.cpp Makefile
15 39 C++の分割コンパイル カレントディレクトリにMakefile/makefileがある状態で makeを実行 $ make g++ -c main.cpp
g++ -c sub.cpp g++ main.o sub.o ビルドが実行される makeは、ファイルを指定しないと Makefileもしくはmakefileを探しに行く
16 39 C++の分割コンパイル all: a.out 引数なしで実行した場合、暗黙に最初の ターゲットを指定したことになる 最終的に欲しい物をallの前提条件として書く ターゲット 前提条件
コマンド なし ※デフォルトターゲットが未指定の場合
17 39 C++の分割コンパイル a.out: main.o sub.o g++ main.o sub.o ターゲット
前提条件 コマンド a.outを作りたい そのためには main.oとsub.oが要る main.oとsub.oが用意できたら リンクしてa.outを作る
18 39 C++の分割コンパイル main.o: main.cpp g++ -c main.cpp ターゲット 前提条件
コマンド main.oを作りたい main.oが無いか、main.cppより 古ければ作り直す main.cppからmain.oを作る方法
19 39 C++の分割コンパイル ビルドをきれいにするルール「クリーン」を作る clean: rm -f a.out *.o ターゲット
ビルドをきれいにしたい(clean) コマンド 中間ファイルや最終ターゲットを削除 前提条件 なし make clean make これでクリーンビルドできる
20 39 C++の分割コンパイル all: a.out a.out: main.o sub.o g++ main.o
sub.o main.o: main.cpp g++ -c main.cpp sub.o: sub.cpp g++ -c sub.cpp clean: rm -f a.out *.o cleanも追加したMakefile 似たような記述が繰り返されている
21 39 DRY原則 Don't Repeat Yourself 同じような記述を繰り返してはならない ※ 例えば一部を修正した場合、残りの修正忘れが発生するから
22 39 パターンルール all: a.out a.out: main.o sub.o g++ main.o
sub.o main.o: main.cpp g++ -c main.cpp sub.o: sub.cpp g++ -c sub.cpp clean: rm -f a.out *.o all: a.out a.out: main.o sub.o g++ main.o sub.o %.o: %.cpp g++ -c $< clean: rm -f a.out *.o まとめる
23 39 パターンルール %.o: %.cpp a.out: main.o sub.o a.outを作るにはmain.oが必要 マッチ
マッチにより%=mainと展開 main.o: main.cpp
24 39 自動変数(マクロ) main.o: main.cpp g++ -c $< 依存関係の一番左に展開される main.cpp
他には・・・ $@ ターゲット名に展開 (main.o) $* パターンがマッチした部分 (main) 等多数 ※ 気になったら「make 自動変数」で検索してください
25 39 パターンルール %.o: %.cpp g++ -c $< ターゲットとしてmain.oがマッチ main.o:
main.cpp g++ -c main.cpp sub.oも同様
26 39 変数 コンパイルとリンクで 同じコマンドを使っている 別のコンパイラを使う時、二か所を修正しなければならない DRY原則に反する all: a.out a.out:
main.o sub.o g++ main.o sub.o %.o: %.cpp g++ -c $< clean: rm -f a.out *.o
27 39 変数 CXX=g++ all: a.out a.out: main.o sub.o $(CXX)
main.o sub.o %.o: %.cpp $(CXX) -c $< clean: rm -f a.out *.o all: a.out a.out: main.o sub.o g++ main.o sub.o %.o: %.cpp g++ -c $< clean: rm -f a.out *.o CXXという変数を定義し、g++という値を代入 コンパイラを変更する場合は、一か所だけ修正すればよくなった 使う時は$(変数名)とする
28 39 依存関係 all: a.out CXX=g++ a.out: main.o sub.o $(CXX)
main.o sub.o %.o: %.cpp $(CXX) -c $< clean: rm -f a.out *.o このMakefileには、param.hppの依存関係が正しく入っていない 依存関係をmakeにどうやって教えるか? 例えばparam.hppを修正したらmain.cpp をコンパイルしなおさないといけない ことをMakeはしらない
29 39 依存関係 がんばって人間が依存関係を書く ツールに自動的に依存関係を抽出させる 人間のミスを防ぐための仕組みを 人間が作るのはナンセンス
30 39 依存関係 g++はMake用の依存関係を出力できる $ g++ -MM *.cpp main.o: main.cpp
param.hpp sub.o: sub.cpp param.hpp $ g++ -MM *.cpp > makefile.dep ファイルにリダイレクトして Makefileにインクルードする -include makefile.dep
31 39 完成 all: a.out CXX=g++ a.out: main.o sub.o $(CXX)
main.o sub.o %.o: %.cpp $(CXX) -c $< clean: rm -f a.out *.o -include makefile.dep ※ 依存関係を自動で作ったり、ソースファイルを自動で取得したり、 まだ自動化できる部分はいろいろある
32 39 makeの応用例:データ処理 大量のデータをスクリプトで変換したい input0.dat input1.dat input2.dat input3.dat … input9.dat
output0.dat output1.dat output2.dat output3.dat … output9.dat convert.py python convert.py < input0.dat > output0.dat python convert.py < input1.dat > output1.dat python convert.py < input2.dat > output2.dat …
33 39 makeの応用例:データ処理 INPUTS=$(shell ls input*.dat) OUTPUTS=$(INPUTS:input%=output%) all: $(OUTPUTS) output%:
input% python convert.py < $< > $@ clean: rm -f $(OUTPUTS) こんなMakefileを書けばmake一発で変換できる
34 39 シェル関数 INPUTS=$(shell ls input*.dat) 実行結果を変数に代入する INPUTS=input0.dat input1.dat input2.dat
… input9.dat
35 39 変数の置換 OUTPUTS=$(INPUTS:input%=output%) 別の変数を、パターンマッチにより置換する INPUTS=input0.dat input1.dat … input9.dat OUTPUTS=output0.dat
output1.dat … output9.dat
36 39 パターンルール all: output0.dat output1.dat … output%: input% python
convert.py < $< > $@ マッチ output0.dat: input0.dat python convert.py < $< > $@ % = 0.dat input0.dat output0.dat
37 39 Makeによるデータ処理 更新されたファイルのみ変換されて効率的 make –j による並列ビルドができて便利 データの変換方法が記録として残る 三日後の自分は他人 「データフォルダでmakeすればよい」とだけ
覚えておけば良いので、判断力を消費しない ※ makeではなくシェルスクリプトでも良いから、とにかく自動化&保存
38 39 Makeによる論文ビルド PDF TeX データファイル データファイル gnuplot python 画像ファイル
画像ファイル コンパイル 最初に精度の低いデータで図を作っておいて、後から 本番の図に差し替える時等に便利 依存関係と処理をMakefileに記述しておけば、データの 更新から論文PDFまでmake一発で行く
39 39 まとめ 依存関係のあるタスクは原則として自動化する 「〇〇したら〇〇しなければならない」や 「〇〇の前には〇〇すること」は危険信号 データ処理などは原則として自動化しておく 便利のためというより、後の記録のために