Files
stgsharp/Directory.Build.targets
T

125 lines
7.5 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<Project>
<!-- Native builds are opt-in for executable hosts, not repeated by every library project. -->
<Target Name="BuildNativeLibrary"
BeforeTargets="PrepareForBuild"
Condition="'$(BuildNativeBeforeManaged)'=='true' And '$(DesignTimeBuild)'!='true'">
<PropertyGroup>
<NativeCMakePreset Condition="'$(NativeCMakePreset)'=='' And '$(Configuration)'=='Debug'">clang-debug</NativeCMakePreset>
<NativeCMakePreset Condition="'$(NativeCMakePreset)'==''">clang-release</NativeCMakePreset>
<NativeCMakeBuildDir Condition="'$(NativeCMakeBuildDir)'==''">$(SolutionRoot)cmake_build/$(NativeCMakePreset)</NativeCMakeBuildDir>
<_NativeCMakeOutputDir>$([System.String]::Copy('$(NativeBuildDir)').Replace('\', '/'))</_NativeCMakeOutputDir>
</PropertyGroup>
<Exec Command="cmake --preset &quot;$(NativeCMakePreset)&quot; -S &quot;$(SolutionRoot)src/Nitload.Native&quot; -B &quot;$(NativeCMakeBuildDir)&quot; &quot;-DNFN_BUILD_OUTPUT_DIR:PATH=$(_NativeCMakeOutputDir)&quot; &quot;-DNFN_EXPECTED_RID:STRING=$(BuildRid)&quot;" />
<Exec Command="cmake --build &quot;$(NativeCMakeBuildDir)&quot; --target &quot;$(NativeLibName)&quot;" />
<Error Condition="!Exists('$(NativeBuildDir)$(NativeFileName)')"
Text="CMake did not produce the expected native library: $(NativeBuildDir)$(NativeFileName). Check the target OS, architecture and output name." />
</Target>
<!-- ════════════════════════════════════════════════════════ -->
<!-- 编译后:把 C# 输出拷贝到 bin/<rid>/ 目录 -->
<!-- 替代原来的 xcopy PostBuild -->
<!-- ════════════════════════════════════════════════════════ -->
<Target Name="CopyOutputToBuildDir"
AfterTargets="Build"
Condition="'$(DisablePostBuildCopy)'!='true' And '$(MSBuildProjectExtension)'=='.csproj' And '$(DesignTimeBuild)'!='true'">
<MakeDir Directories="$(ManagedBuildDir)" />
<!-- 拷贝所有编译输出(DLL + PDB + XML + deps.json) -->
<ItemGroup>
<!-- Native artifacts flow from CMake to hosts only. Never copy an old deployed DLL
back over the authoritative CMake output, including pre-rename artifacts. -->
<_OutputFiles Include="$(TargetDir)**\*.*"
Exclude="$(TargetDir)**\*.user;$(TargetDir)**\$(NativeLibName).*;$(TargetDir)**\lib$(NativeLibName).*;$(TargetDir)**\StgSharp.Native.*;$(TargetDir)**\libStgSharp.Native.*" />
</ItemGroup>
<Copy SourceFiles="@(_OutputFiles)"
DestinationFolder="$(ManagedBuildDir)%(RecursiveDir)"
SkipUnchangedFiles="true" />
<Message Importance="high"
Text="[Nitload] $(MSBuildProjectName) → $(ManagedBuildDir)" />
</Target>
<!-- ════════════════════════════════════════════════════════ -->
<!-- 调试时:从 bin/<rid>/ 拷贝 native DLL 到项目输出目录 -->
<!-- 这样 F5 调试时 P/Invoke 能找到 native -->
<!-- ════════════════════════════════════════════════════════ -->
<Target Name="CopyNativeToProjectOutput"
AfterTargets="Build"
BeforeTargets="CopyOutputToBuildDir"
Condition="'$(DisableNativeCopy)'!='true' And '$(MSBuildProjectExtension)'=='.csproj' And '$(DesignTimeBuild)'!='true'">
<Error Text="Native library not found at $(NativeBuildDir)$(NativeFileName). Build Nitload.Native with CMake, or enable BuildNativeBeforeManaged."
Condition="'$(RequireNativeLibrary)'=='true' And !Exists('$(NativeBuildDir)$(NativeFileName)')" />
<!-- native 库文件 -->
<ItemGroup>
<_NativeLibFile Include="$(NativeBuildDir)$(NativeFileName)"
Condition="Exists('$(NativeBuildDir)$(NativeFileName)')" />
</ItemGroup>
<!-- Debug 模式下还拷贝符号文件 -->
<ItemGroup Condition="$(Configuration.Contains('Debug'))">
<_NativeSymFile Include="$(NativeBuildDir)$(NativeSymbolFileName)"
Condition="Exists('$(NativeBuildDir)$(NativeSymbolFileName)')" />
</ItemGroup>
<Copy SourceFiles="@(_NativeLibFile);@(_NativeSymFile)"
DestinationFolder="$(TargetDir)"
SkipUnchangedFiles="true"
Condition="'@(_NativeLibFile)'!='' Or '@(_NativeSymFile)'!=''" />
<Message Importance="high"
Text="[Nitload] Native $(NativeFileName) ($(BuildRid)) → $(TargetDir)"
Condition="'@(_NativeLibFile)'!=''" />
<Warning Text="[Nitload] Native library not found at $(NativeBuildDir)$(NativeFileName). Build Nitload.Native first!"
Condition="!Exists('$(NativeBuildDir)$(NativeFileName)')" />
</Target>
<!-- ════════════════════════════════════════════════════════ -->
<!-- NuGet 打包:把所有已存在的 RID native 放进 runtimes/ -->
<!-- 只在 Nitload.Common 里生效(通过 IsNativeHost 属性) -->
<!-- ════════════════════════════════════════════════════════ -->
<Target Name="CollectNativeForPack"
BeforeTargets="GenerateNuspec"
Condition="'$(IsNativeHost)'=='true'">
<ItemGroup>
<!-- 扫描 bin/ 下所有 RID 子目录中的 native 文件 -->
<_PackNative Include="$(SolutionRoot)bin\win-x64\$(NativeLibName).dll"
Condition="Exists('$(SolutionRoot)bin\win-x64\$(NativeLibName).dll')"
PackagePath="runtimes\win-x64\native" Pack="true" />
<_PackNative Include="$(SolutionRoot)bin\win-arm64\$(NativeLibName).dll"
Condition="Exists('$(SolutionRoot)bin\win-arm64\$(NativeLibName).dll')"
PackagePath="runtimes\win-arm64\native" Pack="true" />
<_PackNative Include="$(SolutionRoot)bin\linux-x64\lib$(NativeLibName).so"
Condition="Exists('$(SolutionRoot)bin\linux-x64\lib$(NativeLibName).so')"
PackagePath="runtimes\linux-x64\native" Pack="true" />
<_PackNative Include="$(SolutionRoot)bin\linux-arm64\lib$(NativeLibName).so"
Condition="Exists('$(SolutionRoot)bin\linux-arm64\lib$(NativeLibName).so')"
PackagePath="runtimes\linux-arm64\native" Pack="true" />
<_PackNative Include="$(SolutionRoot)bin\linux-ppc64le\lib$(NativeLibName).so"
Condition="Exists('$(SolutionRoot)bin\linux-ppc64le\lib$(NativeLibName).so')"
PackagePath="runtimes\linux-ppc64le\native" Pack="true" />
<_PackNative Include="$(SolutionRoot)bin\osx-x64\lib$(NativeLibName).dylib"
Condition="Exists('$(SolutionRoot)bin\osx-x64\lib$(NativeLibName).dylib')"
PackagePath="runtimes\osx-x64\native" Pack="true" />
<_PackNative Include="$(SolutionRoot)bin\osx-arm64\lib$(NativeLibName).dylib"
Condition="Exists('$(SolutionRoot)bin\osx-arm64\lib$(NativeLibName).dylib')"
PackagePath="runtimes\osx-arm64\native" Pack="true" />
<None Include="@(_PackNative)" />
</ItemGroup>
</Target>
</Project>