Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
GNU Makeの使い方 / How to use GNU Make
Search
kaityo256
PRO
April 14, 2026
Programming
6.1k
16
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GNU Makeの使い方 / How to use GNU Make
研究室ハンズオン資料
kaityo256
PRO
April 14, 2026
More Decks by kaityo256
See All by kaityo256
生成AIとの付き合い方/ How to work with AI
kaityo256
PRO
3
790
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
270
What is XAI?
kaityo256
PRO
0
210
勾配ブースティングと決定木の話 / gradient boosting and decision trees
kaityo256
PRO
7
1.9k
この講義について / 00-setup
kaityo256
PRO
2
540
GitHubによるWebアプリケーションのデプロイ / 07-github-deploy
kaityo256
PRO
2
480
演習:Gitの基本操作 / 04-git-basic
kaityo256
PRO
1
730
演習:Gitの応用操作 / 05-git-advanced
kaityo256
PRO
1
430
演習:GitHubの基本操作 / 06-github-basic
kaityo256
PRO
1
550
Other Decks in Programming
See All in Programming
contenteditable と日本語入力に向き合う
colorful12
0
170
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
160
Domain-Driven Transformation
hschwentner
2
2.3k
Are APIs Still Relevant in the AI Era?
soyuka
0
430
速習iPhone Duo対応
yuukiw00w
2
960
パーソナライズPodcastを作った話
repunit11
0
120
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
450
最近”作らせてる” ローカルAIアプリの話
akit37
0
200
phperだってパンチカードでコーディングしたい
o0h
PRO
0
230
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
setup-vp GitLab対応の裏側
naokihaba
0
150
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
480
Featured
See All Featured
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
300
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Statistics for Hackers
jakevdp
799
230k
Claude Code のすすめ
schroneko
67
230k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
400
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
390
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
A Modern Web Designer's Workflow
chriscoyier
699
190k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
860
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
The World Runs on Bad Software
bkeepers
PRO
72
12k
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 まとめ 依存関係のあるタスクは原則として自動化する 「〇〇したら〇〇しなければならない」や 「〇〇の前には〇〇すること」は危険信号 データ処理などは原則として自動化しておく 便利のためというより、後の記録のために