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を使用する他のスクリプトを見たことがありますが、サフィックスを変更するには注文構文を正しく使用する必要がありました。

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))

注:メイクファイルのほとんどと同様に、ファイル名にスペースが含まれていると機能しません。

入力がスペースで区切られたファイル名のリストである場合、出力も同じです。各ファイル名は個別に変換されます。

関連情報