From dfc218eb0a5b47c4443e31ae06b3f514c0154b0f Mon Sep 17 00:00:00 2001
From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com>
Date: Thu, 1 Jun 2023 17:50:28 +0200
Subject: [PATCH] Agnostic toolset for VS project + std link issue with MSVC
 17.2+ (#580)

* Agnostic toolset for VS project

* platform tool version

* pragma for std

* Update Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonReactNative.vcxproj

Co-authored-by: Gary Hsu <bghgary@users.noreply.github.com>

* update windows readme

---------

Co-authored-by: Gary Hsu <bghgary@users.noreply.github.com>
---
 Modules/@babylonjs/react-native-windows/README.md         | 8 ++++++++
 .../windows/BabylonReactNative/BabylonModule.cpp          | 6 ++++++
 .../windows/BabylonReactNative/BabylonReactNative.vcxproj | 4 ++--
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/Modules/@babylonjs/react-native-windows/README.md b/Modules/@babylonjs/react-native-windows/README.md
index 4a84b9a19..e9ff6dc1f 100644
--- a/Modules/@babylonjs/react-native-windows/README.md
+++ b/Modules/@babylonjs/react-native-windows/README.md
@@ -10,3 +10,11 @@ This package has several **peer dependencies**. If these dependencies are unmet,
 
 This package will not work without installing the `@babylonjs/react-native` peer dependency.
 The `react-native-permissions` dependency is required for XR capabilities of Babylon.js.
+
+### Toolset
+
+Default toolset is v142. It's possible to change it using project variable named `BabylonReactNativeToolset`.
+There are multiple ways to specify it:
+- environment variable
+- msbuild property (`msbuild /p:BabylonReactNativeToolset=v143` for example)
+- customize the build by folder (https://learn.microsoft.com/en-us/visualstudio/msbuild/customize-by-directory?view=vs-2022)
\ No newline at end of file
diff --git a/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonModule.cpp b/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonModule.cpp
index 240cbc662..6cb24ca85 100644
--- a/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonModule.cpp
+++ b/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonModule.cpp
@@ -2,6 +2,12 @@
 #include "BabylonModule.h"
 #include "JSI/JsiApiContext.h"
 
+// see https://developercommunity.visualstudio.com/t/-imp-std-init-once-complete-unresolved-external-sy/1684365
+#if _MSC_VER >= 1932 // Visual Studio 2022 version 17.2+
+#    pragma comment(linker, "/alternatename:__imp___std_init_once_complete=__imp_InitOnceComplete")
+#    pragma comment(linker, "/alternatename:__imp___std_init_once_begin_initialize=__imp_InitOnceBeginInitialize")
+#endif
+
 using namespace winrt::BabylonReactNative::implementation;
 
 REACT_INIT(Initialize);
diff --git a/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonReactNative.vcxproj b/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonReactNative.vcxproj
index 6960fe7a2..818b25733 100644
--- a/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonReactNative.vcxproj
+++ b/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonReactNative.vcxproj
@@ -77,8 +77,8 @@
   <PropertyGroup Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
     <PlatformToolset>v142</PlatformToolset>
-    <PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
-    <PlatformToolset Condition="'$(VisualStudioVersion)' == '16.0'">v142</PlatformToolset>
+    <PlatformToolset Condition="'$(BabylonReactNativeToolset)'!=''">$(BabylonReactNativeToolset)</PlatformToolset>
+
     <CharacterSet>Unicode</CharacterSet>
     <GenerateManifest>false</GenerateManifest>
     <PreferredToolArchitecture>x64</PreferredToolArchitecture>