24
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Organization

タスク・ランナーとしてのMake

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

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
24
Help us understand the problem. What are the problem?