2014-09-17 1 views
1

내가 조건부 컴파일메이크의 문은 제대로하지만 제대로 평가

ifeq ($<,bar) @echo dfjhsdfhdfklhsdfhj endif

내 메이크 파일에서 다음 문 에코가 실행되지 및 제대로 작동하지 않는 것처럼 나타난 적이 읽으면 그래서 if 문의 값을 되풀이하여 ifeq (bar,bar)을 얻었으므로 if 문에 올바른 명령문을 넣을 수는 있지만 결코 true 및 always false로 평가되지 않습니다. 왜 이런 일이 일어나는 걸까요? RHEL 6.5 GNU make 사용

답변

2

목표 규칙 내에서 사용하고 있다고 가정합니까? 그리고 규칙의 한 줄에 echo ifeq ($<,bar)과 같은 값을 표시 했습니까?

이들은 동일한 컨텍스트 (또는 동시에)로 평가되지 않습니다.

메이크 레벨 ifeq은 make 구문 분석시 평가됩니다 (따라서 $<에는 값 없음).

에코 셸 줄의 확장 (변수 변경을 위해)은 대상 처리 시간 a (따라서 $<에 값이 있음)에서 계산됩니다.

대신 @$(if $(filter-out bar,$<),:,echo dfjhsdfhdfklhsdfhj)을 사용해보세요.

$(filter-out)은 두 번째 인수에서 첫 번째 인수와 일치하는 단어를 제거합니다 (여기에도 패턴을 허용 함).

$(if) 첫 번째 인수가 비어 있지 않은 문자열로 평가되면 성공합니다.

그래서 우선 $(filter-out)$<에서 bar하고이 비어 있지 않은 문자열로 우리를 떠나면 다음 $(if)이 케이스 : (이하 "다만 대가로, 두 번째 인자를 평가 (단지 bar보다 $< 더 거기에 의미) true "쉘 명령). 빈 문자열을 얻은 경우 $<bar이고 $(if)은 세 번째 인수 (이 경우 echo)를 계산합니다.

+0

똑같은 질문에 대해 대답하려고합니다. make가 다른 순서로 평가를한다는 점을 잊어서 평가할 때 make가 동등하지 않습니다. – jgr208

+0

if에 else를 어떻게 추가하나요? – jgr208

+1

그건 이미 다른. 'echo'는 else입니다. ':'는'if' /'true' 블록입니다. 대답에 대한 설명을 추가하겠습니다. –