GNU make

Getting Started

公式リファレンスは↑

サードパーティーのリファレンス的資料:

Quickstart

使えるMakefileの例

.PHONY: default build clean

default: build

clean:
  rm -rf dist/

timestamp:
  date +%s > timestamp

build: timestamp another-file
  some_build_command

Tips:

  • ターゲットの依存ターゲットは複数記すことができる。

参考:

Makefile 構文

変数

変数定義のやり方について。

“=” と “:=” は違う。

src = foo.c
ymd := $(shell date +%Y%m%d)

参考:

$(CURDIR)

makeを実行しているプロセスのカレントディレクトリを返す。

参考:

関数

$(foreach name, LIST, command)

ループ実行

.PHONYターゲット

https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html

ファイルを生成しないやつ

.PHONY: clean

clean:
    rm *.o tmp

複数の.PHONYターゲットをまとめて記述することもできる

.PHONY: all clean deps

条件分岐

7 Conditional Parts of Makefiles

Example:

libs_for_gcc = -lgnu
normal_libs =

foo: $(objects)
ifeq ($(CC),gcc)
        $(CC) -o foo $(objects) $(libs_for_gcc)
else
        $(CC) -o foo $(objects) $(normal_libs)
endif

$ のエスケープ

シェルの文脈で $ を使いたいときは $$ と記すことで実現できる。

Examples:

time:
	now=$$(date); echo $$now

参考:

makeコマンド

公式マニュアル:

SYNOPSIS:

# デフォルトのタスク(=最上部で定義されたタスク)を実行
make

# タスク名を指定して実行。複数指定可
make task1 [task2 ...]

# Makefileを指定する
make -f|--file <Makefile>

# dry-run
make -n|--dry-run

# 変数の設定
#  Makefile内で定義されていれば、オーバーライドする
make CFLAGS=-g

その他のオプション:

オプション意味
-j|--jobs[=N]同時実行数を指定。See 5.4 Parallel Execution
-e|--environment-overrides環境変数をオーバーライドする
-dデバッグ情報を表示。 --debug=a と同じ
--trace実行時のトレース情報を表示する
-s|--silent|--quiet実行されるタスクをプリントしない
-h|--helpヘルプ表示
-v|--versionバージョン表示

Tips

必要なディレクトリを作ってタスク実行

BUILD_DIR := path/to/build

$(BUILD_DIR):
    mkdir -p $(BUILD_DIR)

all: $(BUILD_DIR)
    cd $(BUILD_DIR) && some_commands

.PHONY: all

環境変数の取扱い

環境変数はMakeの変数として参照できる。例: $(CFLAGS)

参考:

How-to

コマンドに引数を渡したい

make CFAGS=-g みたいに変数経由で渡すことになりそう。

参考:

Cookbooks

カレントディレクトリを表示する幾つかの方法

pwd:
    pwd
    echo $(shell pwd)
    echo $(PWD)
    echo $$PWD
    echo $(CURDIR)

実行例:

$ make
pwd
/home/progrhyme/tmp/make
echo /home/progrhyme/tmp/make
/home/progrhyme/tmp/make
echo /home/progrhyme/tmp/make
/home/progrhyme/tmp/make
echo $PWD
/home/progrhyme/tmp/make
echo /home/progrhyme/tmp/make
/home/progrhyme/tmp/make

参考