11

make.exe を使用しているときに、ターゲット名内のスペースを機能させる方法はありますか? この非常に古いバグレポートが正しい場合、それは不可能のようです: http://savannah.gnu.org/bugs/?712

参考までに、大きな問題は、次のような makefile コマンドの断片です。

"foo bar baz": $(OBJ)
    $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)

... 3 つの別個のコマンドとして扱われるようです: 1 つは "foo (含まれていることに注意してください)" をビルドし、もう 1 つは bar をビルドし、最後に 1 つは "baz" をビルドします (これも "を含みます)。これは、make.exe が区切り文字としてスペースを使用しているように見えるためです。

ただし、たとえば "Hello World.exe" をビルドしたい場合があると想定するのは合理的です。これは不可能のようです。二重引用符は機能せず、個別の単語をエスケープすることもできません (どこかで読んだことがありますが、リンクを覚えていません)。

"foo\\ bar\\ baz": $(OBJ)
    $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)

これを修正する他の方法はありますか?公式マニュアルでは、スペースによるトークン化のみを確認していますが、他の目的でスペースを使用する方法は提供していません: http://www.gnu.org/software/make/manual/make.html#Rule-構文

編集:示唆されているように、私も単一のスラッシュを試しましたが、これらは二重のスラッシュとまったく同じ効果があります。最初の単語のルールが見つからないと不平を言う:

mingw32-make.exe: *** No rule to make target `foo', needed by `all'.  Stop.

ただし、実行可能ファイル「foo bar baz.exe」は正しく生成されますが、リンクは単語ごとに毎回行われます。

4

3 に答える 3

2

2 つのバックスラッシュの代わりに、1 つのバックスラッシュを使用します。次の Makefile は機能します (少なくとも gnu make の場合)。

goal:   foo\ bar

foo\ bar:
    gcc -o "foo bar" "foo bar.c"
于 2013-02-21T15:07:39.483 に答える
2

targetRule: dependencies標準呼び出しの依存関係を無視する、より単純な Makefile を検討する方が簡単かもしれません。OPはWindows用で、以下はLinuxのbashシェルで実行されます。bashしかし、おそらく経由でシェルを使用する Windows に適用できるはずcygwinです。私は次のものを持っています( SOがスペースに変換するコマンドの前にMakefileあることに注意してください):TABecho

testA:
    echo "testA"

unrelated:
    echo "unrelated"

testA\ clean:
    echo "testA clean"

clean:
    echo "clean"

makeターゲットcleanまたはシェル ターミナルtestAで呼び出すと、期待どおりの結果が得られます。bash

$ make testA 
echo "testA"
testA
$ make clean
echo "clean"
clean

make testA cleanここで、そのまま記述して呼び出すと、bashシェルは引数をスペースで分割するため、make2 つの引数を受け取り、それらを別々に実行します。

$ make testA clean
echo "testA"
testA
echo "clean"
clean

...しかし、提供されたターゲットmakeを引用符で囲むと、またはスペースをエスケープすると、シェルはそれがスペースを含む単一の引数であることを理解し、それをそのまま に伝播しmakeます。testA\ cleanターゲットルールとして書かれたものを実行するには:

$ make "testA clean"
echo "testA clean"
testA clean
$ make testA\ clean
echo "testA clean"
testA clean

この結果の 1 つとして、残念ながら、コマンド ラインで "TAB" を押して のオートコンプリートを行うことはできませんtestA\ cleanmake teTABコマンド ラインで入力すると、 のみがtestA自動的にオートコンプリートされます (testA\ cleanオートコンプリート オプションとしては表示されません)。

于 2015-02-05T07:11:07.237 に答える