From e4526517c3a1dd22c65f38686e50d0c3e3e6c8df Mon Sep 17 00:00:00 2001 From: terrencetang Date: Fri, 18 Aug 2023 10:44:55 +0800 Subject: [PATCH 1/4] add cyrus-sasl Signed-off-by: terrencetang --- thirdparty/cyrus-sasl/HPKBUILD | 109 +++++++++++ thirdparty/cyrus-sasl/HPKCHECK | 134 ++++++++++++++ thirdparty/cyrus-sasl/OAT.xml | 20 ++ thirdparty/cyrus-sasl/README.OpenSource | 11 ++ thirdparty/cyrus-sasl/README_zh.md | 11 ++ thirdparty/cyrus-sasl/SHA512SUM | 1 + thirdparty/cyrus-sasl/cyrus-sasl_oh_pkg.patch | 68 +++++++ thirdparty/cyrus-sasl/docs/hap_integrate.md | 175 ++++++++++++++++++ .../docs/pic/cyrus-sasl_add_user.png | Bin 0 -> 1704 bytes .../cyrus-sasl/docs/pic/cyrus-sasl_client.png | Bin 0 -> 6445 bytes .../docs/pic/cyrus-sasl_install_dir01.png | Bin 0 -> 31065 bytes .../docs/pic/cyrus-sasl_install_dir02.png | Bin 0 -> 26880 bytes .../docs/pic/cyrus-sasl_install_dir03.png | Bin 0 -> 18964 bytes .../docs/pic/cyrus-sasl_list_user.png | Bin 0 -> 1530 bytes .../docs/pic/cyrus-sasl_ping_localhost.png | Bin 0 -> 6995 bytes .../cyrus-sasl/docs/pic/cyrus-sasl_server.png | Bin 0 -> 5193 bytes 16 files changed, 529 insertions(+) create mode 100644 thirdparty/cyrus-sasl/HPKBUILD create mode 100644 thirdparty/cyrus-sasl/HPKCHECK create mode 100644 thirdparty/cyrus-sasl/OAT.xml create mode 100644 thirdparty/cyrus-sasl/README.OpenSource create mode 100644 thirdparty/cyrus-sasl/README_zh.md create mode 100644 thirdparty/cyrus-sasl/SHA512SUM create mode 100644 thirdparty/cyrus-sasl/cyrus-sasl_oh_pkg.patch create mode 100644 thirdparty/cyrus-sasl/docs/hap_integrate.md create mode 100644 thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_add_user.png create mode 100644 thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_client.png create mode 100644 thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_install_dir01.png create mode 100644 thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_install_dir02.png create mode 100644 thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_install_dir03.png create mode 100644 thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_list_user.png create mode 100644 thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_ping_localhost.png create mode 100644 thirdparty/cyrus-sasl/docs/pic/cyrus-sasl_server.png diff --git a/thirdparty/cyrus-sasl/HPKBUILD b/thirdparty/cyrus-sasl/HPKBUILD new file mode 100644 index 00000000..76f5665c --- /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 00000000..1a765adf --- /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 00000000..00f4c474 --- /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 00000000..e69b6bb2 --- /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 00000000..9520bbe2 --- /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 00000000..ed782e9f --- /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 00000000..26310c78 --- /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 00000000..8a821b3f --- /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 GIT binary patch literal 1704 zcmYL~ZBUa}7RPVO61MWvx~&VNf;(lMv0w{IqY?~AM;hEJG!O_OKw^1`CLq=jBZ(o* zvMqJCC3SYi2}-gB7lFJIj0#8y?RIH_kfjh}2oPIPAPHeLdGZJkNjB^kKiqTAxie?x zf6n>cd#`=zy(^_g{Civ?6bgqV63MsMQJ`L{9LBEvp}g}oa517` z7pVU_N*2)K-nO*pR|o&11p`|9-S8QbKQw16I02kkvd{+Y)oAKxo@1=bP6bl3q3Jqq z*K$WY?n~XqrkBpVK;}K{h0MLGuc0aFh;7fBaImg_BwN-S zIsd-T(IYli%G>IwaCea*kxb2p)kSuK7%Im|>BtB6B?7gXqmX(<M;N5!(p^Txz~!e>_H~hqldPPYHD+E(>kX(3lUsg$ za^G{DvHy1vqpFCs%<(XvF-gn!#cQbld{2ANwqWy}b#MCOom6P^pdEw1G|eWFor+h(Fg3B{STop&iP26xm>!e62=J8)Wm zW>uq+MK|=fSPC~zn+Rv%iNlM$n(!x&EOnpCC%#f&I3s^H3dfjJ&iO^XZQ@F+%(QGy zX3V_Ry6#_fb^ji6sJR};2FdlK5gE*Sqh9=81KVxz5c>>j*S#ZSvE+qhDVBHNN=1BT zUv~vte^p}WKHjarG^998A$iGF8Sb!t#khFgc~wU8;5D5gy5t98GZVF!zkqD)=}6It2udJU*{zJkw<7vS%@c7-ed4J`erl$drvNuMyI1A$u zZ;ZaJ&?u-Gii9fY`O5$#y4I|Z-o`|&J@?+vZ)RVzUsGs0)cqBs%Y!b4tDjUx%eEA6e~}gnobLFL_=KD*TOx4rW_1HJded+WX}W0{(4HU-X*qns zVa}XiBzZ%JTp1YVnpkskq))AN`lNH8`RR43V103DcylyCV(w-7ni9-(flu;Zj9_Fv zrJjdFO9wBOZ2XYK^Kb-Rsff$}7o`9Si{-&-v0z3MA|0$DHZuor={K=zK35@vPD1B! zi-;F%n;JK5VWsct+qE)h9)JFz?I+uxc=xhR1gBmd7gFEkM@xqmdYsb(bYcas8!<3S zjzEkk5 zcHAK=h9%H#eF}V}9d;ydXEbwcKs9EfK?%1U8Rb_y`ihaQb2z(v+#{RwkGl?7B=hmV z@@k?*fwTemzP5LHulcTqywDY-d;b?2q%n{ExJ>q6-*kvY4C|=ZkSgr)w(>GAyKn1- zP76CL&op~b$p9(}Q#D(-F%F+skROPl2_h0u&DAEH`2L2_VE1oyycF3Ga)m|cMv?xWvU_;pWbN;0KZVo3&2sIjE)Cj&!GS^ zk5?=-qqX$~j|f0h>8op_Mcbp=c3Q&#U~9VeQQ%nP@D8B+=>LrU%GrM9UC-ft ZWnGa3W#|XPf!_t3%E&sY_>lJJ{{b8`hS&fA literal 0 HcmV?d00001 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 GIT binary patch literal 6445 zcmai3e_T@c-aoF}yjyp&)?KcZcJJC|w;#I2v?ZcKffEWJvz`nQAPh*`%C(-ey z;FF1se{6qkDQ0w!I=dJ$c9dve^YT{Y&A?ss-dnN1&5de$!4RwtEorKk1Nxlm;Ddlm zX~qLUX0aFmx+rgA0O0mVeXD_QqG)S?W3Y%wptn2@j!6!tyf~h67MSNQzlmw_O5 zN$Z9@C`$`99ZV2PyLAK}-evUiZ{f^$J%+5zZkD1zfhcw6e9b-MMfvPw6^klGM|B%d zw2gspqkB&i$4yC|i$iwRtmnj!cM7C~Up5tS?_ujun*0Qz=iG3u7bS6ix{Jca zPv)8%b#j%BHTY4{e6biaqfIG5SsApafQOD#w4v?lP|QFW0BG(%4_3{%1gs+2K414! z4|Nmp55>S~=@#1Ra1}+Oohb2!zPw@%%_O?gE?Fmn@_=J+U9h4tRDQ`h5T-ROQ%gOQopL&F3KIlQ`<5Qis0^437D{k^(l@zx z*8d$0Hf0a*?a@?M+zlG;M;kUY(;u2-4UE3rsy*7Uw8AVat$oShd-qt?C)}qC7LKF*Zt=gtCTi;K`Tn z8y7vPE0?3>Fp{vxr(7Vu&rgYnd?v&53^K?>1%!<#mp7NlB~BqS{fMHesu2}5z@(4X zOK{pNH%0;#u8Kt>e6QCidk3%8=ek)T&hW!L<*T!zGV$p*^i@N1O|s;pO*q}m%q;?e z6T_`2^G+9-TuvW(c(yLzK8O+KAHFvm%(w-j>vt4_pZEv0$O@$-%JaCgmXqfxFwa10 zv$}m4KfPFH&ld~ISNh}`cPOGU0*Jm6**7m;51OnDhkBa(i}ae z@5-soa11YZT)kjxrkoeue%yWwr^+$GKU_PLOwqf>C)y+(a&DK?)%eJ;7b#YGEuzN-SogkvPler`XkQJCnR01EZ>!mL#9M0sarY5gt&Ww%CV9TSKnB<0EfuT6NsF)P#{`n@ zn8vl9{A@i?yW z0WL2Pymtrwy+}vBfubUl?FkOcI-oeNVN>i%1OdTH1V*x0)xz05D3cpD0lm~m&jkr% z2cZ*R=iL`<_RAhE=~7h*vN=3BjYOtpF!abcVBFFb6`N4^bHq+TUv8UC+y7&9U-zZr zGg`DV|9c2IP(umq!Pq`dB45TA8pcfP)Mv;d9vl#yRV)mjvvK1S2xer)3TlBl~QI+Qzi;9WODYV+EzI1C+##O-> zF2Uy)aJCrv__%IjoR2J%cF&#lp4w@jIpZzQFXa{}ougy8Mu%~TARiPJ=2Fcn$EWtU zDV=G0tYyT|4o4QHyMBcpkl5xmKvO}|7T76rLgDU#c}w~#-`v>Rmk1bhZ| zM%4}1wy@^ZqgihZ-Bk-5te8m##u-9Y!7s1PG%!q)tT|3f@J+5 zPU_8Nj>7jB5Wr- z1GXO92_iRxq#p?|GSn$e6rQDsNLCCST(<4v5kiB@ob`tI6yvDD{Jg^xXT=kuuK#E(G?8b^A z$r7-XUj|E=v7n&dRED6+^;Lxm2yN)4sy~;E1l)gcnPP$gO3qM6_Wk%Ou=raTeW}VX zSw*~UN6>}PCJGg;TkF(|8cfm#3LI-bT9F#)T<b{mSqx(+7j5Nb|HN`t#~c7u)@q@X_sh+2A2xQ5;$_X zH<9i9fxgjmj(mxvHxsq1fS#`yn3oXI>D!lN-uywGtmSKAbwhsPl%lIWi_+QeaH+t6 zFGVzrKm)C``mBMeEKs%tv1$iBF;Ib~My+*5>DQW>Z@B#eIZ(VmQ2Z@v>buTerC3u) zM9OrNuMRI~w@P3+3^gmrc886h+e;e~cLgm~JqRfOl7~OnEwh}&CA4p8Y|=_8uQp}i z`Ipq;HP98!^ch`t^#G+HgkjS`(A~|(9|9%P7iu|{uZ#Dwc5D;`8&l!NDJ|zP1i0e) zWpfEk_q7GOS1&&q22iN86D9Y)8LtVefh%mqbjINwCML+iugAeKGFsp;A|e8Gg}3jv zF)$z#k3-FK#T!IX5E6_DE$yd<0pKl=@-{W{D#(u1=IEn2xp^vy;bBJv@Sd9@J`Ks_ z5=%@%0jTTct&|*3BQW0d6|I&PeLK%>P81R}_55%^alns%ozQ9cO5z2(giA*!PD_Tns{k>dOB5q;@M68K;0ZiR?NW)f85!S%5<>GVUOZAY_BCjm3%(^`X0#sgX zs49^xyx*d>fmh&v%I;FZ{x6*1*7bt>@*S^p&tREzvWq|ZfrBmBfb6=f0DwIhSvXsl zC~=|<$|Lc+hxp_}EBWe6B}sI{ww_!eb9PX_3b4K$6kSd*7Tm-H2;9MnAsoW+Q^Lck z)Z3X5Y#iTCwqAWk5anA9T>eE~GZXaj!1(1w{c+bY?2kXj3&sxA=*NE+ zzCZ4WW@1<9Z}3nDK@R{NP*om>JQuMZ=tVwCeKe>aAirHX-tgmbM8iiPuLg?O|H2bI zQlRinv3HNrJD&n-o(EfM7%;x$aSbK=iwz#%mgR`m06y7UEV=XA3Y=Q_i5OeVX9Kov z#v(jWlOmrjo=F;MTz>-w$3|&L)y&G_mdw)J z(w>T&(M}<8e6%y7p~(Ny4aH&5#78l!iJBg}qR5~bjp|GQZRWd#b{_BW-MvEeEmnj1l>l_DKT2Ovs{rten zF0cAq=Z8Gz7_Pa}J1ug0^0y7irQMmJvgI!hO9gc2$iMxGwT&TA*gdx^IrTVbH?=GL z!OKe8LGP;9`9G_1xip5&aB7X>E_i}orNcIBJoXlj;wGC_c>`B5ho>YuSm133X|=en z@|RI4mrvKy(GE>vqeRjI#yAO^H7Vts%{mW@;8!DG1LY;DnFHA?b(e(|^)fV#+NTkCa)X_ov(1pV1m1?vB zE) zZKTXSn3oQLlShYmC;*JFfkaXtY$81?_fI@;4x#xDUQS94Wy#(*d8Q{B!|+Jw{GL_f z23lY4!||*v1{Hb8fz6z31Uc;DWOD%s0*)z5f8|tO*?%y85y!wixD$Ns6n9X=BjE6P zZq9lw%8Qy+GtyZb7^_S*rPfa{6WZR{~ zIzh?TRi2<(AuBMRGRAJxQInB_(qo+kbB}5uRe1feE(P*IADY`luz3v8+lS(X5_S1h z7eb#f>VMiirM@iU^s_adw|BDg;+shEZ4!NCuGhFAKp$xYod}#AHhr*q=aWG1+Q(G= zc)kHn0x(NCn)#e5Osy}nSJ(+@SUM(MnE1ZWl_gUGEt8oHOmTE58JMf-o9vr+ts0L2 zr`gy0PTiE+u+$&qScY2E&o*#O4W4v?yzvyzu|?vnEitXrvN4Vy?Rx~E1KZu^7c8q@ zCU>OE&1geq(@f%!G}C4>ih1C?6o=(zAy)h|=R*Re6%EW&#ATa*i)5hmM&VS2Yj;MF z?dt|noCXRA#9WSfO|Oq^oY368psmM7kJAm>%F)wc+ zi{IN$VOi|h`ux!60fsuGJ`FK-8Z;hzfR1i|)4`05_%<|ccidos(=HQsiH232sO=Lfe4I;o-9KeCp!~1xD II`-fH2Y@;nqepMr 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 Re%zndd-<&seH`-7{{W1>rDXsB literal 0 HcmV?d00001 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 GIT binary patch literal 26880 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 D%W>{H literal 0 HcmV?d00001 -- Gitee From 1e2d94ab597d7194777bb25a0e63cd6f9b7aeb28 Mon Sep 17 00:00:00 2001 From: liucheng Date: Tue, 22 Aug 2023 09:38:48 +0800 Subject: [PATCH 2/4] fix spine OAT.xml --- thirdparty/spine-runtimes/OAT.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/thirdparty/spine-runtimes/OAT.xml b/thirdparty/spine-runtimes/OAT.xml index 59bfaa37..373f88bf 100644 --- a/thirdparty/spine-runtimes/OAT.xml +++ b/thirdparty/spine-runtimes/OAT.xml @@ -4,11 +4,13 @@ + + -- Gitee From bbfe86b9bb4e5c09ff24e356e7e96c72d79b20fd Mon Sep 17 00:00:00 2001 From: liucheng Date: Wed, 2 Aug 2023 15:46:38 +0800 Subject: [PATCH 3/4] add DragonBonesCPP Signed-off-by: liucheng --- .../DragonBonesCPP_oh_pkg.patch | 125 ++++++++++++++++++ thirdparty/DragonBonesCPP/HPKBUILD | 88 ++++++++++++ thirdparty/DragonBonesCPP/HPKCHECK | 34 +++++ thirdparty/DragonBonesCPP/OAT.xml | 23 ++++ thirdparty/DragonBonesCPP/README.OpenSource | 11 ++ thirdparty/DragonBonesCPP/README_zh.md | 11 ++ .../DragonBonesCPP/docs/hap_integrate.md | 67 ++++++++++ .../DragonBonesCPP/docs/pic/install_dir.png | Bin 0 -> 13602 bytes .../DragonBonesCPP/docs/pic/test_result.png | Bin 0 -> 49365 bytes thirdparty/DragonBonesCPP/docs/pic/usage.png | Bin 0 -> 23642 bytes 10 files changed, 359 insertions(+) create mode 100644 thirdparty/DragonBonesCPP/DragonBonesCPP_oh_pkg.patch create mode 100644 thirdparty/DragonBonesCPP/HPKBUILD create mode 100644 thirdparty/DragonBonesCPP/HPKCHECK create mode 100644 thirdparty/DragonBonesCPP/OAT.xml create mode 100644 thirdparty/DragonBonesCPP/README.OpenSource create mode 100644 thirdparty/DragonBonesCPP/README_zh.md create mode 100644 thirdparty/DragonBonesCPP/docs/hap_integrate.md create mode 100755 thirdparty/DragonBonesCPP/docs/pic/install_dir.png create mode 100755 thirdparty/DragonBonesCPP/docs/pic/test_result.png create mode 100755 thirdparty/DragonBonesCPP/docs/pic/usage.png diff --git a/thirdparty/DragonBonesCPP/DragonBonesCPP_oh_pkg.patch b/thirdparty/DragonBonesCPP/DragonBonesCPP_oh_pkg.patch new file mode 100644 index 00000000..da6d23a9 --- /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 00000000..7c669d61 --- /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 00000000..e550f433 --- /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 00000000..373f88bf --- /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 00000000..b5f677c0 --- /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 00000000..2d5c0f28 --- /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 00000000..9ff9f0ca --- /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 GIT binary patch literal 13602 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 OoHa6o7o5KG*Z%@ckBg81 literal 0 HcmV?d00001 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 GIT binary patch literal 49365 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 literal 0 HcmV?d00001 diff --git a/thirdparty/DragonBonesCPP/docs/pic/usage.png b/thirdparty/DragonBonesCPP/docs/pic/usage.png new file mode 100755 index 0000000000000000000000000000000000000000..defc505dc53090e2ba5eecb6100a322899973353 GIT binary patch literal 23642 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 E6Jh=b#sB~S literal 0 HcmV?d00001 -- Gitee From b0cd598dbc66ba48865fc06e8dab9a59c886afc0 Mon Sep 17 00:00:00 2001 From: han_jin_fei <1970336264@qq.com> Date: Wed, 23 Aug 2023 17:26:07 +0800 Subject: [PATCH 4/4] update_lycium Signed-off-by: han_jin_fei <1970336264@qq.com> --- lycium/build.sh | 51 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/lycium/build.sh b/lycium/build.sh index 88377b94..81be9c40 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]} -- Gitee