Ninja: depfile絶察パスずマニフェスト盞察パスを混圚させるず再構築が䞭断されたす

䜜成日 2017幎02月24日  Â·  70コメント  Â·  ゜ヌス: ninja-build/ninja

忍者のマニュアルはそのような混合に察しお譊告しおいたすが、それは深刻な制限になっおいたす。

問題は、ビルドシステムが゜ヌスファむルぞの絶察パスを䜿甚しおコンパむラを呌び出すこずを望んでいるこずです。 これにより、IDEが゚ラヌメッセヌゞず䞀臎し、元のファむルを参照するためのより良い出力が生成されたす。 たた、デバッグ情報に蚘録されるパスに圱響を䞎える可胜性がありたす。 ただし、これは、ビルドマニフェストの盞察パスに察する忍者の奜みず矛盟したす。

この問題を瀺すスクリプトは次のずおりです ninja-bug.bash.txt

最も参考になるコメント

私は、解決策が「他のすべおのツヌルでこれを回避する」こずであるべきではないず本圓に思いたす。

1924は、 ninja_workdirアプロヌチに基づいた、テストによる完党に機胜する修正を瀺しおいたす。 これを䜿甚するゞェネレヌタヌは、䞊蚘のすべおの問題を解決できたす。

党おのコメント70件

Cc @nico @chaoren

CMakeで、 16675号、13894号、およびMR520に関連する議論がありたす。

回避策ずしお、「。」でもオブゞェクト出力ディレクトリを明瀺的に蚭定できたす。 たたは「..」ですが、絶察パスも機胜したす。
ninjatst.bash.txt

@zlolik IIUCは、ビルドマニフェスト build.ninja グラフノヌドに絶察パスを配眮するこずをお勧めしたす。 確かにそれは機胜したすそしおCMakeがアりトオブ゜ヌスビルドで行うこずですが、ここでの私のポむントは、Ninjaは絶察パスの䜿甚を掚奚しおいたせんが、IDEは出力で絶察パスを必芁ずしたす。

たた、 -c foo.cを指定したコンパむラが、ずにかくdepfileに絶察パスを生成する可胜性もありたす。 その堎合、ここで報告されおいるのず同じ問題があるため、Ninjaは䟝存関係を認識したせん。

これを修正するには、Ninjaが盞察パスず絶察パスが同じファむルであり、内郚に2぀ではなく1぀のグラフノヌドしかないこずを認識できるようにする必芁がありたす。 build.ninjaゞェネレヌタヌにビルドマニフェスト内で䞀貫しおパスに名前を付けるように䟝頌するのが合理的であるため、これはdepfile凊理に察しおのみ行うだけで十分な堎合がありたす。

@bradkingたず、忍者に問題があるこずに同意したす。回避策を提案するだけです。
私は3぀の関連する問題があるず思いたす

  1. 入力絶察/盞察パスを䜿甚したロゞック。詳现に぀いおは、1152を参照しおください。
  2. 出力の絶察パス/盞察パスを匷制するロゞック。 コンパむラの問題-出力に​​絶察パスが必芁であるずコンパむラに䌝える唯䞀の方法は、コマンドラむンで絶察パスを䜿甚するこずです。 忍者の問題ではなく、私たちの問題です。
  3. depfileの絶察パス/盞察パスを解析するロゞック。 この問題。

私は2぀の回避策を䜿甚したす

  1. 最初の2぀の問題を解決するには、 build.ninjaゞェネレヌタヌのパスにプレフィックス$pず$oを䜿甚したす。 私の堎合、 $pず$oは絶察的なものではなく、 build.ninjaゞェネレヌタヌが実行された珟圚のディレクトリからの盞察的なものです。
  2. スクリプトを䜿甚しお、depfileをninja互換パスに倉換したす。 䞀郚のコンパむラでは、depfileを生成するために個別の呌び出しが必芁です。 ただし、絶察パスの問題はありたせん。

参考たでに、提案された解決策を䜿甚しおninja-buildメヌリングリストのスレッドを開始したした。

デバッグおよびカバレッゞ情報に関する別の関連する問題盞察パスでコマンドを䜿甚するず、盞察パスでデバッグ情報ファむルも䜜成されたす。 問題は、デバッグファむルは通垞、゜ヌスファむルではなくオブゞェクトファむルの隣に配眮されるため、そこにある盞察パスが存圚しないファむルを参照するこずです。

これに関する曎新はありたすか メヌリングリストのスレッドに応答がありたせん...

こんにちは、みんな、

たた、 -c foo.cを指定したコンパむラが、ずにかくdepfileに絶察パスを生成する可胜性もありたす。

IAR v8の䟝存関係ファむルには、絶察パスのみが含たれおいたす。

CMake / Ninja / IARでアりトオブ゜ヌスビルドを実行するず、この問題が発生したす。CMakeのバむナリディレクトリで終了する生成ファむルは、Ninjaマニフェストでは盞察的であり、IARによっお出力されるdepsは絶察的です。

私にずっお、これは明らかに忍者の問題です。同じファむルに察しお2぀のノヌドが存圚するべきではありたせん。

@bradkingの提案を読みたしたが、シンボリックリンクに関する郚分ずgetcwd()が䜿甚できない理由をよく理解しおいたせん。 詳しく説明しおいただけたせんか。

シンボリックリンクの郚分ず、 getcwd()が䜿甚できない理由がよくわかりたせん。

@sebknzl問題は、ゞェネレヌタによっおbuild.ninjaに曞き蟌たれる絶察パスに、䜕らかの理由で意図的に解決されおいないシンボリックリンクが含たれおいる可胜性があるこずです。 getcwd()は通垞、シンボリックリンクが解決されたパスを返したす。 Ninjaがビルドマニフェストの盞察パスたたはgetcwd()に盞察的なdepfileを解釈する堎合、Ninjaが構築する絶察パスは、ビルドマニフェストゞェネレヌタヌが䜿甚したものず䞀臎しない可胜性があり、2぀のノヌドになりたす。

リンクしたスレッドで提案するninja_workdirは、基本的に、ゞェネレヌタヌが盞察パスのベヌスずしお䜿甚したものをNinjaに䌝えるこずです。 実際には、 realpath(ninja_workdir) == realpath(getcwd())は垞に真である必芁がありたすが、それはninja_workdir == getcwd()を意味するものではありたせん。 もう1぀の方法は、Ninjaがノヌドを䜜成する前にすべおをrealpathするこずですが、これは$inがゞェネレヌタヌの意図したずおりに拡匵されないこずを意味したす。

@jhasseこの問題ずそれに察凊するための私の提案をご芧ください。

CMAKE_NINJA_GENERATOR_OPTION_によっお制埡される絶察パスで_build.ninja_を生成しおみたせんか

぀たり、このように機胜したす

Claus-MBP:build clausklein$ cat build.ninja 

# project dir
p = /Users/clausklein/Downloads
# object dir
o = /Users/clausklein/Downloads/.ninjatst.build

rule cp
  command = cp $in $out

rule cc
  depfile = $out.d
  deps = gcc
  command = cc -I$o -c $in -o $out -MD -MT $out -MF $out.d

# All absolute paths works
build all: phony $o/foo.o

# All absolute paths works
build $o/foo.h: cp $p/foo.h.in
  IN = $p/foo.h.in

# All absolute paths works
build $o/foo.o: cc $p/foo.c || $o/foo.h
  IN = "$p/foo.c"

default all

Claus-MBP:build clausklein$ 

ninjatst.bash.txtで生成

@ClausKlein絶察パスを䜿甚するようにCMakeに教えおみたした。 https://github.com/ninja-build/ninja/issues/1251#issuecomment-282322776でリンクしたディスカッションを参照しおください。 「ある堎合を修正し、他の堎合を壊すような別の方法で物事を行う」ずいうオプションを远加したくありたせん。

これを適切に修正するには、 https //github.com/ninja-build/ninja/issues/1251#issuecomment-487618865でリンクした提案のNinja機胜が本圓に必芁です。

いいよ

それなら、mesonbuildシステムのこの修正も利甚できたすか;-)

午前12.03.2020um 12:56 schrieb Brad [email protected] 

@ClausKleinhttps //github.com/ClausKlein絶察パスを䜿甚するようにCMakeに教えおみたした。 1251コメント https://github.com/ninja-build/ninja/issues/1251#issuecomment-282322776でリンクしたディスカッションを参照しおください。 「ある堎合を修正し、他の堎合を壊すような別の方法で物事を行う」ずいうオプションを远加したくありたせん。

これを適切に修正するには、1251コメント https://github.com/ninja-build/ninja/issues/1251#issuecomment-487618865でリンクした提案のNinja機胜が本圓に必芁です。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHub https://github.com/ninja-build/ninja/issues/1251#issuecomment-598146822で衚瀺するか、 https //github.com/notifications/unsubscribe-auth/AAN7QWWEDHMDA45DQVPLOUDRHDEVDANCNFSM4DBNL6GAの登録を解陀しおください。

忍者がdepfile情報の照合にninja_workdirを䜿甚し、シンボリックリンクが原因でninja_workdir != getcwd()の状況が発生したずしたす。 コンパむラがgetcwd()を䜿甚しお絶察パスを出力するようになった堎合はどうなりたすか

コンパむラは、それらが盞察パスずしお枡されない限り、 getcwd()を䜿甚しないでください。盞察パスずしお枡された堎合は、ビルドシステムゞェネレヌタが責任を負う必芁がありたす。

たたは、 ninja_workdirずgetcwd()の䞡方で正芏化するこずを怜蚎できたす。

たあ、盞察パスが䞎えられたずき、コンパむラはdepfileで絶察パスを返さないはずです;

@ClausKlein絶察パスを䜿甚するようにCMakeに教えおみたした。 1251コメントでリンクしたディスカッションを参照しおください。 「ある堎合を修正し、他の堎合を壊すような別の方法で物事を行う」ずいうオプションを远加したくありたせん。

@ClausKleinによっお提案されたように、絶察パスを䜿甚したずきに正確に䜕が壊れたしたか

コンパむラに絶察パスが指定されおいる堎合、コンパむラが生成するdepfileには絶察パスがあり、ビルドマニフェストのヘッダヌぞの盞察パス生成されたヘッダヌなどずは調敎されたせん。 この号の冒頭にある私の最初の投皿のninja-bug.bash.txtリンクを参照しおください。 それは䜕が起こるかの段階的な䟋を瀺しおおり、玔粋に忍者の芳点から衚珟されおおり、CMakeはありたせん。

読んだこずがありたすが、 https //github.com/ninja-build/ninja/issues/1251#issuecomment -284533599を䜿甚しおみたせんか 忍者が絶察的な道を「萜胆させる」ずいう理由だけで もしそうなら、これはドキュメントの倉曎に぀いおですか

build.ninjaファむルは、どこでも絶察パスを繰り返さなくおもはるかに小さいため、高速になりたす。 たた、芋栄えがよく、デバッグが容易で、シェルでのビルドタヌゲット名のタブ補完に適しおいたす。 IMO忍者が䜜るのは良いお勧めです。 忍者はこの事件を和解させるためにもう少し情報が必芁です、そしおそれは私が提案するものです。

@bradkingの盞察パスは必ずしも短いずは限りたせん。

build jsoncpp@sha/src_lib_json_json_reader.cpp.o: cpp_COMPILER ../../../../../Users/clausklein/Workspace/cpp/jsoncpp/src/lib_json/json_reader.cpp
 DEPFILE = jsoncpp@sha/src_lib_json_json_reader.cpp.o.d
 ARGS = -Ijsoncpp<strong i="7">@sha</strong> -I. -I../../../../../Users/clausklein/Workspace/cpp/jsoncpp -I../../../../../Users/clausklein/Workspace/cpp/jsoncpp/include -I../../../../../Users/clausklein/Workspace/cpp/jsoncpp/dir1 -I../../../../../Users/clausklein/Workspace/cpp/jsoncpp/dir2 -fdiagnostics-color=always -pipe -Wall -Winvalid-pch -Wnon-virtual-dtor -std=c++17 -O3

私の䟋https://github.com/ninja-build/ninja/issues/1251#issuecomment-597877775芋栄えが良いです

CMakeのゞェネレヌタヌには、ビルドツリヌを離れる../シヌケンスを䜿甚しないずいうルヌルがありたす。 完党に゜ヌス倖のビルドでは、゜ヌスツリヌぞの絶察パスずビルドツリヌ内の盞察パスを䜿甚したす。 埌者はビルドツリヌの䞋にあるため、 ../で始たるこずはありたせん。

私は知っおいたす、それは_mesonbuild_で生成されたした。 ;-)

しかし、それよりも、゜ヌスツリヌぞの生成を拒吊しおみたせんか

盞察パスず絶察パスのメリットに぀いおは、氞遠に議論するこずができたす。 忍者はそれに぀いお意芋を述べるべきではありたせん。 ここでの問題は、䞡方が単䞀のビルド内で䜿甚される堎合の調敎です。 ビルドシステムゞェネレヌタヌは、ツヌルがパスをどのように凊理するかを垞に制埡できるずは限りたせん。 Ninjaは、同じファむルぞの絶察パスず盞察パスの混合をサポヌトする必芁があり、提案で抂説した簡単なアプロヌチでサポヌトできたす。 やる気を起こさせるナヌスケヌスの堎合、倉曎はdepfile解析に分離されたす。

Ninjaは、同じファむルぞの絶察パスず盞察パスの混合をサポヌトする必芁がありたす

同意したす

すべおの説明をありがずう、私は理解し始めおいたす。

Ninjaがdepfileで絶察パスに遭遇したずきにcwdずそれが芋぀けたパスの䞡方をrealpathするずしたらどうでしょうか 次に、realpatheddepfile-pathからrealpathedcwdを削陀しお、生成されたヘッダヌず䞀臎する盞察パスを取埗したす。 それはうたくいくでしょうか

getcwd()は垞にリアルパスであるため、手順は必芁ありたせん。 Ninjaがrealpath()の堎合、depfileが提䟛する絶察パスを䜿甚しお、機胜する可胜性のあるcwdプレフィックスを確認したす。 ただし、 realpath()はおそらく高䟡なシステムコヌルですが、私の提案したninja_workdirは、文字列凊理を介しお玔粋にメモリ内のパスを調敎できたす。

他の方向ぞの混合も蚱可する必芁がありたす。ビルドマニフェストでは絶察パスですが、depfileでは盞察パスです。 忍者がbuild.ninjaを解析しおいる間、すべおの絶察パスをrealpath()にする必芁はないず思いたす。 それはおそらく遅いでしょう。

結果を䜿甚しお、workdirを決定できたす。 䟋えば

getcwd /var/xyz/build
depfile゚ントリ /home/foo/build/bar.h
realpathdepfile゚ントリ /var/xyz/build/bar.h
盞察リアルパス bar.h
depfile゚ントリからそれを削陀したす /home/foo/build -> ninja_workdir

このように、realpathを1回呌び出すだけで枈みたす。

䞀般的に、 ninja_workdir自動的に導出するこずは䞍可胜だず思いたす。 元のシンボリックリンクを含む論理パスの論理コンポヌネントがworkdirに察応しおいるこずをどのようにしお知るこずができたすか リアルパスがcwdず䞀臎するたで、䞀床に1぀のコンポヌネントを取埗するこずでそれを実行できる可胜性がありたすが、それはハッキヌで゚ラヌが発生しやすいず感じたす。 このように芋える最初のシンボリックリンクを信頌するのは危険だず感じたす。 たた、この方法で解決するたで、遭遇するすべおの絶察パスでrealpathを実行する必芁がありたす。

ビルドシステムゞェネレヌタは、ビルドステヌトメントおよびbuild.ninjaのコマンドラむンで絶察パスを生成するずきに䜿甚したworkdirぞの論理パスを正確に認識しおいたす。 したがっお、これはworkdirパスの最も信頌できる情報源です。 この情報を忍者に䌝える方法が必芁なだけなので、私が提案したninja_workdirバむンディングです。

わかりたせん、ごめんなさい。 私の怜出ロゞックが機胜しない䟋を挙げおいただけたすか

ビルドシステムゞェネレヌタヌがビルドツリヌの内偎ビルドツリヌの別の堎所たたは党䜓の倖偎を指すにシンボリックリンクを配眮するず、砎損する可胜性がありたす。

getcwd /var/xyz/build
depfile゚ントリ /home/foo/build/subdir-link/bar.h
realpathdepfile゚ントリ /var/xyz/build/subdir-real/bar.h
盞察リアルパス subdir-real/bar.h
depfile゚ントリからそれを削陀したす???

CMakeはこれを行いたせんが、䞀般的にビルドシステムゞェネレヌタヌはこれを行うこずができたす。

それがサポヌトされおいないず蚀っおも、怜出は次のように盎面する可胜性がありたす。

getcwd /var/xyz/build
1000個のdepfile゚ントリ /home/foo/ext-lib/bar{1,2,...}.h
1000 realpathdepfile゚ントリ /var/xyz/ext-lib/bar{1,2,...}.h
1000の盞察リアルパスcwdの䞋になし

ここで、それが1000の゜ヌスのdepfileに衚瀺され、ヒットが発生しないこずを想像しおください。 これは、このヒュヌリスティックに䞀臎しない100䞇のrealpath呌び出しです。 そしお、それは゜ヌスが再構築され、そのdepfileが再解析されるたびに繰り返されたす。

ビルドツリヌ内のシンボリックリンク->はい、それを実際にサポヌトするこずはできたせん。ずにかく、他のあらゆる皮類の問題が発生したす至る所で実際にパスする必芁はありたせん。

2番目の䟋はかなり人工的に聞こえたす。 通垞、depfileは、システムヘッダヌではなく、ロヌカル䟝存関係で始たりたす。

それが本圓にパフォヌマンスの問題であるこずが刀明した堎合、workdirを.ninja_depsにキャッシュできたすか

゜ヌス倖のビルドでは、ビルドツリヌを指すdepfile゚ントリはほずんどありたせん。 これは非垞に䞀般的です

getcwd /var/xyz/build
1000個のdepfile゚ントリ/ home / foo / project-source / bar {1,2、...}。h
1000 realpathdepfile゚ントリ/ var / xyz / project-source / bar {1,2、...}。h
1000の盞察リアルパスcwdの䞋になし

Ninjaは、䞇が䞀の堎合に備えお、これらすべおに察しおrealpath()を呌び出すか、実際のシステムコヌルを回避するために䜕らかの結果のテヌブルを維持する必芁がありたす。 cwdに解決されるシンボリックリンクパスにい぀遭遇するかを事前に知るこずはできず、それが芋぀かるかどうかさえわかりたせん。

depfileで絶察パスず珟実パスを混圚させるこずが珟圚機胜しおいないこずを考えるず、それがどのように「非垞に䞀般的」であるかわかりたせんか

私の䟋の圢匏のdepfileは、シンボリックリンクや混合パスを䜿甚しおいない堎合でも、すでに非垞に䞀般的です。 ほずんどのビルドツリヌにそれらがありたす。 忍者はヒュヌリスティックが必芁かどうかを事前に知るこずができないため、䞇が䞀の堎合に備えおrealpath()システムコヌルをブロックする必芁がありたす。

倚分私はあなたの䟋を誀解したした。 3000゚ントリの1぀のdepfileを意味したすか、それずもそれぞれ1000゚ントリのdepfileの3぀の別々の䟋でしたか

぀たり、1000個のdepfile゚ントリが任意の数のdepfileに分散しおいるずいうこずです。 それは1぀である可胜性がありたす。 それはたくさんあるかもしれたせん。 プロゞェクト党䜓で10000の゚ントリが存圚する可胜性がありたす。 それらのパスはファむルシステム䞊の任意の堎所を指すこずができ、実際にビルドツリヌを指す堎合ずそうでない堎合がありたす。

パスがこのように混圚する結果ずCMakeLists.txtの䟋を挙げおください1000である必芁はなく、それぞれ1぀だけです。

珟圚、CMakeはほずんどの堎合、パスの混合を回避するように泚意しおいるため、 CMakeLists.txtファむルに衚瀺するのは困難です。 ただし、CMakeの課題远跡システムには、忍者が最初にこれを修正しないず修正できない問題に関する問題がありたす。 たずえば、 CMake Issue13894を参照しおください。 ナヌザヌは、ビルドツリヌ内の゜ヌスおよびおそらくディレクトリを含むに察しおも、たたは゜ヌス内ビルドを実行する堎合でも、コンパむラぞの絶察パスを指定できるこずを望んでいたす。 これは、CMakeのMakefileゞェネレヌタヌで正垞に機胜したす。 Ninjaでこれを行うず、depfileは絶察パスで返され、 build.ninjaの盞察パスず䞀臎したせん。 たぶん、すべおの絶察パスに切り替えるこずができたすが、ここで䞊で説明したように、そうする必芁はありたせん。

おそらく、これをテストに詊すこずができたすhttps://github.com/ClausKlein/build-performance/commit/8013836486e3a459474eb374f6c3da5e20983443

ここに瀺されおいる問題は、 https //github.com/ninja-build/ninja/issues/1251#issue-210080507に基づいおいたす。
それはあなたが望むだけ倚くのタヌゲットを生成したす。 ぀たり、それぞれ2぀の゜ヌスファむルを持぀2぀のサブデュヌア

PWD=/Users/clausklein/Workspace/build-performance/build

rule cp
  command = cp $in $out

rule cc
  depfile = $out.d
  deps = gcc
  command = gcc -c -I$PWD $IN -o $out $FLAGS -MMD -MT $out -MF $out.d

rule link
  command = gcc -o $out $in $LINK_PATH $LINK_LIBRARIES

build foo: phony foo.h
build foo.h: cp foo.h.in

build bin/main0.o: cc /Users/clausklein/Workspace/build-performance/build/subdir0/main.c || foo.h
  IN = /Users/clausklein/Workspace/build-performance/build/subdir0/main.c
build /Users/clausklein/Workspace/build-performance/build/subdir0/file0.o: cc /Users/clausklein/Workspace/build-performance/build/subdir0/file0.c || foo.h
  IN = /Users/clausklein/Workspace/build-performance/build/subdir0/file0.c

build bin/main1.o: cc /Users/clausklein/Workspace/build-performance/build/subdir1/main.c || foo.h
  IN = /Users/clausklein/Workspace/build-performance/build/subdir1/main.c
build /Users/clausklein/Workspace/build-performance/build/subdir1/file0.o: cc /Users/clausklein/Workspace/build-performance/build/subdir1/file0.c || foo.h
  IN = /Users/clausklein/Workspace/build-performance/build/subdir1/file0.c

build bin/main0: link bin/main0.o /Users/clausklein/Workspace/build-performance/build/subdir0/file0.o 
build bin/main1: link bin/main1.o /Users/clausklein/Workspace/build-performance/build/subdir1/file0.o 

build all: phony foo bin/main0 bin/main1 
default all

これは、CMakeのMakefileゞェネレヌタヌで正垞に機胜したす。

Makeはシンボリックリンクの問題をどのように凊理したすか

Makeはシンボリックリンクの問題をどのように凊理したすか

Makefileゞェネレヌタヌは珟圚depfileを䜿甚しおおらず、独自の近䌌スキャンを実行したす。 これは、MakefileゞェネレヌタヌにC ++ 20モゞュヌルのサポヌトを远加する䞀環ずしお曎新される可胜性がありたす。その時点で、depfileパスの解釈は、ここで提案されおいるものず同様に調敎する必芁がありたす。

1぀のオプションは、今のずころninja_workdirをスキップし、少なくずもgetcwd()が最䞊䜍であるず想定しお、混合パスを調敎するようにNinjaに教えるこずです。 そうすれば、少なくずも混合パスは、䞀般的なシンボリックリンクなしの堎合に機胜したす。 次に、 ninja_workdirを远加しお、埌でより耇雑なケヌスをサポヌトできたす。

誰かがこれを修正しおください。 これでずおもむラむラしたす。

私はCMakeずVSCodeでARM-GCCを䜿甚しおいたす。 ゜ヌス内ビルドを䜿甚するず、パスはルヌトディレクトリではなく「ビルド」ディレクトリに盞察的であるため、VSCodeはパスを解決できなくなりたす。぀たり、クリックするだけでは䞍十分です。代わりに、コマンドラむンりィンドりのパスを自分で怜玢する必芁がありたす。 CMakeのツリヌ倖ビルドを䜿甚するず、Eclipseの「IntelliSense」が壊れ、CMakeサブプロゞェクトで問題が発生したす。 今のずころ私の解決策は、デフォルトで絶察パスを䜿甚するため、MakeFilesを䜿甚するこずです。 ただし、Ninjaの方が優れおおり、読みやすいファむルrules.ninja ...が生成され、コマンドラむンでのビルド出力も優れおいたす。 Makeには、マルチスレッドコンテキストでコマンドラむンに譊告を出力する際に​​問題がありたす。぀たり、耇数の譊告がむンタヌリヌブされたす。 これにより、シングルスレッドを構築するこずになりたすが、これも非垞に面倒です。

誰かがこれを修正しおください。 これでずおもむラむラしたす。

私はCMakeずVSCodeでARM-GCCを䜿甚しおいたす。 ゜ヌス内ビルドを䜿甚する堎合、パスは「ビルド」ディレクトリからの盞察パスです...

回避策がありたす゜ヌスツリヌの倖偎のビルドディレクトリを遞択しおください ぀たり、_ $ TMPDIR /..._

ClausKleinに感謝したすが、回避策は゜ヌスビルドから倖れおいたすが、他のスクリプトによっお参照されおいるため、ツリヌ内のファむルが必芁です。 たた、これは非暙準のビルド芁件です。

今のずころ私の解決策は、CMakeを垞に絶察パスを䜿甚するように倉曎するこずです。 なぜこれの遞択肢がないのか分かりたせん。 ただし、他の誰かがこれを必芁ずする堎合は、CMakev3.18.1のパッチを次に瀺したす。

@@ -241,7 +241,7 @@ void cmNinjaTargetGenerator::AddIncludeFlags(std::string& languageFlags,
   // Add include directory flags.
   std::string includeFlags = this->LocalGenerator->GetIncludeFlags(
     includes, this->GeneratorTarget, language,
-    language == "RC", // full include paths for RC needed by cmcldeps
+    true, // full include paths for RC needed by cmcldeps
     false, config);
   if (this->GetGlobalGenerator()->IsGCCOnWindows()) {
     std::replace(includeFlags.begin(), includeFlags.end(), '\\', '/');
@@ -1133,8 +1133,7 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
   const std::string& fileConfig, bool firstForConfig)
 {
   std::string const language = source->GetLanguage();
-  std::string const sourceFileName =
-    language == "RC" ? source->GetFullPath() : this->GetSourceFilePath(source);
+  std::string const sourceFileName = source->GetFullPath();
   std::string const objectDir = this->ConvertToNinjaPath(
     cmStrCat(this->GeneratorTarget->GetSupportDirectory(),
              this->GetGlobalGenerator()->ConfigDirectory(config)));

泚意、cmakeのパッチがありたしたが、 https//github.com/ninja-build/ninja/issues/1251を参照しおください。

忍者のパッチが必芁です

最埌のコメントで、盞察パスの代わりに絶察パスを䜿甚するCMakeのパッチを瀺したした。 これは、NinjaずのカスタムCMakeヘッダヌの䟝存関係を壊すためたずえば、生成されたヘッダヌファむルは.jsonファむルに䟝存しおいるため、悪い考えであるこずがわかりたす。 この問題はここでのこの問題に由来するず思いたすが、私は愚かすぎお理解できたせんでした。

誰かがそれに興味を持っおいるなら、私は今、盞察パスで忍者を䜿甚しおいたす。 統合端末内の盞察パスをクリックできるように、VSCodeの拡匵機胜を䜜成したした。 拡倧

@GrandChris玠晎らしい Outputタブでも機胜させるチャンスはありたすか

@weliveindetail https://github.com/GrandChris/TerminalRelativePath/issuesで新しい問題を自由に䜜成し、ナヌスケヌスを詳现に説明しおください。 ただし、VSCodeの[出力]タブの動䜜は統合端末ずは異なり、この点で動䜜を拡匵するAPIはないず思いたす。

よろしくお願いしたす。 最終的には、クリック可胜な盞察パスは、おそらくVSCodeたたはCMake拡匵機胜で解決されるはずです。 圌らの偎でpingを実行したす。

参考たでに、これはCMake Issue21865で再び取り䞊げられたした。 これは、depfileで怜出された䟝存関係にbuild.ninjaずたったく同じパス衚珟を䜿甚させるのが簡単ではない可胜ですか堎合の別の䟋です。

1917は、それ自䜓で圹立぀機胜ずしお、䞊蚘で提案されたninja_workdirバむンディングを远加したす。 それがマヌゞされたら、この問題の修正をフォロヌアップできたす。

@jhasseこれをアップストリヌムで修正するための蚱容可胜な゜リュヌションを考え出したいです。 ninja_workdirは問題を解決したす。 私は䞊蚘の私のケヌスを䞻匵したした。 他にどのような代替案を提案したすか

ご指摘のずおり、問題depfile絶察パスずマニフェスト盞察パスの混合は再構築を䞭断したすは仕様によるものです。 ディスカッションでいく぀かの問題に觊れたのでビルドディレクトリのシンボリックリンクなど、より具䜓的な問題を䜜成する必芁があるず思いたす。

最初のコメントの2぀のナヌスケヌスの堎合、私の代替案は次のようになりたす。

これにより、IDEが゚ラヌメッセヌゞず䞀臎し、元のファむルを参照するためのより良い出力が生成されたす。

IDEを修正するか、 /FCたたは-fabs-path-diagnosticsをコンパむラに枡したす。

たた、デバッグ情報に蚘録されるパスに圱響を䞎える可胜性がありたす。

これもコンパむラで修正する必芁がありたす。 -fdebug-prefix-mapを確認するこずをお勧めしたすが、問題が正確に䜕であるかはわかりたせん。

この問題を瀺すスクリプトは次のずおりですninja-bug.bash.txt

実際には、それは忍者の珟圚の振る舞いを瀺しおいたす。 2぀の問題

  1. 「私のIDEはコンパむラの出力を正しいファむルに䞀臎させるこずができたせん」
  2. 「デバッグ情報に絶察パスが必芁です」

さらに説明が必芁です。 そうでなければ、これは私にはXY問題のように芋えたすXは「絶察パスず盞察パスの混合」であり、Yは1たたは2のいずれかです。

私は、解決策が「他のすべおのツヌルでこれを回避する」こずであるべきではないず本圓に思いたす。

1924は、 ninja_workdirアプロヌチに基づいた、テストによる完党に機胜する修正を瀺しおいたす。 これを䜿甚するゞェネレヌタヌは、䞊蚘のすべおの問題を解決できたす。

私も、それらを回避策ずは芋なしおいないためです。

これはGNUgccオプションではありたせん

Am 05.03.2021 um 16:58 schrieb Jan Niklas [email protected] 

IDEを修正するか、/ FChttps //docs.microsoft.com/de-de/cpp/build/reference/fc-full-path-of-source-code-file-in-diagnosticsたたは-fabs-を枡したすコンパむラぞのpath-diagnosticshttps //reviews.llvm.org/D23816 。

たた、デバッグ情報に蚘録されるパスに圱響を䞎える可胜性がありたす。

この問題を瀺すスクリプトは次のずおりですninja-bug.bash.txt

実際には、それは忍者の珟圚の振る舞いを瀺しおいたす。

あなたが匕甚した私の投皿は、これが珟圚文曞化されおいる動䜜であるこずを認めおいたす。
この問題の目的は、蚭蚈を問題にするこずです。
圹立たないナヌスケヌスのクラスを瀺したす。

2぀の問題...1...2...さらに説明が必芁です。

これらは、によっお解決が容易になる問題の2぀の䟋にすぎたせん。
絶察パスをツヌルに枡したす。 絶察パスは䞍合理ではありたせん
そのような特定のむンスタンスで他の゜リュヌションが利甚可胜であるずいう理由だけで
問題䞀郚のベンダヌから入手可胜なツヌルの特定の機胜を䜿甚。
絶察パスは、曎新なしでこれらの問題の倧芏暡なクラスを解決するのに圹立ちたす
生態系の残りの郚分に。 以前に投皿したように

盞察パスず絶察パスのメリットに぀いおは、氞遠に議論するこずができたす。 忍者はすべき
それに぀いおは意芋がありたせん。 ここでの問題は、次のような堎合の調敎です。
䞡方ずも単䞀のビルド内で䜿甚されたす。 ビルドシステムゞェネレヌタは垞に
ツヌルがパスで䜕をするかを制埡したす。

耇雑な実䞖界のビルドシステムでは、任意の数のレむダヌが存圚する可胜性がありたす
スクリプト、ラッパヌ、ツヌルなどあらゆる皮類のベンダヌからの
ビルドファむルゞェネレヌタによっおbuild.ninjaで曞き蟌たれたパスず実際のパス
depfileで忍者が遭遇したした。 特定のファむルを参照できる堎合がありたす
build.ninjaからのパスが盎接䞎えられおいないツヌルからのdepfile。
depfilesがNinjaの珟圚の蚭蚈で機胜するために、ツヌル党䜓
スタックは、 build.ninjaゞェネレヌタヌがどのように衚珟するかを正確に䌝える必芁がありたす
ビルドステヌトメントのこれらのパス、およびそれらを保持たたは倉換する機胜がありたす
同じようにそれら。 これは䞀般的に扱いにくいです。

忍者は小さなデザむン倉曎でこの問題を解決するこずができたす
build.ninjaに盞察パスを含むdepfileの絶察パスおよびその逆
逆。 同じファむルぞの任意のパスを調敎するように求めおいるのではなく、
depfileの/path/to/some/fileはのsome/fileず同じであるこずを認識しおください
ビルドファむル/path/to/build.ninja 。

そのような蚭蚈曎新の前䟋がありたす。 忍者が最初に始たったずき、垌望
パスは垞にたったく同じでninjaが遭遇するずいうこずでした
ビルドファむルゞェネレヌタが曞き蟌んだバむト単䜍の衚珟
build.ninja 。 git blame -M -C -w -- src/util.ccを実行し、履歎を確認したす
CanonicalizePathの
デザむン哲孊はリラックスしなければなりたせんでした。 これはそのような堎合の別のクラスです。

物事は私が同意しないずいうこずです

忍者はそれに぀いお意芋を述べるべきではありたせん。

そもそも。

これは䞀般的に扱いにくいです。

では、具䜓的な問題は䜕ですか 少し混乱しおすみたせん。

そもそも「Ninjaはそれに぀いお意芋を述べるべきではない」ずいう意芋には賛成できたせん では、具䜓的な問題は䜕ですか

これは特定の問題に関するものではなく、絶察パスを䜿甚しお解決するのがはるかに簡単な問題のクラス党䜓に関するものです。 開発者がツヌルに絶察パスを枡したい理由は関係ありたせん。特定のケヌスに圓おはたる理由が䜕であれ、絶察パスを䜿甚したいだけです。 ビルドシステムは、ポリシヌを指瀺するためではなく、ナヌザヌにサヌビスを提䟛するために存圚したす。 Ninjaはビルドシステムのアセンブリ蚀語であるず想定されおいたすが、混合スタむルのパスを䜿甚しおビルドシステムを衚珟する方法はありたせん。

Ninjaのアップストリヌム倉曎のポリシヌでは、問題を効率を損なうこずなく解決できる堎合は、Ninjaアップストリヌムではなく、ビルドファむルゞェネレヌタヌで問題を解決する必芁がありたす。 この堎合、ビルドファむルゞェネレヌタからのdepfileパスの汎甚ninja_workdirスタむルの調敎を提䟛する唯䞀の方法は、depfileを生成するすべおのコマンドの埌に、䞀臎するようにdepfile内のパスを修正する远加のコマンドを挿入するこずです。忍者がロヌドする前のビルドファむル。 その远加のコマンドには、1924よりもはるかに高い独自のランタむムコストがありたす ninjaプロセス内の少数の远加のメモリ内ルックアップ。 したがっお、汎甚の調敎は、䞊流の忍者で提䟛する方が効率的であり、含める候補です。

絶察パスず盞察パスを混圚させるのではなく、すべおに絶察パスを䜿甚する堎合でも、人間工孊䞊の厄介な問題がありたす。 ナヌザヌがninjaに、停のタヌゲットではなく特定の出力ファむルたずえば、 ninja out/my_executableやninja out/foo/bar.o を再生成するように芁求した堎合、絶察パスたたは忍者を枡すこずを忘れないでください。玛らわしい「䞍明なタヌゲット」゚ラヌで倱敗したす。 逆の問題も存圚したす。build.ninjaファむルが盞察パスを䜿甚しおいる堎合、ナヌザヌはninjaに絶察パスを再構築するように芁求する可胜性がありたす。

私が管理しおいるNinjaゞェネレヌタヌツヌルの1぀では、すべおのbuildステヌトメントに盞察パスずそれに察応する絶察パスの䞡方を出力ずしお含めるこずでこれを回避しおいたす。 それは機胜したすが、忍者の制限を回避するのは本圓にハックのように感じたす。 線集たた、build.ninjaが盞察パスのみを䜿甚し、別の絶察パスに移動した埌も機胜する堎合は、絶察パス゚むリアスを远加するずその機胜が損なわれたす。

確かに、これはdepfilesずたったく同じ問題ではありたせんが、Ninjaは䞀般的に絶察パスず盞察パスの同等性をよりよく認識しおいる必芁があるこずを瀺唆しおいたす。

@comexありがずう、それは有効な懞念です。 そのための新しい問題を開くこずができたすか

開発者がツヌルに絶察パスを枡したい理由は関係ありたせん[...]

同意したせん。

この堎合、depfileパスの汎甚ninja_workdirスタむルの調敎を提䟛する唯䞀の方法[...]

そもそもなぜninja_workdirスタむルの調敎が必芁なのですか

そもそもなぜninja_workdirスタむルの調敎が必芁なのですか

これにより、開発者は、制埡しないツヌルによっおdepfileで生成された絶察パスを凊理しながら、 build.ninjaで盞察パスを䜿甚できたす。 そうしないず、忍者の蚭蚈䞊の制限ず組み合わせおそのようなツヌルに察応するために、 build.ninjaで絶察パスを䜿甚するこずを䜙儀なくされる可胜性がありたす。 私の提案は、盞察パスの䜿甚を劚げるものではありたせん。 それはそれらのより倚くの䜿甚を可胜にしたす。

1924ず同じ調敎を実装するために1925を開きたしたが、 ninja_workdirバむンディングはありたせん。 これにより、depfileパスを調敎するずいう決定ず、シンボリックリンクを䜿甚しお論理workdirパスをサポヌトするずいう決定が分離されたす。

[...]制埡しないツヌルによっおdepfilesに生成される絶察パス。

そのようなツヌルの䟋はありたすか

䞖界䞭のすべおの人が䜿甚するすべおのツヌルの動䜜を予枬するこずはできたせん。 私たちが制埡するツヌルに぀いおも、絶察パスで簡単に解決できる䞊蚘のいく぀かのケヌスに぀いおはすでに説明したしたが、盞察パスで解決するにはツヌル固有のオプションず现心の泚意が必芁です。 同様の理由で、CMakeはいく぀かのケヌスで絶察パスを優先したす。 他のすべおのゞェネレヌタヌが実行しおいるのに、Ninjaゞェネレヌタヌがそれを実行しおいないずいうバグレポヌトがいく぀かありたす。 䟝存関係の問題を远跡するのに䜕時間も費やしたしたが、それはビルドマニフェストパスず調敎されおいないdepfileパスの別のむンスタンスであるこずがわかりたした。 ツヌルは、Ninjaが䟝存関係をキャプチャするために必芁な情報を提䟛したすが、Ninjaはそれを無芖したす。

あなたの立堎は、盞察的な道は普遍的に優れおいるずいう意芋ずしお出くわしたす。 他の人々は、堎合によっおは絶察パスの方が優れおいるずいう異なる意芋を持っおいたす。 盞察的なパスを䌝道するためのビルドツヌルの堎所ではないず思いたす。

私の提案は、忍者に少量のむンフラストラクチャを远加したす。 䜕が痛いの それを持たないこずは、はるかに倧きなコストを倖郚化したす。

はい、そうです

たた、絶察パスを䜿甚するず、cmakeは重耇するコンパむラむンクルヌドパスを排陀できたす。
これにより、ビルド時間が再び短瞮されたす。

午前09.03.2021um 19:20 schrieb Brad [email protected] 

盞察的なパスを䌝道するためのビルドツヌルの堎所ではないず思いたす。

Qtのクむックコンパむラで生成されたcppファむルで盎面しおいる問題に関しお、CMakeの問題を蚭定し、ナニティビルドを有効にしたした。 私の地元の調査によるず、忍者ははるかに高速なビルドシステムですが、この星座では信頌性がありたせん。 珟圚、回避策を芋぀けたり、ビルド時間の増加を正圓化する方法の問題に盎面しおいたす。

CMakeは、最近たでこの忍者の問題によっお隠されおいた埪環䟝存の問題に遭遇したした。 この問題が修正されおいれば、CMakeの問題をもっず早く発芋できたでしょう。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡