diff --git a/lycium/build.sh b/lycium/build.sh index 88377b944a40041b6569eb3cfccb2ca4c466ee05..81be9c406adba8e0d2aecfd6bbe7114d39d04ffa 100755 --- a/lycium/build.sh +++ b/lycium/build.sh @@ -37,8 +37,19 @@ echo "CLANG_VERSION="${CLANG_VERSION} export CLANG_VERSION=${CLANG_VERSION} jobFlag=true -# 记录依赖库 -export LYCIUM_DEPEND_PKGNAMES="/tmp/$USER-lycium_deps-`date +%s`" +# 依赖库暂存文件 +while : +do + build_time=`date +%s` + depend_tmp_file="/tmp/$USER-lycium_deps-$build_time" + if [ -f $depend_tmp_file ] + then + sleep 2 # 杜绝重复的,依赖库暂存文件 + else + export LYCIUM_DEPEND_PKGNAMES=$depend_tmp_file + break + fi +done hpksdir="../thirdparty/" # 所有 hpk 项目存放的目录 @@ -150,11 +161,6 @@ makelibsdir() { # 找到main目录下的所有目录 # 参数1 为项目根路径 findmainhpkdir() { - # hpkPaths=`find $1 -maxdepth 1 -type d` - # # echo $hpkPaths - # # remove root dir - # hpkPaths=(${hpkPaths[*]/$1}) - tmplibs=() for file in $(ls $1) do @@ -182,12 +188,14 @@ prepareshell() { cleanhpkdir() { for hpkdir in ${hpkPaths[@]} do - cd $hpkdir - rm -rf build_hpk.sh envset.sh - cd ${OLDPWD} + rmovelinkfiles $hpkdir done } +rmovelinkfiles() { + rm -rf $1/build_hpk.sh $1/envset.sh +} + # 编译库本身 nextroundlist=() notdonelist=() @@ -221,6 +229,7 @@ buildhpk() { done if ! $isdone then + rmovelinkfiles ${notdonelist[$i]} donelist[${#donelist[@]}]=${notdonelist[$i]##*/} fi echo donelist:${donelist[*]} > $LYCIUM_ROOT/lycium_build_intl.log @@ -236,7 +245,7 @@ buildhpk() { if [[ -d $tmppath && -f $tmppath/HPKBUILD ]] then doneflag=false - for libname in ${donelist[@]} + for libname in ${donelist[@]} # 不在已完成的列表中 do if [ $tmppath == $LYCIUM_ROOT/$hpksdir/$libname ] then @@ -244,7 +253,7 @@ buildhpk() { fi done nextflag=false - for libname in ${nextroundlist[@]} + for libname in ${nextroundlist[@]} # 不在待编译的列表中 do if [ $tmppath == $libname ] then @@ -252,14 +261,22 @@ buildhpk() { fi done notdoneflag=false - for libname in ${notdonelist[@]} + for libname in ${notdonelist[@]} # 不在未完成的列表中 do if [ $tmppath == $libname ] then notdoneflag=true fi done - if ! $doneflag && ! $nextflag && ! $notdoneflag + buildfalseflag=false + for libname in ${buildfalselist[@]} # 不在编译失败的列表中 + do + if [ $tmppath == $libname ] + then + buildfalseflag=true + fi + done + if ! $doneflag && ! $nextflag && ! $notdoneflag && ! $buildfalseflag # 添加到下一轮的编译中 then nextroundlist[${#nextroundlist[@]}]=$tmppath hpkPaths[${#hpkPaths[@]}]=$tmppath @@ -286,6 +303,7 @@ buildhpk() { fi echo nextroundlist:${nextroundlist[*]} > $LYCIUM_ROOT/lycium_build_intl.log else + rmovelinkfiles ${notdonelist[$i]} echo "${notdonelist[$i]} build ERROR. errno: $res" buildfalselist[${#buildfalselist[@]}]=${notdonelist[$i]} fi @@ -306,6 +324,11 @@ buildhpk() { then echo "Please check the dependencies of these items:" echo " "${nextroundlist[*]} + if [ ${#buildfalselist[*]} -ne 0 ] + then + echo "The follow pkg build error!" + echo ${buildfalselist[*]} + fi jobFlag=false fi lastroundfirstjob=${nextroundlist[0]} diff --git a/thirdparty/DragonBonesCPP/DragonBonesCPP_oh_pkg.patch b/thirdparty/DragonBonesCPP/DragonBonesCPP_oh_pkg.patch new file mode 100644 index 0000000000000000000000000000000000000000..da6d23a956f467e57342f99e708e53b6199c2c74 --- /dev/null +++ b/thirdparty/DragonBonesCPP/DragonBonesCPP_oh_pkg.patch @@ -0,0 +1,125 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +new file mode 100755 +index 0000000..25b7403 +--- /dev/null ++++ b/CMakeLists.txt +@@ -0,0 +1,47 @@ ++# 指定 tremolo 库的源代码路径 ++cmake_minimum_required(VERSION 3.6) ++project(tremolo_lib) ++ ++# 添加头文件搜索路径 ++include_directories(./) ++include_directories(./3rdParty/) ++include_directories(./DragonBones/src/) ++include_directories(./DragonBones/src/dragonBones/core/) ++include_directories(./DragonBones/src/dragonBones/parsers/) ++ ++# 获取当前目录下的所有 .h 文件 ++file(GLOB HEADER_FILES "*.cpp") ++ ++# 添加要编译的源文件 ++add_library(DragonBones ++./DragonBones/src/dragonBones/model/TimelineData.cpp ++./DragonBones/src/dragonBones/model/DragonBonesData.cpp ++./DragonBones/src/dragonBones/model/ArmatureData.cpp ++./DragonBones/src/dragonBones/model/FrameData.cpp ++./DragonBones/src/dragonBones/model/AnimationData.cpp ++./DragonBones/src/dragonBones/textures/TextureData.cpp ++./DragonBones/src/dragonBones/animation/WorldClock.cpp ++./DragonBones/src/dragonBones/animation/Animation.cpp ++./DragonBones/src/dragonBones/animation/AnimationState.cpp ++./DragonBones/src/dragonBones/animation/TimelineState.cpp ++./DragonBones/src/dragonBones/events/EventObject.cpp ++./DragonBones/src/dragonBones/core/BaseObject.cpp ++./DragonBones/src/dragonBones/armature/Slot.cpp ++./DragonBones/src/dragonBones/armature/Armature.cpp ++./DragonBones/src/dragonBones/armature/Bone.cpp ++./DragonBones/src/dragonBones/factories/BaseFactory.cpp ++./DragonBones/src/dragonBones/parsers/JSONDataParser.cpp ++./DragonBones/src/dragonBones/parsers/DataParser.cpp ++) ++ ++include_directories(./DragonBones/src/dragonBones/model/) ++add_executable(DragonBones_test DragonBones_test.cpp) ++target_link_libraries(DragonBones_test PRIVATE DragonBones) ++ ++# 获取当前目录下的所有 .h 文件 ++file(GLOB_RECURSE HEADER_FILES "*.h") ++ ++message(error ${HEADER_FILES}) ++# 安装库文件 ++install(TARGETS DragonBones DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) ++install(FILES ${HEADER_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/include) +diff --git a/DragonBones_test.cpp b/DragonBones_test.cpp +new file mode 100644 +index 0000000..0f87c71 +--- /dev/null ++++ b/DragonBones_test.cpp +@@ -0,0 +1,65 @@ ++#include ++#include ++#include ++#include ++#include ++ ++using namespace std; ++using namespace dragonBones; ++ ++int main() { ++ // 读取JSON文件 ++ string jsonData = ""; ++ ifstream ifs("../Cocos2DX_3.x/Demos/Resources/res/AnimationBaseTest/AnimationBaseTest.json"); ++ if (ifs) { ++ string line; ++ while (getline(ifs, line)) { ++ jsonData += line + "\n"; ++ } ++ ifs.close(); ++ } ++ else { ++ cerr << "Error: Cannot open file test.json" << endl; ++ return 1; ++ } ++ ++ // 解析DragonBones数据 ++ JSONDataParser jsdb; ++ DragonBonesData* data = jsdb.parseDragonBonesData(jsonData.c_str()); ++ if (data == nullptr) { ++ cerr << "Error: Cannot parse JSON data" << endl; ++ return 1; ++ } ++ ++ cout << "autoSearch = " << data->autoSearch << endl; ++ cout << "frameRate = " << data->frameRate << endl; ++ cout << "name = " << data->name << endl; ++ cout << "armatures" << endl; ++ for (std::map::iterator it = data->armatures.begin(); it!= data->armatures.end(); it++ ) { ++ ++ cout << "string armatures.name = " << it->first << endl; ++ cout << "armatures.name = " << it->second->name << endl; ++ ++ std::map bones = it->second->bones; ++ for(map::iterator it_bones = bones.begin(); it_bones!=bones.end();it_bones++) ++ { ++ cout << "bones:" << "it_bones" << endl; ++ cout << "it_bones->second->weight = " << it_bones->second->weight << endl; ++ cout << "it_bones->second->length = " << it_bones->second->length << endl; ++ cout << "it_bones->second->name = " << it_bones->second->name << endl; ++ } ++ ++ std::map slots = it->second->slots; ++ for(map::iterator it_slots = slots.begin(); it_slots!=slots.end(); it_slots++) ++ { ++ cout << "slots:" << "it_slots" << endl; ++ cout << "it_slots->second->name" << it_slots->second->name << endl; ++ cout << "it_slots->second->zOrder" << it_slots->second->zOrder << endl; ++ cout << "it_slots->second->displayIndex" << it_slots->second->displayIndex << endl; ++ } ++ } ++ ++ // 释放内存 ++ delete data; ++ return 0; ++} +\ No newline at end of file diff --git a/thirdparty/DragonBonesCPP/HPKBUILD b/thirdparty/DragonBonesCPP/HPKBUILD new file mode 100644 index 0000000000000000000000000000000000000000..7c669d616e060666b3ea54192ca9c02c0ae7b046 --- /dev/null +++ b/thirdparty/DragonBonesCPP/HPKBUILD @@ -0,0 +1,88 @@ +# Copyright (c) 2023 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Contributor: liucheng <1596268623@qq.com> +# Maintainer: liucheng <1596268623@qq.com> + + +pkgname=DragonBonesCPP +pkgver=5.0 +pkgrel=0 +pkgdesc="DragonBones is a set of skeletal animation toolsets, first developed using Flash and ActionScript 3.0 languages, mainly used in Flash games, and is now widely used in web and mobile game projects" +url="http://www.dragonbones.com//" +archs=("armeabi-v7a" "arm64-v8a") +license=("BSD") +depends=() +makedepends=() +source="https://github.com/DragonBones/${pkgname}.git" + +downloadpackage=false +autounpack=false +buildtools="cmake" + +builddir=${pkgname}-${pkgver} +packagename=$builddir.tar.gz + +prepare_flag="false" +prepare() { + if [ $prepare_flag == "true" ] + then + return 0 + fi + + git clone ${source} $builddir + ret=$? + if [ $ret -ne 0 ] + then + echo "fail $ARCH:git clone ${source} ret=" $ret + return 1 + fi + + cd $builddir + git checkout -b b5.0 origin/5.0 + # 打补丁添加编译测试代码 + patch < ../DragonBonesCPP_oh_pkg.patch + prepare_flag="true" + cd $OLDPWD +} + +build() { + + cd $builddir + ${OHOS_SDK}/native/build-tools/cmake/bin/cmake "$@" -DOHOS_ARCH=$ARCH -B$ARCH-build -S./ -L > $ARCH-build.log 2>&1 + make VERBOSE=1 -j4 -C $ARCH-build >> ${ARCH}-build.log 2>&1 + # 对最关键一步的退出码进行判断 + ret=$? + cd $OLDPWD + return $ret +} + +# 打包安装 +package() { + cd $builddir + make -C $ARCH-build install >> $ARCH-build.log 2>&1 + cd $OLDPWD +} + +# 进行测试的准备和说明 +check() { + echo "The test must be on an OpenHarmony device!" + # 测试方式 + # 进入构建目录 + # 执行: ./DragonBones_test +} + +# 清理环境fmt +cleanbuild() { + rm -rf ${PWD}/$builddir #${PWD}/$packagename +} diff --git a/thirdparty/DragonBonesCPP/HPKCHECK b/thirdparty/DragonBonesCPP/HPKCHECK new file mode 100644 index 0000000000000000000000000000000000000000..e550f43327086f73754dba5c3f32ad7d8b5ac38c --- /dev/null +++ b/thirdparty/DragonBonesCPP/HPKCHECK @@ -0,0 +1,34 @@ +# Copyright (c) 2023 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Contributor: liucheng <1596268623@qq.com> +# Maintainer: liucheng <1596268623@qq.com> + +source HPKBUILD > /dev/null 2>&1 +logfile=${LYCIUM_THIRDPARTY_ROOT}/${pkgname}/${pkgname}_${ARCH}_${OHOS_SDK_VER}_test.log + +openharmonycheck() { + res=0 + cd ${builddir}/${ARCH}-build + mkdir -p ${LYCIUM_THIRDPARTY_ROOT}/${pkgname}/ + ./DragonBones_test > ${logfile} 2>&1 + res=$? + cd $OLDPWD + if [ $res -ne 0 ] + then + return -1 + fi + + return 0 +} + diff --git a/thirdparty/DragonBonesCPP/OAT.xml b/thirdparty/DragonBonesCPP/OAT.xml new file mode 100644 index 0000000000000000000000000000000000000000..373f88bf7f868e96bc359a47dfd773073db96ca6 --- /dev/null +++ b/thirdparty/DragonBonesCPP/OAT.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/DragonBonesCPP/README.OpenSource b/thirdparty/DragonBonesCPP/README.OpenSource new file mode 100644 index 0000000000000000000000000000000000000000..b5f677c05cf514cd299ed8900bd26580b6086100 --- /dev/null +++ b/thirdparty/DragonBonesCPP/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "DragonBonesCPP", + "License": "MIT license", + "License File": "https://github.com/DragonBones/DragonBonesCPP/blob/master/LICENSE", + "Version Number": "56b6847252c0f610a1b07f30b137b1ec49b36226", + "Owner": "1596268623@qq.com", + "Upstream URL": "https://github.com/DragonBones/DragonBonesCPP.git", + "Description": "DragonBones is a set of skeletal animation toolsets, first developed using Flash and ActionScript 3.0 languages, mainly used in Flash games, and is now widely used in web and mobile game projects" + } +] diff --git a/thirdparty/DragonBonesCPP/README_zh.md b/thirdparty/DragonBonesCPP/README_zh.md new file mode 100644 index 0000000000000000000000000000000000000000..2d5c0f286b988e316b0ff91c0ef2c8bdc11f3081 --- /dev/null +++ b/thirdparty/DragonBonesCPP/README_zh.md @@ -0,0 +1,11 @@ +# DragonBonesCPP 三方库说明 +## 功能简介 +DragonBones 是一套骨骼动画工具集,最早使用 Flash 和 ActionScript 3.0 语言开发,主要在 Flash 游戏中使用,目前在页游和手游项目中使用很广泛 +## 使用约束 +- IDE版本:DevEco Studio 3.1 Release +- SDK版本:ohos_sdk_public 4.0.8.1 (API Version 10 Release) +- 三方库版本:56b6847252c0f610a1b07f30b137b1ec49b36226 +- DragonBones 是一套骨骼动画工具集,最早使用 Flash 和 ActionScript 3.0 语言开发,主要在 Flash 游戏中使用,目前在页游和手游项目中使用很广泛 + +## 集成方式 ++ [应用hap包集成](docs/hap_integrate.md) diff --git a/thirdparty/DragonBonesCPP/docs/hap_integrate.md b/thirdparty/DragonBonesCPP/docs/hap_integrate.md new file mode 100644 index 0000000000000000000000000000000000000000..9ff9f0ca52377fc34d580d379bae06718abadeb9 --- /dev/null +++ b/thirdparty/DragonBonesCPP/docs/hap_integrate.md @@ -0,0 +1,67 @@ +# DragonBonesCPP集成到应用hap +本库是在RK3568开发板上基于OpenHarmony3.2 Release版本的镜像验证的,如果是从未使用过RK3568,可以先查看[润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld)。 + +## 开发环境 + +- ubuntu20.04 +- [OpenHarmony3.2Release镜像](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fdayu200_standard_arm32.tar.gz) +- [ohos_sdk_public 4.0.8.1 (API Version 10 Release)](https://gitee.com/link?target=http%3A%2F%2Fdownload.ci.openharmony.cn%2Fversion%2FMaster_Version%2FOpenHarmony_4.0.8.1%2F20230608_091058%2Fversion-Master_Version-OpenHarmony_4.0.8.1-20230608_091058-ohos-sdk-public.tar.gz) +- [DevEco Studio 3.1 Release](https://gitee.com/link?target=https%3A%2F%2Fcontentcenter-vali-drcn.dbankcdn.cn%2Fpvt_2%2FDeveloperAlliance_package_901_9%2F81%2Fv3%2FtgRUB84wR72nTfE8Ir_xMw%2Fdevecostudio-windows-3.1.0.501.zip%3FHW-CC-KV%3DV1%26HW-CC-Date%3D20230621T074329Z%26HW-CC-Expire%3D315360000%26HW-CC-Sign%3D22F6787DF6093ECB4D4E08F9379B114280E1F65DA710599E48EA38CB24F3DBF2) +- [准备三方库构建环境](../../../lycium/README.md#1编译环境准备) +- [准备三方库测试环境](../../../lycium/README.md#3ci环境准备) +## 编译三方库 +- 下载本仓库 + ``` + git clone https://gitee.com/openharmony-sig/tpc_c_cplusplus.git --depth=1 + ``` +- 三方库目录结构 + ``` + tpc_c_cplusplus/thirdparty/DragonBonesCPP #三方库的目录结构如下 + ├── docs #三方库相关文档的文件夹 + ├── HPKBUILD #构建脚本 + ├── HPKCHECK #自动测试 + ├── SHA512SUM #三方库校验文件 + ├── README.OpenSource #说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md + ``` + +- 在lycium目录下编译三方库 + 编译环境的搭建参考[准备三方库构建环境](../../../lycium/README.md#1编译环境准备) + ``` + cd lycium + ./build.sh DragonBonesCPP + ``` +- 三方库头文件及生成的库 + 在lycium目录下会生成usr目录,该目录下存在已编译完成的32位和64位三方库和头文件 + ``` + DragonBonesCPP/arm64-v8a + DragonBonesCPP/armeabi-v7a + ``` + +- [测试三方库](#测试三方库) + +## 应用中使用三方库 + +- 在IDE的cpp目录下新增thirdparty目录,将编译生成的头文件拷贝到该目录下,将编译生成的三方库全部(动态库名字带版本号和不带版本号的都需要)拷贝到工程的libs目录下,如下图所示 + ![thirdparty_install_dir](pic/install_dir.png) +- 在最外层(cpp目录下)CMakeLists.txt中添加如下语句 + +``` +#将三方库加入工程中 +target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libmad/${OHOS_ARCH}/lib/libDragonBones.a) +#将三方库的头文件加入工程中 +target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libmad/${OHOS_ARCH}/include) +``` + ![thirdparty_usage](pic/usage.png) +## 测试三方库 +三方库的测试使用原库自带的测试用例来做测试 + +进入到构建目录获取,执行ctest,运行测试用例(DragonBonesCPP-arm64-v8a-build为构建64位的目录,DragonBonesCPP-armeabi-v7a-build为构建32位的目录) + ![thirdparty_test_result](pic/test_result.png) + + +## 参考资料 +- [润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld) +- [OpenHarmony三方库地址](https://gitee.com/openharmony-tpc) +- [OpenHarmony知识体系](https://gitee.com/openharmony-sig/knowledge) +- [通过DevEco Studio开发一个NAPI工程](https://gitee.com/openharmony-sig/knowledge_demo_temp/blob/master/docs/napi_study/docs/hello_napi.md) diff --git a/thirdparty/DragonBonesCPP/docs/pic/install_dir.png b/thirdparty/DragonBonesCPP/docs/pic/install_dir.png new file mode 100755 index 0000000000000000000000000000000000000000..d00fa8b359b73944a8d33eafec06b44663e11a6c Binary files /dev/null and b/thirdparty/DragonBonesCPP/docs/pic/install_dir.png differ diff --git a/thirdparty/DragonBonesCPP/docs/pic/test_result.png b/thirdparty/DragonBonesCPP/docs/pic/test_result.png new file mode 100755 index 0000000000000000000000000000000000000000..b1821becff475cc9f084a89c22b032a35a6d5e81 Binary files /dev/null and b/thirdparty/DragonBonesCPP/docs/pic/test_result.png differ diff --git a/thirdparty/DragonBonesCPP/docs/pic/usage.png b/thirdparty/DragonBonesCPP/docs/pic/usage.png new file mode 100755 index 0000000000000000000000000000000000000000..defc505dc53090e2ba5eecb6100a322899973353 Binary files /dev/null and b/thirdparty/DragonBonesCPP/docs/pic/usage.png differ diff --git a/thirdparty/cyrus-sasl/HPKBUILD b/thirdparty/cyrus-sasl/HPKBUILD new file mode 100644 index 0000000000000000000000000000000000000000..76f5665cd26cd4e09a64a8bcfb008edab5157459 --- /dev/null +++ b/thirdparty/cyrus-sasl/HPKBUILD @@ -0,0 +1,109 @@ +# Copyright (c) 2023 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# Contributor: TangShaoteng +# Maintainer: TangShaoteng + +pkgname=cyrus-sasl +pkgver=2.1.28 +pkgrel=0 +pkgdesc="Simple Authentication and Security Layer (SASL) is a specification that describes how authentication mechanisms can be plugged into an application protocol on the wire. Cyrus SASL is an implementation of SASL that makes it easy for application developers to integrate authentication mechanisms into their application in a generic way." +url="https://www.cyrusimap.org/sasl/" +archs=("armeabi-v7a" "arm64-v8a") +license=("Copyright (c) 1998-2003 Carnegie Mellon University. All rights reserved.") +depends=("sqlite" "gdbm") +makedepends=() +source="https://github.com/cyrusimap/$pkgname/releases/download/$pkgname-$pkgver/$pkgname-$pkgver.tar.gz" + +autounpack=true +downloadpackage=true +buildtools="configure" + +builddir=$pkgname-$pkgver +packagename=$builddir.tar.gz +patchflag=true + +source envset.sh +host= +prepare() { + if $patchflag + then + cd $builddir + # 1.libc不支持getpass接口,使用scanf替代;2.printf不能及时输出提示信息,使用fflush刷新缓存区 + patch -p1 < `pwd`/../cyrus-sasl_oh_pkg.patch + # patch只需要打一次,关闭打patch + patchflag=false + cd $OLDPWD + fi + mkdir -p $builddir/$ARCH-build + if [ $ARCH == "armeabi-v7a" ] + then + setarm32ENV + host=arm-linux + elif [ $ARCH == "arm64-v8a" ] + then + setarm64ENV + host=aarch64-linux + else + echo "${ARCH} not support" + return -1 + fi + # crypt函数使用链接静态库方式获取 + export LDFLAGS="-lclang_rt.asan $LDFLAGS" + # crypt函数返回值忽略类型转换 + export CFLAGS="-Wno-int-conversion $CFLAGS" +} + +build() { + cd $builddir/$ARCH-build + ../configure "$@" --host=$host --enable-srp --enable-srp-setpass --enable-auth-sasldb --with-dblib=gdbm --with-gdbm=$LYCIUM_ROOT/usr/gdbm/$ARCH \ + --with-sqlite3=$LYCIUM_ROOT/usr/sqlite/$ARCH --enable-static=yes --with-saslauthd=$LYCIUM_ROOT/usr/cyrus-sasl/$ARCH \ + --with-dbpath=$LYCIUM_ROOT/usr/cyrus-sasl/$ARCH/sasldb2 --with-configdir=$LYCIUM_ROOT/usr/cyrus-sasl/$ARCH > `pwd`/build.log 2>&1 + make V=1 -j4 >> `pwd`/build.log 2>&1 + ret=$? + cd $OLDPWD + return $ret +} + +package() { + cd $builddir/$ARCH-build + make install >> `pwd`/build.log 2>&1 + cd $OLDPWD + unset host + if [ $ARCH == "armeabi-v7a" ] + then + unsetarm32ENV + elif [ $ARCH == "arm64-v8a" ] + then + unsetarm64ENV + else + echo "${ARCH} not support" + return -1 + fi +} + +check() { + echo "The test must be on an OpenHarmony device!" + # real test cmd + # echo "127.0.0.1 localhost" > /etc/hosts + # ping localhost + # echo -e "pwcheck_method:auxprop\nauxprop_plugin:sasldb\nmech_list:plain login" > $LYCIUM_ROOT/usr/cyrus-sasl/$ARCH/sample.conf + # ./saslauthd/saslauthd -a sasldb + # ./utils/saslpasswd2 -c yourname + # ./utils/sasldblistusers2 + # ./sample/server + # ./sample/client localhost +} + +cleanbuild() { + rm -rf ${PWD}/$builddir #${PWD}/$packageName +} diff --git a/thirdparty/cyrus-sasl/HPKCHECK b/thirdparty/cyrus-sasl/HPKCHECK new file mode 100644 index 0000000000000000000000000000000000000000..1a765adfde83a8e811be206ee3e061fd591d6379 --- /dev/null +++ b/thirdparty/cyrus-sasl/HPKCHECK @@ -0,0 +1,134 @@ +# Copyright (c) 2023 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# Contributor: TangShaoteng +# Maintainer: TangShaoteng + +source HPKBUILD > /dev/null 2>&1 +logfile=${LYCIUM_THIRDPARTY_ROOT}/${pkgname}/${pkgname}_${ARCH}_${OHOS_SDK_VER}_test.log + +checkprepare() { + # 添加lib子目录sasl2下的库路径到环境变量 + export LD_LIBRARY_PATH=${LYCIUM_ROOT}/usr/${pkgname}/${ARCH}/lib/sasl2:$LD_LIBRARY_PATH + ln -s /bin/sed /usr/bin/sed +} + +openharmonycheck() { + res=0 + sasluser=ohosuser + saslpassword=123456 + cd $builddir/$ARCH-build + + # 添加hosts文件 + echo -e "127.0.0.1 localhost" > /etc/hosts + res=$? + if [ $res -ne 0 ] + then + echo "create file(/etc/hosts) failed" > ${logfile} 2>&1 + cd $OLDPWD + return res + fi + + # 验证localhost通路 + ping localhost > ${logfile} 2>&1 + res=$? + if [ $res -ne 0 ] + then + echo "ping localhost failed" >> ${logfile} 2>&1 + cd $OLDPWD + return res + fi + + # 创建配置文件sample.conf + echo -e "pwcheck_method:auxprop\nauxprop_plugin:sasldb\nmech_list:plain login" > ${LYCIUM_ROOT}/usr/${pkgname}/${ARCH}/sample.conf + res=$? + if [ $res -ne 0 ] + then + echo "create file(sample.conf) failed" >> ${logfile} 2>&1 + cd $OLDPWD + return res + fi + + # 运行saslauthd服务 + ./saslauthd/saslauthd -a sasldb >> ${logfile} 2>&1 + res=$? + if [ $res -ne 0 ] + then + echo "saslauthd start failed" >> ${logfile} 2>&1 + cd $OLDPWD + return res + fi + + # 检查saslauthd服务运行状态 + process_count=`ps -ef | grep saslauthd | grep -v grep | wc -l` + if [ $process_count -ne 5 ] + then + echo "saslauthd run failed" >> ${logfile} 2>&1 + cd $OLDPWD + return res + fi + + # 将密码写人文件,用来实现自动化输入密码 + echo -e $saslpassword > saslpassword.txt + # 添加(注册)用户ohosuser(-c后面带的参数是用户名),通过文件重定向输入自动设置文件中预置的密码作为注册密码 + ./utils/saslpasswd2 -c $sasluser < saslpassword.txt < saslpassword.txt + res=$? + if [ $res -ne 0 ] + then + echo "add user failed" >> ${logfile} 2>&1 + cd $OLDPWD + return res + fi + + # 查询已经添加(注册)的用户 + have_user=`./utils/sasldblistusers2 | grep -w $sasluser | wc -l` + if [ $have_user -ne 1 ] + then + echo "check user failed" >> ${logfile} 2>&1 + cd $OLDPWD + return -1 + fi + + # 运行服务端 + ./sample/server >> ${logfile} 2>&1 & + res=$? + if [ $res -ne 0 ] + then + echo "server start failed" >> ${logfile} 2>&1 + cd $OLDPWD + return res + fi + + # 运行客户端,通过管道方式自动化输入身份ID、授权ID、密码 + echo -e "$sasluser\n$sasluser\n$saslpassword" | ./sample/client localhost >> ${logfile} 2>&1 + return_codes=(${PIPESTATUS[*]}) + if [ "${return_codes[0]}" -ne 0 ]; then + echo "echo strings error for client test" >> ${logfile} 2>&1 + res=${return_codes[0]} + cd $OLDPWD + return $res + fi + if [ "${return_codes[1]}" -ne 0 ]; then + echo "client test filed" >> ${logfile} 2>&1 + res=${return_codes[1]} + cd $OLDPWD + return $res + fi + + # 结束进程 + killall server + killall saslauthd + + cd $OLDPWD + + return $res +} diff --git a/thirdparty/cyrus-sasl/OAT.xml b/thirdparty/cyrus-sasl/OAT.xml new file mode 100644 index 0000000000000000000000000000000000000000..00f4c47405081491b05af1251a48f342c410298a --- /dev/null +++ b/thirdparty/cyrus-sasl/OAT.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/cyrus-sasl/README.OpenSource b/thirdparty/cyrus-sasl/README.OpenSource new file mode 100644 index 0000000000000000000000000000000000000000..e69b6bb2861e91285bf8b109977135c4675c9c6b --- /dev/null +++ b/thirdparty/cyrus-sasl/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "cyrus-sasl", + "License": "Copyright (c) 1998-2003 Carnegie Mellon University. All rights reserved.", + "License File": "https://github.com/cyrusimap/cyrus-sasl/blob/master/COPYING", + "Version Number": "2.1.28", + "Owner": "tangshaoteng@163.com", + "Upstream URL": "https://github.com/cyrusimap/cyrus-sasl/releases/download/cyrus-sasl-2.1.28/cyrus-sasl-2.1.28.tar.gz", + "Description": "Simple Authentication and Security Layer (SASL) is a specification that describes how authentication mechanisms can be plugged into an application protocol on the wire. Cyrus SASL is an implementation of SASL that makes it easy for application developers to integrate authentication mechanisms into their application in a generic way." + } +] diff --git a/thirdparty/cyrus-sasl/README_zh.md b/thirdparty/cyrus-sasl/README_zh.md new file mode 100644 index 0000000000000000000000000000000000000000..9520bbe2a62544917d39b13340eede83802ef390 --- /dev/null +++ b/thirdparty/cyrus-sasl/README_zh.md @@ -0,0 +1,11 @@ +# cyrus-sasl三方库说明 +## 功能简介 +简单身份验证和安全层 (SASL) 是一种规范,用于描述如何将身份验证机制插入到网络上的应用程序协议中。Cyrus SASL 是 SASL 的一种实现,它使应用程序开发人员可以轻松地以通用方式将身份验证机制集成到其应用程序中。 +## 使用约束 +- IDE版本:DevEco Studio 3.1 Release +- SDK版本:ohos_sdk_public 4.0.8.1 (API Version 10 Release) +- 三方库版本:2.1.28 +- 当前适配的功能:简单身份验证和安全层。 + +## 集成方式 ++ [应用hap包集成](docs/hap_integrate.md) diff --git a/thirdparty/cyrus-sasl/SHA512SUM b/thirdparty/cyrus-sasl/SHA512SUM new file mode 100644 index 0000000000000000000000000000000000000000..ed782e9f2a36a0459f4d056b4342507695008c7d --- /dev/null +++ b/thirdparty/cyrus-sasl/SHA512SUM @@ -0,0 +1 @@ +db15af9079758a9f385457a79390c8a7cd7ea666573dace8bf4fb01bb4b49037538d67285727d6a70ad799d2e2318f265c9372e2427de9371d626a1959dd6f78 cyrus-sasl-2.1.28.tar.gz diff --git a/thirdparty/cyrus-sasl/cyrus-sasl_oh_pkg.patch b/thirdparty/cyrus-sasl/cyrus-sasl_oh_pkg.patch new file mode 100644 index 0000000000000000000000000000000000000000..26310c78122aca23f4096ab6d6f67f792b861273 --- /dev/null +++ b/thirdparty/cyrus-sasl/cyrus-sasl_oh_pkg.patch @@ -0,0 +1,68 @@ +diff --git a/include/saslutil.h b/include/saslutil.h +index e0fa47c..5b7fb7c 100755 +--- a/include/saslutil.h ++++ b/include/saslutil.h +@@ -90,6 +90,8 @@ LIBSASL_API void sasl_config_done(void); + LIBSASL_API int getopt(int argc, char **argv, char *optstring); + #endif + LIBSASL_API char * getpass(const char *prompt); ++#elif defined(__OHOS__) ++LIBSASL_API char * getpass(const char *prompt); + #endif /* WIN32 */ + + #ifdef __cplusplus +diff --git a/lib/saslutil.c b/lib/saslutil.c +index 46c628c..4a44e8c 100644 +--- a/lib/saslutil.c ++++ b/lib/saslutil.c +@@ -785,6 +785,17 @@ const char *prompt; + return(pbuf); + } + +- ++#elif defined(__OHOS__) ++// The getpass function is not supported on the OHOS platform, so define it here ++char *getpass(const char *prompt) { ++ static char password[128]; ++ printf("%s", prompt); ++ fflush(stdout); // Flush the output buffer to avoid password echo ++ if (fgets(password, sizeof(password), stdin) == NULL) { ++ return NULL; // Return NULL on end-of-file or error ++ } ++ password[strcspn(password, "\n")] = '\0'; // Remove the newline character at the end ++ return password; ++} + + #endif /* WIN32 */ +diff --git a/sample/client.c b/sample/client.c +index e723c6b..b40c634 100644 +--- a/sample/client.c ++++ b/sample/client.c +@@ -61,6 +61,7 @@ + + #include + #include ++#include + + #include "common.h" + +@@ -129,6 +130,7 @@ static int simple(void *context __attribute__((unused)), + default: + return SASL_BADPARAM; + } ++ fflush(stdout); + + fgets(b, 1024, stdin); + chop(b); +diff --git a/sample/http_digest_client.c b/sample/http_digest_client.c +index 6a2ae59..924d6ce 100644 +--- a/sample/http_digest_client.c ++++ b/sample/http_digest_client.c +@@ -19,6 +19,7 @@ + #include + + #include ++#include + + #define SUCCESS 0 + #define ERROR 1 diff --git a/thirdparty/cyrus-sasl/docs/hap_integrate.md b/thirdparty/cyrus-sasl/docs/hap_integrate.md new file mode 100644 index 0000000000000000000000000000000000000000..8a821b3f6ce491fac27d7e2694720eb40510f99d --- /dev/null +++ b/thirdparty/cyrus-sasl/docs/hap_integrate.md @@ -0,0 +1,175 @@ +# cyrus-sasl集成到应用hap + +本库是在RK3568开发板上基于OpenHarmony3.2 Release版本的镜像验证的,如果是从未使用过RK3568,可以先查看[润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld)。 + +## 开发环境 + +- ubuntu20.04 +- [OpenHarmony3.2Release镜像](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fdayu200_standard_arm32.tar.gz) +- [ohos_sdk_public 4.0.8.1 (API Version 10 Release)](https://gitee.com/link?target=http%3A%2F%2Fdownload.ci.openharmony.cn%2Fversion%2FMaster_Version%2FOpenHarmony_4.0.8.1%2F20230608_091058%2Fversion-Master_Version-OpenHarmony_4.0.8.1-20230608_091058-ohos-sdk-public.tar.gz) +- [DevEco Studio 3.1 Release](https://gitee.com/link?target=https%3A%2F%2Fcontentcenter-vali-drcn.dbankcdn.cn%2Fpvt_2%2FDeveloperAlliance_package_901_9%2F81%2Fv3%2FtgRUB84wR72nTfE8Ir_xMw%2Fdevecostudio-windows-3.1.0.501.zip%3FHW-CC-KV%3DV1%26HW-CC-Date%3D20230621T074329Z%26HW-CC-Expire%3D315360000%26HW-CC-Sign%3D22F6787DF6093ECB4D4E08F9379B114280E1F65DA710599E48EA38CB24F3DBF2) +- [准备三方库构建环境](../../../lycium/README.md#1编译环境准备) +- [准备三方库测试环境](../../../lycium/README.md#3ci环境准备) + +## 编译三方库 + +- 下载本仓库 + + ```shell + git clone https://gitee.com/openharmony-sig/tpc_c_cplusplus.git --depth=1 + ``` + +- 三方库目录结构 + + ```shell + tpc_c_cplusplus/thirdparty/cyrus-sasl #三方库cyrus-sasl的目录结构如下 + ├── cyrus-sasl_oh_pkg.patch #构建patch文件 + ├── docs #三方库相关文档的文件夹 + ├── HPKBUILD #构建脚本 + ├── HPKCHECK #自动化测试脚本 + ├── SHA512SUM #三方库校验文件 + ├── README.OpenSource #说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md #三方库说明文档 + ├── OAT.xml #开源扫描相关文件 + ``` + +- 在tpc_c_cplusplus/lycium目录下编译三方库 + + 编译环境的搭建参考[准备三方库构建环境](../../../lycium/README.md#1编译环境准备) + + ```shell + cd tpc_c_cplusplus/lycium + ./build.sh cyrus-sasl + ``` + +- 三方库头文件及生成的库 + + 在lycium目录下会生成usr目录,该目录下存在已编译完成的32位和64位三方库和头文件 + + ```shell + cyrus-sasl/arm64-v8a cyrus-sasl/armeabi-v7a + gdbm/arm64-v8a gdbm/armeabi-v7a + sqlite/arm64-v8a sqlite/armeabi-v7a + ``` +- [测试三方库](#测试三方库) + +## 应用中使用三方库 + +- 拷贝动态库到`\\entry\libs\${OHOS_ARCH}\`目录: + 动态库需要在`\\entry\libs\${OHOS_ARCH}\`目录,才能集成到hap包中,所以需要将对应的so文件拷贝到对应CPU架构的目录 +- 在IDE的cpp目录下新增thirdparty目录,将编译生成的库拷贝到该目录下,如下图所示 + +  ![thirdparty_install_dir01](pic/cyrus-sasl_install_dir01.png) + +  ![thirdparty_install_dir02](pic/cyrus-sasl_install_dir02.png) + +  ![thirdparty_install_dir03](pic/cyrus-sasl_install_dir03.png) + +- 在最外层(cpp目录下)CMakeLists.txt中添加如下语句 + ```shell + #将三方库加入工程中 + target_link_libraries(entry PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libsasl2.a + ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libanonymous.a + ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libcrammd5.a + ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libdigestmd5.a + ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libplain.a + ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libsasldb.a + ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libgdbm.a + ) + #将三方库的头文件加入工程中 + target_include_directories(entry PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/include/cyrus-sasl/${OHOS_ARCH} + ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/include/gdbm/${OHOS_ARCH} + ) + ``` + +## 测试三方库 + +三方库的测试使用原库自带的测试用例来做测试,[准备三方库测试环境](../../../lycium/README.md#3ci环境准备) + + 进入到安装目录tpc_c_cplusplus/lycium/usr/cyrus-sasl/${OHOS_ARCH}/bin,执行如下操作步骤: + +- 配置环境变量 + 执行如下命令: + + ```shell + export LD_LIBRARY_PATH=${LYCIUM_ROOT}/usr/cyrus-sasl/${ARCH}/lib:${LYCIUM_ROOT}/usr/cyrus-sasl/${ARCH}/lib/sasl2:${LYCIUM_ROOT}/usr/gdbm/${ARCH}/lib:$LD_LIBRARY_PATH + ``` + > 注意:LYCIUM_ROOT代表lycium所在目录的绝对路径;ARCH代表构建架构,64位为arm64-v8a,32位为armeabi-v7a。 + +- 创建sed软连接: + + ```shell + mount -o remount,rw / + ln -s /bin/sed /usr/bin/sed + ``` + +- 添加/etc/hosts文件,内容如下: + + ```shell + 127.0.0.1 localhost + ``` + +- 测试localhost通畅 + + ```shell + ping localhost + ``` +  ![cyrus-sasl_ping_localhost](pic/cyrus-sasl_ping_localhost.png) + +- 添加配置文件\$\{LYCIUM_ROOT\}/usr/cyrus-sasl/\$\{ARCH\}/sample.conf,内容如下: + + ```shell + pwcheck_method:auxprop + auxprop_plugin:sasldb + mech_list:plain login + ``` + +- 运行saslauthd服务程序 + + ```shell + ./saslauthd/saslauthd -a sasldb + ``` + +- 查看saslauthd服务程序运行状态 + + ```shell + ps -ef | grep saslauthd | grep -v grep + ``` + > 可以查看到有5个saslauthd进程在运行 + +- 注册用户(以用户名ohosuser为例) + + ```shell + ./utils/saslpasswd2 -c ohosuser + ``` +  ![cyrus-sasl_add_user](pic/cyrus-sasl_add_user.png) + +- 查询已注册用户 + + ```shell + ./utils/sasldblistusers2 + ``` +  ![cyrus-sasl_list_user](pic/cyrus-sasl_list_user.png) + +- 运行服务端程序 + + ```shell + ./sample/server + ``` +  ![cyrus-sasl_server](pic/cyrus-sasl_server.png) + +- 运行客户端程序 + + ```shell + ./sample/client localhost + ``` +  ![cyrus-sasl_client](pic/cyrus-sasl_client.png) + +## 参考资料 + +- [润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld) +- [OpenHarmony三方库地址](https://gitee.com/openharmony-tpc) +- [OpenHarmony知识体系](https://gitee.com/openharmony-sig/knowledge) +- [通过DevEco Studio开发一个NAPI工程](https://gitee.com/openharmony-sig/knowledge_demo_temp/blob/master/docs/napi_study/docs/hello_napi.md) diff --git a/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_add_user.png b/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_add_user.png new file mode 100644 index 0000000000000000000000000000000000000000..5caae015acfd8b9bc38476d772cbc91076c63e4d Binary files /dev/null and b/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_add_user.png differ diff --git a/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_client.png b/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_client.png new file mode 100644 index 0000000000000000000000000000000000000000..3976d622788f1ab4daccec4f011bac499d489f6d Binary files /dev/null and b/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_client.png differ diff --git a/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_install_dir01.png b/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_install_dir01.png new file mode 100644 index 0000000000000000000000000000000000000000..f2118927323e995a6d3ff958c52d6e977c5433e4 Binary files /dev/null and b/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_install_dir01.png differ diff --git a/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_install_dir02.png b/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_install_dir02.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e80e8af204203ae3673e041c2bc94a52387479 Binary files /dev/null and b/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_install_dir02.png differ diff --git a/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_install_dir03.png b/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_install_dir03.png new file mode 100644 index 0000000000000000000000000000000000000000..29a61611fcb11ef33f2dfbb4382b3c867963670d Binary files /dev/null and b/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_install_dir03.png differ diff --git a/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_list_user.png b/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_list_user.png new file mode 100644 index 0000000000000000000000000000000000000000..94c250d5688bfa80b0fd8df6ad52c0ca6f00926b Binary files /dev/null and b/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_list_user.png differ diff --git a/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_ping_localhost.png b/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_ping_localhost.png new file mode 100644 index 0000000000000000000000000000000000000000..ca199fa8f5c91932f3ae1e170eb7d475859c4028 Binary files /dev/null and b/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_ping_localhost.png differ diff --git a/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_server.png b/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_server.png new file mode 100644 index 0000000000000000000000000000000000000000..3283b599b7add716eaeeb22cc19c9b3b97c376f6 Binary files /dev/null and b/thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_server.png differ diff --git a/thirdparty/spine-runtimes/OAT.xml b/thirdparty/spine-runtimes/OAT.xml index 59bfaa37935f10e40e862ab0f657aa7f0bbc2823..373f88bf7f868e96bc359a47dfd773073db96ca6 100644 --- a/thirdparty/spine-runtimes/OAT.xml +++ b/thirdparty/spine-runtimes/OAT.xml @@ -4,11 +4,13 @@ + +