最終更新:2016-12-22 (木) 13:59:13 (1029d)  

Makefile はてなブックマークを見る
Top / Makefile

makeMakefileに記された依存関係に基づいて更新されたファイルの内関連のあるものだけを更新することで、コンパイル時間を短くします。

http://www.gnu.org/software/make/manual/make.html

日本語 - GNU make Version 3.7

文法

  • 依存関係は必ず行頭から書かねばならない。
  • 生成コマンドは必ず行頭にタブ文字 (ASCII コードで 9番の文字。 スペースではダメ) を入れなければならない。
    ターゲット名: 依存ファイル名1 依存ファイル名2 依存ファイル名3 # 依存関係
    	コマンド行1                                           # 生成コマンド1
    	コマンド行2                                           # 生成コマンド2

基本

  • [作りたいファイル名]:
    	[そのファイルを作るためのコマンド行]
  • 存在しないファイルを指定(PHONYターゲット)
    .PHONY: [実行したいタスク名]
    [実行したいタスク名]:
    	[そのタスクを行うためのコマンド行]
  • 同名のファイルやディレクトリがあると混乱するので,.PHONYは積極的に書くようにする

ターゲット

  • 指定しなかった場合は,一番最初に書かれたルールが実行されます

メモ

  • makeは基本的に行指向
  • #から行末までがコメント
  • 見やすくするために改行したい場合はバックスラッシュ\を使って改行を無視させることができる

  • # Makefile
    all:test
    	./test
    test: test.c
    	gcc -o test test.c
    .PHONY: clean
    clean:
    	rm -f test

.PHONY (フォニーターゲット)

  • .PHONYという特別なターゲットの依存関係は偽のターゲット(Phony Target)になります。
  • フォニーターゲットは処理する時に同名のファイルの存在や最終修正時刻を気にしません。つまり、makeは無条件にコマンドを実行します。

サフィックスルール

  • .c.o:
           cc -c $<
  • .cに対しては、"cc -c そのファイル" という生成コマンドを使って サフィックス .oを生成せよ

Makefile/自動変数

  • $@ターゲットファイル名
    $%?ターゲットがアーカイブメンバだったときのターゲットメンバ名
    $<?最初の依存するファイルの名前
    $?ターゲットより新しいすべての依存するファイル名
    $^?すべての依存するファイルの名前
    $+?Makefileと同じ順番の依存するファイルの名前
    $*サフィックスを除いたターゲットの名前

Makefile/関数

  • 書き方
    $(関数 引数)
  • または
    ${関数 引数}

make

  • 何も指定せずにmakeを実行すると、makeはその最終目標としてMakefileの一番最初に書かれているターゲットを生成しようとする

Automake

演算子

  • =? - Assign the value to the variable. Any previous value is overridden.
  • +=? - Append the value to the current value of the variable.
  • ?= - Assign the value to the variable if it is not already defined.
  • := - Assign with expansion, i.e., expand the value before assigning it to the variable. Normally, expansion is not done until the variable is referenced.
  • !=? - Expand the value and pass it to the shell for execution and assign the result to the variable. Any newlines in the result are replaced with spaces.

参考