GNU Makefileに依存しないフォニーターゲットを作成するにはどうすればよいですか?GNU Makefileに依存しない偽のターゲットを作成するには?
要件:
- 特定のセットアップをチェックするルール - 以下の例よりも複雑であることができます。
- このルールが失敗すると、特定のターゲットの構築が失敗します。
- このルールが成功する場合、特定のターゲットの構築はソースが変更されている場合にのみ行う必要があります。そのルールも非特異的目標
ルールは、すべての特定のターゲットのコンパイルルールの前に挿入されている場合、これは達成可能であるために実行すべきではありませんので、
つまり、ソースが最新である場合、従属ターゲットを強制的に再構築するように偽のターゲットを指定するにはどうすればよいですか。
$ make --version | grep Make
GNU Make 3.82
$ make -f try.mk clean setup
rm -f try.out?
touch try.C#Dummy create source
$ make -f try.mk
touch try.out1 #Dummy compile
touch try.out2 #Dummy compile
touch try.out3 #Dummy compile
$ make -f try.mk
touch try.out3 #Dummy compile
try.out3はませは/上記の最後のmakeでコンパイルしてしまっているはずです。
$ cat try.mk
#try.mk
base=try
all: $(base).out1 $(base).out2 $(base).out3 #...
clean:
rm -f $(base).out?
setup:
touch $(base).C#Dummy create source
.PHONY: all clean platform_ok
#------------------------------------------------------------
#Specific targets
#------------------------------------------------------------
#Attempt 1: works, but platform check is a rule, and hence needs to be inserted wherever it is needed.
$(base).out1: $(base.c)
@if [ $(shell uname -i) == x86_64 ]; then exit 0; else exit 1; fi
touch $(base).out1 #Dummy compile
#Attempt 2: works, but platform check is global, which gets executed even when building Non-OS specific targets
$(eval platform_check:=$(shell (if [ $(shell uname -i) == x86_64 ]; then echo 0; else echo 1; fi)))
$(base).out2: $(base).c
@exit $(platform_check)
touch $(base).out2 #Dummy compile
#Attempt 3: works partially when platform check is a phony target, but target gets rebuilt even if source is uptodate.
$(base).out3: $(base).c platform_ok
touch $(base).out3 #Dummy compile
platform_ok:
@if [ $(shell uname -i) == x86_64 ]; then exit 0; else exit 1; fi
#------------------------------------------------------------
#Non-Specific targets
#------------------------------------------------------------
#...
おかげで、それはありません:それは依存関係グラフで発見された場合は常に、このルールを実行しますが、その通常の前提条件は、より最近であれば、それに応じて、ターゲットにのみ実行されます確認します第4の要件に対処しないでください(ルールは非特定のターゲットに対して実行すべきではありません)。あなたの答えでは、ARCHは常に計算されます。ちょうどfyi、私の実際の問題は、他の(非特定の)ターゲットに対して実行されるのを避けたい、より複雑なチェックをしています。 –