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でやれ、と。