7

GNUMakeを使用して、ディレクトリ構造(Windowsファイルシステム上)にCファイルのセットを構築するルールベースのmakefileを実行したいと思います。

ルートディレクトリ、一部のサブディレクトリ、および一部のファイルにはスペースが含まれています。

サンプルファイル:"C:\Documents and Settings\<username>\My Documents\Test Dir\Build Me.c"

ファイルパスにスペースが含まれている場合、GNUMakeは実際には機能しません。この問題を回避するための可能な方法(ファイル名からスペースを削除する、8.3形式を使用する、スペースを?またはに置き換える\\など)について読みましたが、どれも完璧ではありません(またはそうですか?)

この問題を解決する特効薬はありますか?

ところで、私はGNUMakeで立ち往生しているので、別のmakeツールを使用することはできません。

4

6 に答える 6

3

最も簡単な方法は、ファイル名を修正することです。

ただし、それができない場合は、ファイル名を二重引用符で囲むコマンドを作成してください。最も簡単で安全なのは、すべてのファイル名をマクロに入れることです。ここでのコツは、二重引用符をエスケープする必要があるということです。そうしないと、Make がそれ自体を食い尽くしてしまいます。

つまり: FN="\"C:\My Documents\myfiles.c\"" FN2="C:\My Documents\myfile2.c"

または $(CC) $(CFLAGS) "$(FN2)" を使用

ここでの秘訣は、コマンドラインを echo でエコーすることです

echo $(CC) $(CFLAGS) "$(FN2)"

またはmake -d、make が行おうとしていることのすべての詳細を取得するために使用します。

これを少しハックする必要があるかもしれません。特に、エスケープを2倍にする必要があるかもしれません

于 2009-03-21T00:49:06.577 に答える
2

makefileのスペースをエスケープできる場合があります。

$(CC) $(CFLAGS) 'C:\Documents\ and\ Settings\<username>\My\ Documents\Test\ Dir\Build Me.c'

念のため一重引用符を追加しましたが、(cygwinなどではなく)Windowsターミナルを使用している場合にこれが機能するかどうかはわかりません。

于 2009-03-20T23:21:07.490 に答える
2

http://www.mail-archive.com/help-make@gnu.org/msg05201.htmlで素晴らしいインスピレーションを見つけました。私自身のテスト アプリケーションは、YouTube からダウンロードした WW2 時代の Jazz FLV ファイルのディレクトリと、それぞれの OGA オーディオ バージョンを保存したいオーディオ サブディレクトリで構成されています。もちろん、ファイル名にはスペースが含まれています。次に、ffmpeg2theora を実行したいと思います

これは、一緒にハッキングして動作させた GNUMake Makefile です。このサイトと上記の参照サイトのすべてのヒントに感謝します!

sq = $(subst $(sp),?,$1)
qs = $(subst ?,$(sp),$1)

e :=
sp := $(e) $(e)

FLVS := $(foreach file,var,$(call sq,$(wildcard *.flv)))
FLVS := $(subst .flv?,.flv ,$(FLVS))

AUDIOS := $(patsubst %.flv,audio/%.oga,$(FLVS))

.PHONY: audios show

audios: $(AUDIOS)

$(AUDIOS) : $(FLVS)
    ffmpeg2theora --novideo -o "$(call qs,$@)" "$(call qs,$(notdir $(patsubst %.oga,audio/%.flv,$@)))"

show:
    echo $(FLVS)
    echo $(AUDIOS)
于 2010-10-11T19:20:04.420 に答える
1

私は通常、DanatheSaneの回答とBrianYoderの回答を組み合わせたものを使用しました。

この関数を使用して、$(subst)出現するすべてのスペースをエスケープされたスペースに置き換えます。例えば:

empty := 
space := $(empty) $(empty)
program_files := $(subst $(space),\$(space),$(ProgramFiles))

$(subst)(Windowsの一部の古いバージョンのmakeでは、パスの円記号をスラッシュに変更するために別のバージョンを使用する必要があることに注意してください)

于 2012-06-27T19:51:26.703 に答える
0

スペースがパス名の「ルート」部分にのみある場合は、そのディレクトリを空白のないパスにマウントできます。これには複数の方法があります。コマンド ラインから (「net use」または「subst」)、またはエクスプローラーから ([ツール] > [ネットワーク ドライブのマップ])。したがって、C:\Documents and Settings\\My Documents\Test Dir" は X:\BuildMe.c になる可能性があります。

ただし、ファイル名または「ルート」ビルド ディレクトリの下のディレクトリに空白がある場合は、おそらく完全な解決策はありません。あなたが言及した他の提案(8.3名、空白を別の文字に置き換える)を使用しましたが、これらは機能しますが、独自の問題があります。

于 2009-03-21T01:33:09.730 に答える