1. ホーム
  2. shell

[解決済み] GNU make はスペースを含むファイル名を扱えますか?

2023-04-30 23:31:02

質問

いくつかのファイルを含むディレクトリがありますが、そのうちのいくつかは名前にスペースが含まれています。

Test workspace/
Another directory/
file1.ext
file2.ext
demo 2012-03-23.odp

私は、GNUの $(wildcard) コマンドを実行し、その結果に対して $(foreach) を使って結果を繰り返し、すべてを出力します。以下はそのコードです。

FOO := $(wildcard *)
$(info FOO = $(FOO))
$(foreach PLACE,$(FOO),$(info PLACE = $(PLACE)))

プリントアウトされるのはこんな感じです。

Test workspace
Another directory
file1.ext
file2.ext
demo 2012-03-23.odp

実際に取得するのはこんな感じです。

Test
workspace
Another
directory
file1.ext
file2.ext
demo
2012-03-23.odp

後者は明らかに使い物にならない。その ドキュメント のための $(wildcard) は、それが "スペースで区切られた名前のリスト" を返すときっぱりと述べていますが、これが引き起こす大きな問題を完全に認めていません。また ドキュメント についても $(foreach) .

これを回避することは可能でしょうか?もし可能なら、どのように?すべてのファイルとディレクトリの名前を変更してスペースを削除することは、オプションではありません。

どのように解決するのですか。

バグ #712 は、make がスペースを含む名前を扱わないことを示唆しています。どこにも、決して。

を見つけたのですが ブログの記事で、部分的に実装されているという でスペースをエスケープすることで \ ( \\ はタイポかフォーマットのアーティファクトのようです)、しかし。

  • 以外の関数では動作しません。 $(wildcard) .
  • 変数から名前のリストを展開するときは動作しません。これは特殊変数 $? , $^$+ といったユーザー定義の変数と同じように。ということは $(wildcard) は正しいファイルにマッチしますが、いずれにせよ結果を解釈することはできません。

したがって、明示的または非常に単純なパターン ルールでは動作させることができますが、それ以上では運が悪いとしか言えません。スペースをサポートする他のビルド システムを探す必要があります。私は ジャム / bjam が行います。 scons , ウエハ , , ナント msbuild はすべて動作するはずです。