2

私はMakefileを持っています:

#Build Configurations
CONFIGS = Debug Release Profile

#Config flags
Debug_Flags=dasd
Release_Flags=

.SECONDEXPANSION:

#Debug_safety_check Release_safety_check Profile_safety_check targets
$(addsuffix _safety_check,$(CONFIGS)):
#Check existence of variable
ifeq '$(origin $(subst safety_check,FLAGS,$@))' 'undefined'
    $(error $(subst safety_check,FLAGS,$@) variable undefined)
endif 

#How to make our configurations (do corresponding safety_checks)
$(CONFIGS): $$@_safety_check

この行は正しくありません:

ifeq '$(origin $(subst safety_check,FLAGS,$@))' 'undefined'

対応する安全チェックを呼び出すときに$@拡張が発生するためだと思います。しかし、ifeq展開は「すぐに」発生するため、実際には、次のような行が得られます。

ifeq '$(origin ' ') 'undefined'

リストから変数定義をチェックする方法はありますか?

4

1 に答える 1

1

うーん、落とし穴。

#Build Configurations
CONFIGS = Debug Release Profile

#Config flags
Debug_Flags=dasd
Release_Flags=
#Profile_Flags=

#Adds _flags suffix for each variable, 
#get it's origin ('undefined' for undefined variables).
#If $(findstring) a lookup for the word 'undefined' succeeds, 
#adds to the result variable
undef_flags = $(foreach c, $(CONFIGS), \
                $(if $(findstring undefined, $(origin $c_Flags)), $c))

#Count words for undefined configs, must be not '0'
ifneq ($(words $(undef_flags)),0)
#strip because if flag is undefined we'll get the trash spaces
$(error Flags ($(strip $(undef_flags))) must be defined)
endif
于 2012-10-17T15:45:26.830 に答える