UBT erroneously compiles unchanged C++ files again on every build when bUseUnityBuild is set to false in the BuildConfiguration.xml

Summary

Since UE 5.8.1 (maybe also 5.8.0) the bUseUnityBuild flag set to false in the BuildConfiguration.xml with 100% repro recompiles all files every time even if they are unchanged. This worked previously correctly in UE 5.7.X

What Type of Bug are you experiencing?

Foundation (C++ Tools, Profiling, & Pipeline)

Steps to Reproduce

  1. Create a new Unreal Engine sample project, e.g. TopDown sample as C++ project
  2. under Saved/UnrealBuildTool/BuildConfiguration.xml
    Add <bUseUnityBuild>false</bUseUnityBuild> like this:
<?xml version="1.0" encoding="utf-8" ?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
    <BuildConfiguration>
        <bUseUnityBuild>false</bUseUnityBuild>
    </BuildConfiguration>
</Configuration>
  1. Build the project in Rider , Visual Studio or any other IDE.
  2. Observe: It compile X file. Build succeeded
  3. Build again
  4. Observe: It compile X files again.

Expected Result

It should not compile all files again when they did not change…

Observed Result

All files compile again despite no change whatsoever
Only occurs since 5.8 and only with the build config flag. The flag set to turn off unity buulds in *.cs files seems to work correctly.

Also this seems wrong:
Creating makefile for UE58test2Editor (no existing makefile)
this appears in the log every time

Full build log:

CONSOLE: C:\Program Files\Epic Games\UE_5.8\Engine\Build\BatchFiles\Build.bat  UE58test2Editor Win64 Development -Project="C:\Users\L\Documents\Unreal Projects\UE58test2\UE58test2.uproject" -WaitMutex  -FromMSBuild
0>Using bundled DotNet SDK version: 10.0 win-x64
0>Running UnrealBuildTool: dotnet "..\..\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" UE58test2Editor Win64 Development -Project="C:\Users\L\Documents\Unreal Projects\UE58test2\UE58test2.uproject" -WaitMutex  -FromMSBuild
0>Log file: C:\Users\L\AppData\Local\UnrealBuildTool\Log.txt
0>Determining max actions to execute in parallel (16 physical cores, 32 logical cores)
0>  Executing up to 16 processes, one per physical core
0>  Requested 1.5 GB memory per action, 19.57 GB available: limiting max parallel actions to 13
0>Creating makefile for UE58test2Editor (no existing makefile)
0>UbaServer - Listening on 0.0.0.0:1345
0>CppDependencyCache - There is no partition covering path to C:\Users\L\Documents\Unreal Projects\UE58test2\Intermediate\Build\Win64\x64\UE58test2Editor\Development\UnrealEd\SharedPCH.UnrealEd.Project.ValApi.ValExpApi.Cpp20.h.dep.json!
0>Building UE58test2Editor...
0>===== Toolchain Information =====
0>Using ISPC compiler (C:\Program Files\Epic Games\UE_5.8\Engine\Source\ThirdParty\Intel\ISPC\bin\Windows\ispc.exe)
0>  Intel(r) Implicit SPMD Program Compiler (Intel(r) ISPC), 1.24.0 (build commit  @ 20250404, LLVM 18.1.2) 
0>Using Visual Studio 14.50.35737 toolchain (C:\Program Files\Microsoft Visual Studio\18\Community\VC\Tools\MSVC\14.50.35717) and Windows 10.0.22621.0 SDK (C:\Program Files (x86)\Windows Kits\10).
0>=================================
0>Using Unreal Build Accelerator local executor to run 48 action(s)
0>  CPU 16 physical cores, 32 logical cores
0>  Memory 63.12 GB physical, 63.92 GB/103.12 GB committed
0>  UBA Storage capacity 40 GB
0>[1/48] Compile [x64] SharedPCH.UnrealEd.Project.ValApi.ValExpApi.Cpp20.cpp
0>[2/48] Compile [x64] CombatActivatable.cpp
0>[3/48] Compile [x64] AnimNotify_DoAttackTrace.cpp
0>[4/48] Compile [x64] AnimNotify_CheckChargedAttack.cpp
0>[5/48] Compile [x64] AnimNotify_CheckCombo.cpp
0>[6/48] Compile [x64] AnimNotify_EndDash.cpp
0>[7/48] Compile [x64] CombatActivationVolume.cpp
0>[8/48] Compile [x64] CombatAIController.cpp
0>[9/48] Compile [x64] CombatAttacker.cpp
0>[10/48] Compile [x64] CombatDamageable.cpp
0>[11/48] Compile [x64] CombatCheckpointVolume.cpp
0>[12/48] Compile [x64] CombatDamageableBox.cpp
0>[13/48] Compile [x64] CombatDummy.cpp
0>[14/48] Compile [x64] CombatEnemy.cpp
0>[15/48] Compile [x64] CombatGameMode.cpp
0>[16/48] Compile [x64] CombatEnemySpawner.cpp
0>[17/48] Compile [x64] CombatCharacter.cpp
0>[18/48] Compile [x64] CombatLavaFloor.cpp
0>[19/48] Compile [x64] CombatLifeBar.cpp
0>[20/48] Compile [x64] PerModuleInline.gen.cpp
0>[21/48] Compile [x64] EnvQueryContext_Danger.cpp
0>[22/48] Compile [x64] EnvQueryContext_Player.cpp
0>[23/48] Compile [x64] CombatPlayerController.cpp
0>[24/48] Compile [x64] CombatStateTreeUtility.cpp
0>[25/48] Compile [x64] PlatformingGameMode.cpp
0>[26/48] Compile [x64] PlatformingCharacter.cpp
0>[27/48] Compile [x64] SideScrollingCameraManager.cpp
0>[28/48] Compile [x64] Module.UE58test2.gen.cpp
0>[29/48] Compile [x64] SideScrollingAIController.cpp
0>[30/48] Compile [x64] SideScrollingCharacter.cpp
0>[31/48] Compile [x64] SideScrollingInteractable.cpp
0>[32/48] Compile [x64] PlatformingPlayerController.cpp
0>[33/48] Compile [x64] SideScrollingMovingPlatform.cpp
0>[34/48] Compile [x64] SideScrollingJumpPad.cpp
0>[35/48] Compile [x64] SideScrollingGameMode.cpp
0>[36/48] Compile [x64] SideScrollingNPC.cpp
0>[37/48] Compile [x64] SideScrollingPickup.cpp
0>[38/48] Compile [x64] SideScrollingSoftPlatform.cpp
0>[39/48] Compile [x64] UE58test2.cpp
0>[40/48] Compile [x64] SideScrollingUI.cpp
0>[41/48] Compile [x64] SideScrollingStateTreeUtility.cpp
0>[42/48] Compile [x64] SideScrollingPlayerController.cpp
0>[43/48] Compile [x64] UE58test2GameMode.cpp
0>[44/48] Compile [x64] UE58test2Character.cpp
0>[45/48] Compile [x64] UE58test2PlayerController.cpp
0>[46/48] Link [x64] UnrealEditor-UE58test2.lib
0>[47/48] Link [x64] UnrealEditor-UE58test2.dll
0>[48/48] WriteMetadata UE58test2Editor.target [NoUba]
0>
0>Total time in Unreal Build Accelerator local executor: 42.27 seconds
0>Output binary: C:\Program Files\Epic Games\UE_5.8\Engine\Binaries\Win64\UnrealEditor.exe
0>
0>Result: Succeeded
0>Total execution time: 43.32 seconds
0>Trace written to file C:\Users\L\AppData\Local\UnrealBuildTool\Trace.uba with size 20.2kb

Affects Versions

5.8

Platform(s)

Windows

Additional Notes

I only tried 5.8.1 not 5.8.0
5.7.X worked fine with this build config.