저는 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))
참고: 메이크파일의 대부분과 마찬가지로 파일 이름에 공백이 있으면 작동하지 않습니다.
입력이 공백으로 구분된 파일 이름 목록인 경우 출력도 마찬가지입니다. 각 파일 이름은 개별적으로 변환됩니다.