GNU Make入門 1/2


はじめに

新卒 SE 見習い(投稿当時)のぷるぷえです。
全く違う仕事にアサインされたので、忘れないうちに文字に起こそうといったところです。

敷居を低くしようとした結果、抽象的な表現も散見します。予めご了承ください。
このエントリが私と同じ初心者 C 系プログラマーさんのエントリーになれば嬉しい限りです。

環境

Ubuntu Server 18.04.2 LTS
GNU Make 4.1

全体の流れ

以下の章立てで進めていきます。
尚、2つのエントリに分ける予定です。(いつか投稿します)
本エントリでは3章まで扱います。

  1. make とは
  2. 超絶簡単に makefile
  3. 結構簡単に makefile ここまで
  4. C ファイルのコンパイル
  5. 4 で作成した makefile の改良

make とは

作業を自動化するツールのことです。
コマンド(echo とかgccとか)を自動化するプログラムを組んだ makefile を作成すると、いろんな操作がコマンド一つでポーンってできちゃいます。

うれしいこと

  • 単純作業の自動化
  • 膨大なソースファイルを一気に実行
  • 変更したファイルだけ差分コンパイル
  • テストで必要

などなど。

超絶簡単に makefile

コマンドライン上に文字列を表示する「echo」コマンドを自動化します。
超絶簡単です。

1. makefile を作成

お使いのエディタで「makefile」という名前のファイルを作成してください。1
Atom なら、Ctrl + N → Ctrl + Shift + L で makefile を選択します。

2. プログラムを書く

makefile
all:
  echo Hello world!

3.実行

コンソールで「make」コマンドを打ちます。

makefile
$ make
echo Hello World!
Hello World!

表示されました。

結構簡単に makefile

ディレクトリのお掃除を自動化してみます。
こんなテキストファイルがあるとしましょう。

フォルダ内には、rm.mk という makefile と C ファイル、そしてテキストファイルが2つ存在します。

ここを make コマンドで

こうしたい!
rm.mk と同一ディレクトリ上のテキストファイルをお掃除するのがゴール。

1. makefile を作成

テキストファイルを rm する makefile を作成するので、「rm.mk」としました。

2. プログラムを書く

rm.mk
clean:; rm -f *.txt

ここで使われている「 * 」は、サフィックスを除いたターゲットの名前を指定する自動変数です。
*.txt は、任意のテキストファイルを対象にするという意味になります。

サフィックス : 文字列やデータ列の末尾に付加され、何らかの意味を表す要素を指す。(IT用語辞典さんより)

3.実行

今回は、makefile というファイル名ではなく、「rm.mk」としたので、以下のように実行します。

rm.mk
$ make -f rm.mk
rm -f *.txt

make コマンドの -f オプションによって、そのあとに指定したファイル(rm.mk)を makefile として扱うことができます。

テキストファイルだけがすべて削除されました。
単純作業を自動化することがイメージできたと思います。

さいごに

次回は、面倒な C ファイルのコンパイルを自動化します。
make っていいな、となるのはこれからですね。

参考文献

  • GNU Make 第3版 - Robert Mecklenburg 著、矢吹 道郎 監訳、菊池 彰 訳

  1. 「makefile」や「Makefile」は、デフォルトで呼び出されます。拡張子が「.mk」の makefile は、make -f ~~.mk で呼び出します。