最終更新:2021-01-24 (日) 02:28:27 (1187d)  

Makefile
Top / Makefile

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

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

日本語 - GNU make Version 3.7

基本

  • 再構築を最小限の処理で行うために依存関係を記述する

文法

  • 依存関係は必ず行頭から書かねばならない。

Makefile/ルール

  • ターゲット
  • 必須項目 (依存ファイル)
  • 実行コマンド
  • の3つからなる
    ターゲット:必須項目1 必須項目2
         実行コマンド

Makefile/ターゲット

  • 指定しなかった場合は,一番最初に書かれたルールが実行されます
  • 生成コマンドは必ず行頭にタブ文字 (ASCII コードで 9番の文字。 スペースではダメ) を入れなければならない。
    ターゲット名: 依存ファイル名1 依存ファイル名2 依存ファイル名3 # 依存関係
    	コマンド行1                                           # 生成コマンド1
    	コマンド行2                                           # 生成コマンド2
  • 依存ファイルの更新をチェックしてからターゲットについて検討する
  • 更新されていればコマンド行を利用して更新する
  • コマンド行はそれぞれ別のシェルで実行される

メモ

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

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

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

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

サフィックスルール

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

Makefile/自動変数

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

GNU Make/暗黙のルール

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.

参考