makeで半角スペースを含むファイルを扱いたい...。
扱いたいのだがどうすればいいかわからない。
具体的には
01 Track1.wav 02 Track2.wav 03 Track3.wav
があるときにそれぞれlameしたい。
あれか、ファイル名にスペース使うなって話か...(д)
で、試しにいろいろやってみた。
empty:= space:=$(empty) $(empty) SRCS:=$(wildcard *.wav) DSTS:=$(subst $(space),\$(space),$(SRCS)) .PHONY: all all: echo $(DSTS)
で、結果は、と言うと、
echo 01\ Track1.wav\ 02\ Track2.wav\ 03\ Track3.wav 01 Track1.wav 02 Track2.wav 03 Track3.wav
まぁ、こうなるわな。
そもそもwildcardの時点で、ファイル区切りのスペースとファイル名のスペースが区別できない。
なので、まず、wildcardは使えない。
代わりにlsを使ってみる。
SRCS:=$(shell ls -Q *.wav) DSTS:=$(patsubst %,[%],$(SRCS)) .PHONY: all all: echo $(DSTS)
lsの-Qオプションはファイルをダブルクォートで括るオプションらしい。
echo ["01] [hoge.wav"] ["02] [fuga.wav"] ["hoge.wav"] [01] [hoge.wav] [02] [fuga.wav] [hoge.wav]
...というか、あれか。
そもそもmakeってスペースをエスケープする手段とかないんですかねぇ?
とか思って、GNUのmakeのソースコード落としてみる。
で、とりあえずforeachあたりからたどってみる。
// function.c static char * func_foreach (char *o, char **argv, const char *funcname UNUSED) { // // 略 // /* loop through LIST, put the value in VAR and expand BODY */ while ((p = find_next_token (&list_iterator, &len)) != 0) { // // 略 //
find_next_tokenがそれっぽい。
んで、
// misc.c char * find_next_token (char **ptr, unsigned int *lengthptr) { char *p = next_token (*ptr); char *end; if (*p == '\0') return 0; *ptr = end = end_of_token (p); if (lengthptr != 0) *lengthptr = end - p; return p; }
さらにnext_tokenを探してみる。
// misc.c char * next_token (const char *s) { while (isblank ((unsigned char)*s)) ++s; return (char *)s; }
...isblankかよ。
なんてこったい。
というわけで結論。
makeでファイルに半角スペースを使うな。
あと、シェルスクリプトなりfindでやれ、と。