diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt index 781a73a..dc5a2b1 100644 --- a/windows/CMakeLists.txt +++ b/windows/CMakeLists.txt @@ -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}" "$" + COMMAND ${CMAKE_COMMAND} -E make_directory "$/data" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${FLUTTER_ICU_DATA_FILE}" "$/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} "$" + VERBATIM) +endif() + +# 3. Copy AOT Kernel (app.so) for Release/Profile modes +add_custom_command(TARGET ${BINARY_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E $<$>:copy_if_different> "${AOT_LIBRARY}" "$/data" + VERBATIM) + +# 4. Copy Flutter Assets +add_custom_command(TARGET ${BINARY_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory "$/data/flutter_assets" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${PROJECT_BUILD_DIR}/flutter_assets" "$/data/flutter_assets" + VERBATIM) diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt deleted file mode 100644 index 7fe6e83..0000000 --- a/windows/runner/CMakeLists.txt +++ /dev/null @@ -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=$" - -D "FLUTTER_LIBRARY=${FLUTTER_LIBRARY}" - -D "FLUTTER_ICU_DATA_FILE=${FLUTTER_ICU_DATA_FILE}" - -D "PROJECT_BUILD_DIR=${PROJECT_BUILD_DIR}" - -D "BUILD_TYPE=$" - -P "${CMAKE_CURRENT_SOURCE_DIR}/copy_dependencies.cmake" - VERBATIM -) diff --git a/windows/runner/copy_dependencies.cmake b/windows/runner/copy_dependencies.cmake deleted file mode 100644 index 321db15..0000000 --- a/windows/runner/copy_dependencies.cmake +++ /dev/null @@ -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() diff --git a/windows/runner/copy_libffmpegkit.cmake b/windows/runner/copy_libffmpegkit.cmake deleted file mode 100644 index 1417970..0000000 --- a/windows/runner/copy_libffmpegkit.cmake +++ /dev/null @@ -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()