私のMakefileは、構成ファイルまたは変数で定義された複数の変数に基づいていますENV
。私の現在の解決策は、それらすべてを手動でテストすることです。
NOGOAL = help clean distclean mrproper
ifeq ($(strip $(filter $(NOGOAL), $(MAKECMDGOALS))),)
VAR1 ?= $(error VAR1 undefined)
VAR2 ?= $(error VAR2 undefined)
VAR3 ?= $(error VAR3 undefined)
...
VARn ?= $(error VARn undefined)
endif
foreach
代わりにループを使用したいと思います:
ifeq ($(strip $(filter $(NOGOAL), $(MAKECMDGOALS))),)
TESTVAR = TEST1 TEST2 TEST3
$(foreach v, $(TESTVAR), $(eval $v ?= $$(warning Error: $v undefined)))
endif
残念ながら、eval
期待どおりに動作しません。私は何か見落としてますか?
ここに、テストの2つの実装を含む私のテストの完全なテストがあります。場合でもTEST3
、私はすべてのエラーを取得しない定義されていません。
TEST1 = 1
TEST2 = 1
#TEST3 = 1 # NOT DEFINED
TESTVAR := TEST1 TEST2 TEST3
# First implementation
$(foreach v, $(TESTVAR), $(eval $v ?= $$(warning Error: $v undefined)))
# Second implementation
$(foreach v, $(TESTVAR), $(eval $(call TESTER,$v)))
define TESTER
ifndef $1
$(warning $1 not defined)
endif
endef
# Dummy rule
all:
@echo Hello World
ただし、$(TEST3)
どこかで使用すると、最初の実装は機能します。
編集
ここではエラーは発生しませんが、TEST3は定義されていません。
~$ cat Makefile
TEST1 = 1
TEST2 = 1
#TEST3 = 1 # NOT DEFINED
TESTVAR := TEST1 TEST2 TEST3
# First implementation
$(foreach v, $(TESTVAR), $(eval $v ?= $$(warning Error: $v undefined)))
# Dummy rule
all:
@echo Hello World
~$ make
Hello World
まあ、私はそれを取得していないと思います。元のバージョンは、希望どおりに機能すると言っていますが、定義されていない変数の1つを使用しない限り、警告は出力されません。の最初の選択肢foreach
は同じように機能します。警告を出力しますが、未定義の変数を使用した場合に限ります。
あなたがそのようにしたい場合は、をテストclean
します(すべてのエラーを取得することはできませんので、おそらくそれらのルールが定義されていない変数を使用しませんので、本当に多くの意味がないなど、彼らは場合でした変数を使用しますそれは定義されていませんでした、おそらくあなたはそれらのルールも失敗させたいでしょう)。
しかし、2番目の編集では、変数が使用されているかどうかに関係なく、変数が定義されていない場合、makeをすぐに失敗させたいと言います(最後の例では定義しTEST3
ていませんがTEST3
、警告が出力されないように)。それが必要な場合は、変数に値を割り当てている理由?=
、またはを使用している理由がわかりませんeval
。次のように書いてください。
ifeq ($(strip $(filter $(NOGOAL), $(MAKECMDGOALS))),)
$(foreach v,$(TESTVAR),$(if $($v),,$(error Error: $v undefined))
endif
(このバージョンではないチェックする必要がありMAKECMDGOALS
、それが未設定の変数にすぐに失敗しているため)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加