SlideShare a Scribd company logo
1 of 37
Download to read offline
@azumakuniyuki
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生
活
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Email is Slack @azumakuniyuki
自己紹介
@azumakuniyuki (東邦之)
株式会社Cubicroot
2
- サーバーエンジニア(データセンターに行かなくなった)
- WebUIでポチポチしてAnsibleでザザッと
- 監視とか障害対応とか
- プログラムも書く
- 主にPerl, RubyでSMTP関連の開発・たまーにWebもある
- /bin/shでもそれなりに書くしGo言語の本は積んである
- Cは久しく書いてない(もう書けないかも)
https://nyaan.jp/
ニャーン
3YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
Makefile生
活
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
5
目次
1. Makefileって何?
2. Makefileの形式(浅くて簡単な部分)
3. タスクランナーとしてのMakefile
4. いろいろサンプル
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
6
触れないこと
- C言語の話
- 何かをコンパイルする話
- Makefileの再帰的なアレ
- Makefileの条件文(ifeq, ifneq, …)
- automakeとか自動生成の話
- GNUではないMakefileの話
- サフィックスルール
- C言語の話とC++の話
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
7
Makefile ?
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
8
Makefile ?
- make(1)コマンド実行時に読まれるファイル
- 正確にはGNU make
- *BSDではgmake(1)
- GNUmakefile, makefile, Makefile
- 実行したいコマンド(群)をターゲットでグループ化
- $ make ターゲット名
- 行志向なシェルスクリプト
- 古来からある自動化の仕組み
- 信頼と実績・歴史と伝統のMakefile
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
9
$ make ***
- 馴染みの深いmake(1)のターゲット
- $ make ↩︎
- $ make all ↩︎
- $ make install ↩︎
- $ make clean ↩︎
- $ make test ↩︎
- $ make world ↩︎ (FreeBSDの人)
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
10
$ grep make .zhistory
- コマンド履歴で”make”を実行した回数を数えた
- $ wc -l ~/.zhistory => 69402
- $ grep make ~/.zhistory => 13800
- $ echo ‘scale=4; 13800 / 69402’ | bc
- .1988
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
11
$ grep make .zhistory
- コマンド履歴で”make”を実行した回数を数えた
- $ wc -l ~/.zhistory => 69402
- $ grep make ~/.zhistory => 13800
- $ echo ‘scale=4; 13800 / 69402’ | bc
- .1988
20%!
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
12
perl-5.30.0/ $ make ↩︎
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
13
perl-5.30.0/ $ make ↩︎
↑↑↑↑
画面いっぱい
大量の何かが
すごい速さで
流れていく!
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
14
perl-5.30.0/GNUmakefile
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
15
perl-5.30.0/GNUmakefile
14153行!!!
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
16
深入りすると危ない
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
17
浅瀬の簡単なとこだけ
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
18
手書きのMakefile
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
19
Makefile Format
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
20
$ cat Makefile
# Perlモジュールを入れるコマンドの準備
CPANM = http://cpanmin.us/
cpanm:
wget -cO ./cpanm $(CPANM)
test -f ./cpanm
chmod a+x ./cpanm
install: cpanm
install -m 0755 cpanm /usr/local/bin/
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
21
$ cat Makefile
# Perlモジュールを入れるコマンドの準備
CPANM = http://cpanmin.us/
cpanm:
wget -cO ./cpanm $(CPANM)
test -f ./cpanm
chmod a+x ./cpanm
install: cpanm
install -m 0755 cpanm /usr/local/bin/
マクロ
ターゲット(ファイル名)
コマンド1 (ダウンロード)
コマンド2 (ファイル検査)
コマンド3 (実行権限)
擬似ターゲット: コンポーネント
TAB
TAB
TAB
TAB
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
22
$ cat Makefile
# Perlモジュールを入れるコマンドの準備
CPANM = http://cpanmin.us/
cpanm:
wget -cO ./cpanm $(CPANM)
test -f ./cpanm
chmod a+x ./cpanm
install: cpanm
install -m 0755 cpanm /usr/local/bin/
変数宣言
タスク名
コマンド1 (ダウンロード)
コマンド2 (ファイル検査)
コマンド3 (実行権限)
タスク名: 依存ファイル(依存タスク)
TAB
TAB
TAB
TAB
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
23
Makefile
As a
Task runner
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
24
Makefile
As a task runner
1. 特定の場所
2. 簡潔な処理
3. 共通の名前
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
25
Makefile
As a task runner
2. 簡潔な処理
3. 共通の名前
ディレクトリ内容に依存した処理
- リポジトリ
- git
- cvs
- サーバ上の設定ファイル置き場
- /etc/postfix
- /etc/httpd
- 手元のAnsible Playbook置き場
- コマンドも引数も長めやし
- インベントリも置いてるし
1. 特定の場所
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
26
Makefile
As a task runner
3. 共通の名前
簡潔なタスクの内容
- 単一のコマンド
- 引数が多い
- オプションが多い
- 複数のコマンド
- 実行順序が決まっている
- 前のコマンドが失敗したら
次は実行しない
1. 特定の場所
2. 簡潔な処理
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
27
git-repo $ make
$ make fix-commit-message
さっきコミットしたメッセージを直す
$ make push
現在のブランチをすべてのリモートリポジトリにPUSHする
$ make cancel-the-latest-commit
さっきのコミットを取り消す
$ make remove-added-file
git addで追加したファイルの取り消し
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
28
/etc/postfix # make
# make
systemctl status postfix
↑status postfix と postfix status とかよく間違う
# make test-conn-with-starttls
openssl s_client -quiet -connect 127.0.0.1:587 -starttls smtp
↑長いので覚えられない
# make restart
/usr/sbin/postfix check ← main.cfの文法検査
/usr/bin/systemctl restart postfix ← 文法検査を通れば再起動
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
29
~ $ make
~/.ssh $ make deploy-public-key SSHREMOTEHOST=新サーバ
↑新しいサーバに自分の公開鍵束を設置する
~/ansible $ make build T=apache
ansible-playbook -i server/for-product —tags apache host.yml
↑そこそこ長い
perl-hackers-hub $ make check-wordy
grep —color -rnE "しま[いうっ]|よう[なに]|とい[うっ]|てみ[たて
る]|こと[^。]*こと" docs/* || true
↑長いので覚えられない
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
30
Makefile
As a task runner
共通のターゲット名
- make test
- リポジトリのテスト
- make check
- 設定ファイルの文法検査
- make clean
- 古いファイルの削除
- バックアップファイルを纏める
- インターフェイスの統一
1. 特定の場所
2. 簡潔な処理
3. 共通の名前
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
31
# make check
/etc/postfix # make check
/usr/sbin/postfix check ← main.cfの文法検査
/etc/httpd # make check
/usr/sbin/apachectl configtest ← httpd.confの文法検査
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
32
% make clean
/etc/postfix # make clean
↑Ansibleのtemplateモジュールが作ったバックアップファイルを移動
~ $ make clean
find ./Desktop -type f -name ‘Screen*.png’ -ctime +7 -depth 1
-delete
↑⌘+CTL+3,4で作ったスクリーンショットの古いのを削除
Perl-Module $ make clean
find . Type f -name ‘nytprof*’ -ctime +1 -delete
↑作ってから1日以上経過したDevel::NYTProf関連ファイルを削除
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
33
Omake
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
34
Omake
おまけ
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
35
おまけ
$ make -n clean
rm -f ./*.tmp
↑”-n”を付けるとコマンドが表示される(実行されない)
$ make -f ./Nekochan.mk clean
↑Makefile, makefile, GNUmakefile以外は”-f”で指定できる
$ make test PERL=/opt/bin/perl NEKO=nyaan
↑Makefile内で参照するマクロはコマンドラインから渡せる
↑make DIST=/usr CPPFLAGS=-I… LDFLAGS=-L… みたいな
YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん
Makefile生活 @azumakuniyuki
36
おまけ
DATE = $(shell date ‘+%F’) ←コマンドの実行結果がマクロに入る
test:
@ test -f /etc/mail/sendmail.cf
- test -f /etc/postfix/main.cf
“@“ を先頭につけるとコマンド自体を表示しない
“-“ を先頭につけるとエラー(exit 0以外)でも続行する
終

More Related Content

More from azumakuniyuki 🐈

NSEG勉強会(101)LT: 僕と長野県
NSEG勉強会(101)LT: 僕と長野県NSEG勉強会(101)LT: 僕と長野県
NSEG勉強会(101)LT: 僕と長野県azumakuniyuki 🐈
 
[スパム報告]ボタンを押すとどうなるのか | Hosting Casual Talks #4
[スパム報告]ボタンを押すとどうなるのか | Hosting Casual Talks #4[スパム報告]ボタンを押すとどうなるのか | Hosting Casual Talks #4
[スパム報告]ボタンを押すとどうなるのか | Hosting Casual Talks #4azumakuniyuki 🐈
 
SendGridのない世界 | SendGrid Night in Osaka #2
SendGridのない世界 | SendGrid Night in Osaka #2SendGridのない世界 | SendGrid Night in Osaka #2
SendGridのない世界 | SendGrid Night in Osaka #2azumakuniyuki 🐈
 
Hokkaido.pm#13参加報告 | YAPC::Kansai 2017 Osaka
Hokkaido.pm#13参加報告 | YAPC::Kansai 2017 OsakaHokkaido.pm#13参加報告 | YAPC::Kansai 2017 Osaka
Hokkaido.pm#13参加報告 | YAPC::Kansai 2017 Osakaazumakuniyuki 🐈
 
メールフォームからメールを送る近代的な方法 | YAPC::Kansai 2017 OSAKA
メールフォームからメールを送る近代的な方法 | YAPC::Kansai 2017 OSAKAメールフォームからメールを送る近代的な方法 | YAPC::Kansai 2017 OSAKA
メールフォームからメールを送る近代的な方法 | YAPC::Kansai 2017 OSAKAazumakuniyuki 🐈
 
僕と北海道とPerl、それとMakefileも。
僕と北海道とPerl、それとMakefileも。僕と北海道とPerl、それとMakefileも。
僕と北海道とPerl、それとMakefileも。azumakuniyuki 🐈
 
PerlモジュールをRubyに移植する時に落ちた穴々
PerlモジュールをRubyに移植する時に落ちた穴々PerlモジュールをRubyに移植する時に落ちた穴々
PerlモジュールをRubyに移植する時に落ちた穴々azumakuniyuki 🐈
 
自動構築と自動テスト〜インフラのコード化とクラウドの優位性
自動構築と自動テスト〜インフラのコード化とクラウドの優位性自動構築と自動テスト〜インフラのコード化とクラウドの優位性
自動構築と自動テスト〜インフラのコード化とクラウドの優位性azumakuniyuki 🐈
 
Hachioji.pm #40 次のbounceHammer開発中
Hachioji.pm #40 次のbounceHammer開発中Hachioji.pm #40 次のbounceHammer開発中
Hachioji.pm #40 次のbounceHammer開発中azumakuniyuki 🐈
 
2013 11-30-mailqueue-monitoring
2013 11-30-mailqueue-monitoring2013 11-30-mailqueue-monitoring
2013 11-30-mailqueue-monitoringazumakuniyuki 🐈
 
Plackで実装したメールサーバ"Haineko"のその後/Shibuya.pl #1
Plackで実装したメールサーバ"Haineko"のその後/Shibuya.pl #1 Plackで実装したメールサーバ"Haineko"のその後/Shibuya.pl #1
Plackで実装したメールサーバ"Haineko"のその後/Shibuya.pl #1 azumakuniyuki 🐈
 
実践的bounceHammer / KOF2013
実践的bounceHammer / KOF2013実践的bounceHammer / KOF2013
実践的bounceHammer / KOF2013azumakuniyuki 🐈
 
JSONでメール送信(Haineko) / KOF2013
JSONでメール送信(Haineko) / KOF2013JSONでメール送信(Haineko) / KOF2013
JSONでメール送信(Haineko) / KOF2013azumakuniyuki 🐈
 
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2azumakuniyuki 🐈
 
猫とPerl〜応用編1/YAPC Asia Tokyo 2013 LT-THON::Tiny
猫とPerl〜応用編1/YAPC Asia Tokyo 2013 LT-THON::Tiny猫とPerl〜応用編1/YAPC Asia Tokyo 2013 LT-THON::Tiny
猫とPerl〜応用編1/YAPC Asia Tokyo 2013 LT-THON::Tinyazumakuniyuki 🐈
 
Perl and Email #3 ``Haineko''/Kyoto.pm #5
Perl and Email #3 ``Haineko''/Kyoto.pm #5Perl and Email #3 ``Haineko''/Kyoto.pm #5
Perl and Email #3 ``Haineko''/Kyoto.pm #5azumakuniyuki 🐈
 
Kansai.pm #15 LT資料「猫とPerl」
Kansai.pm #15 LT資料「猫とPerl」Kansai.pm #15 LT資料「猫とPerl」
Kansai.pm #15 LT資料「猫とPerl」azumakuniyuki 🐈
 

More from azumakuniyuki 🐈 (20)

NSEG勉強会(101)LT: 僕と長野県
NSEG勉強会(101)LT: 僕と長野県NSEG勉強会(101)LT: 僕と長野県
NSEG勉強会(101)LT: 僕と長野県
 
Email is Slack
Email is SlackEmail is Slack
Email is Slack
 
[スパム報告]ボタンを押すとどうなるのか | Hosting Casual Talks #4
[スパム報告]ボタンを押すとどうなるのか | Hosting Casual Talks #4[スパム報告]ボタンを押すとどうなるのか | Hosting Casual Talks #4
[スパム報告]ボタンを押すとどうなるのか | Hosting Casual Talks #4
 
SendGridのない世界 | SendGrid Night in Osaka #2
SendGridのない世界 | SendGrid Night in Osaka #2SendGridのない世界 | SendGrid Night in Osaka #2
SendGridのない世界 | SendGrid Night in Osaka #2
 
Hokkaido.pm#13参加報告 | YAPC::Kansai 2017 Osaka
Hokkaido.pm#13参加報告 | YAPC::Kansai 2017 OsakaHokkaido.pm#13参加報告 | YAPC::Kansai 2017 Osaka
Hokkaido.pm#13参加報告 | YAPC::Kansai 2017 Osaka
 
メールフォームからメールを送る近代的な方法 | YAPC::Kansai 2017 OSAKA
メールフォームからメールを送る近代的な方法 | YAPC::Kansai 2017 OSAKAメールフォームからメールを送る近代的な方法 | YAPC::Kansai 2017 OSAKA
メールフォームからメールを送る近代的な方法 | YAPC::Kansai 2017 OSAKA
 
僕と北海道とPerl、それとMakefileも。
僕と北海道とPerl、それとMakefileも。僕と北海道とPerl、それとMakefileも。
僕と北海道とPerl、それとMakefileも。
 
PerlモジュールをRubyに移植する時に落ちた穴々
PerlモジュールをRubyに移植する時に落ちた穴々PerlモジュールをRubyに移植する時に落ちた穴々
PerlモジュールをRubyに移植する時に落ちた穴々
 
自動構築と自動テスト〜インフラのコード化とクラウドの優位性
自動構築と自動テスト〜インフラのコード化とクラウドの優位性自動構築と自動テスト〜インフラのコード化とクラウドの優位性
自動構築と自動テスト〜インフラのコード化とクラウドの優位性
 
Hachioji.pm #40 次のbounceHammer開発中
Hachioji.pm #40 次のbounceHammer開発中Hachioji.pm #40 次のbounceHammer開発中
Hachioji.pm #40 次のbounceHammer開発中
 
2013 11-30-mailqueue-monitoring
2013 11-30-mailqueue-monitoring2013 11-30-mailqueue-monitoring
2013 11-30-mailqueue-monitoring
 
Plackで実装したメールサーバ"Haineko"のその後/Shibuya.pl #1
Plackで実装したメールサーバ"Haineko"のその後/Shibuya.pl #1 Plackで実装したメールサーバ"Haineko"のその後/Shibuya.pl #1
Plackで実装したメールサーバ"Haineko"のその後/Shibuya.pl #1
 
Perlの書籍紹介/KOF2013
Perlの書籍紹介/KOF2013Perlの書籍紹介/KOF2013
Perlの書籍紹介/KOF2013
 
実践的bounceHammer / KOF2013
実践的bounceHammer / KOF2013実践的bounceHammer / KOF2013
実践的bounceHammer / KOF2013
 
JSONでメール送信(Haineko) / KOF2013
JSONでメール送信(Haineko) / KOF2013JSONでメール送信(Haineko) / KOF2013
JSONでメール送信(Haineko) / KOF2013
 
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2
 
猫とPerl〜応用編1/YAPC Asia Tokyo 2013 LT-THON::Tiny
猫とPerl〜応用編1/YAPC Asia Tokyo 2013 LT-THON::Tiny猫とPerl〜応用編1/YAPC Asia Tokyo 2013 LT-THON::Tiny
猫とPerl〜応用編1/YAPC Asia Tokyo 2013 LT-THON::Tiny
 
Perl and Email #3 ``Haineko''/Kyoto.pm #5
Perl and Email #3 ``Haineko''/Kyoto.pm #5Perl and Email #3 ``Haineko''/Kyoto.pm #5
Perl and Email #3 ``Haineko''/Kyoto.pm #5
 
Kansai.pm #15 LT資料「猫とPerl」
Kansai.pm #15 LT資料「猫とPerl」Kansai.pm #15 LT資料「猫とPerl」
Kansai.pm #15 LT資料「猫とPerl」
 
Namba.pm #0 LT資料
Namba.pm #0 LT資料Namba.pm #0 LT資料
Namba.pm #0 LT資料
 

YAPC::Nagoya::Tiny 2019 | Makefile生活

  • 1. @azumakuniyuki YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生 活
  • 2. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Email is Slack @azumakuniyuki 自己紹介 @azumakuniyuki (東邦之) 株式会社Cubicroot 2 - サーバーエンジニア(データセンターに行かなくなった) - WebUIでポチポチしてAnsibleでザザッと - 監視とか障害対応とか - プログラムも書く - 主にPerl, RubyでSMTP関連の開発・たまーにWebもある - /bin/shでもそれなりに書くしGo言語の本は積んである - Cは久しく書いてない(もう書けないかも) https://nyaan.jp/
  • 3. ニャーン 3YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki
  • 4. Makefile生 活 YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki
  • 5. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 5 目次 1. Makefileって何? 2. Makefileの形式(浅くて簡単な部分) 3. タスクランナーとしてのMakefile 4. いろいろサンプル
  • 6. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 6 触れないこと - C言語の話 - 何かをコンパイルする話 - Makefileの再帰的なアレ - Makefileの条件文(ifeq, ifneq, …) - automakeとか自動生成の話 - GNUではないMakefileの話 - サフィックスルール - C言語の話とC++の話
  • 7. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 7 Makefile ?
  • 8. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 8 Makefile ? - make(1)コマンド実行時に読まれるファイル - 正確にはGNU make - *BSDではgmake(1) - GNUmakefile, makefile, Makefile - 実行したいコマンド(群)をターゲットでグループ化 - $ make ターゲット名 - 行志向なシェルスクリプト - 古来からある自動化の仕組み - 信頼と実績・歴史と伝統のMakefile
  • 9. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 9 $ make *** - 馴染みの深いmake(1)のターゲット - $ make ↩︎ - $ make all ↩︎ - $ make install ↩︎ - $ make clean ↩︎ - $ make test ↩︎ - $ make world ↩︎ (FreeBSDの人)
  • 10. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 10 $ grep make .zhistory - コマンド履歴で”make”を実行した回数を数えた - $ wc -l ~/.zhistory => 69402 - $ grep make ~/.zhistory => 13800 - $ echo ‘scale=4; 13800 / 69402’ | bc - .1988
  • 11. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 11 $ grep make .zhistory - コマンド履歴で”make”を実行した回数を数えた - $ wc -l ~/.zhistory => 69402 - $ grep make ~/.zhistory => 13800 - $ echo ‘scale=4; 13800 / 69402’ | bc - .1988 20%!
  • 12. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 12 perl-5.30.0/ $ make ↩︎
  • 13. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 13 perl-5.30.0/ $ make ↩︎ ↑↑↑↑ 画面いっぱい 大量の何かが すごい速さで 流れていく!
  • 14. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 14 perl-5.30.0/GNUmakefile
  • 15. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 15 perl-5.30.0/GNUmakefile 14153行!!!
  • 16. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 16 深入りすると危ない
  • 17. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 17 浅瀬の簡単なとこだけ
  • 18. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 18 手書きのMakefile
  • 19. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 19 Makefile Format
  • 20. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 20 $ cat Makefile # Perlモジュールを入れるコマンドの準備 CPANM = http://cpanmin.us/ cpanm: wget -cO ./cpanm $(CPANM) test -f ./cpanm chmod a+x ./cpanm install: cpanm install -m 0755 cpanm /usr/local/bin/
  • 21. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 21 $ cat Makefile # Perlモジュールを入れるコマンドの準備 CPANM = http://cpanmin.us/ cpanm: wget -cO ./cpanm $(CPANM) test -f ./cpanm chmod a+x ./cpanm install: cpanm install -m 0755 cpanm /usr/local/bin/ マクロ ターゲット(ファイル名) コマンド1 (ダウンロード) コマンド2 (ファイル検査) コマンド3 (実行権限) 擬似ターゲット: コンポーネント TAB TAB TAB TAB
  • 22. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 22 $ cat Makefile # Perlモジュールを入れるコマンドの準備 CPANM = http://cpanmin.us/ cpanm: wget -cO ./cpanm $(CPANM) test -f ./cpanm chmod a+x ./cpanm install: cpanm install -m 0755 cpanm /usr/local/bin/ 変数宣言 タスク名 コマンド1 (ダウンロード) コマンド2 (ファイル検査) コマンド3 (実行権限) タスク名: 依存ファイル(依存タスク) TAB TAB TAB TAB
  • 23. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 23 Makefile As a Task runner
  • 24. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 24 Makefile As a task runner 1. 特定の場所 2. 簡潔な処理 3. 共通の名前
  • 25. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 25 Makefile As a task runner 2. 簡潔な処理 3. 共通の名前 ディレクトリ内容に依存した処理 - リポジトリ - git - cvs - サーバ上の設定ファイル置き場 - /etc/postfix - /etc/httpd - 手元のAnsible Playbook置き場 - コマンドも引数も長めやし - インベントリも置いてるし 1. 特定の場所
  • 26. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 26 Makefile As a task runner 3. 共通の名前 簡潔なタスクの内容 - 単一のコマンド - 引数が多い - オプションが多い - 複数のコマンド - 実行順序が決まっている - 前のコマンドが失敗したら 次は実行しない 1. 特定の場所 2. 簡潔な処理
  • 27. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 27 git-repo $ make $ make fix-commit-message さっきコミットしたメッセージを直す $ make push 現在のブランチをすべてのリモートリポジトリにPUSHする $ make cancel-the-latest-commit さっきのコミットを取り消す $ make remove-added-file git addで追加したファイルの取り消し
  • 28. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 28 /etc/postfix # make # make systemctl status postfix ↑status postfix と postfix status とかよく間違う # make test-conn-with-starttls openssl s_client -quiet -connect 127.0.0.1:587 -starttls smtp ↑長いので覚えられない # make restart /usr/sbin/postfix check ← main.cfの文法検査 /usr/bin/systemctl restart postfix ← 文法検査を通れば再起動
  • 29. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 29 ~ $ make ~/.ssh $ make deploy-public-key SSHREMOTEHOST=新サーバ ↑新しいサーバに自分の公開鍵束を設置する ~/ansible $ make build T=apache ansible-playbook -i server/for-product —tags apache host.yml ↑そこそこ長い perl-hackers-hub $ make check-wordy grep —color -rnE "しま[いうっ]|よう[なに]|とい[うっ]|てみ[たて る]|こと[^。]*こと" docs/* || true ↑長いので覚えられない
  • 30. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 30 Makefile As a task runner 共通のターゲット名 - make test - リポジトリのテスト - make check - 設定ファイルの文法検査 - make clean - 古いファイルの削除 - バックアップファイルを纏める - インターフェイスの統一 1. 特定の場所 2. 簡潔な処理 3. 共通の名前
  • 31. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 31 # make check /etc/postfix # make check /usr/sbin/postfix check ← main.cfの文法検査 /etc/httpd # make check /usr/sbin/apachectl configtest ← httpd.confの文法検査
  • 32. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 32 % make clean /etc/postfix # make clean ↑Ansibleのtemplateモジュールが作ったバックアップファイルを移動 ~ $ make clean find ./Desktop -type f -name ‘Screen*.png’ -ctime +7 -depth 1 -delete ↑⌘+CTL+3,4で作ったスクリーンショットの古いのを削除 Perl-Module $ make clean find . Type f -name ‘nytprof*’ -ctime +1 -delete ↑作ってから1日以上経過したDevel::NYTProf関連ファイルを削除
  • 33. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 33 Omake
  • 34. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 34 Omake おまけ
  • 35. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 35 おまけ $ make -n clean rm -f ./*.tmp ↑”-n”を付けるとコマンドが表示される(実行されない) $ make -f ./Nekochan.mk clean ↑Makefile, makefile, GNUmakefile以外は”-f”で指定できる $ make test PERL=/opt/bin/perl NEKO=nyaan ↑Makefile内で参照するマクロはコマンドラインから渡せる ↑make DIST=/usr CPPFLAGS=-I… LDFLAGS=-L… みたいな
  • 36. YAPC::Nagoya::Tiny 2019 | 11/03(祝) 名古屋国際センターさん Makefile生活 @azumakuniyuki 36 おまけ DATE = $(shell date ‘+%F’) ←コマンドの実行結果がマクロに入る test: @ test -f /etc/mail/sendmail.cf - test -f /etc/postfix/main.cf “@“ を先頭につけるとコマンド自体を表示しない “-“ を先頭につけるとエラー(exit 0以外)でも続行する
  • 37.