8

GNU make docs では、「%」は「空でない部分文字列」と一致することが文書化されています。ただし、実際には、空白を含まない空でない部分文字列にのみ一致するようです。たとえば、次のようにするとします。

mkdir /tmp/foo
cd /tmp/foo
echo 'int main() { return 0; }' > "test.c"
echo 'int main() { return 0; }' > "test space.c"

これで、GNU Make の組み込みパターン ルールを使用してこれらをビルドできるはずです。

anthony@Zia:/tmp/foo$ make "test"
cc     test.c   -o test
anthony@Zia:/tmp/foo$ make "test space"
make: *** No rule to make target `test space'.  Stop.

メイクファイルを作成するときにも同じ問題が発生します。

anthony@Zia:/tmp/foo$ rm test
anthony@Zia:/tmp/foo$ echo 'all: test test\ space' > Makefile 
anthony@Zia:/tmp/foo$ make
cc     test.c   -o test
make: *** No rule to make target `test space', needed by `all'.  Stop.

ルールを明示的に追加しても%: %.c、結果は同じです。しかし、次のように Makefile に明示的なルールを追加すると、機能します。

test\ space: test\ space.c
    $(CC) -o "$@" "$<"     # first char is tab, of course.

スペースを暗黙のルールで動作させるトリックはありますか?

編集

バグ レポートを送信しました: http://lists.gnu.org/archive/html/bug-make/2011-06/msg00002.html

4

2 に答える 2

6

私はそうは思いません。空白で区切られたトークンのリストが文字列として渡されるという概念は、make にかなり深く根付いています。これらのリストは解析され、再解析されます。UNIX の世界で、ディレクトリ名とファイル名にスペースを使用することが悪い習慣と見なされるのには理由があります。

于 2011-06-04T00:58:41.313 に答える
2

これはお粗末ですが、今日の時点でも、スペースを含むパスが与えられることがあります。

とにかく、% 規則でディレクトリに直接アクセスする代わりにリンクを作成しても問題ありません。

# GNU makefile
DIR_WITH_SPACE=/c/Users/me/My\ Code

# *** DOESN'T WORK ***
%.h : $(DIR_WITH_SPACE)/%.h
    cp -v "$<" "$@"

fix:
  ln -s $(DIR_WITH_SPACES) dir_fixed

# Does work :)
%.h : dir_fixed/%.h
    cp -v "$<" "$@"
于 2014-02-14T09:38:30.943 に答える