【Make】Makefileの基本

目次

Makefileの基本

コメント

  • #から行末までがコメントになります
    1
    # aaaa

改行

  • 1行で1処理を記述する必要があります。もし長めの記述をする必要がある場合は\(バックスラッシュ)をつけることで改行を挟むことで1行として認識されます。

main.cppsub.cppをコンパイルして、実行ファイルをmainにする処理を改行して見やすいように記述してコンパイルする場合、以下のようになります。

1
2
3
4
main:
cc -o main \
main.cpp \
sub.cpp

注意

コメントアウトを\を使っている途中に記述すると処理として正常に認識してくれません

1
2
3
4
main:
cc -o main \
# main.cpp \
sub.cpp

基本記法

  • ターゲット : 一連の処理の名前、そのターゲットが作成するファイル名や行う処理の総称を記述することが多い

  • 処理 : 処理を記述する場合、1行ごとにタブを先頭に入れる必要があります。makefileはタブのあとに続く記述を処理として認識する仕様になっています。

    • \をつけている場合はタブは必要ありません問題ありません
      1
      2
      ターゲット:
      ファイルを生成するためのコマンド
  • \をつけて処理を改行している場合、次の行の処理にタブつけてもつけなくても問題ありません。しかし、可読性の問題を考えると整形はしておいたほうがいいと思います。

    1
    2
    3
    4
    5
    README.md:
    echo これはテストの1行目です >> \
    README.md
    echo これはテストの2行目です >> \
    README.md

処理名など実在しないものをターゲット名にする場合

  • .PHONY: ターゲット名をコマンドの前に記述することでそのターゲット名は処理の名前で、そのターゲット名のファイルやディレクトリを作成するわけではないということを宣言できます。
  • このようなターゲットをタスクターゲットと呼びます。
  • タスクターゲットは.PHONYで宣言せずに作成することもできます。しかし、可読性が落ちる可能性があるので.PHONYで宣言してから作成したほうがいいと思います。

buildという仮想ターゲット名を持った処理を作成する場合

1
2
3
.PHONY: build
build:
処理

依存ターゲット

依存ターゲットとは、ターゲット: 依存ターゲットのようにターゲット:のあとに記述するターゲット(ファイル名)のことです。

通常、ターゲットに指定したファイルがない場合のみ、ターゲットが実行されます。すでにターゲット名のファイルがある場合、以下のような表示になります。

  • makefile
    1
    2
    3
    main: main.cpp
    cc -o main \
    main.cpp \
  • 実行結果
    1
    2
    $ make
    make: `ターゲット名ファイル' is up to date.

依存ターゲットにファイルを指定している場合、指定したファイルのタイムスタンプとターゲットファイルのタイムスタンプを比較して、ターゲットファイルのタイムスタンプが古い場合、再度コマンドが実行されます。

  • main.cppが更新されていれば処理が実行されます。
    1
    2
    3
    main: main.cpp
    cc -o main \
    main.cpp \
Author

Daiki Iijima

Posted on

2021-10-27

Updated on

2024-04-17

Licensed under