diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 04d7b11b..3b1e83b4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,9 +6,27 @@ on: branches: [ main, master ] pull_request: +env: + KYTY_BUILD_ORIGIN: ${{ github.repository != 'KytyPS5/KytyPS5' && 'Fork' || github.event_name == 'push' && 'Official' || 'Source' }} + KYTY_BUILD_REPOSITORY: ${{ github.repository }} + jobs: + metadata: + name: Prepare build metadata + runs-on: ubuntu-latest + outputs: + release_tag: ${{ steps.release_tag.outputs.value }} + + steps: + - name: Generate release tag + id: release_tag + shell: bash + run: | + echo "value=KytyPS5-$(date -u +'%Y-%m-%d')-${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT" + windows: name: Build KytyPS5 (Windows) + needs: metadata runs-on: windows-2022 steps: @@ -76,6 +94,9 @@ jobs: cmake -S . -B _Build/windows ^ -G Ninja ^ -DCMAKE_BUILD_TYPE=Release ^ + -DKYTY_BUILD_ORIGIN=%KYTY_BUILD_ORIGIN% ^ + -DKYTY_BUILD_REPOSITORY=%KYTY_BUILD_REPOSITORY% ^ + -DKYTY_RELEASE_TAG=${{ needs.metadata.outputs.release_tag }} ^ -DCMAKE_C_COMPILER=clang-cl ^ -DCMAKE_CXX_COMPILER=clang-cl ^ -DCMAKE_PREFIX_PATH="%Qt6_DIR%" @@ -104,6 +125,7 @@ jobs: macos: name: Build KytyPS5 (macOS) + needs: metadata runs-on: macos-15 steps: @@ -150,6 +172,9 @@ jobs: cmake -S . -B _Build/macos \ -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ + -DKYTY_BUILD_ORIGIN="$KYTY_BUILD_ORIGIN" \ + -DKYTY_BUILD_REPOSITORY="$KYTY_BUILD_REPOSITORY" \ + -DKYTY_RELEASE_TAG="${{ needs.metadata.outputs.release_tag }}" \ -DCMAKE_OSX_ARCHITECTURES=x86_64 \ -DCMAKE_C_COMPILER=clang \ -DCMAKE_CXX_COMPILER=clang++ \ @@ -213,6 +238,7 @@ jobs: linux: name: Build KytyPS5 (Linux) + needs: metadata runs-on: ubuntu-24.04 steps: @@ -273,6 +299,9 @@ jobs: cmake -S . -B _Build/linux \ -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ + -DKYTY_BUILD_ORIGIN="$KYTY_BUILD_ORIGIN" \ + -DKYTY_BUILD_REPOSITORY="$KYTY_BUILD_REPOSITORY" \ + -DKYTY_RELEASE_TAG="${{ needs.metadata.outputs.release_tag }}" \ -DCMAKE_C_COMPILER=clang \ -DCMAKE_CXX_COMPILER=clang++ \ -DCMAKE_PREFIX_PATH="$Qt6_DIR" 2>&1 | tee _Build/configure.log @@ -342,10 +371,12 @@ jobs: release: name: Release KytyPS5 if: github.event_name == 'push' && github.repository == 'KytyPS5/KytyPS5' - needs: [windows, macos, linux] + needs: [metadata, windows, macos, linux] runs-on: ubuntu-latest permissions: contents: write + env: + RELEASE_NAME: ${{ needs.metadata.outputs.release_tag }} steps: - name: Download builds @@ -353,11 +384,6 @@ jobs: with: path: artifacts - - name: Set release name - shell: bash - run: | - echo "RELEASE_NAME=KytyPS5-$(date -u +'%Y-%m-%d')-${GITHUB_SHA::7}" >> "$GITHUB_ENV" - - name: Package builds shell: bash run: | diff --git a/CMakeLists.txt b/CMakeLists.txt index 06e174c4..96c71029 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,6 +28,29 @@ include(CTest) option(KYTY_ENABLE_CLANG_TIDY "Run clang-tidy checks during builds" OFF) +set(KYTY_BUILD_ORIGIN "Source" CACHE STRING "Build provenance shown in diagnostics") +set_property(CACHE KYTY_BUILD_ORIGIN PROPERTY STRINGS Source Official Fork) +if(NOT KYTY_BUILD_ORIGIN STREQUAL "Source" AND NOT KYTY_BUILD_ORIGIN STREQUAL "Official" AND + NOT KYTY_BUILD_ORIGIN STREQUAL "Fork") + message(FATAL_ERROR "KYTY_BUILD_ORIGIN must be Source, Official, or Fork") +endif() + +set(KYTY_RELEASE_TAG "" CACHE STRING "Release tag embedded in official builds") +set(KYTY_BUILD_REPOSITORY "" CACHE STRING "GitHub repository embedded in fork builds") +set(KYTY_OFFICIAL_BUILD OFF) +set(KYTY_FORK_BUILD OFF) +if(KYTY_BUILD_ORIGIN STREQUAL "Official") + if(KYTY_RELEASE_TAG STREQUAL "") + message(FATAL_ERROR "Official builds require KYTY_RELEASE_TAG") + endif() + set(KYTY_OFFICIAL_BUILD ON) +elseif(KYTY_BUILD_ORIGIN STREQUAL "Fork") + if(KYTY_BUILD_REPOSITORY STREQUAL "") + message(FATAL_ERROR "Fork builds require KYTY_BUILD_REPOSITORY") + endif() + set(KYTY_FORK_BUILD ON) +endif() + set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) include(TestBigEndian) @@ -117,16 +140,20 @@ configure_file( find_package(Git) -add_custom_target( KytyGitVersion - COMMAND ${CMAKE_COMMAND} - -D INPUT_FILE=${KYTY_SOURCE_DIR}/kytyGitVersion.h.in - -D OUTPUT_FILE=${PROJECT_BINARY_DIR}/kytyGitVersion.h - -D GIT_EXECUTABLE=${GIT_EXECUTABLE} - -D GIT_WORKING_DIRECTORY=${CMAKE_CURRENT_SOURCE_DIR} - -P ${KYTY_SOURCE_DIR}/generate_version.cmake +add_custom_target(KytyGitVersion + COMMAND ${CMAKE_COMMAND} + -D INPUT_FILE=${KYTY_SOURCE_DIR}/kytyGitVersion.h.in + -D OUTPUT_FILE=${PROJECT_BINARY_DIR}/kytyGitVersion.h + -D GIT_EXECUTABLE=${GIT_EXECUTABLE} + -D GIT_WORKING_DIRECTORY=${CMAKE_CURRENT_SOURCE_DIR} + -P ${KYTY_SOURCE_DIR}/generate_version.cmake + BYPRODUCTS ${PROJECT_BINARY_DIR}/kytyGitVersion.h COMMENT "Generate kytyGitVersion.h" ) +add_library(kyty_git_version INTERFACE) +add_dependencies(kyty_git_version KytyGitVersion) + if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 12.0.0) list(APPEND KYTY_IWYU kyty_emulator @@ -259,7 +286,7 @@ if (KYTY_CLANG_CL) set_source_files_properties(${kyty_emulator_src} PROPERTIES COMPILE_FLAGS "-Wno-pragma-pack -Wno-deprecated-declarations -D_TIMESPEC_DEFINED") endif() -set(kyty_emulator_link_libraries common Vulkan::Headers spirv-tools-opt spirv-tools SDL2-static xxhash FFmpeg::ffmpeg fmt::fmt nlohmann_json::nlohmann_json LibAtrac9) +set(kyty_emulator_link_libraries common Vulkan::Headers spirv-tools-opt spirv-tools SDL2-static xxhash FFmpeg::ffmpeg fmt::fmt nlohmann_json::nlohmann_json LibAtrac9 kyty_git_version) # Linux system libraries required by the static FFmpeg archive. if(LINUX) @@ -563,8 +590,6 @@ elseif(WIN32 OR LINUX) set_target_properties(kyty_emulator PROPERTIES LINK_FLAGS "${KYTY_LD_OPTIONS} -Wl,-Map=${KYTY_EMULATOR_MAP_LINK_PATH}") endif() -add_dependencies(kyty_emulator KytyGitVersion) - if(APPLE) # The emulator writes x86-64 trampolines/PLT stubs into memory and executes them, and # runs guest code under Rosetta. That requires the JIT / unsigned-executable-memory diff --git a/src/cmake_config.h.in b/src/cmake_config.h.in index 2c4182f1..5507814c 100644 --- a/src/cmake_config.h.in +++ b/src/cmake_config.h.in @@ -1,4 +1,8 @@ #define KYTY_VERSION "@KYTY_VERSION@" +#define KYTY_BUILD_REPOSITORY "@KYTY_BUILD_REPOSITORY@" +#define KYTY_RELEASE_TAG "@KYTY_RELEASE_TAG@" +#cmakedefine KYTY_OFFICIAL_BUILD +#cmakedefine KYTY_FORK_BUILD #define KYTY_ENDIAN @KYTY_ENDIAN@ #define KYTY_PLATFORM @KYTY_PLATFORM@ #define KYTY_COMPILER KYTY_COMPILER_@KYTY_COMPILER@ diff --git a/src/generate_version.cmake b/src/generate_version.cmake index a112f300..8359daae 100644 --- a/src/generate_version.cmake +++ b/src/generate_version.cmake @@ -1,7 +1,8 @@ set(KYTY_GIT_VERSION "unknown") +set(KYTY_GIT_HASH "unknown") if(GIT_EXECUTABLE) execute_process( - COMMAND "${GIT_EXECUTABLE}" describe --tags --always + COMMAND "${GIT_EXECUTABLE}" describe --tags --always --dirty WORKING_DIRECTORY "${GIT_WORKING_DIRECTORY}" OUTPUT_VARIABLE KYTY_GIT_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE @@ -11,5 +12,27 @@ if(GIT_EXECUTABLE) if(NOT GIT_RESULT EQUAL 0) set(KYTY_GIT_VERSION "unknown") endif() + + execute_process( + COMMAND "${GIT_EXECUTABLE}" rev-parse --short=7 HEAD + WORKING_DIRECTORY "${GIT_WORKING_DIRECTORY}" + OUTPUT_VARIABLE KYTY_GIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE + RESULT_VARIABLE GIT_HASH_RESULT + ERROR_QUIET + ) + if(NOT GIT_HASH_RESULT EQUAL 0) + set(KYTY_GIT_HASH "unknown") + else() + execute_process( + COMMAND "${GIT_EXECUTABLE}" diff-index --quiet HEAD -- + WORKING_DIRECTORY "${GIT_WORKING_DIRECTORY}" + RESULT_VARIABLE GIT_DIRTY_RESULT + ERROR_QUIET + ) + if(NOT GIT_DIRTY_RESULT EQUAL 0) + string(APPEND KYTY_GIT_HASH "-dirty") + endif() + endif() endif() configure_file("${INPUT_FILE}" "${OUTPUT_FILE}") diff --git a/src/graphics/presentation/window/window.cpp b/src/graphics/presentation/window/window.cpp index 600ff5e1..e74c5d9f 100644 --- a/src/graphics/presentation/window/window.cpp +++ b/src/graphics/presentation/window/window.cpp @@ -33,6 +33,7 @@ #include "graphics/host_gpu/vulkanCommon.h" #include "graphics/presentation/renderDoc.h" #include "graphics/presentation/window/windowInternal.h" +#include "kytyGitVersion.h" #include "libs/controller.h" #include "loader/systemContent.h" @@ -937,6 +938,22 @@ void WindowContext::UpdateTitle() { static uint64_t fps_frames = 0; static double current_fps = 0.0; +#if KYTY_BUILD == KYTY_BUILD_DEBUG + static constexpr auto build_type = "Debug"; +#elif KYTY_BUILD == KYTY_BUILD_RELEASE + static constexpr auto build_type = "Release"; +#else + static constexpr auto build_type = "Unknown"; +#endif + +#if defined(KYTY_OFFICIAL_BUILD) + static constexpr auto build_label = "Official build " KYTY_RELEASE_TAG; +#elif defined(KYTY_FORK_BUILD) + static constexpr auto build_label = "Fork build " KYTY_BUILD_REPOSITORY " " KYTY_GIT_HASH; +#else + static constexpr auto build_label = "Source build " KYTY_GIT_HASH; +#endif + const auto now = Common::Timer::QueryPerformanceCounter(); const auto frequency = Common::Timer::QueryPerformanceFrequency(); frame_num++; @@ -948,11 +965,11 @@ void WindowContext::UpdateTitle() { fps_frames = 0; } - auto fps = - fmt::format("{}{}{}{}{}{}[{}] [{}], frame: {}, fps: {:f}", (has_title ? title : ""), - (has_title ? ", " : ""), (has_title_id ? title_id : ""), - (has_title_id ? ", " : ""), (has_app_ver ? app_ver : ""), - (has_app_ver ? " " : ""), device_name, processor_name, frame_num, current_fps); + auto fps = fmt::format("[{} | {}] {}{}{}{}{}{}[{}] [{}], frame: {}, fps: {:f}", build_label, + build_type, (has_title ? title : ""), (has_title ? ", " : ""), + (has_title_id ? title_id : ""), (has_title_id ? ", " : ""), + (has_app_ver ? app_ver : ""), (has_app_ver ? " " : ""), device_name, + processor_name, frame_num, current_fps); #if defined(__APPLE__) // AppKit traps on title changes off the main thread; fire-and-forget keeps present pacing. diff --git a/src/kytyGitVersion.h.in b/src/kytyGitVersion.h.in index b04b3f8d..75f315ac 100644 --- a/src/kytyGitVersion.h.in +++ b/src/kytyGitVersion.h.in @@ -1 +1,2 @@ -#define KYTY_GIT_VERSION "@KYTY_GIT_VERSION@" \ No newline at end of file +#define KYTY_GIT_VERSION "@KYTY_GIT_VERSION@" +#define KYTY_GIT_HASH "@KYTY_GIT_HASH@" diff --git a/src/launcher/CMakeLists.txt b/src/launcher/CMakeLists.txt index 4ab306de..1c366549 100644 --- a/src/launcher/CMakeLists.txt +++ b/src/launcher/CMakeLists.txt @@ -37,7 +37,6 @@ elseif(LINUX) set_target_properties(launcher PROPERTIES LINK_FLAGS "${KYTY_LD_OPTIONS}") endif() -add_dependencies(launcher KytyGitVersion) add_dependencies(launcher kyty_emulator) if(KYTY_CLANG_CL)