Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -253,13 +253,15 @@ jobs:
- name: Create release artifacts
run: |
mkdir -p release
cp -r build/output release/
cp -r build/bin release/
cp -r build/output release/ || true
cp -r include release/
# 查找所有.a/.so/.dylib文件并拷贝到release/lib
mkdir -p release/lib
find build -type f \( -name "*.a" -o -name "*.so" -o -name "*.dylib" \) -exec cp {} release/lib/ \;
tar -czf onesdk-release.tar.gz release/

- name: Upload release artifacts
uses: actions/upload-artifact@v4
with:
name: onesdk-release
path: onesdk-release.tar.gz
path: onesdk-release.tar.gz
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,8 @@ examples/onesdk_esp32/onesdk/
dependencies.lock
.DS_Store
./external_libs/cJson/
./external_libs/libwebsockets/
./external_libs/libwebsockets/
# prebuilt libs
libs/*.a
libs/*.so
libs/*.dylib
81 changes: 64 additions & 17 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,27 @@ option(ONESDK_WITH_TEST "Build onesdk unit tests" OFF)
option(ONESDK_WITH_SHARED "Build shared lib for onesdk" ON)
option(ONESDK_WITH_STATIC "Build static lib for onesdk" ON)
option(ONESDK_WITH_STRICT_MODE "Build onesdk with ADDRESS SANTITIZE mode" OFF)
# 添加预编译库支持开关
option(ONESDK_USE_PREBUILT_LIBS "Use prebuilt libraries from onesdk/libs" OFF)


# 定义预编译库名称
set(LIBWEBSOCKETS_LIB websockets)
set(ONESDK_DEP_LIBS "")


if(ONESDK_USE_PREBUILT_LIBS)
message(STATUS "ONESDK_USE_PREBUILT_LIBS is to ${ONESDK_USE_PREBUILT_LIBS}, override with ONESDK_WITH_STATIC=ON, ONESDK_WITH_SHARED=OFF")
set(OPENSSL_LIBS ssl crypto)
list(APPEND ONESDK_DEP_LIBS ${OPENSSL_LIBS})
set(ONESDK_WITH_SHARED OFF)
set(ONESDK_WITH_STATIC ON)
endif()

if(ONESDK_WITH_STATIC)
list(APPEND ONESDK_DEP_LIBS ${LIBWEBSOCKETS_LIB})
list(APPEND ONESDK_DEP_LIBS cjson)
endif()
# Generate the onesdk_config.h that includes all the public compilation settings.
configure_file(
"${PROJECT_SOURCE_DIR}/cmake/onesdk_config.h.in"
Expand Down Expand Up @@ -107,18 +127,7 @@ message(STATUS "PROJECT SRC DIR: ${PROJECT_SOURCE_DIR}")
message(STATUS "PROJECT BIN DIR: ${PROJECT_BINARY_DIR}")
message(STATUS "BUILD PLATFORM: ${BUILD_PLATFORM}")

# Add include and external_libs/include to header file search path
include_directories(
${PROJECT_SOURCE_DIR}/include
${PROJECT_SOURCE_DIR}/include/iot
${PROJECT_SOURCE_DIR}/src
${PROJECT_SOURCE_DIR}/platform
${PROJECT_SOURCE_DIR}/external_libs/libwebsockets/include
${PROJECT_SOURCE_DIR}/external_libs/cJson
${PROJECT_BINARY_DIR}/external_libs/libwebsockets
${PROJECT_BINARY_DIR}/include
)

message(STATUS "ONESDK_USE_PREBUILT_LIBS: ${ONESDK_USE_PREBUILT_LIBS}")
# Platform specific include directories
if(BUILD_PLATFORM STREQUAL "windows")
# Add Windows SDK paths if available
Expand All @@ -145,7 +154,25 @@ endif()
if (ONESDK_WITH_EXAMPLE)
set(BUILD_TYPE "debug")
endif()
add_subdirectory(external_libs)
# 修改外部库依赖逻辑
if(ONESDK_USE_PREBUILT_LIBS)
# 使用预编译库
set(PREBUILT_LIBS_DIR "${PROJECT_SOURCE_DIR}/libs")
message(STATUS "Using prebuilt libraries from ${PREBUILT_LIBS_DIR}")

# 预编译库头文件路径
include_directories("${PREBUILT_LIBS_DIR}/include")
# 预编译库文件路径
link_directories("${PREBUILT_LIBS_DIR}")

# 仍然从源码编译cJson
add_subdirectory(external_libs/cJson)
# 仍然需要lws_config.h
# add_subdirectory(external_libs/libwebsockets)
else()
# 原有逻辑:从源码编译所有外部库
add_subdirectory(external_libs)
endif()

# Add CoreFoundation framework on macOS platform
if(BUILD_PLATFORM STREQUAL "macos")
Expand All @@ -166,6 +193,23 @@ set(BUILD_TYPE "debug")

file(GLOB SOURCE "${PROJECT_SOURCE_DIR}/src/*.c")



# Add include and external_libs/include to header file search path
include_directories(
${PROJECT_SOURCE_DIR}/include
${PROJECT_SOURCE_DIR}/include/iot
${PROJECT_SOURCE_DIR}/src
${PROJECT_SOURCE_DIR}/platform
${PROJECT_BINARY_DIR}/include
)

include_directories(
${PROJECT_SOURCE_DIR}/external_libs/libwebsockets/include
${PROJECT_SOURCE_DIR}/external_libs/cJson
${PROJECT_BINARY_DIR}/external_libs/libwebsockets
)

# source directory
# aux_source_directory(src ONESDK_SRC_DIRS)

Expand Down Expand Up @@ -281,9 +325,12 @@ if (APPLE)
# Don't add the exact path to CoreFoundation as this would hardcode the SDK version
list(APPEND PLATFORM_LIBS dl Threads::Threads "-framework CoreFoundation")
list(APPEND PLATFORM_LIBS ${CMAKE_DL_LIBS})

target_link_libraries(${PROJECT_NAME} PUBLIC ${PLATFORM_LIBS})
target_link_libraries(${PROJECT_NAME}_shared PUBLIC ${PLATFORM_LIBS})
if(ONESDK_WITH_STATIC)
target_link_libraries(${PROJECT_NAME} PUBLIC ${PLATFORM_LIBS})
endif()
if(ONESDK_WITH_SHARED)
target_link_libraries(${PROJECT_NAME}_shared PUBLIC ${PLATFORM_LIBS})
endif()

# list (APPEND AWS_COMMON_OS_SRC "source/darwin/*.c") # OS specific includes
# list (APPEND AWS_COMMON_OS_SRC "source/platform_fallback_stubs/system_info.c")
Expand Down Expand Up @@ -390,4 +437,4 @@ if (ONESDK_WITH_TEST AND NOT APPLE)
"${COVERATE_LDFLAGS}"
)
endif()
endif()
endif()
65 changes: 65 additions & 0 deletions docs/using_prebuilt_libs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
## 概述
onesdk 支持使用预编译的外部库(如 OpenSSL 和 libwebsockets)进行构建。**当前仅支持静态库(.a 文件)**,不支持动态库(.so/.dylib 文件)。通过设置 `ONESDK_USE_PREBUILT_LIBS` 开关,可以启用此功能并指定预编译库的路径。

## 4. 配置构建选项
### 4.1 启用预构建库支持
通过CMake选项启用预构建库功能:
```bash
./build.sh -DONESDK_USE_PREBUILT_LIBS=ON
```

### 4.2 可选配置项
| 配置选项 | 说明 | 默认值 |
|---------|------|--------|
| ONESDK_WITH_SHARED | 构建动态库 | ON |
| ONESDK_WITH_STATIC | 构建静态库 | ON |
| ONESDK_WITH_EXAMPLE | 构建示例程序 | ON |

## 5. 完整构建步骤

1. 确保预构建库已正确放置在 `onesdk/libs` 目录下

```bash
onesdk/
└── libs/
├── include/
│ ├── lws_config_private.h # libwebsockets私有头文件(必选,建议根据libwebsockets版本和开关替换)
│ ├── lws_config.h # libwebsockets公开文件(必选,建议根据libwebsockets版本和开关替换)
│ └── openssl/ # OpenSSL头文件目录(可选,一般在系统目录下)
│ ├── ssl.h
│ └── crypto.h
├── libwebsockets.a # libwebsockets静态库(必选)
├── libssl.a # OpenSSL ssl库(可选,根据是否需要TLS功能选择)
└── libcrypto.a # OpenSSL crypto库(可选,根据是否需要TLS功能选择)
```

2. 执行构建脚本

```bash
./build.sh -DONESDK_USE_PREBUILT_LIBS=ON
```

## 6. 验证构建结果
构建成功后,可在以下路径找到输出库文件:
- 静态库: `build/libonesdk.a`

## 7. 故障排除
### 7.1 头文件找不到
**错误示例**:`fatal error: 'libwebsockets.h' file not found`
**解决方法**:
1. 确认预构建库的头文件已放置在 `libs/include` 目录
2. 检查CMake配置是否正确启用 `ONESDK_USE_PREBUILT_LIBS`

### 7.2 库文件找不到
**错误示例**:`ld: library not found for -lwebsockets`
**解决方法**:
1. 确认预构建库文件已放置在 `libs/lib` 目录
2. 检查库文件命名是否符合系统标准(如Linux下为`libwebsockets.a`)

## 8. 注意事项
1. **库版本兼容性**:预构建库需与onesdk兼容,建议使用与源码编译版本相同的库
2. **平台一致性**:确保预构建库与目标平台匹配(如x86_64 vs arm64)
3. **静态库链接顺序**:链接时需注意库的依赖顺序,通常OpenSSL应在libwebsockets之后

## 目录结构要求
预编译库需按照以下结构放置在 `onesdk/libs` 目录中:
6 changes: 4 additions & 2 deletions examples/chat/chatbot/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,11 @@ else()
set(PLATFORM_LIBS "")
endif()

if (websockets)
if(ONESDK_WITH_STATIC)
message(STATUS "ONESDK_DEP_LIBS is to ${ONESDK_DEP_LIBS}, link with onesdk")
target_link_libraries(${PROJECT_NAME}
onesdk cjson
onesdk
${ONESDK_DEP_LIBS}
${LIBWEBSOCKETS_DEP_LIBS}
${PLATFORM_LIBS})
else()
Expand Down
5 changes: 3 additions & 2 deletions examples/chat/function_call/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,10 @@ else()
set(PLATFORM_LIBS "")
endif()

if (websockets)
if (ONESDK_WITH_STATIC)
target_link_libraries(${PROJECT_NAME}
onesdk cjson
onesdk
${ONESDK_DEP_LIBS}
${LIBWEBSOCKETS_DEP_LIBS}
${PLATFORM_LIBS})
else()
Expand Down
5 changes: 3 additions & 2 deletions examples/chat/mcp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,10 @@ else()
set(PLATFORM_LIBS "")
endif()

if (websockets)
if (ONESDK_WITH_STATIC)
target_link_libraries(${PROJECT_NAME}
onesdk cjson
onesdk
${ONESDK_DEP_LIBS}
${LIBWEBSOCKETS_DEP_LIBS}
${PLATFORM_LIBS})
else()
Expand Down
5 changes: 3 additions & 2 deletions examples/chat/text_image/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,10 @@ else()
set(PLATFORM_LIBS "")
endif()

if (websockets)
if (ONESDK_WITH_STATIC)
target_link_libraries(${PROJECT_NAME}
onesdk cjson
onesdk
${ONESDK_DEP_LIBS}
${LIBWEBSOCKETS_DEP_LIBS}
${PLATFORM_LIBS})
else()
Expand Down
15 changes: 11 additions & 4 deletions examples/onesdk_iot/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,14 @@ else()
endif()


target_link_libraries(${PROJECT_NAME} PRIVATE
onesdk_shared
websockets_shared
${PLATFORM_LIBS})
if(ONESDK_WITH_STATIC)
target_link_libraries(${PROJECT_NAME} PRIVATE
onesdk
${ONESDK_DEP_LIBS}
${PLATFORM_LIBS})
else()
target_link_libraries(${PROJECT_NAME} PRIVATE
onesdk_shared
websockets_shared
${PLATFORM_LIBS})
endif()
19 changes: 10 additions & 9 deletions examples/onesdk_realtime/chat_agent/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -39,16 +39,17 @@ add_executable(${PROJECT_NAME}
)
message("linking ${PROJECT_NAME} with websockets_shared = ${websockets_shared} libs ${LIBWEBSOCKETS_DEP_LIBS}")

if (websockets_static)
# Platform-specific libraries
if(BUILD_PLATFORM STREQUAL "windows")
set(PLATFORM_LIBS ws2_32 crypt32 iphlpapi)
else()
set(PLATFORM_LIBS "")
endif()
if (ONESDK_WITH_STATIC)
# Platform-specific libraries
if(BUILD_PLATFORM STREQUAL "windows")
set(PLATFORM_LIBS ws2_32 crypt32 iphlpapi)
else()
set(PLATFORM_LIBS "")
endif()

target_link_libraries(${PROJECT_NAME}
onesdk cjson
target_link_libraries(${PROJECT_NAME}
onesdk
${ONESDK_DEP_LIBS}
${LIBWEBSOCKETS_DEP_LIBS}
${PLATFORM_LIBS})
else()
Expand Down
21 changes: 11 additions & 10 deletions examples/onesdk_realtime/translation/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -39,18 +39,19 @@ add_executable(${PROJECT_NAME}
)
message("linking ${PROJECT_NAME} with websockets_shared = ${websockets_shared} libs ${LIBWEBSOCKETS_DEP_LIBS}")

if (websockets_static)
# Platform-specific libraries
if(BUILD_PLATFORM STREQUAL "windows")
set(PLATFORM_LIBS ws2_32 crypt32 iphlpapi)
else()
set(PLATFORM_LIBS "")
endif()
if (ONESDK_WITH_STATIC)
# Platform-specific libraries
if(BUILD_PLATFORM STREQUAL "windows")
set(PLATFORM_LIBS ws2_32 crypt32 iphlpapi)
else()
set(PLATFORM_LIBS "")
endif()

target_link_libraries(${PROJECT_NAME}
onesdk cjson
${LIBWEBSOCKETS_DEP_LIBS}
${PLATFORM_LIBS})
onesdk
${ONESDK_DEP_LIBS}
${LIBWEBSOCKETS_DEP_LIBS}
${PLATFORM_LIBS})
else()
target_link_libraries(${PROJECT_NAME}
onesdk_shared cjson
Expand Down
5 changes: 3 additions & 2 deletions examples/raw_http_chat/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,10 @@ else()
set(PLATFORM_LIBS "")
endif()

if (websockets_static)
if (ONESDK_WITH_STATIC)
target_link_libraries(${PROJECT_NAME}
onesdk_static cjson
onesdk
${ONESDK_DEP_LIBS}
${LIBWEBSOCKETS_DEP_LIBS}
${PLATFORM_LIBS})
else()
Expand Down
Loading
Loading