Files
reVC/CMakeLists.txt
T
Elnur Hajiyev a03a68de95 Add first-class macOS build and launch support (#42)
* 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
2026-09-05 12:00:00 -03:00

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()