Skip to content

build(deps): upgrade OpenCC to ver.1.4.0#1188

Open
frankslin wants to merge 1 commit into
rime:masterfrom
frankslin:feat/upgrade-opencc
Open

build(deps): upgrade OpenCC to ver.1.4.0#1188
frankslin wants to merge 1 commit into
rime:masterfrom
frankslin:feat/upgrade-opencc

Conversation

@frankslin

Copy link
Copy Markdown

librime 升級 OpenCC 至 ver.1.4.0

背景

librime 的 deps/opencc 子模組原先指向 OpenCC ver.1.1.9(commit 556ed22),本次升級目標為 ver.1.4.0(commit 664674f)。

OpenCC 相關改動見 https://github.com/byvoid/OpenCC/blob/master/NEWS.md


API 相容性分析

在執行升級前,針對 src/rime/gear/simplifier.cc 中使用的所有 OpenCC 公開 API 進行逐一比對:

librime 使用的 API ver.1.4.0 狀態
opencc::Optional<T> / .IsNull() / .Get() 保持不變
Dict::Match()Dict::MatchPrefix() 簽名相同
DictEntry::KeyLength()GetDefault()Values()NumValues() 保持不變
Converter::Convert(text) 參數由 const std::string& 改為 std::string_viewstd::string 可隱式轉換,完全相容
ConversionChain::GetConversions() 保持不變
Conversion::GetDict() 保持不變
UTF8Util::NextCharLength()FromSubstr() 保持不變
opencc/opencc.hcmake/FindOpencc.cmake 用於探測安裝路徑) 仍然存在

結論:simplifier.cc 無需任何修改即可與 OpenCC 1.4.0 相容。


構建系統相容性分析

C++ 標準

OpenCC 1.4.0 將最低 C++ 標準從 C++14 提升至 C++17。librime 主 CMakeLists.txt 已設置:

set(CMAKE_CXX_STANDARD 17)

無需修改。✓

deps.mk 構建腳本

opencc:
    cd $(src_dir)/opencc; \
    cmake . -B$(build) \
    -DBUILD_SHARED_LIBS:BOOL=OFF \
    -DCMAKE_BUILD_TYPE:STRING="Release" \
    -DCMAKE_INSTALL_PREFIX:PATH="$(prefix)" \
    && cmake --build $(build) --target install
  • cmake .deps/opencc 目錄下執行,OpenCC 為頂層專案,OPENCC_ENABLE_INSTALL 自動預設為 ONinstall 目標正常運作。
  • ENABLE_DARTS 選項在 1.4.0 中已移除,但 deps.mk 本來就未設置此選項,無影響。
  • OpenCC 自帶捆綁的 Marisa(1.4.0 中為 deps/marisa-0.3.1),與 librime 的 deps/marisa-trie 各自獨立,互不干擾。

結論:deps.mk 無需任何修改。

cmake/FindOpencc.cmake

find_path(Opencc_INCLUDE_PATH opencc/opencc.h)
find_library(Opencc_LIBRARY NAMES opencc)

opencc/opencc.h 在 1.4.0 中仍然存在,函式庫名稱亦未改變。無需修改。✓


ver.1.4.0 主要變更說明

與 librime 直接相關

  • 修復 GetConversionChain() 返回 nullptr 的 bug(commit ffddbe1c):在設置了 normalization 的 config 中,GetConversionChain() 會返回 nullptr,librime 對其解引用因而 crash。1.4.0 已修復,對穩定性有益。
  • ABI 版本升至 1.4:若系統已安裝 OpenCC 1.3.x,必須同步升級系統套件,否則 ABI 不相容。

內部改動(API 層無感知)

  • 文字詞典後端:執行期由 Marisa 換成 Darts,查詢速度提升。
  • Converter 改為抽象類別:新增純虛擬方法,但 librime 從不直接實例化 Converter,而是透過 Config::NewFromFile() 取得具體實作,無影響。
  • DictEntry 新增 string_view 介面KeyView()GetDefaultView() 等,減少字串複製,librime 未使用。

新增功能(librime 暫未使用)

  • ConverterStream:串流轉換,適合分塊處理大段文字。
  • ResourceProvider:自訂資源載入介面,可攔截詞典檔案的讀取來源。
  • ConfigLoadOptions:可控制是否載入 tofu risk 詞典。
  • PrefixMatchView:前綴比對快速路徑,返回 string_view 避免記憶體配置。

執行結果

子模組指針變更

-Subproject commit 556ed22496d650bd0b13b6c163be9814637970ae  # ver.1.1.9
+Subproject commit 664674f3565f75180c11c8ed2c8ee621952c310f  # ver.1.4.0

原始碼、CMake 設定、構建腳本均無任何修改

構建與測試

  bash install-boost.sh
  export BOOST_ROOT="$(pwd)/deps/boost-1.89.0"  # 脚本会告诉你具体版本
  make deps
  make
  make test

rime_test 執行成功。

See PR message for full analysis why this is safe.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant