diff --git a/CMakeLists.txt b/CMakeLists.txt index 0ca88e3c65..ecb8a8268d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,6 +21,12 @@ if (PLATFORM_SUN) # Terrific Solaris pkg shenanigans list(APPEND CMAKE_PREFIX_PATH "/usr/lib/qt/6.6/lib/amd64/cmake") list(APPEND CMAKE_MODULE_PATH "/usr/lib/qt/6.6/lib/amd64/cmake") + # For some mighty reason, doing a normal release build sometimes may not trigger + # the proper -O3 switch to materialize + if (CMAKE_BUILD_TYPE MATCHES "Release") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3") + endif() endif() set(CPM_SOURCE_CACHE ${CMAKE_SOURCE_DIR}/.cache/cpm) diff --git a/docs/Development.md b/docs/Development.md index 26a10fd062..0db4131dbb 100644 --- a/docs/Development.md +++ b/docs/Development.md @@ -7,6 +7,16 @@ * **FreeBSD**: [FreeBSD Building Guide](./docs/build/FreeBSD.md) * **macOS**: [macOS Building Guide](./docs/build/macOS.md) +# CPM + +CPM (CMake Package Manager) is the preferred method of managing dependencies within Eden. Documentation on adding dependencies/using CPMUtil is in the works. + +Notes: +- `YUZU_USE_CPM` is set by default on MSVC and Android. Other platforms should use this if certain "required" system dependencies (e.g. OpenSSL) are broken or missing +- `CPMUTIL_DEFAULT_SYSTEM` can be set to `OFF` to force the usage of bundled dependencies. This can marginally decrease the final package size. +- When adding new prebuilt dependencies a la OpenSSL, SDL2, or FFmpeg, there *must* be a CMake option made available to forcefully download this bundle. See the OpenSSL implementation in the root CMakeLists for an example. + * This is necessary to allow for creation of fully-qualified source packs that allow for offline builds after download (some package managers and distros enforce this) + # Guidelines ## License Headers @@ -76,9 +86,16 @@ cmake --build /tmp/ramdisk -- -j32 sudo umount /tmp/ramdisk ``` -# How to test JIT +## Debugging (host code) -## gdb +Ignoring SIGSEGV when debugging in host: + +- **gdb**: `handle all nostop pass`. +- **lldb**: `pro hand -p true -s false -n false SIGSEGV`. + +## Debugging (guest code) + +### gdb Run `./build/bin/eden-cli -c -d -g ` @@ -110,7 +127,7 @@ Expressions can be `variable_names` or `1234` (numbers) or `*var` (dereference o For more information type `info gdb` and read [the man page](https://man7.org/linux/man-pages/man1/gdb.1.html). -## Bisecting older commits +# Bisecting older commits Since going into the past can be tricky (especially due to the dependencies from the project being lost thru time). This should "restore" the URLs for the respective submodules. diff --git a/docs/build/FreeBSD.md b/docs/build/FreeBSD.md index 059f757361..475378125c 100644 --- a/docs/build/FreeBSD.md +++ b/docs/build/FreeBSD.md @@ -1,12 +1,13 @@ ## One word of caution before proceeding. + This is not the usual or preferred way to build programs on FreeBSD. -As of writing there is no official fresh port available for eden-emu, but it is in the works. -After it is available you can find a link to the eden-emu fresh port here and on Escarys github repo. -See this build as an App Image alternative for FreeBSD. +As of writing there is no official fresh port available for Eden, but it is in the works. +After it is available you can find a link to the eden-emu fresh port here and on Escary's github repo. +See this build as an AppImage alternative for FreeBSD. ## Dependencies. Before we start we need some dependencies. -These dependencies are generally needed to build eden-emu on FreeBSD. +These dependencies are generally needed to build Eden on FreeBSD. ``` devel/cmake @@ -56,8 +57,6 @@ Change into that build directory: cd build ``` -Now choose one option either 1 or 2, but not both as one option overwrites the other. - #### 1. Building in Release Mode (usually preferred and the most performant choice): ```sh cmake .. -GNinja -DYUZU_TESTS=OFF @@ -81,3 +80,6 @@ OR ```sh doas -- ninja install ``` + +## OpenSSL +The available OpenSSL port (3.0.17) is out-of-date, and using a bundled static library instead is recommended; to do so, add `-DYUZU_USE_CPM=ON` to your CMake configure command. \ No newline at end of file diff --git a/docs/build/Linux.md b/docs/build/Linux.md index e668c16b5b..ab653dad00 100644 --- a/docs/build/Linux.md +++ b/docs/build/Linux.md @@ -12,7 +12,7 @@ The following are handled by Eden's externals: * [SDL2](https://www.libsdl.org/download-2.0.php) 2.0.18+ * [opus](https://opus-codec.org/downloads/) 1.3+ -All other dependencies will be downloaded and built by [CPM](https://github.com/cpm-cmake/CPM.cmake/) if `YUZU_USE_CPM` is on, but will use system dependencies if available: +All other dependencies will be downloaded and built by [CPM](https://github.com/cpm-cmake/CPM.cmake/) if `YUZU_USE_CPM` is on, but will always use system dependencies if available: * [Boost](https://www.boost.org/users/download/) 1.79.0+ * [Catch2](https://github.com/catchorg/Catch2) 2.13.7 - 2.13.9 diff --git a/docs/build/Solaris.md b/docs/build/Solaris.md index be681d5308..d4cfdbb6a9 100644 --- a/docs/build/Solaris.md +++ b/docs/build/Solaris.md @@ -8,73 +8,12 @@ Run the usual update + install of essential toolings: `sudo pkg update && sudo p - **gcc**: `sudo pkg install developer/gcc-14`. - **clang**: Version 20 is broken, use `sudo pkg install developer/clang-19`. -Then install the libraies: `sudo pkg install qt6 boost glslang libzip library/lz4 nlohmann-json openssl opus sdl2 zlib compress/zstd unzip pkg-config nasm autoconf mesa library/libdrm header-drm`. - -fmtlib is not available on repositories and has to be manually built: -```sh -git clone --recurisve --depth=1 https://github.com/fmtlib/fmt.git -cd fmt -cmake -DCMAKE_BUILD_TYPE=Release -B build -cmake --build build -sudo cmake --install build -``` - -pkg lz4 doesn't provide a proper CMakeFile to find the library, has to also be manually built: -```sh -git clone --depth=1 https://github.com/lz4/lz4.git -cd lz4 -gmake -sudo gmake install -``` - -Same goes for zstd: -```sh -git clone --depth=1 https://github.com/facebook/zstd.git -cd zstd -cmake -DCMAKE_BUILD_TYPE=Release -B build0 -S build/cmake -cmake --build build0 -cd build0 -sudo gmake install -``` - -pkg SDL2 is also not nice to work with on CMake, save yourself some pain and compile it yourself: -```sh -git clone --depth=1 --branch=release-2.32.8 https://github.com/libsdl-org/SDL -cmake -DCMAKE_BUILD_TYPE=Release -B build -cmake --build build -sudo cmake --install build -``` - -Audio is broken in OpenIndiana [see this issue](https://github.com/libsdl-org/SDL/issues/13405), go into `SDL/CMakeLists.txt` and comment out lines 1468: -```diff -+# set(SDL_AUDIO_DRIVER_SUNAUDIO 1) -+# file(GLOB SUN_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sun/*.c) -+# list(APPEND SOURCE_FILES ${SUN_AUDIO_SOURCES}) -+# set(HAVE_SDL_AUDIO TRUE) -``` -For Solaris this issue does not exist - however PulseAudio crashes on Solaris - so use a different backend. - ---- - -### Build preparations: -Run the following command to clone eden with git: -```sh -git clone --recursive https://git.eden-emu.dev/eden-emu/eden -``` -You usually want to add the `--recursive` parameter as it also takes care of the external dependencies for you. - -Now change into the eden directory and create a build directory there: -```sh -cd eden -mkdir build -``` - -Change into that build directory: `cd build` - -Now choose one option either 1 or 2, but not both as one option overwrites the other. +Then install the libraies: `sudo pkg install qt6 boost glslang libzip library/lz4 nlohmann-json openssl opus sdl2 zlib compress/zstd unzip pkg-config nasm autoconf mesa library/libdrm header-drm developer/fmt`. ### Building +Clone eden with git `git clone --recursive https://git.eden-emu.dev/eden-emu/eden` + ```sh # Needed for some dependencies that call cc directly (tz) echo '#!/bin/sh' >cc @@ -83,7 +22,12 @@ chmod +x cc export PATH="$PATH:$PWD" ``` -- **Configure**: `cmake -B build -DYUZU_TESTS=OFF -DYUZU_USE_BUNDLED_SDL2=OFF -DYUZU_USE_EXTERNAL_SDL2=OFF -DYUZU_USE_LLVM_DEMANGLE=OFF -DYUZU_USE_QT_MULTIMEDIA=OFF -DYUZU_USE_QT_WEB_ENGINE=OFF -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_USE_BUNDLED_QT=OFF -DENABLE_QT=OFF -DSDL_AUDIO=OFF -DENABLE_WEB_SERVICE=OFF -DENABLE_QT_UPDATE_CHECKER=OFF`. +Patch for FFmpeg: +```sh +sed -i 's/ make / gmake /' externals/ffmpeg/CMakeFiles/ffmpeg-build.dir/build.make +``` + +- **Configure**: `cmake -B build -DYUZU_USE_CPM=ON -DCMAKE_CXX_FLAGS="-I/usr/include/SDL2" -DCMAKE_C_FLAGS="-I/usr/include/SDL2"`. - **Build**: `cmake --build build`. - **Installing**: `sudo cmake --install build`. @@ -104,4 +48,4 @@ export LIBGL_ALWAYS_SOFTWARE=1 - Modify the generated ffmpeg.make (in build dir) if using multiple threads (base system `make` doesn't use `-j4`, so change for `gmake`). - If using OpenIndiana, due to a bug in SDL2 cmake configuration; Audio driver defaults to SunOS ``, which does not exist on OpenIndiana. -- Enabling OpenSSL requires compiling OpenSSL manually instead of using the provided one from repositores. +- System OpenSSL generally does not work. Instead, use `-DYUZU_USE_CPM=ON` to use a bundled static OpenSSL, or build a system dependency from source. \ No newline at end of file diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 314f414e2e..71dd2962e7 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -139,6 +139,7 @@ endif() # Sirit # TODO(crueter): spirv-tools doesn't work w/ system +set(SPIRV_WERROR OFF) AddPackage( NAME SPIRV-Headers REPO "KhronosGroup/SPIRV-Headers" diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 4dcce95bb6..f7ec2985c7 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -8,7 +8,7 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) # Set the RPATH for Qt Libraries # This must be done before the `yuzu` target is created -if (YUZU_USE_BUNDLED_QT AND (PLATFORM_LINUX)) +if (YUZU_USE_BUNDLED_QT AND PLATFORM_LINUX) set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}/bin/lib/") endif() @@ -499,7 +499,7 @@ endif() # Explicit linking required if (PLATFORM_SUN) - target_link_libraries(yuzu PRIVATE X11) + target_link_libraries(yuzu PRIVATE X11 "/usr/lib/xorg/amd64/libdrm.so") endif() # Extra deps diff --git a/src/yuzu_cmd/CMakeLists.txt b/src/yuzu_cmd/CMakeLists.txt index 11f8317f9c..afd003a86c 100644 --- a/src/yuzu_cmd/CMakeLists.txt +++ b/src/yuzu_cmd/CMakeLists.txt @@ -42,7 +42,7 @@ target_link_libraries(yuzu-cmd PRIVATE SDL2::SDL2 Vulkan::Headers) # In Solaris needs explicit linking for ffmpeg which links to /lib/amd64/libX11.so if (PLATFORM_SUN) - target_link_libraries(yuzu-cmd PRIVATE X11) + target_link_libraries(yuzu-cmd PRIVATE X11 "/usr/lib/xorg/amd64/libdrm.so") endif() if(UNIX AND NOT APPLE)