2012-02-13 2 views
0

종속성이있는 Makefile을 설정하려고합니다. 종속성은 변수에 지정됩니다.Makefile Linux 각 변수에 대해 함수를 실행하는 방법

MATH_VER=1.1 
EXTERNAL_DEPS=MATH GC LOG 

사용할 수있는 것을 기반으로 각 외부 라이브러리의 위치를 ​​파악하려고하는 함수를 실행하고 싶습니다. 하지만 난 그게 임 찾고 무엇의 좋은 아이디어를 제공합니다 생각 - 그래서 나는 내가 확인

checklib = ifeq ($(wildcard $(ROOT)/$(var)/$(var)_VER),) 
echo 'Bad dir' 
$(var)_ROOT=$SOMEOTHERDIR 
else 
echo 'Good dir' 
$(var)_ROOR=$(ROOT)/$(var)/$(var)_VER 
endif 

이 dosent 작업을 수행하는 기능이 규칙하려면 setVersion,

all:setversion myexe 
setversion: 
    $(foreach CHKLIB, $(EXTERNAL_DEPS), $(call checklib, $(CHKLIB))) 

을 추가했다. 아무도 나를이 방법을 수행 할 수 가리킬 수 있습니까? 이 site 도움이 될 감사

+0

조만간 당신이 autotools를 필요거야, 왜 지금 학습을 시작하지 : http://sourceware.org/autobook/autobook/autobook_toc.html – yasar

+0

당신이 외부 변수를'whatever_ROOT' 사용 하시겠습니까 'setversion' 규칙? – Beta

+0

예 exec를 빌드 할 때 MATH_ROOT가 사용됩니다. – excalibur

답변

0

:

참고 예에서 foreach는 호출의 결과가 저장되어있는 foreach 루프에서 각 함수를 호출하지 부작용 무엇이다.

2

편집 : 내 시스템에서이를 테스트했으며 필요한 것을 수행 한 것으로 보입니다.

define set_deps 
     ifeq ($(wildcard $(ROOT)/$(1)/$($(1)_VER)/),) 
       $(1)_ROOT=$(DEFAULT_DIR) 
     else 
       $(1)_ROOT=$(ROOT)/$(1)/$($(1)_VER)/ 
     endif 
endef 


$(foreach lib, $(EXTERNAL_DEPS), $(eval $(call set_deps,$(lib)))) 

$(foreach lib, $(EXTERNAL_DEPS), $(eval $(info $(lib) => $($(lib)_ROOT)))) 

documentation for the eval function을 확인하십시오.

또한 가능한 디렉토리 목록과 일치 시키려면 다음을 사용할 수 있습니다.

define set_deps 
    $(1)_ROOT = $(firstword $(wildcard $(ROOT)/$(1)/$($(1)_VER)/) $(DEFAULT_DIR)) 
endef 
+0

감사합니다. 그것은 작동합니다. 그러나 이것을 "setversion"에 대한 명령 섹션에 추가하거나 명령에 도달하기 전에 추가하십시오. 전에 이것을 추가하고 작동하지만 조건부 종료 또는 인쇄를 시도하고 항상 인쇄하는 것처럼 보입니다. 예 : else 섹션에 $ (info WARN Missing dir)을 추가했으나 조건에 관계없이 항상 인쇄합니다. 나는 "exit"를 추가했고, 결코 exit0x384 대신에 – excalibur

+0

을 사용했다. 또한, 나는 조건에 관계없이 $ (info) 인쇄로 인해 더 이상한 일이 발생한다고 생각한다. 만약 $ (1) _ROOT = $ (와일드 카드 $ (ROOT)/$ 1)/$ ($ (1) _VER) /, $ (ROOT)/$ (1) _VER)/$ (info hello), $ (DEFAULT_DIR) $ 현재 구문을 사용하는 대신 하나의 분기 만 평가된다는 것을 알 수 있습니다. 내 생각 엔 조건부 make가 두 가지를 해석하거나 버그를 발견했습니다. –

+0

나는 더 이상의 질문이 돌아 오지 않는 이상한, 어두운 부분으로 인도 할 것이라고 경고해야한다. 극도의주의를 기울여 진행하십시오. –