mirror of
https://github.com/mrxenginner/reVC.git
synced 2026-10-10 11:53:03 +08:00
a03a68de95
* fix: fix GLFW video mode fallback on startup * fix: fix GLFW mouse activation on startup * feat: locate macOS game directory when launched from Finder * feat: ask the user to choose a game directory if gamefiles could not be found * feat: create an app bundle for macOS builds * feat: resolve gamefiles inside or beside the app bundle * fix: distinguish ARM64 Premake platforms * fix: use libmpg123 pkg-config metadata * feat: add Xcode support to Premake and CMake * chore: ignore .DS_Store files * fix: center mouse cursor when launching and quitting the game * fix: address a TODO comment * feat: bundle reVC gamefiles as runtime overrides * feat: use macOS user directories for saves and settings * refactor: store macOS game path in reVC.ini * fix: make Xcode recognize the archive as a macOS app archive * fix: enable Hardened Runtime for the Xcode app target * fix: support CMake’s Xcode generator on macOS * build: remove stale libsndfile linkage * build: make the app bundle self-contained * fix: prevent buffer overflow with long game directory paths * chore: add application category to Info.plist * fix: omit missing Homebrew OpenAL search paths when using MacPorts * refactor: move game path declarations to FileMgr header * build: include the LICENSE file in the app bundle
238 lines
9.1 KiB
CMake
238 lines
9.1 KiB
CMake
cmake_minimum_required(VERSION 3.14)
|
|
|
|
set(EXECUTABLE reVC)
|
|
set(PROJECT REVC)
|
|
|
|
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
|
|
if(CMAKE_GENERATOR STREQUAL "Xcode")
|
|
set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64" CACHE STRING "macOS architectures")
|
|
if(NOT CMAKE_OSX_DEPLOYMENT_TARGET)
|
|
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING
|
|
"Minimum macOS version" FORCE)
|
|
endif()
|
|
if(CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS "11.0")
|
|
set("CMAKE_XCODE_ATTRIBUTE_MACOSX_DEPLOYMENT_TARGET[arch=arm64]" "11.0")
|
|
endif()
|
|
elseif(NOT CMAKE_OSX_DEPLOYMENT_TARGET)
|
|
if(CMAKE_OSX_ARCHITECTURES STREQUAL "x86_64" OR
|
|
(NOT CMAKE_OSX_ARCHITECTURES AND
|
|
CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64"))
|
|
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING
|
|
"Minimum macOS version" FORCE)
|
|
else()
|
|
set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0" CACHE STRING
|
|
"Minimum macOS version" FORCE)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
project(${EXECUTABLE} C CXX)
|
|
set(${PROJECT}_AUTHOR "${PROJECT} Team")
|
|
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
|
|
|
|
include(GetGitRevisionDescription)
|
|
get_git_head_revision(GIT_REFSPEC GIT_SHA1 "ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR")
|
|
message(STATUS "Building ${CMAKE_PROJECT_NAME} GIT SHA1: ${GIT_SHA1}")
|
|
|
|
if(APPLE)
|
|
macro(reVC_define_macos_dependency key alias formula library filename)
|
|
list(APPEND ${PROJECT}_MACOS_DEPENDENCIES "${key}")
|
|
set(${PROJECT}_MACOS_${key}_ALIAS "${alias}")
|
|
set(${PROJECT}_MACOS_${key}_FORMULA "${formula}")
|
|
set(${PROJECT}_MACOS_${key}_LIBRARY "${library}")
|
|
set(${PROJECT}_MACOS_${key}_FILENAME "${filename}")
|
|
endmacro()
|
|
|
|
reVC_define_macos_dependency(OPENAL OpenAL::OpenAL
|
|
openal-soft openal libopenal.1.dylib)
|
|
reVC_define_macos_dependency(MPG123 MPG123::libmpg123
|
|
mpg123 mpg123 libmpg123.0.dylib)
|
|
reVC_define_macos_dependency(GLFW glfw
|
|
glfw glfw libglfw.3.dylib)
|
|
|
|
if(CMAKE_GENERATOR STREQUAL "Xcode")
|
|
set(${PROJECT}_HOMEBREW_ARM64_PREFIX "/opt/homebrew" CACHE PATH "arm64 Homebrew prefix")
|
|
set(${PROJECT}_HOMEBREW_X86_64_PREFIX "/usr/local" CACHE PATH "x86_64 Homebrew prefix")
|
|
|
|
function(reVC_macos_dependency target alias dylibs formula library filename)
|
|
if(EXISTS "/opt/local/lib/${filename}")
|
|
add_library(${target} INTERFACE)
|
|
add_library(${alias} ALIAS ${target})
|
|
target_include_directories(${target} INTERFACE "/opt/local/include")
|
|
target_link_libraries(${target} INTERFACE "/opt/local/lib/${filename}")
|
|
set(${dylibs} "/opt/local/lib/${filename}" PARENT_SCOPE)
|
|
return()
|
|
endif()
|
|
|
|
set(include_prefix)
|
|
set(link_options)
|
|
set(dependency_dylibs)
|
|
foreach(architecture arm64 x86_64)
|
|
if(architecture IN_LIST CMAKE_OSX_ARCHITECTURES)
|
|
string(TOUPPER "${architecture}" architecture_upper)
|
|
set(prefix "${${PROJECT}_HOMEBREW_${architecture_upper}_PREFIX}")
|
|
set(dylib "${prefix}/opt/${formula}/lib/${filename}")
|
|
if(NOT EXISTS "${dylib}")
|
|
message(FATAL_ERROR
|
|
"${architecture} ${formula} was not found under ${prefix}"
|
|
)
|
|
endif()
|
|
if(NOT include_prefix)
|
|
set(include_prefix "${prefix}")
|
|
endif()
|
|
list(APPEND dependency_dylibs "${dylib}")
|
|
list(APPEND link_options
|
|
"SHELL:-Xarch_${architecture} -L${prefix}/opt/${formula}/lib"
|
|
)
|
|
endif()
|
|
endforeach()
|
|
|
|
add_library(${target} INTERFACE)
|
|
add_library(${alias} ALIAS ${target})
|
|
target_include_directories(${target} INTERFACE
|
|
"${include_prefix}/opt/${formula}/include"
|
|
)
|
|
target_link_options(${target} INTERFACE ${link_options} "-l${library}")
|
|
set(${dylibs} "${dependency_dylibs}" PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
if("arm64" IN_LIST CMAKE_OSX_ARCHITECTURES OR
|
|
"x86_64" IN_LIST CMAKE_OSX_ARCHITECTURES)
|
|
foreach(dependency IN LISTS ${PROJECT}_MACOS_DEPENDENCIES)
|
|
string(TOLOWER "${dependency}" dependency_lower)
|
|
reVC_macos_dependency(${PROJECT}_macos_${dependency_lower}
|
|
${${PROJECT}_MACOS_${dependency}_ALIAS}
|
|
${PROJECT}_MACOS_${dependency}_DYLIBS
|
|
${${PROJECT}_MACOS_${dependency}_FORMULA}
|
|
${${PROJECT}_MACOS_${dependency}_LIBRARY}
|
|
${${PROJECT}_MACOS_${dependency}_FILENAME})
|
|
endforeach()
|
|
endif()
|
|
else()
|
|
function(reVC_macos_dependency_dylib output formula filename)
|
|
set(prefix "$ENV{HOMEBREW_PREFIX}")
|
|
set(candidates "/opt/local/lib/${filename}")
|
|
if(CMAKE_OSX_ARCHITECTURES STREQUAL "x86_64" OR
|
|
(NOT CMAKE_OSX_ARCHITECTURES AND
|
|
CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64"))
|
|
list(APPEND candidates
|
|
"/usr/local/opt/${formula}/lib/${filename}"
|
|
)
|
|
else()
|
|
if(prefix)
|
|
list(APPEND candidates "${prefix}/opt/${formula}/lib/${filename}")
|
|
endif()
|
|
list(APPEND candidates
|
|
"/opt/homebrew/opt/${formula}/lib/${filename}"
|
|
"/usr/local/opt/${formula}/lib/${filename}"
|
|
)
|
|
endif()
|
|
list(REMOVE_DUPLICATES candidates)
|
|
foreach(candidate IN LISTS candidates)
|
|
if(EXISTS "${candidate}")
|
|
set(${output} "${candidate}" PARENT_SCOPE)
|
|
return()
|
|
endif()
|
|
endforeach()
|
|
endfunction()
|
|
|
|
foreach(dependency IN LISTS ${PROJECT}_MACOS_DEPENDENCIES)
|
|
reVC_macos_dependency_dylib(
|
|
${PROJECT}_MACOS_${dependency}_DYLIBS
|
|
${${PROJECT}_MACOS_${dependency}_FORMULA}
|
|
${${PROJECT}_MACOS_${dependency}_FILENAME})
|
|
endforeach()
|
|
endif()
|
|
endif()
|
|
|
|
|
|
if(NINTENDO_SWITCH)
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/nx")
|
|
include(NXFunctions)
|
|
endif()
|
|
|
|
if(NOT COMMAND reVC_platform_target)
|
|
function(reVC_platform_target)
|
|
endfunction()
|
|
endif()
|
|
|
|
if(WIN32)
|
|
set(${PROJECT}_AUDIOS "OAL" "MSS")
|
|
else()
|
|
set(${PROJECT}_AUDIOS "OAL")
|
|
endif()
|
|
|
|
set(${PROJECT}_AUDIO "OAL" CACHE STRING "Audio")
|
|
|
|
option(${PROJECT}_WITH_OPUS "Build ${EXECUTABLE} with opus support" OFF)
|
|
option(${PROJECT}_WITH_LIBSNDFILE "Build ${EXECUTABLE} with libsndfile (instead of internal decoder)" OFF)
|
|
|
|
set_property(CACHE ${PROJECT}_AUDIO PROPERTY STRINGS ${${PROJECT}_AUDIOS})
|
|
message(STATUS "${PROJECT}_AUDIO = ${${PROJECT}_AUDIO} (choices=${${PROJECT}_AUDIOS})")
|
|
set("${PROJECT}_AUDIO_${${PROJECT}_AUDIO}" ON)
|
|
if(NOT ${PROJECT}_AUDIO IN_LIST ${PROJECT}_AUDIOS)
|
|
message(FATAL_ERROR "Illegal ${PROJECT}_AUDIO=${${PROJECT}_AUDIO}")
|
|
endif()
|
|
|
|
option(${PROJECT}_VENDORED_LIBRW "Use vendored librw" ON)
|
|
if(${PROJECT}_VENDORED_LIBRW)
|
|
if(NOT DEFINED LIBRW_PLATFORM AND NOT PS2)
|
|
set(LIBRW_PLATFORM "GL3" CACHE STRING "librw platform")
|
|
endif()
|
|
add_subdirectory(vendor/librw)
|
|
else()
|
|
find_package(librw REQUIRED)
|
|
endif()
|
|
add_subdirectory(src)
|
|
|
|
if(${PROJECT}_INSTALL)
|
|
install(DIRECTORY gamefiles/ DESTINATION ".")
|
|
if(LIBRW_PLATFORM_NULL)
|
|
set(platform "-null")
|
|
elseif(LIBRW_PLATFORM_PS2)
|
|
set(platform "-ps2")
|
|
elseif(LIBRW_PLATFORM_GL3)
|
|
if(LIBRW_GL3_GFXLIB STREQUAL "GLFW")
|
|
set(platform "-gl3-glfw")
|
|
else()
|
|
set(platform "-gl3-sdl2")
|
|
endif()
|
|
elseif(LIBRW_PLATFORM_D3D9)
|
|
set(platform "-d3d9")
|
|
endif()
|
|
if(${PROJECT}_AUDIO_OAL)
|
|
set(audio "-oal")
|
|
elseif(${PROJECT}_AUDIO_MSS)
|
|
set(audio "-mss")
|
|
endif()
|
|
if(${PROJECT}_WITH_OPUS)
|
|
set(audio "${audio}-opus")
|
|
endif()
|
|
if(NOT LIBRW_PLATFORM_PS2)
|
|
if(WIN32)
|
|
set(os "-win")
|
|
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)")
|
|
endif()
|
|
endif()
|
|
|
|
set(CPACK_PACKAGE_NAME "${PROJECT_NAME}${platform}${audio}${os}${compiler}")
|
|
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "GTA III reversed")
|
|
set(CPACK_PACKAGE_VENDOR "GTAModding")
|
|
# FIXME: missing license (https://github.com/GTAmodding/re3/issues/794)
|
|
# set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/LICENSE")
|
|
# set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
|
|
set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_NAME}")
|
|
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}")
|
|
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}")
|
|
set(CPACK_GENERATOR "TXZ")
|
|
include(CPack)
|
|
endif()
|