make
私はウェブサイトから毎日更新されるファイルセットを取得するためにそれを使用します。私が望むのは、ファイルを日付の名前の付いたフォルダに入れてから、makeを使用してファイルに対して別の操作を実行することです。私はこれを試しました:
SUFFIXES = .csv
FILES = file1.csv file2.csv file3.csv
BASE_DIR = some/dir
DATE = $(shell date +"%Y%m%d")
SOURCE_FILES = $(patsubst %,$(BASE_DIR)/$(DATE)/%,$(FILES))
ACTIVE_FILES = $(patsubst %,$(BASE_DIR)/%,$(FILES))
all: $(BASE_DIR)/$(DATE) $(ACTIVE_FILES)
$(BASE_DIR)/%.csv: $(BASE_DIR)/$(DATE)/%.csv
rm -f $@
ln $(BASE_DIR)/$(DATE)/%
$(BASE_DIR)/$(DATE):
mkdir $@
$(BASE_DIR)/$(DATE)/%.csv:
cd $(BASE_DIR)/$(DATE); wget http://example.com/data/%.csv
問題は最後の行にあります。このコンテキストでは "%.csv" が無効であるため、ファイル名を wget に渡す方法がわかりません。私が望むことをどのように達成できますか?
答え1
私はあなたが自動変数を使用したいと思います$*
。 GNU makeドキュメントから:
$*
暗黙の規則に一致する茎です。ターゲット
dir/a.foo.b
がでターゲットパターンがある場合、a.%.b
ステムはですdir/foo
。ステムは関連ファイルの名前を整理するのに役立ちます。静的パターンルールでは、語幹はターゲット%
パターンの名前と一致するファイル名の一部です。
場合によっては、wgetルールを次のように書き直すことができます。
$(BASE_DIR)/$(DATE)/%.csv:
cd $(BASE_DIR)/$(DATE); wget http://example.com/data/$*.csv