2025-06-09 01:40:21 +00:00
|
|
|
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
2025-03-31 18:33:05 +02:00
|
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
chore: make yuzu REUSE compliant
[REUSE] is a specification that aims at making file copyright
information consistent, so that it can be both human and machine
readable. It basically requires that all files have a header containing
copyright and licensing information. When this isn't possible, like
when dealing with binary assets, generated files or embedded third-party
dependencies, it is permitted to insert copyright information in the
`.reuse/dep5` file.
Oh, and it also requires that all the licenses used in the project are
present in the `LICENSES` folder, that's why the diff is so huge.
This can be done automatically with `reuse download --all`.
The `reuse` tool also contains a handy subcommand that analyzes the
project and tells whether or not the project is (still) compliant,
`reuse lint`.
Following REUSE has a few advantages over the current approach:
- Copyright information is easy to access for users / downstream
- Files like `dist/license.md` do not need to exist anymore, as
`.reuse/dep5` is used instead
- `reuse lint` makes it easy to ensure that copyright information of
files like binary assets / images is always accurate and up to date
To add copyright information of files that didn't have it I looked up
who committed what and when, for each file. As yuzu contributors do not
have to sign a CLA or similar I couldn't assume that copyright ownership
was of the "yuzu Emulator Project", so I used the name and/or email of
the commit author instead.
[REUSE]: https://reuse.software
Follow-up to b2eb10382941bef0914f4a0a4685b9033440aa9f
2022-05-15 02:06:02 +02:00
|
|
|
|
2022-11-28 22:48:49 -05:00
|
|
|
cmake_minimum_required(VERSION 3.22)
|
2018-08-11 19:36:19 -04:00
|
|
|
|
2023-01-05 05:00:44 +01:00
|
|
|
project(yuzu)
|
|
|
|
|
|
2017-05-27 23:45:55 -07:00
|
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
|
|
|
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules")
|
2025-10-05 03:04:53 +02:00
|
|
|
|
2025-12-04 06:00:58 +01:00
|
|
|
set(CPM_SOURCE_CACHE ${CMAKE_SOURCE_DIR}/.cache/cpm)
|
2025-11-02 08:15:48 +01:00
|
|
|
|
2025-12-04 06:00:58 +01:00
|
|
|
include(DetectPlatform)
|
|
|
|
|
include(DetectArchitecture)
|
|
|
|
|
include(DefaultConfig)
|
|
|
|
|
include(DownloadExternals)
|
|
|
|
|
include(CMakeDependentOption)
|
|
|
|
|
include(CTest)
|
|
|
|
|
include(CPMUtil)
|
|
|
|
|
|
|
|
|
|
DetectArchitecture()
|
|
|
|
|
|
|
|
|
|
if (NOT DEFINED ARCHITECTURE)
|
|
|
|
|
message(FATAL_ERROR "Architecture didn't make it out of scope, did you delete DetectArchitecture.cmake?")
|
2025-08-15 04:12:45 +02:00
|
|
|
endif()
|
2023-01-05 05:00:44 +01:00
|
|
|
|
2025-09-16 18:44:19 +02:00
|
|
|
# Needed for FFmpeg w/ VAAPI and DRM
|
|
|
|
|
if (PLATFORM_OPENBSD)
|
2025-12-12 18:36:19 +01:00
|
|
|
# OpenBSD 7.8 broke libcxx when upgrading, so we must define the PSTL backend manually
|
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R6/include -D_LIBCPP_PSTL_BACKEND_SERIAL=1")
|
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R6/include -D_LIBCPP_PSTL_BACKEND_SERIAL=1")
|
2025-11-03 21:08:48 +01:00
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/X11R6/lib")
|
2025-10-17 22:12:58 +02:00
|
|
|
elseif (PLATFORM_NETBSD)
|
2025-11-03 21:08:48 +01:00
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R7/include")
|
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R7/include")
|
|
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/X11R7/lib")
|
2025-10-17 22:12:58 +02:00
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# NetBSD: Fun for the whole family!
|
|
|
|
|
if (PLATFORM_NETBSD)
|
2025-11-03 21:08:48 +01:00
|
|
|
set(ENV{PKG_CONFIG_PATH} "${PKG_CONFIG_PATH}:${CMAKE_SYSROOT}/usr/pkg/lib/ffmpeg7/pkgconfig")
|
2025-09-16 18:44:19 +02:00
|
|
|
endif()
|
|
|
|
|
|
[cmake] allow static MinGW/macOS builds; fix clangarm64 (#2994)
Requires qt6-static, obviously... at least for eden. eden-cli also can
be built fully static
Notable challenges n such:
1. VkMemAlloc conflicts with Qt, since it embeds vk_mem_alloc.h in
qrhivulkan; we can get around this by conditionally defining
VMA_IMPLEMENTATION; that is, define it in the SDL2 frontend and undef
it in the Qt frontend. It's not ideal, but I mean... it works, no?
2. find_library, pkgconfig, and some Config modules will always look for
a .dll, so we have to tell CMake to look for .a
3. In spite of this, some will end up using .dll.a (implib) as their
link targets; this is, well, bad, so we create a find_library hook
that rejects dll.a
4. Some libraries have specific configs (boost lol)
5. Some libraries use _static targets (zstd, mbedtls)
6. Some extra libraries need to be linked, i.e. jbig, lzma, etc
7. QuaZip is sad
Needs testing on all platforms, and for both frontends on desktop, to
ensure Vulkan still works as expected.
(also: CI). Resulting executables are:
- 71MB for eden.exe
- 39MB for eden-cli.exe
Considering the entire libicudt is included (thanks Qt), that's a great size all things considered. No need to bundle all those plugins and translation files too.
Theoretically, this lays the groundwork towards fully static executables for other platforms too; though Linux doesn't have a huge benefit since AppImages are needed regardless. eden-room though maybe?
Fixes comp for clangarm64 because -msse4.1
Also allows macOS to build with qt6-static. macOS can't build static executables, but with these changes it ONLY relies on system libraries like libc and frameworks. So in theory we don't even need macdeployqt.
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2994
2025-11-11 06:22:33 +01:00
|
|
|
# static stuff
|
|
|
|
|
option(YUZU_STATIC_BUILD "Use static libraries and executables if available" OFF)
|
|
|
|
|
|
2025-12-04 06:00:58 +01:00
|
|
|
# TODO: StaticBuild.cmake
|
[cmake] allow static MinGW/macOS builds; fix clangarm64 (#2994)
Requires qt6-static, obviously... at least for eden. eden-cli also can
be built fully static
Notable challenges n such:
1. VkMemAlloc conflicts with Qt, since it embeds vk_mem_alloc.h in
qrhivulkan; we can get around this by conditionally defining
VMA_IMPLEMENTATION; that is, define it in the SDL2 frontend and undef
it in the Qt frontend. It's not ideal, but I mean... it works, no?
2. find_library, pkgconfig, and some Config modules will always look for
a .dll, so we have to tell CMake to look for .a
3. In spite of this, some will end up using .dll.a (implib) as their
link targets; this is, well, bad, so we create a find_library hook
that rejects dll.a
4. Some libraries have specific configs (boost lol)
5. Some libraries use _static targets (zstd, mbedtls)
6. Some extra libraries need to be linked, i.e. jbig, lzma, etc
7. QuaZip is sad
Needs testing on all platforms, and for both frontends on desktop, to
ensure Vulkan still works as expected.
(also: CI). Resulting executables are:
- 71MB for eden.exe
- 39MB for eden-cli.exe
Considering the entire libicudt is included (thanks Qt), that's a great size all things considered. No need to bundle all those plugins and translation files too.
Theoretically, this lays the groundwork towards fully static executables for other platforms too; though Linux doesn't have a huge benefit since AppImages are needed regardless. eden-room though maybe?
Fixes comp for clangarm64 because -msse4.1
Also allows macOS to build with qt6-static. macOS can't build static executables, but with these changes it ONLY relies on system libraries like libc and frameworks. So in theory we don't even need macdeployqt.
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2994
2025-11-11 06:22:33 +01:00
|
|
|
if (YUZU_STATIC_BUILD)
|
2025-11-16 04:59:30 +01:00
|
|
|
include(StaticQtLibs)
|
|
|
|
|
|
[cmake] allow static MinGW/macOS builds; fix clangarm64 (#2994)
Requires qt6-static, obviously... at least for eden. eden-cli also can
be built fully static
Notable challenges n such:
1. VkMemAlloc conflicts with Qt, since it embeds vk_mem_alloc.h in
qrhivulkan; we can get around this by conditionally defining
VMA_IMPLEMENTATION; that is, define it in the SDL2 frontend and undef
it in the Qt frontend. It's not ideal, but I mean... it works, no?
2. find_library, pkgconfig, and some Config modules will always look for
a .dll, so we have to tell CMake to look for .a
3. In spite of this, some will end up using .dll.a (implib) as their
link targets; this is, well, bad, so we create a find_library hook
that rejects dll.a
4. Some libraries have specific configs (boost lol)
5. Some libraries use _static targets (zstd, mbedtls)
6. Some extra libraries need to be linked, i.e. jbig, lzma, etc
7. QuaZip is sad
Needs testing on all platforms, and for both frontends on desktop, to
ensure Vulkan still works as expected.
(also: CI). Resulting executables are:
- 71MB for eden.exe
- 39MB for eden-cli.exe
Considering the entire libicudt is included (thanks Qt), that's a great size all things considered. No need to bundle all those plugins and translation files too.
Theoretically, this lays the groundwork towards fully static executables for other platforms too; though Linux doesn't have a huge benefit since AppImages are needed regardless. eden-room though maybe?
Fixes comp for clangarm64 because -msse4.1
Also allows macOS to build with qt6-static. macOS can't build static executables, but with these changes it ONLY relies on system libraries like libc and frameworks. So in theory we don't even need macdeployqt.
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2994
2025-11-11 06:22:33 +01:00
|
|
|
# lol
|
|
|
|
|
set(Boost_USE_STATIC_LIBS ON)
|
|
|
|
|
set(BUILD_SHARED_LIBS OFF)
|
|
|
|
|
|
|
|
|
|
## find .a libs first (static, usually)
|
|
|
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
|
|
|
|
|
|
|
|
|
## some libraries use CMAKE_IMPORT_LIBRARY_SUFFIX e.g. Harfbuzz ##
|
|
|
|
|
set(CMAKE_IMPORT_LIBRARY_SUFFIX ".a")
|
|
|
|
|
|
|
|
|
|
if (MINGW)
|
|
|
|
|
# simple hook to reject dynamic libs
|
|
|
|
|
function(find_library var)
|
|
|
|
|
# also skip previously-found libraries cuz... yaknow
|
2025-11-16 04:59:30 +01:00
|
|
|
# UNLESS they are dll.a :{
|
|
|
|
|
if (${var} AND NOT ${var} MATCHES "dll\\.a$")
|
[cmake] allow static MinGW/macOS builds; fix clangarm64 (#2994)
Requires qt6-static, obviously... at least for eden. eden-cli also can
be built fully static
Notable challenges n such:
1. VkMemAlloc conflicts with Qt, since it embeds vk_mem_alloc.h in
qrhivulkan; we can get around this by conditionally defining
VMA_IMPLEMENTATION; that is, define it in the SDL2 frontend and undef
it in the Qt frontend. It's not ideal, but I mean... it works, no?
2. find_library, pkgconfig, and some Config modules will always look for
a .dll, so we have to tell CMake to look for .a
3. In spite of this, some will end up using .dll.a (implib) as their
link targets; this is, well, bad, so we create a find_library hook
that rejects dll.a
4. Some libraries have specific configs (boost lol)
5. Some libraries use _static targets (zstd, mbedtls)
6. Some extra libraries need to be linked, i.e. jbig, lzma, etc
7. QuaZip is sad
Needs testing on all platforms, and for both frontends on desktop, to
ensure Vulkan still works as expected.
(also: CI). Resulting executables are:
- 71MB for eden.exe
- 39MB for eden-cli.exe
Considering the entire libicudt is included (thanks Qt), that's a great size all things considered. No need to bundle all those plugins and translation files too.
Theoretically, this lays the groundwork towards fully static executables for other platforms too; though Linux doesn't have a huge benefit since AppImages are needed regardless. eden-room though maybe?
Fixes comp for clangarm64 because -msse4.1
Also allows macOS to build with qt6-static. macOS can't build static executables, but with these changes it ONLY relies on system libraries like libc and frameworks. So in theory we don't even need macdeployqt.
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2994
2025-11-11 06:22:33 +01:00
|
|
|
return()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
_find_library(${var} ${ARGN})
|
|
|
|
|
if (${var})
|
|
|
|
|
get_filename_component(lib_name "${${var}}" NAME)
|
|
|
|
|
if (lib_name MATCHES "dll\\.a$")
|
|
|
|
|
unset(${var} CACHE)
|
|
|
|
|
set(${var} "${var}-NOTFOUND" CACHE INTERNAL "" FORCE)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
endfunction()
|
|
|
|
|
|
|
|
|
|
# msys2 quazip does not build a static lib
|
|
|
|
|
set(QuaZip-Qt6_FORCE_BUNDLED ON)
|
|
|
|
|
|
|
|
|
|
set(YUZU_USE_BUNDLED_FFMPEG ON)
|
|
|
|
|
set(YUZU_USE_BUNDLED_SDL2 ON)
|
2025-11-16 04:59:30 +01:00
|
|
|
set(YUZU_USE_BUNDLED_OPENSSL ON)
|
[cmake] allow static MinGW/macOS builds; fix clangarm64 (#2994)
Requires qt6-static, obviously... at least for eden. eden-cli also can
be built fully static
Notable challenges n such:
1. VkMemAlloc conflicts with Qt, since it embeds vk_mem_alloc.h in
qrhivulkan; we can get around this by conditionally defining
VMA_IMPLEMENTATION; that is, define it in the SDL2 frontend and undef
it in the Qt frontend. It's not ideal, but I mean... it works, no?
2. find_library, pkgconfig, and some Config modules will always look for
a .dll, so we have to tell CMake to look for .a
3. In spite of this, some will end up using .dll.a (implib) as their
link targets; this is, well, bad, so we create a find_library hook
that rejects dll.a
4. Some libraries have specific configs (boost lol)
5. Some libraries use _static targets (zstd, mbedtls)
6. Some extra libraries need to be linked, i.e. jbig, lzma, etc
7. QuaZip is sad
Needs testing on all platforms, and for both frontends on desktop, to
ensure Vulkan still works as expected.
(also: CI). Resulting executables are:
- 71MB for eden.exe
- 39MB for eden-cli.exe
Considering the entire libicudt is included (thanks Qt), that's a great size all things considered. No need to bundle all those plugins and translation files too.
Theoretically, this lays the groundwork towards fully static executables for other platforms too; though Linux doesn't have a huge benefit since AppImages are needed regardless. eden-room though maybe?
Fixes comp for clangarm64 because -msse4.1
Also allows macOS to build with qt6-static. macOS can't build static executables, but with these changes it ONLY relies on system libraries like libc and frameworks. So in theory we don't even need macdeployqt.
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2994
2025-11-11 06:22:33 +01:00
|
|
|
|
|
|
|
|
set(HTTPLIB_USE_BROTLI_IF_AVAILABLE OFF)
|
2025-11-27 19:59:08 +01:00
|
|
|
|
|
|
|
|
## some libraries define a Library::Name_static alternative ##
|
|
|
|
|
set(MBEDTLS_LIB_SUFFIX _static)
|
[cmake] allow static MinGW/macOS builds; fix clangarm64 (#2994)
Requires qt6-static, obviously... at least for eden. eden-cli also can
be built fully static
Notable challenges n such:
1. VkMemAlloc conflicts with Qt, since it embeds vk_mem_alloc.h in
qrhivulkan; we can get around this by conditionally defining
VMA_IMPLEMENTATION; that is, define it in the SDL2 frontend and undef
it in the Qt frontend. It's not ideal, but I mean... it works, no?
2. find_library, pkgconfig, and some Config modules will always look for
a .dll, so we have to tell CMake to look for .a
3. In spite of this, some will end up using .dll.a (implib) as their
link targets; this is, well, bad, so we create a find_library hook
that rejects dll.a
4. Some libraries have specific configs (boost lol)
5. Some libraries use _static targets (zstd, mbedtls)
6. Some extra libraries need to be linked, i.e. jbig, lzma, etc
7. QuaZip is sad
Needs testing on all platforms, and for both frontends on desktop, to
ensure Vulkan still works as expected.
(also: CI). Resulting executables are:
- 71MB for eden.exe
- 39MB for eden-cli.exe
Considering the entire libicudt is included (thanks Qt), that's a great size all things considered. No need to bundle all those plugins and translation files too.
Theoretically, this lays the groundwork towards fully static executables for other platforms too; though Linux doesn't have a huge benefit since AppImages are needed regardless. eden-room though maybe?
Fixes comp for clangarm64 because -msse4.1
Also allows macOS to build with qt6-static. macOS can't build static executables, but with these changes it ONLY relies on system libraries like libc and frameworks. So in theory we don't even need macdeployqt.
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2994
2025-11-11 06:22:33 +01:00
|
|
|
elseif(APPLE)
|
|
|
|
|
set(YUZU_USE_CPM ON)
|
|
|
|
|
|
|
|
|
|
set(YUZU_USE_BUNDLED_FFMPEG ON)
|
2025-11-16 04:59:30 +01:00
|
|
|
set(YUZU_USE_BUNDLED_SDL2 ON)
|
|
|
|
|
set(YUZU_USE_BUNDLED_OPENSSL ON)
|
[cmake] allow static MinGW/macOS builds; fix clangarm64 (#2994)
Requires qt6-static, obviously... at least for eden. eden-cli also can
be built fully static
Notable challenges n such:
1. VkMemAlloc conflicts with Qt, since it embeds vk_mem_alloc.h in
qrhivulkan; we can get around this by conditionally defining
VMA_IMPLEMENTATION; that is, define it in the SDL2 frontend and undef
it in the Qt frontend. It's not ideal, but I mean... it works, no?
2. find_library, pkgconfig, and some Config modules will always look for
a .dll, so we have to tell CMake to look for .a
3. In spite of this, some will end up using .dll.a (implib) as their
link targets; this is, well, bad, so we create a find_library hook
that rejects dll.a
4. Some libraries have specific configs (boost lol)
5. Some libraries use _static targets (zstd, mbedtls)
6. Some extra libraries need to be linked, i.e. jbig, lzma, etc
7. QuaZip is sad
Needs testing on all platforms, and for both frontends on desktop, to
ensure Vulkan still works as expected.
(also: CI). Resulting executables are:
- 71MB for eden.exe
- 39MB for eden-cli.exe
Considering the entire libicudt is included (thanks Qt), that's a great size all things considered. No need to bundle all those plugins and translation files too.
Theoretically, this lays the groundwork towards fully static executables for other platforms too; though Linux doesn't have a huge benefit since AppImages are needed regardless. eden-room though maybe?
Fixes comp for clangarm64 because -msse4.1
Also allows macOS to build with qt6-static. macOS can't build static executables, but with these changes it ONLY relies on system libraries like libc and frameworks. So in theory we don't even need macdeployqt.
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2994
2025-11-11 06:22:33 +01:00
|
|
|
|
2025-11-27 19:59:08 +01:00
|
|
|
# these libs do not properly provide static libs/let you do it with cmake
|
[cmake] allow static MinGW/macOS builds; fix clangarm64 (#2994)
Requires qt6-static, obviously... at least for eden. eden-cli also can
be built fully static
Notable challenges n such:
1. VkMemAlloc conflicts with Qt, since it embeds vk_mem_alloc.h in
qrhivulkan; we can get around this by conditionally defining
VMA_IMPLEMENTATION; that is, define it in the SDL2 frontend and undef
it in the Qt frontend. It's not ideal, but I mean... it works, no?
2. find_library, pkgconfig, and some Config modules will always look for
a .dll, so we have to tell CMake to look for .a
3. In spite of this, some will end up using .dll.a (implib) as their
link targets; this is, well, bad, so we create a find_library hook
that rejects dll.a
4. Some libraries have specific configs (boost lol)
5. Some libraries use _static targets (zstd, mbedtls)
6. Some extra libraries need to be linked, i.e. jbig, lzma, etc
7. QuaZip is sad
Needs testing on all platforms, and for both frontends on desktop, to
ensure Vulkan still works as expected.
(also: CI). Resulting executables are:
- 71MB for eden.exe
- 39MB for eden-cli.exe
Considering the entire libicudt is included (thanks Qt), that's a great size all things considered. No need to bundle all those plugins and translation files too.
Theoretically, this lays the groundwork towards fully static executables for other platforms too; though Linux doesn't have a huge benefit since AppImages are needed regardless. eden-room though maybe?
Fixes comp for clangarm64 because -msse4.1
Also allows macOS to build with qt6-static. macOS can't build static executables, but with these changes it ONLY relies on system libraries like libc and frameworks. So in theory we don't even need macdeployqt.
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2994
2025-11-11 06:22:33 +01:00
|
|
|
set(fmt_FORCE_BUNDLED ON)
|
|
|
|
|
set(SPIRV-Tools_FORCE_BUNDLED ON)
|
|
|
|
|
set(SPIRV-Headers_FORCE_BUNDLED ON)
|
|
|
|
|
set(zstd_FORCE_BUNDLED ON)
|
2025-11-27 19:59:08 +01:00
|
|
|
set(MbedTLS_FORCE_BUNDLED ON)
|
[cmake] allow static MinGW/macOS builds; fix clangarm64 (#2994)
Requires qt6-static, obviously... at least for eden. eden-cli also can
be built fully static
Notable challenges n such:
1. VkMemAlloc conflicts with Qt, since it embeds vk_mem_alloc.h in
qrhivulkan; we can get around this by conditionally defining
VMA_IMPLEMENTATION; that is, define it in the SDL2 frontend and undef
it in the Qt frontend. It's not ideal, but I mean... it works, no?
2. find_library, pkgconfig, and some Config modules will always look for
a .dll, so we have to tell CMake to look for .a
3. In spite of this, some will end up using .dll.a (implib) as their
link targets; this is, well, bad, so we create a find_library hook
that rejects dll.a
4. Some libraries have specific configs (boost lol)
5. Some libraries use _static targets (zstd, mbedtls)
6. Some extra libraries need to be linked, i.e. jbig, lzma, etc
7. QuaZip is sad
Needs testing on all platforms, and for both frontends on desktop, to
ensure Vulkan still works as expected.
(also: CI). Resulting executables are:
- 71MB for eden.exe
- 39MB for eden-cli.exe
Considering the entire libicudt is included (thanks Qt), that's a great size all things considered. No need to bundle all those plugins and translation files too.
Theoretically, this lays the groundwork towards fully static executables for other platforms too; though Linux doesn't have a huge benefit since AppImages are needed regardless. eden-room though maybe?
Fixes comp for clangarm64 because -msse4.1
Also allows macOS to build with qt6-static. macOS can't build static executables, but with these changes it ONLY relies on system libraries like libc and frameworks. So in theory we don't even need macdeployqt.
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2994
2025-11-11 06:22:33 +01:00
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
2025-09-09 20:47:49 +02:00
|
|
|
if (MSVC AND ARCHITECTURE_x86)
|
|
|
|
|
message(FATAL_ERROR "Attempting to build with the x86 environment is not supported. \
|
2025-09-16 18:44:19 +02:00
|
|
|
This can typically happen if you used the Developer Command Prompt from the start menu; \
|
2025-09-09 20:47:49 +02:00
|
|
|
instead, run vcvars64.bat directly, located at C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/Build/vcvars64.bat")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
if (CXX_CLANG_CL)
|
|
|
|
|
add_compile_options(
|
|
|
|
|
# clang-cl prints literally 10000+ warnings without this
|
|
|
|
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-unused-command-line-argument>
|
|
|
|
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-unsafe-buffer-usage>
|
|
|
|
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-unused-value>
|
|
|
|
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-extra-semi-stmt>
|
|
|
|
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-sign-conversion>
|
|
|
|
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-reserved-identifier>
|
|
|
|
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-deprecated-declarations>
|
|
|
|
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-cast-function-type-mismatch>
|
|
|
|
|
$<$<COMPILE_LANGUAGE:C,CXX>:/EHsc> # thanks microsoft
|
|
|
|
|
)
|
|
|
|
|
|
2025-11-07 16:58:41 +01:00
|
|
|
# REQUIRED CPU features IN Windows-amd64
|
2025-09-09 20:47:49 +02:00
|
|
|
if (ARCHITECTURE_x86_64)
|
|
|
|
|
add_compile_options(
|
|
|
|
|
$<$<COMPILE_LANGUAGE:C,CXX>:-msse4.1>
|
|
|
|
|
$<$<COMPILE_LANGUAGE:C,CXX>:-mcx16>
|
|
|
|
|
)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
2025-03-31 18:33:05 +02:00
|
|
|
# Disable Warnings as Errors for MSVC
|
2025-09-16 18:44:19 +02:00
|
|
|
if (MSVC AND NOT CXX_CLANG)
|
2025-03-31 18:33:05 +02:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX-")
|
|
|
|
|
endif()
|
|
|
|
|
|
2018-01-20 00:46:04 -07:00
|
|
|
# Set bundled sdl2/qt as dependent options.
|
2025-07-13 20:58:04 +02:00
|
|
|
# On Linux system SDL2 is likely to be lacking HIDAPI support which have drawbacks but is needed for SDL motion
|
2025-09-30 02:51:48 +02:00
|
|
|
cmake_dependent_option(ENABLE_SDL2 "Enable the SDL2 frontend" ON "NOT ANDROID" OFF)
|
2017-05-27 23:45:55 -07:00
|
|
|
|
2025-11-13 03:20:38 +01:00
|
|
|
# TODO(crueter): Cleanup, each dep that has a bundled option should allow to choose between bundled, external, system
|
|
|
|
|
cmake_dependent_option(YUZU_USE_EXTERNAL_SDL2 "Build SDL2 from external source" OFF "ENABLE_SDL2;NOT MSVC" OFF)
|
|
|
|
|
cmake_dependent_option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}" "ENABLE_SDL2" OFF)
|
2025-08-23 19:42:49 +02:00
|
|
|
|
[cmake] update CI deps, feat: sirit CI + new CI spec (#2655)
Updates sirit to our fork's latest version w/ SPIRV Headers included
(end goal is to remove spirv-headers entirely, as spirv-tools-ci should
include them inline as well)
Adds a sirit CI on our fork for all platforms (saves a bit of compile
time)
My CI spec has changed a little bit, and now there is no need for an
additional CMake file after the initial CMakeLists.txt (since targets
are now global imported). Plus, UNIX amd64 now has the amd64 suffix like
aarch64 and windows
Updates SDL2 to 2.32.10 and OpenSSL to 3.6.0
Finally, on Solaris all CI packages (sans FFmpeg) are now built with OmniOS, which
should in theory be fully compatible with OpenIndiana (our recommended
Sun-based target) but obviously will need testing
Need testing:
- [ ] Make sure I didn't nuke shader emission
- [ ] Make sure FreeBSD, OpenBSD, and OpenIndiana work fine with bundled
sirit (check linking especially)
- [ ] Make sure SDL2, OpenSSL work with OpenIndiana now
- [ ] SDL2 on all platforms (input, etc)
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2655
2025-10-04 09:27:13 +02:00
|
|
|
# qt stuff
|
2025-05-28 02:23:51 +00:00
|
|
|
option(ENABLE_QT "Enable the Qt frontend" ON)
|
2020-01-26 00:26:07 +01:00
|
|
|
option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF)
|
2025-10-21 23:36:35 +02:00
|
|
|
option(ENABLE_UPDATE_CHECKER "Enable update checker (for Qt and Android)" OFF)
|
2025-09-30 02:51:48 +02:00
|
|
|
cmake_dependent_option(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF)
|
2022-10-17 16:55:40 -07:00
|
|
|
option(YUZU_USE_QT_MULTIMEDIA "Use QtMultimedia for Camera" OFF)
|
2018-12-24 16:24:01 -05:00
|
|
|
option(YUZU_USE_QT_WEB_ENGINE "Use QtWebEngine for web applet implementation" OFF)
|
2025-07-16 23:17:34 +02:00
|
|
|
set(YUZU_QT_MIRROR "" CACHE STRING "What mirror to use for downloading the bundled Qt libraries")
|
|
|
|
|
|
2025-11-01 03:49:08 +01:00
|
|
|
option(ENABLE_CUBEB "Enables the cubeb audio backend" ON)
|
2018-07-28 13:44:50 -04:00
|
|
|
|
2025-09-30 02:51:48 +02:00
|
|
|
set(EXT_DEFAULT OFF)
|
|
|
|
|
if (MSVC OR ANDROID)
|
|
|
|
|
set(EXT_DEFAULT ON)
|
|
|
|
|
endif()
|
|
|
|
|
option(YUZU_USE_CPM "Use CPM to fetch system dependencies (fmt, boost, etc) if needed. Externals will still be fetched." ${EXT_DEFAULT})
|
2022-11-22 18:38:23 -05:00
|
|
|
|
[cmake] update CI deps, feat: sirit CI + new CI spec (#2655)
Updates sirit to our fork's latest version w/ SPIRV Headers included
(end goal is to remove spirv-headers entirely, as spirv-tools-ci should
include them inline as well)
Adds a sirit CI on our fork for all platforms (saves a bit of compile
time)
My CI spec has changed a little bit, and now there is no need for an
additional CMake file after the initial CMakeLists.txt (since targets
are now global imported). Plus, UNIX amd64 now has the amd64 suffix like
aarch64 and windows
Updates SDL2 to 2.32.10 and OpenSSL to 3.6.0
Finally, on Solaris all CI packages (sans FFmpeg) are now built with OmniOS, which
should in theory be fully compatible with OpenIndiana (our recommended
Sun-based target) but obviously will need testing
Need testing:
- [ ] Make sure I didn't nuke shader emission
- [ ] Make sure FreeBSD, OpenBSD, and OpenIndiana work fine with bundled
sirit (check linking especially)
- [ ] Make sure SDL2, OpenSSL work with OpenIndiana now
- [ ] SDL2 on all platforms (input, etc)
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2655
2025-10-04 09:27:13 +02:00
|
|
|
# ffmpeg
|
2025-09-30 02:51:48 +02:00
|
|
|
option(YUZU_USE_BUNDLED_FFMPEG "Download bundled FFmpeg" ${EXT_DEFAULT})
|
2025-11-13 03:20:38 +01:00
|
|
|
cmake_dependent_option(YUZU_USE_EXTERNAL_FFMPEG "Build FFmpeg from external source" "${PLATFORM_SUN}" "NOT WIN32 AND NOT ANDROID" OFF)
|
[cmake] update CI deps, feat: sirit CI + new CI spec (#2655)
Updates sirit to our fork's latest version w/ SPIRV Headers included
(end goal is to remove spirv-headers entirely, as spirv-tools-ci should
include them inline as well)
Adds a sirit CI on our fork for all platforms (saves a bit of compile
time)
My CI spec has changed a little bit, and now there is no need for an
additional CMake file after the initial CMakeLists.txt (since targets
are now global imported). Plus, UNIX amd64 now has the amd64 suffix like
aarch64 and windows
Updates SDL2 to 2.32.10 and OpenSSL to 3.6.0
Finally, on Solaris all CI packages (sans FFmpeg) are now built with OmniOS, which
should in theory be fully compatible with OpenIndiana (our recommended
Sun-based target) but obviously will need testing
Need testing:
- [ ] Make sure I didn't nuke shader emission
- [ ] Make sure FreeBSD, OpenBSD, and OpenIndiana work fine with bundled
sirit (check linking especially)
- [ ] Make sure SDL2, OpenSSL work with OpenIndiana now
- [ ] SDL2 on all platforms (input, etc)
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2655
2025-10-04 09:27:13 +02:00
|
|
|
|
|
|
|
|
# sirit
|
2025-11-13 03:20:38 +01:00
|
|
|
set(BUNDLED_SIRIT_DEFAULT OFF)
|
|
|
|
|
if ((MSVC AND NOT (CMAKE_BUILD_TYPE MATCHES "Debug|RelWithDebInfo") OR ANDROID))
|
|
|
|
|
set(BUNDLED_SIRIT_DEFAULT ON)
|
|
|
|
|
endif()
|
|
|
|
|
option(YUZU_USE_BUNDLED_SIRIT "Download bundled sirit" ${BUNDLED_SIRIT_DEFAULT})
|
2023-09-08 22:43:54 +03:00
|
|
|
|
2025-10-22 19:12:33 +02:00
|
|
|
# Re-allow on FreeBSD once its on mainline ports
|
|
|
|
|
cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "WIN32 OR PLATFORM_LINUX OR APPLE" OFF)
|
2025-08-19 21:29:36 +02:00
|
|
|
|
2025-09-30 02:51:48 +02:00
|
|
|
cmake_dependent_option(ENABLE_OPENGL "Enable OpenGL" ON "NOT WIN32 OR NOT ARCHITECTURE_arm64" OFF)
|
|
|
|
|
mark_as_advanced(FORCE ENABLE_OPENGL)
|
2025-05-19 21:30:10 +00:00
|
|
|
|
2025-09-30 02:51:48 +02:00
|
|
|
option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
|
|
|
|
|
option(ENABLE_WIFI_SCAN "Enable WiFi scanning" OFF)
|
2025-05-19 21:30:10 +00:00
|
|
|
|
2025-09-30 02:51:48 +02:00
|
|
|
cmake_dependent_option(USE_DISCORD_PRESENCE "Enables Discord Rich Presence" OFF "ENABLE_QT" OFF)
|
2022-12-28 17:18:27 -05:00
|
|
|
|
2025-09-30 02:51:48 +02:00
|
|
|
option(YUZU_TESTS "Compile tests" "${BUILD_TESTING}")
|
2022-07-25 16:45:38 -04:00
|
|
|
|
2023-02-27 01:01:44 -03:00
|
|
|
option(YUZU_ENABLE_LTO "Enable link-time optimization" OFF)
|
2025-09-27 22:40:08 +02:00
|
|
|
if(YUZU_ENABLE_LTO)
|
2025-12-04 06:00:58 +01:00
|
|
|
include(UseLTO)
|
2025-09-27 22:40:08 +02:00
|
|
|
endif()
|
2025-11-02 08:15:48 +01:00
|
|
|
|
2025-09-30 02:51:48 +02:00
|
|
|
option(USE_CCACHE "Use ccache for compilation" OFF)
|
|
|
|
|
set(CCACHE_PATH "ccache" CACHE STRING "Path to ccache binary")
|
|
|
|
|
if(USE_CCACHE)
|
|
|
|
|
find_program(CCACHE_BINARY ${CCACHE_PATH})
|
|
|
|
|
if(CCACHE_BINARY)
|
|
|
|
|
message(STATUS "Found ccache at: ${CCACHE_BINARY}")
|
|
|
|
|
set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_BINARY})
|
|
|
|
|
set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_BINARY})
|
|
|
|
|
else()
|
2025-10-29 13:09:40 +01:00
|
|
|
message(FATAL_ERROR "USE_CCACHE enabled, but no executable found at: ${CCACHE_PATH}")
|
2025-09-30 02:51:48 +02:00
|
|
|
endif()
|
2025-11-13 03:20:38 +01:00
|
|
|
# Follow SCCache recommendations:
|
|
|
|
|
# <https://github.com/mozilla/sccache/blob/main/README.md?plain=1#L144>
|
|
|
|
|
if(WIN32)
|
|
|
|
|
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|
|
|
|
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
|
|
|
|
|
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
|
|
|
|
|
elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
|
|
|
|
|
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
|
|
|
|
|
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
2025-09-30 02:51:48 +02:00
|
|
|
endif()
|
2023-02-27 01:01:44 -03:00
|
|
|
|
2025-09-30 02:51:48 +02:00
|
|
|
option(YUZU_DOWNLOAD_ANDROID_VVL "Download validation layer binary for android" ON)
|
|
|
|
|
|
2025-10-05 05:41:20 +02:00
|
|
|
option(YUZU_LEGACY "Apply patches that improve compatibility with older GPUs (e.g. Snapdragon 865) at the cost of performance" OFF)
|
|
|
|
|
|
2025-09-30 02:51:48 +02:00
|
|
|
cmake_dependent_option(YUZU_ROOM "Enable dedicated room functionality" ON "NOT ANDROID" OFF)
|
|
|
|
|
cmake_dependent_option(YUZU_ROOM_STANDALONE "Enable standalone room executable" ON "YUZU_ROOM" OFF)
|
2023-06-16 04:32:31 -04:00
|
|
|
|
2025-09-30 02:51:48 +02:00
|
|
|
cmake_dependent_option(YUZU_CMD "Compile the eden-cli executable" ON "ENABLE_SDL2;NOT ANDROID" OFF)
|
2022-12-10 12:50:00 -05:00
|
|
|
|
2025-12-04 06:00:58 +01:00
|
|
|
cmake_dependent_option(YUZU_CRASH_DUMPS "Compile crash dump (Minidump) support" OFF "WIN32 OR PLATFORM_LINUX" OFF)
|
2023-08-17 09:17:56 +08:00
|
|
|
|
2025-09-30 02:51:48 +02:00
|
|
|
option(YUZU_DOWNLOAD_TIME_ZONE_DATA "Always download time zone binaries" ON)
|
2025-09-10 18:36:42 +02:00
|
|
|
set(YUZU_TZDB_PATH "" CACHE STRING "Path to a pre-downloaded timezone database")
|
|
|
|
|
|
2025-12-04 06:00:58 +01:00
|
|
|
cmake_dependent_option(YUZU_USE_FASTER_LD "Check if a faster linker is available" ON "PLATFORM_LINUX" OFF)
|
2025-09-30 02:51:48 +02:00
|
|
|
|
2025-10-01 16:36:07 +02:00
|
|
|
cmake_dependent_option(YUZU_USE_BUNDLED_MOLTENVK "Download bundled MoltenVK lib" ON "APPLE" OFF)
|
2025-09-30 02:51:48 +02:00
|
|
|
|
2025-09-20 22:58:33 +02:00
|
|
|
option(YUZU_DISABLE_LLVM "Disable LLVM (useful for CI)" OFF)
|
|
|
|
|
|
2023-06-25 17:36:51 -07:00
|
|
|
set(DEFAULT_ENABLE_OPENSSL ON)
|
2025-08-19 21:29:36 +02:00
|
|
|
if (ANDROID OR WIN32 OR APPLE OR PLATFORM_SUN)
|
2023-06-25 17:36:51 -07:00
|
|
|
# - Windows defaults to the Schannel backend.
|
2023-07-01 15:02:25 -07:00
|
|
|
# - macOS defaults to the SecureTransport backend.
|
2023-06-25 17:36:51 -07:00
|
|
|
# - Android currently has no SSL backend as the NDK doesn't include any SSL
|
|
|
|
|
# library; a proper 'native' backend would have to go through Java.
|
|
|
|
|
# But you can force builds for those platforms to use OpenSSL if you have
|
|
|
|
|
# your own copy of it.
|
|
|
|
|
set(DEFAULT_ENABLE_OPENSSL OFF)
|
|
|
|
|
endif()
|
2025-11-02 08:15:48 +01:00
|
|
|
|
2025-11-16 04:59:30 +01:00
|
|
|
if (ENABLE_WEB_SERVICE OR USE_DISCORD_PRESENCE)
|
2025-08-14 20:30:30 +02:00
|
|
|
set(DEFAULT_ENABLE_OPENSSL ON)
|
|
|
|
|
endif()
|
2025-11-02 08:15:48 +01:00
|
|
|
|
2023-06-25 17:36:51 -07:00
|
|
|
option(ENABLE_OPENSSL "Enable OpenSSL backend for ISslConnection" ${DEFAULT_ENABLE_OPENSSL})
|
2025-08-29 00:18:02 +02:00
|
|
|
if (ENABLE_OPENSSL)
|
2025-10-17 22:12:58 +02:00
|
|
|
set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL OFF)
|
|
|
|
|
if (EXT_DEFAULT OR PLATFORM_SUN)
|
|
|
|
|
set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL ON)
|
|
|
|
|
endif()
|
|
|
|
|
option(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" ${DEFAULT_YUZU_USE_BUNDLED_OPENSSL})
|
2025-08-23 19:42:49 +02:00
|
|
|
endif()
|
|
|
|
|
|
[cmake, externals] android x86_64 support (#3086)
Updates all of our bundled CI deps to support android x86_64, adds a
build flavor thereof (`chromeOS`), and also adds sirit mingw support.
The new FFmpeg package is built in a much better way that actually makes
it identically built to the other CI packages, meaning we now have real
8.0.0 support, no need for libvpx/cpu_features/all that other crap.
PLUS, we can now statically link it! Hooray! It's also built with
MediaCodec support so in the future we can work on that.
Rewrote the android build script too, plus added a copyFlavorTypeOutput
target that assembles and copies the APK. The code behind it sucks
because I'm not great with Gradle but hey, it works.
Testers: please test everything related to video decoding. VP9 and h264, games that normally suck with their prerendered stuff, make sure I didn't nuke it to oblivion, etc.
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3086
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
2025-12-03 06:40:11 +01:00
|
|
|
# TODO(crueter): CPM this
|
2023-09-08 22:43:54 +03:00
|
|
|
if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL)
|
2025-12-04 06:00:58 +01:00
|
|
|
AddJsonPackage(vulkan-validation-layers)
|
2023-09-08 22:43:54 +03:00
|
|
|
|
2025-12-04 06:00:58 +01:00
|
|
|
set(abi ${CMAKE_ANDROID_ARCH_ABI})
|
[cmake, externals] android x86_64 support (#3086)
Updates all of our bundled CI deps to support android x86_64, adds a
build flavor thereof (`chromeOS`), and also adds sirit mingw support.
The new FFmpeg package is built in a much better way that actually makes
it identically built to the other CI packages, meaning we now have real
8.0.0 support, no need for libvpx/cpu_features/all that other crap.
PLUS, we can now statically link it! Hooray! It's also built with
MediaCodec support so in the future we can work on that.
Rewrote the android build script too, plus added a copyFlavorTypeOutput
target that assembles and copies the APK. The code behind it sucks
because I'm not great with Gradle but hey, it works.
Testers: please test everything related to video decoding. VP9 and h264, games that normally suck with their prerendered stuff, make sure I didn't nuke it to oblivion, etc.
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3086
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
2025-12-03 06:40:11 +01:00
|
|
|
|
2025-12-04 06:00:58 +01:00
|
|
|
set(vvl_lib_path "${CMAKE_CURRENT_SOURCE_DIR}/src/android/app/src/main/jniLibs/${abi}/")
|
|
|
|
|
file(COPY "${VVL_SOURCE_DIR}/${abi}/libVkLayer_khronos_validation.so"
|
2025-05-11 23:58:25 +00:00
|
|
|
DESTINATION "${vvl_lib_path}")
|
2023-09-08 22:43:54 +03:00
|
|
|
endif()
|
|
|
|
|
|
2019-12-05 22:48:20 -05:00
|
|
|
if(EXISTS ${PROJECT_SOURCE_DIR}/hooks/pre-commit AND NOT EXISTS ${PROJECT_SOURCE_DIR}/.git/hooks/pre-commit)
|
2021-07-08 22:27:12 -03:00
|
|
|
if (EXISTS ${PROJECT_SOURCE_DIR}/.git/)
|
|
|
|
|
message(STATUS "Copying pre-commit hook")
|
|
|
|
|
file(COPY hooks/pre-commit DESTINATION ${PROJECT_SOURCE_DIR}/.git/hooks)
|
|
|
|
|
endif()
|
2017-05-27 23:45:55 -07:00
|
|
|
endif()
|
|
|
|
|
|
2025-12-04 06:00:58 +01:00
|
|
|
set(compat_base dist/compatibility_list/compatibility_list)
|
|
|
|
|
set(compat_qrc ${compat_base}.qrc)
|
|
|
|
|
set(compat_json ${compat_base}.json)
|
|
|
|
|
|
|
|
|
|
configure_file(${PROJECT_SOURCE_DIR}/${compat_qrc}
|
|
|
|
|
${PROJECT_BINARY_DIR}/${compat_qrc}
|
2025-05-11 23:58:25 +00:00
|
|
|
COPYONLY)
|
2025-08-29 00:18:02 +02:00
|
|
|
|
2025-12-04 06:00:58 +01:00
|
|
|
if (EXISTS ${PROJECT_SOURCE_DIR}/${compat_json})
|
|
|
|
|
configure_file("${PROJECT_SOURCE_DIR}/${compat_json}"
|
|
|
|
|
"${PROJECT_BINARY_DIR}/${compat_json}"
|
2025-05-11 23:58:25 +00:00
|
|
|
COPYONLY)
|
2022-07-04 00:41:31 +09:00
|
|
|
endif()
|
2025-08-29 00:18:02 +02:00
|
|
|
|
2025-12-04 06:00:58 +01:00
|
|
|
# TODO: Compat list download
|
|
|
|
|
if (NOT EXISTS ${PROJECT_BINARY_DIR}/${compat_json})
|
|
|
|
|
file(WRITE ${PROJECT_BINARY_DIR}/${compat_json} "")
|
2018-08-29 15:42:53 +02:00
|
|
|
endif()
|
|
|
|
|
|
2025-10-05 05:41:20 +02:00
|
|
|
if (YUZU_LEGACY)
|
|
|
|
|
message(WARNING "Making legacy build. Performance may suffer.")
|
|
|
|
|
add_compile_definitions(YUZU_LEGACY)
|
|
|
|
|
endif()
|
|
|
|
|
|
2025-08-23 19:42:49 +02:00
|
|
|
if (ARCHITECTURE_arm64 AND (ANDROID OR PLATFORM_LINUX))
|
2023-11-26 20:25:18 -05:00
|
|
|
set(HAS_NCE 1)
|
2025-09-08 19:21:38 +02:00
|
|
|
add_compile_definitions(HAS_NCE=1)
|
2023-11-26 20:25:18 -05:00
|
|
|
endif()
|
|
|
|
|
|
2025-05-19 21:30:10 +00:00
|
|
|
if (YUZU_ROOM)
|
2025-09-08 19:21:38 +02:00
|
|
|
add_compile_definitions(YUZU_ROOM)
|
2025-05-19 21:30:10 +00:00
|
|
|
endif()
|
|
|
|
|
|
2025-10-17 22:12:58 +02:00
|
|
|
if ((ANDROID OR APPLE OR UNIX) AND (NOT PLATFORM_LINUX OR ANDROID) AND NOT WIN32)
|
2025-10-01 06:59:35 +02:00
|
|
|
if(CXX_APPLE OR CXX_CLANG)
|
|
|
|
|
# libc++ has stop_token and jthread as experimental
|
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexperimental-library")
|
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexperimental-library")
|
|
|
|
|
else()
|
|
|
|
|
# Uses glibc, mostly?
|
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_LIBCPP_ENABLE_EXPERIMENTAL=1")
|
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_LIBCPP_ENABLE_EXPERIMENTAL=1")
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
2025-07-27 06:36:33 +02:00
|
|
|
# Build/optimization presets
|
2025-09-09 20:47:49 +02:00
|
|
|
if (PLATFORM_LINUX OR CXX_CLANG)
|
2025-07-27 06:36:33 +02:00
|
|
|
if (ARCHITECTURE_x86_64)
|
2025-10-28 23:52:49 +01:00
|
|
|
# See https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html
|
|
|
|
|
# Generic supports Pentium Pro instruction set and above
|
2025-08-07 22:09:02 +02:00
|
|
|
set(YUZU_BUILD_PRESET "custom" CACHE STRING "Build preset to use. One of: custom, generic, v3, zen2, zen4, native")
|
2025-07-27 06:36:33 +02:00
|
|
|
if (${YUZU_BUILD_PRESET} STREQUAL "generic")
|
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=x86-64 -mtune=generic")
|
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=x86-64 -mtune=generic")
|
|
|
|
|
elseif (${YUZU_BUILD_PRESET} STREQUAL "v3")
|
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=x86-64-v3 -mtune=generic")
|
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=x86-64-v3 -mtune=generic")
|
|
|
|
|
elseif (${YUZU_BUILD_PRESET} STREQUAL "zen2")
|
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=znver2 -mtune=znver2")
|
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=znver2 -mtune=znver2")
|
|
|
|
|
elseif (${YUZU_BUILD_PRESET} STREQUAL "zen4")
|
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=znver4 -mtune=znver4")
|
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=znver4 -mtune=znver4")
|
|
|
|
|
elseif (${YUZU_BUILD_PRESET} STREQUAL "native")
|
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native -mtune=native")
|
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=native -mtune=native")
|
|
|
|
|
endif()
|
|
|
|
|
elseif(ARCHITECTURE_arm64)
|
2025-10-28 23:52:49 +01:00
|
|
|
# See https://gcc.gnu.org/onlinedocs/gcc/AArch64-Options.html
|
|
|
|
|
set(YUZU_BUILD_PRESET "custom" CACHE STRING "Build preset to use. One of: custom, generic, armv9, native")
|
2025-07-27 06:36:33 +02:00
|
|
|
if (${YUZU_BUILD_PRESET} STREQUAL "generic")
|
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a -mtune=generic")
|
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a -mtune=generic")
|
|
|
|
|
elseif (${YUZU_BUILD_PRESET} STREQUAL "armv9")
|
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv9-a -mtune=generic")
|
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv9-a -mtune=generic")
|
2025-10-28 23:52:49 +01:00
|
|
|
elseif (${YUZU_BUILD_PRESET} STREQUAL "native")
|
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native -mtune=native")
|
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=native -mtune=native")
|
2025-07-27 06:36:33 +02:00
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# Other presets, e.g. steamdeck
|
|
|
|
|
set(YUZU_SYSTEM_PROFILE "generic" CACHE STRING "CMake and Externals profile to use. One of: generic, steamdeck")
|
|
|
|
|
|
2019-03-16 01:45:08 -04:00
|
|
|
# Configure C++ standard
|
2017-05-27 23:45:55 -07:00
|
|
|
# ===========================
|
|
|
|
|
|
2024-04-05 01:58:30 +02:00
|
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
|
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
2016-06-30 11:59:32 -06:00
|
|
|
|
2018-01-15 10:42:40 +01:00
|
|
|
# Output binaries to bin/
|
2018-10-20 17:08:26 -04:00
|
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
|
2018-01-15 10:42:40 +01:00
|
|
|
|
2020-05-08 15:09:29 -06:00
|
|
|
# System imported libraries
|
|
|
|
|
# =======================================================================
|
2016-03-27 11:59:50 +08:00
|
|
|
|
2025-08-29 00:18:02 +02:00
|
|
|
# openssl funniness
|
|
|
|
|
if (ENABLE_OPENSSL)
|
|
|
|
|
if (YUZU_USE_BUNDLED_OPENSSL)
|
|
|
|
|
AddJsonPackage(openssl)
|
2025-10-21 20:43:42 +02:00
|
|
|
if (OpenSSL_ADDED)
|
|
|
|
|
add_compile_definitions(YUZU_BUNDLED_OPENSSL)
|
|
|
|
|
endif()
|
2025-08-29 00:18:02 +02:00
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
find_package(OpenSSL 1.1.1 REQUIRED)
|
|
|
|
|
endif()
|
|
|
|
|
|
2025-08-14 20:30:30 +02:00
|
|
|
if (YUZU_USE_CPM)
|
|
|
|
|
message(STATUS "Fetching needed dependencies with CPM")
|
|
|
|
|
|
|
|
|
|
set(BUILD_SHARED_LIBS OFF)
|
|
|
|
|
set(BUILD_TESTING OFF)
|
2025-09-23 19:38:11 +02:00
|
|
|
set(ENABLE_TESTING OFF)
|
2025-08-14 20:30:30 +02:00
|
|
|
|
|
|
|
|
# TODO(crueter): renderdoc?
|
|
|
|
|
|
2025-08-16 03:19:02 +02:00
|
|
|
# boost
|
|
|
|
|
set(BOOST_INCLUDE_LIBRARIES algorithm icl pool container heap asio headers process filesystem crc variant)
|
2025-09-09 20:47:49 +02:00
|
|
|
|
2025-08-29 00:18:02 +02:00
|
|
|
AddJsonPackage(boost)
|
2025-08-14 20:30:30 +02:00
|
|
|
|
2025-08-16 03:19:02 +02:00
|
|
|
# really annoying thing where boost::headers doesn't work with cpm
|
|
|
|
|
# TODO(crueter) investigate
|
2025-08-14 20:30:30 +02:00
|
|
|
set(BOOST_NO_HEADERS ${Boost_ADDED})
|
|
|
|
|
|
|
|
|
|
if (Boost_ADDED)
|
|
|
|
|
if (MSVC OR ANDROID)
|
|
|
|
|
add_compile_definitions(YUZU_BOOST_v1)
|
|
|
|
|
endif()
|
|
|
|
|
|
2025-09-09 20:47:49 +02:00
|
|
|
if (NOT MSVC OR CXX_CLANG)
|
2025-08-14 20:30:30 +02:00
|
|
|
# boost sucks
|
2025-08-30 20:32:21 +02:00
|
|
|
if (PLATFORM_SUN)
|
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthreads")
|
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthreads")
|
2025-08-29 00:18:02 +02:00
|
|
|
endif()
|
|
|
|
|
|
2025-08-14 20:30:30 +02:00
|
|
|
target_compile_options(boost_heap INTERFACE -Wno-shadow)
|
|
|
|
|
target_compile_options(boost_icl INTERFACE -Wno-shadow)
|
|
|
|
|
target_compile_options(boost_asio INTERFACE -Wno-conversion -Wno-implicit-fallthrough)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
2025-08-16 03:19:02 +02:00
|
|
|
# fmt
|
2026-01-02 09:00:48 -03:00
|
|
|
AddJsonPackage(NAME fmt BUNDLED_PACKAGE ON)
|
2025-08-14 20:30:30 +02:00
|
|
|
|
2025-08-16 03:19:02 +02:00
|
|
|
# lz4
|
2025-08-29 00:18:02 +02:00
|
|
|
AddJsonPackage(lz4)
|
2025-08-14 20:30:30 +02:00
|
|
|
|
|
|
|
|
if (lz4_ADDED)
|
|
|
|
|
add_library(lz4::lz4 ALIAS lz4_static)
|
|
|
|
|
endif()
|
|
|
|
|
|
2025-08-16 03:19:02 +02:00
|
|
|
# nlohmann
|
2025-08-29 00:18:02 +02:00
|
|
|
AddJsonPackage(nlohmann)
|
2025-08-14 20:30:30 +02:00
|
|
|
|
2025-08-16 03:19:02 +02:00
|
|
|
# zlib
|
2025-08-29 00:18:02 +02:00
|
|
|
AddJsonPackage(zlib)
|
2025-08-14 20:30:30 +02:00
|
|
|
|
|
|
|
|
if (ZLIB_ADDED)
|
|
|
|
|
add_library(ZLIB::ZLIB ALIAS zlibstatic)
|
|
|
|
|
endif()
|
|
|
|
|
|
2025-08-16 03:19:02 +02:00
|
|
|
# zstd
|
2025-08-29 00:18:02 +02:00
|
|
|
AddJsonPackage(zstd)
|
|
|
|
|
|
|
|
|
|
if (zstd_ADDED)
|
|
|
|
|
add_library(zstd::zstd ALIAS libzstd_static)
|
2025-10-05 03:04:53 +02:00
|
|
|
add_library(zstd::libzstd ALIAS libzstd_static)
|
2025-08-29 00:18:02 +02:00
|
|
|
endif()
|
2025-08-14 20:30:30 +02:00
|
|
|
|
2025-08-16 03:19:02 +02:00
|
|
|
# Opus
|
2025-08-29 00:18:02 +02:00
|
|
|
AddJsonPackage(opus)
|
2025-09-09 20:47:49 +02:00
|
|
|
|
|
|
|
|
if (Opus_ADDED)
|
|
|
|
|
if (MSVC AND CXX_CLANG)
|
|
|
|
|
target_compile_options(opus PRIVATE
|
|
|
|
|
-Wno-implicit-function-declaration
|
|
|
|
|
)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
2025-09-15 04:22:15 +02:00
|
|
|
|
2025-09-23 19:38:11 +02:00
|
|
|
if (NOT TARGET Opus::opus)
|
|
|
|
|
add_library(Opus::opus ALIAS opus)
|
|
|
|
|
endif()
|
2025-08-14 20:30:30 +02:00
|
|
|
else()
|
2025-12-04 06:00:58 +01:00
|
|
|
# TODO: we can probably just use CPM for this... right?
|
2025-08-14 20:30:30 +02:00
|
|
|
# Enforce the search mode of non-required packages for better and shorter failure messages
|
|
|
|
|
find_package(fmt 8 REQUIRED)
|
[cmake] update CI deps, feat: sirit CI + new CI spec (#2655)
Updates sirit to our fork's latest version w/ SPIRV Headers included
(end goal is to remove spirv-headers entirely, as spirv-tools-ci should
include them inline as well)
Adds a sirit CI on our fork for all platforms (saves a bit of compile
time)
My CI spec has changed a little bit, and now there is no need for an
additional CMake file after the initial CMakeLists.txt (since targets
are now global imported). Plus, UNIX amd64 now has the amd64 suffix like
aarch64 and windows
Updates SDL2 to 2.32.10 and OpenSSL to 3.6.0
Finally, on Solaris all CI packages (sans FFmpeg) are now built with OmniOS, which
should in theory be fully compatible with OpenIndiana (our recommended
Sun-based target) but obviously will need testing
Need testing:
- [ ] Make sure I didn't nuke shader emission
- [ ] Make sure FreeBSD, OpenBSD, and OpenIndiana work fine with bundled
sirit (check linking especially)
- [ ] Make sure SDL2, OpenSSL work with OpenIndiana now
- [ ] SDL2 on all platforms (input, etc)
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2655
2025-10-04 09:27:13 +02:00
|
|
|
|
2025-09-20 22:58:33 +02:00
|
|
|
if (NOT YUZU_DISABLE_LLVM)
|
|
|
|
|
find_package(LLVM MODULE COMPONENTS Demangle)
|
|
|
|
|
endif()
|
|
|
|
|
|
2025-08-14 20:30:30 +02:00
|
|
|
find_package(nlohmann_json 3.8 REQUIRED)
|
|
|
|
|
find_package(lz4 REQUIRED)
|
|
|
|
|
find_package(RenderDoc MODULE)
|
|
|
|
|
find_package(stb MODULE)
|
[cmake] update CI deps, feat: sirit CI + new CI spec (#2655)
Updates sirit to our fork's latest version w/ SPIRV Headers included
(end goal is to remove spirv-headers entirely, as spirv-tools-ci should
include them inline as well)
Adds a sirit CI on our fork for all platforms (saves a bit of compile
time)
My CI spec has changed a little bit, and now there is no need for an
additional CMake file after the initial CMakeLists.txt (since targets
are now global imported). Plus, UNIX amd64 now has the amd64 suffix like
aarch64 and windows
Updates SDL2 to 2.32.10 and OpenSSL to 3.6.0
Finally, on Solaris all CI packages (sans FFmpeg) are now built with OmniOS, which
should in theory be fully compatible with OpenIndiana (our recommended
Sun-based target) but obviously will need testing
Need testing:
- [ ] Make sure I didn't nuke shader emission
- [ ] Make sure FreeBSD, OpenBSD, and OpenIndiana work fine with bundled
sirit (check linking especially)
- [ ] Make sure SDL2, OpenSSL work with OpenIndiana now
- [ ] SDL2 on all platforms (input, etc)
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2655
2025-10-04 09:27:13 +02:00
|
|
|
|
2025-08-28 01:34:41 +02:00
|
|
|
find_package(Opus 1.3 MODULE REQUIRED)
|
[cmake] allow static MinGW/macOS builds; fix clangarm64 (#2994)
Requires qt6-static, obviously... at least for eden. eden-cli also can
be built fully static
Notable challenges n such:
1. VkMemAlloc conflicts with Qt, since it embeds vk_mem_alloc.h in
qrhivulkan; we can get around this by conditionally defining
VMA_IMPLEMENTATION; that is, define it in the SDL2 frontend and undef
it in the Qt frontend. It's not ideal, but I mean... it works, no?
2. find_library, pkgconfig, and some Config modules will always look for
a .dll, so we have to tell CMake to look for .a
3. In spite of this, some will end up using .dll.a (implib) as their
link targets; this is, well, bad, so we create a find_library hook
that rejects dll.a
4. Some libraries have specific configs (boost lol)
5. Some libraries use _static targets (zstd, mbedtls)
6. Some extra libraries need to be linked, i.e. jbig, lzma, etc
7. QuaZip is sad
Needs testing on all platforms, and for both frontends on desktop, to
ensure Vulkan still works as expected.
(also: CI). Resulting executables are:
- 71MB for eden.exe
- 39MB for eden-cli.exe
Considering the entire libicudt is included (thanks Qt), that's a great size all things considered. No need to bundle all those plugins and translation files too.
Theoretically, this lays the groundwork towards fully static executables for other platforms too; though Linux doesn't have a huge benefit since AppImages are needed regardless. eden-room though maybe?
Fixes comp for clangarm64 because -msse4.1
Also allows macOS to build with qt6-static. macOS can't build static executables, but with these changes it ONLY relies on system libraries like libc and frameworks. So in theory we don't even need macdeployqt.
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2994
2025-11-11 06:22:33 +01:00
|
|
|
|
2025-08-14 20:30:30 +02:00
|
|
|
find_package(ZLIB 1.2 REQUIRED)
|
2025-08-29 00:18:02 +02:00
|
|
|
find_package(zstd 1.5 REQUIRED MODULE)
|
2025-09-16 18:44:19 +02:00
|
|
|
|
|
|
|
|
# wow
|
2025-11-09 18:07:38 +01:00
|
|
|
find_package(Boost 1.57.0 CONFIG REQUIRED OPTIONAL_COMPONENTS headers context system fiber filesystem)
|
2025-09-16 18:44:19 +02:00
|
|
|
|
2025-08-14 20:30:30 +02:00
|
|
|
if (ENABLE_OPENSSL)
|
|
|
|
|
find_package(OpenSSL 1.1.1 REQUIRED)
|
|
|
|
|
endif()
|
2025-07-03 01:13:33 +00:00
|
|
|
endif()
|
|
|
|
|
|
2025-08-16 03:19:02 +02:00
|
|
|
if(NOT TARGET Boost::headers)
|
2025-08-29 00:18:02 +02:00
|
|
|
AddJsonPackage(boost_headers)
|
2025-08-16 03:19:02 +02:00
|
|
|
endif()
|
|
|
|
|
|
2025-05-29 21:55:19 +00:00
|
|
|
# List of all FFmpeg components required
|
|
|
|
|
set(FFmpeg_COMPONENTS
|
|
|
|
|
avcodec
|
|
|
|
|
avfilter
|
|
|
|
|
avutil
|
|
|
|
|
swscale)
|
|
|
|
|
|
2025-08-04 04:50:14 +02:00
|
|
|
# This function should be passed a list of all files in a target. It will automatically generate
|
|
|
|
|
# file groups following the directory hierarchy, so that the layout of the files in IDEs matches the
|
|
|
|
|
# one in the filesystem.
|
|
|
|
|
function(create_target_directory_groups target_name)
|
|
|
|
|
# Place any files that aren't in the source list in a separate group so that they don't get in
|
|
|
|
|
# the way.
|
|
|
|
|
source_group("Other Files" REGULAR_EXPRESSION ".")
|
|
|
|
|
|
|
|
|
|
get_target_property(target_sources "${target_name}" SOURCES)
|
|
|
|
|
|
|
|
|
|
foreach(file_name IN LISTS target_sources)
|
|
|
|
|
get_filename_component(dir_name "${file_name}" PATH)
|
|
|
|
|
# Group names use '\' as a separator even though the entire rest of CMake uses '/'...
|
|
|
|
|
string(REPLACE "/" "\\" group_name "${dir_name}")
|
|
|
|
|
source_group("${group_name}" FILES "${file_name}")
|
|
|
|
|
endforeach()
|
|
|
|
|
endfunction()
|
2025-07-30 07:06:50 +02:00
|
|
|
|
2025-10-26 17:28:14 +01:00
|
|
|
# Platform-specific library requirements
|
|
|
|
|
# Put these BEFORE EXTERNALS or Boost WILL die
|
|
|
|
|
# =============================================
|
|
|
|
|
|
|
|
|
|
if (APPLE)
|
|
|
|
|
# Umbrella framework for everything GUI-related
|
2025-12-04 06:00:58 +01:00
|
|
|
find_library(COCOA_LIBRARY Cocoa REQUIRED)
|
|
|
|
|
find_library(IOKIT_LIBRARY IOKit REQUIRED)
|
2025-10-26 17:28:14 +01:00
|
|
|
set(PLATFORM_LIBRARIES ${COCOA_LIBRARY} ${IOKIT_LIBRARY} ${COREVIDEO_LIBRARY})
|
|
|
|
|
elseif (WIN32)
|
|
|
|
|
# Target Windows 10
|
|
|
|
|
add_compile_definitions(_WIN32_WINNT=0x0A00 WINVER=0x0A00)
|
[cmake] allow static MinGW/macOS builds; fix clangarm64 (#2994)
Requires qt6-static, obviously... at least for eden. eden-cli also can
be built fully static
Notable challenges n such:
1. VkMemAlloc conflicts with Qt, since it embeds vk_mem_alloc.h in
qrhivulkan; we can get around this by conditionally defining
VMA_IMPLEMENTATION; that is, define it in the SDL2 frontend and undef
it in the Qt frontend. It's not ideal, but I mean... it works, no?
2. find_library, pkgconfig, and some Config modules will always look for
a .dll, so we have to tell CMake to look for .a
3. In spite of this, some will end up using .dll.a (implib) as their
link targets; this is, well, bad, so we create a find_library hook
that rejects dll.a
4. Some libraries have specific configs (boost lol)
5. Some libraries use _static targets (zstd, mbedtls)
6. Some extra libraries need to be linked, i.e. jbig, lzma, etc
7. QuaZip is sad
Needs testing on all platforms, and for both frontends on desktop, to
ensure Vulkan still works as expected.
(also: CI). Resulting executables are:
- 71MB for eden.exe
- 39MB for eden-cli.exe
Considering the entire libicudt is included (thanks Qt), that's a great size all things considered. No need to bundle all those plugins and translation files too.
Theoretically, this lays the groundwork towards fully static executables for other platforms too; though Linux doesn't have a huge benefit since AppImages are needed regardless. eden-room though maybe?
Fixes comp for clangarm64 because -msse4.1
Also allows macOS to build with qt6-static. macOS can't build static executables, but with these changes it ONLY relies on system libraries like libc and frameworks. So in theory we don't even need macdeployqt.
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2994
2025-11-11 06:22:33 +01:00
|
|
|
set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} winmm iphlpapi ws2_32 wlanapi)
|
2025-10-26 17:28:14 +01:00
|
|
|
if (MINGW)
|
|
|
|
|
# PSAPI is the Process Status API
|
[cmake] allow static MinGW/macOS builds; fix clangarm64 (#2994)
Requires qt6-static, obviously... at least for eden. eden-cli also can
be built fully static
Notable challenges n such:
1. VkMemAlloc conflicts with Qt, since it embeds vk_mem_alloc.h in
qrhivulkan; we can get around this by conditionally defining
VMA_IMPLEMENTATION; that is, define it in the SDL2 frontend and undef
it in the Qt frontend. It's not ideal, but I mean... it works, no?
2. find_library, pkgconfig, and some Config modules will always look for
a .dll, so we have to tell CMake to look for .a
3. In spite of this, some will end up using .dll.a (implib) as their
link targets; this is, well, bad, so we create a find_library hook
that rejects dll.a
4. Some libraries have specific configs (boost lol)
5. Some libraries use _static targets (zstd, mbedtls)
6. Some extra libraries need to be linked, i.e. jbig, lzma, etc
7. QuaZip is sad
Needs testing on all platforms, and for both frontends on desktop, to
ensure Vulkan still works as expected.
(also: CI). Resulting executables are:
- 71MB for eden.exe
- 39MB for eden-cli.exe
Considering the entire libicudt is included (thanks Qt), that's a great size all things considered. No need to bundle all those plugins and translation files too.
Theoretically, this lays the groundwork towards fully static executables for other platforms too; though Linux doesn't have a huge benefit since AppImages are needed regardless. eden-room though maybe?
Fixes comp for clangarm64 because -msse4.1
Also allows macOS to build with qt6-static. macOS can't build static executables, but with these changes it ONLY relies on system libraries like libc and frameworks. So in theory we don't even need macdeployqt.
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2994
2025-11-11 06:22:33 +01:00
|
|
|
set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} psapi imm32 version crypt32 rpcrt4 gdi32 wldap32 mswsock)
|
2025-10-26 17:28:14 +01:00
|
|
|
endif()
|
|
|
|
|
elseif (PLATFORM_HAIKU)
|
|
|
|
|
# Haiku is so special :)
|
|
|
|
|
# Some fucking genius decided to name an entire module "network" in 2019
|
|
|
|
|
# this caused great disaster amongst the Haiku community who had came first with
|
|
|
|
|
# their "libnetwork.so"; since CMake doesn't do magic, we have to use an ABSOLUTE PATH
|
|
|
|
|
# to the library itself, otherwise it will think we are linking to... our network thing
|
|
|
|
|
set(PLATFORM_LIBRARIES bsd /boot/system/lib/libnetwork.so)
|
|
|
|
|
elseif (CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU|SunOS)$")
|
|
|
|
|
set(PLATFORM_LIBRARIES rt)
|
|
|
|
|
endif()
|
|
|
|
|
|
[cmake] allow static MinGW/macOS builds; fix clangarm64 (#2994)
Requires qt6-static, obviously... at least for eden. eden-cli also can
be built fully static
Notable challenges n such:
1. VkMemAlloc conflicts with Qt, since it embeds vk_mem_alloc.h in
qrhivulkan; we can get around this by conditionally defining
VMA_IMPLEMENTATION; that is, define it in the SDL2 frontend and undef
it in the Qt frontend. It's not ideal, but I mean... it works, no?
2. find_library, pkgconfig, and some Config modules will always look for
a .dll, so we have to tell CMake to look for .a
3. In spite of this, some will end up using .dll.a (implib) as their
link targets; this is, well, bad, so we create a find_library hook
that rejects dll.a
4. Some libraries have specific configs (boost lol)
5. Some libraries use _static targets (zstd, mbedtls)
6. Some extra libraries need to be linked, i.e. jbig, lzma, etc
7. QuaZip is sad
Needs testing on all platforms, and for both frontends on desktop, to
ensure Vulkan still works as expected.
(also: CI). Resulting executables are:
- 71MB for eden.exe
- 39MB for eden-cli.exe
Considering the entire libicudt is included (thanks Qt), that's a great size all things considered. No need to bundle all those plugins and translation files too.
Theoretically, this lays the groundwork towards fully static executables for other platforms too; though Linux doesn't have a huge benefit since AppImages are needed regardless. eden-room though maybe?
Fixes comp for clangarm64 because -msse4.1
Also allows macOS to build with qt6-static. macOS can't build static executables, but with these changes it ONLY relies on system libraries like libc and frameworks. So in theory we don't even need macdeployqt.
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2994
2025-11-11 06:22:33 +01:00
|
|
|
message(STATUS "Platform Libraries: ${PLATFORM_LIBRARIES}")
|
|
|
|
|
|
2025-03-31 18:33:05 +02:00
|
|
|
add_subdirectory(externals)
|
|
|
|
|
|
2025-08-14 20:30:30 +02:00
|
|
|
# pass targets from externals
|
2025-09-08 19:21:38 +02:00
|
|
|
find_package(libusb)
|
2025-08-15 00:35:28 +02:00
|
|
|
find_package(VulkanMemoryAllocator)
|
[cmake] update CI deps, feat: sirit CI + new CI spec (#2655)
Updates sirit to our fork's latest version w/ SPIRV Headers included
(end goal is to remove spirv-headers entirely, as spirv-tools-ci should
include them inline as well)
Adds a sirit CI on our fork for all platforms (saves a bit of compile
time)
My CI spec has changed a little bit, and now there is no need for an
additional CMake file after the initial CMakeLists.txt (since targets
are now global imported). Plus, UNIX amd64 now has the amd64 suffix like
aarch64 and windows
Updates SDL2 to 2.32.10 and OpenSSL to 3.6.0
Finally, on Solaris all CI packages (sans FFmpeg) are now built with OmniOS, which
should in theory be fully compatible with OpenIndiana (our recommended
Sun-based target) but obviously will need testing
Need testing:
- [ ] Make sure I didn't nuke shader emission
- [ ] Make sure FreeBSD, OpenBSD, and OpenIndiana work fine with bundled
sirit (check linking especially)
- [ ] Make sure SDL2, OpenSSL work with OpenIndiana now
- [ ] SDL2 on all platforms (input, etc)
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2655
2025-10-04 09:27:13 +02:00
|
|
|
find_package(enet)
|
|
|
|
|
find_package(MbedTLS)
|
|
|
|
|
find_package(VulkanUtilityLibraries)
|
|
|
|
|
find_package(SimpleIni)
|
|
|
|
|
find_package(SPIRV-Tools)
|
2025-10-05 03:04:53 +02:00
|
|
|
find_package(sirit)
|
2026-01-02 09:00:48 -03:00
|
|
|
find_package(gamemode)
|
2025-08-14 20:30:30 +02:00
|
|
|
|
2025-09-10 18:36:42 +02:00
|
|
|
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
|
|
|
|
|
find_package(xbyak)
|
|
|
|
|
endif()
|
|
|
|
|
|
2025-10-15 00:33:07 +02:00
|
|
|
if (ENABLE_WEB_SERVICE OR ENABLE_QT_UPDATE_CHECKER)
|
2025-10-15 04:25:56 +02:00
|
|
|
# Workaround: httplib will kill itself if you attempt to do a find_package propagation
|
|
|
|
|
# find_package(httplib CONFIG)
|
2025-08-14 20:30:30 +02:00
|
|
|
endif()
|
|
|
|
|
|
2025-10-21 23:36:35 +02:00
|
|
|
if (ENABLE_WEB_SERVICE OR ENABLE_UPDATE_CHECKER)
|
2025-08-15 00:35:28 +02:00
|
|
|
find_package(cpp-jwt)
|
2025-08-14 20:30:30 +02:00
|
|
|
endif()
|
|
|
|
|
|
[cmake] update CI deps, feat: sirit CI + new CI spec (#2655)
Updates sirit to our fork's latest version w/ SPIRV Headers included
(end goal is to remove spirv-headers entirely, as spirv-tools-ci should
include them inline as well)
Adds a sirit CI on our fork for all platforms (saves a bit of compile
time)
My CI spec has changed a little bit, and now there is no need for an
additional CMake file after the initial CMakeLists.txt (since targets
are now global imported). Plus, UNIX amd64 now has the amd64 suffix like
aarch64 and windows
Updates SDL2 to 2.32.10 and OpenSSL to 3.6.0
Finally, on Solaris all CI packages (sans FFmpeg) are now built with OmniOS, which
should in theory be fully compatible with OpenIndiana (our recommended
Sun-based target) but obviously will need testing
Need testing:
- [ ] Make sure I didn't nuke shader emission
- [ ] Make sure FreeBSD, OpenBSD, and OpenIndiana work fine with bundled
sirit (check linking especially)
- [ ] Make sure SDL2, OpenSSL work with OpenIndiana now
- [ ] SDL2 on all platforms (input, etc)
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2655
2025-10-04 09:27:13 +02:00
|
|
|
if (ARCHITECTURE_arm64 OR DYNARMIC_TESTS)
|
|
|
|
|
find_package(oaknut)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
if (ENABLE_SDL2)
|
|
|
|
|
find_package(SDL2)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
if (USE_DISCORD_PRESENCE)
|
|
|
|
|
find_package(DiscordRPC)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
if (ENABLE_CUBEB)
|
|
|
|
|
find_package(cubeb)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
if (YUZU_TESTS OR DYNARMIC_TESTS)
|
|
|
|
|
find_package(Catch2)
|
|
|
|
|
endif()
|
|
|
|
|
|
2025-03-31 18:33:05 +02:00
|
|
|
if (ENABLE_QT)
|
2025-05-20 15:57:19 -04:00
|
|
|
if (YUZU_USE_BUNDLED_QT)
|
2025-05-13 14:44:29 -04:00
|
|
|
download_qt(6.8.3)
|
2025-05-20 15:57:19 -04:00
|
|
|
else()
|
|
|
|
|
message(STATUS "Using system Qt")
|
|
|
|
|
if (NOT Qt6_DIR)
|
|
|
|
|
set(Qt6_DIR "" CACHE PATH "Additional path to search for Qt6 libraries like C:/Qt/6.8.3/msvc2022_64/lib/cmake/Qt6")
|
|
|
|
|
endif()
|
2025-08-04 04:50:14 +02:00
|
|
|
list(APPEND CMAKE_PREFIX_PATH "${Qt6_DIR}")
|
2025-03-31 18:33:05 +02:00
|
|
|
endif()
|
|
|
|
|
|
2025-07-17 21:00:00 +02:00
|
|
|
find_package(Qt6 REQUIRED COMPONENTS Widgets Concurrent)
|
2025-07-16 23:17:34 +02:00
|
|
|
|
|
|
|
|
if (YUZU_USE_QT_MULTIMEDIA)
|
|
|
|
|
find_package(Qt6 REQUIRED COMPONENTS Multimedia)
|
2025-07-11 10:05:17 +02:00
|
|
|
endif()
|
2025-03-31 18:33:05 +02:00
|
|
|
|
2025-08-15 04:12:45 +02:00
|
|
|
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
2025-10-05 03:04:53 +02:00
|
|
|
# yes Qt, we get it
|
|
|
|
|
set(QT_NO_PRIVATE_MODULE_WARNING ON)
|
2025-08-23 19:42:49 +02:00
|
|
|
find_package(Qt6 REQUIRED COMPONENTS DBus OPTIONAL_COMPONENTS GuiPrivate)
|
2025-08-15 04:12:45 +02:00
|
|
|
elseif (UNIX AND NOT APPLE)
|
|
|
|
|
find_package(Qt6 REQUIRED COMPONENTS DBus Gui)
|
2025-03-31 18:33:05 +02:00
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
if (ENABLE_QT_TRANSLATION)
|
|
|
|
|
find_package(Qt6 REQUIRED COMPONENTS LinguistTools)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
if (NOT DEFINED QT_TARGET_PATH)
|
|
|
|
|
get_target_property(qtcore_path Qt6::Core LOCATION_Release)
|
|
|
|
|
string(FIND "${qtcore_path}" "/bin/" qtcore_path_bin_pos REVERSE)
|
|
|
|
|
string(FIND "${qtcore_path}" "/lib/" qtcore_path_lib_pos REVERSE)
|
|
|
|
|
if (qtcore_path_bin_pos GREATER qtcore_path_lib_pos)
|
|
|
|
|
string(SUBSTRING "${qtcore_path}" 0 ${qtcore_path_bin_pos} QT_TARGET_PATH)
|
|
|
|
|
else()
|
|
|
|
|
string(SUBSTRING "${qtcore_path}" 0 ${qtcore_path_lib_pos} QT_TARGET_PATH)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
if (NOT DEFINED QT_HOST_PATH)
|
|
|
|
|
set(QT_HOST_PATH "${QT_TARGET_PATH}")
|
|
|
|
|
endif()
|
2025-05-20 15:57:19 -04:00
|
|
|
|
2025-03-31 18:33:05 +02:00
|
|
|
message(STATUS "Using target Qt at ${QT_TARGET_PATH}")
|
|
|
|
|
message(STATUS "Using host Qt at ${QT_HOST_PATH}")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
function(set_yuzu_qt_components)
|
2025-05-11 23:58:25 +00:00
|
|
|
# Best practice is to ask for all components at once, so they are from the same version
|
|
|
|
|
set(YUZU_QT_COMPONENTS2 Core Widgets Concurrent)
|
2025-08-19 21:29:36 +02:00
|
|
|
if (PLATFORM_LINUX)
|
2025-05-11 23:58:25 +00:00
|
|
|
list(APPEND YUZU_QT_COMPONENTS2 DBus)
|
|
|
|
|
endif()
|
|
|
|
|
if (YUZU_USE_QT_MULTIMEDIA)
|
|
|
|
|
list(APPEND YUZU_QT_COMPONENTS2 Multimedia)
|
2025-03-31 18:33:05 +02:00
|
|
|
endif()
|
|
|
|
|
if (YUZU_USE_QT_WEB_ENGINE)
|
2025-05-11 23:58:25 +00:00
|
|
|
list(APPEND YUZU_QT_COMPONENTS2 WebEngineCore WebEngineWidgets)
|
2025-03-31 18:33:05 +02:00
|
|
|
endif()
|
|
|
|
|
if (ENABLE_QT_TRANSLATION)
|
2025-05-11 23:58:25 +00:00
|
|
|
list(APPEND YUZU_QT_COMPONENTS2 LinguistTools)
|
2025-03-31 18:33:05 +02:00
|
|
|
endif()
|
|
|
|
|
set(YUZU_QT_COMPONENTS ${YUZU_QT_COMPONENTS2} PARENT_SCOPE)
|
2025-05-11 23:58:25 +00:00
|
|
|
endfunction(set_yuzu_qt_components)
|
2025-03-31 18:33:05 +02:00
|
|
|
|
2025-10-25 07:28:08 +02:00
|
|
|
if(ENABLE_QT)
|
|
|
|
|
set_yuzu_qt_components()
|
|
|
|
|
find_package(Qt6 REQUIRED COMPONENTS ${YUZU_QT_COMPONENTS})
|
|
|
|
|
set(QT_MAJOR_VERSION 6)
|
|
|
|
|
# Qt6 sets cxx_std_17 and we need to undo that
|
|
|
|
|
set_target_properties(Qt6::Platform PROPERTIES INTERFACE_COMPILE_FEATURES "")
|
|
|
|
|
endif()
|
|
|
|
|
|
2025-09-23 19:38:11 +02:00
|
|
|
if (NOT (YUZU_USE_BUNDLED_FFMPEG OR YUZU_USE_EXTERNAL_FFMPEG))
|
2021-02-06 03:14:11 -05:00
|
|
|
# Use system installed FFmpeg
|
2025-07-11 10:05:17 +02:00
|
|
|
find_package(FFmpeg REQUIRED QUIET COMPONENTS ${FFmpeg_COMPONENTS})
|
2025-08-14 20:30:30 +02:00
|
|
|
|
|
|
|
|
# TODO(crueter): Version
|
|
|
|
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_NAMES FFmpeg)
|
|
|
|
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "unknown (system)")
|
|
|
|
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS "https://github.com/FFmpeg/FFmpeg")
|
2021-02-06 03:14:11 -05:00
|
|
|
endif()
|
|
|
|
|
|
2023-10-04 13:11:05 -04:00
|
|
|
if (WIN32 AND YUZU_CRASH_DUMPS)
|
|
|
|
|
set(BREAKPAD_VER "breakpad-c89f9dd")
|
2025-08-11 22:27:29 +02:00
|
|
|
download_bundled_external("breakpad/" ${BREAKPAD_VER} "breakpad-win" BREAKPAD_PREFIX "c89f9dd")
|
2023-10-04 13:11:05 -04:00
|
|
|
|
|
|
|
|
set(BREAKPAD_CLIENT_INCLUDE_DIR "${BREAKPAD_PREFIX}/include")
|
|
|
|
|
set(BREAKPAD_CLIENT_LIBRARY "${BREAKPAD_PREFIX}/lib/libbreakpad_client.lib")
|
|
|
|
|
|
|
|
|
|
add_library(libbreakpad_client INTERFACE IMPORTED)
|
|
|
|
|
target_link_libraries(libbreakpad_client INTERFACE "${BREAKPAD_CLIENT_LIBRARY}")
|
|
|
|
|
target_include_directories(libbreakpad_client INTERFACE "${BREAKPAD_CLIENT_INCLUDE_DIR}")
|
|
|
|
|
endif()
|
|
|
|
|
|
2020-05-08 15:09:29 -06:00
|
|
|
# Prefer the -pthread flag on Linux.
|
|
|
|
|
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
|
|
|
|
find_package(Threads REQUIRED)
|
2018-01-04 00:13:23 -05:00
|
|
|
|
2017-05-27 23:45:55 -07:00
|
|
|
# Include source code
|
|
|
|
|
# ===================
|
2013-08-29 23:35:09 -04:00
|
|
|
|
2021-12-23 18:23:02 -07:00
|
|
|
# Adjustments for MSVC + Ninja
|
|
|
|
|
if (MSVC AND CMAKE_GENERATOR STREQUAL "Ninja")
|
|
|
|
|
add_compile_options(
|
|
|
|
|
/wd4464 # relative include path contains '..'
|
2022-10-21 02:34:07 -04:00
|
|
|
/wd4711 # function 'function' selected for automatic inline expansion
|
|
|
|
|
/wd4820 # 'bytes' bytes padding added after construct 'member_name'
|
2021-12-23 18:23:02 -07:00
|
|
|
)
|
|
|
|
|
endif()
|
2019-08-24 15:57:49 +02:00
|
|
|
|
2025-09-09 20:47:49 +02:00
|
|
|
# Adjustments for clang-cl
|
|
|
|
|
if (MSVC AND CXX_CLANG)
|
|
|
|
|
if (ARCHITECTURE_x86_64)
|
|
|
|
|
set(FILE_ARCH x86_64)
|
|
|
|
|
elseif (ARCHITECTURE_arm64)
|
|
|
|
|
set(FILE_ARCH aarch64)
|
|
|
|
|
else()
|
|
|
|
|
message(FATAL_ERROR "clang-cl: Unsupported architecture ${ARCHITECTURE}")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
AddJsonPackage(llvm-mingw)
|
|
|
|
|
set(LIB_PATH "${llvm-mingw_SOURCE_DIR}/libclang_rt.builtins-${FILE_ARCH}.a")
|
|
|
|
|
|
|
|
|
|
add_library(llvm-mingw-runtime STATIC IMPORTED)
|
|
|
|
|
set_target_properties(llvm-mingw-runtime PROPERTIES
|
|
|
|
|
IMPORTED_LOCATION "${LIB_PATH}"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
link_libraries(llvm-mingw-runtime)
|
|
|
|
|
endif()
|
|
|
|
|
|
2025-09-27 22:40:08 +02:00
|
|
|
if (YUZU_USE_FASTER_LD)
|
2025-12-04 06:00:58 +01:00
|
|
|
include(FasterLinker)
|
2022-12-10 12:50:00 -05:00
|
|
|
endif()
|
|
|
|
|
|
2025-03-31 18:33:05 +02:00
|
|
|
# Set runtime library to MD/MDd for all configurations
|
|
|
|
|
if(MSVC)
|
|
|
|
|
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
|
|
|
|
|
|
|
|
|
|
# Force all projects (including external dependencies) to use the same runtime
|
|
|
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
|
|
|
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")
|
|
|
|
|
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MD")
|
|
|
|
|
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MDd")
|
|
|
|
|
|
|
|
|
|
# Add this to ensure Cubeb uses the same runtime
|
|
|
|
|
add_compile_options(
|
|
|
|
|
$<$<CONFIG:Debug>:/MDd>
|
|
|
|
|
$<$<CONFIG:Release>:/MD>
|
|
|
|
|
$<$<CONFIG:RelWithDebInfo>:/MD>
|
|
|
|
|
$<$<CONFIG:MinSizeRel>:/MD>
|
|
|
|
|
)
|
|
|
|
|
endif()
|
|
|
|
|
|
2013-08-29 23:35:09 -04:00
|
|
|
add_subdirectory(src)
|
2015-04-22 13:34:42 +02:00
|
|
|
|
2018-09-22 12:24:02 +02:00
|
|
|
# Set yuzu project or yuzu-cmd project as default StartUp Project in Visual Studio depending on whether QT is enabled or not
|
|
|
|
|
if(ENABLE_QT)
|
|
|
|
|
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT yuzu)
|
|
|
|
|
else()
|
|
|
|
|
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT yuzu-cmd)
|
|
|
|
|
endif()
|
2018-09-12 17:36:10 +02:00
|
|
|
|
2017-05-27 23:45:55 -07:00
|
|
|
# Installation instructions
|
|
|
|
|
# =========================
|
|
|
|
|
|
2015-04-22 13:34:42 +02:00
|
|
|
# Install freedesktop.org metadata files, following those specifications:
|
2022-04-28 23:24:19 +02:00
|
|
|
# https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html
|
|
|
|
|
# https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
|
|
|
|
|
# https://specifications.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html
|
|
|
|
|
# https://www.freedesktop.org/software/appstream/docs/
|
2016-10-10 05:58:05 +00:00
|
|
|
if(ENABLE_QT AND UNIX AND NOT APPLE)
|
2025-08-31 04:56:23 +02:00
|
|
|
install(FILES "dist/dev.eden_emu.eden.desktop"
|
2025-05-11 23:58:25 +00:00
|
|
|
DESTINATION "share/applications")
|
2025-08-31 04:56:23 +02:00
|
|
|
install(FILES "dist/dev.eden_emu.eden.svg"
|
2025-06-11 15:05:03 +00:00
|
|
|
DESTINATION "share/icons/hicolor/scalable/apps")
|
2025-05-20 15:57:19 -04:00
|
|
|
|
|
|
|
|
# TODO: these files need to be updated.
|
2025-08-31 04:56:23 +02:00
|
|
|
install(FILES "dist/dev.eden_emu.eden.xml"
|
2025-05-11 23:58:25 +00:00
|
|
|
DESTINATION "share/mime/packages")
|
2025-08-31 04:56:23 +02:00
|
|
|
install(FILES "dist/dev.eden_emu.eden.metainfo.xml"
|
2025-05-11 23:58:25 +00:00
|
|
|
DESTINATION "share/metainfo")
|
2015-04-22 13:34:42 +02:00
|
|
|
endif()
|