makefile에서 파일 접미사를 변경하는 방법은 무엇입니까?

makefile에서 파일 접미사를 변경하는 방법은 무엇입니까?

저는 Makefile을 처음 접했고 파일 접미사를 변경하고 싶습니다. 파일을 한 형식에서 다른 형식으로 변환하고 싶습니다(예: .mov에서 .mp4로).

Bash에서 나는 다음과 같은 일을 할 것입니다

out1 = "${input/mov/mp4}"

(Make에서 인라인 Bash 구문을 사용할 수 있는 방법이 있나요?)

어쨌든 작동하지 않습니다. 그래서 텍스트 기능에 대한 이 문서를 찾았습니다. https://www.gnu.org/software/make/manual/html_node/Text-Functions.html

$(var:suffix=replacement)

그래서 이것을 내가 사용할 수 있는 것으로 변환하려고 합니다...

out1 := "${input/mov/mp4}"   ##bash syntax doesnt work
out2 := $(input:suffix=mp4)

check:
    @echo " input: ${input}"
    @echo "  out1: ${out1}"
    @echo "  out2: ${out2}"

하지만 이것은 작동하지 않습니다. 접미사는 영향을 받지 않습니다.

$ input=tutorial-v1.mov make check
 input: tutorial-v1.mov
  out1:
  out2: tutorial-v1.mov

sed를 사용하는 다른 스크립트를 본 적이 있지만 접미사를 변경하려면 주문 구문을 올바르게 사용해야 했습니다.

두 번째 질문은 이름이 지정된 환경 변수를 정의하는 것보다 makefile 스크립트에 매개변수를 전달하는 더 좋은 방법은 없다고 생각합니다. 예를 들어, make cmd param1 param2다른 쉘 스크립트와 마찬가지로 $1?

답변1

PARAM1내 제안은 및 매개 변수를 사용하여 PARAM2대상에서 사용하는 것입니다.

check:
    @echo "  input: ${INPUT}"
    @echo " param1: ${PARAM1}"
    @echo " param2: ${PARAM2}"
    @echo "    out: $(INPUT:$(PARAM1)=$(PARAM2))"

다음은 그 사용법의 예입니다:

INPUT=file.mkv PARAM1=.mkv PARAM2=.avi make check
  input: file.mkv
 param1: .mkv
 param2: .avi
    out: file.avi

또 다른 옵션은 다음을 사용하는 것입니다.파일 이름 기능

check:
    @echo " input: ${INPUT}"
    @echo "suffix: ${SUFFIX}"
    @echo "   out: $(addsuffix $(SUFFIX), $(basename $(INPUT)))"

다음과 같이 테스트하면 INPUT=file.avi SUFFIX=.mp4 make check다음과 같은 결과가 생성됩니다.

 input: file.avi
suffix: .mp4
   out: file.mp4

답변2

out1 = $(patsubst %.mov,%.mp4,$(input))

참고: 메이크파일의 대부분과 마찬가지로 파일 이름에 공백이 있으면 작동하지 않습니다.

입력이 공백으로 구분된 파일 이름 목록인 경우 출력도 마찬가지입니다. 각 파일 이름은 개별적으로 변환됩니다.

관련 정보