FreeBSD make(bmake)とmacOS make(GNU Make 3.81)と連携するために、makefileでシェル配布をどのように使用しますか?

FreeBSD make(bmake)とmacOS make(GNU Make 3.81)と連携するために、makefileでシェル配布をどのように使用しますか?

!=FreeBSD、macOS、Linuxで実行されるmakefileでシェル割り当て演算子(たとえば)を使用したいと思います。例は次のとおりです。

a!= seq 3

.PHONY: all
all: $a

.PHONY: $a
$a:
    @echo $@

予想される結果は次のとおりです。

$ touch 1 2 3
$ make all
1
2
3

残念ながら、macOS Monterey 12.6.1に付属のGNU Makeはシェル割り当て演算子をサポートしておらず、この例の出力は空です。これは、最近のLinuxディストリビューションに触れる可能性がある最新バージョンのGNU Make(4.4など)で実行されます。

このmakefileがすべてのバージョンのGNU makeとbmakeで動作するようにするにはどうすればよいですか?

答え1

$(shell ...)解決策は、次のようにシェル割り当て演算子でこの構成を使用することです。

a= $(shell seq 3)
a!= seq 3

.PHONY: all
all: $a

.PHONY: $a
$a:
    @echo $@

GNU Make 3.81はシェル割り当てをスキップするように見えるため、最初の割り当ての出力を使用します。しかし、bmakeは最初の割り当てについて実際に気にしません。なぜなら、2番目の割り当てがとにかく上書きされるからです。

関連情報