diff --git a/CMakeLists.txt b/CMakeLists.txt index 0ef917b..52899c5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,7 @@ include(${CMAKE_SOURCE_DIR}/cmake/Config.cmake) # setup version numbers set(VERSION_MAJOR 2) set(VERSION_MINOR 5) -set(VERSION_PATCH 0) +set(VERSION_PATCH 1) # add the CSFML header path include_directories(${CMAKE_SOURCE_DIR}/include) diff --git a/cmake/Config.cmake b/cmake/Config.cmake index 6361546..6b543db 100644 --- a/cmake/Config.cmake +++ b/cmake/Config.cmake @@ -64,6 +64,12 @@ elseif(MSVC) set(SFML_MSVC_VERSION 11) elseif(MSVC_VERSION EQUAL 1800) set(SFML_MSVC_VERSION 12) + elseif(MSVC_VERSION EQUAL 1900) + set(SFML_MSVC_VERSION 14) + elseif(MSVC_VERSION LESS_EQUAL 1919) + set(SFML_MSVC_VERSION 15) + elseif(MSVC_VERSION LESS_EQUAL 1929) + set(SFML_MSVC_VERSION 16) endif() else() message(FATAL_ERROR "Unsupported compiler") diff --git a/include/SFML/Config.h b/include/SFML/Config.h index cb2b0fb..6a66cd2 100644 --- a/include/SFML/Config.h +++ b/include/SFML/Config.h @@ -31,7 +31,7 @@ //////////////////////////////////////////////////////////// #define CSFML_VERSION_MAJOR 2 #define CSFML_VERSION_MINOR 5 -#define CSFML_VERSION_PATCH 0 +#define CSFML_VERSION_PATCH 1 //////////////////////////////////////////////////////////// diff --git a/license.txt b/license.txt index 8507208..7d544f4 100644 --- a/license.txt +++ b/license.txt @@ -1,7 +1,7 @@ CSFML ----- -CSFML - Copyright (C) 2007-2018 Laurent Gomila - laurent@sfml-dev.org +CSFML - Copyright (C) 2007-2021 Laurent Gomila - laurent@sfml-dev.org This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held diff --git a/tools/nuget/CSFML/CSFML.csproj b/tools/nuget/CSFML/CSFML.csproj index 8773a03..ee8e9be 100644 --- a/tools/nuget/CSFML/CSFML.csproj +++ b/tools/nuget/CSFML/CSFML.csproj @@ -7,7 +7,7 @@ true - 2.5.0 + 2.5.1 Laurent Gomila sfml csfml Copyright © Laurent Gomila @@ -22,10 +22,10 @@ - + - + diff --git a/tools/nuget/README.md b/tools/nuget/README.md index 350c0c4..783e4cf 100644 --- a/tools/nuget/README.md +++ b/tools/nuget/README.md @@ -12,12 +12,19 @@ All build scripts follow the same routine: * `build.win.ps1` * A [PowerShell](https://github.com/PowerShell/PowerShell) script to build Windows native libraries. By default, both `win-x86` and `win-x64` are built. To build only one specific Runtime Identifier, pass it to the script as a parameter (`./build.win.ps1 win-x64`) - You must have Visual Studio 2017, cmake, and the Windows SDK 8.1 installed to run this script. + You must have Visual Studio 2019, cmake, and the Windows SDK 10 installed to run this script. * `build.linux.sh` * A [Bash](https://www.gnu.org/software/bash/) script to build libraries for a generic Linux distribution. The [Runtime Identifier](https://docs.microsoft.com/en-us/dotnet/core/rid-catalog) of the linux distribution must be specified as a parameter to the script. 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` + * 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. + Currently supported RIDs are: + * osx.10.15-x64 + * osx.11.0-x64 + * osx.11.0-arm64 (requires SFML 2.6) + * `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: * `alpine-x64` diff --git a/tools/nuget/build.macos.sh b/tools/nuget/build.macos.sh new file mode 100644 index 0000000..7e7b357 --- /dev/null +++ b/tools/nuget/build.macos.sh @@ -0,0 +1,183 @@ +#!/bin/bash + +# Automatically exit on error +set -e + +# ========================= # +# PRELUDE: A note on rpaths # +# ========================= # + +# Unlike Windows, macOS doesn't search the current directory by default when searching for shared libraries (.dylib) +# It only searches the system default directories (usually /lib and /usr/lib) and the paths in LD_LIBRARY_PATH + +# The .NET Runtime will find the CSFML library in its NuGet packages just fine, but that library will then request +# the OS for libsfml-(module).dylib, and the .NET Runtime will have no say in how that SFML library is found. + +# Without SFML installed globally on the system, this will fail, causing the loading of CSFML to fail, causing the +# .NET Runtime to think the CSFML library doesn't exist or is invalid. + +# And so, we need to set the rpath of the CSFML library. +# The rpath is a special value embedded straight into a library that specifies to the OS a list of folders where +# other libraries that it references may be found. +# $ORIGIN, a kind-of environment variable, can be used in rpath to point to the folder where the library currently is. +# To let the OS know that we intend to use $ORIGIN, we need to add the ORIGIN flag to our ELF with the -z origin +# gcc linker option + +# Since CSFML and SFML will always be deployed on the same folder by NuGet, we just need to add an rpath to CSFML +# that points to $ORIGIN, causing the OS to search the current folder for SFML, without interference from .NET + +# We also add the same rpath to SFML itself for future-proofing, in case we ever decide to ship some Linux SFML +# dependencies on the Native package. + +# You may need to `brew install coreutils` first for grealpath +# See supported RID at https://docs.microsoft.com/en-us/dotnet/core/rid-catalog + +# =================================================== # +# STEP 1: Setup all variables needed during the build # +# =================================================== # + +if [[ -z "$1" ]]; then + echo "Please specify the platform Runtime Identifier as an argument to this script" + exit 1 +fi + +echo "Please note that all SFML dependencies must be installed and available to cmake. SFML does not ship with its linux dependencies." + +RID="$1" + +SFMLBranch="2.5.x" # The branch or tag of the SFML repository to be cloned +CSFMLDir="$(grealpath "$(git rev-parse --show-toplevel)")" # The directory of the source code of CSFML + +OutDir="./CSFML/runtimes/$RID/native" # The base directory of all CSFML modules, used to copy the final libraries +mkdir -p "$OutDir" +OutDir="$(grealpath "$OutDir")" + +echo "Building $RID" + +mkdir -p "Build" +pushd "Build" + +# ================== # +# STEP 2: Clone SFML # +# ================== # + +if [[ ! -d "SFML/.git" ]]; then + echo "Cloning SFML" + rm -rf "SFML" + git clone --branch "$SFMLBranch" --depth 1 "git://github.com/SFML/SFML.git" "SFML" +fi + +SFMLDir="$(grealpath SFML)" + +# ================== # +# STEP 3: Build SFML # +# ================== # + +rm -rf "$RID" +mkdir -p "$RID" +pushd "$RID" + +echo "Building SFML" +mkdir -p SFML +pushd SFML + +SFMLBuiltDir="$(grealpath .)" # The directory where SFML was built to. Used later to direct cmake when building CSFML + +mkdir -p lib +# The directory that contains the final SFML libraries +# Since linux libraries don't support static linking from a shared library, this is used to copy the +# SFML shared libraries together with the CSFML shared libraries into SFML.Net +SFMLLibDir="$(grealpath lib)" + +if [ $RID == "osx.10.15-x64" ]; then + ARCHITECTURE="x86_64" + TARGET="10.15" + SYSROOT="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/" +elif [ $RID == "osx.11.0-x64" ]; then + ARCHITECTURE="x86_64" + TARGET="11.0" + SYSROOT="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk/" +elif [ $RID == "osx.11.0-arm64" ]; then + ARCHITECTURE="arm64" + TARGET="11.0" + SYSROOT="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk/" + + echo "Note: arm64 is only supported with SFML 2.6" +else + echo "Unsupported RID provided. Use 'osx.10.15-x64', 'osx.11.0-x64' or 'osx.11.0-arm64'" + exit 1 +fi + +cmake -E env \ + cmake -G "Unix Makefiles" \ + -D 'BUILD_SHARED_LIBS=ON' \ + -D 'CMAKE_BUILD_TYPE=Release' \ + -D "CMAKE_OSX_ARCHITECTURES=$ARCHITECTURE" \ + -D "CMAKE_OSX_DEPLOYMENT_TARGET=$TARGET" \ + -D "CMAKE_OSX_SYSROOT=$SYSROOT" \ + -D "CMAKE_LIBRARY_OUTPUT_DIRECTORY=$SFMLLibDir" \ + -D 'CMAKE_BUILD_WITH_INSTALL_RPATH=ON' \ + -D 'CMAKE_INSTALL_RPATH=@executable_path' \ + "$SFMLDir" + +cmake --build . --config Release + +popd # Pop SFML + +# =================== # +# STEP 4: Build CSFML # +# =================== # + +echo "Building CSFML using SFML at $SFMLBuiltDir" +mkdir -p CSFML +pushd CSFML + +mkdir -p lib +CSFMLLibDir="$(realpath lib)" # The directory that contains the final CSFML libraries. Used to copy the result into SFML.Net + +cmake -E env \ + cmake -G "Unix Makefiles" \ + -D "SFML_DIR=$SFMLBuiltDir" \ + -D 'BUILD_SHARED_LIBS=ON' \ + -D 'CMAKE_BUILD_TYPE=Release' \ + -D "CMAKE_OSX_ARCHITECTURES=$ARCHITECTURE" \ + -D "CMAKE_OSX_DEPLOYMENT_TARGET=$TARGET" \ + -D "CMAKE_OSX_SYSROOT=$SYSROOT" \ + -D "CMAKE_LIBRARY_OUTPUT_DIRECTORY=$CSFMLLibDir" \ + -D 'CMAKE_BUILD_WITH_INSTALL_RPATH=ON' \ + -D 'CMAKE_INSTALL_RPATH=@executable_path' \ + "$CSFMLDir" +cmake --build . --config Release + +# ======================================== # +# STEP 5: Copy result to the NuGet folders # +# ======================================== # + +# Copies one SFML and CSFML module into the NuGet package +# The module name must be passed to this function as an argument, in lowercase +# This function then copies $SFMLLibDir/libsfml-(module).so and +# $CSFMLLibDir/libcsfml-(module).so into $OutDir +copymodule() +{ + MODULE="$1" + + mkdir -p "$OutDir" + + # Note the wildcard at the end of the first argument + # We are copying every versioned file here, not just the .dylib + # (libsfml-audio.dylib, libsfml-audio.2.dylib, libsfml-audio.2.5.dylib, etc) + # This is needed because of the way macOS searches for libraries based + # one their SONAME + cp "$SFMLLibDir/libsfml-$MODULE."* "$OutDir" + + cp "$CSFMLLibDir/libcsfml-$MODULE."* "$OutDir" +} + +copymodule audio +copymodule graphics +copymodule system +copymodule window + +popd # Pop CSFML +popd # Pop $RID +popd # Pop Build diff --git a/tools/nuget/build.win.ps1 b/tools/nuget/build.win.ps1 index e9210e0..04a4221 100644 --- a/tools/nuget/build.win.ps1 +++ b/tools/nuget/build.win.ps1 @@ -16,7 +16,7 @@ if (-not $RID) { exit } -$Generator = 'Visual Studio 15 2017' +$Generator = 'Visual Studio 16 2019' switch ($RID) { 'win-x86' { @@ -194,10 +194,10 @@ function Copy-Module($module) { Copy-Item "$CSFMLLibDir/csfml-$module-2.dll" "$OutDir/csfml-$module.dll" -Force > $null } -Copy-Module 'Audio' -Copy-Module 'Graphics' -Copy-Module 'System' -Copy-Module 'Window' +Copy-Module 'audio' +Copy-Module 'graphics' +Copy-Module 'system' +Copy-Module 'window' Write-Output "Copying Audio module extra files" Copy-Item "$SFMLAudioExtras/*" "$OutDir"