역자의 말.
확실히 FASTBUILD 는 중국쪽에서 업데이트가 많군요. 제 기억에 텐센트에서도 사용한다고 알고 있었거든요. 아무튼... 확실히 더 깔끔하게 정리 하시고 일부 수정해서 프리빌드 해서 올려주시는 중국분이 있어서 ... 공유 해 보고자 합니다.
엮인 글.
새로 포스팅 된 이 글을 활용하여 잘 안되시는 경우에는 엮인 글 위주로 테스트 해 보세요.
원문
使用 FASTBuild 编译 UE4 和 UE5 - Disenone's Wiki
이 글의 방법은 UE4.27 - UE5.3을 지원하는 것으로 테스트되었으며, 다른 버전은 테스트되지 않았으니 시도해 보세요.
서문
FASTBuild는 무료 오픈 소스 분산 컴파일 툴로, UE 컴파일은 상대적으로 시간이 많이 걸리는데, FASTBuild를 사용할 수 있다면 시간을 크게 줄일 수 있습니다.
4.x부터 UE는 FASTBuild를 지원할 수 있으며, 공식 소스 코드는 FASTBuild 0.99 버전에 기반한 수정된 FASTBuild 툴과 함께 제공되며, Engine\Extras\ThirdPartyNotUE\FASTBuild의 위치는 UE5.3에서도 이 버전을 사용하고 있습니다. 이 글을 작성하는 시점에 최신 공식 버전은 1.11로, 새로운 기능과 버그 수정이 더 많이 포함되어 있습니다. 이 글에서는 1.11 버전을 사용하여 UE4와 UE5를 모두 지원하는 방법을 문서화하는 데 중점을 둡니다.
간단한 구성
이를 위해서는 FASTBuild 1.11과 UE 소스 코드를 약간 변경해야 합니다. 여기서는 이미 모든 수정을 완료했기 때문에 제가 수정한 버전을 그대로 사용하면 됩니다.
패스트빌드는 제가 제출한 최신 버전을 다운로드하며, 여기에는 실행 파일인 FBuild.exe, FBuildCoordinator.exe, FBuildWorker.exe가 포함되어 있습니다. 명확성을 위해 FBuild.exe를 사용하여 프로그래밍을 수행하는 머신을 로컬 머신, 편집에 참여할 CPU를 제공하는 다른 원격 머신을 원격 머신이라고 부르도록 하겠습니다. 원격 머신.
로컬 구성
시스템 환경 변수 Path에 FBuild.exe가 있는 디렉터리를 추가하고 cmd에서 FBuild.exe를 직접 실행할 수 있는지 확인합니다.
캐시 공유 디렉터리 구성(캐시를 생성할 필요가 없는 경우 그대로 두어도 됩니다): 빈 디렉터리를 공유 경로로 설정하고 원격 머신에서 액세스할 수 있는지 확인합니다.
로컬 UE4 / UE5 소스 프로젝트를 열고 빌드 환경설정 파일 Engine\Saved\UnrealBuildTool\BuildConfiguration.xml 을 다음과 같이 수정합니다:
<?xml version="1.0" encoding="utf-8" ?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
<BuildConfiguration>
<bAllowFASTBuild>true</bAllowFASTBuild>
</BuildConfiguration>
<FASTBuild>
<bEnableDistribution>true</bEnableDistribution>
<bEnableCaching>true</bEnableCaching>
<FBuildCachePath>\\127.0.0.1\Cache\</FBuildCachePath>
<FBuildCoordinator>127.0.0.1</FBuildCoordinator>
</FASTBuild>
</Configuration>
앞서 다운로드한 FBuildCoordinator.exe를 로컬에서 실행합니다.
원격 머신 구성
또한 캐시를 구성하되, 192.168.1.100으로 가정되는 로컬 IP로 지정해야 한다는 점을 제외하고 - FASTBUILD_CACHE_PATH: \192.168.1.100\Cache - FASTBUILD_CACHE_MODE: rw
또한 코디네이터 IP 구성 - FASTBUILD_COORDINATOR: 192.168.1.100
구성은 다음과 같습니다.
원격 머신에서 FBuildWorker.exe를 실행하고 구성이 성공하면 로컬 머신의 FBuildCoordinator.exe에 로그가 출력되는 것을 확인할 수 있습니다(여기서 192.168.1.101은 원격 머신의 IP입니다):
FBuildCoordinator - v1.11-UE
[2023-12-01-20:06:38] Listening on port 31392
[2023-12-01-20:06:38] current [0] workers: []
[2023-12-01-20:06:42] New worker available: 192.168.1.101
[2023-12-01-20:06:42] current [1] workers: [192.168.1.101]
UE 컴파일 테스트
구성이 정상이면 다음과 비슷한 로그를 볼 수 있습니다. 비주얼스튜디오에서 UE 소스 프로젝트 sln 을 열고 C++ 프로젝트를 선택한 다음 리빌드를 클릭합니다.
11>FBuild Command Line Arguments: '-monitor -summary -dist -cache -ide -j12 -clean -config "E:\UE\ue5.3_git\Engine\Intermediate\Build\fbuild.bff" -nostoponerror
11>FBuild Executable: 'd:\libs\FASTBuild\bin\FBuild.exe
11>FBuild Coordinator: '127.0.0.1
11>FBuild BrokeragePath: '\\127.0.0.1\Brokerage\
11>FBuild CachePath: '\\127.0.0.1\Cache\
11>BFF file 'E:\UE\ue5.3_git\Engine\Intermediate\Build\fbuild.bff' has changed (reparsing will occur).
11>Using Coordinator: 192.168.88.187
11>Requesting worker list from Corrdinator
11>Get Worker List from Coordinator.
11>2 workers in payload: [192.168.1.101]
11>Worker list received: 1 workers
11>Distributed Compilation : 1 Workers in pool '127.0.0.1'
FASTBuild가 원격 머신의 IP를 찾아 원격 머신으로 빌드를 전송하기 시작합니다. 또한 원격 머신의 FBuildWorker에서 현재 실행 중인 빌드 작업이 있음을 확인할 수 있습니다.
고급 구성
이전 버전의 UE 지원
UE 에 FASTBuild 툴(Engine\Extras\ThirdPartyNotUE\FASTBuild)이 없고 UnrealBuildTool 프로젝트에 FASTBuild.cs 파일이 없는 경우, 사용 중인 UE 버전이 아직 FASTBuild 를 지원하지 않을 확률이 매우 높습니다.
그런 다음 UE4.27 의 소스 코드를 참조하여 비슷한 FASTBuild.cs 를 생성하고 다른 관련 코드 변경 사항을 추가해야 하는데, 여기서는 설명하지 않습니다.
나만의 FASTBuild 컴파일
FASTBuild 자체에 관심이 있거나 약간의 수정을 하고 싶다면 FASTBuild로 컴파일을 시도해 보세요.
최신 소스 코드를 다운로드하여 압축을 풉니다.
External\SDK\VisualStudio\VS2019.bff를 수정하고 .VS2019_BasePath 및 .VS2019_Version을 로컬 버전으로 변경합니다(예: .VS2019_BasePath\Tools\MSVC 디렉터리에서 찾을 수 있음).
.VS2019_BasePath = 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC' // <-- Set path here
.VS2019_Version = '14.29.30133' // <-- Set version here
.VS2019_MSC_VER = '1929' // <-- Set MSC_VER here
외부\SDK\윈도우\윈도우10SDK.bff의 .Windows10_SDKBasePath 및 .Windows10_SDKVersion을 수정하고, 버전은 .Windows10_SDKBasePath/bin에서 확인할 수 있습니다:
.Windows10_SDKBasePath = 'C:\Program Files (x86)\Windows Kits/10' // <-- Set path here
.Windows10_SDKVersion = '10.0.19041.0' // <-- Set version here
.VS2019_BasePath\Tools\Tools/LLVM/x64에서 External\SDK\Clang\Windows\Clang11.bff의 .Clang11_BasePath 및 .Clang11_Version을 수정합니다.
Code 디렉터리에 들어가서 cmd에서 FBuild.exe All-x64-Release를 실행하고, 구성이 정상이라면 컴파일에 성공했음을 확인할 수 있으며, tmp\x64-Release\Tools\FBuild\FBuild에서 FBuild.exe를 확인할 수 있습니다.
FBuild.exe All-x64-Release -dist -coordinator=127.0.0.1을 사용하면 분산 컴파일을 활성화할 수 있습니다.
FBuild 추가 옵션
내가 제공하는 FBuild는 기본적으로 다음과 같은 일반적인 옵션을 지원합니다:
코디네이터: 코디네이터 IP 주소를 지정합니다(시스템 환경 변수 값을 재정의할 수 있음).
브로커리지: 브로커리지 주소를 지정합니다(시스템 환경 변수 값을 재정의할 수 있음).
nocache: 캐시를 강제로 사용하지 않음
dist: 분산 컴파일 활성화
forceremote: 원격 컴퓨터에서 강제로 컴파일하기
summary: 편집 후 통계 출력
더 많은 옵션을 보려면 FBuild.exe -help를 실행하면 됩니다.
FBuildWorker에서 일반적으로 사용되는 옵션은 다음과 같습니다:
코디네이터: 코디네이터의 IP 주소를 지정합니다(시스템 환경 변수 값을 재정의할 수 있음).
브로커리지: 브로커리지 주소를 지정합니다(시스템 환경 변수를 재정의할 수 있음).
nocache: 캐시를 사용하지 않습니다.
cpus: 컴파일을 위해 할당할 코어 수를 지정합니다.
더 많은 옵션은 FBuildWorder.exe -help를 실행하면 확인할 수 있습니다.
UE와 함께 제공되는 FASTBuild.cs를 수정합니다.
UE의 FASTBuild.cs 는 시스템 환경 변수를 잘 처리하지 못하는데, 그 중 상당수는 BuildConfiguration.xml 에 지정된 파라미터와 관련하여 선호되는 것으로, 이는 명백히 BuildConfiguration.xml 에 사용된 로직과 반대되는 것입니다.
따라서 관련 코드를 다음과 같이 변경할 수 있으며, 여기서는 UE5.3을 예로 들어 보겠습니다:
private bool ExecuteBffFile(string BffFilePath, ILogger Logger)
{
string CacheArgument = "";
if (bEnableCaching)
{
switch (CacheMode)
{
case FASTBuildCacheMode.ReadOnly:
CacheArgument = "-cacheread";
break;
case FASTBuildCacheMode.WriteOnly:
CacheArgument = "-cachewrite";
break;
case FASTBuildCacheMode.ReadWrite:
CacheArgument = "-cache";
break;
}
}
else
{
CacheArgument = "-nocache";
}
string DistArgument = bEnableDistribution ? "-dist" : "";
string ForceRemoteArgument = bForceRemote ? "-forceremote" : "";
string NoStopOnErrorArgument = bStopOnError ? "" : "-nostoponerror";
string IDEArgument = IsApple() ? "" : "-ide";
string MaxProcesses = "-j" + ((ParallelExecutor)LocalExecutor).NumParallelProcesses;
// Interesting flags for FASTBuild:
// -nostoponerror, -verbose, -monitor (if FASTBuild Monitor Visual Studio Extension is installed!)
// Yassine: The -clean is to bypass the FASTBuild internal
// dependencies checks (cached in the fdb) as it could create some conflicts with UBT.
// Basically we want FB to stupidly compile what UBT tells it to.
string FBCommandLine = $"-monitor -summary {DistArgument} {CacheArgument} {IDEArgument} {MaxProcesses} -clean -config \"{BffFilePath}\" {NoStopOnErrorArgument} {ForceRemoteArgument}";
Logger.LogInformation("FBuild Command Line Arguments: '{FBCommandLine}", FBCommandLine);
string FBExecutable = GetExecutablePath()!;
Logger.LogInformation("FBuild Executable: '{FBExecutable}", FBExecutable);
string WorkingDirectory = Path.GetFullPath(Path.Combine(Unreal.EngineDirectory.MakeRelativeTo(DirectoryReference.GetCurrentDirectory()), "Source"));
ProcessStartInfo FBStartInfo = new ProcessStartInfo(FBExecutable, FBCommandLine);
FBStartInfo.UseShellExecute = false;
FBStartInfo.WorkingDirectory = WorkingDirectory;
FBStartInfo.RedirectStandardError = true;
FBStartInfo.RedirectStandardOutput = true;
string? Coordinator = GetCoordinator();
if (!String.IsNullOrEmpty(Coordinator))
{
Logger.LogInformation("FBuild Coordinator: '{Coordinator}", Coordinator);
FBStartInfo.EnvironmentVariables["FASTBUILD_COORDINATOR"] = Coordinator;
}
string? BrokeragePath = GetBrokeragePath();
if (!String.IsNullOrEmpty(BrokeragePath))
{
Logger.LogInformation("FBuild BrokeragePath: '{BrokeragePath}", BrokeragePath);
FBStartInfo.EnvironmentVariables["FASTBUILD_BROKERAGE_PATH"] = BrokeragePath;
}
string? CachePath = GetCachePath();
if (!String.IsNullOrEmpty(CachePath))
{
Logger.LogInformation("FBuild CachePath: '{CachePath}", CachePath);
FBStartInfo.EnvironmentVariables["FASTBUILD_CACHE_PATH"] = CachePath;
}
...
BuildConfiguration.xml 고급 구성
<?xml version="1.0" encoding="utf-8" ?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
<ProjectFileGenerator>
<!-- 指定vs版本 -->
<Format>VisualStudio2022</Format>
</ProjectFileGenerator>
<BuildConfiguration>
<!-- 开启 FASTBuild -->
<bAllowFASTBuild>true</bAllowFASTBuild>
<!-- 指定本机参与编译的 cpu 核数 -->
<MaxParallelActions>12</MaxParallelActions>
<!-- 关闭 Incredibuild -->
<bAllowXGE>false</bAllowXGE>
</BuildConfiguration>
<FASTBuild>
<!-- 指定 FBuild 路径 -->
<FBuildExecutablePath>d:\libs\FASTBuild\bin\FBuild.exe</FBuildExecutablePath>
<!-- 开启分布式编译 -->
<bEnableDistribution>true</bEnableDistribution>
<!-- 指定 brokerage 路径 -->
<FBuildBrokeragePath>\\127.0.0.1\Brokerage\</FBuildBrokeragePath>
<!-- 指定 cache 路径 -->
<FBuildCachePath>\\127.0.0.1\Cache\</FBuildCachePath>
<!-- 开启 cache -->
<bEnableCaching>true</bEnableCaching>
<!-- cache 的读写权限 Read/Write/ReadWrite -->
<CacheMode>ReadWrite</CacheMode>
<!-- 指定 coordinator ip -->
<FBuildCoordinator>192.168.88.187</FBuildCoordinator>
<!-- 强制远程编译 -->
<!-- <bForceRemote>true</bForceRemote> -->
</FASTBuild>
</Configuration>
이 게시물은 CC BY-NC-SA 4.0에 따라 보호됩니다.
'TECH.ART.FLOW.IO' 카테고리의 다른 글
[주석번역]ADVENTURES WITH DEFERRED TEXTURING IN HORIZON FORBIDDEN WEST 파트-1 (0) | 2023.12.26 |
---|---|
[주석번역/PPT한글화]horizon forbidden west 공간 효율적 패키징 (1) | 2023.12.21 |
바이트덴스 조석광년 SGR 테크아트팀 구조. (0) | 2023.12.14 |
[주석번역] RDG 101 A Crash Course (0) | 2023.12.14 |
[번역]Why Talking About Render Graphs (1) | 2023.12.12 |