GNU make - 쉘 명령 결과(GCC 버전)를 기반으로 변수에 연결하는 방법은 무엇입니까?

GNU make - 쉘 명령 결과(GCC 버전)를 기반으로 변수에 연결하는 방법은 무엇입니까?

makefile의 "구성" 섹션에 있는 레시피 외부에서 실행하려는 쉘 명령의 결과에 따라 CFLAGS make 변수에 다른 옵션을 추가하고 싶습니다. 이것이 내가 생각해낸 것입니다:

GCC_VERSION := $(shell gcc -dumpversion); \
if [[ ${GCC_VERSION} > 5.0 ]] ; then \
    CFLAGS += -D _POSIX_C_SOURCE=199309L; \
fi

먼저 위와 같이 쉘 make 함수를 사용하여 명령을 실행합니다. 위 코드를 실행하면 이 정의 플래그가 추가되지 않습니다. 이 작업을 수행하기 위해 특별히 Linux에서 GCC 버전 5.4.0을 사용하고 있습니다. 조건문을 실행하려면 새 셸을 만들어야 하기 때문에 이것이 잘못된 것 같습니다. 새 셸에서는 GCC_VERSION 변수가 존재하지 않습니다. 그러나 나는 틀릴 수 있습니다.

내가 이것을 좋아했다면 (모두 하나의 쉘에) :

$(shell GCC_VERSION=$(gcc -dumpversion); \
if [[ ${GCC_VERSION} > 5.0 ]] ; then \
    CFLAGS += -D _POSIX_C_SOURCE=199309L; \
fi)

오류가 발생합니다.

*** recipe commences before first target.  Stop.

네, 매우 혼란스럽습니다.

누구든지 도울 수 있다면 감사하겠습니다. 감사해요.

답변1

이 솔루션을 포함하여 많은 솔루션이 있습니다. Makefile에서 사용

VERSION5 := $(shell \
 GCC_VERSION=$$(gcc -dumpversion); \
 [[ $$GCC_VERSION > 5.0 ]]; \
 echo $$? )

ifeq (${VERSION5}, 0)
  CFLAGS += -D _POSIX_C_SOURCE=199309L
endif

특히, 쉘 스크립트의 모든 항목에 대해 사용해야 합니다 $$. $문자열 비교가 5.0true이면 쉘은 0을 에코하고, 그렇지 않으면 1을 에코하여 make 변수에 저장합니다 VERSION5.

그런 다음 Makefile의 테스트는 ifeq변수를 0과 비교하고 CFLAGS일치하면 변수를 편집합니다.

관련 정보