Makeはタスク・ランナーとして使うことができます。
通常はMakefileに記述するルールのターゲットはファイルですが、本当のファイルではないPhonyターゲット(偽ターゲット)のルールを作成することができます。
Makefile
.PHONY: taskA taskB taskC
taskA:
@echo 'Starting $@'
sleep 1
@echo 'Finished $@'
taskB:
@echo 'Starting $@'
sleep 1
@echo 'Finished $@'
taskC: taskB
@echo 'Starting $@'
sleep 1
@echo 'Finished $@'
引数として指定したタスクを実行します。
$ make taskA
Starting taskA
sleep 1
Finished taskA
複数のタスクを指定すると、順次実行します。
$ make taskA taskB
Starting taskA
sleep 1
Finished taskA
Starting taskB
sleep 1
Finished taskB
-jオプションを使うと、タスクを同時に実行します。
$ make -j taskA taskB
Starting taskA
sleep 1
Starting taskB
sleep 1
Finished taskA
Finished taskB
タスクの依存関係を判断して実行します。
$ make taskC
Starting taskB
sleep 1
Finished taskB
Starting taskC
sleep 1
Finished taskC
最後に、私が使っているMakefileのテンプレートを紹介します。
Makefile
MAKEFLAGS += --no-builtin-rules
MAKEFLAGS += --warn-undefined-variables
SHELL := /bin/bash
.SHELLFLAGS := -eu -o pipefail -c
ALL_TARGETS := $(shell grep -E -o ^[0-9A-Za-z_-]+: $(MAKEFILE_LIST) | sed 's/://')
.PHONY: $(ALL_TARGETS)
.DEFAULT_GOAL := help
help: ## prints this message
@echo 'Usage: make [target]'
@echo ''
@echo 'Targets:'
@awk 'BEGIN {FS = ":.*?## "} /^[0-9A-Za-z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
taskA: ## executes task A
@echo 'Starting $@'
sleep 1
@echo 'Finished $@'
taskB: ## executes task B
@echo 'Starting $@'
sleep 1
@echo 'Finished $@'
taskC: taskB ## executes task C (depends on task B)
@echo 'Starting $@'
sleep 1
@echo 'Finished $@'
使いやすくするために、各ターゲット名の後ろに##を付けてコメントを記載し、helpターゲットでヘルプを表示するようにしています。
$ make
Usage: make [target]
Targets:
help prints this messages
taskA executes task A
taskB executes task B
taskC executes task C (depends on task B)