From 4b7a04db883e1174eb8e7b63838a01c4dea1c003 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 25 Oct 2024 14:17:13 +0200 Subject: [PATCH] cmake: build cpack packages --- .github/workflows/main.yml | 22 +++- .gitignore | 27 ----- CMakeLists.txt | 20 ++++ .../cmake/SDL3_mixerConfigVersion.cmake.in | 4 +- cmake/CPackProjectConfig.cmake.in | 37 ++++++ cmake/sdlplatform.cmake | 106 ++++++++++++++++++ 6 files changed, 182 insertions(+), 34 deletions(-) delete mode 100644 .gitignore create mode 100644 cmake/CPackProjectConfig.cmake.in create mode 100644 cmake/sdlplatform.cmake diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 46eded913..2af1ba240 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -15,12 +15,12 @@ jobs: fail-fast: false matrix: platform: - - { name: Windows (MSVC), os: windows-2019, shell: sh, cmake: '-DPerl_ROOT=C:/Strawberry/perl/bin/ -DSDLMIXER_VENDORED=ON -GNinja', msvc: 1, shared: 1, static: 0 } - - { name: Windows (mingw64), os: windows-latest, shell: 'msys2 {0}', msystem: mingw64, msys-env: mingw-w64-x86_64, shared: 1, static: 0, + - { name: Windows (MSVC), os: windows-2019, shell: sh, cmake: '-DPerl_ROOT=C:/Strawberry/perl/bin/ -DSDLMIXER_VENDORED=ON -GNinja', msvc: 1, shared: 1, static: 0, artifact: 'SDL3_mixer-VC-x64' } + - { name: Windows (mingw64), os: windows-latest, shell: 'msys2 {0}', msystem: mingw64, msys-env: mingw-w64-x86_64, shared: 1, static: 0, artifact: 'SDL3_mixer-mingw64', cmake: '-DSDLMIXER_VENDORED=OFF -G "Ninja Multi-Config"' } - - { name: Linux, os: ubuntu-20.04, shell: sh, cmake: '-DSDLMIXER_VENDORED=ON -GNinja', shared: 1, static: 0 } - - { name: 'Linux (static)', os: ubuntu-20.04, shell: sh, cmake: '-DSDLMIXER_VENDORED=ON -DBUILD_SHARED_LIBS=OFF -GNinja', shared: 0, static: 1 } - - { name: Macos, os: macos-latest, shell: sh, cmake: '-DSDLMIXER_VENDORED=ON -GNinja', shared: 1, static: 0 } + - { name: Linux, os: ubuntu-20.04, shell: sh, cmake: '-DSDLMIXER_VENDORED=ON -GNinja', shared: 1, static: 0, artifact: 'SDL3_mixer-linux-x64' } + - { name: 'Linux (static)', os: ubuntu-20.04, shell: sh, cmake: '-DSDLMIXER_VENDORED=ON -DBUILD_SHARED_LIBS=OFF -GNinja', shared: 0, static: 1, artifact: 'SDL3_mixer-static-linux-x64' } + - { name: Macos, os: macos-latest, shell: sh, cmake: '-DSDLMIXER_VENDORED=ON -GNinja', shared: 1, static: 0, artifact: 'SDL3_mixer-macos' } steps: @@ -129,6 +129,7 @@ jobs: "$@" \ ${{ matrix.platform.cmake }} - name: Build (CMake) + id: build run: | cmake --build build/ --config Release --parallel --verbose - name: Install (CMake) @@ -138,6 +139,10 @@ jobs: cmake --install build/ --config Release echo "SDL3_mixer_ROOT=$(pwd)/prefix_cmake" >> $GITHUB_ENV ( cd prefix_cmake; find . ) | LC_ALL=C sort -u + - name: Package (CPack) + if: ${{ always() && steps.build.outcome == 'success' }} + run: | + cmake --build build/ --target package - name: Verify CMake configuration files run: | @@ -146,3 +151,10 @@ jobs: -DTEST_SHARED=${{ matrix.platform.shared }} \ -DTEST_STATIC=${{ matrix.platform.static }} cmake --build cmake_config_build --verbose --config Release + + - uses: actions/upload-artifact@v4 + if: ${{ always() && steps.build.outcome == 'success' }} + with: + if-no-files-found: error + name: ${{ matrix.platform.artifact }} + path: build/dist/SDL3_mixer* diff --git a/.gitignore b/.gitignore deleted file mode 100644 index b121de87c..000000000 --- a/.gitignore +++ /dev/null @@ -1,27 +0,0 @@ -build* -!build-scripts/ -aclocal.m4 -autom4te* -config.cache -config.log -config.status -Makefile -libtool -.deps -.libs -*.lo -*.o -*.la -*.lai -Debug -Release -*.user -*.ncb -*.suo -*.sdf -.DS_Store -xcuserdata -*.xcworkspace -.vs -.vscode -Xcode/build.xcconfig diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a0beaf8c..f87791ae0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,7 +19,9 @@ project(SDL3_mixer include("${SDL3_mixer_SOURCE_DIR}/cmake/GetGitRevisionDescription.cmake") include("${SDL3_mixer_SOURCE_DIR}/cmake/PrivateSdlFunctions.cmake") +include("${SDL3_mixer_SOURCE_DIR}/cmake/sdlcpu.cmake") include("${SDL3_mixer_SOURCE_DIR}/cmake/sdlmanpages.cmake") +include("${SDL3_mixer_SOURCE_DIR}/cmake/sdlplatform.cmake") sdl_calculate_derived_version_variables(${MAJOR_VERSION} ${MINOR_VERSION} ${MICRO_VERSION}) message(STATUS "Configuring ${PROJECT_NAME} ${PROJECT_VERSION}") @@ -86,6 +88,7 @@ option(CMAKE_POSITION_INDEPENDENT_CODE "Build static libraries with -fPIC" ${PLA cmake_dependent_option(BUILD_SHARED_LIBS "Build the library as a shared library" ON PLATFORM_SUPPORTS_SHARED OFF) cmake_dependent_option(SDLMIXER_INSTALL "Enable SDL3mixer install target" ${SDLMIXER_ROOTPROJECT} "${sdl3mixer_install_enableable}" OFF) +cmake_dependent_option(SDLMIXER_INSTALL_CPACK "Create binary SDL3_mixer archive using CPack" ${SDLMIXER_ROOTPROJECT} "SDLMIXER_INSTALL" OFF) cmake_dependent_option(SDLMIXER_INSTALL_MAN "Install man pages for SDL3_mixer" OFF "SDLMIXER_INSTALL" OFF) cmake_dependent_option(SDLMIXER_DEPS_SHARED "Load dependencies dynamically" ON PLATFORM_SUPPORTS_SHARED OFF) option(SDLMIXER_VENDORED "Use vendored third-party libraries" ${vendored_default}) @@ -223,6 +226,9 @@ if(NOT TARGET SDL3::Headers OR NOT TARGET ${sdl3_target_name}) find_package(SDL3 ${SDL_REQUIRED_VERSION} REQUIRED COMPONENTS ${sdl_required_components}) endif() +SDL_DetectTargetCPUArchitectures(SDL_CPU_NAMES) +SDL_DetectCMakePlatform() + set(BUILD_SHARED_LIBS ${SDLMIXER_BUILD_SHARED_LIBS}) add_library(${sdl3_mixer_target_name} src/codecs/load_aiff.c @@ -1168,6 +1174,20 @@ if(SDLMIXER_INSTALL) COMPONENT library ) + if(SDLMIXER_INSTALL_CPACK) + if(MSVC) + set(CPACK_GENERATOR "ZIP") + else() + set(CPACK_GENERATOR "TGZ") + endif() + configure_file(cmake/CPackProjectConfig.cmake.in CPackProjectConfig.cmake @ONLY) + set(CPACK_PROJECT_CONFIG_FILE "${PROJECT_BINARY_DIR}/CPackProjectConfig.cmake") + # CPACK_SOURCE_PACKAGE_FILE_NAME must end with "-src" (so we can block creating a source archive) + set(CPACK_SOURCE_PACKAGE_FILE_NAME "SDL${PROJECT_VERSION_MAJOR}-${PROJECT_VERSION}-src") + set(CPACK_PACKAGE_DIRECTORY "${CMAKE_BINARY_DIR}/dist") + include(CPack) + endif() + if(SDLMIXER_INSTALL_MAN) sdl_get_git_revision_hash(SDLMIXER_REVISION) SDL_generate_manpages( diff --git a/build-scripts/pkg-support/android/cmake/SDL3_mixerConfigVersion.cmake.in b/build-scripts/pkg-support/android/cmake/SDL3_mixerConfigVersion.cmake.in index abb35d1d8..6e65da6fe 100644 --- a/build-scripts/pkg-support/android/cmake/SDL3_mixerConfigVersion.cmake.in +++ b/build-scripts/pkg-support/android/cmake/SDL3_mixerConfigVersion.cmake.in @@ -1,5 +1,5 @@ -# SDL_image CMake version configuration file: -# This file is meant to be placed in a lib/cmake/SDL3_image subfolder of a reconstructed Android SDL3_image SDK +# SDL3_mixer CMake version configuration file: +# This file is meant to be placed in a lib/cmake/SDL3_mixer subfolder of a reconstructed Android SDL3_mixer SDK set(PACKAGE_VERSION "@<@PROJECT_VERSION@>@") diff --git a/cmake/CPackProjectConfig.cmake.in b/cmake/CPackProjectConfig.cmake.in new file mode 100644 index 000000000..4c7ce7d56 --- /dev/null +++ b/cmake/CPackProjectConfig.cmake.in @@ -0,0 +1,37 @@ +if(CPACK_PACKAGE_FILE_NAME MATCHES ".*-src$") + message(FATAL_ERROR "Creating source archives is not supported.") +endif() + +set(PROJECT_NAME "@PROJECT_NAME@") +set(PROJECT_VERSION "@PROJECT_VERSION@") +set(PROJECT_SOURCE_DIR "@PROJECT_SOURCE_DIR@") +set(SDL_CMAKE_PLATFORM "@SDL_CMAKE_PLATFORM@") +set(SDL_CPU_NAMES "@SDL_CPU_NAMES@") +list(SORT SDL_CPU_NAMES) + +string(TOLOWER "${SDL_CMAKE_PLATFORM}" SDL_CMAKE_PLATFORM) +string(TOLOWER "${SDL_CPU_NAMES}" SDL_CPU_NAMES) +if(lower_sdl_cmake_platform STREQUAL lower_sdl_cpu_names) + set(SDL_CPU_NAMES_WITH_DASHES) +endif() + +string(REPLACE ";" "-" SDL_CPU_NAMES_WITH_DASHES "${SDL_CPU_NAMES}") +if(SDL_CPU_NAMES_WITH_DASHES) + set(SDL_CPU_NAMES_WITH_DASHES "-${SDL_CPU_NAMES_WITH_DASHES}") +endif() + +set(MSVC @MSVC@) +set(MINGW @MINGW@) +if(MSVC) + set(SDL_CMAKE_PLATFORM "${SDL_CMAKE_PLATFORM}-VC") +elseif(MINGW) + set(SDL_CMAKE_PLATFORM "${SDL_CMAKE_PLATFORM}-mingw") +endif() + +set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}-${SDL_CMAKE_PLATFORM}${SDL_CPU_NAMES_WITH_DASHES}") + +if(CPACK_GENERATOR STREQUAL "DragNDrop") + set(CPACK_DMG_VOLUME_NAME "@PROJECT_NAME@ @PROJECT_VERSION@") + # FIXME: use pre-built/create .DS_Store through AppleScript (CPACK_DMG_DS_STORE/CPACK_DMG_DS_STORE_SETUP_SCRIPT) + set(CPACK_DMG_DS_STORE "${PROJECT_SOURCE_DIR}/Xcode/SDL/pkg-support/resources/SDL_DS_Store") +endif() diff --git a/cmake/sdlplatform.cmake b/cmake/sdlplatform.cmake new file mode 100644 index 000000000..ebb2077fb --- /dev/null +++ b/cmake/sdlplatform.cmake @@ -0,0 +1,106 @@ +macro(SDL_DetectCMakePlatform) + set(SDL_CMAKE_PLATFORM ) + # Get the platform + if(WIN32) + set(SDL_CMAKE_PLATFORM Windows) + elseif(PSP) + set(SDL_CMAKE_PLATFORM psp) + elseif(APPLE) + if(CMAKE_SYSTEM_NAME MATCHES ".*Darwin.*") + set(SDL_CMAKE_PLATFORM Darwin) + elseif(CMAKE_SYSTEM_NAME MATCHES ".*MacOS.*") + set(SDL_CMAKE_PLATFORM MacosX) + elseif(CMAKE_SYSTEM_NAME MATCHES ".*tvOS.*") + set(SDL_CMAKE_PLATFORM tvOS) + elseif(CMAKE_SYSTEM_NAME MATCHES ".*iOS.*") + set(SDL_CMAKE_PLATFORM iOS) + endif() + elseif(CMAKE_SYSTEM_NAME MATCHES "Haiku.*") + set(SDL_CMAKE_PLATFORM Haiku) + elseif(NINTENDO_3DS) + set(SDL_CMAKE_PLATFORM n3ds) + elseif(PS2) + set(SDL_CMAKE_PLATFORM ps2) + elseif(VITA) + set(SDL_CMAKE_PLATFORM Vita) + elseif(CMAKE_SYSTEM_NAME MATCHES ".*Linux") + set(SDL_CMAKE_PLATFORM Linux) + elseif(CMAKE_SYSTEM_NAME MATCHES "kFreeBSD.*") + set(SDL_CMAKE_PLATFORM FreeBSD) + elseif(CMAKE_SYSTEM_NAME MATCHES "kNetBSD.*|NetBSD.*") + set(SDL_CMAKE_PLATFORM NetBSD) + elseif(CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*") + set(SDL_CMAKE_PLATFORM OpenBSD) + elseif(CMAKE_SYSTEM_NAME MATCHES ".*GNU.*") + set(SDL_CMAKE_PLATFORM GNU) + elseif(CMAKE_SYSTEM_NAME MATCHES ".*BSDI.*") + set(SDL_CMAKE_PLATFORM BSDi) + elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly.*|FreeBSD") + set(SDL_CMAKE_PLATFORM FreeBSD) + elseif(CMAKE_SYSTEM_NAME MATCHES "SYSV5.*") + set(SDL_CMAKE_PLATFORM SYSV5) + elseif(CMAKE_SYSTEM_NAME MATCHES "Solaris.*|SunOS.*") + set(SDL_CMAKE_PLATFORM Solaris) + elseif(CMAKE_SYSTEM_NAME MATCHES "HP-UX.*") + set(SDL_CMAKE_PLATFORM HPUX) + elseif(CMAKE_SYSTEM_NAME MATCHES "AIX.*") + set(SDL_CMAKE_PLATFORM AIX) + elseif(CMAKE_SYSTEM_NAME MATCHES "Minix.*") + set(SDL_CMAKE_PLATFORM Minix) + elseif(CMAKE_SYSTEM_NAME MATCHES "Android.*") + set(SDL_CMAKE_PLATFORM Android) + elseif(CMAKE_SYSTEM_NAME MATCHES "Emscripten.*") + set(SDL_CMAKE_PLATFORM Emscripten) + elseif(CMAKE_SYSTEM_NAME MATCHES "QNX.*") + set(SDL_CMAKE_PLATFORM QNX) + elseif(CMAKE_SYSTEM_NAME MATCHES "BeOS.*") + message(FATAL_ERROR "BeOS support has been removed as of SDL 2.0.2.") + endif() + + if(SDL_CMAKE_PLATFORM) + string(TOUPPER "${SDL_CMAKE_PLATFORM}" _upper_platform) + set(${_upper_platform} TRUE) + else() + set(SDL_CMAKE_PLATFORM} "unknown") + endif() +endmacro() + +function(SDL_DetectCPUArchitecture) + set(sdl_cpu_names) + if(APPLE AND CMAKE_OSX_ARCHITECTURES) + foreach(osx_arch ${CMAKE_OSX_ARCHITECTURES}) + if(osx_arch STREQUAL "x86_64") + list(APPEND sdl_cpu_names "x64") + elseif(osx_arch STREQUAL "arm64") + list(APPEND sdl_cpu_names "arm64") + endif() + endforeach() + endif() + + set(sdl_known_archs x64 x86 arm64 arm32 emscripten powerpc64 powerpc32 loongarch64) + if(NOT sdl_cpu_names) + set(found FALSE) + foreach(sdl_known_arch ${sdl_known_archs}) + if(NOT found) + string(TOUPPER "${sdl_known_arch}" sdl_known_arch_upper) + set(var_name "SDL_CPU_${sdl_known_arch_upper}") + check_cpu_architecture(${sdl_known_arch} ${var_name}) + if(${var_name}) + list(APPEND sdl_cpu_names ${sdl_known_arch}) + set(found TRUE) + endif() + endif() + endforeach() + endif() + + foreach(sdl_known_arch ${sdl_known_archs}) + string(TOUPPER "${sdl_known_arch}" sdl_known_arch_upper) + set(var_name "SDL_CPU_${sdl_known_arch_upper}") + if(sdl_cpu_names MATCHES "(^|;)${sdl_known_arch}($|;)") # FIXME: use if(IN_LIST) + set(${var_name} 1 PARENT_SCOPE) + else() + set(${var_name} 0 PARENT_SCOPE) + endif() + endforeach() + set(SDL_CPU_NAMES ${sdl_cpu_names} PARENT_SCOPE) +endfunction()