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 += --warn-undefined-variables
SHELL := /bin/bash
.SHELLFLAGS := -eu -o pipefail -c
.DEFAULT_GOAL := help
# all targets are phony
.PHONY: $(shell egrep -o ^[a-zA-Z_-]+: $(MAKEFILE_LIST) | sed 's/://')
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 task B)
@echo 'Starting $@'
sleep 1
@echo 'Finished $@'
help: ## Print this help
@echo 'Usage: make [target]'
@echo ''
@echo 'Targets:'
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
使いやすくするために、各ターゲット名の後ろに##を付けてコメントを記載し、helpターゲットでヘルプを表示するようにしています。
$ make
Usage: make [target]
Targets:
taskA executes task A
taskB executes task B
taskC executes task C (depends task B)
help Print this help