developer tip

Makefile ifeq 논리적 또는

optionbox 2020. 9. 22. 08:03
반응형

Makefile ifeq 논리적 또는


make ifeq연산자를 사용하여 논리 OR을 어떻게 수행 합니까?

예를 들어, (간체) :

ifeq ($(GCC_MINOR), 4)
    CFLAGS += -fno-strict-overflow
endif
ifeq ($(GCC_MINOR), 5)
    CFLAGS += -fno-strict-overflow
endif

그러나 이러한 라인을 통합하고 싶습니다.

(예, 예, autotools, 구성 등; 현재 상황에 비해 너무 무거워서 여기에서 Makefile 내의 모든 것을 유지하고 싶습니다)

[이 질문의 논리적 반대 : 'ifeq'문에서 다중 조건을 사용하는 방법 ]


메일 링리스트 아카이브에서 볼 수 있듯이

필터 기능을 사용할 수 있습니다 .

예를 들면

 ifeq ($(GCC_MINOR),$(filter $(GCC_MINOR),4 5))

필터 X, ABX와 동일한 A, B의 항목을 반환합니다.

이것의 변형은

 ifneq (,$(filter $(GCC_MINOR),4 5))

대신 빈 문자열에 대한 음의 비교가 사용됩니다 ( GCC_MINOR이 인수와 일치하지 않으면 필터 는 빈 문자열을 반환합니다).

이러한 메서드의 단점은 인수가 단일 단어 여야한다는 것입니다.


다른 변수를 도입 할 수 있습니다. 두 수표를 모두 통합하지는 않지만 적어도 본문을 두 번 넣을 필요가 없습니다.

do_it = 
ifeq ($(GCC_MINOR), 4)
    do_it = yes
endif
ifeq ($(GCC_MINOR), 5)
    do_it = yes
endif
ifdef do_it
    CFLAGS += -fno-strict-overflow
endif

간결하고 현명한 방법이 있다고 생각하지 않지만 장황하고 현명한 방법 (예 : Foo Bah 's)과 간결하고 병리적인 방법이 있습니다.

ifneq (,$(findstring $(GCC_MINOR),4-5))
    CFLAGS += -fno-strict-overflow
endif

(문자열 $ (GCC_MINOR)이 문자열 4-5 안에 나타나면 명령을 실행합니다).


더 유연한 변형 : 외부 셸을 사용하지만 임의의 조건을 확인할 수 있습니다.

ifeq ($(shell test ".$(GCC_MINOR)" = .4  -o  \
                   ".$(GCC_MINOR)" = .5  -o  \
                   ".$(TODAY)"     = .Friday  &&  printf "true"), true)
    CFLAGS += -fno-strict-overflow
endif

ifeq ($(GCC_MINOR), 4)
    CFLAGS += -fno-strict-overflow
endif
ifeq ($(GCC_MINOR), 5)
    CFLAGS += -fno-strict-overflow
endif

이 경우 사용할 수있는 또 다른 방법은 다음과 같습니다.

GCC42_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -c "^gcc version (4.[2-9]|[5-9])")

# -Wstrict-overflow: http://www.airs.com/blog/archives/120
ifeq ($(GCC42_OR_LATER),1)
  CFLAGS += -Wstrict-overflow
endif

I actually use the same in my code because I don't want to maintain a separate config or Configure.

But you have to use a portable, non-anemic make, like GNU make (gmake), and not Posix's make.

And it does not address the issue of logical AND and OR.

참고URL : https://stackoverflow.com/questions/7656425/makefile-ifeq-logical-or

반응형