Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

参考

shakiyam
日本オラクルでExadata関連のプリセールスを担当。
https://shakiyam.hatenablog.com/
oracle
Oracle Cloudは、最先端の機能をSoftware as a Service、Platform as a ServiceおよびInfrastructure as a ServiceおよびData as a Serviceとして提供します。
https://cloud.oracle.com/ja_JP/home
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