お世話になっております
UE5.6.1でHordeを利用してDebugGameEditorでソリューションのリビルドをすると、Unreal Header Toolによって自動生成された.gen.cppの一部ファイルで以下のエラーが出ます
error C4821: Unicode エンコードの種類を指定できません。シグネチャ (BOM) つきファイルを保存してください。
これはローカルPCがビルドコントローラーとワーカーの両方を務める場合にのみ発生しました
(自身のPC内でリビルドを完結させたり、自身にタスクが割り振られなかった場合はこのエラーは出ません)
なぜこのエラーが、自身のPCがビルドコントローラーとワーカーを兼ねる場合にのみ発生するのでしょうか?
また、この現象の根本原因(ビルドツールの設定不足、または環境設定の問題など)と、その解決策をご教示いただけませんでしょうか。
お手数をおかけしますが、ご回答のほどよろしくお願い申し上げます。
Ken.Kuwano
(Ken.Kuwano)
2
お世話になっております。
ご返答が遅くなってしまい申し訳ございません。まず社内で同様の問題が起きてないかを確認してみましたが、特に同じエラーの報告や修正が行われたログなどは見つかりませんでした。おそらく環境要因か実行環境による違いで発生する/しないがあるものと推測されます。ここで発生している error C4821: Unicode エンコードの種類を指定できません。シグネチャ (BOM) つきファイルを保存してください。 は、MSVC がその翻訳単位(ここでは一部の *.gen.cpp)の文字コードを確定できないときに出るものですが、“ソースが UTF-16/UTF-32 なのに BOM"が無い、もしくは"ソースが 途中で壊れて(先頭数バイトが欠落/NULL混入) 文字コードが判別できない” のどちらかが発生しているものと思われます。
ここで自身がコントローラとワーカーを兼ねる条件においてのみ発生しているようですので、後者の可能性が高く、その原因は以下のようなことが想定されます。
・ファイル共有の競合状態:同一PC上でコントローラーとワーカーが同時にファイルにアクセスし、ファイルの読み書きタイミングでエンコーディング情報が失われる
・プロセス間通信の制約:ローカルプロセス間でのファイル転送時にエンコーディング情報が保持されていない
・キャッシュ機構の影響:ローカルビルド時のキャッシュ機構がエンコーディング情報を正しく処理していない
少なくとも、一番早い解決方法としては自身のPCをワーカーとして参加させないことで、ForeRemoteでリモートビルドを強制したり、UnrealToolBoxでローカルのワーカーをDisableにするなどの方法が挙げられます。根本的に競合が原因で問題が発生するようであれば、その問題を更に調べるために追加での調査を必要とします。
・この問題が特定のファイルだけで発生しているか?(特定のファイルが原因で発生しているものか?)
・この問題が自身の環境だけで発生しているか?(他の人の環境では発生していないか?)
・この問題を他の環境でも再現できるか?(特定のプロジェクトに依存するものではなく、弊社の環境でも再現できるような実行環境でしょうか?)
コンパイラオプション(/utf-8)によって生成されるファイルを強制的に UTF8-BOMにすることも可能ではありますが、これがどのようなプロジェクトでも発生するような場合はHordeの分散ビルドによるファイル競合が発生していることを更に調べたいと思います。
ご回答ありがとうございます
こちらの件ですが、回答を参照した上でキャッシュが影響しているのかもと思い、ビルドが失敗していたPCで
・C:\HordeAgent\Sandbox以下のフォルダ
・プロジェクトのIntermediateフォルダ
を削除した上でプロジェクトファイルを再生成後、リビルドをしたら問題が解消致しました
分散ビルド環境の検証中にビルドキャンセルを行っていたため、もしかしたらそれの影響かもしれません
原因は未だ分からないため、こちらで規模を拡大して検証してみようと思います
Ken.Kuwano
(Ken.Kuwano)
4
ご連絡頂きありがとうございます。
確かにビルドのキャンセルに伴い中途半端に作成された中間ファイルが原因だとした場合、上記のフォルダを削除した上でクリーンな状態からビルドを行うと破損したファイルもクリーンアップされて問題が解消されることは考えられます。もし本件の状況が再現してその状況が再現可能な場合、こちらでも修正が可能か(オペレーションで回避する必要があるものか)どうかを検証したいと思います。