From 7f9d5cbe4cf24136ba987407167afcbbe9c8a9d8 Mon Sep 17 00:00:00 2001 From: "j.foucher" Date: Wed, 6 May 2026 07:25:15 +0200 Subject: [PATCH] Refactor ViveVBS plugin build to UE5 conventions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Why: the previous Build.cs copied the Vive DLLs manually via File.Copy only for the Editor target, leaving Game/packaged builds with missing runtime dependencies. The DYNAMIC_LINKAGE branch was also syntactically broken, the SDK header/lib lived inside Source/, and the .uplugin used the deprecated WhitelistPlatforms key. - Move SDK to ThirdParty/VBS_SDK/{include,lib/Win64,bin/Win64}/ via git renames so history is preserved. - Replace File.Copy + Editor-only branch with idiomatic RuntimeDependencies.Add(staged, source, NonUFS) — UBT now copies the DLLs next to the binary for both Editor (modular) and Game (monolithic) and stages them at packaging time. - Drop dead #if DYNAMIC_LINKAGE block. - Move SDK include path from Public to Private (no public header exposes Vive types) and remove the now-dead include from 4 public headers; add the SDK include to the 4 .cpp that actually use it. - Rename WhitelistPlatforms -> PlatformAllowList (UE5). - Populate FilterPlugin.ini with the ThirdParty paths so the plugin is redistributable when packaged standalone. Validated by clean builds of PS_ViveVBSEditor (Win64 Development) and PS_ViveVBS (Win64 Development Game), both exit 0, with UBT logging the automatic Copy steps for the 3 Vive DLLs. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../PS_ViveVBS/Config/FilterPlugin.ini | 9 +- .../Source/ViveVBS/Private/Global.cpp | 1 + .../Source/ViveVBS/Private/GunMode.cpp | 1 + .../Source/ViveVBS/Private/MBLS.cpp | 1 + .../Source/ViveVBS/Private/Passthrough.cpp | 1 + .../PS_ViveVBS/Source/ViveVBS/Public/Global.h | 1 - .../Source/ViveVBS/Public/GunMode.h | 1 - .../PS_ViveVBS/Source/ViveVBS/Public/MBLS.h | 1 - .../Source/ViveVBS/Public/Passthrough.h | 1 - .../Source/ViveVBS/ViveVBS.Build.cs | 119 +++++------------- .../bin}/Win64/RRServerManageAPI.dll | Bin .../bin}/Win64/VSWPipeVarClient64U_MT.dll | Bin .../{ => VBS_SDK/bin}/Win64/VS_PC_SDK.dll | Bin .../VBS_SDK/include}/VS_PC_SDK.h | 0 .../VBS_SDK/lib/Win64}/VS_PC_SDK.lib | Bin .../Plugins/PS_ViveVBS/ViveVBS.uplugin | 2 +- 16 files changed, 42 insertions(+), 96 deletions(-) rename Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ThirdParty/{ => VBS_SDK/bin}/Win64/RRServerManageAPI.dll (100%) rename Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ThirdParty/{ => VBS_SDK/bin}/Win64/VSWPipeVarClient64U_MT.dll (100%) rename Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ThirdParty/{ => VBS_SDK/bin}/Win64/VS_PC_SDK.dll (100%) rename Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/{Source/ViveVBS/VBS_SDK => ThirdParty/VBS_SDK/include}/VS_PC_SDK.h (100%) rename Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/{Source/ViveVBS/VBS_SDK => ThirdParty/VBS_SDK/lib/Win64}/VS_PC_SDK.lib (100%) diff --git a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Config/FilterPlugin.ini b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Config/FilterPlugin.ini index ccebca2..472eb1b 100644 --- a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Config/FilterPlugin.ini +++ b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Config/FilterPlugin.ini @@ -1,8 +1,7 @@ [FilterPlugin] ; This section lists additional files which will be packaged along with your plugin. Paths should be listed relative to the root plugin directory, and ; may include "...", "*", and "?" wildcards to match directories, files, and individual characters respectively. -; -; Examples: -; /README.txt -; /Extras/... -; /Binaries/ThirdParty/*.dll + +/ThirdParty/VBS_SDK/include/... +/ThirdParty/VBS_SDK/lib/Win64/... +/ThirdParty/VBS_SDK/bin/Win64/... diff --git a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Private/Global.cpp b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Private/Global.cpp index 1fe4787..ee063e9 100644 --- a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Private/Global.cpp +++ b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Private/Global.cpp @@ -2,6 +2,7 @@ #include "../Public/Global.h" +#include "VS_PC_SDK.h" DEFINE_LOG_CATEGORY(PS_ViveVBS); diff --git a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Private/GunMode.cpp b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Private/GunMode.cpp index 41504e0..790bdc3 100644 --- a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Private/GunMode.cpp +++ b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Private/GunMode.cpp @@ -2,6 +2,7 @@ #include "../Public/GunMode.h" +#include "VS_PC_SDK.h" //DEFINE_LOG_CATEGORY(PS_ViveVBS); diff --git a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Private/MBLS.cpp b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Private/MBLS.cpp index 3537752..236d530 100644 --- a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Private/MBLS.cpp +++ b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Private/MBLS.cpp @@ -3,6 +3,7 @@ #include "../Public/MBLS.h" #include "../Public/Global.h" +#include "VS_PC_SDK.h" //DEFINE_LOG_CATEGORY(PS_ViveVBS); diff --git a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Private/Passthrough.cpp b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Private/Passthrough.cpp index bcb1f7b..613a9a6 100644 --- a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Private/Passthrough.cpp +++ b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Private/Passthrough.cpp @@ -2,6 +2,7 @@ #include "../Public/Passthrough.h" +#include "VS_PC_SDK.h" //DEFINE_LOG_CATEGORY(PS_ViveVBS); diff --git a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Public/Global.h b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Public/Global.h index 00781ef..239a9ef 100644 --- a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Public/Global.h +++ b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Public/Global.h @@ -4,7 +4,6 @@ #include "CoreMinimal.h" #include "Kismet/BlueprintFunctionLibrary.h" -#include "../VBS_SDK/VS_PC_SDK.h" #include "Global.generated.h" DECLARE_LOG_CATEGORY_EXTERN(PS_ViveVBS, Log, All); diff --git a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Public/GunMode.h b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Public/GunMode.h index 74a14c8..ffefd19 100644 --- a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Public/GunMode.h +++ b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Public/GunMode.h @@ -4,7 +4,6 @@ #include "CoreMinimal.h" #include "Kismet/BlueprintFunctionLibrary.h" -#include "../VBS_SDK/VS_PC_SDK.h" #include "Global.h" #include "GunMode.generated.h" diff --git a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Public/MBLS.h b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Public/MBLS.h index 13ddd62..f9f3886 100644 --- a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Public/MBLS.h +++ b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Public/MBLS.h @@ -4,7 +4,6 @@ #include "CoreMinimal.h" #include "Kismet/BlueprintFunctionLibrary.h" -#include "../VBS_SDK/VS_PC_SDK.h" #include "Global.h" #include "MBLS.generated.h" diff --git a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Public/Passthrough.h b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Public/Passthrough.h index 2f4fbce..7037c18 100644 --- a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Public/Passthrough.h +++ b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/Public/Passthrough.h @@ -4,7 +4,6 @@ #include "CoreMinimal.h" #include "Kismet/BlueprintFunctionLibrary.h" -#include "../VBS_SDK/VS_PC_SDK.h" #include "Global.h" #include "Passthrough.generated.h" diff --git a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/ViveVBS.Build.cs b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/ViveVBS.Build.cs index 87d9eba..43cac0f 100644 --- a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/ViveVBS.Build.cs +++ b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/ViveVBS.Build.cs @@ -7,97 +7,44 @@ public class ViveVBS : ModuleRules public ViveVBS(ReadOnlyTargetRules Target) : base(Target) { PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; - - PublicIncludePaths.AddRange( - new string[] { - // ... add public include paths required here ... - } - ); - - - PrivateIncludePaths.AddRange( - new string[] { - // ... add other private include paths required here ... - } - ); - - - PublicDependencyModuleNames.AddRange( - new string[] - { - "Core", - // ... add other public dependencies that you statically link with here ... - } - ); - - - PrivateDependencyModuleNames.AddRange( - new string[] - { - "CoreUObject", - "Engine", - "Slate", - "SlateCore", - // ... add private dependencies that you statically link with here ... - } - ); - - - DynamicallyLoadedModuleNames.AddRange( - new string[] - { - // ... add any modules that your module loads dynamically here ... - } - ); -#if DYNAMIC_LINKAGE - PublicDefinitions.Add("VBS_DYNAMIC_LINKAGE=1"); -#endif - string VBS_SDK_PATH = Path.Combine(PluginDirectory, "Source/ViveVBS/VBS_SDK/"); - PublicIncludePaths.Add(VBS_SDK_PATH); -#if DYNAMIC_LINKAGE - PublicDelayLoadDLLs.Add("VS_PC_SDK.dll"); - PublicDelayLoadDLLs.Add("RRServerManageAPI.dll"); - RuntimeDependencies.Add("$(EngineDir)/Binaries/ThirdParty/VBS_SDK/VS_PC_SDK.dll")); - RuntimeDependencies.Add("$(EngineDir)/Binaries/ThirdParty/VBS_SDK/RRServerManageAPI.dll")); -#else - PublicAdditionalLibraries.Add(Path.Combine(VBS_SDK_PATH, "VS_PC_SDK.lib")); - - if (Target.Type == TargetRules.TargetType.Editor) + PublicDependencyModuleNames.AddRange(new string[] { - string srcPath = Path.Combine(ModuleDirectory, "../../ThirdParty/Win64/"); - string destPath = Path.Combine(ModuleDirectory, "../../../../Binaries/Win64/"); + "Core", + }); - string[] dlls = { "VS_PC_SDK.dll", "RRServerManageAPI.dll", "VSWPipeVarClient64U_MT.dll" }; - foreach (string dll in dlls) + PrivateDependencyModuleNames.AddRange(new string[] + { + "CoreUObject", + "Engine", + "Slate", + "SlateCore", + }); + + if (Target.Platform == UnrealTargetPlatform.Win64) + { + string SdkRoot = Path.Combine(PluginDirectory, "ThirdParty", "VBS_SDK"); + string IncludeDir = Path.Combine(SdkRoot, "include"); + string LibDir = Path.Combine(SdkRoot, "lib", "Win64"); + string BinDir = Path.Combine(SdkRoot, "bin", "Win64"); + + PrivateIncludePaths.Add(IncludeDir); + PublicAdditionalLibraries.Add(Path.Combine(LibDir, "VS_PC_SDK.lib")); + + string[] Dlls = { - string src = srcPath + dll; - string dest = destPath + dll; - bool needCopy = !File.Exists(dest); - if (!needCopy) - { - var srcInfo = new FileInfo(src); - var destInfo = new FileInfo(dest); - needCopy = srcInfo.LastWriteTimeUtc > destInfo.LastWriteTimeUtc - || srcInfo.Length != destInfo.Length; - } - if (needCopy) - { - try - { - File.Copy(src, dest, true); - } - catch (IOException) - { - System.Console.WriteLine("ViveVBS: Could not copy " + dll + " (file locked). Using existing copy."); - } - } + "VS_PC_SDK.dll", + "RRServerManageAPI.dll", + "VSWPipeVarClient64U_MT.dll", + }; + + foreach (string Dll in Dlls) + { + RuntimeDependencies.Add( + Path.Combine("$(BinaryOutputDir)", Dll), + Path.Combine(BinDir, Dll), + StagedFileType.NonUFS); } } - - RuntimeDependencies.Add("$(ProjectDir)/Binaries/Win64/VS_PC_SDK.dll"); - RuntimeDependencies.Add("$(ProjectDir)/Binaries/Win64/RRServerManageAPI.dll"); - RuntimeDependencies.Add("$(ProjectDir)/Binaries/Win64/VSWPipeVarClient64U_MT.dll"); -#endif } } diff --git a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ThirdParty/Win64/RRServerManageAPI.dll b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ThirdParty/VBS_SDK/bin/Win64/RRServerManageAPI.dll similarity index 100% rename from Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ThirdParty/Win64/RRServerManageAPI.dll rename to Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ThirdParty/VBS_SDK/bin/Win64/RRServerManageAPI.dll diff --git a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ThirdParty/Win64/VSWPipeVarClient64U_MT.dll b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ThirdParty/VBS_SDK/bin/Win64/VSWPipeVarClient64U_MT.dll similarity index 100% rename from Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ThirdParty/Win64/VSWPipeVarClient64U_MT.dll rename to Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ThirdParty/VBS_SDK/bin/Win64/VSWPipeVarClient64U_MT.dll diff --git a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ThirdParty/Win64/VS_PC_SDK.dll b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ThirdParty/VBS_SDK/bin/Win64/VS_PC_SDK.dll similarity index 100% rename from Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ThirdParty/Win64/VS_PC_SDK.dll rename to Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ThirdParty/VBS_SDK/bin/Win64/VS_PC_SDK.dll diff --git a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/VBS_SDK/VS_PC_SDK.h b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ThirdParty/VBS_SDK/include/VS_PC_SDK.h similarity index 100% rename from Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/VBS_SDK/VS_PC_SDK.h rename to Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ThirdParty/VBS_SDK/include/VS_PC_SDK.h diff --git a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/VBS_SDK/VS_PC_SDK.lib b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ThirdParty/VBS_SDK/lib/Win64/VS_PC_SDK.lib similarity index 100% rename from Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/Source/ViveVBS/VBS_SDK/VS_PC_SDK.lib rename to Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ThirdParty/VBS_SDK/lib/Win64/VS_PC_SDK.lib diff --git a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ViveVBS.uplugin b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ViveVBS.uplugin index f8f7b58..12bdbaf 100644 --- a/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ViveVBS.uplugin +++ b/Unreal/PS_ViveVBS/Plugins/PS_ViveVBS/ViveVBS.uplugin @@ -19,7 +19,7 @@ "Name": "ViveVBS", "Type": "Runtime", "LoadingPhase": "Default", - "WhitelistPlatforms": [ + "PlatformAllowList": [ "Win64" ] }