2

jamplus を使用して、ベンダーのクロスプラットフォーム プロジェクトを構築しています。osx では、C ツールのコマンド ライン (clang を介して ld に供給) が長すぎます。

応答ファイルは、長すぎるコマンド ラインに対する古典的な答えです。jamplus はマニュアルで、応答ファイルをその場で生成できると述べています。

マニュアルの例は次のようになります。

actions response C++
{
    $(C++) @@(-filelist @($(2)))
}

もうすぐそこ!C.Link コマンドを具体的に吹き飛ばすと、次のようになります。

actions response C.Link
{
    "$(C.LINK)" $(LINKFLAGS) -o $(<[1]:C) -Wl,-filelist,@($(2:TC)) $(NEEDLIBS:TC) $(LINKLIBS:TC))
}

私の jamfile では、リンカにパススルーするために必要なコマンド ラインを取得しますが、応答ファイルは改行で終了していないため、リンクは失敗します (osx ld では改行で区切られたエントリが必要です)。

  1. 改行で結合された jamplus リストを展開する方法はありますか? $(LIST:TCJ=\n)運が悪い場合は、結合拡張を使用してみました。$(LIST:TCJ=@(\n))どちらも機能しません。これができれば、生成されたファイルは正しいはずです。
  2. そうでない場合、clang のリンク コマンドをオーバーライドし、リストからオンザフライでコンテンツを生成するために、どの jamplus コードを使用できますか? これを処理する最も侵襲の少ない方法を探しています。理想的には、リンクが必要な場所に新しい間接的なターゲットを追加するのではなく、ツールを直接変更/オーバーライドします。
4

2 に答える 2

2

探している構文は次のとおりです。

newLine = "
" ;

actions response C.Link
{
    "$(C.LINK)" $(LINKFLAGS) -o $(<[1]:C) -Wl,-filelist,@($(2:TCJ=$(newLine))) $(NEEDLIBS:TC) $(LINKLIBS:TC))
}

明確にするために (StackOverflow が上記をどのようにフォーマットするかはわかりません)、次のように入力して newLine 変数を定義する必要があります。

newLine = "" ;

次に、2 つの引用符の間にカラットを配置して Enter キーを押します。これと同じテクニックを他の特定の文字にも使用できます。

tab = "    " ;

繰り返しますが、newLine = "" から始めて、引用符の間にカラットを置き、タブを押します。上記では、実際には 4 つのスペースが間違っていますが、おわかりいただけたと思います。あると便利なもう1つの方法は次のとおりです。

dollar = "$" ;

$ は通常、変数を指定するために使用されるため、最後のものは便利です。したがって、実際にドル リテラルを指定する場合は、ドル変数を使用すると便利です。価値のあるものとして、私が使用している Jambase (私が使用している JamPlus に同梱されているもの) には次のものがあります。

SPACE = " " ;
TAB = " " ;
NEWLINE = "
" ;

28号線辺り…

于 2016-04-04T09:33:07.450 に答える
0
  1. 文字列結合内でエスケープされた改行やその他の言語固有の文字を使用することをあきらめました。それを行うための素晴らしい方法があるかもしれませんが、それは難しすぎて発見できませんでした。

  2. 複数の一時ファイルでマルチステップ シェル コマンドを使用します。

jamplus (およびおそらくその他の jam バリアント) では、actions response {}中括弧の間のセクションがインライン シェル スクリプトになります。また、応答ファイルの構文@(<value>)は、シェル スクリプト内で割り当てることができるファイル名を返します。内容は<value>.

したがって、次のようなコード:

actions response C.Link
{
    _RESP1=@($(2:TCJ=#)#$(NEEDLIBS:TCJ=#)#$(LINKLIBS:TCJ=#))
    _RESP2=@()
    perl -pe "s/[#]/\n/g" < $_RESP1 > $_RESP2
    "$(C.LINK)" $(LINKFLAGS) -o $(<[1]:C) -Wl,-filelist,$_RESP2
}

_RESP1シェル変数名とに割り当てられた一時ファイルのペアを作成します_RESP2。パスのファイルに_RESP1は、文字で結合された展開されたシーケンスの内容が割り当てられ#ます。検索と置換は、perl のワンライナーで行われ_RESP2ます。リンクは予定通り進み、jamplus は中間ファイルをクリーンアップします。

のような文字ではこれを行うことができませんでした:;\n#、隣接する空白がない限り機能しました。完全に満足しているわけではありませんが、先に進みます。

于 2015-01-22T02:14:32.937 に答える