mirror of
https://github.com/stride3d/stride.git
synced 2026-10-12 02:23:23 +00:00
lld and cl.exe use VCToolsInstallDir when it is set, otherwise the default toolset of the latest VS instance. Resolve that one toolchain, check its lib\arm64, and pass it to lld as -libpath so the ARM64 link uses what was checked. Reported in #3274.
141 lines
8.6 KiB
XML
141 lines
8.6 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
<!--
|
|
Stride.Native.Windows.Lld.targets
|
|
|
|
Windows native compilation and linking using Clang+LLD
|
|
This replaces the MSVC-based approach and provides cross-platform
|
|
consistency for Windows builds.
|
|
|
|
Note: This file is meant to be included by Stride.Native.targets
|
|
-->
|
|
|
|
<!--
|
|
Windows Clang+LLD Compilation Target (x64)
|
|
|
|
Compiles C/C++ files for 64-bit Windows using clang and links with LLD
|
|
-->
|
|
<Target Name="_StrideCompileNativeWindows_X64_Lld"
|
|
Inputs="@(StrideNativeCFile);@(StrideNativeHFile)"
|
|
Outputs="@(StrideNativeCFile->'$(OutputObjectPath)\win-x64\%(Filename).obj')"
|
|
Condition="'$(StrideNativeBuildModeClang)' == 'true'">
|
|
|
|
<MakeDir Directories="$(OutputObjectPath)\win-x64"/>
|
|
|
|
<!-- Compile C files -->
|
|
<Exec Condition="'%(StrideNativeCFile.Extension)' != '.cpp'"
|
|
Command=""$(StrideNativeClangCommand)" -gcodeview -fno-ms-extensions -nobuiltininc -nostdinc++ $(StrideNativeClang) -DNEED_DLL_EXPORT -o "$(OutputObjectPath)\win-x64\%(StrideNativeCFile.Filename).obj" -c "%(StrideNativeCFile.FullPath)" -fms-extensions -DWINDOWS_DESKTOP -target x86_64-pc-windows-msvc"
|
|
ContinueOnError="false" />
|
|
|
|
<!-- Compile C++ files -->
|
|
<Exec Condition="'%(StrideNativeCFile.Extension)' == '.cpp'"
|
|
Command=""$(StrideNativeClangCommand)" -gcodeview -fno-ms-extensions -nobuiltininc -nostdinc++ $(StrideNativeClangCPP) $(StrideNativeClang) -DNEED_DLL_EXPORT -o "$(OutputObjectPath)\win-x64\%(StrideNativeCFile.Filename).obj" -c "%(StrideNativeCFile.FullPath)" -fms-extensions -DWINDOWS_DESKTOP -target x86_64-pc-windows-msvc"
|
|
ContinueOnError="false" />
|
|
</Target>
|
|
|
|
<!--
|
|
Windows Clang+LLD Linking Target (x64)
|
|
|
|
Links compiled .obj files for 64-bit Windows using LLVM LLD with MSVC ABI
|
|
-->
|
|
<Target Name="_StrideLinkNativeWindows_X64_Lld"
|
|
Inputs="@(StrideNativeCFile->'$(OutputObjectPath)\win-x64\%(Filename).obj')"
|
|
Outputs="$(StrideNativeOutputPath)\runtimes\win-x64\native\$(StrideNativeOutputName).dll"
|
|
Condition="'$(StrideNativeBuildModeClang)' == 'true'">
|
|
|
|
<MakeDir Directories="$(StrideNativeOutputPath)\runtimes\win-x64\native"/>
|
|
|
|
<!-- Debug: Show what libraries are being linked -->
|
|
<Message Text="[Stride] Linking libraries: libNativePath.lib $(StrideNativePathLibsWindows)" Importance="high" />
|
|
<Message Text="[Stride] Object files: @(StrideNativeCFile->'$(OutputObjectPath)\win-x64\%(Filename).obj')" Importance="high" />
|
|
|
|
<!-- Link DLL by invoking LLD directly in COFF mode (-flavor link). lld-link self-discovers the
|
|
Windows SDK and MSVC CRT (libcmt/oldnames), so no lld-link.exe alias and no libpaths needed. -->
|
|
<Exec Command=""$(StrideNativeLldCommand)" -flavor link -nologo -dll -machine:x64 -subsystem:windows -nxcompat -defaultlib:libcmt -defaultlib:oldnames -out:"$(StrideNativeOutputPath)\runtimes\win-x64\native\$(StrideNativeOutputName).dll" -libpath:"$(MSBuildThisFileDirectory)..\..\deps\NativePath\dotnet\win-x64" @(StrideNativeCFile->'"$(OutputObjectPath)\win-x64\%(Filename).obj"', ' ') "$(MSBuildThisFileDirectory)..\..\deps\NativePath\dotnet\win-x64\libNativePath.lib" "$(StrideNativePathLibsWindows_x64)" kernel32.lib user32.lib ole32.lib oleaut32.lib uuid.lib advapi32.lib shell32.lib"
|
|
ContinueOnError="false" />
|
|
|
|
<Message Text="[Stride] Linked $(StrideNativeOutputName).dll for Windows x64" Importance="normal" />
|
|
</Target>
|
|
|
|
<!--
|
|
Windows Clang+LLD Compilation Target (ARM64)
|
|
|
|
Compiles C/C++ files for ARM64 Windows using clang and links with LLD
|
|
Conditional: Only if StrideNativeWindowsArm64Enabled is true
|
|
-->
|
|
<Target Name="_StrideCompileNativeWindows_ARM64_Lld"
|
|
Inputs="@(StrideNativeCFile);@(StrideNativeHFile)"
|
|
Outputs="@(StrideNativeCFile->'$(OutputObjectPath)\win-arm64\%(Filename).obj')"
|
|
Condition="'$(StrideNativeBuildModeClang)' == 'true' AND '$(StrideNativeWindowsArm64Enabled)' == 'true'">
|
|
|
|
<MakeDir Directories="$(OutputObjectPath)\win-arm64"/>
|
|
|
|
<!-- Compile C files -->
|
|
<Exec Condition="'%(StrideNativeCFile.Extension)' != '.cpp'"
|
|
Command=""$(StrideNativeClangCommand)" -gcodeview -fno-ms-extensions -nobuiltininc -nostdinc++ $(StrideNativeClang) -DNEED_DLL_EXPORT -o "$(OutputObjectPath)\win-arm64\%(StrideNativeCFile.Filename).obj" -c "%(StrideNativeCFile.FullPath)" -fms-extensions -DWINDOWS_DESKTOP -target aarch64-pc-windows-msvc"
|
|
ContinueOnError="false" />
|
|
|
|
<!-- Compile C++ files -->
|
|
<Exec Condition="'%(StrideNativeCFile.Extension)' == '.cpp'"
|
|
Command=""$(StrideNativeClangCommand)" -gcodeview -fno-ms-extensions -nobuiltininc -nostdinc++ $(StrideNativeClangCPP) $(StrideNativeClang) -DNEED_DLL_EXPORT -o "$(OutputObjectPath)\win-arm64\%(StrideNativeCFile.Filename).obj" -c "%(StrideNativeCFile.FullPath)" -fms-extensions -DWINDOWS_DESKTOP -target aarch64-pc-windows-msvc"
|
|
ContinueOnError="false" />
|
|
</Target>
|
|
|
|
<!--
|
|
Windows Clang+LLD Linking Target (ARM64)
|
|
|
|
Links compiled .obj files for ARM64 Windows using LLVM LLD with MSVC ABI
|
|
-->
|
|
<Target Name="_StrideLinkNativeWindows_ARM64_Lld"
|
|
Inputs="@(StrideNativeCFile->'$(OutputObjectPath)\win-arm64\%(Filename).obj')"
|
|
Outputs="$(StrideNativeOutputPath)\runtimes\win-arm64\native\$(StrideNativeOutputName).dll"
|
|
Condition="'$(StrideNativeBuildModeClang)' == 'true' AND '$(StrideNativeWindowsArm64Enabled)' == 'true'">
|
|
|
|
<MakeDir Directories="$(StrideNativeOutputPath)\runtimes\win-arm64\native"/>
|
|
|
|
<!-- Debug: Show what libraries are being linked -->
|
|
<Message Text="[Stride] Linking libraries: libNativePath.lib $(StrideNativePathLibsWindows)" Importance="high" />
|
|
<Message Text="[Stride] Object files: @(StrideNativeCFile->'$(OutputObjectPath)\win-arm64\%(Filename).obj')" Importance="high" />
|
|
|
|
<PropertyGroup>
|
|
<!-- Take the CRT from the toolchain _StrideResolveWindowsArm64Toolchain checked; an explicit
|
|
-libpath wins over lld's own discovery. The Windows SDK still comes from lld. -->
|
|
<_StrideArm64CrtLibPathArg Condition="'$(StrideNativeWindowsArm64LibPath)' != ''">-libpath:"$(StrideNativeWindowsArm64LibPath)"</_StrideArm64CrtLibPathArg>
|
|
</PropertyGroup>
|
|
|
|
<!-- Link DLL by invoking LLD directly in COFF mode (-flavor link); see x64 target for rationale. -->
|
|
<Exec Command=""$(StrideNativeLldCommand)" -flavor link -nologo -dll -machine:arm64 -subsystem:windows -nxcompat -defaultlib:libcmt -defaultlib:oldnames $(_StrideArm64CrtLibPathArg) -out:"$(StrideNativeOutputPath)\runtimes\win-arm64\native\$(StrideNativeOutputName).dll" -libpath:"$(MSBuildThisFileDirectory)..\..\deps\NativePath\dotnet\win-arm64" @(StrideNativeCFile->'"$(OutputObjectPath)\win-arm64\%(Filename).obj"', ' ') "$(MSBuildThisFileDirectory)..\..\deps\NativePath\dotnet\win-arm64\libNativePath.lib" "$(StrideNativePathLibsWindowsArm64)" kernel32.lib user32.lib ole32.lib oleaut32.lib uuid.lib advapi32.lib shell32.lib"
|
|
ContinueOnError="false" />
|
|
|
|
<Message Text="[Stride] Linked $(StrideNativeOutputName).dll for Windows ARM64" Importance="normal" />
|
|
</Target>
|
|
|
|
<!--
|
|
Master Windows Clang+LLD Compilation Target
|
|
|
|
Orchestrates compilation and linking for all Windows architectures
|
|
This is the main entry point for the new Windows build approach
|
|
-->
|
|
<Target Name="CompileNativeClang_Windows_Lld"
|
|
Inputs="@(StrideNativeCFile);@(StrideNativeHFile)"
|
|
Outputs="@(StrideNativeOutput)"
|
|
Condition="('$(TargetFramework)' == '$(StrideFramework)') And $([MSBuild]::IsOSPlatform('Windows')) And $(DesignTimeBuild) != true And $(BuildingProject) != false And '$(StrideNativeBuildModeClang)' == 'true'"
|
|
BeforeTargets="CoreCompile"
|
|
DependsOnTargets="_StrideRegisterNativeOutputs">
|
|
|
|
<!-- Compile for all architectures -->
|
|
<CallTarget Targets="_StrideCompileNativeWindows_X64_Lld" />
|
|
<CallTarget Targets="_StrideCompileNativeWindows_ARM64_Lld" />
|
|
|
|
<!-- Link for all architectures -->
|
|
<CallTarget Targets="_StrideLinkNativeWindows_X64_Lld" />
|
|
<CallTarget Targets="_StrideLinkNativeWindows_ARM64_Lld" />
|
|
|
|
<!-- Workaround: forcing C# rebuild so that timestamps are up to date -->
|
|
<Delete Files="@(IntermediateAssembly)"/>
|
|
|
|
<Message Text="[Stride] Windows native build completed using Clang+LLD" Importance="high" />
|
|
</Target>
|
|
|
|
</Project>
|