Files
fanlusky a7779d2b05 refactor(engine): 将 engine 从 submodule 内嵌为仓内一等组件
`vendor/MetasequoiaImeEngine` submodule 改为 `engine/` 目录,导入的是
product-lock.json 原本钉住的提交 c810d201,逐文件核对过 blob,因此这是一次
搬迁而不是引擎升级。引擎自己的嵌套 submodule(googlepinyinime-rev、utfcpp、
miniaudio)按各自 gitlink 一并展开,来源与提交见 engine/UPSTREAM.md。

Windows 专门化裁掉了不属于本产品的部分:whisper.cpp 与本地推理 provider、
macOS 示例宿主、整个 dictionary/ 建库流水线、上游 CI 与 release-please 配置。
词库仍按 product-lock.json 在构建时取发布产物。

引擎不再进 product-lock.json:没有 gitlink 就没有可比对的东西,锁里写一个上游
commit 等于宣称这棵树仍等于上游,而第一个 Windows 专门化改动落地时这句话就假了。
verify-contracts / verify-checkout 随之移除,verify-published 保留。

CI 与工具链:引擎源码并入根 scripts/format.sh(删掉引擎自己的那份,避免两套排除
列表分叉);引擎 voice.yml 里的 silero_vad.onnx 摘要校验移到本仓 lock job;
engine-bump-triage 工作流与其测试删除;gitsubmodule 的 dependabot 频率由 daily
改为 monthly。

README、README.en、AGENTS.md、CONTRIBUTING、docs/product-release.md 及各子目录
文档同步说明新的位置与边界。
2026-09-12 03:40:48 +08:00

59 lines
2.9 KiB
CMake

cmake_minimum_required(VERSION 3.25)
project(MetasequoiaImeVoice LANGUAGES C CXX)
if(APPLE)
enable_language(OBJC OBJCXX)
endif()
if(PROJECT_IS_TOP_LEVEL)
include(CTest)
endif()
option(MSIME_VOICE_CAPTURE "Build the cross-platform miniaudio capture adapter" ON)
option(MSIME_VOICE_WINDOWS_APP "Build the imported standalone Windows host" OFF)
find_package(CURL REQUIRED)
find_package(nlohmann_json CONFIG REQUIRED)
find_package(Threads REQUIRED)
add_library(MetasequoiaImeVoice STATIC src/vad.cpp src/cloud_stt_worker.cpp src/text_polisher.cpp src/http_client.cpp src/provider_protocol.cpp)
add_library(MetasequoiaIme::Voice ALIAS MetasequoiaImeVoice)
target_compile_features(MetasequoiaImeVoice PUBLIC cxx_std_17)
target_include_directories(MetasequoiaImeVoice PUBLIC include include/msime/voice)
target_link_libraries(MetasequoiaImeVoice PRIVATE CURL::libcurl nlohmann_json::nlohmann_json PUBLIC Threads::Threads)
if(MSVC)
target_compile_options(MetasequoiaImeVoice PRIVATE /W4 /utf-8)
else()
target_compile_options(MetasequoiaImeVoice PRIVATE -Wall -Wextra -Wpedantic)
endif()
if(MSIME_VOICE_CAPTURE)
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/third_party/miniaudio/miniaudio.h")
message(FATAL_ERROR "engine/voice/third_party/miniaudio is vendored in-tree; a missing miniaudio.h means an incomplete checkout")
endif()
add_library(MetasequoiaImeVoiceCapture STATIC src/audio_capture.cpp)
add_library(MetasequoiaIme::VoiceCapture ALIAS MetasequoiaImeVoiceCapture)
target_compile_features(MetasequoiaImeVoiceCapture PUBLIC cxx_std_17)
target_include_directories(MetasequoiaImeVoiceCapture PUBLIC include include/msime/voice PRIVATE third_party/miniaudio)
target_link_libraries(MetasequoiaImeVoiceCapture PUBLIC Threads::Threads PRIVATE ${CMAKE_DL_LIBS})
if(APPLE)
target_link_libraries(MetasequoiaImeVoiceCapture PRIVATE "-framework CoreFoundation" "-framework CoreAudio" "-framework AudioToolbox")
elseif(WIN32)
target_link_libraries(MetasequoiaImeVoiceCapture PRIVATE ole32)
else()
target_link_libraries(MetasequoiaImeVoiceCapture PRIVATE m)
endif()
endif()
if(BUILD_TESTING)
find_package(Python3 REQUIRED COMPONENTS Interpreter)
add_executable(test_voice tests/test_voice.cpp)
target_link_libraries(test_voice PRIVATE MetasequoiaIme::Voice)
if(MSVC)
target_compile_options(test_voice PRIVATE /utf-8)
endif()
add_test(NAME voice_audio_contract COMMAND test_voice)
add_test(NAME voice_http_contract COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tests/test_http.py $<TARGET_FILE:test_voice>)
if(MSIME_VOICE_CAPTURE)
add_executable(test_voice_capture tests/test_capture.cpp)
target_link_libraries(test_voice_capture PRIVATE MetasequoiaIme::VoiceCapture)
add_test(NAME voice_capture_lifetime COMMAND test_voice_capture)
endif()
endif()
if(MSIME_VOICE_WINDOWS_APP)
add_subdirectory(platforms/windows)
endif()