2010-08-09 5 views
7

의 계산 : 그것은 꽤 흔한 일처럼 보인다수행보다 큰 덜보다 내가 메이크 파일에서이 작업을 수행하기 위해 노력하고있어 메이크

value = 2.0 

if ${greaterthan ${value}, 1.50} 
-> execute a rule 
elseif ${lessthan ${value}, 0.50} 
-> execute a rule 
endif 

수행 할 수 있습니다. 이 일을하는 가장 좋은 방법은 무엇입니까?

+0

* [Makefile의 문자열 비교보다 큼] (http://stackoverflow.com/questions/3437160/greater-than-string-comparison-in-a-makefile) *. –

답변

8

this question과 비슷하지만 기본적으로 Makefile 내부에서 쉘 명령을 사용할 수 있습니다. 그래서 다음은 완벽하게 합법적이다 : 작은 면책 조항에 대한

foo: 
    if [ ${value} -gt 2 ] ; then \ 
     #Do stuff;\ 
    fi 

편집 : IIRC는 bash는 부동 소수점 연산을 이해하지 못합니다. 그것들을 문자열 인으로 해석 할 수 있지만 약간 이상하게 보일 수 있습니다. 이를 고려해야합니다.

+0

Windows에서 작동합니까? 그리고/또는 [MinGW] (http://en.wikipedia.org/wiki/MinGW)에서? –

+0

그래서 Linux/Unix 구문이 makefile에서 작동합니까? –

11

VER이 작업을 수행하기 위해보다 큰 4

ifeq ($(shell test $(VER) -gt 4; echo $$?),0) 
    IFLAGS += -I$(TOPDIR)/include 
    LIBS += -L$(TOPDIR)/libs -lpcap 
endif 
+0

여기에 무엇을 암시합니까? [Bash] (http://en.wikipedia.org/wiki/Bash_%28Unix_shell%29)? Linux (및 [Mac OS X] (http://en.wikipedia.org/wiki/Mac_OS_X))에서만 작동합니까? –

0

내 선호하는 방법을 선택되어이 예에서는이

을 시도하는 것입니다 :

value = 2.0 
ifeq ($(shell expr $(value) \>= 1.5), 1) 
    # execute a rule 
else ifeq ($(shell expr $(value) \<= 0.5), 1) 
    # execute a rule 
endif 
0

쉘 명령을 사용하여에 언급 한 바와 같이 대부분의 사용 사례에 대해 다른 답변으로 충분해야합니다.

if [ 1 -gt 0 ]; then \ 
    #do something \ 
fi 
당신이 나처럼, 하기 위해 보다 큰 비교를 사용하려면 0

그러나, 다음make$(eval) 명령을 통해 make 변수를 설정, 당신은 시도하기 때문에을 사용하여이 작업을 수행하는 것을 발견 할 것이다 다른 대답은 모델 :

if [ 1 -gt 0 ]; then fi; 
/bin/bash: -c: line 0: syntax error near unexpected token `fi' 
/bin/bash: -c: line 0: `if [ 1 -gt 0 ]; then fi;' 
make: *** [clean] Error 2``` 

이유는을한다는 것입니다 :

if [ 1 -gt 0 ]; then \ 
    $(eval FOO := value) \ 
fi 

는 오류를 발생시킵니다210 결과 bash 코드의 형식이 잘못되었습니다. **

(여러 가지 방법을 시도한 후에!) 다음 해결책을 찾았습니다.

$(if $(shell [ $(FOO) -ge 1 ] && echo "OK"), \ 
    $(eval BAR := true), \ 
    $(eval BAR := false)) 

이합니다 (echo "OK" 일부) 산술적 비교를 수행 한 문자열을 출력 할 필요가 있기 때문에 make$(if) 연산자의 빈 문자열 논리에 기초 :

$(if condition,then-part[,else-part])

The if function provides support for conditional expansion in a functional context (as opposed to the GNU make makefile conditionals such as ifeq (see Syntax of Conditionals).

The first argument, condition, first has all preceding and trailing whitespace stripped, then is expanded. If it expands to any non-empty string, then the condition is considered to be true. If it expands to an empty string, the condition is considered to be false.

자료 : GNU Make Manual

희망이 도움이됩니다.

** 는 :

if [ $(VALUE) -ge 1 ]; then \ 
    true; $(eval BAR := GreaterOrEqualThan1) \ 
else \ 
    true; $(eval BAR := LowerThan1) \ 
fi 

밝혀졌다 : 처음에, 그 문제는 쉽게 표현 아무것도하지 않는 bash는 명령과 같은 true 등을 추가하여 해결 될 수 있다고 생각 끔찍한 생각이다.나는 여전히 이유를 알아 내지 못했지만, 비교 결과와 독립적으로 else 분기가 항상 실행됩니다.

이 경우에는 질문을해야한다고 생각합니다.