Update NuGet tooling

- Add officially supported RID for Linux and macOS
- Ensure reproducible builds with fixed image versions
- Add additional dependencies
- Add dirty workaround (for now) for macOS builds
This commit is contained in:
Lukas Dürrenberger committed 2023-06-09 19:48:52 +02:00
1 parent 39d7c47f04
commit fe8145e750
16 files changed
+226 -38

No files matched your search

+5
View File
@@ -33,8 +33,13 @@
# Build folders # Build folders
build/ build/
cmake-build-*/
# Cache/IDE folders # Cache/IDE folders
.cache/ .cache/
.vscode/ .vscode/
.idea/ .idea/
.vs/
# System files
.DS_Store
+4 -10
View File
@@ -1,13 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0"> <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="16.0">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard1.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<!-- Workaround to remove the NETStandard.Library NuGet reference without breaking everything --> <Version>2.5.2</Version>
<DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
<Version>2.5.1</Version>
<Authors>Laurent Gomila</Authors> <Authors>Laurent Gomila</Authors>
<PackageTags>sfml csfml</PackageTags> <PackageTags>sfml csfml</PackageTags>
<Copyright>Copyright © Laurent Gomila</Copyright> <Copyright>Copyright © Laurent Gomila</Copyright>
@@ -22,10 +19,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="all" /> <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="all" />
<!-- Workaround to remove the NETStandard.Library NuGet reference without breaking everything -->
<PackageReference Include="NETStandard.Library" Version="1.6.1" PrivateAssets="all" />
</ItemGroup> </ItemGroup>
<PropertyGroup> <PropertyGroup>
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="16.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup> <PropertyGroup>
<CSFMLIgnoreAnyCPU>false</CSFMLIgnoreAnyCPU> <CSFMLIgnoreAnyCPU>false</CSFMLIgnoreAnyCPU>
</PropertyGroup> </PropertyGroup>
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="16.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="CSFMLAnyCPUError" Condition="$(CSFMLIgnoreAnyCPU) != true and $(Platform) == 'AnyCPU'" BeforeTargets="Build"> <Target Name="CSFMLAnyCPUError" Condition="$(CSFMLIgnoreAnyCPU) != true and $(Platform) == 'AnyCPU'" BeforeTargets="Build">
<Error Text="CSFML doesn't support 'Any CPU' on the .NET Framework. Consider switching to .NET Core. If this is not possible, change your platform to x64 or x86, or set the MSBuild property 'CSFMLIgnoreAnyCPU' to true and manually load the appropriate native library at runtime." /> <Error Text="CSFML doesn't support 'Any CPU' on the .NET Framework. Consider switching to .NET Core. If this is not possible, change your platform to x64 or x86, or set the MSBuild property 'CSFMLIgnoreAnyCPU' to true and manually load the appropriate native library at runtime." />
+9 -4
View File
@@ -19,16 +19,21 @@ All build scripts follow the same routine:
This generic script doesn't install any of its dependencies. As such, you must have cmake and make installed, as well as all [SFML Dependencies](https://www.sfml-dev.org/tutorials/2.5/compile-with-cmake.php#installing-dependencies) available to cmake. This generic script doesn't install any of its dependencies. As such, you must have cmake and make installed, as well as all [SFML Dependencies](https://www.sfml-dev.org/tutorials/2.5/compile-with-cmake.php#installing-dependencies) available to cmake.
* `build.macos.sh` * `build.macos.sh`
* A [Bash](https://www.gnu.org/software/bash/) script to build libraries for macOS. The [Runtime Identifier](https://docs.microsoft.com/en-us/dotnet/core/rid-catalog#macos-rids) of the macOS distribution must be specified as parameter to the script. * A [Bash](https://www.gnu.org/software/bash/) script to build libraries for macOS. The [Runtime Identifier](https://docs.microsoft.com/en-us/dotnet/core/rid-catalog#macos-rids) of the macOS distribution must be specified as parameter to the script. Latest macOS SDKs can be downloaded [here](https://github.com/phracker/MacOSX-SDKs/releases).
Currently supported RIDs are: Currently supported RIDs are:
* osx.10.15-x64 * `osx-x64` (uses macOS SDK 10.12)
* osx.11.0-x64 * `osx.11.0-x64`
* osx.11.0-arm64 (requires SFML 2.6) * `osx.11.0-arm64` (requires SFML 2.6)
* `build.docker.sh`, `build.docker.ps1` * `build.docker.sh`, `build.docker.ps1`
* A script to build the native libraries for a Linux distribution in a Docker container. If no RID is specified as a parameter, all supported RIDs will be built. Currently, the supported RIDs are: * A script to build the native libraries for a Linux distribution in a Docker container. If no RID is specified as a parameter, all supported RIDs will be built. Currently, the supported RIDs are:
* `linux-x64` (uses Ubuntu)
* `linux-musl-x64` (uses Apline)
* `linux-arm` (uses Arm32v7 Ubuntu)
* `linux-arm64` (uses Arm64v8 Ubuntu )
* `alpine-x64` * `alpine-x64`
* `debian-x64` (compatible with derivatives such as Ubuntu and Linux Mint) * `debian-x64` (compatible with derivatives such as Ubuntu and Linux Mint)
* `ubuntu-x64`
* `fedora-x64` * `fedora-x64`
* `pushnuget.ps1`, `pushnuget.sh` * `pushnuget.ps1`, `pushnuget.sh`
+28 -7
View File
@@ -6,10 +6,11 @@ Param(
$ErrorActionPreference = "Stop" $ErrorActionPreference = "Stop"
if (-not $RID ) { if (-not $RID ) {
Write-Output "No RID specified, building all known RIDs" Write-Output "No RID specified, building all common RIDs"
./build.docker.ps1 "alpine-x64" ./build.docker.ps1 "linux-x64"
./build.docker.ps1 "debian-x64" ./build.docker.ps1 "linux-musl-x64"
./build.docker.ps1 "fedora-x64" ./build.docker.ps1 "linux-arm"
./build.docker.ps1 "linux-arm64"
exit exit
} }
@@ -18,15 +19,35 @@ $Shell = $null
switch ($RID) { switch ($RID) {
'alpine-x64' { 'alpine-x64' {
$Image = 'alpine' $Image = 'alpine:3.7'
$Shell = '/bin/sh' $Shell = '/bin/sh'
} }
'debian-x64' { 'debian-x64' {
$Image = 'debian' $Image = 'debian:bullseye'
$Shell = '/bin/bash'
}
'ubuntu-x64' {
$Image = 'ubuntu:22.04'
$Shell = '/bin/bash' $Shell = '/bin/bash'
} }
'fedora-x64' { 'fedora-x64' {
$Image = 'fedora' $Image = 'fedora:37'
$Shell = '/bin/bash'
}
'linux-x64' {
$Image = 'ubuntu:22.04'
$Shell = '/bin/bash'
}
'linux-musl-x64' {
$Image = 'alpine:3.15'
$Shell = '/bin/sh'
}
'linux-arm' {
$Image = 'arm32v7/ubuntu:22.04'
$Shell = '/bin/bash'
}
'linux-arm64' {
$Image = 'arm64v8/ubuntu:22.04'
$Shell = '/bin/bash' $Shell = '/bin/bash'
} }
Default { Default {
Regular → Executable
+57 -10
View File
@@ -2,6 +2,7 @@
# Automatically exit on error # Automatically exit on error
set -e set -e
set -x
# ========================= # # ========================= #
# PRELUDE: A note on rpaths # # PRELUDE: A note on rpaths #
@@ -89,18 +90,18 @@ mkdir -p lib
# SFML shared libraries together with the CSFML shared libraries into SFML.Net # SFML shared libraries together with the CSFML shared libraries into SFML.Net
SFMLLibDir="$(grealpath lib)" SFMLLibDir="$(grealpath lib)"
if [ $RID == "osx.10.15-x64" ]; then if [ $RID == "osx-x64" ]; then
ARCHITECTURE="x86_64" ARCHITECTURE="x86_64"
TARGET="10.15" TARGET="10.12"
SYSROOT="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/" SYSROOT="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/"
elif [ $RID == "osx.11.0-x64" ]; then elif [ $RID == "osx.11.0-x64" ]; then
ARCHITECTURE="x86_64" ARCHITECTURE="x86_64"
TARGET="11.0" TARGET="11.0"
SYSROOT="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk/" SYSROOT="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk/"
elif [ $RID == "osx.11.0-arm64" ]; then elif [ $RID == "osx.11.0-arm64" ]; then
ARCHITECTURE="arm64" ARCHITECTURE="arm64"
TARGET="11.0" TARGET="11.0"
SYSROOT="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk/" SYSROOT="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk/"
echo "Note: arm64 is only supported with SFML 2.6" echo "Note: arm64 is only supported with SFML 2.6"
else else
@@ -111,16 +112,20 @@ fi
cmake -E env \ cmake -E env \
cmake -G "Unix Makefiles" \ cmake -G "Unix Makefiles" \
-D 'BUILD_SHARED_LIBS=ON' \ -D 'BUILD_SHARED_LIBS=ON' \
-D 'SFML_BUILD_FRAMEWORKS=OFF' \
-D 'CMAKE_BUILD_TYPE=Release' \ -D 'CMAKE_BUILD_TYPE=Release' \
-D "CMAKE_OSX_ARCHITECTURES=$ARCHITECTURE" \ -D "CMAKE_OSX_ARCHITECTURES=$ARCHITECTURE" \
-D "CMAKE_OSX_DEPLOYMENT_TARGET=$TARGET" \ -D "CMAKE_OSX_DEPLOYMENT_TARGET=$TARGET" \
-D "CMAKE_OSX_SYSROOT=$SYSROOT" \ -D "CMAKE_OSX_SYSROOT=$SYSROOT" \
-D "CMAKE_LIBRARY_OUTPUT_DIRECTORY=$SFMLLibDir" \ -D "CMAKE_LIBRARY_OUTPUT_DIRECTORY=$SFMLLibDir" \
-D 'CMAKE_BUILD_WITH_INSTALL_RPATH=ON' \ -D 'CMAKE_BUILD_WITH_INSTALL_RPATH=ON' \
-D 'CMAKE_INSTALL_RPATH=@executable_path' \ -D 'CMAKE_INSTALL_RPATH=@loader_path' \
-D "CMAKE_INSTALL_PREFIX=$SFMLLibDir" \
-D "SFML_DEPENDENCIES_INSTALL_PREFIX=$SFMLLibDir" \
-D "SFML_MISC_INSTALL_PREFIX=$SFMLLibDir" \
"$SFMLDir" "$SFMLDir"
cmake --build . --config Release cmake --build . --config Release --target install
popd # Pop SFML popd # Pop SFML
@@ -145,14 +150,49 @@ cmake -E env \
-D "CMAKE_OSX_SYSROOT=$SYSROOT" \ -D "CMAKE_OSX_SYSROOT=$SYSROOT" \
-D "CMAKE_LIBRARY_OUTPUT_DIRECTORY=$CSFMLLibDir" \ -D "CMAKE_LIBRARY_OUTPUT_DIRECTORY=$CSFMLLibDir" \
-D 'CMAKE_BUILD_WITH_INSTALL_RPATH=ON' \ -D 'CMAKE_BUILD_WITH_INSTALL_RPATH=ON' \
-D 'CMAKE_INSTALL_RPATH=@executable_path' \ -D 'CMAKE_INSTALL_RPATH=@loader_path' \
-D "CMAKE_INSTALL_PREFIX=$CSFMLLibDir" \
-D "INSTALL_MISC_DIR=$CSFMLLibDir" \
"$CSFMLDir" "$CSFMLDir"
cmake --build . --config Release cmake --build . --config Release --target install
# ============================ #
# STEP 5: Fix RPATH references #
# ============================ #
SFMLMajorMinor="2.5"
SFMLMajorMinorPatch="$SFMLMajorMinor.1"
# SFML's framework dependencies will always reference @rpath/../Frameworks/<depedency>
# Which is not where we place the frameworks and where SFML should look for them
# This this fixes the dependency with install_name_tool
fixrpath()
{
MODULE="$1"
OLD="$2"
NEW="$3"
install_name_tool -change $OLD $NEW "$SFMLLibDir/libsfml-$MODULE.dylib"
install_name_tool -change $OLD $NEW "$SFMLLibDir/libsfml-$MODULE.$SFMLMajorMinor.dylib"
install_name_tool -change $OLD $NEW "$SFMLLibDir/libsfml-$MODULE.$SFMLMajorMinorPatch.dylib"
}
fixrpath audio "@rpath/../Frameworks/OpenAL.framework/Versions/A/OpenAL" "@rpath/OpenAL.framework/Versions/A/OpenAL"
fixrpath audio "@rpath/../Frameworks/vorbisenc.framework/Versions/A/vorbisenc" "@rpath/vorbisenc.framework/Versions/A/vorbisen"
fixrpath audio "@rpath/../Frameworks/vorbisfile.framework/Versions/A/vorbisfile" "@rpath/vorbisfile.framework/Versions/A/vorbisfile"
fixrpath audio "@rpath/../Frameworks/vorbis.framework/Versions/A/vorbis" "@rpath/vorbis.framework/Versions/A/vorbis"
fixrpath audio "@rpath/../Frameworks/ogg.framework/Versions/A/ogg" "@rpath/ogg.framework/Versions/A/ogg"
fixrpath audio "@rpath/../Frameworks/FLAC.framework/Versions/A/FLAC" "@rpath/FLAC.framework/Versions/A/FLAC"
fixrpath graphics "@rpath/../Frameworks/freetype.framework/Versions/A/freetype" "@rpath/freetype.framework/Versions/A/freetype"
# ======================================== # # ======================================== #
# STEP 5: Copy result to the NuGet folders # # STEP 6: Copy result to the NuGet folders #
# ======================================== # # ======================================== #
CSFMLMajorMinor="2.5"
CSFMLMajorMinorPatch="$CSFMLMajorMinor.2"
# Copies one SFML and CSFML module into the NuGet package # Copies one SFML and CSFML module into the NuGet package
# The module name must be passed to this function as an argument, in lowercase # The module name must be passed to this function as an argument, in lowercase
# This function then copies $SFMLLibDir/libsfml-(module).so and # This function then copies $SFMLLibDir/libsfml-(module).so and
@@ -171,6 +211,11 @@ copymodule()
cp "$SFMLLibDir/libsfml-$MODULE."* "$OutDir" cp "$SFMLLibDir/libsfml-$MODULE."* "$OutDir"
cp "$CSFMLLibDir/libcsfml-$MODULE."* "$OutDir" cp "$CSFMLLibDir/libcsfml-$MODULE."* "$OutDir"
# Fix naming for expected filename
mv "$OutDir/libcsfml-$MODULE.dylib" "$OutDir/libcsfml-$MODULE"
mv "$OutDir/libcsfml-$MODULE.$CSFMLMajorMinor.dylib" "$OutDir/libcsfml-$MODULE.$CSFMLMajorMinor"
mv "$OutDir/libcsfml-$MODULE.$CSFMLMajorMinorPatch.dylib" "$OutDir/libcsfml-$MODULE.$CSFMLMajorMinorPatch"
} }
copymodule audio copymodule audio
@@ -178,6 +223,8 @@ copymodule graphics
copymodule system copymodule system
copymodule window copymodule window
cp -R "$SFMLLibDir/"*.framework "$OutDir"
popd # Pop CSFML popd # Pop CSFML
popd # Pop $RID popd # Pop $RID
popd # Pop Build popd # Pop Build
+1
View File
@@ -10,6 +10,7 @@ apk add \
freetype-dev \ freetype-dev \
libx11-dev \ libx11-dev \
libxrandr-dev \ libxrandr-dev \
libxcursor-dev \
eudev-dev \ eudev-dev \
mesa-dev \ mesa-dev \
flac-dev \ flac-dev \
+1 -4
View File
@@ -10,15 +10,12 @@ apt-get install -y \
libfreetype6-dev \ libfreetype6-dev \
xorg-dev \ xorg-dev \
libxrandr-dev \ libxrandr-dev \
libxcursor-dev \
libudev-dev \ libudev-dev \
libgl1-mesa-dev \ libgl1-mesa-dev \
libflac-dev \ libflac-dev \
libogg-dev \ libogg-dev \
libvorbis-dev \ libvorbis-dev \
libvorbisenc2 \
libvorbisfile3 \
libopenal-dev \
libpthread-stubs0-dev \
cmake \ cmake \
g++ g++
+1
View File
@@ -8,6 +8,7 @@ dnf install -y \
freetype-devel \ freetype-devel \
xorg-x11-server-devel \ xorg-x11-server-devel \
libXrandr-devel \ libXrandr-devel \
libXcursor-devel \
systemd-devel \ systemd-devel \
mesa-libEGL-devel \ mesa-libEGL-devel \
flac-devel \ flac-devel \
+23
View File
@@ -0,0 +1,23 @@
#!/bin/bash
# Automatically exit on error
set -e
apt-get update
apt-get install -y \
git \
libfreetype6-dev \
xorg-dev \
libxrandr-dev \
libxcursor-dev \
libudev-dev \
libgl1-mesa-dev \
libflac-dev \
libogg-dev \
libvorbis-dev \
libopenal-dev \
cmake \
g++
./build.linux.sh linux-arm
+23
View File
@@ -0,0 +1,23 @@
#!/bin/bash
# Automatically exit on error
set -e
apt-get update
apt-get install -y \
git \
libfreetype6-dev \
xorg-dev \
libxrandr-dev \
libxcursor-dev \
libudev-dev \
libgl1-mesa-dev \
libflac-dev \
libogg-dev \
libvorbis-dev \
libopenal-dev \
cmake \
g++
./build.linux.sh linux-arm64
+25
View File
@@ -0,0 +1,25 @@
#!/bin/sh
# Alpine Linux doesn't come with bash by default, so we need to bootstrap everything with sh
# Automatically exit on error
set -e
apk add \
bash \
git \
freetype-dev \
libx11-dev \
libxrandr-dev \
libxcursor-dev \
eudev-dev \
mesa-dev \
flac-dev \
libogg-dev \
libvorbis-dev \
openal-soft-dev \
libpthread-stubs \
cmake \
make \
g++
./build.linux.sh linux-musl-x64
+23
View File
@@ -0,0 +1,23 @@
#!/bin/bash
# Automatically exit on error
set -e
apt-get update
apt-get install -y \
git \
libfreetype6-dev \
xorg-dev \
libxrandr-dev \
libxcursor-dev \
libudev-dev \
libgl1-mesa-dev \
libflac-dev \
libogg-dev \
libvorbis-dev \
libopenal-dev \
cmake \
g++
./build.linux.sh linux-x64
+23
View File
@@ -0,0 +1,23 @@
#!/bin/bash
# Automatically exit on error
set -e
apt-get update
apt-get install -y \
git \
libfreetype6-dev \
xorg-dev \
libxrandr-dev \
libxcursor-dev \
libudev-dev \
libgl1-mesa-dev \
libflac-dev \
libogg-dev \
libvorbis-dev \
libopenal-dev \
cmake \
g++
./build.linux.sh ubuntu-x64
+1 -1
View File
@@ -3,7 +3,7 @@ Param(
[string]$APIKey [string]$APIKey
) )
dotnet build -c Release dotnet pack -c Release
if ($LASTEXITCODE -ne 0) { if ($LASTEXITCODE -ne 0) {
Write-Error "Build failed" Write-Error "Build failed"
exit 1 exit 1