From 8aceb4960a4330cdf01a26eb1becb74fd7e736c5 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Wed, 27 Sep 2023 18:19:09 +0300 Subject: [PATCH] Initial Qt setup --- .github/workflows/Qt_Build.yml | 46 ++++++++++ CMakeLists.txt | 24 +++++ src/main.cpp | 3 +- third_party/CMakeModules/install_qt.cmake | 104 ++++++++++++++++++++++ 4 files changed, 176 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/Qt_Build.yml create mode 100644 third_party/CMakeModules/install_qt.cmake diff --git a/.github/workflows/Qt_Build.yml b/.github/workflows/Qt_Build.yml new file mode 100644 index 000000000..5857ca70f --- /dev/null +++ b/.github/workflows/Qt_Build.yml @@ -0,0 +1,46 @@ +name: Windows Build (Qt) + +on: + push: + branches: + - master + pull_request: + +env: + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) + BUILD_TYPE: Release + +jobs: + build: + # The CMake configure and build commands are platform agnostic and should work equally + # well on Windows or Mac. You can convert this to a matrix build if you need + # cross-platform coverage. + # See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix + runs-on: windows-latest + + steps: + - uses: actions/checkout@v2 + - name: Fetch submodules + run: git submodule update --init --recursive + + - name: Setup Vulkan SDK + uses: humbletim/setup-vulkan-sdk@v1.2.0 + with: + vulkan-query-version: latest + vulkan-use-cache: true + vulkan-components: Vulkan-Headers, Vulkan-Loader, Glslang + + - name: Configure CMake + # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. + # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DENABLE_USER_BUILD=ON -DENABLE_QT_GUI=ON + + - name: Build + # Build your program with the given configuration + run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} + + - name: Upload executable + uses: actions/upload-artifact@v2 + with: + name: Windows executable + path: './build/Release/Alber.exe' diff --git a/CMakeLists.txt b/CMakeLists.txt index a9688fe3d..9ea01b072 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,6 +37,8 @@ option(ENABLE_USER_BUILD "Make a user-facing build. These builds have various as option(ENABLE_HTTP_SERVER "Enable HTTP server. Used for Discord bot support" OFF) option(ENABLE_DISCORD_RPC "Compile with Discord RPC support (disabled by default)" ON) option(ENABLE_LUAJIT "Enable scripting with the Lua programming language" ON) +option(ENABLE_QT_GUI "Enable the Qt GUI. If not selected then the emulator uses a minimal SDL-based UI instead" OFF) +option(USE_SYSTEM_QT "Use your own version of Qt instead of automatically downloading one" OFF) include_directories(${PROJECT_SOURCE_DIR}/include/) include_directories(${PROJECT_SOURCE_DIR}/include/kernel) @@ -62,6 +64,23 @@ if(ENABLE_DISCORD_RPC AND NOT ANDROID) include_directories(third_party/discord-rpc/include) endif() +if (ENABLE_QT_GUI) + set(ARCHITECTURE "x86_64") + + if (NOT USE_SYSTEM_QT) + # Shout-out to whoever made this + include(third_party/CMakeModules/install_qt.cmake) + download_qt(6.2.0) + endif() + + find_package(Qt6 REQUIRED COMPONENTS Widgets) + + # We can't use qt_standard_project_setup since it's Qt 6.3+ and we don't need to set the minimum that high + set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTORCC ON) + set(CMAKE_AUTOUIC ON) +endif() + set(SDL_STATIC ON CACHE BOOL "" FORCE) set(SDL_SHARED OFF CACHE BOOL "" FORCE) set(SDL_TEST OFF CACHE BOOL "" FORCE) @@ -362,6 +381,11 @@ if(ENABLE_VULKAN) target_link_libraries(Alber PRIVATE Vulkan::Vulkan resources_renderer_vk) endif() +if(ENABLE_VULKAN) + target_compile_definitions(Alber PUBLIC "PANDA3DS_ENABLE_QT=1") + target_link_libraries(Alber PRIVATE Qt6::Widgets) +endif() + if(GPU_DEBUG_INFO) target_compile_definitions(Alber PRIVATE GPU_DEBUG_INFO=1) endif() diff --git a/src/main.cpp b/src/main.cpp index 66a04b9e5..ce0d34e87 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,5 @@ #include "emulator.hpp" +#include int main(int argc, char *argv[]) { Emulator emu; @@ -16,4 +17,4 @@ int main(int argc, char *argv[]) { } emu.run(); -} \ No newline at end of file +} \ No newline at end of file diff --git a/third_party/CMakeModules/install_qt.cmake b/third_party/CMakeModules/install_qt.cmake new file mode 100644 index 000000000..95f53b812 --- /dev/null +++ b/third_party/CMakeModules/install_qt.cmake @@ -0,0 +1,104 @@ +# Adapted from https://github.com/citra-emu/citra/blob/master/CMakeModules/DownloadExternals.cmake + +# This function downloads Qt using aqt. The path of the downloaded content will be added to the CMAKE_PREFIX_PATH. +# Params: +# target: Qt dependency to install. Specify a version number to download Qt, or "tools_(name)" for a specific build tool. +function(download_qt target) + if (target MATCHES "tools_.*") + set(DOWNLOAD_QT_TOOL ON) + else() + set(DOWNLOAD_QT_TOOL OFF) + endif() + + # Determine installation parameters for OS, architecture, and compiler + if (WIN32) + set(host "windows") + set(type "desktop") + if (NOT DOWNLOAD_QT_TOOL) + if (MINGW) + set(arch "win64_mingw") + set(arch_path "mingw_64") + elseif (MSVC) + if ("arm64" IN_LIST ARCHITECTURE) + set(arch_path "msvc2019_arm64") + elseif ("x86_64" IN_LIST ARCHITECTURE) + set(arch_path "msvc2019_64") + else() + message(FATAL_ERROR "Unsupported bundled Qt architecture. Enable USE_SYSTEM_QT and provide your own.") + endif() + set(arch "win64_${arch_path}") + else() + message(FATAL_ERROR "Unsupported bundled Qt toolchain. Enable USE_SYSTEM_QT and provide your own.") + endif() + endif() + elseif (APPLE) + set(host "mac") + if (IOS AND NOT DOWNLOAD_QT_TOOL) + set(type "ios") + set(arch "ios") + set(arch_path "ios") + set(host_arch_path "macos") + else() + set(type "desktop") + set(arch "clang_64") + set(arch_path "macos") + endif() + else() + set(host "linux") + set(type "desktop") + set(arch "gcc_64") + set(arch_path "linux") + endif() + + get_external_prefix(qt base_path) + file(MAKE_DIRECTORY "${base_path}") + + if (DOWNLOAD_QT_TOOL) + set(prefix "${base_path}/Tools") + set(install_args install-tool --outputdir ${base_path} ${host} desktop ${target}) + else() + set(prefix "${base_path}/${target}/${arch_path}") + if (host_arch_path) + set(host_flag "--autodesktop") + set(host_prefix "${base_path}/${target}/${host_arch_path}") + endif() + set(install_args install-qt --outputdir ${base_path} ${host} ${type} ${target} ${arch} ${host_flag} + -m qtmultimedia --archives qttranslations qttools qtsvg qtbase) + endif() + + if (NOT EXISTS "${prefix}") + message(STATUS "Downloading binaries for Qt...") + if (WIN32) + set(aqt_path "${base_path}/aqt.exe") + file(DOWNLOAD + https://github.com/miurahr/aqtinstall/releases/download/v3.1.7/aqt.exe + ${aqt_path} SHOW_PROGRESS) + execute_process(COMMAND ${aqt_path} ${install_args} + WORKING_DIRECTORY ${base_path}) + else() + # aqt does not offer binary releases for other platforms, so download and run from pip. + set(aqt_install_path "${base_path}/aqt") + file(MAKE_DIRECTORY "${aqt_install_path}") + + execute_process(COMMAND python3 -m pip install --target=${aqt_install_path} aqtinstall + WORKING_DIRECTORY ${base_path}) + execute_process(COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${aqt_install_path} python3 -m aqt ${install_args} + WORKING_DIRECTORY ${base_path}) + endif() + endif() + + message(STATUS "Using downloaded Qt binaries at ${prefix}") + + # Add the Qt prefix path so CMake can locate it. + list(APPEND CMAKE_PREFIX_PATH "${prefix}") + set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE) + + if (DEFINED host_prefix) + message(STATUS "Using downloaded host Qt binaries at ${host_prefix}") + set(QT_HOST_PATH "${host_prefix}" CACHE STRING "") + endif() +endfunction() + +function(get_external_prefix lib_name prefix_var) + set(${prefix_var} "${CMAKE_BINARY_DIR}/externals/${lib_name}" PARENT_SCOPE) +endfunction() \ No newline at end of file