Ninja: Visual Studio 2010の䞭囜語版でビルドする堎合、倧量のむンクルヌドファむル通知

䜜成日 2013幎07月05日  Â·  32コメント  Â·  ゜ヌス: ninja-build/ninja

Visual Studio 2010の䞭囜語版を䜿甚しお忍者でクロムをビルドするず、コン゜ヌルりィンドりに倧量のむンクルヌドファむル通知が出力されるため、ビルドプロセスが倧幅に遅くなりたす。 通知は次のようなものです。

泚意文曞件ファむルパスを含める

英語に盞圓するものは次のずおりです。
泚ファむルを含む....。

おそらく忍者は英語の単語だけに基づいおむンクルヌド通知を削陀しおいたす。

bug windows

最も参考になるコメント

フランスの地元の忍者1.8.2ずCMake3.10.2でも、これはただ起こりたす...

党おのコメント32件

英語のむンストヌルでは、「泚ファむルを含むss \ n」がVC \ bin \ 1033 \ clui.dllの文字列テヌブルにリ゜ヌスずしお衚瀺されたす。

1033は、「英語米囜」のロケヌル識別子です。

残念ながら、clを1033ロケヌルに匷制するコマンドラむンオプションを知りたせん。 耇数のロケヌルがむンストヌルされおいる堎合は、システム蚭定を䜿甚しおどちらを䜿甚するかを決定するず思いたす。

したがっお、/ showIncludesパヌサヌのプレフィックス怜玢にさたざたな蚀語を远加する必芁があるず思いたす。 /

cmcldepsこの出力のCMakeパヌサヌは、「[^] +[^] +。*」のような正芏衚珟を䜿甚しお、showincludes出力のように芋えるすべおの出力行を取埗するず思いたす。 最終的にはそのようなものを実装したいず思っおおり、著䜜暩を䟵害したくないので、コヌドをあたり詳しく調べおいたせん。 :)

トリッキヌな郚分は、showincludesの出力ず譊告を混同しないこずです。 sfcheng、譊告たたぱラヌメッセヌゞを衚瀺するずきに、Visual Studio cl.exeの䞭囜語の出力を貌り付けるこずができたすか

のように芋えたすASCII 58ではないので、しわが远加される可胜性がありたす。 ゚ラヌになる可胜性のある行番号「\ d +」は、有甚なシグナルである可胜性がありたす。

残念ながら、clを1033ロケヌルに匷制するコマンドラむンオプションを知りたせん。

残念ながら、これを行うクリヌンな方法はありたせん。 VSの倖囜語バヌゞョンには、異なる数の他のロケヌルリ゜ヌスがありたすたずえば、JAの堎合は1041。
私たちが孊んだこず垞にVSのENバヌゞョンをむンストヌルし、必芁に応じお蚀語パックをむンストヌルしたす:(

しかし、幞いなこずに、「゚ラヌCnnnn」ず「譊告Cnnnn」はロヌカラむズされたせん。 したがっお、それらをキヌずしお䜿甚できたす。 しかし、 @ sgrahamが蚀ったように、行番号は 'note'出力を陀倖するこずもできるので、より有望に芋えたす。

がアスキヌ58ではないかどうかはわかりたせん。日本語版では、これらは確かにアスキヌ58です。

FWIW、日本語の出力は次のようになりたす。

C:\cygwin\home\oku>type main.c
#include <stdio.h>
int nah(void){}; /* Trigger "function must return a value */
main(){return nah();}

C:\cygwin\home\oku>cl /showIncludes main.c
Microsoft(R) C/C++ Optimizing Compiler Version 16.00.40219.01 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

main.c
メモ: むンクルヌド ファむル:  C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\stdio.h
メモ: むンクルヌド ファむル:   C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\crtdefs.h
メモ: むンクルヌド ファむル:    C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\sal.h
メモ: むンクルヌド ファむル:     c:\program files (x86)\microsoft visual studio10.0\vc\include\codeanalysis\sourceannotations.h
メモ: むンクルヌド ファむル:    C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\vadefs.h
メモ: むンクルヌド ファむル:   C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\swprintf.inl
c:\cygwin\home\oku\main.c(2) : warning C4716: 'nah' : 倀を返さなければいけたせん

関連アヌト https //bugzilla.mozilla.org/show_bug.cgiid = 587372アプロヌチenv varからプレフィックスを読み取り、autoconfチェックを行っお/ showIncludesの解析動䜜を確認したす。あたり良くありたせん。

mozillaのバグに䌌たアむデアトップレベルの倉数msvs_includes_prefixが存圚する可胜性があり、ゞェネレヌタヌは/ showIncludesを䜿甚しおダミヌの#include "knownheader.h"ファむルをコンパむルし、「knownheader.h」の前にあるものを曞き蟌むこずでそれを曞き蟌むこずができたす。そのトップレベル倉数ぞのcl.exe出力の "。 Ninjaは、msvs_includes_prefixを/ showIncludesプレフィックスずしお䜿甚したす。

CMakeが構成しおいる間、むンクルヌドプレフィックスは1぀のダミヌビルドから読み取られたす。
https://github.com/Kitware/CMake/blob/master/Modules/CMakeClDeps.cmake
正芏衚珟が䜿甚されおいる堎合、埌でプレフィックスが匕数ずしおツヌルに枡されたす。
https://github.com/Kitware/CMake/blob/master/Source/cmcldeps.cxx
std :: string :: substrは、cl.exe出力の凊理に䜿甚されたす。

忍者も远加のグロヌバルな議論を受け入れる必芁があるず思いたす。
ニコが提案したように

CMakeはたた、cmcldepsを䜿甚しお、䟝存関係ファむルを生成するclを䜿甚しお.rcファむルを最初に「コンパむル」し、次にrcツヌルで凊理するこずによっお.rcファむルの䟝存関係を生成したす。
これを忍者に統合できるかどうか、たたはどのように統合できるかはわかりたせん。

https://github.com/martine/ninja/pull/665

これは非ASCIIプレフィックスで機胜したすか

665がマヌゞされたす。 ただし、゚ンコヌディングの問題に぀いおはただ少し繰り返す必芁があるかもしれないので、これが機胜しおいるこずが確認されるたでこれを開いたたたにしおおきたす。

フランスの地元の忍者1.8.2ずCMake3.10.2でも、これはただ起こりたす...

665はmsvc_deps_prefixを远加したした。 cmakeはそれを蚭定したすか @syntheticpp @mathstuf

@nicoCMakeにコヌドがありたす。

Visual Studio Community15.9.7でただ発生しおいたす...

ちなみに、これは次の構成でただ発生しおいたす。
CMake 3.14
Ninja 1.8.2Visual Studio 2019に同梱されおいるもの
フランス語のロケヌル。

線集より良い回避策 CLに英語メッセヌゞを出力させるように環境にVSLANG=1033を蚭定したす。

叀い回避策
たた、この問題にぶ぀かった人のために、私の回避策は$CMAKE_PATH\share\cmake-3.14\Modules\Platform\Windows-MSVC.cmakeの次の行をコメントアりトするこず
#set(CMAKE_NINJA_DEPTYPE_${lang} msvc) 私の368行目

残念ながら、これによりCMakeはdeps行を削陀する代わりにdeps = gccを生成したすが、それは私のビルドを壊すようには芋えたせんでした。 YMMV。 これは回避策です。

deps = gccを蚭定しおも、 depfileを蚭定しなくおも、おそらく問題はありたせん。

@DrFrankensteinこのPRを忍者コヌドベヌスに適甚した埌、これを再珟しおみたせんか https://github.com/ninja-build/ninja/pull/1671

今週はやっおみたす

残念ながら、それはそれを修正したせんでした。

そのブランチから忍者をビルドし、そのバヌゞョンの忍者を䜿甚しお再床ビルドしたしたが、それでもむンクルヌドメッセヌゞがタヌミナルにリヌクされたした。
image

ここでの問題はMSVCむンクルヌドハンドラヌにあるように思われたす。

そのための文法はcl.exeからの出力を正しく認識しおいたせんか

䞊手...

ハヌドコヌドされた英語の問題のようです。

https://github.com/ninja-build/ninja/blob/master/src/clparser.cc

string CLParser::FilterShowIncludes(const string& line,
                                    const string& deps_prefix) {
  const string kDepsPrefixEnglish = "Note: including file: ";
  const char* in = line.c_str();
  const char* end = in + line.size();
  const string& prefix = deps_prefix.empty() ? kDepsPrefixEnglish : deps_prefix;
  if (end - in > (int)prefix.size() &&
      memcmp(in, prefix.c_str(), (int)prefix.size()) == 0) {
    in += prefix.size();
    while (*in == ' ')
      ++in;
    return line.substr(in - line.c_str());
  }
  return "";
}

@DrFrankenstein

関数の䞊郚にある英語の接頭蟞をいじっお、それがもっずうたくいくかどうかを確認したいず思いたすか

ハ 私は実際に明日そこを芋る぀もりでした。 私がチャンスを埗る前にあなたがそれを捕たえたようです。

私はちょうど倜のために私のコンピュヌタをシャットダりンしたした。 明日お返事したす

ただし、 deps_prefixは、rules.ninjaファむル通垞はCMakeによっお怜出および蚭定されたすで蚭定されおいるロヌカラむズされた文字列が含たれおいる必芁がありたす。 存圚しない堎合にのみ、ハヌドコヌドされたものを䜿甚したす。

それが実際の犯人であるかもしれない盎埌の論理を私は疑う。 しかし、私が蚀ったように、私は明日適切な調査/デバッグセッションを行いたす。

゚ンコヌディングが䞀臎したせん。 deps_prefixはLatin-1コロンの前のNBSPは0xA0であり、 lineは䜕らかの理由でCP437にありたすNBSP = 0xFF。
image

CL自䜓がCP437を出力しおいるず思いたすが、CMakeで生成されたrules.ninjaはLatin-1です。 CMake偎で倉換が発生したず思いたすが、さらに掘り䞋げる必芁がありたす。

線集CLはコン゜ヌルのコヌドペヌゞが䜕であれ出力するようです。 ゜ヌス1 、゜ヌス2 。 どうすればそれを他のものにするこずができるのかわかりたせん。

おそらく、CL出力でMultiByteToWideChar(CP_OEMCP, ...)を呌び出し、 MultiByteToWideChar(1252, ...)呌び出すなどしお、䞡方をUTF-8たたはNinjaが䜿甚するこずを奜むものなどの䞀般的な゚ンコヌディングに倉換するこずで、2぀をたずめるこずができたす。 rules.ninjaからの文字列。

これを振り返っお...これはCMakeのせいかもしれたせん。 Windowsでは、 execute_processコマンドはコマンドの出力を内郚でUTF-8に倉換するようです出力の゚ンコヌディングを指定するためにオプションのENCODINGパラメヌタヌを受け入れたす。 したがっお、それをUTF-8のrules.ninjaファむルに曞き戻したすNBSPは0xA0であり、0xFFではありたせん。

CMAKE_DETERMINE_MSVC_SHOWINCLUDES_PREFIXをENCODING NONE CMAKE_DETERMINE_MSVC_SHOWINCLUDES_PREFIXを䜿甚するように倉曎しようずしたした倉換を実行したせんが、CMakeのあらゆる皮類のものを壊したようです。

だから私が今持っおいる質問は...忍者のmsvc_deps_prefixがコンパむラの出力のビット単䜍の䞀臎であるか、それずもファむルが期埅される゚ンコヌディングであるか、その堎合は忍者のコンパむラ出力から適切な倉換を行うための仕事

@bradkingここで゚ンコヌディングずプレフィックス怜出に぀いお考えおいたすか

歎史的に、忍者ぱンコヌディングにずらわれたせんでした゚ンコヌディングが '/'にASCIIず同じバむトを䜿甚しおいる限り。 ただし、Windowsはそれを困難にする可胜性がありたす。

NinjaのCLParser::FilterShowIncludesはmemcmpを䜿甚しおmsvc_deps_prefixをMSVCの出力の行ず比范しおいるため、実際に倀はビット単䜍で䞀臎する必芁がありたす。 CMakeはそれを維持するためにいく぀かの䜜業が必芁な堎合がありたす。 CMakeは珟圚内郚でUTF-8に倉換するため、おそらく䞍足しおいるのは、倀をbuild.ninjaに曞き蟌むずきにコヌドペヌゞの゚ンコヌディングに倉換し盎すこずだけです。

IIRC、MSVCの出力゚ンコヌディングは、環境倉数やフラグの圱響を受ける可胜性がありたす。 ぀たり、Ninjaが動䜜し、 build.ninja文字列を解釈するために䜿甚しおいるコヌドペヌゞずは異なる゚ンコヌディングでコンパむラ出力が生成される可胜性がありたす。 このような堎合は、忍者からの远加のサポヌトが必芁になる堎合がありたすが、さらに調査する必芁がありたす。

CLが䜿甚するコヌドペヌゞに圱響を䞎える環境倉数が芋぀かりたせんでした。 プロセスに関連付けられたコヌドペヌゞシステムの地域蚭定、たたはプロセスが1぀で実行されおいる堎合はコン゜ヌル蚭定に基づくを䜿甚しおいるだけだず思いたす。

ただし、CLで䜿甚される蚀語VSLANGを蚭定する環境倉数がありたす。これは、このバグの圱響を受けるナヌザヌの回避策ずしお圹立ちたす。 忍者ファむルを生成する前にVSLANG=1033蚭定するず、バグの発生を防ぐこずができたす。

䞊蚘のコメントを別の蚀葉で蚀い換えるず、Ninjaは入力ファむルを゚ンコヌドなしのバむトずしお扱い、文字列の゚ンコヌドに䟝存しないバむト比范を行っお、これらの問題を回避しようずしたす。 build.ninjaファむルに衚瀺されるバむトは、ninjaがプロセスstdoutから読み取るバむトず䞀臎する必芁がありたすが、ninjaぱンコヌドを気にしたせん。

CMakeがすべおのビルドファむルを生成した埌、 rules.ninjaをmsvc_deps_prefix = 泚意: 包含文件:行を含むUTF-8に手動で倉換したずころ、問題が修正されたした。 そのファむルは、デフォルトのコヌドペヌゞ936に察応するGB2312゚ンコヌディングでした。CMakeに倉曎を加えお、垞にrules.ninjaをUTF-8に倉換できるず思いたすか

コヌドペヌゞ936たたは65001以倖のロケヌルでの䜜業経隓はないので、䞊蚘の解決策が普遍的な修正であるかどうかはわかりたせん。

同じ問題があり、CMAKE_CXX_FLAGSで/ W3の代わりに/ W2を远加しおこの出力を消去するこずができたす

これは1766に関連しおいたす

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