feat: Add CMake build configuration for the Windows platform.

This commit is contained in:
lml committed 2026-03-15 21:23:37 +08:00
1 parent bf1a6690af
commit be1f2a0deb
4 files changed
+72 -109

No files matched your search

+72 -1
View File
@@ -34,10 +34,50 @@ endfunction()
set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
add_subdirectory(${FLUTTER_MANAGED_DIR})
add_subdirectory("runner")
# The application target is defined here directly to ensure it's available
# for plugin linking and bundling logic in a single scope.
add_executable(${BINARY_NAME} WIN32
"runner/flutter_window.cpp"
"runner/main.cpp"
"runner/utils.cpp"
"runner/win32_window.cpp"
"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
"runner/Runner.rc"
"runner/runner.exe.manifest"
)
apply_standard_settings(${BINARY_NAME})
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"")
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}")
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}")
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}")
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}")
target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX")
target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)
target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib")
target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/runner")
add_dependencies(${BINARY_NAME} flutter_assemble)
# Generated plugin build rules, which manage building the plugins and adding
# them to the application.
include(flutter/generated_plugins.cmake)
# === Fix Plugin-Specific Variable Naming Nuisances ===
# Some plugins (like whisper_ggml_plus) use non-standard variable names for bundling.
# We explicitly bridge them here so Flutter's standard logic picks them up.
if(DEFINED ggml_library_flutter_bundled_libraries)
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${ggml_library_flutter_bundled_libraries})
endif()
# === Explicit Dependencies for FFI Plugins ===
if(TARGET whisper_ggml_plus)
add_dependencies(${BINARY_NAME} whisper_ggml_plus)
endif()
# === Installation ===
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "..." FORCE)
set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
@@ -59,3 +99,34 @@ install(CODE "file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_D
install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" CONFIGURATIONS Profile;Release COMPONENT Runtime)
# === Consolidated Bundling Logic (POST_BUILD) ===
# We do this at the end of the top-level file to ensure:
# 1. The ${BINARY_NAME} target (defined in runner/) exists.
# 2. PLUGIN_BUNDLED_LIBRARIES is fully populated by include(generated_plugins.cmake).
# 1. Copy Core Flutter and ICU data
add_custom_command(TARGET ${BINARY_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${FLUTTER_LIBRARY}" "$<TARGET_FILE_DIR:${BINARY_NAME}>"
COMMAND ${CMAKE_COMMAND} -E make_directory "$<TARGET_FILE_DIR:${BINARY_NAME}>/data"
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${FLUTTER_ICU_DATA_FILE}" "$<TARGET_FILE_DIR:${BINARY_NAME}>/data"
VERBATIM)
# 2. Copy Plugin Bundled Libraries (DLLs)
# Note: Use a generator expression to handle the list of libraries correctly.
if(PLUGIN_BUNDLED_LIBRARIES)
add_custom_command(TARGET ${BINARY_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PLUGIN_BUNDLED_LIBRARIES} "$<TARGET_FILE_DIR:${BINARY_NAME}>"
VERBATIM)
endif()
# 3. Copy AOT Kernel (app.so) for Release/Profile modes
add_custom_command(TARGET ${BINARY_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E $<$<NOT:$<CONFIG:Debug>>:copy_if_different> "${AOT_LIBRARY}" "$<TARGET_FILE_DIR:${BINARY_NAME}>/data"
VERBATIM)
# 4. Copy Flutter Assets
add_custom_command(TARGET ${BINARY_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "$<TARGET_FILE_DIR:${BINARY_NAME}>/data/flutter_assets"
COMMAND ${CMAKE_COMMAND} -E copy_directory "${PROJECT_BUILD_DIR}/flutter_assets" "$<TARGET_FILE_DIR:${BINARY_NAME}>/data/flutter_assets"
VERBATIM)
-42
View File
@@ -1,42 +0,0 @@
cmake_minimum_required(VERSION 3.14)
project(runner LANGUAGES CXX)
add_executable(${BINARY_NAME} WIN32
"flutter_window.cpp"
"main.cpp"
"utils.cpp"
"win32_window.cpp"
"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
"Runner.rc"
"runner.exe.manifest"
)
apply_standard_settings(${BINARY_NAME})
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"")
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}")
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}")
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}")
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}")
target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX")
target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)
target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib")
target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}")
add_dependencies(${BINARY_NAME} flutter_assemble)
# Unified build-time dependency copy script
add_custom_command(TARGET ${BINARY_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND}
-D "BINARY_DIR=${CMAKE_BINARY_DIR}"
-D "SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
-D "OUTPUT_DIR=$<TARGET_FILE_DIR:${BINARY_NAME}>"
-D "FLUTTER_LIBRARY=${FLUTTER_LIBRARY}"
-D "FLUTTER_ICU_DATA_FILE=${FLUTTER_ICU_DATA_FILE}"
-D "PROJECT_BUILD_DIR=${PROJECT_BUILD_DIR}"
-D "BUILD_TYPE=$<CONFIG>"
-P "${CMAKE_CURRENT_SOURCE_DIR}/copy_dependencies.cmake"
VERBATIM
)
-50
View File
@@ -1,50 +0,0 @@
# Robust build-time dependency copy script
message(STATUS "DEBUG: Running copy_dependencies.cmake")
message(STATUS "DEBUG: BINARY_DIR: ${BINARY_DIR}")
message(STATUS "DEBUG: OUTPUT_DIR: ${OUTPUT_DIR}")
# 1. Copy Core Flutter DLLs
if(EXISTS "${FLUTTER_LIBRARY}")
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${FLUTTER_LIBRARY}" "${OUTPUT_DIR}")
endif()
if(EXISTS "${FLUTTER_ICU_DATA_FILE}")
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory "${OUTPUT_DIR}/data")
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${FLUTTER_ICU_DATA_FILE}" "${OUTPUT_DIR}/data")
endif()
# 1.1 Copy AOT Data (app.so) for Release/Profile
if(NOT BUILD_TYPE STREQUAL "Debug")
file(GLOB_RECURSE app_so "${BINARY_DIR}/*/app.so")
if(app_so)
list(GET app_so 0 first_app_so)
message(STATUS "DEBUG: Found app.so at ${first_app_so}")
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory "${OUTPUT_DIR}/data")
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${first_app_so}" "${OUTPUT_DIR}/data")
endif()
endif()
# 2. Copy Assets
if(EXISTS "${PROJECT_BUILD_DIR}/flutter_assets")
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory "${OUTPUT_DIR}/data/flutter_assets")
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory "${PROJECT_BUILD_DIR}/flutter_assets" "${OUTPUT_DIR}/data/flutter_assets")
endif()
# 3. Copy Plugin DLLs (Search and find)
set(DLL_NAMES
"whisper_ggml_plus.dll"
"ffmpeg_kit_extended_flutter_plugin.dll"
"libffmpegkit.dll"
)
foreach(dll ${DLL_NAMES})
file(GLOB_RECURSE found_dll "${BINARY_DIR}/*/${dll}")
if(found_dll)
list(GET found_dll 0 first_found) # Take the first one found
message(STATUS "DEBUG: Found ${dll} at ${first_found}")
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${first_found}" "${OUTPUT_DIR}")
else()
message(STATUS "DEBUG: Could not find ${dll} in ${BINARY_DIR}")
endif()
endforeach()
-16
View File
@@ -1,16 +0,0 @@
set(SEARCH_PATHS
"${CMAKE_BINARY_DIR}/plugins/ffmpeg_kit_extended_flutter/libffmpegkit.dll"
"${CMAKE_BINARY_DIR}/install/libffmpegkit.dll"
"${CMAKE_BINARY_DIR}/runner/Debug/libffmpegkit.dll"
)
foreach(path ${SEARCH_PATHS})
if(EXISTS "${path}")
message(STATUS "DEBUG: Found libffmpegkit.dll at ${path}")
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${path}"
"${CMAKE_BINARY_DIR}/runner/${BUILD_TYPE}"
)
return()
endif()
endforeach()