SlideShare uma empresa Scribd logo
1 de 9
Makefile キホンのキ
Makefile の基本ルール
ターゲットファイル:依存ファイル1 依存ファイル2 …
→Tab→実行コマンド
① 「ターゲットファイル」とすべての「依存ファイル」のタイムスタンプ
を比較して
② 依存ファイルのいずれかが新しくなっていたら
③ 下に書かれているコマンドを実行する
※注意※
実行コマンド行の先頭は必ずTabを使うこと(Spaceでは動作しない)
Makefile の例
hello:hello.cpp
→Tab→g++ -Wall hello.cpp –o hello
① 実行ファイル hello とソースファイル hello.cpp のタイムスタンプを
比較して
② hello.cpp が新しくなっていたら
③ g++ … -o hello を実行する
Makefile の例 (2)
clean:
→Tab→rm –rf *.o
① clean というファイルがないので
② とにかく
③ rm … を実行する
※ cf. 例(6):.PHONY
Makefile の例 (3)
CC = g++
CFLAGS = -g -Wall
all: sample1 sample2
sample1: sample1.cpp
$(CC) $(CFLAGS) -o sample1 sample1.cpp
sample2: sample2.cpp
$(CC) $(CFLAGS) -o sample2 sample2.cpp
コマンドラインで make と打てば、
Makefile の最初のターゲットを実行する(上記ではmake all と同)
Makefile の例 (4) 分割コンパイル
CC = g++
CFLAGS = -g -Wall
all: main.o sub.o
$(CC) $(CFLAGS) -o main main.o sub.o
main.o: main.cpp
$(CC) $(CFLAGS) -o main.o -c main.cpp
sub.o: sub.cpp sub.h
$(CC) $(CFLAGS) -o sub.o -c sub.cpp
コマンドラインで make と打てば、
変更された *.cpp, *.h に対するターゲットの *.o がコンパイルされ、
その *.o をリンクするための make all が実行される
Makefile の例 (5) サフィックスルール、自動変数
CC = g++
CFLAGS = -g -Wall
.cpp.o:
$(CC) $(CFLAGS) -o $@ -c $<
all: main.o sub.o
$(CC) $(CFLAGS) -o main main.o sub.o
sub.o: sub.h
Makefile の例 (6)
CC = $(CXX)
CXXFLAGS += -g -Wall
all: server client
server: server.o socket.o
client: client.o socket.o
socket.o: socket.h
clean:
$(RM) *.o
.PHONY: all clean
サフィックスルールを理解していれば、
Makefile は最低限の差分だけ記述すればいい
以上ここまで

Mais conteúdo relacionado

Mais procurados

ParliamentでGeoSPARQL
ParliamentでGeoSPARQLParliamentでGeoSPARQL
ParliamentでGeoSPARQLTeppei Inaba
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するshigeki_ohtsu
 
高速化のポイント
高速化のポイント高速化のポイント
高速化のポイントryos36
 
Webサーバ勉強会 (160-162:?)
Webサーバ勉強会 (160-162:?)Webサーバ勉強会 (160-162:?)
Webサーバ勉強会 (160-162:?)Yuuki Namikawa
 
高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャ高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャDADA246
 
PythonistaがOCamlを実用する方法
PythonistaがOCamlを実用する方法PythonistaがOCamlを実用する方法
PythonistaがOCamlを実用する方法Yosuke Onoue
 
Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話Nobuhiro Nakashima
 
Rubyで実はwritev(2) が使われているはなし
Rubyで実はwritev(2) が使われているはなしRubyで実はwritev(2) が使われているはなし
Rubyで実はwritev(2) が使われているはなしMasaki Matsushita
 
Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方Kazuki Ohta
 
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサーnakamura001
 
Tarantubeでメッセージキューを使い倒す
Tarantubeでメッセージキューを使い倒すTarantubeでメッセージキューを使い倒す
Tarantubeでメッセージキューを使い倒すMasashi Umezawa
 
20130215 fluentd esper_2
20130215 fluentd esper_220130215 fluentd esper_2
20130215 fluentd esper_2Ogibayashi
 
ret2dl resolve
ret2dl resolveret2dl resolve
ret2dl resolvesounakano
 
131101 foss4 g_tokyo_grass_shell_presentation
131101 foss4 g_tokyo_grass_shell_presentation131101 foss4 g_tokyo_grass_shell_presentation
131101 foss4 g_tokyo_grass_shell_presentationTakayuki Nuimura
 
Python と私の事情
Python と私の事情Python と私の事情
Python と私の事情tsudaa
 
Varnishのログの眺め方
Varnishのログの眺め方Varnishのログの眺め方
Varnishのログの眺め方Iwana Chan
 
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)Iwana Chan
 

Mais procurados (20)

ParliamentでGeoSPARQL
ParliamentでGeoSPARQLParliamentでGeoSPARQL
ParliamentでGeoSPARQL
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
 
高速化のポイント
高速化のポイント高速化のポイント
高速化のポイント
 
Webサーバ勉強会 (160-162:?)
Webサーバ勉強会 (160-162:?)Webサーバ勉強会 (160-162:?)
Webサーバ勉強会 (160-162:?)
 
高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャ高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャ
 
PythonistaがOCamlを実用する方法
PythonistaがOCamlを実用する方法PythonistaがOCamlを実用する方法
PythonistaがOCamlを実用する方法
 
Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話
 
Rubyで実はwritev(2) が使われているはなし
Rubyで実はwritev(2) が使われているはなしRubyで実はwritev(2) が使われているはなし
Rubyで実はwritev(2) が使われているはなし
 
Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方
 
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
 
Tarantubeでメッセージキューを使い倒す
Tarantubeでメッセージキューを使い倒すTarantubeでメッセージキューを使い倒す
Tarantubeでメッセージキューを使い倒す
 
20130215 fluentd esper_2
20130215 fluentd esper_220130215 fluentd esper_2
20130215 fluentd esper_2
 
Http
HttpHttp
Http
 
チートシート
チートシートチートシート
チートシート
 
ret2dl resolve
ret2dl resolveret2dl resolve
ret2dl resolve
 
131101 foss4 g_tokyo_grass_shell_presentation
131101 foss4 g_tokyo_grass_shell_presentation131101 foss4 g_tokyo_grass_shell_presentation
131101 foss4 g_tokyo_grass_shell_presentation
 
Python と私の事情
Python と私の事情Python と私の事情
Python と私の事情
 
Varnishのログの眺め方
Varnishのログの眺め方Varnishのログの眺め方
Varnishのログの眺め方
 
Git 実践入門
Git 実践入門Git 実践入門
Git 実践入門
 
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
 

これだけMakefile (Basics of makefile)

  • 2. Makefile の基本ルール ターゲットファイル:依存ファイル1 依存ファイル2 … →Tab→実行コマンド ① 「ターゲットファイル」とすべての「依存ファイル」のタイムスタンプ を比較して ② 依存ファイルのいずれかが新しくなっていたら ③ 下に書かれているコマンドを実行する ※注意※ 実行コマンド行の先頭は必ずTabを使うこと(Spaceでは動作しない)
  • 3. Makefile の例 hello:hello.cpp →Tab→g++ -Wall hello.cpp –o hello ① 実行ファイル hello とソースファイル hello.cpp のタイムスタンプを 比較して ② hello.cpp が新しくなっていたら ③ g++ … -o hello を実行する
  • 4. Makefile の例 (2) clean: →Tab→rm –rf *.o ① clean というファイルがないので ② とにかく ③ rm … を実行する ※ cf. 例(6):.PHONY
  • 5. Makefile の例 (3) CC = g++ CFLAGS = -g -Wall all: sample1 sample2 sample1: sample1.cpp $(CC) $(CFLAGS) -o sample1 sample1.cpp sample2: sample2.cpp $(CC) $(CFLAGS) -o sample2 sample2.cpp コマンドラインで make と打てば、 Makefile の最初のターゲットを実行する(上記ではmake all と同)
  • 6. Makefile の例 (4) 分割コンパイル CC = g++ CFLAGS = -g -Wall all: main.o sub.o $(CC) $(CFLAGS) -o main main.o sub.o main.o: main.cpp $(CC) $(CFLAGS) -o main.o -c main.cpp sub.o: sub.cpp sub.h $(CC) $(CFLAGS) -o sub.o -c sub.cpp コマンドラインで make と打てば、 変更された *.cpp, *.h に対するターゲットの *.o がコンパイルされ、 その *.o をリンクするための make all が実行される
  • 7. Makefile の例 (5) サフィックスルール、自動変数 CC = g++ CFLAGS = -g -Wall .cpp.o: $(CC) $(CFLAGS) -o $@ -c $< all: main.o sub.o $(CC) $(CFLAGS) -o main main.o sub.o sub.o: sub.h
  • 8. Makefile の例 (6) CC = $(CXX) CXXFLAGS += -g -Wall all: server client server: server.o socket.o client: client.o socket.o socket.o: socket.h clean: $(RM) *.o .PHONY: all clean サフィックスルールを理解していれば、 Makefile は最低限の差分だけ記述すればいい