diff --git a/thirdparty/soap/HPKBUILD b/thirdparty/soap/HPKBUILD new file mode 100644 index 0000000000000000000000000000000000000000..35b342ae2dac226f88cb3a7286ace6fe1618cbaf --- /dev/null +++ b/thirdparty/soap/HPKBUILD @@ -0,0 +1,162 @@ +# 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: Jeff Han ,alnin +# Maintainer: Jeff Han ,alnin + +pkgname=gsoap +pkgver=2.8.134 +pkgrel=0 +pkgdesc="The gSOAP toolkit is an extensive suite of portable C and C++ software to develop XML Web services with powerful type-safe XML data bindings." +url="https://sourceforge.net/projects/gsoap2/files/" +archs=("armeabi-v7a" "arm64-v8a") +license=("GPLv2 License") +depends=("openssl" "zlib") +makedepends=() + +autounpack=true +downloadpackage=true +buildtools="configure" + +packagename="$pkgname"_$pkgver.zip +source="https://nchc.dl.sourceforge.net/project/gsoap2/$packagename" + +packagedir="$pkgname"-"${pkgver:0:3}" +builddir="$pkgname"-$pkgver + +cloneflag=true +opensslpackagename=openssl-OpenSSL_1_1_1u +zlibpackagename=zlib-v1.2.13 + +source envset.sh +host= +prepare() { + if $cloneflag + then + #编译openssl + mkdir -p linux/openssl + cp -rf ${LYCIUM_ROOT}/../thirdparty/openssl/$opensslpackagename.zip . + if [ "$?" != "0" ];then + echo "copy openssl package fail" + return -1 + fi + unzip $opensslpackagename.zip >> $publicbuildlog 2>&1 + cd $opensslpackagename + mkdir build && cd build + ../config no-shared --prefix=${LYCIUM_ROOT}/../thirdparty/gsoap/linux/openssl >> $publicbuildlog 2>&1 + make VERBOSE=1 >> $publicbuildlog 2>&1 + make install >> $publicbuildlog 2>&1 + cd ../../ + + #编译zlib + mkdir -p linux/zlib + cp -rf ${LYCIUM_ROOT}/../thirdparty/zlib/$zlibpackagename.zip . + if [ "$?" != "0" ];then + echo "copy zlib package fail" + return -1 + fi + unzip $zlibpackagename.zip >> $publicbuildlog 2>&1 + cd $zlibpackagename + mkdir build && cd build + ../configure --prefix=${LYCIUM_ROOT}/../thirdparty/gsoap/linux/zlib >> $publicbuildlog 2>&1 + make VERBOSE=1 >> $publicbuildlog 2>&1 + make install >> $publicbuildlog 2>&1 + cd ../../ + + #编译gsoap + mkdir -p linux/gsoap + cp -rf $packagedir $builddir-linux-build + cd $builddir-linux-build + ./configure --prefix=${LYCIUM_ROOT}/../thirdparty/gsoap/linux/gsoap \ + --with-openssl=${LYCIUM_ROOT}/../thirdparty/gsoap/linux/openssl \ + --with-zlib=${LYCIUM_ROOT}/../thirdparty/gsoap/linux/zlib >> $publicbuildlog 2>&1 + make VERBOSE=1 >> $publicbuildlog 2>&1 + make install >> $publicbuildlog 2>&1 + cd ../ + + cloneflag=false + fi + + cp -rf $packagedir $builddir-$ARCH-build + cd $builddir-$ARCH-build + patch -p1 < `pwd`/../gsoap_ohos_pkg.patch >> $publicbuildlog 2>&1 + + mkdir temp + cp -f ${LYCIUM_ROOT}/../thirdparty/gsoap/linux/gsoap/bin/soapcpp2 ./temp + cp -f ${LYCIUM_ROOT}/../thirdparty/gsoap/linux/gsoap/bin/wsdl2h ./temp + + if [ $ARCH == "armeabi-v7a" ] + then + setarm32ENV + host=arm-linux + fi + if [ $ARCH == "arm64-v8a" ] + then + setarm64ENV + host=aarch64-linux + fi + + cd $OLDPWD +} + +build() { + cd $builddir-$ARCH-build + PKG_CONFIG_LIBDIR="${pkgconfigpath}" LDFLAGS="-L${LYCIUM_ROOT}/usr/openssl/${ARCH}/lib -lssl -lcrypto -lz -lpthread" \ + CFLAGS="$CFLAGS -I${LYCIUM_ROOT}/usr/openssl/${ARCH}/include" \ + CXXFLAGS="$CXXFLAGS -I${LYCIUM_ROOT}/usr/openssl/${ARCH}/include" \ + ./configure "$@" --host=$host --disable-c-locale --enable-samples \ + --with-openssl="${LYCIUM_ROOT}/usr/openssl/${ARCH}" \ + --with-zlib="${LYCIUM_ROOT}/usr/zlib/${ARCH}" >> $buildlog 2>&1 + + make VERBOSE=1 >> $buildlog 2>&1 + make VERBOSE=1 >> $buildlog 2>&1 + ret=$? + cd $OLDPWD + return $ret +} + +package() { + cd $builddir-$ARCH-build + make install >> $buildlog 2>&1 + + rm -f ./gsoap/src/soapcpp2 + mv ./gsoap/src/soapcpp2.bak ./gsoap/src/soapcpp2 + cp -f ./gsoap/src/soapcpp2 ${LYCIUM_ROOT}/usr/gsoap/${ARCH}/bin + rm -f ./gsoap/wsdl/wsdl2h + mv ./gsoap/wsdl/wsdl2h.bak ./gsoap/wsdl/wsdl2h + cp -f ./gsoap/wsdl/wsdl2h ${LYCIUM_ROOT}/usr/gsoap/${ARCH}/bin + rm -rf temp + + cd $OLDPWD + if [ $ARCH == "armeabi-v7a" ] + then + unsetarm32ENV + fi + if [ $ARCH == "arm64-v8a" ] + then + unsetarm64ENV + fi + unset host +} + +check() { + echo "The test must be on an OpenHarmony device!" + # 进入编译目录,执行 ctest +} + +# 清理环境 +cleanbuild() { + echo "The cleanbuild !" + rm -rf ${PWD}/$opensslpackagename ${PWD}/$zlibpackagename ${PWD}/$packagedir ${PWD}/$builddir-linux-build \ + ${PWD}/$builddir-${archs[0]}-build ${PWD}/$builddir-${archs[1]}-build #${PWD}/$packagename +} diff --git a/thirdparty/soap/HPKCHECK b/thirdparty/soap/HPKCHECK new file mode 100644 index 0000000000000000000000000000000000000000..669cef0ef0ba31a972f901037b8ecfa3274d7ce6 --- /dev/null +++ b/thirdparty/soap/HPKCHECK @@ -0,0 +1,40 @@ +# 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: Jeff Han ,alnin +# Maintainer: Jeff Han ,alnin + +source HPKBUILD > /dev/null 2>&1 +logfile=${LYCIUM_THIRDPARTY_ROOT}/${pkgname}/${pkgname}_${ARCH}_${OHOS_SDK_VER}_test.log + +checkprepare(){ + return 0 +} + +# 在OH环境执行测试的接口 +openharmonycheck() { + res=0 + cd $builddir-$ARCH-build/gsoap/samples/primes + ./primes > ${logfile} 2>&1 + if [ $? -ne 0 ] + then + cd $OLDPWD + return -1 + fi + echo "test 1: pass" >> ${logfile} + + echo "Total test: 1 pass: 1" >> ${logfile} + res=$? + cd $OLDPWD + return $res +} diff --git a/thirdparty/soap/OAT.xml b/thirdparty/soap/OAT.xml new file mode 100644 index 0000000000000000000000000000000000000000..5663c536ddecb545bb824af7a320605c8072e4f4 --- /dev/null +++ b/thirdparty/soap/OAT.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/thirdparty/soap/README.OpenSource b/thirdparty/soap/README.OpenSource new file mode 100644 index 0000000000000000000000000000000000000000..c810d3ff8684962738d815ecace95fa2e29f01d4 --- /dev/null +++ b/thirdparty/soap/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "gsoap", + "License": "GPLv2", + "License File": "GPLv2_license", + "Version Number": "gsoap_2.8.134", + "Owner": "huangminzhong2@huawei.com", + "Upstream URL": "https://sourceforge.net/projects/gsoap2/files/", + "Description": "The gSOAP toolkit is an extensive suite of portable C and C++ software to develop XML Web services with powerful type-safe XML data bindings." + } +] diff --git a/thirdparty/soap/README_zh.md b/thirdparty/soap/README_zh.md new file mode 100644 index 0000000000000000000000000000000000000000..e8d4aa9fff005d0c6e75f31eb6468149ce0244a2 --- /dev/null +++ b/thirdparty/soap/README_zh.md @@ -0,0 +1,9 @@ +# gSOAP Toolkit三方库说明 +## 功能简介 + gSOAP Toolkit是一个用于开发SOAP和XML应用的工具包,它在英文中被称为toolkit。该工具包跨平台,可用于开发webservice的客户端和服务器端。 +## 使用约束 +- SDK版本:sdk-linux-4.1.3.401 +- 三方库版本:gsoap_2.8.134 + +## 集成方式 ++ [应用hap包集成](docs/hap_integrate.md) diff --git a/thirdparty/soap/SHA512SUM b/thirdparty/soap/SHA512SUM new file mode 100644 index 0000000000000000000000000000000000000000..6bec7b0f73dcebeaf6ea6e6700d0a87fb7f830a3 --- /dev/null +++ b/thirdparty/soap/SHA512SUM @@ -0,0 +1 @@ +d30cb69398544abfd6823baca8d565f85cf40336494d1eacc508ef5d8cc77d868cb2d9659a74a376954a1b6d00c99397b1de536d3f6471f3bba9282f031bded7 gsoap_2.8.134.zip diff --git a/thirdparty/soap/docs/hap_integrate.md b/thirdparty/soap/docs/hap_integrate.md new file mode 100644 index 0000000000000000000000000000000000000000..ff4416fc48a210f080ef6042aae1cca2f81cf540 --- /dev/null +++ b/thirdparty/soap/docs/hap_integrate.md @@ -0,0 +1,110 @@ +# gSOAP Toolkit集成到应用hap + +本库是在RK3568开发板上基于OpenHarmony3.2 Release版本的镜像验证的,如果是从未使用过RK3568,可以先查看[润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld)。 + +## 开发环境 + +- [开发环境准备](../../../docs/hap_integrate_environment.md) + +## 编译三方库 + +- 下载本仓库 + + ```shell + git clone https://gitee.com/openharmony-sig/tpc_c_cplusplus.git --depth=1 + ``` + +- 三方库目录结构 + + ```shell + tpc_c_cplusplus/thirdparty/gsoap #三方库gsoap的目录结构如下 + ├── docs #三方库相关文档的文件夹 + ├── HPKBUILD #构建脚本 + ├── HPKCHECK #测试脚本 + ├── OAT.xml #扫描结果文件 + ├── SHA512SUM #三方库校验文件 + ├── README.OpenSource #说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md #三方库简介 + ├── gsoap_ohos_pkg.patch #用于gsoap库编译的补丁 + ``` + +- 在lycium目录下编译三方库 + + 编译环境的搭建参考[准备三方库构建环境](../../../lycium/README.md#1编译环境准备) + + ```shell + cd lycium + ./build.sh gsoap openssl zlib + ``` + +- 三方库头文件及生成的库 + + 在lycium目录下会生成usr目录,该目录下存在已编译完成的32位和64位三方库 + + ```shell + gsoap/arm64-v8a gsoap/armeabi-v7a + ``` + +- [测试三方库](#测试三方库) + +## 应用中使用三方库 + +- 使用bin目录下的 wsdl2h 和  soapcpp2 二进制文件自动生成源代码 + + ```shell + #执行 wsdl2h 从本地文件读取 WSDL 并自动生成一个默认名称的输出文件 + wsdl2h calc.wsdl + #执行 wsdl2h 从远程 URL 读取 WSDL 并自动生成一个具有指定名称的输出文件 + wsdl2h -o calc.h http://www.genivia.com/calc.wsdl + + #执行 soapcpp2 从 calc.h 文件中自动生成客户端的源代码,-c 选项指定了生成客户端代码 + soapcpp2 -c calc.h + + #自动生成客户端的源代码 + #calc.nsmap + #soapC.cpp + #soapcalcProxy.cpp + #soapcalcProxy.h + #soapH.h + #soapStub.h + ``` + +- 在IDE的cpp目录下新增thirdparty目录,将编译生成的头文件拷贝到该目录下;在IDE的cpp目录下新增lib目录,将编译生成的.a文件拷贝到该目录下;在IDE的cpp目录下将自动生成客户端的源代码文件拷贝到该目录下。如下图所示: + + ![thirdparty_install_dir](pic/gsoap_install_dir.png) + +- 在最外层(cpp目录下)CMakeLists.txt中添加如下语句,libz.a需要自己编译仓库里面的 + + ```cmake + #将执行 soapcpp2 自动生成的 soapC.cpp 和 soapcalcProxy.cpp 依赖文件加入工程中 + add_library(entry SHARED soapC.cpp soapcalcProxy.cpp napi_init.cpp) + + #将三方库加入工程中 + target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/gsoap/${OHOS_ARCH}/lib/libgsoap++.a) + #将三方库的头文件加入工程中 + target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/gsoap/${OHOS_ARCH}/include) + ``` + + 调用三方库须知 + + ```c++ + #调用需注意 + #添加soapcpp2自动生成客户端的源代码头文件 + #include "soapcalcProxy.h" + #include "calc.nsmap" + +## 测试三方库 + +三方库的测试使用原库自带的测试用例来做测试,[准备三方库测试环境](../../../lycium/README.md#3ci环境准备) + +进入到构建目录下的sample文件夹中运行测试用例,涉及客户端和服务端程序需要开两个终端窗口测试。 + +(gsoap-2.8-arm64-v8a-build/gsoap/samples为构建64位的目录,gsoap-2.8-armeabi-v7a-build/gsoap/samples为构建32位的目录) + + ![gsoap_test](pic/gsoap_test.png) + +## 参考资料 + +- [OpenHarmony三方库地址](https://gitee.com/openharmony-tpc) +- [OpenHarmony知识体系](https://gitee.com/openharmony-sig/knowledge) +- [gsoap toolkit三方库地址](https://sourceforge.net/projects/gsoap2/files/) diff --git a/thirdparty/soap/docs/pic/gsoap_install_dir.png b/thirdparty/soap/docs/pic/gsoap_install_dir.png new file mode 100644 index 0000000000000000000000000000000000000000..4508c5c6f88949395e03a2dce6dd2dfd2780df46 Binary files /dev/null and b/thirdparty/soap/docs/pic/gsoap_install_dir.png differ diff --git a/thirdparty/soap/docs/pic/gsoap_test.png b/thirdparty/soap/docs/pic/gsoap_test.png new file mode 100644 index 0000000000000000000000000000000000000000..109888e0adaab24e4545104ec3cc97b20d71bb83 Binary files /dev/null and b/thirdparty/soap/docs/pic/gsoap_test.png differ diff --git a/thirdparty/soap/gsoap_ohos_pkg.patch b/thirdparty/soap/gsoap_ohos_pkg.patch new file mode 100644 index 0000000000000000000000000000000000000000..40e9ad63301a3d8f02ea01c2d702964afff6745d --- /dev/null +++ b/thirdparty/soap/gsoap_ohos_pkg.patch @@ -0,0 +1,54 @@ +diff -Naur old/gsoap/src/Makefile.in new/gsoap/src/Makefile.in +--- old/gsoap/src/Makefile.in 2024-04-23 02:54:11.000000000 +0800 ++++ new/gsoap/src/Makefile.in 2024-05-21 19:11:53.352626300 +0800 +@@ -413,6 +413,8 @@ + soapcpp2$(EXEEXT): $(soapcpp2_OBJECTS) $(soapcpp2_DEPENDENCIES) $(EXTRA_soapcpp2_DEPENDENCIES) + @rm -f soapcpp2$(EXEEXT) + $(AM_V_CCLD)$(soapcpp2_LINK) $(soapcpp2_OBJECTS) $(soapcpp2_LDADD) $(LIBS) ++ mv soapcpp2 soapcpp2.bak ++ cp -f ../../temp/soapcpp2 ./ + + mostlyclean-compile: + -rm -f *.$(OBJEXT) +diff -Naur old/gsoap/stdsoap2.cpp new/gsoap/stdsoap2.cpp +--- old/gsoap/stdsoap2.cpp 2024-05-18 14:14:59.398464333 +0800 ++++ new/gsoap/stdsoap2.cpp 2024-05-19 15:16:38.691319700 +0800 +@@ -5457,7 +5457,7 @@ + { + #if (defined(_AIX43) || defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R) + struct hostent_data ht_data; +-#elif (!defined(_GNU_SOURCE) || (!(~_GNU_SOURCE+1) && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && !defined(SUN_OS) && !defined(__QNX__) && !defined(QNX) && defined(HAVE_GETHOSTBYNAME_R) ++#elif (!defined(_GNU_SOURCE) || (!(~_GNU_SOURCE+1) && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(__OHOS__) || defined(FREEBSD) || defined(__FreeBSD__)) && !defined(SUN_OS) && !defined(__QNX__) && !defined(QNX) && defined(HAVE_GETHOSTBYNAME_R) + int r; + char *tmpbuf = soap->tmpbuf; + size_t tmplen = sizeof(soap->tmpbuf); +@@ -5490,7 +5490,7 @@ + hostent = NULL; + soap->errnum = h_errno; + } +-#elif (!defined(_GNU_SOURCE) || (!(~_GNU_SOURCE+1) && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && !defined(SUN_OS) && !defined(__QNX__) && !defined(QNX) && defined(HAVE_GETHOSTBYNAME_R) ++#elif (!defined(_GNU_SOURCE) || (!(~_GNU_SOURCE+1) && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(__OHOS__) || defined(FREEBSD) || defined(__FreeBSD__)) && !defined(SUN_OS) && !defined(__QNX__) && !defined(QNX) && defined(HAVE_GETHOSTBYNAME_R) + while ((r = gethostbyname_r(addr, hostent, tmpbuf, tmplen, &hostent, &soap->errnum)) < 0) + { + if (tmpbuf != soap->tmpbuf) +@@ -23197,7 +23197,7 @@ + if (err != 0) + soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "unknown error"); + # else +- return strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* GNU-specific */ ++ return (const char*)strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* GNU-specific */ + # endif + # else + return strerror(err); +diff -Naur old/gsoap/wsdl/Makefile.in new/gsoap/wsdl/Makefile.in +--- old/gsoap/wsdl/Makefile.in 2024-04-23 02:54:11.000000000 +0800 ++++ new/gsoap/wsdl/Makefile.in 2024-05-21 19:12:05.600126200 +0800 +@@ -454,6 +454,8 @@ + wsdl2h$(EXEEXT): $(wsdl2h_OBJECTS) $(wsdl2h_DEPENDENCIES) $(EXTRA_wsdl2h_DEPENDENCIES) + @rm -f wsdl2h$(EXEEXT) + $(AM_V_CXXLD)$(wsdl2h_LINK) $(wsdl2h_OBJECTS) $(wsdl2h_LDADD) $(LIBS) ++ mv wsdl2h wsdl2h.bak ++ cp -f ../../temp/wsdl2h ./ + + mostlyclean-compile: + -rm -f *.$(OBJEXT)