投稿

12月, 2019の投稿を表示しています

Makefileの基本的な書き方について

最近研究室Wikiに後輩向けの文章書いてたのですが,いくつかはclosedにするのも勿体無いので編集してブログで公開しようかと思います。 概要 Makefile は自分の書いたコードのビルドの自動化に便利なため基本的な記法は知っておくとよい いちいちシェルの履歴を確認したりコマンドをミスする悲しいことがなくなる Makefile はビルドだけでなく実験やらなんやらの task runner としても便利 ビルド・実験を回す・結果をグラフにする,などをまとめてやったりすることも可能 上記は shell script でも可能だがメリットとして あるタスクに対して依存関係が記述できる 実験タスクの依存にビルドタスクを記述すれば,実験タスクを実行したら自動でビルドしてくれる あるタスクについて,依存先が更新されていなければ実行しないという機能が標準で存在 二行上のような依存を記述していたときに,ソースコードの更新の有無でビルドの実行をする/しないを勝手に判断してくれる 以下の説明は GNU Make に準拠して説明を行う。BSD Make の場合上手く動作しない記法も含まれる Makefile の基本的な利用法 TARGET := prog CC := /usr/bin/gcc CFLAGS := -g -O2 -Wall RM := /bin/rm $(TARGET): main.c $(CC) $(CFLAGS) $< -o $@ clean: $(RM) -rf $(TARGET) all: $(TARGET) .PHONY: all clean 上記は最も基本的な Makefile の記述のひとつ。 ひとつひとつ見ていく Makefile の変数 Makefile はシェル変数とは別に独自の変数を持つ。 := で変数を定義し, $(VAR) のように記述して展開する。 また,変数は = でも定義が可能だが, := と = は定義式の評価のタイミングが異なるなど差異が存在する。 具体的には = を用いると値が決まるのが実際に参照されるときになる。 Makefile のタスクの中でシェルの環境変数($PATH など)を展開したい場合は $$PATH のように $ をエスケープす