diff --git a/.github/workflows/build-mingw.yml b/.github/workflows/build-mingw.yml new file mode 100644 index 00000000..4742f78d --- /dev/null +++ b/.github/workflows/build-mingw.yml @@ -0,0 +1,59 @@ +name: Build using 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 diff --git a/CMakeLists.txt b/CMakeLists.txt index 1f4d3ce7..7edea037 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,7 @@ +set(librw_SUBPROJECT OFF) set(librw_MAINPROJECT ON) if(DEFINED PROJECT_NAME) + set(librw_SUBPROJECT ON) set(librw_MAINPROJECT OFF) endif() @@ -12,22 +14,22 @@ 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) + 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 "PS2") - set(LIBRW_PLATFORM_GL3_REQUIRES_OPENGL OFF) + set(LIBRW_PLATFORMS "NULL" "PS2") 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() list(GET LIBRW_PLATFORMS 0 LIBRW_PLATFORM_DEFAULT) set(LIBRW_PLATFORM "${LIBRW_PLATFORM_DEFAULT}" CACHE STRING "Platform") @@ -61,7 +63,12 @@ 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 "LIBRW_TOOLS;NOT LIBRW_PLATFORM_NULL" OFF) +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) @@ -70,7 +77,7 @@ endif() add_subdirectory(src) -if(LIBRW_TOOLS AND NOT LIBRW_PLATFORM_PS2 AND NOT LIBRW_PLATFORM_NULL) +if(NOT LIBRW_PLATFORM_PS2 AND NOT LIBRW_PLATFORM_NULL) add_subdirectory(skeleton) endif() @@ -90,12 +97,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) @@ -114,7 +121,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) @@ -133,21 +140,31 @@ if(LIBRW_INSTALL) if(NOT LIBRW_PLATFORM_PS2) if(WIN32) set(os "-win") - elseif(NINTENDO_SWITCH) - set(os "-switch") - elseif(PS2) - set(os "-ps2") elseif(APPLE) set(os "-apple") elseif(UNIX) set(os "-linux") + elseif(NINTENDO_SWITCH) + 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") 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/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/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..ddd97fc4 --- /dev/null +++ b/cmake/win/WinFunctions.cmake @@ -0,0 +1,63 @@ +set(SDL2_STATIC_INIT ON) +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 "INSTALL;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() + + 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() diff --git a/conanfile.py b/conanfile.py index 4cefb491..6c0ad9c4 100644 --- a/conanfile.py +++ b/conanfile.py @@ -43,24 +43,25 @@ 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": 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: 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)) @@ -111,6 +112,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["sdl"].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): diff --git a/skeleton/CMakeLists.txt b/skeleton/CMakeLists.txt index 957afb54..e385eba9 100644 --- a/skeleton/CMakeLists.txt +++ b/skeleton/CMakeLists.txt @@ -32,10 +32,13 @@ set_target_properties(librw_skeleton CXX_STANDARD 11 ) -target_link_libraries(librw_skeleton - PRIVATE - librw -) + +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 @@ -43,6 +46,20 @@ target_include_directories(librw_skeleton $ ) +target_link_libraries(librw_skeleton + PRIVATE + librw +) + +if(WIN32) + target_link_libraries(librw_skeleton + PRIVATE + imm32 + ) +endif() + +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 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