1. ホーム
  2. バッシュ

[解決済み】MakefileのターゲットでBash構文を使用するにはどうすればいいですか?

2022-04-02 20:36:49

質問

私はよく バッシュ のような処理置換は、非常に便利です。 diff <(sort file1) <(sort file2) .

このようなBashコマンドをMakefileで使用することは可能でしょうか?こんなのを考えているのですが。

file-differences:
    diff <(sort file1) <(sort file2) > $@

私のGNU Make 3.80では、これはエラーになります。 shell の代わりに bash でコマンドを実行します。

解決方法は?

GNU Makeのドキュメントより。

5.3.1 Choosing the Shell
------------------------

The program used as the shell is taken from the variable `SHELL'.  If
this variable is not set in your makefile, the program `/bin/sh' is
used as the shell.

ということで SHELL := /bin/bash をmakefileの先頭に書けばOKです。

ちなみに、少なくともGNU Makeでは、1つのターゲットに対してこれを行うこともできます。各ターゲットは、このように独自の変数割り当てを持つことができます。

all: a b

a:
    @echo "a is $$0"

b: SHELL:=/bin/bash   # HERE: this is setting the shell for b only
b:
    @echo "b is $$0"

これで印刷されるよ。

a is /bin/sh
b is /bin/bash

詳しくは、ドキュメントの "ターゲット固有の変数値" をご覧ください。この行は Makefile のどこに書いてもよく、ターゲットの直前である必要はありません。