Files
Yosuga_rk3566/CMakeLists.txt
T
Misaki 7551a85abe first
2026-06-10 00:57:54 +08:00

358 lines
13 KiB
CMake
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
cmake_minimum_required(VERSION 3.30)
project(Yosuga VERSION 1.0)
set(CMAKE_CXX_STANDARD 20) # C++20
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
# 平台与架构检测
if(DEFINED TARGET_ARCH AND TARGET_ARCH STREQUAL "arm64")
set(PLAT "linux_arm")
set(ARCH "arm64")
set(CMAKE_PREFIX_PATH "/home/misaki/MisakiCodes/rk3566-sdk/3rd/Qt6.6.3")
add_definitions(-DCSM_TARGET_HARMONYOS_ES3) # OpenGL ES 3.0 渲染宏
add_definitions(-DEMBEDDED_LINUX) # 嵌入式Linux专用宏
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64|ARM64")
set(PLAT "linux_arm")
set(ARCH "arm64")
set(CMAKE_PREFIX_PATH "/home/misaki/MisakiCodes/rk3566-sdk/3rd/Qt6.6.3")
add_definitions(-DCSM_TARGET_HARMONYOS_ES3)
add_definitions(-DEMBEDDED_LINUX)
elseif(WIN32)
set(PLAT "windows")
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(ARCH "x86_64")
else()
set(ARCH "x86")
endif()
add_definitions(-DCSM_TARGET_WIN_GL)
elseif(APPLE)
set(PLAT "macos")
set(ARCH "x86_64")
add_definitions(-DCSM_TARGET_MAC_GL)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(PLAT "linux_64")
set(ARCH "x86_64")
add_definitions(-DCSM_TARGET_LINUX_GL)
else()
message(FATAL_ERROR "不支持的平台")
endif()
message(STATUS " 当前Qt路径: ${CMAKE_PREFIX_PATH}")
message(STATUS " 当前平台: ${PLAT} 架构: ${ARCH}")
# 设置是否为debug模式 默认为Debug
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Debug)
endif()
# Live2D 渲染后端选择(必须 OpenGL)
set(FRAMEWORK_SOURCE OpenGL)
# 查找源文件
file(GLOB_RECURSE LAppLive2D
CONFIGURE_DEPENDS
"3rdparty/Live2D/Src/LAppLive2D/Src/*.cpp"
"3rdparty/Live2D/Src/LAppLive2D/Inc/*.hpp"
)
file(GLOB_RECURSE YosugaSrc
CONFIGURE_DEPENDS
"src/Handle/AudioHandle/Src/*.cpp"
"src/Handle/AudioHandle/Inc/*.h"
"src/Handle/NetWorkHandle/Src/*.cpp"
"src/Handle/NetWorkHandle/Inc/*.h"
"src/Handle/DataObjectHandle/Src/*.cpp"
"src/Handle/DataObjectHandle/Inc/*.h"
"src/DAO/Inc/*.h"
"src/DAO/Src/*.cpp"
"src/UI/Render/TextRender/Src/*.cpp"
"src/UI/Render/TextRender/Inc/*.h"
"src/Core/Src/*.cpp"
"src/Core/Inc/*.h"
"src/Utils/Inc/*.hpp"
"src/Utils/Inc/*.h"
"src/Utils/Src/*.cpp"
)
# 如果是桌面平台,再额外添加 UI 相关目录
if(NOT PLAT STREQUAL "linux_arm")
file(GLOB_RECURSE DesktopUI_Src
"src/UI/Menu/Src/*.cpp"
"src/UI/Menu/Inc/*.h"
"src/UI/Setting/Src/*.cpp"
"src/UI/Setting/Inc/*.h"
)
message(STATUS " 被主机平台额外包含的库: ${YosugaSrc}")
list(APPEND YosugaSrc ${DesktopUI_Src})
endif()
message(STATUS "QT_HOST_PATH = ${QT_HOST_PATH}")
# 查找 Qt6 模块(ARM 使用交叉编译的 Qt)
find_package(Qt6 COMPONENTS
Core
Gui
Widgets
Network
Svg
SerialPort
WebSockets
Multimedia
OpenGLWidgets
Concurrent
REQUIRED)
# 仅在非 ARM 平台查找桌面 OpenGL
if(NOT PLAT STREQUAL "linux_arm")
find_package(OpenGL REQUIRED)
else ()
# 若为arm平台,对于C++采用静态链接标准库,避免环境复杂出现问题
set(CMAKE_EXE_LINKER_FLAGS "-static-libstdc++ -static-libgcc")
endif ()
# 添加第三方子项目
if(NOT PLAT STREQUAL "linux_arm")
### 部分第三方子项目与嵌入式Linux不兼容(嵌入式Linux环境复杂,有的没有桌面环境,因此不一定支持窗口)
add_subdirectory(3rdparty/ElaWidgetTools)
add_subdirectory(3rdparty/autogui-cpp)
else()
message(STATUS "ARM platform: skipping ElaWidgetTools and autogui-cpp (crosscompile them separately)")
endif()
# 主可执行文件
add_executable(${PROJECT_NAME} main.cpp ${LAppLive2D} ${YosugaSrc})
# =============================================
# 库导入路径配置
# =============================================
# Framework 静态库 ---
if(PLAT STREQUAL "linux_arm")
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
### 注意此处需要根据你的framework的放置目录进行调整
set(FRAMEWORK_LIB_PATH "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/Live2D/Lib/Debug/linux_arm/framework/misaki_rk3566/libFramework.a")
else()
set(FRAMEWORK_LIB_PATH "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/Live2D/Lib/Release/linux_arm/framework/misaki_rk3566/libFramework.a")
endif()
else()
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(LIB_CONFIG "Debug")
else()
set(LIB_CONFIG "Release")
endif()
set(LIB_BASE "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/Live2D/Lib")
set(LIB_CONFIG_DIR "${LIB_BASE}/${LIB_CONFIG}/${PLAT}")
set(FRAMEWORK_LIB_PATH "${LIB_CONFIG_DIR}/framework/libFramework.a")
endif()
add_library(Framework STATIC IMPORTED GLOBAL)
set_target_properties(Framework PROPERTIES IMPORTED_LOCATION "${FRAMEWORK_LIB_PATH}")
message(STATUS "Framework 库: ${FRAMEWORK_LIB_PATH}")
# Core 静态库 该库由官方自行编译提供,理论上是平台无关的,但是可能和glibc版本有关,太老的glibc版本不一定能使用
# 因为Core没有开源,也因此才叫Live2D SDK,而不是Live2D Lib。个人觉得不如开源出来,像Qt那样就挺好。
if(PLAT STREQUAL "linux_arm")
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CORE_LIB_PATH "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/Live2D/Lib/Debug/linux_arm/live2d/static_lib/arm64/libLive2DCubismCore.a")
else()
set(CORE_LIB_PATH "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/Live2D/Lib/Release/linux_arm/live2d/static_lib/arm64/libLive2DCubismCore.a")
endif()
else()
if(PLAT STREQUAL "windows")
set(CORE_LIB_PATH "${LIB_CONFIG_DIR}/live2d/static_lib/x86_64/Live2DCubismCore.lib")
else()
set(CORE_LIB_PATH "${LIB_CONFIG_DIR}/live2d/static_lib/x86_64/libLive2DCubismCore.a")
endif()
endif()
add_library(Live2DCubismCore STATIC IMPORTED GLOBAL)
set_target_properties(Live2DCubismCore PROPERTIES IMPORTED_LOCATION "${CORE_LIB_PATH}")
message(STATUS "Live2D Core 库: ${CORE_LIB_PATH}")
# GLFW 和 GLEW(仅桌面平台需要)
if(NOT PLAT STREQUAL "linux_arm")
# glfw
add_library(glfw3 STATIC IMPORTED GLOBAL)
set_target_properties(glfw3 PROPERTIES IMPORTED_LOCATION "${LIB_CONFIG_DIR}/glfw/libglfw3.a")
message(STATUS "GLFW 库: libglfw3.a")
# glew
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
if(PLAT STREQUAL "windows")
set(GLEW_LIB_NAME "libglew32d.dll.a")
else()
set(GLEW_LIB_NAME "libGLEWd.a")
endif()
else()
if(PLAT STREQUAL "windows")
set(GLEW_LIB_NAME "libglew32.dll.a")
else()
set(GLEW_LIB_NAME "libGLEW.a")
endif()
endif()
add_library(GLEW STATIC IMPORTED GLOBAL)
set_target_properties(GLEW PROPERTIES IMPORTED_LOCATION "${LIB_CONFIG_DIR}/glfw/${GLEW_LIB_NAME}")
message(STATUS "GLEW 库: ${GLEW_LIB_NAME}")
endif()
# =============================================
# 链接库
# =============================================
if(PLAT STREQUAL "linux_arm") ## 针对嵌入式Linux的配置,部分条目需要根据你的soc以及sysroot进行修改
target_link_libraries(${PROJECT_NAME} PRIVATE
Framework
Live2DCubismCore
# Mali GPU 驱动完整链接(EGLFS 必需)
-lmali-hook # 注意此处,你的soc不一定是该GPU,可能需要修改
-Wl,--whole-archive -lmali-hook-injector -Wl,--no-whole-archive
-lmali
-ldrm
-lEGL
-lGLESv2
# Qt 模块(从交叉编译的 Qt
Qt::Core Qt::Gui Qt::Widgets Qt::Network Qt::Svg Qt::SerialPort
Qt::WebSockets Qt::Multimedia Qt::OpenGLWidgets Qt::Concurrent
#
# ElaWidgetTools autogui-cpp
)
else()
# 桌面平台
target_link_libraries(${PROJECT_NAME} PRIVATE
Framework
glfw3
GLEW
Live2DCubismCore
$<$<BOOL:${WIN32}>:opengl32>
$<$<BOOL:${WIN32}>:glu32>
ElaWidgetTools
autogui-cpp
Qt::Core Qt::Gui Qt::Widgets Qt::Network Qt::Svg Qt::SerialPort
Qt::WebSockets Qt::Multimedia Qt::OpenGLWidgets Qt::Concurrent
)
if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND NOT PLAT STREQUAL "linux_arm")
find_package(X11 REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE X11::X11)
endif()
if(APPLE)
find_library(COREGRAPHICS_LIB CoreGraphics REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE ${COREGRAPHICS_LIB})
endif()
endif()
# =============================================
# 头文件路径
# =============================================
target_include_directories(${PROJECT_NAME} PRIVATE
3rdparty/Live2D/Src/Framework/src
3rdparty/Live2D/Src/Core/include
3rdparty/Live2D/Src/stb
3rdparty/Live2D/Src/LAppLive2D/Inc
3rdparty/autogui-cpp/src
src/Handle/AudioHandle/Inc
src/Handle/NetWorkHandle/Inc
src/Handle/DataObjectHandle/Inc
src/UI/Menu/Inc
src/UI/Setting/Inc
src/UI/Render/TextRender/Inc
src/Core/Inc
src/DAO/Inc
src/Utils/Inc
)
# ARM 平台需要包含 sysroot 中的 OpenGL ES 头文件 此处需要根据实际sysroot目录进行修改配置
if(PLAT STREQUAL "linux_arm")
target_include_directories(${PROJECT_NAME} PRIVATE
/home/misaki/MisakiCodes/Env/rk3566-sdk/host/aarch64-buildroot-linux-gnu/sysroot/usr/include
/home/misaki/MisakiCodes/Env/rk3566-sdk/host/aarch64-buildroot-linux-gnu/sysroot/usr/include/GLES2
)
endif()
# 非 ARM 平台才需要 GLEW/GLFW 头文件路径
if(NOT PLAT STREQUAL "linux_arm")
target_include_directories(${PROJECT_NAME} PRIVATE
3rdparty/Live2D/Src/glew/include
3rdparty/Live2D/Src/glew/include/GL
3rdparty/Live2D/Src/glfw/include
3rdparty/Live2D/Src/glfw/include/GLFW
)
endif()
# 资源复制(所有平台)
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/other/Resources"
DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/other/FrameworkShaders"
DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
# Windows 特有的 DLL 复制
if(PLAT STREQUAL "windows")
# 自动复制Ela的DLL
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
$<TARGET_FILE:ElaWidgetTools>
$<TARGET_FILE_DIR:${PROJECT_NAME}>
)
# 部署 MinGW 运行时库
if (MINGW)
get_filename_component(MINGW_BIN_DIR ${CMAKE_CXX_COMPILER} DIRECTORY)
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"${MINGW_BIN_DIR}/libgcc_s_seh-1.dll"
"$<TARGET_FILE_DIR:${PROJECT_NAME}>"
COMMAND ${CMAKE_COMMAND} -E copy
"${MINGW_BIN_DIR}/libstdc++-6.dll"
"$<TARGET_FILE_DIR:${PROJECT_NAME}>"
COMMAND ${CMAKE_COMMAND} -E copy
"${MINGW_BIN_DIR}/libwinpthread-1.dll"
"$<TARGET_FILE_DIR:${PROJECT_NAME}>"
)
endif()
# 获取windeployqt路径
get_target_property(QT_QMAKE_EXECUTABLE Qt6::qmake IMPORTED_LOCATION)
get_filename_component(QT_BIN_DIR "${QT_QMAKE_EXECUTABLE}" DIRECTORY)
set(WINDEPLOYQT_EXE "${QT_BIN_DIR}/windeployqt.exe")
# 检查windeployqt是否存在
if(EXISTS "${WINDEPLOYQT_EXE}")
message(STATUS "Found windeployqt: ${WINDEPLOYQT_EXE}")
# 构建windeployqt命令
set(WINDEPLOYQT_CMD "${WINDEPLOYQT_EXE}")
# 添加构建类型参数
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(WINDEPLOYQT_CMD "${WINDEPLOYQT_CMD} --debug")
else()
set(WINDEPLOYQT_CMD "${WINDEPLOYQT_CMD} --release")
endif()
# 添加其他参数
set(WINDEPLOYQT_CMD "${WINDEPLOYQT_CMD} --no-compiler-runtime")
set(WINDEPLOYQT_CMD "${WINDEPLOYQT_CMD} --no-angle")
set(WINDEPLOYQT_CMD "${WINDEPLOYQT_CMD} --no-opengl-sw")
# 添加目标目录
set(WINDEPLOYQT_CMD "${WINDEPLOYQT_CMD} \"$<TARGET_FILE_DIR:${PROJECT_NAME}>\"")
# 添加自定义命令运行windeployqt
# 只传递目录
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND "${WINDEPLOYQT_EXE}" "$<TARGET_FILE_DIR:${PROJECT_NAME}>"
COMMENT "Running windeployqt to deploy Qt dependencies..."
)
else()
message(WARNING "windeployqt not found at: ${WINDEPLOYQT_EXE}")
message(WARNING "Qt dependencies will not be automatically deployed.")
endif()
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/Live2D/Lib/Debug/windows/glfw/glew32d.dll"
DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/Live2D/Lib/Debug/windows/live2d/static_lib/x86_64/Live2DCubismCore.dll"
DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
elseif (CMAKE_BUILD_TYPE STREQUAL "Release")
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/Live2D/Lib/Release/windows/glfw/glew32.dll"
DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/Live2D/Lib/Debug/windows/live2d/static_lib/x86_64/Live2DCubismCore.dll"
DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
endif ()
endif()