私は初めて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を使用する他のスクリプトを見たことがありますが、サフィックスを変更するには注文構文を正しく使用する必要がありました。
2番目の質問は、名前付き環境変数を定義するよりも、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))
注:メイクファイルのほとんどと同様に、ファイル名にスペースが含まれていると機能しません。
入力がスペースで区切られたファイル名のリストである場合、出力も同じです。各ファイル名は個別に変換されます。