web-dev-qa-db-ja.com

2つのシェル変数の状態が特定の状態である場合にメイクファイルを終了する

したがって、特定のターゲット用にクロスコンパイルする場合は、シェル変数が設定されていることを確認する必要があります。変数が設定されていない場合、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を使用してこれを行うことができることはわかっていますが、きれいにしたいと思います(そして、メイクファイルについてもう少し学びます)。

13
MakeDummy

$(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を停止できるため、最初のオプションを引き続き使用します。

15
Jack Kelly

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.
3
bobbogo