2014-12-05 2 views
4

나는 make 파일에 정의 된 목록을 가지고 있으며 사용자는이 목록에서 찾을 필요가있는 환경 변수를 설정해야합니다. gnu를 사용하여이 작업을 수행하는 방법이 있습니까? make가 어떤 타겟을 만들기 시작하기 전에, 어떤 레시피가 아니더라도 이것을하고 싶습니다. 사용자가 환경을 설정하는지 확인하는 것은 품질 보증 검사입니다. 변수를 범위/목록 내의 값으로 변경하십시오. 터미널에GNU-make는 목록/배열에 요소가 있는지 확인합니다.

:

setenv ENV_PARAM x 

메이크에서 : 매드 사이언티스트의 응답 작품 @

PARAMS := a b c 

if ${ENV_PARAM} exists in $(PARAMS) 
    true 
else 
    false 
endif 

. 여러 매개 변수를 테스트하기 위해 foreach 루프를 사용하여 if 블록을 래핑하는 방법이 있습니까?

KEYS := PARAMS FACTORS 
PARAMS := a b c 
FACTORS := x y z 

foreach v in ($(KEYS)) { 
    ifneq ($(filter $(ENV_$(v)),$(v)),) 
    $(info $(ENV_$(v)) exists in $(v)) 
    else 
    $(info $(ENV_$(v)) does not exist in $(v)) 
    endif 
} 
+0

당신이주는 예제는 충분히 명확하지 않습니다. 그러한 테스트가 사용될 수있는 두 가지 다른 장소가 있습니다. 타겟을 만들기 위해 레시피에서 테스트를하고 싶거나 make가 레시피 밖에서 테스트를하고 싶을 수도 있습니다. 이 두 구문에 대한 구문은 매우 다르기 때문에 수행하려는 대상에 대한 자세한 정보를 제공해야합니다. – MadScientist

+0

방금 ​​내 질문을 편집했습니다. – Wilderness

답변

8

당신은이 작업을 수행 할 filter 기능을 사용할 수 있습니다 :

PARAMS := a b c 

ifneq ($(filter $(ENV_PARAM),$(PARAMS)),) 
    $(info $(ENV_PARAM) exists in $(PARAMS)) 
else 
    $(info $(ENV_PARAM) does not exist in $(PARAMS)) 
endif 

읽기 : "PARAMS의 ENV_PARAM 값에 대한 검색 결과가 비어 있지 않은 경우에는 '사실'블록 다른 실행을 실행 '거짓 블록'.

UPDATE는

두 번째 질문은 정말 당신이 제공 한 정보를 완벽하게 대답 할 수 없습니다. 그것을 수행하는 가장 좋은 방법을 알기 위해서 우리는 여러분이 if 문 안에서 실제로 무엇을 할 것인지, 조건이 참일 때 그리고 거짓 일 때 무엇을 할 것인지를 알아야합니다. 더 많은 변수를 선언 하시겠습니까? 몇 가지 규칙을 만드시겠습니까? 다른 것? 당신이 원하는 것을 할 수있는 많은 방법들이 있으며 당신이하고 싶은 것에 따라 가장 깨끗한 것이 다를 수 있습니다.

KEYS := PARAMS FACTORS 
PARAMS := a b c 
FACTORS := x y z 

define LOOPBODY 
    ifneq ($$(filter $$(ENV_$(v)),$(v)),) 
    $$(info $$(ENV_$(v)) exists in $(v)) 
    else 
    $$(info $$(ENV_$(v)) does not exist in $(v)) 
    endif 
endef 

$(foreach v,$(KEYS),$(eval $(LOOPBODY))) 

당신은에 대해 내가 만든 게시물의 집합에 관심이있을 수 있습니다

그러나, 일반적인 솔루션은 foreacheval, 이런 식으로 뭔가를 사용하여 다음 루프의 콘텐츠를 만들 define를 사용하여 포함 할 것 GNU make에서 metaprogramming : http://make.mad-scientist.net/category/metaprogramming/

+0

좋아요! 고맙습니다. – Wilderness

+0

한 단계 더 나아가, foreach 블록 안에이 ifneq 블록을 래핑하는 방법이 있습니까? 여러 매개 변수에 대한 테스트를하고 싶습니다. 나는 많은 검색을했으나 유사한 사용법을 보여주는 예제를 찾을 수 없었다. 나는 내 질문을 내가 원하는대로 업데이트했다. – Wilderness

+0

많은 매개 변수 중 하나가 존재하는지 테스트 하시겠습니까? 'filter'의 첫 번째 인수에 여러 단어를 붙일 수 있으며 일치하는 단어를 반환합니다. $ (filter $ (P1) $ (P2) $ (P3), $ (PARAMS))' – MadScientist