0

特定のプラットフォームでクロスコンパイルするために設計された比較的複雑なOMakeファイルのスイートがあります。私のソースはC++です。

私はWindowsからビルドしているので、名前にスペースが含まれているディレクトリをコンパイラに渡す必要があります。ファイルをコンパイルするためにコマンドラインに挿入されるincludes文字列を作成する方法は、次の行です。

public.PREFIXED_INCLUDES = $`(addprefix $(INCLUDES_OPT), $(set $(absname $(INCLUDES))))

OMakeファイルの他の時点で、次のような行があります。

INCLUDES += $(dir "$(LIBRARY_LOCATION)/Path with spaces/include")

コマンドラインの途中で、これは次のように展開されます。

-IC:\Library location with spaces\Path with spaces\include

私はそれを次のように拡張したいと思います:

-I"C:\Library location with spaces\Path with spaces\include"

可能であれば、「INCLUDES + = ...」行以外は変更したくありませんが、そのファイル内の他の何かを変更することもできます。PREFIXED_INCLUDESの定義を変更するようなことはしたくありません。これは、SDKの一部であるOMakeファイルのスイートに含まれているためです。これは可能ですか?もしそうなら、どうすればそれを行うことができますか?そうでない場合、小さなmakefileコード(できれば1行)を変更することで、スペースを含むインクルードが引用符で囲まれていることをどのように確認できますか?

4

2 に答える 2

1

標準ライブラリ関数quoteは、その引数の周りにエスケープされた引用符を追加するため、仕事をする必要があります:

INCLUDES += $(quote $(dir "$(LIBRARY_LOCATION)/Path with spaces/include"))

必要に応じて、quoteOmake マニュアルを参照してください。

于 2012-06-19T15:47:51.297 に答える
0

他の誰かが同じ問題を抱えている場合に備えて、引用符で囲む方法がわからなかったので、最終的に行った解決策を共有すると思いました. スペースを含む名前を引用符で囲む代わりに、パスを短い (8.3) バージョンに変換することになりました。これは、shorthort.js と呼ばれる単純な JScript ファイルと 1 行の OMake 関数を使用して行いました。

スクリプト:

// Get Access to the file system.
var FileSystemObject = WScript.CreateObject("Scripting.FileSystemObject");

// Get the short path.
var shortPath = FileSystemObject.GetFolder(WScript.Arguments(0)).ShortPath;

// Output short path.
WScript.StdOut.Write(shortPath);

関数:

ShortDirectoryPath(longPath) =
    return $(dir $(shell cscript /Nologo $(dir ./tools/shorten.js) "$(absname $(longPath))"))

だから今、私はインクルードのために次のような行を使用しています:

INCLUDES += $(ShortDirectoryPath $(dir "$(LIBRARY_LOCATION)/Path with spaces/include"))
于 2011-03-31T21:49:11.013 に答える