[UBT]Target.csとBuild.csをUE4.16へ移行させる

はじめに

UE4.16でTarget.csとBuild.csの記述方法が変更されました。4.16より前のコードプロジェクトをバージョンアップする場合は、変更箇所を修正する必要があります。具体的な変更箇所を確認する方法としては、以下が参考になります。
  1. ビルド時のエラーログを参照する
  2. リリースノートを確認する
  3. 4.15と4.16のコードプロジェクトを作成し、両者を比較する
今回は、3の方法で変更点をまとめます。

Target.csの変更点

まず、Target.csの変更点です。Target.csはデフォルトでGameとEditorの2タイプが生成されますが、生成直後の2つに違いはほとんどないので、今回はGameタイプのみを扱います。Target.csについてのドキュメントはここにありました。
まず、UE4.15でのTarget.cs(以降、415T.csと略します)は以下のようになっています。

// Fill out your copyright notice in the Description page of Project Settings.
using UnrealBuildTool;
using System.Collections.Generic;
public class CPP415to416ATarget : TargetRules
{
public CPP415to416ATarget(TargetInfo Target)
{
Type = TargetType.Game;
}
//
// TargetRules interface.
//
public override void SetupBinaries(
TargetInfo Target,
ref List<UEBuildBinaryConfiguration> OutBuildBinaryConfigurations,
ref List<string> OutExtraModuleNames
)
{
OutExtraModuleNames.AddRange( new string[] { "CPP415to416A" } );
}
}

次に、UE4.16でのTarget.cs(以降、416T.csと略します)は以下のようになっています。

// Fill out your copyright notice in the Description page of Project Settings.
using UnrealBuildTool;
using System.Collections.Generic;
public class CPP415to416BTarget : TargetRules
{
public CPP415to416BTarget(TargetInfo Target) : base(Target)
{
Type = TargetType.Game;
ExtraModuleNames.AddRange( new string[] { "CPP415to416B" } );
}
}

コードがかなり違うことが確認できると思います。1つずつ変更点を確認します。

コンストラクタで基底クラスのコンストラクタが呼び出されるように変更

415T.csと416T.csの8行目を注目してください。416T.csでは、コンストラクタの後ろにbase(Target)が追加され、基底クラスのコンストラクタが呼び出されるように変更されました。

SetupBinariesの廃止

415T.csの17行目以降にあるSetupBinaries関数は廃止され、ここで行っていた処理は、コンストラクタで行われるように変更されました。

プロパティの移行

SetupBinariesで参照渡しされていた引数OutBuildBinaryConfigurationsとOutExtraModuleNamesは、接頭辞のOutを取り除いたプロパティBuildBinaryConfigurationsとExtraModuleNamesに変更されました。415T.csの23行目と416T.csの12行目がそれぞれ対応すると考えると理解しやすいです。

Build.csの変更点

次に、Build.csの変更点です。Build.csについてのドキュメントはここにありました。
まず、UE4.15でのBuild.cs(以降、415B.csと略します)は以下のようになっています。

// Fill out your copyright notice in the Description page of Project Settings.
using UnrealBuildTool;
public class CPP415to416A : ModuleRules
{
public CPP415to416A(TargetInfo Target)
{
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
PrivateDependencyModuleNames.AddRange(new string[] { });
// Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
// Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
}
}

次に、UE4.16でのBuild.cs(以降、416B.csと略します)は以下のようになっています。

// Fill out your copyright notice in the Description page of Project Settings.
using UnrealBuildTool;
public class CPP415to416B : ModuleRules
{
public CPP415to416B(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
PrivateDependencyModuleNames.AddRange(new string[] { });
// Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
// Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
}
}

それほど変更点はないように見えます。1つずつ変更点を確認します。

コンストラクタの記述を変更

415B.csと416B.csの7行目を注目してください。Target.csのときと同様に、基底のコンストラクタ呼び出しを行うbase(Target)が追加されました。
また、コンストラクタが受け取る引数の型が、TargetInfoからReadOnlyTargetRulesに変更されました。

デフォルトでPCHUsageを変更するようコードを追加

416B.csの9行目に注目してください。これは移行に必須な事柄というわけではありませんが、UE4.16ではデフォルトでPCHUsageプロパティを変更するコードが追加され、プリコンパイル済みヘッダのインクルードが不要になりました。PCHUsageとは、プリコンパイル済みヘッダ使用するかどうかを指定するプロパティのことで、プリコンパイル済みヘッダとは、コードプロジェクト作成時に生成される<プロジェクト名>.hとなっているヘッダを指します。
参考までに、コードプロジェクト作成時にデフォルトで生成されるMyGameModeBaseクラスの.cppファイルにおけるインクルードがどのように記述されているかを比較してみます。まず、UE4.15でのMyGameModeBase.cpp(以降、415G.cppと略します)は以下のようになっています。

// Fill out your copyright notice in the Description page of Project Settings.
#include "CPP415to416A.h"
#include "CPP415to416AGameModeBase.h"
次に、UE4.16でのMyGameModeBase.cpp(以降、416G.cppと略します)は以下のようになっています。

// Fill out your copyright notice in the Description page of Project Settings.
#include "CPP415to416BGameModeBase.h"
このように、415G.cppの3行目でインクルードされていたプリコンパイル済みヘッダが、416G.cppでは記述されていません。これは、4.16以降ではプリコンパイル済みヘッダの使用があまり推奨されていないということを意味しているのかもしれません(IWYUの方針と関係があるとか?)。
話は戻りますが、4.16でPCHUsage変更コードが追加されたとはいえ、移行プロジェクトで無理にこれを追加する必要はありません。仮に追加すると、プロジェクト内の多くの.cppファイルからプリコンパイル済みヘッダを取り除く手間が発生します。移行だけを考えるのならば、コンストラクタ内の実装はそのままでよいかと思います。

おわりに

このように、UE4.16ではTarget.csとBuild.csの記述方法が変更されました。今後もコードプロジェクトをバージョンアップし続ける予定ならば、早い段階で最新のものに変更するとよいかもしれません。


この記事は次のバージョンで作成されました。
Microsoft Visual Studio Community 2017 Version 15.1 (26403.7)

コメント