Makefile에서 bash 매개변수 확장을 사용할 수 있습니까?

Makefile에서 bash 매개변수 확장을 사용할 수 있습니까?

내 빌드 파일:

FULL_VERSION ?= 1.2.3
MINOR_VERSION := $(shell echo "${FULL_VERSION%.*}")

test:
    echo $(MINOR_VERSION)

나는 달려가서 make test아무것도 얻지 못하고 , 그것을 원한다 1.2.

sed/grep을 통해 얻을 수 있다는 것을 알고 있지만 더 우아한 솔루션을 찾고 있으며 bash 매개 변수 확장보다 간단한 것은 없습니다.

답변1

먼저 쉘 변수에 값을 저장해야 합니다.

MINOR_VERSION := $(shell v='$(FULL_VERSION)'; echo "$${v%.*}")

( $(FULL_VERSION)작은따옴표가 포함되어 있지 않다고 가정)

이제 전화를 걸어도 sh작동하지 않습니다 bash. ${var%pattern}는 표준 sh연산자입니다( 에서 ksh).

특정 교환원을 사용하려면 with 대신 전화를 bash알려야 합니다.makebashsh

SHELL = bash

그러나 많은 시스템에는 기본적으로 Makefile이 설치되어 있지 않으므로 bashMakefile을 이식할 수 없게 됩니다(그러나 일부 시스템에는 GNU가 없으며 make이미 일부 GNUism을 사용하고 있습니다).

답변2

내장 함수를 사용하여 이 작업을 수행할 수 있습니다(GNU make를 사용한다고 가정).

VER=1.2.3
MINORVERTMP=$(subst ., ,${VER})
MINORVER=$(word 1,${MINORVERTMP}).$(word 2,${MINORVERTMP})


all:
    @echo ${MINORVER}

당신이 사용할 수 있다면bmake(BSD 제작)더 많은 (아마도 더 간단한) 가능성이 있습니다:

VER=1.2.3

all: test1 test2

test1:
    # simple regular expression-based replace like sed
    @echo $@: ${VER:C,([^\.]*)\.([^\.]*).*,\1.\2,}

test2:
    # replace all dot to spaces (S),
    # print first and second element (:[1..2])
    # with dot separator (ts.)
    @echo $@: ${VER:S,., ,g:[1..2]:ts.}

관련 정보