From f81eb03349624f9b41f5d818c3bab1242ad2e165 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Mon, 5 Jul 2021 23:53:57 +0200 Subject: [PATCH 01/14] ci: test on mingw-w64 --- .github/workflows/build-mingw.yml | 59 +++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 .github/workflows/build-mingw.yml diff --git a/.github/workflows/build-mingw.yml b/.github/workflows/build-mingw.yml new file mode 100644 index 00000000..f9326f5b --- /dev/null +++ b/.github/workflows/build-mingw.yml @@ -0,0 +1,59 @@ +name: Build using cmake+msys2+mingw(32|64) +on: + pull_request: + push: + release: + types: published +jobs: + build-mingw: + strategy: + matrix: + arch: ['i686', 'x86_64'] + platform: ['gl3-glfw', 'gl3-sdl2', 'd3d9'] + runs-on: windows-latest + defaults: + run: + shell: msys2 {0} + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + - name: "Calculate variables" + id: "variables" + shell: python + run: | + cmake_args = { + "gl3-glfw": "-DLIBRW_PLATFORM=GL3 -DLIBRW_GL3_GFXLIB=GLFW", + "gl3-sdl2": "-DLIBRW_PLATFORM=GL3 -DLIBRW_GL3_GFXLIB=SDL2", + "d3d9": "-DLIBRW_PLATFORM=D3D9" + }["${{ matrix.platform }}"] + print("::set-output name=cmake_args::{}".format(cmake_args)) + msystem = { + "i686": "MINGW32", + "x86_64": "MINGW64", + }["${{ matrix.arch }}"] + print("::set-output name=msystem::{}".format(msystem)) + - uses: msys2/setup-msys2@v2 + with: + msystem: ${{ steps.variables.outputs.msystem }} + install: >- + mingw-w64-${{ matrix.arch }}-gcc + mingw-w64-${{ matrix.arch }}-cmake + mingw-w64-${{ matrix.arch }}-make + mingw-w64-${{ matrix.arch }}-glfw + mingw-w64-${{ matrix.arch }}-SDL2 + - name: "Build files (CMake)" + shell: "msys2 {0}" + run: | + cmake -S. -Bbuild ${{ steps.variables.outputs.cmake_args }} -DLIBRW_INSTALL=True -G "MinGW Makefiles" + cmake --build build --parallel + - name: "Create binary package (CPack)" + shell: "msys2 {0}" + working-directory: ./build + run: | + cpack + - name: "Archive binary package (github artifacts)" + uses: actions/upload-artifact@v2 + with: + name: "mingw-${{ matrix.platform }}-${{ matrix.arch }}" + path: build/*.tar.xz + if-no-files-found: error From 5c8c96fc8a8d64b311d41c2634cca0b0e6f55fce Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 8 Jul 2021 17:01:42 +0200 Subject: [PATCH 02/14] cmake: add ability to select shared/static SDL2/glfw3 --- CMakeLists.txt | 14 +++-- cmake/FindSDL2.cmake | 107 ++++++++++++++++++++++++++++------- cmake/Findglfw3.cmake | 79 ++++++++++++++++++++++++++ cmake/librw-config.cmake.in | 2 + cmake/nx/NXFunctions.cmake | 3 + cmake/win/WinFunctions.cmake | 5 ++ conanfile.py | 4 ++ 7 files changed, 187 insertions(+), 27 deletions(-) create mode 100644 cmake/Findglfw3.cmake create mode 100644 cmake/win/WinFunctions.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index de3211db..44496b66 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,8 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") if(WIN32) set(LIBRW_PLATFORMS "NULL" "GL3" "D3D9") set(LIBRW_PLATFORM_GL3_REQUIRES_OPENGL ON) + list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/win") + include(WinFunctions) elseif(NINTENDO_SWITCH) set(LIBRW_PLATFORMS "NULL" "GL3") set(LIBRW_PLATFORM_GL3_REQUIRES_OPENGL OFF) @@ -84,12 +86,12 @@ if(LIBRW_INSTALL) DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" ) - if(LIBRW_GL3_GFXLIB STREQUAL "SDL2") - install( - FILES "${CMAKE_CURRENT_LIST_DIR}/cmake/FindSDL2.cmake" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake" - ) - endif() + install( + FILES + "${CMAKE_CURRENT_LIST_DIR}/cmake/Findglfw3.cmake" + "${CMAKE_CURRENT_LIST_DIR}/cmake/FindSDL2.cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake" + ) string(REPLACE "." ";" cmake_c_compiler_version_list "${CMAKE_C_COMPILER_VERSION}") list(GET cmake_c_compiler_version_list 0 cmake_c_compiler_version_major) diff --git a/cmake/FindSDL2.cmake b/cmake/FindSDL2.cmake index 24288b4a..f3bcc23d 100644 --- a/cmake/FindSDL2.cmake +++ b/cmake/FindSDL2.cmake @@ -1,38 +1,103 @@ -find_package(PkgConfig QUIET) -if(PKG_CONFIG_FOUND) - pkg_check_modules(SDL2 IMPORTED_TARGET "sdl2") - if(TARGET PkgConfig::SDL2 AND NOT TARGET SDL2::SDL2) - add_library(SDL2::SDL2 INTERFACE IMPORTED) - set_property(TARGET SDL2::SDL2 PROPERTY INTERFACE_LINK_LIBRARIES PkgConfig::SDL2) +# This script supports shared and static SDL2 simultaneously. + +if(NOT DEFINED SDL2_STATIC_INIT) + set(SDL2_STATIC_INIT OFF) +endif() +option(SDL2_STATIC "By default, use static SDL2." ${SDL2_STATIC_INIT}) + +if(MSVC) + set(_lib_prefix ) + set(_lib_static_suffix .lib) + set(_lib_shared_suffix .dll.lib) +else() + set(_lib_prefix lib) + if(WIN32) + set(_lib_static_suffix .a) + set(_lib_shared_suffix .dll.a) + else() + set(_lib_static_suffix .a) + if(APPLE) + set(_lib_shared_suffix .dylib) + else() + set(_lib_shared_suffix .so) + endif() endif() endif() -find_library(SDL2main_LIBRARY SDL2main) +find_path(SDL2_INCLUDE_DIR SDL.h PATH_SUFFIXES SDL2) +find_library(SDL2_STATIC_LIBRARY NAMES ${_lib_prefix}SDL2${_lib_static_suffix}) +find_library(SDL2_SHARED_LIBRARY NAMES ${_lib_prefix}SDL2${_lib_shared_suffix}) + +# SDL2main is always a static library +find_library(SDL2_SDL2main_LIBRARY ${_lib_prefix}SDL2main${_lib_static_suffix}) + +set(_sdl2_required_variables ) +if(SDL2_STATIC) + list(APPEND _sdl2_required_variables SDL2_STATIC_LIBRARY) +else() + list(APPEND _sdl2_required_variables SDL2_SHARED_LIBRARY) +endif() +list(APPEND _sdl2_required_variables SDL2_INCLUDE_DIR) -if(NOT SDL2_FOUND) - find_path(SDL2_INCLUDE_DIR sdl2.h) - find_library(SDL2_LIBRARY SDL2 SDL2d) +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(SDL2 + REQUIRED_VARS ${_sdl2_required_variables} +) - find_library(SDL2main_LIBRARY SDL2main) +set(SDL2_SHARED_EXTRA_LIBRARIES CACHE STRING "SDL2 extra shared libraries") +if(WIN32) + set(SDL2_STATIC_EXTRA_LIBRARIES imm32 setupapi version winmm CACHE STRING "SDL2 extra static libraries") +else() + set(SDL2_STATIC_EXTRA_LIBRARIES CACHE STRING "SDL2 extra static libraries") +endif() - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(libuv - REQUIRED_VARS SDL2_INCLUDE_DIR SDL2_LIBRARY +if(SDL2_INCLUDE_DIR AND SDL2_STATIC_LIBRARY AND NOT TARGET SDL2::SDL2_static) + add_library(SDL2::SDL2_static STATIC IMPORTED) + set_target_properties(SDL2::SDL2_static PROPERTIES + IMPORTED_LOCATION "${SDL2_STATIC_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES "${SDL2_STATIC_EXTRA_LIBRARIES}" ) +endif() - if(NOT TARGET SDL2::SDL2) - add_library(SDL2::SDL2 UNKNOWN IMPORTED) +if(SDL2_INCLUDE_DIR AND SDL2_SHARED_LIBRARY AND NOT TARGET SDL2::SDL2_shared) + add_library(SDL2::SDL2_shared SHARED IMPORTED) + set_target_properties(SDL2::SDL2_shared PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES "${SDL2_SHARED_EXTRA_LIBRARIES}" + ) + if(WIN32) + set_target_properties(SDL2::SDL2_shared PROPERTIES + IMPORTED_IMPLIB "${SDL2_SHARED_LIBRARY}" + ) + else() + set_target_properties(SDL2::SDL2_shared PROPERTIES + IMPORTED_LOCATION "${SDL2_SHARED_LIBRARY}" + ) + endif() +endif() + +if(SDL2_FOUND AND NOT TARGET SDL2::SDL2) + add_library(SDL2::SDL2 INTERFACE IMPORTED) + if(SDL2_STATIC) + set_target_properties(SDL2::SDL2 PROPERTIES + INTERFACE_LINK_LIBRARIES "SDL2::SDL2_static" + ) + else() set_target_properties(SDL2::SDL2 PROPERTIES - IMPORTED_LOCATION "${SDL2_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES "SDL2::SDL2_shared" ) endif() endif() -if(SDL2main_LIBRARY AND NOT TARGET SDL2::SDL2main) - add_library(SDL2::SDL2main UNKNOWN IMPORTED) +if(SDL2_SDL2main_LIBRARY AND NOT TARGET SDL2::SDL2main) + message(STATUS "SDL2main is available") + add_library(SDL2::SDL2main STATIC IMPORTED) set_target_properties(SDL2::SDL2main PROPERTIES - IMPORTED_LOCATION "${SDL2main_LIBRARY}" + IMPORTED_LOCATION "${SDL2_SDL2main_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIR}" ) +else() + message(STATUS "SDL2main is NOT available") endif() + diff --git a/cmake/Findglfw3.cmake b/cmake/Findglfw3.cmake new file mode 100644 index 00000000..4f8f3c4f --- /dev/null +++ b/cmake/Findglfw3.cmake @@ -0,0 +1,79 @@ +# This script supports shared and static libglfw3 simultaneously. + +if(NOT DEFINED GLFW3_STATIC_INIT) + set(GLFW3_STATIC_INIT OFF) +endif() +option(GLFW3_STATIC "By default, use static glfw3." ${GLFW3_STATIC_INIT}) + +if(MSVC) + set(_lib_prefix ) + set(_lib_static_suffix .lib) + set(_lib_shared_suffix .dll.lib) +else() + set(_lib_prefix lib) + if(WIN32) + set(_lib_static_suffix .a) + set(_lib_shared_suffix .dll.a) + else() + set(_lib_static_suffix .a) + if(APPLE) + set(_lib_shared_suffix .dylib) + else() + set(_lib_shared_suffix .so) + endif() + endif() +endif() + +find_path(GLFW3_INCLUDE_DIR glfw3.h PATH_SUFFIXES GLFW) +find_library(GLFW3_STATIC_LIBRARY NAMES ${_lib_prefix}glfw3${_lib_static_suffix} ${_lib_prefix}glfw${_lib_static_suffix}) +find_library(GLFW3_SHARED_LIBRARY NAMES ${_lib_prefix}glfw3${_lib_shared_suffix} ${_lib_prefix}glfw${_lib_shared_suffix}) + +set(_glfw3_required_variables ) +if(GLFW3_STATIC) + list(APPEND _glfw3_required_variables GLFW3_STATIC_LIBRARY) +else() + list(APPEND _glfw3_required_variables GLFW3_SHARED_LIBRARY) +endif() +list(APPEND _glfw3_required_variables GLFW3_INCLUDE_DIR) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(glfw3 + REQUIRED_VARS ${_glfw3_required_variables} +) + +if(GLFW3_INCLUDE_DIR AND GLFW3_STATIC_LIBRARY AND NOT TARGET glfw_static) + add_library(glfw_static STATIC IMPORTED) + set_target_properties(glfw_static PROPERTIES + IMPORTED_LOCATION "${GLFW3_STATIC_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${GLFW3_INCLUDE_DIR}" + ) +endif() + +if(GLFW3_INCLUDE_DIR AND GLFW3_SHARED_LIBRARY AND NOT TARGET glfw_shared) + add_library(glfw_shared SHARED IMPORTED) + set_target_properties(glfw_shared PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${GLFW3_INCLUDE_DIR}" + ) + if(WIN32) + set_target_properties(glfw_shared PROPERTIES + IMPORTED_IMPLIB "${GLFW3_SHARED_LIBRARY}" + ) + else() + set_target_properties(glfw_shared PROPERTIES + IMPORTED_LOCATION "${GLFW3_SHARED_LIBRARY}" + ) + endif() +endif() + +if(glfw3_FOUND AND NOT TARGET glfw) + add_library(glfw INTERFACE IMPORTED) + if(GLFW3_STATIC) + set_target_properties(glfw PROPERTIES + INTERFACE_LINK_LIBRARIES "glfw_static" + ) + else() + set_target_properties(glfw PROPERTIES + INTERFACE_LINK_LIBRARIES "glfw_shared" + ) + endif() +endif() diff --git a/cmake/librw-config.cmake.in b/cmake/librw-config.cmake.in index 47b3487c..882f9293 100644 --- a/cmake/librw-config.cmake.in +++ b/cmake/librw-config.cmake.in @@ -15,8 +15,10 @@ if(LIBRW_PLATFORM_GL3) endif() if(LIBRW_GL3_GFXLIB STREQUAL "GLFW") + set(GLFW3_STATIC @GLFW3_STATIC@) find_package(glfw3 REQUIRED) elseif(LIBRW_GL3_GFXLIB STREQUAL "SDL2") + set(SDL2_STATIC @SDL2_STATIC@) find_package(SDL2 REQUIRED) endif() endif() diff --git a/cmake/nx/NXFunctions.cmake b/cmake/nx/NXFunctions.cmake index bab3360c..f9be8d8d 100644 --- a/cmake/nx/NXFunctions.cmake +++ b/cmake/nx/NXFunctions.cmake @@ -6,6 +6,9 @@ if(NOT COMMAND nx_create_nro) message(FATAL_ERROR "The `nx_create_nro` cmake command is not available. Please use an appropriate Nintendo Switch toolchain.") endif() +set(SDL2_STATIC_INIT ON) +set(GLFW3_STATIC_INIT ON) + set(CMAKE_EXECUTABLE_SUFFIX ".elf") function(librw_platform_target TARGET) diff --git a/cmake/win/WinFunctions.cmake b/cmake/win/WinFunctions.cmake new file mode 100644 index 00000000..d06280a5 --- /dev/null +++ b/cmake/win/WinFunctions.cmake @@ -0,0 +1,5 @@ +set(SDL2_STATIC_INIT ON) +set(GLFW3_STATIC_INIT ON) + +function(librw_platform_target TARGET) +endfunction() diff --git a/conanfile.py b/conanfile.py index 4cefb491..f4c3069a 100644 --- a/conanfile.py +++ b/conanfile.py @@ -111,6 +111,10 @@ def build(self): cmake.definitions["LIBRW_TOOLS"] = True if self.options.platform == "gl3": cmake.definitions["LIBRW_GL3_GFXLIB"] = str(self.options.gl3_gfxlib).upper() + if self.options.gl3_gfxlib == "sdl2": + cmake.definitions["SDL2_STATIC"] = not self.options["sdl2"].shared + if self.options.gl3_gfxlib == "glfw": + cmake.definitions["GLFW3_STATIC"] = not self.options["glfw"].shared if self._os_is_playstation2: env["PS2SDK"] = self.deps_cpp_info["ps2dev-ps2sdk"].rootpath with tools.environment_append(env): From 7c754b835629cb8445d2dca37d095f880dc85d92 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 8 Jul 2021 17:05:08 +0200 Subject: [PATCH 03/14] cmake: enable building tools + installation when building librw as a standalone project --- CMakeLists.txt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 44496b66..f0d45dfa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,3 +1,10 @@ +set(librw_SUBPROJECT OFF) +set(librw_MAINPROJECT ON) +if(DEFINED PROJECT_NAME) + set(librw_SUBPROJECT ON) + set(librw_MAINPROJECT OFF) +endif() + cmake_minimum_required(VERSION 3.8) project(librw VERSION 0.0.1 @@ -55,8 +62,8 @@ endif() include(CMakeDependentOption) -option(LIBRW_TOOLS "Build librw tools" ON) -option(LIBRW_INSTALL "Install librw files" OFF) +option(LIBRW_TOOLS "Build librw tools" ${librw_MAINPROJECT}) +option(LIBRW_INSTALL "Install librw files" ${librw_MAINPROJECT}) cmake_dependent_option(LIBRW_EXAMPLES "Build librw examples" ON "NOT LIBRW_PLATFORM_PS2;NOT LIBRW_PLATFORM_NULL" OFF) if(LIBRW_INSTALL) From 183dea9a32a2579480a11768506864683d7610a3 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 8 Jul 2021 17:33:48 +0200 Subject: [PATCH 04/14] cmake: add option to use static runtime (no need for libgcc.dll/libstdc++.dll/libwinpthread.dll --- CMakeLists.txt | 7 +++++++ cmake/UseStaticRuntime.cmake | 7 +++++++ cmake/win/WinFunctions.cmake | 2 ++ 3 files changed, 16 insertions(+) create mode 100644 cmake/UseStaticRuntime.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index f0d45dfa..f3460030 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,8 @@ set(librw_AUTHOR aap) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") +set(LIBRW_STATIC_RUNTIME_DEFAULT OFF) + if(WIN32) set(LIBRW_PLATFORMS "NULL" "GL3" "D3D9") set(LIBRW_PLATFORM_GL3_REQUIRES_OPENGL ON) @@ -65,6 +67,11 @@ include(CMakeDependentOption) option(LIBRW_TOOLS "Build librw tools" ${librw_MAINPROJECT}) option(LIBRW_INSTALL "Install librw files" ${librw_MAINPROJECT}) cmake_dependent_option(LIBRW_EXAMPLES "Build librw examples" ON "NOT LIBRW_PLATFORM_PS2;NOT LIBRW_PLATFORM_NULL" OFF) +option(LIBRW_STATIC_RUNTIME "Try very hard to link to static libraries" ${LIBRW_STATIC_RUNTIME_DEFAULT}) + +if(LIBRW_STATIC_RUNTIME) + include(UseStaticRuntime) +endif() if(LIBRW_INSTALL) include(GNUInstallDirs) diff --git a/cmake/UseStaticRuntime.cmake b/cmake/UseStaticRuntime.cmake new file mode 100644 index 00000000..f61fa26a --- /dev/null +++ b/cmake/UseStaticRuntime.cmake @@ -0,0 +1,7 @@ +if(CMAKE_C_COMPILER_ID MATCHES "^MSVC$") + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") +endif() + +if(CMAKE_C_COMPILER_ID MATCHES "^(GNU|Clang)$") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") +endif() diff --git a/cmake/win/WinFunctions.cmake b/cmake/win/WinFunctions.cmake index d06280a5..b7f0267a 100644 --- a/cmake/win/WinFunctions.cmake +++ b/cmake/win/WinFunctions.cmake @@ -1,5 +1,7 @@ set(SDL2_STATIC_INIT ON) set(GLFW3_STATIC_INIT ON) +set(LIBRW_STATIC_RUNTIME_DEFAULT ON) + function(librw_platform_target TARGET) endfunction() From cd00886f7848ec02a2b2987a9989cde88e5d0dce Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 8 Jul 2021 17:37:29 +0200 Subject: [PATCH 05/14] cmake: add arch to cpack filename --- CMakeLists.txt | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f3460030..3508c416 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -124,7 +124,7 @@ if(LIBRW_INSTALL) set(compiler "-appleclang${cmake_c_compiler_version_major}") else() set(compiler "-UNK") - message(WARNING "Unknown compiler. Created cpack package will be wrong. (override using cpack -P)") + message(WARNING "Unknown compiler. Name of created cpack package will be wrong. (override using cpack -P)") endif() endif() if(LIBRW_PLATFORM_NULL) @@ -151,11 +151,23 @@ if(LIBRW_INSTALL) set(os "-switch") else() set(compiler "-UNK") - message(WARNING "Unknown os. Created cpack package will be wrong. (override using cpack -P)") + message(WARNING "Unknown os. Name of created cpack package will be wrong. (override using cpack -P)") endif() endif() + if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(AMD64|amd64|[xX]86(_64)?|i[3-6]86)$") + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(processor "-x86") + else() + set(processor "-x64") + endif() + elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|AARCH64)$") + set(processor "-aarch64") + else() + set(processor "-UNK") + message(WARNING "Unknown processor (${CMAKE_SYSTEM_PROCESSOR}). Name of created cpack package will be wrong. (override using cpack -P)") + endif() - set(CPACK_PACKAGE_NAME "${PROJECT_NAME}${platform}${os}${compiler}") + set(CPACK_PACKAGE_NAME "${PROJECT_NAME}${platform}${os}${processor}${compiler}") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A (partial) re-implementation of RenderWare Graphics") set(CPACK_PACKAGE_VENDOR "aap") set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/LICENSE") From 0b98ee91abe62d4c6d7743642f88e64b9ec26a79 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 8 Jul 2021 18:05:49 +0200 Subject: [PATCH 06/14] cmake: remove LIBRW_PLATFORM_GL3_REQUIRES_OPENGL --- CMakeLists.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3508c416..0df6ef7e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,22 +18,18 @@ set(LIBRW_STATIC_RUNTIME_DEFAULT OFF) if(WIN32) set(LIBRW_PLATFORMS "NULL" "GL3" "D3D9") - set(LIBRW_PLATFORM_GL3_REQUIRES_OPENGL ON) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/win") include(WinFunctions) elseif(NINTENDO_SWITCH) set(LIBRW_PLATFORMS "NULL" "GL3") - set(LIBRW_PLATFORM_GL3_REQUIRES_OPENGL OFF) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/nx") include(NXFunctions) elseif(PS2) set(LIBRW_PLATFORMS "NULL" "PS2") - set(LIBRW_PLATFORM_GL3_REQUIRES_OPENGL OFF) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/ps2") include(PS2Functions) else() set(LIBRW_PLATFORMS "NULL" "GL3") - set(LIBRW_PLATFORM_GL3_REQUIRES_OPENGL ON) endif() set(LIBRW_PLATFORM "NULL" CACHE STRING "Platform") set_property(CACHE LIBRW_PLATFORM PROPERTY STRINGS ${LIBRW_PLATFORMS}) From 81beca397535d50830162af7a107c8ab4f64c9d1 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 8 Jul 2021 17:59:59 +0200 Subject: [PATCH 07/14] cmake: mark WinMain as an undefined symbol, when building with mingw --- cmake/win/WinFunctions.cmake | 13 +++++++++++++ skeleton/CMakeLists.txt | 12 +++++++----- src/CMakeLists.txt | 2 ++ 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/cmake/win/WinFunctions.cmake b/cmake/win/WinFunctions.cmake index b7f0267a..d693af36 100644 --- a/cmake/win/WinFunctions.cmake +++ b/cmake/win/WinFunctions.cmake @@ -4,4 +4,17 @@ set(GLFW3_STATIC_INIT ON) set(LIBRW_STATIC_RUNTIME_DEFAULT ON) function(librw_platform_target TARGET) + cmake_parse_arguments(LPT "PROVIDES_WINMAIN" "" "" ${ARGN}) + get_target_property(TARGET_TYPE "${TARGET}" TYPE) + + if(MINGW) + if(LPT_PROVIDES_WINMAIN AND TARGET_TYPE MATCHES "^(INTERFACE|SHARED|STATIC)_LIBRARY$") + # Start with the WinMain symbol marked as undefined. + # This will prevent the linker ignoring a WinMain symbol. + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + target_link_options(${TARGET} INTERFACE -Wl,--undefined,_WinMain@16) + endif() + target_link_options(${TARGET} INTERFACE -Wl,--undefined,WinMain) + endif() + endif() endfunction() diff --git a/skeleton/CMakeLists.txt b/skeleton/CMakeLists.txt index 3083adc7..276e9d79 100644 --- a/skeleton/CMakeLists.txt +++ b/skeleton/CMakeLists.txt @@ -31,17 +31,19 @@ set_target_properties(librw_skeleton EXPORT_NAME skeleton ) -target_link_libraries(librw_skeleton - PRIVATE - librw -) - target_include_directories(librw_skeleton PUBLIC $ $ ) +target_link_libraries(librw_skeleton + PRIVATE + librw +) + +librw_platform_target(librw_skeleton PROVIDES_WINMAIN INSTALL) + if(LIBRW_INSTALL) install( FILES diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5b169011..05213518 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -192,6 +192,8 @@ elseif(LIBRW_PLATFORM_D3D9) ) endif() +librw_platform_target(librw INSTALL) + if(LIBRW_INSTALL) install( FILES From 5eba9b3092943c60ff0433424d3ec2e23f85e544 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 8 Jul 2021 18:09:24 +0200 Subject: [PATCH 08/14] cmake+msvc: set debugger working directory to directory of binary --- cmake/win/WinFunctions.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmake/win/WinFunctions.cmake b/cmake/win/WinFunctions.cmake index d693af36..c56cfa72 100644 --- a/cmake/win/WinFunctions.cmake +++ b/cmake/win/WinFunctions.cmake @@ -17,4 +17,8 @@ function(librw_platform_target TARGET) target_link_options(${TARGET} INTERFACE -Wl,--undefined,WinMain) endif() endif() + + set_target_properties(${TARGET} PROPERTIES + VS_DEBUGGER_WORKING_DIRECTORY "$" + ) endfunction() From bea6507390fa7b58888a0dd0e78ab6c393f28bda Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 8 Jul 2021 18:43:52 +0200 Subject: [PATCH 09/14] cmake: pass SDL_MAIN_HANDLED to avoid renaming main -> SDL_main --- skeleton/CMakeLists.txt | 8 ++++++++ tools/dumprwtree/CMakeLists.txt | 7 +++++++ tools/ska2anm/CMakeLists.txt | 7 +++++++ 3 files changed, 22 insertions(+) diff --git a/skeleton/CMakeLists.txt b/skeleton/CMakeLists.txt index 276e9d79..40eda100 100644 --- a/skeleton/CMakeLists.txt +++ b/skeleton/CMakeLists.txt @@ -31,6 +31,14 @@ set_target_properties(librw_skeleton EXPORT_NAME skeleton ) + +if(LIBRW_PLATFORM_GL3 AND LIBRW_GL3_GFXLIB STREQUAL "SDL2") + target_compile_definitions(librw_skeleton + PRIVATE + SDL_MAIN_HANDLED + ) +endif() + target_include_directories(librw_skeleton PUBLIC $ diff --git a/tools/dumprwtree/CMakeLists.txt b/tools/dumprwtree/CMakeLists.txt index fdd0a230..8212d23b 100644 --- a/tools/dumprwtree/CMakeLists.txt +++ b/tools/dumprwtree/CMakeLists.txt @@ -2,6 +2,13 @@ add_executable(dumprwtree dumprwtree.cpp ) +if(LIBRW_PLATFORM_GL3 AND LIBRW_GL3_GFXLIB STREQUAL "SDL2") + target_compile_definitions(dumprwtree + PRIVATE + SDL_MAIN_HANDLED + ) +endif() + target_link_libraries(dumprwtree PRIVATE librw::librw diff --git a/tools/ska2anm/CMakeLists.txt b/tools/ska2anm/CMakeLists.txt index ffd63d5b..0ab7d01c 100644 --- a/tools/ska2anm/CMakeLists.txt +++ b/tools/ska2anm/CMakeLists.txt @@ -2,6 +2,13 @@ add_executable(ska2anm ska2anm.cpp ) +if(LIBRW_PLATFORM_GL3 AND LIBRW_GL3_GFXLIB STREQUAL "SDL2") + target_compile_definitions(ska2anm + PRIVATE + SDL_MAIN_HANDLED + ) +endif() + target_link_libraries(ska2anm PUBLIC librw::librw From f901866fce6b78754c684a9d3e17605b5ac82b49 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 9 Jul 2021 01:41:01 +0200 Subject: [PATCH 10/14] cmake: on Windows copy glfw3/SDL2 dll + gcc runtime library to package (if needed) --- cmake/win/WinFunctions.cmake | 41 +++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/cmake/win/WinFunctions.cmake b/cmake/win/WinFunctions.cmake index c56cfa72..ddd97fc4 100644 --- a/cmake/win/WinFunctions.cmake +++ b/cmake/win/WinFunctions.cmake @@ -3,8 +3,10 @@ set(GLFW3_STATIC_INIT ON) set(LIBRW_STATIC_RUNTIME_DEFAULT ON) +option(LIBRW_INSTALL_RUNTIME_DEPS "Install runtime dependencies of executables" OFF) + function(librw_platform_target TARGET) - cmake_parse_arguments(LPT "PROVIDES_WINMAIN" "" "" ${ARGN}) + cmake_parse_arguments(LPT "INSTALL;PROVIDES_WINMAIN" "" "" ${ARGN}) get_target_property(TARGET_TYPE "${TARGET}" TYPE) if(MINGW) @@ -21,4 +23,41 @@ function(librw_platform_target TARGET) set_target_properties(${TARGET} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "$" ) + + if(LIBRW_INSTALL_RUNTIME_DEPS) + # Copy runtime dependencies (glfw3/SDL2 library + gcc runtime libraries) + if(LPT_INSTALL AND TARGET_TYPE MATCHES "^EXECUTABLE$") + cmake_minimum_required(VERSION 3.14) + # FIXME: Once CMake 3.21 becomes common, replace with `install(RUNTIME_DEPENDENCY_SET)` + set(install_code [=[ + set(runtime_extra_directories) + execute_process(COMMAND uname OUTPUT_VARIABLE uname OUTPUT_VARIABLE uname_out RESULT_VARIABLE uname_res) + if(uname_res EQUAL 0) + string(STRIP "${uname_out}" uname_out) + if (uname_out MATCHES "^(MINGW|mingw)(32|64)" AND DEFINED ENV{MSYSTEM_PREFIX}) + execute_process(COMMAND cygpath -m "$ENV{MSYSTEM_PREFIX}/bin" OUTPUT_VARIABLE cygpath_out RESULT_VARIABLE cygpath_res) + if(cygpath_res EQUAL 0) + string(STRIP "${cygpath_out}" cygpath_out) + list(APPEND runtime_extra_directories "${cygpath_out}") + endif() + endif() + endif() + + file(GET_RUNTIME_DEPENDENCIES + RESOLVED_DEPENDENCIES_VAR var + UNRESOLVED_DEPENDENCIES_VAR unvar + EXECUTABLES $ + DIRECTORIES ${runtime_extra_directories} + ) + file(COPY ${var} DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/__CMAKE_INSTALL_BINDIR__ + FILES_MATCHING + REGEX ".*(lib)?(GLFW|glfw|SDL2|sdl2).*\\.dll$" + REGEX ".*lib(gcc|stdc\\+\\+|winpthread).*\\.dll$" + ) + ]=]) + string(REPLACE __TARGET__ "${TARGET}" install_code ${install_code}) + string(REPLACE __CMAKE_INSTALL_BINDIR__ "${CMAKE_INSTALL_BINDIR}" install_code ${install_code}) + install(CODE "${install_code}") + endif() + endif() endfunction() From 017ea1c70d72e057c5f90858916246be81c446aa Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 9 Jul 2021 12:33:13 +0200 Subject: [PATCH 11/14] cmake+skeleton: skeleton needs imm32 on Window (mingw does not understand #pragma comment(lib)) --- skeleton/CMakeLists.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/skeleton/CMakeLists.txt b/skeleton/CMakeLists.txt index 40eda100..b420dc00 100644 --- a/skeleton/CMakeLists.txt +++ b/skeleton/CMakeLists.txt @@ -50,6 +50,13 @@ target_link_libraries(librw_skeleton librw ) +if(WIN32) + target_link_libraries(librw_skeleton + PRIVATE + imm32 + ) +endif() + librw_platform_target(librw_skeleton PROVIDES_WINMAIN INSTALL) if(LIBRW_INSTALL) From a5e140f5e43ceab035029f3eaaeee92eec536eea Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Tue, 31 Aug 2021 19:28:43 +0200 Subject: [PATCH 12/14] conan: use conan-center-index's sdl recipe --- conanfile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conanfile.py b/conanfile.py index f4c3069a..16af75f4 100644 --- a/conanfile.py +++ b/conanfile.py @@ -55,7 +55,7 @@ def requirements(self): if self.options.gl3_gfxlib == "glfw": self.requires("glfw/3.3.2") elif self.options.gl3_gfxlib == "sdl2": - self.requires("sdl2/2.0.12@bincrafters/stable") + self.requires("sdl/2.0.16") elif self.options.platform == "ps2": self.requires("ps2dev-ps2sdk/unknown@madebr/testing") if self._os_is_playstation2: @@ -112,7 +112,7 @@ def build(self): if self.options.platform == "gl3": cmake.definitions["LIBRW_GL3_GFXLIB"] = str(self.options.gl3_gfxlib).upper() if self.options.gl3_gfxlib == "sdl2": - cmake.definitions["SDL2_STATIC"] = not self.options["sdl2"].shared + cmake.definitions["SDL2_STATIC"] = not self.options["sdl"].shared if self.options.gl3_gfxlib == "glfw": cmake.definitions["GLFW3_STATIC"] = not self.options["glfw"].shared if self._os_is_playstation2: From 75bdfe06765cb2fb4cfe6a29c26e7b354e28ab9e Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Tue, 31 Aug 2021 19:38:50 +0200 Subject: [PATCH 13/14] conan: add extra check for platform=ps2 --- conanfile.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/conanfile.py b/conanfile.py index 16af75f4..6c0ad9c4 100644 --- a/conanfile.py +++ b/conanfile.py @@ -43,13 +43,6 @@ def configure(self): if self.options.platform != "gl3": del self.options.gl3_gfxlib - def validate(self): - if self.options.platform == "d3d9" and self.settings.os != "Windows": - raise ConanInvalidConfiguration("platform=d3d9 can only be built for os=Windows") - if self._os_is_playstation2: - if self.options.platform not in ("null", "ps2"): - raise ConanInvalidConfiguration("os=Playstation2 only supports platform=(null,ps2)") - def requirements(self): if self.options.platform == "gl3": if self.options.gl3_gfxlib == "glfw": @@ -61,6 +54,14 @@ def requirements(self): if self._os_is_playstation2: self.requires("ps2dev-cmaketoolchain/{}".format(self.version)) + def validate(self): + if self.options.platform == "d3d9" and self.settings.os != "Windows": + raise ConanInvalidConfiguration("platform=d3d9 can only be built for os=Windows") + if self.options.platform != "ps2" and self._os_is_playstation2: + raise ConanInvalidConfiguration("os=Playstation2 only supports platform=null") + if self.options.platform == "ps2" and not self._os_is_playstation2: + raise ConanInvalidConfiguration("platform=ps2 is only valid for os=Playstation2") + def export_sources(self): for d in ("cmake", "skeleton", "src", "tools"): shutil.copytree(src=d, dst=os.path.join(self.export_sources_folder, d)) From 8f1728b86c6932f09103b800cf0ed399f3b8e892 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Tue, 31 Aug 2021 19:51:16 +0200 Subject: [PATCH 14/14] Rename mingw github action --- .github/workflows/build-mingw.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-mingw.yml b/.github/workflows/build-mingw.yml index f9326f5b..4742f78d 100644 --- a/.github/workflows/build-mingw.yml +++ b/.github/workflows/build-mingw.yml @@ -1,4 +1,4 @@ -name: Build using cmake+msys2+mingw(32|64) +name: Build using msys2+mingw(32|64) on: pull_request: push: