mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2026-03-18 11:23:38 +00:00
This introduces a CMakePresets file for both Unix-likes and Windows that replace the old CMakeSettings. It adds presets for **Debug** and **Release** profiles for both **x64** and **ARM64** architectures, as well as **Generic builds**. Presets can be used using[ Visual Studio's built-in CMakePresets support](https://learn.microsoft.com/en-us/cpp/build/cmake-presets-vs?view=msvc-170), or [Visual Studio Code's CMake Tools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools) extension. They can also be used from the command line, like so: - x64/Unix-like/Ninja: - Configure: `cmake --preset ninja-release-x64` - Build: `cmake --build --preset ninja-build-release-x64` - Configure + Build: `cmake --workflow --preset ninja-release-x64` - ARM64/Windows/Visual Studio: - Configure: `cmake --preset visualstudio-release-arm64` - Build: `cmake --build --preset visualstudio-build-release-arm64` - Configure + Build: `cmake --workflow --preset visualstudio-release-arm64` The Ninja generator is available to both Windows and Unix-likes, while the Visual Studio Generator is only available on Windows. **Cross-compiling** On **Windows**, the Visual Studio generator automatically takes care of everything, you just need to select an ARM64 preset. On **Unix-likes**, to cross-compile you need to install a cross-compiler and (optionally) a sysroot of the target system. Here is an example to compile from x64 to ARM64 with a sysroot: - `cmake --preset ninja-release-arm64 -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ -DCMAKE_SYSROOT=/opt/sysroots/aarch64-linux-gnu` - `cmake --build --preset ninja-build-release-arm64` You will need a sysroot to link against Qt, since we do not vendor it in on platforms other than Windows. **User presets** A `CMakeUserPresets.json` file may be created locally at the root of the project to further customize your presets. For example, here are the user presets I used to test this PR on Arch Linux with a generic Arch Linux ARM sysroot: ```json { "version": 10, "configurePresets": [ { "name": "gcc-debug-arm64", "inherits": "ninja-debug-arm64", "cacheVariables": { "CMAKE_C_COMPILER": "aarch64-linux-gnu-gcc", "CMAKE_CXX_COMPILER": "aarch64-linux-gnu-g++", "CMAKE_EXE_LINKER_FLAGS": "-L/opt/sysroots/ArchLinuxARM/lib", "CMAKE_SYSROOT": "/opt/sysroots/ArchLinuxARM" } }, { "name": "clang-debug-arm64", "inherits": "ninja-debug-arm64", "cacheVariables": { "CMAKE_C_COMPILER": "clang", "CMAKE_CXX_COMPILER": "clang++", "CMAKE_C_FLAGS": "-target aarch64-linux-gnu", "CMAKE_CXX_FLAGS": "-target aarch64-linux-gnu", "CMAKE_SYSROOT": "/opt/sysroots/ArchLinuxARM" } }, { "name": "clang-debug-x64", "inherits": "ninja-debug-x64", "cacheVariables": { "CMAKE_C_COMPILER": "clang", "CMAKE_CXX_COMPILER": "clang++" } } ], "buildPresets": [ { "name": "gcc-build-debug-arm64", "configurePreset": "gcc-debug-arm64" }, { "name": "clang-build-debug-arm64", "configurePreset": "clang-debug-arm64" }, { "name": "clang-build-debug-x64", "configurePreset": "clang-debug-x64" } ], "workflowPresets": [ { "name": "gcc-debug-arm64", "steps": [ { "type": "configure", "name": "gcc-debug-arm64" }, { "type": "build", "name": "gcc-build-debug-arm64" } ] }, { "name": "clang-debug-arm64", "steps": [ { "type": "configure", "name": "clang-debug-arm64" }, { "type": "build", "name": "clang-build-debug-arm64" } ] }, { "name": "clang-debug-x64", "steps": [ { "type": "configure", "name": "clang-debug-x64" }, { "type": "build", "name": "clang-build-debug-x64" } ] } ] } ``` They are then used like so: Configure + Build with GCC: `cmake --workflow --preset gcc-debug-arm64` Configure + Build with Clang: `cmake --workflow --preset clang-debug-arm64` Configure + Build with Clang (x64): `cmake --workflow --preset clang-debug-x64` *Addendum: It should also now be possible to cross-compile from Windows to Unix-likes, and Unix-like to other Unix-like (e.g. Linux -> FreeBSD), however this is untested.*
51 lines
1.8 KiB
CMake
51 lines
1.8 KiB
CMake
set(ARCH "generic" CACHE STRING "Target architecture")
|
|
|
|
set(VALID_ARCHS x86_64 arm64 generic)
|
|
if(NOT ARCH IN_LIST VALID_ARCHS)
|
|
message(FATAL_ERROR "Invalid ARCH='${ARCH}'. Valid: ${VALID_ARCHS}")
|
|
endif()
|
|
|
|
if(ARCH STREQUAL "generic")
|
|
set(ENABLE_GENERIC "ON")
|
|
else()
|
|
set(CMAKE_SYSTEM_PROCESSOR "${ARCH}")
|
|
endif()
|
|
|
|
if (NOT DEFINED CMAKE_SYSTEM_NAME)
|
|
if(EXISTS "${CMAKE_SYSROOT}/usr/include/linux")
|
|
set(CMAKE_SYSTEM_NAME Linux)
|
|
elseif(EXISTS "${CMAKE_SYSROOT}/Windows/System32")
|
|
set(CMAKE_SYSTEM_NAME Windows)
|
|
elseif(EXISTS "${CMAKE_SYSROOT}/System/Library")
|
|
set(CMAKE_SYSTEM_NAME Darwin)
|
|
elseif(EXISTS "${CMAKE_SYSROOT}/usr/include/osreldate.h")
|
|
set(CMAKE_SYSTEM_NAME FreeBSD)
|
|
elseif(EXISTS "${CMAKE_SYSROOT}/usr/include/c++/v1/__locale_dir/locale_base_api/openbsd.h")
|
|
set(CMAKE_SYSTEM_NAME OpenBSD)
|
|
elseif(EXISTS "${CMAKE_SYSROOT}/usr/include/dev/dm/netbsd-dm.h")
|
|
set(CMAKE_SYSTEM_NAME NetBSD)
|
|
elseif(EXISTS "${CMAKE_SYSROOT}/boot/system/develop")
|
|
set(CMAKE_SYSTEM_NAME Haiku)
|
|
else()
|
|
message(WARNING "Cannot detect OS from sysroot '${CMAKE_SYSROOT}/'. Cross-compilation has been disabled.")
|
|
endif()
|
|
endif()
|
|
|
|
set(CMAKE_FIND_ROOT_PATH "${CMAKE_SYSROOT}")
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
|
|
|
|
if(NOT QT_HOST_PATH)
|
|
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
|
if (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "AMD64")
|
|
set(QT_HOST_PATH "${CMAKE_SOURCE_DIR}/Externals/Qt/Qt6.5.1/x64")
|
|
else()
|
|
set(QT_HOST_PATH "${CMAKE_SOURCE_DIR}/Externals/Qt/Qt6.5.1/ARM64")
|
|
endif()
|
|
else()
|
|
set(QT_HOST_PATH "/usr")
|
|
endif()
|
|
endif()
|