したがって、特定のターゲット用にクロスコンパイルする場合は、シェル変数が設定されていることを確認する必要があります。変数が設定されていない場合、makeはメッセージを表示して終了する必要があります。
Makefileには次のルールがあります。
.PHONY: checksource
all: checksource default
checksource:
$(if $(and $(ifeq ($(CROSS_COMPILE), whatever)), $(ifeq ($(VARIABLE),))), \
($(Shell echo "Error! VARIABLE not defined!") \
$(Shell exit 2)))
$CROSS_COMPILE
は何にでも設定されます:
$> echo $CROSS_COMPILE
whatever
$>
$ VARIABLEが定義されていません。
$> echo $VARIABLE
$>
Makeを終了せず、デフォルトのターゲットが作成されます。ネストされたifeq
を使用してこれを行うことができることはわかっていますが、きれいにしたいと思います(そして、メイクファイルについてもう少し学びます)。
$(ifeq)
のようなものはありません。ターゲットの1つとしてではなく、メイクファイル自体でチェックを行う必要があると思います。
ifeq ($(CROSS_COMPILE),whatever)
ifeq ($(VARIABLE),)
$(error Variables not set correctly.)
endif
endif
また、ネストされたifeq
を回避するように設定されている場合:
ifeq ($(or $(subst whatever,,$(CROSS_COMPILE)),$(VARIABLE)),)
$(error Variables not set correctly.)
endif
しかし、それがどのように改善されているのかわかりません。ターゲットでそれを実行したい場合は、シェルを使用するだけで、make関数を気にしないでください。
checksource:
@if [ "$(CROSS_COMPILE)" = whatever -a -z "$(VARIABLE)" ]; then \
echo "Error: Variables not set correctly"; exit 2; \
else true; fi
stat
のすべてのファイル名がMakefile
になり、checksource
の実行を開始する前に、makeを停止できるため、最初のオプションを引き続き使用します。
Makeでそれを行うことは、シェルを使用するよりも常に優れています($(Shell)
またはレシピを介して)。レシピでチェックインを行う場合、Makefileにこの特定のアサーションを必要としない他のターゲットを含めることができることを意味します。
assert = $(if $(filter whatever,${CROSS_COMPILE}),$(if ${VARIABLE},,$(error Urk! Variable problem)))
checksource:
${assert}some Shell commands...
P.S. --warn-undefined-variables
を使用して元のメイクを実行した場合、マクロが適切に展開されなかった理由がいくつかわかります。
$ make -f 1.mak CROSS_COMPILE=whatever --warn-undefined-variables
1.mak:6: warning: undefined variable `ifeq (whatever, whatever)'
make: *** No rule to make target `default', needed by `all'. Stop.