Skip to content

Commit 0219b4d

Browse files
Copilotbab2min
andcommitted
Implement foundation for iOS binding following roadmap
Co-authored-by: bab2min <19266222+bab2min@users.noreply.github.com>
1 parent 25f145b commit 0219b4d

9 files changed

Lines changed: 1050 additions & 4 deletions

File tree

CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ option(KIWI_BUILD_EVALUATOR "Build Evaluator" ON)
1414
option(KIWI_BUILD_MODEL_BUILDER "Build Model Builder" ON)
1515
option(KIWI_BUILD_TEST "Build Test sets" ON)
1616
option(KIWI_JAVA_BINDING "Build Java binding" OFF)
17+
option(KIWI_IOS_BINDING "Build iOS binding" OFF)
1718
set(KIWI_CPU_ARCH "" CACHE STRING "Set architecture type for macOS")
1819

1920
if (NOT CMAKE_BUILD_TYPE)
@@ -367,6 +368,10 @@ if(KIWI_JAVA_BINDING)
367368
add_subdirectory( bindings/java )
368369
endif()
369370

371+
if(KIWI_IOS_BINDING)
372+
add_subdirectory( bindings/ios )
373+
endif()
374+
370375
if(EMSCRIPTEN)
371376
add_subdirectory( bindings/wasm )
372377
endif()

bindings/ios/CMakeLists.txt

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# iOS binding CMakeLists.txt for Kiwi
2+
# This is a work-in-progress implementation following the iOS roadmap
3+
4+
# iOS binding requires Xcode and iOS SDK
5+
if(NOT IOS)
6+
message(STATUS "iOS binding requires iOS SDK. Use -DCMAKE_TOOLCHAIN_FILE=ios.toolchain.cmake")
7+
return()
8+
endif()
9+
10+
# Check for required iOS development tools
11+
if(NOT DEFINED CMAKE_TOOLCHAIN_FILE OR NOT CMAKE_TOOLCHAIN_FILE MATCHES "ios")
12+
message(WARNING "iOS binding requires iOS toolchain. Consider using ios-cmake toolchain.")
13+
endif()
14+
15+
set(pkg_name "KiwiSwift")
16+
17+
# Collect required object files
18+
set(OBJECTS $<TARGET_OBJECTS:${PROJECT_NAME}_static> $<TARGET_OBJECTS:streamvbyte>)
19+
20+
if(KIWI_USE_CPUINFO)
21+
list(APPEND OBJECTS $<TARGET_OBJECTS:cpuinfo>)
22+
endif()
23+
24+
# Create static library for iOS (required for App Store distribution)
25+
add_library(${pkg_name} STATIC
26+
csrc/kiwi_swift.cpp
27+
${OBJECTS}
28+
)
29+
30+
# Set iOS-specific compile features and options
31+
target_compile_features(${pkg_name} PUBLIC cxx_std_17)
32+
33+
# iOS-specific compile definitions
34+
target_compile_definitions(${pkg_name} PRIVATE
35+
IOS=1
36+
KIWI_IOS_BINDING=1
37+
)
38+
39+
# Optimize for mobile performance
40+
target_compile_options(${pkg_name} PRIVATE
41+
-O3
42+
-fvisibility=hidden
43+
-fvisibility-inlines-hidden
44+
)
45+
46+
# Set up framework structure for iOS
47+
set_target_properties(${pkg_name} PROPERTIES
48+
FRAMEWORK TRUE
49+
FRAMEWORK_VERSION A
50+
MACOSX_FRAMEWORK_IDENTIFIER com.bab2min.kiwi
51+
PUBLIC_HEADER ""
52+
OUTPUT_NAME "Kiwi"
53+
)
54+
55+
# Installation rules for iOS framework
56+
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
57+
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Install prefix" FORCE)
58+
endif()
59+
60+
install(TARGETS ${pkg_name}
61+
FRAMEWORK DESTINATION .
62+
LIBRARY DESTINATION lib
63+
ARCHIVE DESTINATION lib
64+
)
65+
66+
# Copy Swift interface and headers
67+
install(FILES
68+
"include/Kiwi.h"
69+
DESTINATION include
70+
)
71+
72+
message(STATUS "iOS binding configured for ${CMAKE_OSX_ARCHITECTURES}")
73+
message(STATUS "iOS Deployment Target: ${CMAKE_OSX_DEPLOYMENT_TARGET}")

bindings/ios/KiwiSwift.podspec

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
Pod::Spec.new do |spec|
2+
spec.name = "KiwiSwift"
3+
spec.version = "0.21.0"
4+
spec.summary = "Korean Intelligent Word Identifier for iOS"
5+
spec.description = <<-DESC
6+
KiwiSwift is the iOS binding for Kiwi, a Korean morphological analyzer.
7+
This framework provides native Swift API for Korean text processing,
8+
including tokenization, morphological analysis, and sentence splitting.
9+
DESC
10+
11+
spec.homepage = "https://github.com/bab2min/Kiwi"
12+
spec.license = { :type => "LGPL-3.0", :file => "../../LICENSE" }
13+
spec.author = { "bab2min" => "bab2min@gmail.com" }
14+
15+
spec.ios.deployment_target = "12.0"
16+
spec.osx.deployment_target = "10.15"
17+
18+
spec.source = { :git => "https://github.com/bab2min/Kiwi.git", :tag => "v#{spec.version}" }
19+
20+
spec.source_files = [
21+
"swift/*.swift",
22+
"csrc/*.cpp",
23+
"include/*.h",
24+
"../../src/**/*.{cpp,h}",
25+
"../../include/kiwi/*.h",
26+
"../../third_party/streamvbyte/include/*.h",
27+
"../../third_party/streamvbyte/src/*.c"
28+
]
29+
30+
spec.public_header_files = "include/*.h"
31+
spec.private_header_files = "../../include/kiwi/*.h"
32+
33+
spec.header_search_paths = [
34+
"../../include",
35+
"../../third_party/streamvbyte/include",
36+
"../../third_party/eigen",
37+
"../../third_party/cpp-btree",
38+
"../../third_party/json/include"
39+
]
40+
41+
spec.compiler_flags = [
42+
"-DIOS=1",
43+
"-DKIWI_IOS_BINDING=1",
44+
"-std=c++17",
45+
"-O3",
46+
"-fvisibility=hidden"
47+
]
48+
49+
spec.xcconfig = {
50+
"CLANG_CXX_LANGUAGE_STANDARD" => "c++17",
51+
"CLANG_CXX_LIBRARY" => "libc++",
52+
"OTHER_CPLUSPLUSFLAGS" => "-DIOS=1 -DKIWI_IOS_BINDING=1"
53+
}
54+
55+
spec.frameworks = "Foundation"
56+
spec.libraries = "c++"
57+
58+
spec.requires_arc = true
59+
60+
# Exclude files that are not needed for iOS
61+
spec.exclude_files = [
62+
"../../src/**/test*",
63+
"../../tools/**/*",
64+
"../../test/**/*"
65+
]
66+
67+
spec.prepare_command = <<-CMD
68+
# This would typically download or prepare model files
69+
echo "Preparing KiwiSwift for iOS..."
70+
CMD
71+
72+
end

bindings/ios/Package.swift

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// swift-tools-version:5.5
2+
// Package.swift for KiwiSwift iOS binding
3+
4+
import PackageDescription
5+
6+
let package = Package(
7+
name: "KiwiSwift",
8+
platforms: [
9+
.iOS(.v12),
10+
.macOS(.v10_15)
11+
],
12+
products: [
13+
.library(
14+
name: "KiwiSwift",
15+
targets: ["KiwiSwift"]
16+
),
17+
],
18+
dependencies: [
19+
// No external dependencies - self-contained
20+
],
21+
targets: [
22+
.target(
23+
name: "KiwiSwift",
24+
dependencies: [],
25+
path: "swift",
26+
sources: ["Kiwi.swift"],
27+
publicHeadersPath: "../include",
28+
cxxSettings: [
29+
.define("IOS", to: "1"),
30+
.define("KIWI_IOS_BINDING", to: "1"),
31+
.headerSearchPath("../../../include"),
32+
.headerSearchPath("../include"),
33+
.unsafeFlags(["-std=c++17", "-O3"])
34+
],
35+
linkerSettings: [
36+
.linkedLibrary("c++")
37+
]
38+
),
39+
.testTarget(
40+
name: "KiwiSwiftTests",
41+
dependencies: ["KiwiSwift"],
42+
path: "tests"
43+
),
44+
],
45+
cxxLanguageStandard: .cxx17
46+
)

bindings/ios/README.md

Lines changed: 102 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,108 @@
1-
# KiwiSwift, 한국어 형태소 분석기 Kiwi의 iOS 바인딩 (개발 예정)
1+
# KiwiSwift, 한국어 형태소 분석기 Kiwi의 iOS 바인딩
22

3-
> **⚠️ 주의**: iOS 바인딩은 현재 개발 계획 단계에 있으며, 실제 구현은 아직 완료되지 않았습니다.
3+
> **🚧 현재 상태**: iOS 바인딩의 기본 구조가 구현되었으며, 프로토타입 단계입니다.
4+
> 실제 사용을 위해서는 추가 개발과 테스트가 필요합니다.
45
5-
## 개발 계획
6+
## 현재 구현 상태
67

7-
iOS용 Kiwi 바인딩은 다음과 같은 방향으로 개발될 예정입니다:
8+
**완료된 작업**:
9+
- 기본 CMake 빌드 설정
10+
- C++ 브릿지 구현 (`csrc/kiwi_swift.cpp`)
11+
- Objective-C 헤더 (`include/Kiwi.h`)
12+
- Swift API 래퍼 (`swift/Kiwi.swift`)
13+
- Swift Package Manager 설정 (`Package.swift`)
14+
- CocoaPods 스펙 (`KiwiSwift.podspec`)
15+
- 기본 단위 테스트 구조
16+
17+
🚧 **추가 개발 필요**:
18+
- iOS SDK와의 완전한 통합 테스트
19+
- 모델 파일 배포 방식 최적화
20+
- 메모리 사용량 최적화
21+
- 에러 핸들링 개선
22+
- 문서화 완성
23+
24+
## 현재 API 구조
25+
26+
기본적인 Swift API가 구현되어 있습니다:
27+
28+
```swift
29+
import KiwiSwift
30+
31+
// Kiwi 인스턴스 생성
32+
let kiwi = try Kiwi(modelPath: "path/to/model")
33+
34+
// 형태소 분석
35+
let tokens = try kiwi.tokenize("안녕하세요!", options: .normalizeAll)
36+
for token in tokens {
37+
print("\(token.form) / \(token.tag)")
38+
}
39+
40+
// 문장 분리
41+
let sentences = try kiwi.splitSentences("첫 번째 문장입니다. 두 번째 문장입니다.")
42+
43+
// 비동기 처리
44+
kiwi.tokenize("비동기 처리 예제", options: .normalizeAll) { result in
45+
switch result {
46+
case .success(let tokens):
47+
print("Tokens: \(tokens)")
48+
case .failure(let error):
49+
print("Error: \(error)")
50+
}
51+
}
52+
```
53+
54+
## 빌드 방법
55+
56+
### 요구사항
57+
- Xcode 12.0+
58+
- iOS 12.0+ SDK
59+
- CMake 3.12+
60+
- ios-cmake 툴체인 (권장)
61+
62+
### 빌드 단계
63+
64+
1. **iOS 툴체인 설정**:
65+
```bash
66+
git clone https://github.com/leetal/ios-cmake.git
67+
```
68+
69+
2. **iOS용 빌드**:
70+
```bash
71+
cd bindings/ios
72+
mkdir build && cd build
73+
74+
# iOS 기기용
75+
cmake .. \
76+
-DCMAKE_TOOLCHAIN_FILE=path/to/ios-cmake/ios.toolchain.cmake \
77+
-DPLATFORM=OS64 \
78+
-DKIWI_IOS_BINDING=ON \
79+
-DKIWI_BUILD_TEST=OFF \
80+
-DKIWI_BUILD_CLI=OFF
81+
82+
make
83+
84+
# iOS 시뮬레이터용
85+
cmake .. \
86+
-DCMAKE_TOOLCHAIN_FILE=path/to/ios-cmake/ios.toolchain.cmake \
87+
-DPLATFORM=SIMULATOR64 \
88+
-DKIWI_IOS_BINDING=ON
89+
90+
make
91+
```
92+
93+
### Swift Package Manager 사용
94+
95+
1. Xcode에서 프로젝트 열기
96+
2. File → Add Package Dependencies...
97+
3. Repository URL: `https://github.com/bab2min/Kiwi.git`
98+
4. Package 폴더: `bindings/ios`
99+
100+
### CocoaPods 사용
101+
102+
`Podfile`에 추가:
103+
```ruby
104+
pod 'KiwiSwift', :git => 'https://github.com/bab2min/Kiwi.git', :subfolder => 'bindings/ios'
105+
```
8106

9107
### 목표
10108
- **Swift/Objective-C 지원**: 네이티브 iOS 개발 언어 완전 지원

0 commit comments

Comments
 (0)