From 8bc1410b8f3d25a696379d56ea8f188b179b3004 Mon Sep 17 00:00:00 2001 From: zhongluping <278527840@qq.com> Date: Fri, 5 May 2023 17:35:09 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=9B=AE=E5=BD=95=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhongluping <278527840@qq.com> --- README_zh.md | 25 +- docs/thirdparty_list.md | 24 ++ thirdparty/README_zh.md | 33 ++ {bsdiff => thirdparty/bsdiff}/BUILD.gn | 0 .../bsdiff}/README.OpenSource | 0 {bsdiff => thirdparty/bsdiff}/README_zh.md | 0 {bsdiff => thirdparty/bsdiff}/bundle.json | 0 .../bsdiff}/docs/rom_integrate.md | 4 +- {bsdiff => thirdparty/bsdiff}/export_api.txt | 0 .../bsdiff}/media/ohos_result.png | Bin .../bsdiff}/testdata/note.txt | 0 .../bsdiff}/testdata/note_new.txt | 0 .../bsdiff}/testdata/run_test.sh | 0 {bsdiff => thirdparty/bsdiff}/tested_api.txt | 0 .../concurrentqueue}/BUILD.gn | 0 .../concurrentqueue}/CHANGELOG.md | 0 .../concurrentqueue}/CMakeLists.txt | 0 .../concurrentqueue}/README.OpenSource | 0 .../concurrentqueue}/README_zh.md | 0 .../concurrentqueue}/bundle.json | 0 .../concurrentqueue}/docs/hap_integrate.md | 2 +- .../concurrentqueue}/docs/pic/hap.jpeg | Bin .../concurrentqueue}/docs/pic/result.PNG | Bin .../concurrentqueue}/docs/rom_integrate.md | 4 +- {iconv => thirdparty/iconv}/BUILD.gn | 0 {iconv => thirdparty/iconv}/Makefile | 0 {iconv => thirdparty/iconv}/README.OpenSource | 0 {iconv => thirdparty/iconv}/README_zh.md | 0 .../iconv}/adapter/include/config.h | 0 .../iconv}/adapter/include/iconv.h | 0 .../iconv}/adapter/include/libcharset.h | 0 .../iconv}/adapter/include/localcharset.h | 0 {iconv => thirdparty/iconv}/bundle.json | 0 .../iconv}/docs/rom_integrate.md | 4 +- {iconv => thirdparty/iconv}/gen_test_file.sh | 0 {iconv => thirdparty/iconv}/media/GBK.png | Bin .../iconv}/media/GBK_2_UTF8.png | Bin {iconv => thirdparty/iconv}/media/UTF-8.png | Bin .../iconv}/media/UTF8_2_GBK.png | Bin {iconv => thirdparty/iconv}/media/cmp_GBK.png | Bin .../iconv}/media/cmp_UTF8.png | Bin {iconv => thirdparty/iconv}/test_GBK.txt | 0 {iconv => thirdparty/iconv}/test_UTF8.txt | 0 {jbig2enc => thirdparty/jbig2enc}/BUILD.gn | 0 .../jbig2enc}/README.OpenSource | 0 .../jbig2enc}/README_zh.md | 1 - .../jbig2enc}/adapted/init_includes.sh | 0 {jbig2enc => thirdparty/jbig2enc}/bundle.json | 0 .../jbig2enc}/docs/pic/result.png | Bin .../jbig2enc}/docs/rom_integrate.md | 4 +- {leptonica => thirdparty/leptonica}/BUILD.gn | 0 .../leptonica}/README.OpenSource | 0 .../leptonica}/README_zh.md | 0 .../leptonica}/adapted/config_auto.h | 0 .../leptonica}/adapted/endianness.h | 0 .../leptonica}/bundle.json | 0 .../leptonica}/docs/pic/color_lifting.png | Bin .../leptonica}/docs/pic/generate_pdf.png | Bin .../leptonica}/docs/pic/run_adaptmap_dark.png | Bin .../leptonica}/docs/rom_integrate.md | 11 +- .../libmp3lame}/BUILD.gn | 0 .../libmp3lame}/CHANGELOG.md | 0 .../libmp3lame}/README.OpenSource | 0 .../libmp3lame}/README_zh.md | 0 .../libmp3lame}/adapted/config.h | 0 .../libmp3lame}/bundle.json | 0 .../libmp3lame}/docs/image/result.png | Bin .../libmp3lame}/docs/rom_integrate.md | 4 +- {libtiff => thirdparty/libtiff}/BUILD.gn | 0 .../libtiff}/README.OpenSource | 0 {libtiff => thirdparty/libtiff}/README_zh.md | 0 .../libtiff}/adapted/libport_config.h | 0 .../libtiff}/adapted/tif_config.h | 0 .../libtiff}/adapted/tiffconf.h | 0 {libtiff => thirdparty/libtiff}/bundle.json | 0 .../libtiff}/docs/pic/result.png | Bin .../libtiff}/docs/rom_integrate.md | 4 +- {lzma => thirdparty/lzma}/BUILD.gn | 0 {lzma => thirdparty/lzma}/README.OpenSource | 0 {lzma => thirdparty/lzma}/README_zh.md | 0 {lzma => thirdparty/lzma}/adapted/config.h | 0 {lzma => thirdparty/lzma}/bundle.json | 0 .../lzma}/docs/pic/results.png | Bin .../lzma}/docs/rom_integrate.md | 4 +- .../minizip-ng}/BUILD.gn | 0 .../minizip-ng}/CMakeLists.txt | 0 .../minizip-ng}/README.OpenSource | 0 .../minizip-ng}/README_zh.md | 0 .../minizip-ng}/bundle.json | 0 .../minizip-ng}/docs/hap_integrate.md | 8 +- .../minizip-ng}/docs/pic/ets_results.png | Bin .../minizip-ng}/docs/pic/install.png | Bin .../minizip-ng}/docs/pic/results.png | Bin .../minizip-ng}/docs/rom_integrate.md | 6 +- {modbus => thirdparty/modbus}/BUILD.gn | 0 .../modbus}/README.OpenSource | 0 {modbus => thirdparty/modbus}/README_zh.md | 0 .../modbus}/adapted/src/config.h | 0 .../modbus}/adapted/src/modbus-version.h | 0 .../modbus}/adapted/tests/unit-test.h | 0 {modbus => thirdparty/modbus}/bundle.json | 0 .../modbus}/docs/pic/running_result.png | Bin .../modbus}/docs/rom_integrate.md | 4 +- {mqtt => thirdparty/mqtt}/BUILD.gn | 0 {mqtt => thirdparty/mqtt}/README.OpenSource | 0 {mqtt => thirdparty/mqtt}/README_zh.md | 0 .../mqtt}/adapted/src/VersionInfo.h | 0 {mqtt => thirdparty/mqtt}/bundle.json | 0 .../mqtt}/docs/pic/running_result.png | Bin .../mqtt}/docs/rom_integrate.md | 4 +- {openjpeg => thirdparty/openjpeg}/BUILD.gn | 0 .../openjpeg}/README.OpenSource | 2 +- .../openjpeg}/README_zh.md | 0 .../adapter/include/opj_apps_config.h | 0 .../openjpeg}/adapter/include/opj_config.h | 0 .../adapter/include/opj_config_private.h | 0 .../adapter/include/tiff/tif_config.h | 0 .../openjpeg}/adapter/include/tiff/tiffconf.h | 0 .../adapter/script/test_open_jpeg.sh | 0 {openjpeg => thirdparty/openjpeg}/bundle.json | 0 .../openjpeg}/docs/media/running_result.png | Bin .../openjpeg}/docs/rom_integrate.md | 4 +- {rapidjson => thirdparty/rapidjson}/BUILD.gn | 0 .../rapidjson}/README.OpenSource | 0 .../rapidjson}/README_zh.md | 0 .../rapidjson}/bundle.json | 0 .../rapidjson}/docs/pic/result.png | Bin .../rapidjson}/docs/rom_integrate.md | 6 +- .../thirdparty_template}/BUILD.gn | 0 .../thirdparty_template}/CMakeLists.txt | 0 thirdparty/thirdparty_template/HPKBUILD | 63 +++ .../thirdparty_template}/README.OpenSource | 0 thirdparty/thirdparty_template/README_zh.md | 33 ++ thirdparty/thirdparty_template/SHA512SUM | 1 + .../thirdparty_template}/adapted/config.h | 0 thirdparty/thirdparty_template/bundle.json | 30 ++ .../docs/hap_integrate.md | 0 .../docs/rom_integrate.md | 0 {tinyxml2 => thirdparty/tinyxml2}/BUILD.gn | 0 .../tinyxml2}/CMakeLists.txt | 0 .../tinyxml2}/README.OpenSource | 0 .../tinyxml2}/README_zh.md | 0 {tinyxml2 => thirdparty/tinyxml2}/bundle.json | 0 .../tinyxml2}/docs/hap_integrate.md | 2 +- .../tinyxml2}/docs/pic/hap.jpeg | Bin .../tinyxml2}/docs/pic/install.png | Bin .../tinyxml2}/docs/pic/result.png | Bin .../tinyxml2}/docs/rom_integrate.md | 4 +- thirdparty/tinyxpath/HPKBUILD | 54 +++ thirdparty/tinyxpath/README.OpenSource | 11 + thirdparty/tinyxpath/README_zh.md | 12 + thirdparty/tinyxpath/SHA512SUM | 2 + thirdparty/tinyxpath/docs/hap_integrate.md | 67 ++++ .../docs/pic/tinyxpath_install_dir.png | Bin 0 -> 6349 bytes .../tinyxpath/docs/pic/tinyxpath_test.png | Bin 0 -> 7245 bytes .../tinyxpath/docs/pic/tinyxpath_usage.png | Bin 0 -> 25259 bytes thirdparty/tinyxpath/tinyxpath_oh_pkg.patch | 129 ++++++ {unrar => thirdparty/unrar}/CMakeLists.txt | 0 {unrar => thirdparty/unrar}/README.OpenSource | 0 {unrar => thirdparty/unrar}/README_zh.md | 0 .../unrar}/docs/hap_integrate.md | 2 +- .../unrar}/docs/pic/content.png | Bin .../unrar}/docs/pic/unrar1.png | Bin {unrar => thirdparty/unrar}/package.json | 0 {xerces-c => thirdparty/xerces-c}/BUILD.gn | 0 .../xerces-c}/CMakeLists.txt | 0 .../xerces-c}/README.OpenSource | 0 .../xerces-c}/README_zh.md | 0 .../xerces-c}/adapted/config.h | 0 .../adapted/xercesc/util/XercesVersion.hpp | 0 .../xercesc/util/Xerces_autoconf_config.hpp | 0 {xerces-c => thirdparty/xerces-c}/bundle.json | 0 .../xerces-c}/docs/hap_integrate.md | 2 +- .../xerces-c}/docs/pic/content.png | Bin .../xerces-c}/docs/pic/hap_xerces_test.png | Bin .../xerces-c}/docs/pic/result.png | Bin .../xerces-c}/docs/rom_integrate.md | 4 +- {xz => thirdparty/xz}/BUILD.gn | 0 {xz => thirdparty/xz}/README.OpenSource | 0 {xz => thirdparty/xz}/README_zh.md | 0 {xz => thirdparty/xz}/adapted/config.h | 0 {xz => thirdparty/xz}/adapted/test_file.sh | 0 {xz => thirdparty/xz}/bundle.json | 0 .../xz}/docs/pic/test_result.jpg | Bin {xz => thirdparty/xz}/docs/rom_integrate.md | 4 +- {zstd => thirdparty/zstd}/BUILD.gn | 0 {zstd => thirdparty/zstd}/README.OpenSource | 0 {zstd => thirdparty/zstd}/README_zh.md | 0 {zstd => thirdparty/zstd}/bundle.json | 0 .../zstd}/docs/pic/results.png | Bin .../zstd}/docs/rom_integrate.md | 4 +- thirdparty_template/README_zh.md | 21 - thirdparty_template/ohos.build | 9 - tools/Buildtools/README.md | 25 ++ tools/Buildtools/SHA512SUM | 1 + tools/Buildtools/toolchain.tar.gz | Bin 0 -> 389 bytes tools/README.md | 48 +++ tools/build.sh | 202 ++++++++++ tools/doc/cmake_specification.md | 74 ++++ .../OHOS_SDK-Usage--depend-libs.md | 272 +++++++++++++ tools/doc/ohos_use_sdk/OHOS_SDK-Usage.md | 369 ++++++++++++++++++ .../ohos_sdk\344\270\213\350\275\275.png" | Bin 0 -> 97904 bytes tools/script/build_hpk.sh | 175 +++++++++ tools/script/envset.sh | 41 ++ tools/template/HPKBUILD | 63 +++ tools/template/README.md | 5 + tools/template/SHA512SUM | 1 + 207 files changed, 1790 insertions(+), 98 deletions(-) create mode 100755 docs/thirdparty_list.md create mode 100755 thirdparty/README_zh.md rename {bsdiff => thirdparty/bsdiff}/BUILD.gn (100%) rename {bsdiff => thirdparty/bsdiff}/README.OpenSource (100%) rename {bsdiff => thirdparty/bsdiff}/README_zh.md (100%) rename {bsdiff => thirdparty/bsdiff}/bundle.json (100%) rename {bsdiff => thirdparty/bsdiff}/docs/rom_integrate.md (95%) rename {bsdiff => thirdparty/bsdiff}/export_api.txt (100%) rename {bsdiff => thirdparty/bsdiff}/media/ohos_result.png (100%) rename {bsdiff => thirdparty/bsdiff}/testdata/note.txt (100%) rename {bsdiff => thirdparty/bsdiff}/testdata/note_new.txt (100%) rename {bsdiff => thirdparty/bsdiff}/testdata/run_test.sh (100%) rename {bsdiff => thirdparty/bsdiff}/tested_api.txt (100%) rename {concurrentqueue => thirdparty/concurrentqueue}/BUILD.gn (100%) rename {concurrentqueue => thirdparty/concurrentqueue}/CHANGELOG.md (100%) rename {concurrentqueue => thirdparty/concurrentqueue}/CMakeLists.txt (100%) rename {concurrentqueue => thirdparty/concurrentqueue}/README.OpenSource (100%) rename {concurrentqueue => thirdparty/concurrentqueue}/README_zh.md (100%) rename {concurrentqueue => thirdparty/concurrentqueue}/bundle.json (100%) rename {concurrentqueue => thirdparty/concurrentqueue}/docs/hap_integrate.md (96%) rename {concurrentqueue => thirdparty/concurrentqueue}/docs/pic/hap.jpeg (100%) rename {concurrentqueue => thirdparty/concurrentqueue}/docs/pic/result.PNG (100%) rename {concurrentqueue => thirdparty/concurrentqueue}/docs/rom_integrate.md (96%) rename {iconv => thirdparty/iconv}/BUILD.gn (100%) rename {iconv => thirdparty/iconv}/Makefile (100%) rename {iconv => thirdparty/iconv}/README.OpenSource (100%) rename {iconv => thirdparty/iconv}/README_zh.md (100%) rename {iconv => thirdparty/iconv}/adapter/include/config.h (100%) rename {iconv => thirdparty/iconv}/adapter/include/iconv.h (100%) rename {iconv => thirdparty/iconv}/adapter/include/libcharset.h (100%) rename {iconv => thirdparty/iconv}/adapter/include/localcharset.h (100%) rename {iconv => thirdparty/iconv}/bundle.json (100%) rename {iconv => thirdparty/iconv}/docs/rom_integrate.md (95%) rename {iconv => thirdparty/iconv}/gen_test_file.sh (100%) rename {iconv => thirdparty/iconv}/media/GBK.png (100%) rename {iconv => thirdparty/iconv}/media/GBK_2_UTF8.png (100%) rename {iconv => thirdparty/iconv}/media/UTF-8.png (100%) rename {iconv => thirdparty/iconv}/media/UTF8_2_GBK.png (100%) rename {iconv => thirdparty/iconv}/media/cmp_GBK.png (100%) rename {iconv => thirdparty/iconv}/media/cmp_UTF8.png (100%) rename {iconv => thirdparty/iconv}/test_GBK.txt (100%) rename {iconv => thirdparty/iconv}/test_UTF8.txt (100%) rename {jbig2enc => thirdparty/jbig2enc}/BUILD.gn (100%) rename {jbig2enc => thirdparty/jbig2enc}/README.OpenSource (100%) rename {jbig2enc => thirdparty/jbig2enc}/README_zh.md (95%) rename {jbig2enc => thirdparty/jbig2enc}/adapted/init_includes.sh (100%) rename {jbig2enc => thirdparty/jbig2enc}/bundle.json (100%) rename {jbig2enc => thirdparty/jbig2enc}/docs/pic/result.png (100%) rename {jbig2enc => thirdparty/jbig2enc}/docs/rom_integrate.md (95%) rename {leptonica => thirdparty/leptonica}/BUILD.gn (100%) rename {leptonica => thirdparty/leptonica}/README.OpenSource (100%) rename {leptonica => thirdparty/leptonica}/README_zh.md (100%) rename {leptonica => thirdparty/leptonica}/adapted/config_auto.h (100%) rename {leptonica => thirdparty/leptonica}/adapted/endianness.h (100%) rename {leptonica => thirdparty/leptonica}/bundle.json (100%) rename {leptonica => thirdparty/leptonica}/docs/pic/color_lifting.png (100%) rename {leptonica => thirdparty/leptonica}/docs/pic/generate_pdf.png (100%) rename {leptonica => thirdparty/leptonica}/docs/pic/run_adaptmap_dark.png (100%) rename {leptonica => thirdparty/leptonica}/docs/rom_integrate.md (94%) rename {libmp3lame => thirdparty/libmp3lame}/BUILD.gn (100%) rename {libmp3lame => thirdparty/libmp3lame}/CHANGELOG.md (100%) rename {libmp3lame => thirdparty/libmp3lame}/README.OpenSource (100%) rename {libmp3lame => thirdparty/libmp3lame}/README_zh.md (100%) rename {libmp3lame => thirdparty/libmp3lame}/adapted/config.h (100%) rename {libmp3lame => thirdparty/libmp3lame}/bundle.json (100%) rename {libmp3lame => thirdparty/libmp3lame}/docs/image/result.png (100%) rename {libmp3lame => thirdparty/libmp3lame}/docs/rom_integrate.md (97%) rename {libtiff => thirdparty/libtiff}/BUILD.gn (100%) rename {libtiff => thirdparty/libtiff}/README.OpenSource (100%) rename {libtiff => thirdparty/libtiff}/README_zh.md (100%) rename {libtiff => thirdparty/libtiff}/adapted/libport_config.h (100%) rename {libtiff => thirdparty/libtiff}/adapted/tif_config.h (100%) rename {libtiff => thirdparty/libtiff}/adapted/tiffconf.h (100%) rename {libtiff => thirdparty/libtiff}/bundle.json (100%) rename {libtiff => thirdparty/libtiff}/docs/pic/result.png (100%) rename {libtiff => thirdparty/libtiff}/docs/rom_integrate.md (95%) rename {lzma => thirdparty/lzma}/BUILD.gn (100%) rename {lzma => thirdparty/lzma}/README.OpenSource (100%) rename {lzma => thirdparty/lzma}/README_zh.md (100%) rename {lzma => thirdparty/lzma}/adapted/config.h (100%) rename {lzma => thirdparty/lzma}/bundle.json (100%) rename {lzma => thirdparty/lzma}/docs/pic/results.png (100%) rename {lzma => thirdparty/lzma}/docs/rom_integrate.md (98%) rename {minizip-ng => thirdparty/minizip-ng}/BUILD.gn (100%) rename {minizip-ng => thirdparty/minizip-ng}/CMakeLists.txt (100%) rename {minizip-ng => thirdparty/minizip-ng}/README.OpenSource (100%) rename {minizip-ng => thirdparty/minizip-ng}/README_zh.md (100%) rename {minizip-ng => thirdparty/minizip-ng}/bundle.json (100%) rename {minizip-ng => thirdparty/minizip-ng}/docs/hap_integrate.md (89%) rename {minizip-ng => thirdparty/minizip-ng}/docs/pic/ets_results.png (100%) rename {minizip-ng => thirdparty/minizip-ng}/docs/pic/install.png (100%) rename {minizip-ng => thirdparty/minizip-ng}/docs/pic/results.png (100%) rename {minizip-ng => thirdparty/minizip-ng}/docs/rom_integrate.md (97%) rename {modbus => thirdparty/modbus}/BUILD.gn (100%) rename {modbus => thirdparty/modbus}/README.OpenSource (100%) rename {modbus => thirdparty/modbus}/README_zh.md (100%) rename {modbus => thirdparty/modbus}/adapted/src/config.h (100%) rename {modbus => thirdparty/modbus}/adapted/src/modbus-version.h (100%) rename {modbus => thirdparty/modbus}/adapted/tests/unit-test.h (100%) rename {modbus => thirdparty/modbus}/bundle.json (100%) rename {modbus => thirdparty/modbus}/docs/pic/running_result.png (100%) rename {modbus => thirdparty/modbus}/docs/rom_integrate.md (94%) rename {mqtt => thirdparty/mqtt}/BUILD.gn (100%) rename {mqtt => thirdparty/mqtt}/README.OpenSource (100%) rename {mqtt => thirdparty/mqtt}/README_zh.md (100%) rename {mqtt => thirdparty/mqtt}/adapted/src/VersionInfo.h (100%) rename {mqtt => thirdparty/mqtt}/bundle.json (100%) rename {mqtt => thirdparty/mqtt}/docs/pic/running_result.png (100%) rename {mqtt => thirdparty/mqtt}/docs/rom_integrate.md (94%) rename {openjpeg => thirdparty/openjpeg}/BUILD.gn (100%) rename {openjpeg => thirdparty/openjpeg}/README.OpenSource (91%) rename {openjpeg => thirdparty/openjpeg}/README_zh.md (100%) rename {openjpeg => thirdparty/openjpeg}/adapter/include/opj_apps_config.h (100%) rename {openjpeg => thirdparty/openjpeg}/adapter/include/opj_config.h (100%) rename {openjpeg => thirdparty/openjpeg}/adapter/include/opj_config_private.h (100%) rename {openjpeg => thirdparty/openjpeg}/adapter/include/tiff/tif_config.h (100%) rename {openjpeg => thirdparty/openjpeg}/adapter/include/tiff/tiffconf.h (100%) rename {openjpeg => thirdparty/openjpeg}/adapter/script/test_open_jpeg.sh (100%) rename {openjpeg => thirdparty/openjpeg}/bundle.json (100%) rename {openjpeg => thirdparty/openjpeg}/docs/media/running_result.png (100%) rename {openjpeg => thirdparty/openjpeg}/docs/rom_integrate.md (94%) rename {rapidjson => thirdparty/rapidjson}/BUILD.gn (100%) rename {rapidjson => thirdparty/rapidjson}/README.OpenSource (100%) rename {rapidjson => thirdparty/rapidjson}/README_zh.md (100%) rename {rapidjson => thirdparty/rapidjson}/bundle.json (100%) rename {rapidjson => thirdparty/rapidjson}/docs/pic/result.png (100%) rename {rapidjson => thirdparty/rapidjson}/docs/rom_integrate.md (95%) rename {thirdparty_template => thirdparty/thirdparty_template}/BUILD.gn (100%) rename {thirdparty_template => thirdparty/thirdparty_template}/CMakeLists.txt (100%) create mode 100755 thirdparty/thirdparty_template/HPKBUILD rename {thirdparty_template => thirdparty/thirdparty_template}/README.OpenSource (100%) create mode 100755 thirdparty/thirdparty_template/README_zh.md create mode 100755 thirdparty/thirdparty_template/SHA512SUM rename {thirdparty_template => thirdparty/thirdparty_template}/adapted/config.h (100%) create mode 100755 thirdparty/thirdparty_template/bundle.json rename {thirdparty_template => thirdparty/thirdparty_template}/docs/hap_integrate.md (100%) rename {thirdparty_template => thirdparty/thirdparty_template}/docs/rom_integrate.md (100%) rename {tinyxml2 => thirdparty/tinyxml2}/BUILD.gn (100%) rename {tinyxml2 => thirdparty/tinyxml2}/CMakeLists.txt (100%) rename {tinyxml2 => thirdparty/tinyxml2}/README.OpenSource (100%) rename {tinyxml2 => thirdparty/tinyxml2}/README_zh.md (100%) rename {tinyxml2 => thirdparty/tinyxml2}/bundle.json (100%) rename {tinyxml2 => thirdparty/tinyxml2}/docs/hap_integrate.md (97%) rename {tinyxml2 => thirdparty/tinyxml2}/docs/pic/hap.jpeg (100%) rename {tinyxml2 => thirdparty/tinyxml2}/docs/pic/install.png (100%) rename {tinyxml2 => thirdparty/tinyxml2}/docs/pic/result.png (100%) rename {tinyxml2 => thirdparty/tinyxml2}/docs/rom_integrate.md (97%) create mode 100755 thirdparty/tinyxpath/HPKBUILD create mode 100755 thirdparty/tinyxpath/README.OpenSource create mode 100755 thirdparty/tinyxpath/README_zh.md create mode 100755 thirdparty/tinyxpath/SHA512SUM create mode 100755 thirdparty/tinyxpath/docs/hap_integrate.md create mode 100755 thirdparty/tinyxpath/docs/pic/tinyxpath_install_dir.png create mode 100755 thirdparty/tinyxpath/docs/pic/tinyxpath_test.png create mode 100755 thirdparty/tinyxpath/docs/pic/tinyxpath_usage.png create mode 100755 thirdparty/tinyxpath/tinyxpath_oh_pkg.patch rename {unrar => thirdparty/unrar}/CMakeLists.txt (100%) rename {unrar => thirdparty/unrar}/README.OpenSource (100%) rename {unrar => thirdparty/unrar}/README_zh.md (100%) rename {unrar => thirdparty/unrar}/docs/hap_integrate.md (97%) rename {unrar => thirdparty/unrar}/docs/pic/content.png (100%) rename {unrar => thirdparty/unrar}/docs/pic/unrar1.png (100%) rename {unrar => thirdparty/unrar}/package.json (100%) rename {xerces-c => thirdparty/xerces-c}/BUILD.gn (100%) rename {xerces-c => thirdparty/xerces-c}/CMakeLists.txt (100%) rename {xerces-c => thirdparty/xerces-c}/README.OpenSource (100%) rename {xerces-c => thirdparty/xerces-c}/README_zh.md (100%) rename {xerces-c => thirdparty/xerces-c}/adapted/config.h (100%) rename {xerces-c => thirdparty/xerces-c}/adapted/xercesc/util/XercesVersion.hpp (100%) rename {xerces-c => thirdparty/xerces-c}/adapted/xercesc/util/Xerces_autoconf_config.hpp (100%) rename {xerces-c => thirdparty/xerces-c}/bundle.json (100%) rename {xerces-c => thirdparty/xerces-c}/docs/hap_integrate.md (96%) rename {xerces-c => thirdparty/xerces-c}/docs/pic/content.png (100%) rename {xerces-c => thirdparty/xerces-c}/docs/pic/hap_xerces_test.png (100%) rename {xerces-c => thirdparty/xerces-c}/docs/pic/result.png (100%) rename {xerces-c => thirdparty/xerces-c}/docs/rom_integrate.md (95%) rename {xz => thirdparty/xz}/BUILD.gn (100%) rename {xz => thirdparty/xz}/README.OpenSource (100%) rename {xz => thirdparty/xz}/README_zh.md (100%) rename {xz => thirdparty/xz}/adapted/config.h (100%) rename {xz => thirdparty/xz}/adapted/test_file.sh (100%) rename {xz => thirdparty/xz}/bundle.json (100%) rename {xz => thirdparty/xz}/docs/pic/test_result.jpg (100%) rename {xz => thirdparty/xz}/docs/rom_integrate.md (94%) rename {zstd => thirdparty/zstd}/BUILD.gn (100%) rename {zstd => thirdparty/zstd}/README.OpenSource (100%) rename {zstd => thirdparty/zstd}/README_zh.md (100%) rename {zstd => thirdparty/zstd}/bundle.json (100%) rename {zstd => thirdparty/zstd}/docs/pic/results.png (100%) rename {zstd => thirdparty/zstd}/docs/rom_integrate.md (98%) delete mode 100755 thirdparty_template/README_zh.md delete mode 100755 thirdparty_template/ohos.build create mode 100755 tools/Buildtools/README.md create mode 100755 tools/Buildtools/SHA512SUM create mode 100755 tools/Buildtools/toolchain.tar.gz create mode 100755 tools/README.md create mode 100755 tools/build.sh create mode 100755 tools/doc/cmake_specification.md create mode 100755 tools/doc/ohos_use_sdk/OHOS_SDK-Usage--depend-libs.md create mode 100755 tools/doc/ohos_use_sdk/OHOS_SDK-Usage.md create mode 100755 "tools/doc/ohos_use_sdk/ohos_sdk\344\270\213\350\275\275.png" create mode 100755 tools/script/build_hpk.sh create mode 100755 tools/script/envset.sh create mode 100755 tools/template/HPKBUILD create mode 100755 tools/template/README.md create mode 100755 tools/template/SHA512SUM diff --git a/README_zh.md b/README_zh.md index 192da1ee..6ca93132 100755 --- a/README_zh.md +++ b/README_zh.md @@ -1,7 +1,7 @@ # tpc_c_cplusplus ## 简介 -本仓库主要用于存放已经适配OpenHarmony的C/C++三方库的适配脚本,三方库的适配/使用指导;每个三方库目录下包含了GN化的适配指导、编译脚本和包含了cmake的适配指导、编译脚本。 +本仓库主要用于存放已经适配OpenHarmony的C/C++三方库的适配脚本和OpenHarmony三方库适配指导文档、三方库适配相关的工具。 @@ -10,22 +10,9 @@ ``` tpc_c_cplusplus ├── README_zh.md #仓库主页 -├── common #仓库通用说明文档的文件夹 -├── thirdparty_template #三方库模板文件夹 -│ ├──README_zh.md #三方库简介 -│ ├──README.OpenSource #说明三方库源码的下载地址,版本,license等信息 -│ ├──ohos.build #三方库组件定义文件 -│ ├──CMakeLists.txt #构建脚本,支持hap包集成 -│ ├──BUILD.gn #构建脚本,支持rom包集成 -│ ├──adapted #该目录存放三方库适配需要的代码文件 -│ │ ├──config.h #例如配置文件 -│ │ ├──... #其他适配文件 -│ ├──docs #存放三方库相关文档的文件夹 -│ │ ├──rom_integrate.md #rom集成说明文档 -│ │ ├──hap_integrate.md #hap集成说明文档 -│ │ ├── ... #其他说明文档 -├── thirdparty1 #三方库文件夹,内容和thirdparty_template模板的格式一样 -├── thirdparty2 #三方库文件夹,内容和thirdparty_template模板的格式一样 +├── docs #说明文档/三方库适配文档 +├── tools #三方库适配相关工具 +├── thirdparty #已经适配OpenHarmony的三方库的构建脚本 ...... ``` @@ -35,8 +22,10 @@ tpc_c_cplusplus - [遵守仓库目录结构](#本仓库目录) - [遵守OpenHarmony编码贡献规范](https://gitee.com/openharmony-sig/knowledge_demo_smart_home/blob/master/dev/docs/contribute/README.md) -- [三方库模板目录](thirdparty_template) +- [贡献三方库](thirdparty/README_zh.md) ## 三方库列表 + +- [C/C++三方库列表](docs/thirdparty_list.md) diff --git a/docs/thirdparty_list.md b/docs/thirdparty_list.md new file mode 100755 index 00000000..9b5e4e1e --- /dev/null +++ b/docs/thirdparty_list.md @@ -0,0 +1,24 @@ +# 三方库列表 + +| 三方库名称 | 开源协议 | 南向 | 北向 | +| ------------------------------------------------------------ | --------------------------- | ---- | ---- | +| [xerces-c](../thirdparty/xerces-c/README_zh.md) | Apache License 2.0 | 是 | 是 | +| [modbus](../thirdparty/modbus/README_zh.md) | LGPL v2.1 or Later | 是 | | +| [tinyxpath](../thirdparty/tinyxpath/README_zh.md) | zlib/libpng License | | 是 | +| [bsdiff](../thirdparty/bsdiff/README_zh.md) | BSD 2-clause license | 是 | | +| [concurrentqueue](../thirdparty/concurrentqueue/README_zh.md) | BSD License | 是 | 是 | +| [iconv](../thirdparty/iconv/README_zh.md) | LGPLv3.0 | 是 | | +| [jbig2enc](../thirdparty/jbig2enc/README_zh.md) | Apache License | 是 | | +| [leptonica](../thirdparty/leptonica/README_zh.md) | leptonica-license | 是 | | +| [libmp3lame](../thirdparty/libmp3lame/README_zh.md) | LGPL | 是 | | +| [libtiff](../thirdparty/libtiff/README_zh.md) | libtiff License | 是 | | +| [lzma](../thirdparty/lzma/README_zh.md) | GNU LGPLv2+ | 是 | | +| [minizip-ng](../thirdparty/minizip-ng/README_zh.md) | zlib License | 是 | 是 | +| [mqtt](../thirdparty/mqtt/README_zh.md) | Eclipse Public License v2.0 | 是 | | +| [openjpeg](../thirdparty/openjpeg/README_zh.md) | 2-clauses BSD license | 是 | | +| [rapidjson](../thirdparty/rapidjson/README_zh.md) | MIT license | 是 | | +| [tinyxml2](../thirdparty/tinyxml2/README_zh.md) | zlib license | 是 | 是 | +| [unrar](../thirdparty/unrar/README_zh.md) | Apache License 2.0 | | 是 | +| [xz](../thirdparty/xz/README_zh.md) | GPLv2 | 是 | | +| [zstd](../thirdparty/zstd/README_zh.md) | BSD and GPLv2 | 是 | | + diff --git a/thirdparty/README_zh.md b/thirdparty/README_zh.md new file mode 100755 index 00000000..a046dcb7 --- /dev/null +++ b/thirdparty/README_zh.md @@ -0,0 +1,33 @@ +## 目录结构 + +``` +tpc_c_cplusplus/thirdparty +├── README_zh.md #仓库主页 +├── common #仓库通用说明文档的文件夹 +├── thirdparty_template #三方库模板文件夹 +│ ├──README_zh.md #三方库简介 +│ ├──README.OpenSource #说明三方库源码的下载地址,版本,license等信息 +│ ├──bundle.json #三方库组件定义文件 +│ ├──CMakeLists.txt #构建脚本,支持hap包集成 +│ ├──HPKBUILD #交叉构建脚本,使用原库自带脚本编译,支持hap包集成 +│ ├──SHA512SUM #压缩包校验文件,和HPKBUILD一起使用 +│ ├──BUILD.gn #构建脚本,支持rom包集成 +│ ├──adapted #该目录存放三方库适配需要的代码文件 +│ │ ├──config.h #例如配置文件 +│ │ ├──... #其他适配文件 +│ ├──docs #存放三方库相关文档的文件夹 +│ │ ├──rom_integrate.md #rom集成说明文档 +│ │ ├──hap_integrate.md #hap集成说明文档 +│ │ ├── ... #其他说明文档 +├── thirdparty1 #三方库文件夹,内容和thirdparty_template模板的格式一样 +├── thirdparty2 #三方库文件夹,内容和thirdparty_template模板的格式一样 +...... +``` + + + +## 如何贡献 + +- [遵守仓库目录结构](#本仓库目录) +- [遵守OpenHarmony编码贡献规范](https://gitee.com/openharmony-sig/knowledge_demo_smart_home/blob/master/dev/docs/contribute/README.md) +- [三方库模板目录](thirdparty_template) diff --git a/bsdiff/BUILD.gn b/thirdparty/bsdiff/BUILD.gn similarity index 100% rename from bsdiff/BUILD.gn rename to thirdparty/bsdiff/BUILD.gn diff --git a/bsdiff/README.OpenSource b/thirdparty/bsdiff/README.OpenSource similarity index 100% rename from bsdiff/README.OpenSource rename to thirdparty/bsdiff/README.OpenSource diff --git a/bsdiff/README_zh.md b/thirdparty/bsdiff/README_zh.md similarity index 100% rename from bsdiff/README_zh.md rename to thirdparty/bsdiff/README_zh.md diff --git a/bsdiff/bundle.json b/thirdparty/bsdiff/bundle.json similarity index 100% rename from bsdiff/bundle.json rename to thirdparty/bsdiff/bundle.json diff --git a/bsdiff/docs/rom_integrate.md b/thirdparty/bsdiff/docs/rom_integrate.md similarity index 95% rename from bsdiff/docs/rom_integrate.md rename to thirdparty/bsdiff/docs/rom_integrate.md index 41adb558..1684dc12 100755 --- a/bsdiff/docs/rom_integrate.md +++ b/thirdparty/bsdiff/docs/rom_integrate.md @@ -21,7 +21,7 @@ RK3568开发板如何使用可以参照[润和RK3568开发板标准系统快速 - 仓库代码目录结构说明 ```shell - cd ~/tpc_c_cplusplus/bsdiff/ ## 进入到仓库代码库目录 + cd ~/tpc_c_cplusplus/thirdparty/bsdiff/ ## 进入到仓库代码库目录 ``` ```sh @@ -43,7 +43,7 @@ RK3568开发板如何使用可以参照[润和RK3568开发板标准系统快速 - 将本仓库bsdiff文件夹拷贝到OpenHarmony的third_party下 ```shell - cp -arf ~/tpc_c_cplusplus/bsdiff ~/OpenHarmony/third_party + cp -arf ~/tpc_c_cplusplus/thirdparty/bsdiff ~/OpenHarmony/third_party ``` ### 准备三方库源码 diff --git a/bsdiff/export_api.txt b/thirdparty/bsdiff/export_api.txt similarity index 100% rename from bsdiff/export_api.txt rename to thirdparty/bsdiff/export_api.txt diff --git a/bsdiff/media/ohos_result.png b/thirdparty/bsdiff/media/ohos_result.png similarity index 100% rename from bsdiff/media/ohos_result.png rename to thirdparty/bsdiff/media/ohos_result.png diff --git a/bsdiff/testdata/note.txt b/thirdparty/bsdiff/testdata/note.txt similarity index 100% rename from bsdiff/testdata/note.txt rename to thirdparty/bsdiff/testdata/note.txt diff --git a/bsdiff/testdata/note_new.txt b/thirdparty/bsdiff/testdata/note_new.txt similarity index 100% rename from bsdiff/testdata/note_new.txt rename to thirdparty/bsdiff/testdata/note_new.txt diff --git a/bsdiff/testdata/run_test.sh b/thirdparty/bsdiff/testdata/run_test.sh similarity index 100% rename from bsdiff/testdata/run_test.sh rename to thirdparty/bsdiff/testdata/run_test.sh diff --git a/bsdiff/tested_api.txt b/thirdparty/bsdiff/tested_api.txt similarity index 100% rename from bsdiff/tested_api.txt rename to thirdparty/bsdiff/tested_api.txt diff --git a/concurrentqueue/BUILD.gn b/thirdparty/concurrentqueue/BUILD.gn similarity index 100% rename from concurrentqueue/BUILD.gn rename to thirdparty/concurrentqueue/BUILD.gn diff --git a/concurrentqueue/CHANGELOG.md b/thirdparty/concurrentqueue/CHANGELOG.md similarity index 100% rename from concurrentqueue/CHANGELOG.md rename to thirdparty/concurrentqueue/CHANGELOG.md diff --git a/concurrentqueue/CMakeLists.txt b/thirdparty/concurrentqueue/CMakeLists.txt similarity index 100% rename from concurrentqueue/CMakeLists.txt rename to thirdparty/concurrentqueue/CMakeLists.txt diff --git a/concurrentqueue/README.OpenSource b/thirdparty/concurrentqueue/README.OpenSource similarity index 100% rename from concurrentqueue/README.OpenSource rename to thirdparty/concurrentqueue/README.OpenSource diff --git a/concurrentqueue/README_zh.md b/thirdparty/concurrentqueue/README_zh.md similarity index 100% rename from concurrentqueue/README_zh.md rename to thirdparty/concurrentqueue/README_zh.md diff --git a/concurrentqueue/bundle.json b/thirdparty/concurrentqueue/bundle.json similarity index 100% rename from concurrentqueue/bundle.json rename to thirdparty/concurrentqueue/bundle.json diff --git a/concurrentqueue/docs/hap_integrate.md b/thirdparty/concurrentqueue/docs/hap_integrate.md similarity index 96% rename from concurrentqueue/docs/hap_integrate.md rename to thirdparty/concurrentqueue/docs/hap_integrate.md index 6cf2db88..ba148488 100644 --- a/concurrentqueue/docs/hap_integrate.md +++ b/thirdparty/concurrentqueue/docs/hap_integrate.md @@ -7,7 +7,7 @@ - 下载本仓库,并解压 - 三方库目录结构 ``` - tpc_c_cplusplus/concurrentqueue #三方库concurrentqueue的目录结构如下 + tpc_c_cplusplus/thirdparty/concurrentqueue #三方库concurrentqueue的目录结构如下 ├── docs #存放三方库相关文档的文件夹 ├── CmakeLists.txt #构建脚本,支持hap包集成 ├── bundle.json #三方库组件定义文件 diff --git a/concurrentqueue/docs/pic/hap.jpeg b/thirdparty/concurrentqueue/docs/pic/hap.jpeg similarity index 100% rename from concurrentqueue/docs/pic/hap.jpeg rename to thirdparty/concurrentqueue/docs/pic/hap.jpeg diff --git a/concurrentqueue/docs/pic/result.PNG b/thirdparty/concurrentqueue/docs/pic/result.PNG similarity index 100% rename from concurrentqueue/docs/pic/result.PNG rename to thirdparty/concurrentqueue/docs/pic/result.PNG diff --git a/concurrentqueue/docs/rom_integrate.md b/thirdparty/concurrentqueue/docs/rom_integrate.md similarity index 96% rename from concurrentqueue/docs/rom_integrate.md rename to thirdparty/concurrentqueue/docs/rom_integrate.md index 7a5f15fd..2751e951 100644 --- a/concurrentqueue/docs/rom_integrate.md +++ b/thirdparty/concurrentqueue/docs/rom_integrate.md @@ -11,7 +11,7 @@ ``` - 三方库目录结构 ``` - tpc_c_cplusplus/concurrentqueue #三方库concurrentqueue的目录结构如下 + tpc_c_cplusplus/thirdparty/concurrentqueue #三方库concurrentqueue的目录结构如下 ├── docs #存放三方库相关文档的文件夹 ├── BUILD.gn #构建脚本,支持rom包集成 ├── bundle.json #三方库组件定义文件 @@ -20,7 +20,7 @@ ``` - 将三方库拷贝到OpenHarmony源码的third_party目录下 ``` - cp ~/tpc_c_cplusplus/concurrentqueue ~/openharmony/third_party -rf + cp ~/tpc_c_cplusplus/thirdparty/concurrentqueue ~/openharmony/third_party -rf ``` ### 准备三方库源码 ``` diff --git a/iconv/BUILD.gn b/thirdparty/iconv/BUILD.gn similarity index 100% rename from iconv/BUILD.gn rename to thirdparty/iconv/BUILD.gn diff --git a/iconv/Makefile b/thirdparty/iconv/Makefile similarity index 100% rename from iconv/Makefile rename to thirdparty/iconv/Makefile diff --git a/iconv/README.OpenSource b/thirdparty/iconv/README.OpenSource similarity index 100% rename from iconv/README.OpenSource rename to thirdparty/iconv/README.OpenSource diff --git a/iconv/README_zh.md b/thirdparty/iconv/README_zh.md similarity index 100% rename from iconv/README_zh.md rename to thirdparty/iconv/README_zh.md diff --git a/iconv/adapter/include/config.h b/thirdparty/iconv/adapter/include/config.h similarity index 100% rename from iconv/adapter/include/config.h rename to thirdparty/iconv/adapter/include/config.h diff --git a/iconv/adapter/include/iconv.h b/thirdparty/iconv/adapter/include/iconv.h similarity index 100% rename from iconv/adapter/include/iconv.h rename to thirdparty/iconv/adapter/include/iconv.h diff --git a/iconv/adapter/include/libcharset.h b/thirdparty/iconv/adapter/include/libcharset.h similarity index 100% rename from iconv/adapter/include/libcharset.h rename to thirdparty/iconv/adapter/include/libcharset.h diff --git a/iconv/adapter/include/localcharset.h b/thirdparty/iconv/adapter/include/localcharset.h similarity index 100% rename from iconv/adapter/include/localcharset.h rename to thirdparty/iconv/adapter/include/localcharset.h diff --git a/iconv/bundle.json b/thirdparty/iconv/bundle.json similarity index 100% rename from iconv/bundle.json rename to thirdparty/iconv/bundle.json diff --git a/iconv/docs/rom_integrate.md b/thirdparty/iconv/docs/rom_integrate.md similarity index 95% rename from iconv/docs/rom_integrate.md rename to thirdparty/iconv/docs/rom_integrate.md index 14b552ef..e195c5a2 100755 --- a/iconv/docs/rom_integrate.md +++ b/thirdparty/iconv/docs/rom_integrate.md @@ -12,7 +12,7 @@ RK3568开发板如何使用可以参照[润和RK3568开发板标准系统快速 ``` - 仓库代码目录结构说明 ```shell - cd ~/tpc_c_cplusplus/iconv/ # 进入到仓库代码库目录 + cd ~/tpc_c_cplusplus/thirdparty/iconv/ # 进入到仓库代码库目录 ``` ```sh iconv @@ -35,7 +35,7 @@ RK3568开发板如何使用可以参照[润和RK3568开发板标准系统快速 ``` - 将本仓库iconv文件夹拷贝到OpenHarmony的third_party下 ```shell - cp -arf ~/tpc_c_cplusplus/iconv ~/OpenHarmony/third_party + cp -arf ~/tpc_c_cplusplus/thirdparty/iconv ~/OpenHarmony/third_party ``` ### 准备三方库源码 + 将源码下载到iconv目录并将其解压出来。 diff --git a/iconv/gen_test_file.sh b/thirdparty/iconv/gen_test_file.sh similarity index 100% rename from iconv/gen_test_file.sh rename to thirdparty/iconv/gen_test_file.sh diff --git a/iconv/media/GBK.png b/thirdparty/iconv/media/GBK.png similarity index 100% rename from iconv/media/GBK.png rename to thirdparty/iconv/media/GBK.png diff --git a/iconv/media/GBK_2_UTF8.png b/thirdparty/iconv/media/GBK_2_UTF8.png similarity index 100% rename from iconv/media/GBK_2_UTF8.png rename to thirdparty/iconv/media/GBK_2_UTF8.png diff --git a/iconv/media/UTF-8.png b/thirdparty/iconv/media/UTF-8.png similarity index 100% rename from iconv/media/UTF-8.png rename to thirdparty/iconv/media/UTF-8.png diff --git a/iconv/media/UTF8_2_GBK.png b/thirdparty/iconv/media/UTF8_2_GBK.png similarity index 100% rename from iconv/media/UTF8_2_GBK.png rename to thirdparty/iconv/media/UTF8_2_GBK.png diff --git a/iconv/media/cmp_GBK.png b/thirdparty/iconv/media/cmp_GBK.png similarity index 100% rename from iconv/media/cmp_GBK.png rename to thirdparty/iconv/media/cmp_GBK.png diff --git a/iconv/media/cmp_UTF8.png b/thirdparty/iconv/media/cmp_UTF8.png similarity index 100% rename from iconv/media/cmp_UTF8.png rename to thirdparty/iconv/media/cmp_UTF8.png diff --git a/iconv/test_GBK.txt b/thirdparty/iconv/test_GBK.txt similarity index 100% rename from iconv/test_GBK.txt rename to thirdparty/iconv/test_GBK.txt diff --git a/iconv/test_UTF8.txt b/thirdparty/iconv/test_UTF8.txt similarity index 100% rename from iconv/test_UTF8.txt rename to thirdparty/iconv/test_UTF8.txt diff --git a/jbig2enc/BUILD.gn b/thirdparty/jbig2enc/BUILD.gn similarity index 100% rename from jbig2enc/BUILD.gn rename to thirdparty/jbig2enc/BUILD.gn diff --git a/jbig2enc/README.OpenSource b/thirdparty/jbig2enc/README.OpenSource similarity index 100% rename from jbig2enc/README.OpenSource rename to thirdparty/jbig2enc/README.OpenSource diff --git a/jbig2enc/README_zh.md b/thirdparty/jbig2enc/README_zh.md similarity index 95% rename from jbig2enc/README_zh.md rename to thirdparty/jbig2enc/README_zh.md index 14c8f126..e3938fed 100755 --- a/jbig2enc/README_zh.md +++ b/thirdparty/jbig2enc/README_zh.md @@ -14,4 +14,3 @@ jbig2enc是 JBIG2文件的编码器。 ## 集成方式 - [系统Rom包集成](./docs/rom_integrate.md) - diff --git a/jbig2enc/adapted/init_includes.sh b/thirdparty/jbig2enc/adapted/init_includes.sh similarity index 100% rename from jbig2enc/adapted/init_includes.sh rename to thirdparty/jbig2enc/adapted/init_includes.sh diff --git a/jbig2enc/bundle.json b/thirdparty/jbig2enc/bundle.json similarity index 100% rename from jbig2enc/bundle.json rename to thirdparty/jbig2enc/bundle.json diff --git a/jbig2enc/docs/pic/result.png b/thirdparty/jbig2enc/docs/pic/result.png similarity index 100% rename from jbig2enc/docs/pic/result.png rename to thirdparty/jbig2enc/docs/pic/result.png diff --git a/jbig2enc/docs/rom_integrate.md b/thirdparty/jbig2enc/docs/rom_integrate.md similarity index 95% rename from jbig2enc/docs/rom_integrate.md rename to thirdparty/jbig2enc/docs/rom_integrate.md index 99d0cf49..ae55c926 100755 --- a/jbig2enc/docs/rom_integrate.md +++ b/thirdparty/jbig2enc/docs/rom_integrate.md @@ -11,7 +11,7 @@ ``` - 三方库目录结构 ``` - tpc_c_cplusplus/jbig2enc #三方库jbig2enc的目录结构如下 + tpc_c_cplusplus/thirdparty/jbig2enc #三方库jbig2enc的目录结构如下 ├── adapted #存放三方库适配需要的代码文件 ├── docs #存放三方库相关文档的文件夹 ├── BUILD.gn #构建脚本,支持rom包集成 @@ -21,7 +21,7 @@ ``` - 将三方库拷贝到OpenHarmony源码的third_party目录下 ``` - cp ~/tpc_c_cplusplus/jbig2enc ~/openharmony/third_party -rf + cp ~/tpc_c_cplusplus/thirdparty/jbig2enc ~/openharmony/third_party -rf ``` ### 准备三方库源码 diff --git a/leptonica/BUILD.gn b/thirdparty/leptonica/BUILD.gn similarity index 100% rename from leptonica/BUILD.gn rename to thirdparty/leptonica/BUILD.gn diff --git a/leptonica/README.OpenSource b/thirdparty/leptonica/README.OpenSource similarity index 100% rename from leptonica/README.OpenSource rename to thirdparty/leptonica/README.OpenSource diff --git a/leptonica/README_zh.md b/thirdparty/leptonica/README_zh.md similarity index 100% rename from leptonica/README_zh.md rename to thirdparty/leptonica/README_zh.md diff --git a/leptonica/adapted/config_auto.h b/thirdparty/leptonica/adapted/config_auto.h similarity index 100% rename from leptonica/adapted/config_auto.h rename to thirdparty/leptonica/adapted/config_auto.h diff --git a/leptonica/adapted/endianness.h b/thirdparty/leptonica/adapted/endianness.h similarity index 100% rename from leptonica/adapted/endianness.h rename to thirdparty/leptonica/adapted/endianness.h diff --git a/leptonica/bundle.json b/thirdparty/leptonica/bundle.json similarity index 100% rename from leptonica/bundle.json rename to thirdparty/leptonica/bundle.json diff --git a/leptonica/docs/pic/color_lifting.png b/thirdparty/leptonica/docs/pic/color_lifting.png similarity index 100% rename from leptonica/docs/pic/color_lifting.png rename to thirdparty/leptonica/docs/pic/color_lifting.png diff --git a/leptonica/docs/pic/generate_pdf.png b/thirdparty/leptonica/docs/pic/generate_pdf.png similarity index 100% rename from leptonica/docs/pic/generate_pdf.png rename to thirdparty/leptonica/docs/pic/generate_pdf.png diff --git a/leptonica/docs/pic/run_adaptmap_dark.png b/thirdparty/leptonica/docs/pic/run_adaptmap_dark.png similarity index 100% rename from leptonica/docs/pic/run_adaptmap_dark.png rename to thirdparty/leptonica/docs/pic/run_adaptmap_dark.png diff --git a/leptonica/docs/rom_integrate.md b/thirdparty/leptonica/docs/rom_integrate.md similarity index 94% rename from leptonica/docs/rom_integrate.md rename to thirdparty/leptonica/docs/rom_integrate.md index bf940e18..c6317d52 100644 --- a/leptonica/docs/rom_integrate.md +++ b/thirdparty/leptonica/docs/rom_integrate.md @@ -20,7 +20,7 @@ - 仓库代码目录结构说明 ```shell - tpc_c_cplusplus/leptonica + tpc_c_cplusplus/thirdparty/leptonica |-- docs # 存放三方库相关文档的文件夹 |-- adapted # 存放三方库适配需要的代码文件 |-- BUILD.gn # 构建脚本,支持rom包集成 @@ -32,7 +32,7 @@ - 将本仓库文件夹拷贝到third_party下 ```shell - cp ~/tpc_c_cplusplus/leptonica ~/openharmony/third_party/ -rf + cp ~/tpc_c_cplusplus/thirdparty/leptonica ~/openharmony/third_party/ -rf ``` ## 准备三方库依赖的四方库 @@ -40,8 +40,8 @@ 本三方库依赖了libgif, libjpg, libpng, openjpeg, zlib, libtiff, libwebp等四方库,除了openjpeg与libtiff外,其他四方库OpenHarmony都已支持。 openjpeg与libtiff的适配参考以下方法: -- [openjpeg的适配](https://gitee.com/openharmony-sig/tpc_c_cplusplus/openjpeg) -- [libtiff的适配](https://gitee.com/openharmony-sig/tpc_c_cplusplus/libtiff) +- [openjpeg的适配](https://gitee.com/openharmony-sig/tpc_c_cplusplus/thirdparty/openjpeg) +- [libtiff的适配](https://gitee.com/openharmony-sig/tpc_c_cplusplus/thirdparty/libtiff) ## 准备三方库源码 @@ -161,5 +161,4 @@ openjpeg与libtiff的适配参考以下方法: - [标准系统编译构建指导](https://gitee.com/openharmony/docs/blob/OpenHarmony-3.2-Beta1/zh-cn/device-dev/subsystems/subsys-build-standard-large.md) - [如何为三方库组件中添加一个三方库](https://gitee.com/openharmony-sig/knowledge/blob/master/docs/openharmony_getstarted/port_thirdparty/README.md) - [OpenHarmony三方库地址](https://gitee.com/openharmony-tpc) -- [OpenHarmony知识体系](https://gitee.com/openharmony-sig/knowledge) - \ No newline at end of file +- [OpenHarmony知识体系](https://gitee.com/openharmony-sig/knowledge) \ No newline at end of file diff --git a/libmp3lame/BUILD.gn b/thirdparty/libmp3lame/BUILD.gn similarity index 100% rename from libmp3lame/BUILD.gn rename to thirdparty/libmp3lame/BUILD.gn diff --git a/libmp3lame/CHANGELOG.md b/thirdparty/libmp3lame/CHANGELOG.md similarity index 100% rename from libmp3lame/CHANGELOG.md rename to thirdparty/libmp3lame/CHANGELOG.md diff --git a/libmp3lame/README.OpenSource b/thirdparty/libmp3lame/README.OpenSource similarity index 100% rename from libmp3lame/README.OpenSource rename to thirdparty/libmp3lame/README.OpenSource diff --git a/libmp3lame/README_zh.md b/thirdparty/libmp3lame/README_zh.md similarity index 100% rename from libmp3lame/README_zh.md rename to thirdparty/libmp3lame/README_zh.md diff --git a/libmp3lame/adapted/config.h b/thirdparty/libmp3lame/adapted/config.h similarity index 100% rename from libmp3lame/adapted/config.h rename to thirdparty/libmp3lame/adapted/config.h diff --git a/libmp3lame/bundle.json b/thirdparty/libmp3lame/bundle.json similarity index 100% rename from libmp3lame/bundle.json rename to thirdparty/libmp3lame/bundle.json diff --git a/libmp3lame/docs/image/result.png b/thirdparty/libmp3lame/docs/image/result.png similarity index 100% rename from libmp3lame/docs/image/result.png rename to thirdparty/libmp3lame/docs/image/result.png diff --git a/libmp3lame/docs/rom_integrate.md b/thirdparty/libmp3lame/docs/rom_integrate.md similarity index 97% rename from libmp3lame/docs/rom_integrate.md rename to thirdparty/libmp3lame/docs/rom_integrate.md index 013c5d42..0df5784d 100644 --- a/libmp3lame/docs/rom_integrate.md +++ b/thirdparty/libmp3lame/docs/rom_integrate.md @@ -20,7 +20,7 @@ - 三方库目录结构 ``` - tpc_c_cplusplus/libmp3lame #三方库libmp3lame的目录结构如下 + tpc_c_cplusplus/thirdparty/libmp3lame #三方库libmp3lame的目录结构如下 ├── adapted #存放三方库适配需要的代码文件 ├── docs #存放三方库相关文档的文件夹 ├── BUILD.gn #构建脚本,支持rom包集成 @@ -32,7 +32,7 @@ - 将三方库拷贝到OpenHarmony源码的third_party目录下 ``` - cp ~/tpc_c_cplusplus/libmp3lame ~/openharmony/third_party -rf + cp ~/tpc_c_cplusplus/thirdparty/libmp3lame ~/openharmony/third_party -rf ``` ### 准备三方库源码 diff --git a/libtiff/BUILD.gn b/thirdparty/libtiff/BUILD.gn similarity index 100% rename from libtiff/BUILD.gn rename to thirdparty/libtiff/BUILD.gn diff --git a/libtiff/README.OpenSource b/thirdparty/libtiff/README.OpenSource similarity index 100% rename from libtiff/README.OpenSource rename to thirdparty/libtiff/README.OpenSource diff --git a/libtiff/README_zh.md b/thirdparty/libtiff/README_zh.md similarity index 100% rename from libtiff/README_zh.md rename to thirdparty/libtiff/README_zh.md diff --git a/libtiff/adapted/libport_config.h b/thirdparty/libtiff/adapted/libport_config.h similarity index 100% rename from libtiff/adapted/libport_config.h rename to thirdparty/libtiff/adapted/libport_config.h diff --git a/libtiff/adapted/tif_config.h b/thirdparty/libtiff/adapted/tif_config.h similarity index 100% rename from libtiff/adapted/tif_config.h rename to thirdparty/libtiff/adapted/tif_config.h diff --git a/libtiff/adapted/tiffconf.h b/thirdparty/libtiff/adapted/tiffconf.h similarity index 100% rename from libtiff/adapted/tiffconf.h rename to thirdparty/libtiff/adapted/tiffconf.h diff --git a/libtiff/bundle.json b/thirdparty/libtiff/bundle.json similarity index 100% rename from libtiff/bundle.json rename to thirdparty/libtiff/bundle.json diff --git a/libtiff/docs/pic/result.png b/thirdparty/libtiff/docs/pic/result.png similarity index 100% rename from libtiff/docs/pic/result.png rename to thirdparty/libtiff/docs/pic/result.png diff --git a/libtiff/docs/rom_integrate.md b/thirdparty/libtiff/docs/rom_integrate.md similarity index 95% rename from libtiff/docs/rom_integrate.md rename to thirdparty/libtiff/docs/rom_integrate.md index 22510b17..3dad4f31 100755 --- a/libtiff/docs/rom_integrate.md +++ b/thirdparty/libtiff/docs/rom_integrate.md @@ -11,7 +11,7 @@ ``` - 三方库目录结构 ``` - tpc_c_cplusplus/libtiff #三方库xerces-c的目录结构如下 + tpc_c_cplusplus/thirdparty/libtiff #三方库xerces-c的目录结构如下 ├── adapted #存放三方库适配需要的代码文件 ├── docs #存放三方库相关文档的文件夹 ├── BUILD.gn #构建脚本,支持rom包集成 @@ -21,7 +21,7 @@ ``` - 将三方库拷贝到OpenHarmony源码的third_party目录下 ``` - cp ~/tpc_c_cplusplus/libtiff ~/openharmony/third_party -rf + cp ~/tpc_c_cplusplus/thirdparty/libtiff ~/openharmony/third_party -rf ``` ### 准备三方库源码 ``` diff --git a/lzma/BUILD.gn b/thirdparty/lzma/BUILD.gn similarity index 100% rename from lzma/BUILD.gn rename to thirdparty/lzma/BUILD.gn diff --git a/lzma/README.OpenSource b/thirdparty/lzma/README.OpenSource similarity index 100% rename from lzma/README.OpenSource rename to thirdparty/lzma/README.OpenSource diff --git a/lzma/README_zh.md b/thirdparty/lzma/README_zh.md similarity index 100% rename from lzma/README_zh.md rename to thirdparty/lzma/README_zh.md diff --git a/lzma/adapted/config.h b/thirdparty/lzma/adapted/config.h similarity index 100% rename from lzma/adapted/config.h rename to thirdparty/lzma/adapted/config.h diff --git a/lzma/bundle.json b/thirdparty/lzma/bundle.json similarity index 100% rename from lzma/bundle.json rename to thirdparty/lzma/bundle.json diff --git a/lzma/docs/pic/results.png b/thirdparty/lzma/docs/pic/results.png similarity index 100% rename from lzma/docs/pic/results.png rename to thirdparty/lzma/docs/pic/results.png diff --git a/lzma/docs/rom_integrate.md b/thirdparty/lzma/docs/rom_integrate.md similarity index 98% rename from lzma/docs/rom_integrate.md rename to thirdparty/lzma/docs/rom_integrate.md index 721e910f..06e44120 100644 --- a/lzma/docs/rom_integrate.md +++ b/thirdparty/lzma/docs/rom_integrate.md @@ -11,7 +11,7 @@ ``` - 三方库目录结构 ``` - tpc_c_cplusplus/lzma + tpc_c_cplusplus/thirdparty/lzma |-- adapted # 存放三方库适配需要的代码文件 |-- docs # 存放三方库相关文档的文件夹 |-- BUILD.gn # 构建脚本,支持rom包集成 @@ -21,7 +21,7 @@ ``` - 将本仓库文件夹拷贝到third_party下 ``` - cp ~/tpc_c_cplusplus/lzma ~/openharmony/third_party/ -rf + cp ~/tpc_c_cplusplus/thirdparty/lzma ~/openharmony/third_party/ -rf ``` ## 准备三方库源码 - 将源码下载到lzma目录并将其解压出来。 diff --git a/minizip-ng/BUILD.gn b/thirdparty/minizip-ng/BUILD.gn similarity index 100% rename from minizip-ng/BUILD.gn rename to thirdparty/minizip-ng/BUILD.gn diff --git a/minizip-ng/CMakeLists.txt b/thirdparty/minizip-ng/CMakeLists.txt similarity index 100% rename from minizip-ng/CMakeLists.txt rename to thirdparty/minizip-ng/CMakeLists.txt diff --git a/minizip-ng/README.OpenSource b/thirdparty/minizip-ng/README.OpenSource similarity index 100% rename from minizip-ng/README.OpenSource rename to thirdparty/minizip-ng/README.OpenSource diff --git a/minizip-ng/README_zh.md b/thirdparty/minizip-ng/README_zh.md similarity index 100% rename from minizip-ng/README_zh.md rename to thirdparty/minizip-ng/README_zh.md diff --git a/minizip-ng/bundle.json b/thirdparty/minizip-ng/bundle.json similarity index 100% rename from minizip-ng/bundle.json rename to thirdparty/minizip-ng/bundle.json diff --git a/minizip-ng/docs/hap_integrate.md b/thirdparty/minizip-ng/docs/hap_integrate.md similarity index 89% rename from minizip-ng/docs/hap_integrate.md rename to thirdparty/minizip-ng/docs/hap_integrate.md index 72957b7b..a7eb4af1 100755 --- a/minizip-ng/docs/hap_integrate.md +++ b/thirdparty/minizip-ng/docs/hap_integrate.md @@ -19,7 +19,7 @@ - 仓库代码目录结构说明 ```shell - tpc_c_cplusplus/minizip-ng + tpc_c_cplusplus/thirdparty/minizip-ng ├── docs # 存放三方库相关文档的文件夹 ├── BUILD.gn # 构建脚本,支持rom包集成 ├── bundle.json # 三方库组件定义文件 @@ -48,14 +48,14 @@ - 准备依赖库 minizip依赖了zstd,libiconv,lz4,xz,bzip2以及zlib等库,除了zlib是SDK中已有的,其他库都需要下载。 - - [libiconv适配文件](https://gitee.com/openharmony-sig/tpc_c_cplusplus/blob/master/iconv/docs/rom_integrate.md): 参照文档下载适配代码,将整个iconv文件夹拷贝到/entry/src/main/cpp/third_party
+ - [libiconv适配文件](../../iconv/docs/rom_integrate.md): 参照文档下载适配代码,将整个iconv文件夹拷贝到/entry/src/main/cpp/third_party
[libiconv源码](https://ftp.gnu.org/gnu/libiconv/libiconv-1.7.tar.gz):下载解压后改名为libiconv,并将该源码目录拷贝到iconv文件夹中 - [zstd](https://github.com/facebook/zstd):下载v1.5.2版本,解压后并改为zstd - [lz4](https://gitee.com/openharmony/third_party_lz4/repository/archive/master.zip):下载解压后并改名为lz4 - [bzip2](https://gitee.com/openharmony/third_party_bzip2/repository/archive/master.zip):下载解压后并改名为bzip2 - - [xz适配文件](https://gitee.com/openharmony-sig/tpc_c_cplusplus/blob/master/xz/docs/rom_integrate.md): 参照文档下载适配代码,将整个xz文件夹拷贝到/entry/src/main/cpp/third_party
+ - [xz适配文件](../../xz/docs/rom_integrate.md): 参照文档下载适配代码,将整个xz文件夹拷贝到/entry/src/main/cpp/third_party
[xz源码](https://tukaani.org/xz/xz-5.2.6.tar.gz):下载解压后改名为libxz,并将该源码目录拷贝到xz文件夹中 - 所有依赖库都拷贝到/entry/src/main/cpp/third_party下. + 所有依赖库都拷贝到/entry/src/main/cpp/third_party下. ## 应用中使用三方库 diff --git a/minizip-ng/docs/pic/ets_results.png b/thirdparty/minizip-ng/docs/pic/ets_results.png similarity index 100% rename from minizip-ng/docs/pic/ets_results.png rename to thirdparty/minizip-ng/docs/pic/ets_results.png diff --git a/minizip-ng/docs/pic/install.png b/thirdparty/minizip-ng/docs/pic/install.png similarity index 100% rename from minizip-ng/docs/pic/install.png rename to thirdparty/minizip-ng/docs/pic/install.png diff --git a/minizip-ng/docs/pic/results.png b/thirdparty/minizip-ng/docs/pic/results.png similarity index 100% rename from minizip-ng/docs/pic/results.png rename to thirdparty/minizip-ng/docs/pic/results.png diff --git a/minizip-ng/docs/rom_integrate.md b/thirdparty/minizip-ng/docs/rom_integrate.md similarity index 97% rename from minizip-ng/docs/rom_integrate.md rename to thirdparty/minizip-ng/docs/rom_integrate.md index 9a95619a..f0e856d6 100644 --- a/minizip-ng/docs/rom_integrate.md +++ b/thirdparty/minizip-ng/docs/rom_integrate.md @@ -11,7 +11,7 @@ ``` - 仓库代码目录结构说明 ``` - tpc_c_cplusplus/minizip-ng + tpc_c_cplusplus/thirdparty/minizip-ng |-- docs # 存放三方库相关文档的文件夹 |-- BUILD.gn # 构建脚本,支持rom包集成 |-- bundle.json # 三方库组件定义文件 @@ -20,7 +20,7 @@ ``` - 将本仓库文件夹拷贝到third_party下 ``` - cp ~/tpc_c_cplusplus/minizipi-ng ~/openharmony/third_party/ -rf + cp ~/tpc_c_cplusplus/thirdparty/minizipi-ng ~/openharmony/third_party/ -rf ``` ## 准备三方库源码 - 将源码下载到minizip-ng目录并将其解压出来。 @@ -98,7 +98,7 @@ hb build --target-cpu arm64 # 编译64位系统使用:arm64, 编译32位 ``` - 运行测试程序 程序安装完后,由于测试用例较多,我们准备了1个测试文件 test.c,测试了该库常用的zip文件压缩和解压缩功能,并和期望结果做对比,内容一致,如图: - ![results](pic/results.png) +  ![results](pic/results.png) ## 参考资料 - [润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld) - [OpenHarmony三方库地址](https://gitee.com/openharmony-tpc) diff --git a/modbus/BUILD.gn b/thirdparty/modbus/BUILD.gn similarity index 100% rename from modbus/BUILD.gn rename to thirdparty/modbus/BUILD.gn diff --git a/modbus/README.OpenSource b/thirdparty/modbus/README.OpenSource similarity index 100% rename from modbus/README.OpenSource rename to thirdparty/modbus/README.OpenSource diff --git a/modbus/README_zh.md b/thirdparty/modbus/README_zh.md similarity index 100% rename from modbus/README_zh.md rename to thirdparty/modbus/README_zh.md diff --git a/modbus/adapted/src/config.h b/thirdparty/modbus/adapted/src/config.h similarity index 100% rename from modbus/adapted/src/config.h rename to thirdparty/modbus/adapted/src/config.h diff --git a/modbus/adapted/src/modbus-version.h b/thirdparty/modbus/adapted/src/modbus-version.h similarity index 100% rename from modbus/adapted/src/modbus-version.h rename to thirdparty/modbus/adapted/src/modbus-version.h diff --git a/modbus/adapted/tests/unit-test.h b/thirdparty/modbus/adapted/tests/unit-test.h similarity index 100% rename from modbus/adapted/tests/unit-test.h rename to thirdparty/modbus/adapted/tests/unit-test.h diff --git a/modbus/bundle.json b/thirdparty/modbus/bundle.json similarity index 100% rename from modbus/bundle.json rename to thirdparty/modbus/bundle.json diff --git a/modbus/docs/pic/running_result.png b/thirdparty/modbus/docs/pic/running_result.png similarity index 100% rename from modbus/docs/pic/running_result.png rename to thirdparty/modbus/docs/pic/running_result.png diff --git a/modbus/docs/rom_integrate.md b/thirdparty/modbus/docs/rom_integrate.md similarity index 94% rename from modbus/docs/rom_integrate.md rename to thirdparty/modbus/docs/rom_integrate.md index 2997177b..437bdd41 100755 --- a/modbus/docs/rom_integrate.md +++ b/thirdparty/modbus/docs/rom_integrate.md @@ -20,7 +20,7 @@ - 仓库代码目录结构说明 ```shell - cd ~/tpc_c_cplusplus/modbus/ # 进入到仓库代码库目录 + cd ~/tpc_c_cplusplus/thirdparty/modbus/ # 进入到仓库代码库目录 ``` ```shell @@ -36,7 +36,7 @@ - 将本仓库文件夹拷贝到OpenHarmony源码的third_party目录下 ```shell - cp -arf ~/tpc_c_cplusplus/modbus ~/OpenHarmony/third_party + cp -arf ~/tpc_c_cplusplus/thirdparty/modbus ~/OpenHarmony/third_party ``` ### 准备三方库源码 diff --git a/mqtt/BUILD.gn b/thirdparty/mqtt/BUILD.gn similarity index 100% rename from mqtt/BUILD.gn rename to thirdparty/mqtt/BUILD.gn diff --git a/mqtt/README.OpenSource b/thirdparty/mqtt/README.OpenSource similarity index 100% rename from mqtt/README.OpenSource rename to thirdparty/mqtt/README.OpenSource diff --git a/mqtt/README_zh.md b/thirdparty/mqtt/README_zh.md similarity index 100% rename from mqtt/README_zh.md rename to thirdparty/mqtt/README_zh.md diff --git a/mqtt/adapted/src/VersionInfo.h b/thirdparty/mqtt/adapted/src/VersionInfo.h similarity index 100% rename from mqtt/adapted/src/VersionInfo.h rename to thirdparty/mqtt/adapted/src/VersionInfo.h diff --git a/mqtt/bundle.json b/thirdparty/mqtt/bundle.json similarity index 100% rename from mqtt/bundle.json rename to thirdparty/mqtt/bundle.json diff --git a/mqtt/docs/pic/running_result.png b/thirdparty/mqtt/docs/pic/running_result.png similarity index 100% rename from mqtt/docs/pic/running_result.png rename to thirdparty/mqtt/docs/pic/running_result.png diff --git a/mqtt/docs/rom_integrate.md b/thirdparty/mqtt/docs/rom_integrate.md similarity index 94% rename from mqtt/docs/rom_integrate.md rename to thirdparty/mqtt/docs/rom_integrate.md index 96ddae6e..04699590 100755 --- a/mqtt/docs/rom_integrate.md +++ b/thirdparty/mqtt/docs/rom_integrate.md @@ -20,7 +20,7 @@ - 仓库代码目录结构说明 ```shell - cd ~/tpc_c_cplusplus/mqtt/ # 进入到仓库代码库目录 + cd ~/tpc_c_cplusplus/thirdparty/mqtt # 进入到仓库代码库目录 ``` ```shell @@ -36,7 +36,7 @@ - 将本仓库文件夹拷贝到OpenHarmony源码的third_party目录下 ```shell - cp -arf ~/tpc_c_cplusplus/mqtt ~/OpenHarmony/third_party + cp -arf ~/tpc_c_cplusplus/thirdparty/mqtt ~/OpenHarmony/third_party ``` ### 准备三方库源码 diff --git a/openjpeg/BUILD.gn b/thirdparty/openjpeg/BUILD.gn similarity index 100% rename from openjpeg/BUILD.gn rename to thirdparty/openjpeg/BUILD.gn diff --git a/openjpeg/README.OpenSource b/thirdparty/openjpeg/README.OpenSource similarity index 91% rename from openjpeg/README.OpenSource rename to thirdparty/openjpeg/README.OpenSource index 30935aae..89f7df61 100755 --- a/openjpeg/README.OpenSource +++ b/thirdparty/openjpeg/README.OpenSource @@ -1,7 +1,7 @@ [ { "Name": "openJPEG", - "License": 2-clauses BSD license, + "License": "2-clauses BSD license", "License File": "LICENSE.TXT", "Version Number": "v2.5.0", "Owner": "huangminzhong2@huawei.com", diff --git a/openjpeg/README_zh.md b/thirdparty/openjpeg/README_zh.md similarity index 100% rename from openjpeg/README_zh.md rename to thirdparty/openjpeg/README_zh.md diff --git a/openjpeg/adapter/include/opj_apps_config.h b/thirdparty/openjpeg/adapter/include/opj_apps_config.h similarity index 100% rename from openjpeg/adapter/include/opj_apps_config.h rename to thirdparty/openjpeg/adapter/include/opj_apps_config.h diff --git a/openjpeg/adapter/include/opj_config.h b/thirdparty/openjpeg/adapter/include/opj_config.h similarity index 100% rename from openjpeg/adapter/include/opj_config.h rename to thirdparty/openjpeg/adapter/include/opj_config.h diff --git a/openjpeg/adapter/include/opj_config_private.h b/thirdparty/openjpeg/adapter/include/opj_config_private.h similarity index 100% rename from openjpeg/adapter/include/opj_config_private.h rename to thirdparty/openjpeg/adapter/include/opj_config_private.h diff --git a/openjpeg/adapter/include/tiff/tif_config.h b/thirdparty/openjpeg/adapter/include/tiff/tif_config.h similarity index 100% rename from openjpeg/adapter/include/tiff/tif_config.h rename to thirdparty/openjpeg/adapter/include/tiff/tif_config.h diff --git a/openjpeg/adapter/include/tiff/tiffconf.h b/thirdparty/openjpeg/adapter/include/tiff/tiffconf.h similarity index 100% rename from openjpeg/adapter/include/tiff/tiffconf.h rename to thirdparty/openjpeg/adapter/include/tiff/tiffconf.h diff --git a/openjpeg/adapter/script/test_open_jpeg.sh b/thirdparty/openjpeg/adapter/script/test_open_jpeg.sh similarity index 100% rename from openjpeg/adapter/script/test_open_jpeg.sh rename to thirdparty/openjpeg/adapter/script/test_open_jpeg.sh diff --git a/openjpeg/bundle.json b/thirdparty/openjpeg/bundle.json similarity index 100% rename from openjpeg/bundle.json rename to thirdparty/openjpeg/bundle.json diff --git a/openjpeg/docs/media/running_result.png b/thirdparty/openjpeg/docs/media/running_result.png similarity index 100% rename from openjpeg/docs/media/running_result.png rename to thirdparty/openjpeg/docs/media/running_result.png diff --git a/openjpeg/docs/rom_integrate.md b/thirdparty/openjpeg/docs/rom_integrate.md similarity index 94% rename from openjpeg/docs/rom_integrate.md rename to thirdparty/openjpeg/docs/rom_integrate.md index 23fad823..88efefe0 100755 --- a/openjpeg/docs/rom_integrate.md +++ b/thirdparty/openjpeg/docs/rom_integrate.md @@ -20,7 +20,7 @@ - 仓库代码目录结构说明 ```shell - cd ~/tpc_c_cplusplus/openjpeg/ # 进入到仓库代码库目录 + cd ~/tpc_c_cplusplus/thirdparty/openjpeg # 进入到仓库代码库目录 ``` ```shell @@ -36,7 +36,7 @@ - 将本仓库文件夹拷贝到OpenHarmony源码的third_party目录下 ```shell - cp -arf ~/tpc_c_cplusplus/openjpeg ~/OpenHarmony/third_party + cp -arf ~/tpc_c_cplusplus/thirdparty/openjpeg ~/OpenHarmony/third_party ``` ### 准备三方库源码 diff --git a/rapidjson/BUILD.gn b/thirdparty/rapidjson/BUILD.gn similarity index 100% rename from rapidjson/BUILD.gn rename to thirdparty/rapidjson/BUILD.gn diff --git a/rapidjson/README.OpenSource b/thirdparty/rapidjson/README.OpenSource similarity index 100% rename from rapidjson/README.OpenSource rename to thirdparty/rapidjson/README.OpenSource diff --git a/rapidjson/README_zh.md b/thirdparty/rapidjson/README_zh.md similarity index 100% rename from rapidjson/README_zh.md rename to thirdparty/rapidjson/README_zh.md diff --git a/rapidjson/bundle.json b/thirdparty/rapidjson/bundle.json similarity index 100% rename from rapidjson/bundle.json rename to thirdparty/rapidjson/bundle.json diff --git a/rapidjson/docs/pic/result.png b/thirdparty/rapidjson/docs/pic/result.png similarity index 100% rename from rapidjson/docs/pic/result.png rename to thirdparty/rapidjson/docs/pic/result.png diff --git a/rapidjson/docs/rom_integrate.md b/thirdparty/rapidjson/docs/rom_integrate.md similarity index 95% rename from rapidjson/docs/rom_integrate.md rename to thirdparty/rapidjson/docs/rom_integrate.md index b8fbfba9..1fc3dba5 100644 --- a/rapidjson/docs/rom_integrate.md +++ b/thirdparty/rapidjson/docs/rom_integrate.md @@ -11,7 +11,7 @@ ``` - 三方库目录结构 ``` - tpc_c_cplusplus/rapidjson #三方库rapidjson的目录结构如下 + tpc_c_cplusplus/thirdparty/rapidjson #三方库rapidjson的目录结构如下 ├── adapted #存放三方库适配需要的代码文件 ├── docs #存放三方库相关文档的文件夹 ├── BUILD.gn #构建脚本,支持rom包集成 @@ -21,13 +21,13 @@ ``` - 将三方库拷贝到OpenHarmony源码的third_party目录下 ``` - cp ~/tpc_c_cplusplus/rapidjson ~/openharmony/third_party -rf + cp ~/tpc_c_cplusplus/thirdparty/rapidjson ~/openharmony/third_party -rf ``` ### 准备三方库源码 ``` cd ~/openharmony/third_party/rapidjson #进入三方库目录 git clone https://github.com/Tencent/rapidjson.git #下载三方库源码 -git git submodule update --init #更新依赖的三方库代码 +git submodule update --init #更新依赖的三方库代码 ``` ## 系统Rom中引入三方库 准备完三方库代码后,我们需要将三方库加入到编译构建体系中。标准系统编译构建可以参考文档[标准系统编译构建指导](https://gitee.com/openharmony/docs/blob/OpenHarmony-3.2-Beta1/zh-cn/device-dev/subsystems/subsys-build-standard-large.md) diff --git a/thirdparty_template/BUILD.gn b/thirdparty/thirdparty_template/BUILD.gn similarity index 100% rename from thirdparty_template/BUILD.gn rename to thirdparty/thirdparty_template/BUILD.gn diff --git a/thirdparty_template/CMakeLists.txt b/thirdparty/thirdparty_template/CMakeLists.txt similarity index 100% rename from thirdparty_template/CMakeLists.txt rename to thirdparty/thirdparty_template/CMakeLists.txt diff --git a/thirdparty/thirdparty_template/HPKBUILD b/thirdparty/thirdparty_template/HPKBUILD new file mode 100755 index 00000000..27f52b9d --- /dev/null +++ b/thirdparty/thirdparty_template/HPKBUILD @@ -0,0 +1,63 @@ +# This is an example HPKBUILD file. Use this as a start to creating your own, +# and remove these comments. +# NOTE: Please fill out the license field for your package! If it is unknown, +# then please put 'unknown'. + +# Contributor: Your Name +# Maintainer: Your Name + +pkgname=NAME # 库名 +pkgver=VERSION # 库版本 +pkgrel=0 # 发布号 +pkgdesc="" # 库描述 +url="" # 官网链接 +archs=("armeabi-v7a" "arm64-v8a") # cpu 架构 +license=() +depends=() # 依赖库的目录名 必须保证被依赖的库的archs是当前库的archs的超集 +makedepends=() # 构建库时的依赖工具 +source="https://downloads.sourceforge.net/$pkgname/$pkgname-$pkgver.tar.gz" # 库源码下载链接 + +downloadpackage=true # 是否自动下载压缩包,如若不写默认 true, 一些特殊情况,代码需要代码只能 git clone (项目中依赖 submoudle ) +autounpack=true # 是否自动解压,如若不写默认 true, 如果为 false 则需要用户在 prepare 函数中自行解压 +buildtools= # 编译方法, 暂时支持cmake, configure, make等, 是什么就填写什么. 如若不写默认为cmake. + +builddir= # 源码压缩包解压后目录名 编译目录名 +packageName=$builddir.tar.gz # 压缩包名 + +# 为编译设置环境,如设置环境变量,创建编译目录等 +prepare() { + cd $builddir + cd ${OLDPWD} +} + +# ${OHOS_SDK} oh sdk安装路径 +# $ARCH 编译的架构是 archs 的遍历 +# $LYCIUM_ROOT/usr/$pkgname-$ARCH-install 安装到顶层目录的usr/$pkgname-$ARCH-install +# 执行编译构建的命令 +build() { + # 如果是cmake构建 $*=-DCMAKE_FIND_ROOT_PATH="..." -DCMAKE_TOOLCHAIN_FILE="..." -DCMAKE_INSTALL_PREFIX="..." 依赖库的搜索路径,toolchain file 路径,安装路径 + cd $builddir + ${OHOS_SDK}/native/build-tools/cmake/bin/cmake $* -DOHOS_ARCH=$ARCH -B$ARCH-build -S./ -L + make -j4 -C $ARCH-build + # 对最关键一步的退出码进行判断 + ret=$? + cd $OLDPWD + return $ret +} + +# 打包安装 +package() { + cd $builddir + make -C $ARCH-build install + cd $OLDPWD +} + +# 进行测试的准备和说明 +check() { + echo "The test must be on an OpenHarmony device!" +} + +# 清理环境 +cleanbuild(){ + rm -rf ${PWD}/$builddir #${PWD}/$packageName +} diff --git a/thirdparty_template/README.OpenSource b/thirdparty/thirdparty_template/README.OpenSource similarity index 100% rename from thirdparty_template/README.OpenSource rename to thirdparty/thirdparty_template/README.OpenSource diff --git a/thirdparty/thirdparty_template/README_zh.md b/thirdparty/thirdparty_template/README_zh.md new file mode 100755 index 00000000..61a4618e --- /dev/null +++ b/thirdparty/thirdparty_template/README_zh.md @@ -0,0 +1,33 @@ +## 目录结构 + +``` +tpc_c_cplusplus/thirdparty +├── README_zh.md #仓库主页 +├── common #仓库通用说明文档的文件夹 +├── thirdparty_template #三方库模板文件夹 +│ ├──README_zh.md #三方库简介 +│ ├──README.OpenSource #说明三方库源码的下载地址,版本,license等信息 +│ ├──ohos.build #三方库组件定义文件 +│ ├──CMakeLists.txt #构建脚本,支持hap包集成 +│ ├──HPKBUILD #交叉构建脚本,使用原库自带脚本编译,支持hap包集成 +│ ├──SHA512SUM #压缩包校验文件,和HPKBUILD一起使用 +│ ├──BUILD.gn #构建脚本,支持rom包集成 +│ ├──adapted #该目录存放三方库适配需要的代码文件 +│ │ ├──config.h #例如配置文件 +│ │ ├──... #其他适配文件 +│ ├──docs #存放三方库相关文档的文件夹 +│ │ ├──rom_integrate.md #rom集成说明文档 +│ │ ├──hap_integrate.md #hap集成说明文档 +│ │ ├── ... #其他说明文档 +├── thirdparty1 #三方库文件夹,内容和thirdparty_template模板的格式一样 +├── thirdparty2 #三方库文件夹,内容和thirdparty_template模板的格式一样 +...... +``` + + + +## 如何贡献 + +- [遵守仓库目录结构](#本仓库目录) +- [遵守OpenHarmony编码贡献规范](https://gitee.com/openharmony-sig/knowledge_demo_smart_home/blob/master/dev/docs/contribute/README.md) +- [三方库模板目录](thirdparty_template) diff --git a/thirdparty/thirdparty_template/SHA512SUM b/thirdparty/thirdparty_template/SHA512SUM new file mode 100755 index 00000000..16934b8a --- /dev/null +++ b/thirdparty/thirdparty_template/SHA512SUM @@ -0,0 +1 @@ +*************************************************************************************** xxx.tar.gz \ No newline at end of file diff --git a/thirdparty_template/adapted/config.h b/thirdparty/thirdparty_template/adapted/config.h similarity index 100% rename from thirdparty_template/adapted/config.h rename to thirdparty/thirdparty_template/adapted/config.h diff --git a/thirdparty/thirdparty_template/bundle.json b/thirdparty/thirdparty_template/bundle.json new file mode 100755 index 00000000..b10c45b9 --- /dev/null +++ b/thirdparty/thirdparty_template/bundle.json @@ -0,0 +1,30 @@ +{ + "name": "", + "description": "", + "version": "", + "license": "", + "publishAs": "", + "segment": { + "destPath": "" + }, + "dirs": {}, + "scripts": {}, + "component": { + "name": "", + "subsystem": "thirdparty", + "syscap": [], + "features": [], + "adapted_system_type": [], + "rom": "", + "ram": "", + "deps": { + "components": [], + "third_party": [] + }, + "build": { + "sub_component": [], + "inner_kits": [], + "test": [] + } + } +} diff --git a/thirdparty_template/docs/hap_integrate.md b/thirdparty/thirdparty_template/docs/hap_integrate.md similarity index 100% rename from thirdparty_template/docs/hap_integrate.md rename to thirdparty/thirdparty_template/docs/hap_integrate.md diff --git a/thirdparty_template/docs/rom_integrate.md b/thirdparty/thirdparty_template/docs/rom_integrate.md similarity index 100% rename from thirdparty_template/docs/rom_integrate.md rename to thirdparty/thirdparty_template/docs/rom_integrate.md diff --git a/tinyxml2/BUILD.gn b/thirdparty/tinyxml2/BUILD.gn similarity index 100% rename from tinyxml2/BUILD.gn rename to thirdparty/tinyxml2/BUILD.gn diff --git a/tinyxml2/CMakeLists.txt b/thirdparty/tinyxml2/CMakeLists.txt similarity index 100% rename from tinyxml2/CMakeLists.txt rename to thirdparty/tinyxml2/CMakeLists.txt diff --git a/tinyxml2/README.OpenSource b/thirdparty/tinyxml2/README.OpenSource similarity index 100% rename from tinyxml2/README.OpenSource rename to thirdparty/tinyxml2/README.OpenSource diff --git a/tinyxml2/README_zh.md b/thirdparty/tinyxml2/README_zh.md similarity index 100% rename from tinyxml2/README_zh.md rename to thirdparty/tinyxml2/README_zh.md diff --git a/tinyxml2/bundle.json b/thirdparty/tinyxml2/bundle.json similarity index 100% rename from tinyxml2/bundle.json rename to thirdparty/tinyxml2/bundle.json diff --git a/tinyxml2/docs/hap_integrate.md b/thirdparty/tinyxml2/docs/hap_integrate.md similarity index 97% rename from tinyxml2/docs/hap_integrate.md rename to thirdparty/tinyxml2/docs/hap_integrate.md index 68e834cc..fe8f0bf3 100644 --- a/tinyxml2/docs/hap_integrate.md +++ b/thirdparty/tinyxml2/docs/hap_integrate.md @@ -14,7 +14,7 @@ 通过[C/C++三方库TCP仓](https://gitee.com/openharmony-sig/tpc_c_cplusplus)下载本三方库代码并将其解压。 - 仓库代码库目录结构说明 ``` - tpc_c_cplusplus/tinyxml2 #三方库tinyxml2 的目录结构如下 + tpc_c_cplusplus/thirdparty/tinyxml2 #三方库tinyxml2 的目录结构如下 ├── docs #存放三方库相关文档的文件夹 ├── BUILD.gn # 构建脚本,支持rom包集成 ├── CmakeLists.txt #构建脚本,支持hap包集成 diff --git a/tinyxml2/docs/pic/hap.jpeg b/thirdparty/tinyxml2/docs/pic/hap.jpeg similarity index 100% rename from tinyxml2/docs/pic/hap.jpeg rename to thirdparty/tinyxml2/docs/pic/hap.jpeg diff --git a/tinyxml2/docs/pic/install.png b/thirdparty/tinyxml2/docs/pic/install.png similarity index 100% rename from tinyxml2/docs/pic/install.png rename to thirdparty/tinyxml2/docs/pic/install.png diff --git a/tinyxml2/docs/pic/result.png b/thirdparty/tinyxml2/docs/pic/result.png similarity index 100% rename from tinyxml2/docs/pic/result.png rename to thirdparty/tinyxml2/docs/pic/result.png diff --git a/tinyxml2/docs/rom_integrate.md b/thirdparty/tinyxml2/docs/rom_integrate.md similarity index 97% rename from tinyxml2/docs/rom_integrate.md rename to thirdparty/tinyxml2/docs/rom_integrate.md index 28c30792..163135e1 100644 --- a/tinyxml2/docs/rom_integrate.md +++ b/thirdparty/tinyxml2/docs/rom_integrate.md @@ -11,7 +11,7 @@ ``` - 三方库目录结构 ``` - tpc_c_cplusplus/tinyxml2 #三方库tinyxml2的目录结构如下 + tpc_c_cplusplus/thirdparty/tinyxml2 #三方库tinyxml2的目录结构如下 ├── adapted #存放三方库适配需要的代码文件 ├── docs #存放三方库相关文档的文件夹 ├── BUILD.gn #构建脚本,支持rom包集成 @@ -21,7 +21,7 @@ ``` - 将三方库拷贝到OpenHarmony源码的third_party目录下 ``` - cp ~/tpc_c_cplusplus/tinyxml2 ~/openharmony/third_party -rf + cp ~/tpc_c_cplusplus/thirdparty/tinyxml2 ~/openharmony/third_party -rf ``` ### 准备三方库源码 ``` diff --git a/thirdparty/tinyxpath/HPKBUILD b/thirdparty/tinyxpath/HPKBUILD new file mode 100755 index 00000000..a8dc1fe5 --- /dev/null +++ b/thirdparty/tinyxpath/HPKBUILD @@ -0,0 +1,54 @@ +# Contributor: huangminzhong +# Maintainer: huangminzhong +pkgname=tinyxpath +pkgver=1.3.1 +pkgrel=0 +pkgdesc="" +url="" +archs=("armeabi-v7a" "arm64-v8a") +license=("LGPL-2.1" "GPL-2.0") +depends=() +makedepends=() +install= +source="https://sourceforge.net/projects/tinyxpath/files/TinyXPath%20%28Linux%20-%20tar.gz%29/TinyXPath%201.3.1/tinyxpath_1_3_1.tgz" +downloadpackage=true +autounpack=false +buildDir=$pkgname-$pkgver +packageName=tinyxpath_1_3_1.tgz # 压缩包名 +decompFlag=true + +prepare() { + if [ $decompFlag == true ];then + mkdir -p $buildDir + tar xvf $packageName -C $buildDir > /dev/null + decompFlag=false + cd $buildDir + patch -p1 < `pwd`/../tinyxpath_oh_pkg.patch + cd ${OLDPWD} + fi + mkdir -p $buildDir/$ARCH-build +} + +build() { + cd $buildDir + ${OHOS_SDK}/native/build-tools/cmake/bin/cmake $* -DOHOS_ARCH=$ARCH -B$ARCH-build -S./ -L > `pwd`/$ARCH-build/build.log 2>&1 + make -j4 -C $ARCH-build >> `pwd`/$ARCH-build/build.log 2>&1 + ret=$? + cd $OLDPWD + return $ret +} + +package() { + cd $buildDir/$ARCH-build + make install >> build.log 2>&1 + cd $OLDPWD +} + +check() { + echo "The test must be on an OpenHarmony device!" +} + +# 清理环境 +cleanbuild(){ + rm -rf ${PWD}/$buildDir #${PWD}/$packageName +} diff --git a/thirdparty/tinyxpath/README.OpenSource b/thirdparty/tinyxpath/README.OpenSource new file mode 100755 index 00000000..1b25a9b2 --- /dev/null +++ b/thirdparty/tinyxpath/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "tinyxpath", + "License": "zlib/libpng License", + "License File": "notes.txt", + "Version Number": "1.3.1",: + "Owner": "huangminzhong2@huawei.com", + "Upstream URL": "https://sourceforge.net/projects/tinyxpath/files/TinyXPath%20%28Linux%20-%20tar.gz%29/TinyXPath%201.3.1/tinyxpath_1_3_1.tgz", + "Description": "Small footprint C++ library to extract an XPath 1.0 expression from an XML tree" + } +] diff --git a/thirdparty/tinyxpath/README_zh.md b/thirdparty/tinyxpath/README_zh.md new file mode 100755 index 00000000..12b8174a --- /dev/null +++ b/thirdparty/tinyxpath/README_zh.md @@ -0,0 +1,12 @@ +# tinyxpath三方库说明 +## 功能简介 +tinyxpath用于从 XML 树中提取 XPath 1.0 表达式。 +## 使用约束 +- IDE版本:DevEco Studio 3.1 Release +- SDK版本:ohos_sdk_public 3.2.11.9 (API Version 9 Release) +- 三方库版本:1.3.1 +- 当前适配的功能:支持xpath语法解析 +- [zlib/libpng License](https://sourceforge.net/projects/tinyxpath/) + +## 集成方式 ++ [应用hap包集成](docs/hap_integrate.md) diff --git a/thirdparty/tinyxpath/SHA512SUM b/thirdparty/tinyxpath/SHA512SUM new file mode 100755 index 00000000..e6993f17 --- /dev/null +++ b/thirdparty/tinyxpath/SHA512SUM @@ -0,0 +1,2 @@ +56fab69d20ab28bd9330ce7917397d501f53bda06c19277a70b09c9b69ff4171f0d196af526a3991409afa1eb08d83dd2d9039118c6efb83764868bef1c9fbd9 tinyxpath_1_3_1.tgz +f9eb2247aa2bc1f5c2064e3e368a2bba8de8b56d960f7705efc2c0196b7097a9337df15943ea2de70895e4cf06208681a80019b93fe0c26ce469d1534517e28d tinyxpath_oh_pkg.patch diff --git a/thirdparty/tinyxpath/docs/hap_integrate.md b/thirdparty/tinyxpath/docs/hap_integrate.md new file mode 100755 index 00000000..a2a7a288 --- /dev/null +++ b/thirdparty/tinyxpath/docs/hap_integrate.md @@ -0,0 +1,67 @@ +# tinyxpath集成到应用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 3.2.11.9 (API Version 9 Release)](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fohos-sdk-windows_linux-public.tar.gz) +- [DevEco Studio 3.1 Beta2](https://gitee.com/link?target=https%3A%2F%2Fcontentcenter-vali-drcn.dbankcdn.cn%2Fpvt_2%2FDeveloperAlliance_package_901_9%2Ff3%2Fv3%2FuJyuq3syQ2ak4hE1QZmAug%2Fdevecostudio-windows-3.1.0.400.zip%3FHW-CC-KV%3DV1%26HW-CC-Date%3D20230408T013335Z%26HW-CC-Expire%3D315360000%26HW-CC-Sign%3D96262721EDC9B34E6F62E66884AB7AE2A94C2A7B8C28D6F7FC891F46EB211A70) +- [准备三方库构建环境](../../../tools/README.md#编译环境准备) +- [准备三方库测试环境](../../../tools/README.md#ci环境准备) +## 编译三方库 +- 下载本仓库 + ``` + git clone https://gitee.com/openharmony-sig/tpc_c_cplusplus.git --depth=1 + ``` +- 三方库目录结构 + ``` + tpc_c_cplusplus/thirdparty/tinyxpath #三方库tinyxpath的目录结构如下 + ├── docs #三方库相关文档的文件夹 + ├── HPKBUILD #构建脚本 + ├── SHA512SUM #三方库校验文件 + ├── README.OpenSource #说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md + ``` + +- 将tinyxpath拷贝至tools/main目录下 + ``` + cd tpc_c_cplusplus + cp thirdparty/tinyxpath tools/main -rf + ``` +- 在tools目录下编译三方库 + 编译环境的搭建参考[准备三方库构建环境](../../../tools/README.md#编译环境准备) + ``` + cd tools + ./build.sh tinyxpath + ``` +- 三方库头文件及生成的库 + 在tools目录下会生成usr目录,该目录下存在已编译完成的32位和64位三方库 + ``` + tinyxpath-arm64-v8a-install tinyxpath-armeabi-v7a-install + ``` + +- [测试三方库](#测试三方库) + +## 应用中使用三方库 + +- 在IDE的cpp目录下新增thirdparty目录,将编译生成的库拷贝到该目录下,如下图所示 + ![thirdparty_install_dir](pic/tinyxpath_install_dir.png) +- 在最外层(cpp目录下)CMakeLists.txt中添加如下语句 + ``` + #将三方库加入工程中 + target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/tinyxpath-${OHOS_ARCH}-install/lib/libtinyxpath.a) + #将三方库的头文件加入工程中 + target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/tinyxpath-${OHOS_ARCH}-install/include) + ``` + ![tinyxpath_usage](pic/tinyxpath_usage.png) +## 测试三方库 +三方库的测试使用原库自带的测试用例来做测试,[准备三方库测试环境](../../../tools/README.md#ci环境准备) + +进入到构建目录执行ctest运行测试用例(arm64-v8a-build为构建64位的目录,armeabi-v7a-build为构建32位的目录) + + ![tinyxpath_test](pic/tinyxpath_test.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/tinyxpath/docs/pic/tinyxpath_install_dir.png b/thirdparty/tinyxpath/docs/pic/tinyxpath_install_dir.png new file mode 100755 index 0000000000000000000000000000000000000000..ccf3eb8adaaf3fa591c069aba9369e6d0607cf88 GIT binary patch literal 6349 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 z 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 b^!Vh>hJ?|6()R#*&=;Q{{fzy|sek`Z@y&x@ literal 0 HcmV?d00001 diff --git a/thirdparty/tinyxpath/docs/pic/tinyxpath_usage.png b/thirdparty/tinyxpath/docs/pic/tinyxpath_usage.png new file mode 100755 index 0000000000000000000000000000000000000000..676e188a6d5f14109bbb7c907d28ba345c904cfe GIT binary patch literal 25259 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 G=>GvI8DN?K literal 0 HcmV?d00001 diff --git a/thirdparty/tinyxpath/tinyxpath_oh_pkg.patch b/thirdparty/tinyxpath/tinyxpath_oh_pkg.patch new file mode 100755 index 00000000..78665f09 --- /dev/null +++ b/thirdparty/tinyxpath/tinyxpath_oh_pkg.patch @@ -0,0 +1,129 @@ +diff -uprN tinyxpath/cmake/PackageConfig.cmake.in tinyxpath-1.3.1/cmake/PackageConfig.cmake.in +--- tinyxpath/cmake/PackageConfig.cmake.in 1969-12-31 16:00:00.000000000 -0800 ++++ tinyxpath-1.3.1/cmake/PackageConfig.cmake.in 2023-02-20 23:38:20.888215070 -0800 +@@ -0,0 +1,11 @@ ++@PACKAGE_INIT@ ++ ++#set(@PROJECT_NAME@_INCLUDE_DIRS @CMAKE_INSTALL_PREFIX@/@TARGET_INSTALL_INCLUDEDIR@/@TARGET_NAME@) ++#set(@PROJECT_NAME@_LIBRARIES @TARGET_NAME@) ++set(@PROJECT_NAME@_INCLUDE_DIRS ${PACKAGE_PREFIX_DIR}/include) ++set(@PROJECT_NAME@_LIBRARIES ${PACKAGE_PREFIX_DIR}/lib/lib@TARGET_NAME@.a) ++ ++include(CMakeFindDependencyMacro) ++ ++include(${CMAKE_CURRENT_LIST_DIR}/@TARGET_NAME@Targets.cmake) ++check_required_components(@TARGET_NAME@) +diff -uprN tinyxpath/CMakeLists.txt tinyxpath-1.3.1/CMakeLists.txt +--- tinyxpath/CMakeLists.txt 1969-12-31 16:00:00.000000000 -0800 ++++ tinyxpath-1.3.1/CMakeLists.txt 2023-03-13 19:30:44.305558572 -0700 +@@ -0,0 +1,109 @@ ++cmake_minimum_required (VERSION 3.12) ++ ++project(TINYXPATH VERSION 1.3.0) ++enable_language(CXX C ASM) ++enable_testing() ++option(BUILD_SAMPLE "Build sample" OFF) ++set(BUILD_SHARED_LIBS FALSE CACHE BOOL "If TRUE, tinyxpath is built as a shared library, otherwise as a static library") ++ ++set(TARGET_NAME tinyxpath) ++set(TARGET_SAMPLE_NAME tinyxpath_test) ++ ++set(TARGET_INSTALL_INCLUDEDIR include) ++set(TARGET_INSTALL_BINDIR bin) ++set(TARGET_INSTALL_LIBDIR lib) ++ ++set(TARGET_SRC_PATH ${CMAKE_CURRENT_SOURCE_DIR}) ++set(TARGET_SRC ${TARGET_SRC_PATH}/tinystr.cpp ++ ${TARGET_SRC_PATH}/tinyxml.cpp ++ ${TARGET_SRC_PATH}/tinyxmlerror.cpp ++ ${TARGET_SRC_PATH}/tinyxmlparser.cpp ++ ${TARGET_SRC_PATH}/action_store.cpp ++ ${TARGET_SRC_PATH}/lex_util.cpp ++ ${TARGET_SRC_PATH}/node_set.cpp ++ ${TARGET_SRC_PATH}/tokenlist.cpp ++ ${TARGET_SRC_PATH}/xml_util.cpp ++ ${TARGET_SRC_PATH}/xpath_expression.cpp ++ ${TARGET_SRC_PATH}/xpath_processor.cpp ++ ${TARGET_SRC_PATH}/xpath_stack.cpp ++ ${TARGET_SRC_PATH}/xpath_stream.cpp ++ ${TARGET_SRC_PATH}/xpath_syntax.cpp ++ ${TARGET_SRC_PATH}/xpath_static.cpp) ++if(BUILD_SAMPLE) ++ set(TARGET_SAMPLE_SRC ${TARGET_SRC_PATH}/htmlutil.cpp ${TARGET_SRC_PATH}/main.cpp) ++endif() ++ ++set(TARGET_INCLUDE ${TARGET_SRC_PATH}) ++ ++add_library(${TARGET_NAME} ${TARGET_SRC}) ++target_include_directories(${TARGET_NAME} PRIVATE ${TARGET_INCLUDE}) ++ ++if(BUILD_SHARED_LIBS) ++ SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} ++ SOVERSION ${PROJECT_VERSION_MAJOR}) ++endif() ++ ++if(BUILD_SAMPLE) ++ add_executable(${TARGET_SAMPLE_NAME} ${TARGET_SAMPLE_SRC}) ++ target_include_directories(${TARGET_SAMPLE_NAME} PRIVATE ${TARGET_INCLUDE}) ++ target_link_libraries(${TARGET_SAMPLE_NAME} PUBLIC ${TARGET_NAME}) ++endif() ++ ++install(TARGETS ${TARGET_NAME} ++ EXPORT ${TARGET_NAME} ++ PUBLIC_HEADER DESTINATION ${TARGET_INSTALL_INCLUDEDIR} ++ PRIVATE_HEADER DESTINATION ${TARGET_INSTALL_INCLUDEDIR} ++ RUNTIME DESTINATION ${TARGET_INSTALL_BINDIR} ++ LIBRARY DESTINATION ${TARGET_INSTALL_LIBDIR} ++ ARCHIVE DESTINATION ${TARGET_INSTALL_LIBDIR}) ++ ++install(FILES ${TARGET_SRC_PATH}/xpath_processor.h ++ ${TARGET_SRC_PATH}/action_store.h ++ ${TARGET_SRC_PATH}/byte_stream.h ++ ${TARGET_SRC_PATH}/lex_token.h ++ ${TARGET_SRC_PATH}/lex_util.h ++ ${TARGET_SRC_PATH}/node_set.h ++ ${TARGET_SRC_PATH}/tinystr.h ++ ${TARGET_SRC_PATH}/tinyxml.h ++ ${TARGET_SRC_PATH}/tinyxpath_conf.h ++ ${TARGET_SRC_PATH}/tokenlist.h ++ ${TARGET_SRC_PATH}/xml_util.h ++ ${TARGET_SRC_PATH}/xpath_expression.h ++ ${TARGET_SRC_PATH}/xpath_processor.h ++ ${TARGET_SRC_PATH}/xpath_stack.h ++ ${TARGET_SRC_PATH}/xpath_static.h ++ ${TARGET_SRC_PATH}/xpath_stream.h ++ ${TARGET_SRC_PATH}/xpath_syntax.h ++ DESTINATION ${TARGET_INSTALL_INCLUDEDIR}/${TARGET_NAME}) ++ ++install( ++ EXPORT ${TARGET_NAME} ++ FILE ${TARGET_NAME}Targets.cmake ++ DESTINATION ${TARGET_INSTALL_LIBDIR}/cmake/${TARGET_NAME} ++) ++ ++include(CMakePackageConfigHelpers) ++ ++write_basic_package_version_file( ++ ${TARGET_NAME}ConfigVersion.cmake ++ VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} ++ COMPATIBILITY SameMajorVersion ++) ++ ++configure_package_config_file( ++ cmake/PackageConfig.cmake.in ${TARGET_NAME}Config.cmake ++ INSTALL_DESTINATION ${TARGET_INSTALL_LIBDIR}/cmake/${TARGET_NAME} ++) ++ ++install(FILES ++ ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}Config.cmake ++ ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}ConfigVersion.cmake ++ DESTINATION ++ ${TARGET_INSTALL_LIBDIR}/cmake/${TARGET_NAME} ++) ++ ++if (BUILD_SAMPLE) ++ add_test(NAME test ++ WORKING_DIRECTORY ${TARGET_SRC_PATH} ++ COMMAND ${TARGET_SAMPLE_NAME}) ++endif() +\ No newline at end of file diff --git a/unrar/CMakeLists.txt b/thirdparty/unrar/CMakeLists.txt similarity index 100% rename from unrar/CMakeLists.txt rename to thirdparty/unrar/CMakeLists.txt diff --git a/unrar/README.OpenSource b/thirdparty/unrar/README.OpenSource similarity index 100% rename from unrar/README.OpenSource rename to thirdparty/unrar/README.OpenSource diff --git a/unrar/README_zh.md b/thirdparty/unrar/README_zh.md similarity index 100% rename from unrar/README_zh.md rename to thirdparty/unrar/README_zh.md diff --git a/unrar/docs/hap_integrate.md b/thirdparty/unrar/docs/hap_integrate.md similarity index 97% rename from unrar/docs/hap_integrate.md rename to thirdparty/unrar/docs/hap_integrate.md index 495681c5..82f3fc89 100644 --- a/unrar/docs/hap_integrate.md +++ b/thirdparty/unrar/docs/hap_integrate.md @@ -7,7 +7,7 @@ - 下载本仓库,并解压 - 三方库目录结构 ``` - tpc_c_cplusplus/unrar #三方库unrar的目录结构如下 + tpc_c_cplusplus/thirdparty/unrar #三方库unrar的目录结构如下 ├── docs #存放三方库相关文档的文件夹 ├── CmakeLists.txt #构建脚本,支持hap包集成 ├── package.json #三方库组件定义文件 diff --git a/unrar/docs/pic/content.png b/thirdparty/unrar/docs/pic/content.png similarity index 100% rename from unrar/docs/pic/content.png rename to thirdparty/unrar/docs/pic/content.png diff --git a/unrar/docs/pic/unrar1.png b/thirdparty/unrar/docs/pic/unrar1.png similarity index 100% rename from unrar/docs/pic/unrar1.png rename to thirdparty/unrar/docs/pic/unrar1.png diff --git a/unrar/package.json b/thirdparty/unrar/package.json similarity index 100% rename from unrar/package.json rename to thirdparty/unrar/package.json diff --git a/xerces-c/BUILD.gn b/thirdparty/xerces-c/BUILD.gn similarity index 100% rename from xerces-c/BUILD.gn rename to thirdparty/xerces-c/BUILD.gn diff --git a/xerces-c/CMakeLists.txt b/thirdparty/xerces-c/CMakeLists.txt similarity index 100% rename from xerces-c/CMakeLists.txt rename to thirdparty/xerces-c/CMakeLists.txt diff --git a/xerces-c/README.OpenSource b/thirdparty/xerces-c/README.OpenSource similarity index 100% rename from xerces-c/README.OpenSource rename to thirdparty/xerces-c/README.OpenSource diff --git a/xerces-c/README_zh.md b/thirdparty/xerces-c/README_zh.md similarity index 100% rename from xerces-c/README_zh.md rename to thirdparty/xerces-c/README_zh.md diff --git a/xerces-c/adapted/config.h b/thirdparty/xerces-c/adapted/config.h similarity index 100% rename from xerces-c/adapted/config.h rename to thirdparty/xerces-c/adapted/config.h diff --git a/xerces-c/adapted/xercesc/util/XercesVersion.hpp b/thirdparty/xerces-c/adapted/xercesc/util/XercesVersion.hpp similarity index 100% rename from xerces-c/adapted/xercesc/util/XercesVersion.hpp rename to thirdparty/xerces-c/adapted/xercesc/util/XercesVersion.hpp diff --git a/xerces-c/adapted/xercesc/util/Xerces_autoconf_config.hpp b/thirdparty/xerces-c/adapted/xercesc/util/Xerces_autoconf_config.hpp similarity index 100% rename from xerces-c/adapted/xercesc/util/Xerces_autoconf_config.hpp rename to thirdparty/xerces-c/adapted/xercesc/util/Xerces_autoconf_config.hpp diff --git a/xerces-c/bundle.json b/thirdparty/xerces-c/bundle.json similarity index 100% rename from xerces-c/bundle.json rename to thirdparty/xerces-c/bundle.json diff --git a/xerces-c/docs/hap_integrate.md b/thirdparty/xerces-c/docs/hap_integrate.md similarity index 96% rename from xerces-c/docs/hap_integrate.md rename to thirdparty/xerces-c/docs/hap_integrate.md index 4f75c3ca..a96939ee 100755 --- a/xerces-c/docs/hap_integrate.md +++ b/thirdparty/xerces-c/docs/hap_integrate.md @@ -7,7 +7,7 @@ - 下载本仓库,并解压 - 三方库目录结构 ``` - tpc_c_cplusplus/xerces-c #三方库xerces-c的目录结构如下 + tpc_c_cplusplus/thirdparty/xerces-c #三方库xerces-c的目录结构如下 ├── adapted #存放三方库适配需要的代码文件 ├── docs #存放三方库相关文档的文件夹 ├── CmakeLists.txt #构建脚本,支持hap包集成 diff --git a/xerces-c/docs/pic/content.png b/thirdparty/xerces-c/docs/pic/content.png similarity index 100% rename from xerces-c/docs/pic/content.png rename to thirdparty/xerces-c/docs/pic/content.png diff --git a/xerces-c/docs/pic/hap_xerces_test.png b/thirdparty/xerces-c/docs/pic/hap_xerces_test.png similarity index 100% rename from xerces-c/docs/pic/hap_xerces_test.png rename to thirdparty/xerces-c/docs/pic/hap_xerces_test.png diff --git a/xerces-c/docs/pic/result.png b/thirdparty/xerces-c/docs/pic/result.png similarity index 100% rename from xerces-c/docs/pic/result.png rename to thirdparty/xerces-c/docs/pic/result.png diff --git a/xerces-c/docs/rom_integrate.md b/thirdparty/xerces-c/docs/rom_integrate.md similarity index 95% rename from xerces-c/docs/rom_integrate.md rename to thirdparty/xerces-c/docs/rom_integrate.md index da79bbb5..27ca0289 100755 --- a/xerces-c/docs/rom_integrate.md +++ b/thirdparty/xerces-c/docs/rom_integrate.md @@ -11,7 +11,7 @@ ``` - 三方库目录结构 ``` - tpc_c_cplusplus/xerces-c #三方库xerces-c的目录结构如下 + tpc_c_cplusplus/thirdparty/xerces-c #三方库xerces-c的目录结构如下 ├── adapted #存放三方库适配需要的代码文件 ├── docs #存放三方库相关文档的文件夹 ├── BUILD.gn #构建脚本,支持rom包集成 @@ -21,7 +21,7 @@ ``` - 将三方库拷贝到OpenHarmony源码的third_party目录下 ``` - cp ~/tpc_c_cplusplus/xerces-c ~/openharmony/third_party -rf + cp ~/tpc_c_cplusplus/thirdparty/xerces-c ~/openharmony/third_party -rf ``` ### 准备三方库源码 ``` diff --git a/xz/BUILD.gn b/thirdparty/xz/BUILD.gn similarity index 100% rename from xz/BUILD.gn rename to thirdparty/xz/BUILD.gn diff --git a/xz/README.OpenSource b/thirdparty/xz/README.OpenSource similarity index 100% rename from xz/README.OpenSource rename to thirdparty/xz/README.OpenSource diff --git a/xz/README_zh.md b/thirdparty/xz/README_zh.md similarity index 100% rename from xz/README_zh.md rename to thirdparty/xz/README_zh.md diff --git a/xz/adapted/config.h b/thirdparty/xz/adapted/config.h similarity index 100% rename from xz/adapted/config.h rename to thirdparty/xz/adapted/config.h diff --git a/xz/adapted/test_file.sh b/thirdparty/xz/adapted/test_file.sh similarity index 100% rename from xz/adapted/test_file.sh rename to thirdparty/xz/adapted/test_file.sh diff --git a/xz/bundle.json b/thirdparty/xz/bundle.json similarity index 100% rename from xz/bundle.json rename to thirdparty/xz/bundle.json diff --git a/xz/docs/pic/test_result.jpg b/thirdparty/xz/docs/pic/test_result.jpg similarity index 100% rename from xz/docs/pic/test_result.jpg rename to thirdparty/xz/docs/pic/test_result.jpg diff --git a/xz/docs/rom_integrate.md b/thirdparty/xz/docs/rom_integrate.md similarity index 94% rename from xz/docs/rom_integrate.md rename to thirdparty/xz/docs/rom_integrate.md index a4730fdd..92d0ddf9 100644 --- a/xz/docs/rom_integrate.md +++ b/thirdparty/xz/docs/rom_integrate.md @@ -20,7 +20,7 @@ - 三方库目录结构 ```shell - cd tpc_c_cplusplus/xz # 进入到仓库代码库目录 + cd tpc_c_cplusplus/thirdparty/xz # 进入到仓库代码库目录 ``` ```shell @@ -36,7 +36,7 @@ - 将本仓库xz文件夹拷贝到third_party下 ```shell - cp ~/tpc_c_cplusplus/xz ~/openharmony/third_party/ -arf + cp ~/tpc_c_cplusplus/thirdparty/xz ~/openharmony/third_party/ -arf ``` ## 准备三方库源码 diff --git a/zstd/BUILD.gn b/thirdparty/zstd/BUILD.gn similarity index 100% rename from zstd/BUILD.gn rename to thirdparty/zstd/BUILD.gn diff --git a/zstd/README.OpenSource b/thirdparty/zstd/README.OpenSource similarity index 100% rename from zstd/README.OpenSource rename to thirdparty/zstd/README.OpenSource diff --git a/zstd/README_zh.md b/thirdparty/zstd/README_zh.md similarity index 100% rename from zstd/README_zh.md rename to thirdparty/zstd/README_zh.md diff --git a/zstd/bundle.json b/thirdparty/zstd/bundle.json similarity index 100% rename from zstd/bundle.json rename to thirdparty/zstd/bundle.json diff --git a/zstd/docs/pic/results.png b/thirdparty/zstd/docs/pic/results.png similarity index 100% rename from zstd/docs/pic/results.png rename to thirdparty/zstd/docs/pic/results.png diff --git a/zstd/docs/rom_integrate.md b/thirdparty/zstd/docs/rom_integrate.md similarity index 98% rename from zstd/docs/rom_integrate.md rename to thirdparty/zstd/docs/rom_integrate.md index e5b28e03..21f1a861 100644 --- a/zstd/docs/rom_integrate.md +++ b/thirdparty/zstd/docs/rom_integrate.md @@ -11,7 +11,7 @@ ``` - 三方库目录结构 ``` - tpc_c_cplusplus/zstd + tpc_c_cplusplus/thirdparty/zstd |-- docs # 存放三方库相关文档的文件夹 |-- BUILD.gn # 构建脚本,支持rom包集成 |-- bundle.json # 三方库组件定义文件 @@ -20,7 +20,7 @@ ``` - 将本仓库文件夹拷贝到third_party下 ``` - cp ~/tpc_c_cplusplus/zstd ~/openharmony/third_party/ -rf + cp ~/tpc_c_cplusplus/thirdparty/zstd ~/openharmony/third_party/ -rf ``` ## 准备三方库源码 - 将源码下载到zstd目录并将其解压出来。 diff --git a/thirdparty_template/README_zh.md b/thirdparty_template/README_zh.md deleted file mode 100755 index 1c4bcf56..00000000 --- a/thirdparty_template/README_zh.md +++ /dev/null @@ -1,21 +0,0 @@ -# xxx 三方库说明 -## 功能简介 -这个是xxx, 主要功能是xxx,简单的一句话介绍 -## 使用约束 - -- IDE版本: - -- ROM版本: - -- API版本: - -- 三方库版本: - -- 当前适配的功能:完成了xxx功能的适配 - -- [License:xxx]()(链接指向源三方库中的license) - -## 集成方式 - -+ [系统Rom包集成](docs/rom_integrate.md) -+ [应用Hap包集成](docs/hap_integrate.md) diff --git a/thirdparty_template/ohos.build b/thirdparty_template/ohos.build deleted file mode 100755 index e955101a..00000000 --- a/thirdparty_template/ohos.build +++ /dev/null @@ -1,9 +0,0 @@ -{ - "subsystem": "thirdparty", - "parts":{ - "xxx": { - "module_list": [ - ] - } - } -} \ No newline at end of file diff --git a/tools/Buildtools/README.md b/tools/Buildtools/README.md new file mode 100755 index 00000000..11dbcc1f --- /dev/null +++ b/tools/Buildtools/README.md @@ -0,0 +1,25 @@ +## 下载ohos sdk +[参考OHOS_SDK-Usage](../doc/ohos_use_sdk/OHOS_SDK-Usage.md) + +## 配置环境变量 +```shell + # 此处是我的ohos sdk解压目录, 使用者需自行配置自己的目录 + export OHOS_SDK=/home/ohos/tools/OH_SDK/ohos-sdk/linux +``` + +## 拷贝编译工具 +``` + # 校验压缩包 + sha512sum -c SHA512SUM + #输出 toolchain.tar.gz: OK + # 解压拷贝编译工具 + tar -zxvf toolchain.tar.gz + cp toolchain/* ${OHOS_SDK}/native/llvm/bin +``` + +## 设置ohos编译宏 +由于 ohos_sdk 没有为OpenHarmony提供系统识别的宏,因此我们需要在 ${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake 文件末尾,添加 +``` + add_definitions(-DOHOS_NDK) +``` +用于系统识别 \ No newline at end of file diff --git a/tools/Buildtools/SHA512SUM b/tools/Buildtools/SHA512SUM new file mode 100755 index 00000000..08d6dc6b --- /dev/null +++ b/tools/Buildtools/SHA512SUM @@ -0,0 +1 @@ +392ced3d95dec1be7354eb4d530df2bb3a1798da327b133592646ea6040841f1645a4690309ce72a3d0d28da083eaf53557c6345905b715083d0d9062445d4b7 toolchain.tar.gz \ No newline at end of file diff --git a/tools/Buildtools/toolchain.tar.gz b/tools/Buildtools/toolchain.tar.gz new file mode 100755 index 0000000000000000000000000000000000000000..e533e7906b07a3ba9eb61dc6ff1ce65333b1d703 GIT binary patch literal 389 zcmV;00eb!)iwFP!000001MQdHZh|lr$GPSyj@3KEY@yJL#bgh$yJeXbtB_zx0F&+Q zSB)P`H+x~x=+5tgHuU2_PyaoqO<5LcCUZUVI)fU7h}R_(F>RMSJjOZYf(sf&9%U>x z%@B9@Ne5PSBP#%}%*y&)KU@2q((L^&t7TB+di5Ese>F%8sTaec3mZ27ha%efpR;v8 z<9?BNKwTKO@z4F=?~SI$`BPbEzNvi7@@hOW4=tAp$bgcGpU>gVR2hNZ7)X$&ruO~} zO{TOD1~S+V9Buaufgmu8x=_vd=cY1UUx=@YT5SgQ;dRps@)~4ODLMNBslmKkEtPJb z{+fL=%RImJ(mez%{mUxN5`J<9TyDdze}1I@goPpM{~Ea0e_Q=0Tgt%+u-CtT>$Q6X z&c}Z@Hmv$j#Bu!RafJH62Hoo4b@a#B?;3mjzx)nh(|>fh|Lx*`7-9Z@6}ry/dev/null 2>&1 + if [ $? -ne 0 ] + then + echo "make 命令未安装,请先安装jq命令" + exit 1 + fi + echo "make 命令已安装" + which autoreconf >/dev/null 2>&1 + if [ $? -ne 0 ] + then + echo "autoreconf 命令未安装,请先安装jq命令" + exit 1 + fi + echo "autoreconf 命令已安装" + which patch >/dev/null 2>&1 + if [ $? -ne 0 ] + then + echo "patch 命令未安装,请先安装jq命令" + exit 1 + fi + echo "patch 命令已安装" + if [ ! -d `pwd`/usr ] + then + echo "创建 `pwd`/usr 目录" + mkdir -p `pwd`/usr + fi + +} + +hpkPaths=() +donelist=() +donelibs=() +readdonelibs() { + if [ -f $1 ] + then + count=0 + while read line + do + doneflags=false + libinfos=(${line//,/ }) + libname=${libinfos[0]} + for lib in ${donelibs[@]} + do + if [ $lib == $libname ] + then + doneflags=true + fi + done + if ! $doneflags + then + donelibs[$count]=$libname + count=$((count+1)) + fi + + done < $1 + fi + donelist=(${donelibs[@]}) +} + +makelibsdir(){ + jobs=($*) + for job in ${jobs[@]} + do + doneflags=false + for donelib in ${donelibs[@]} + do + if [ $donelib == $job ] + then + doneflags=true + fi + done + if $doneflags + then + continue + fi + tmppath=`pwd`/main/$job + if [ -d $tmppath ] + then + hpkPaths[${#hpkPaths[@]}]=$tmppath + fi + done +} + +# 找到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 + if [ -d $1/$file ] + then + tmplibs[${#tmplibs[@]}]=$file + fi + done + makelibsdir ${tmplibs[@]} +} + +# 进入每一个目录 将script 目录下的脚本都链接过去 +prepareshell(){ + for hpkdir in ${hpkPaths[@]} + do + cd $hpkdir + ln -fs `pwd`/../../script/build_hpk.sh build_hpk.sh + ln -fs `pwd`/../../script/envset.sh envset.sh + cd ${OLDPWD} + done +} + +# 恢复脚本 +cleanhpkdir(){ + for hpkdir in ${hpkPaths[@]} + do + cd $hpkdir + rm build_hpk.sh envset.sh + cd ${OLDPWD} + done +} + +# 编译库本身 +nextroundlist=() +notdonelist=() +buildhpk(){ + nextroundlist=(${hpkPaths[*]}) + + while $jobFlag + do + lastroundlen=${#nextroundlist[*]} + notdonelist=(${nextroundlist[*]}) + nextroundlist=() + len=${#notdonelist[*]} + for ((i=0; i < $len; i=i+1)) + do + cd ${notdonelist[$i]} + bash ${PWD}/build_hpk.sh "${donelist[*]}" # > blackhole.log 2>&1 #入参已经完成的list + res=$? + if [ $res -eq 0 ] + then + donelist[${#donelist[@]}]=${notdonelist[$i]##*/} + elif [ $res -eq 101 ] + then + nextroundlist[${#nextroundlist[@]}]=${notdonelist[$i]} + else + echo "${notdonelist[$i]} build ERROR" + fi + cd ${OLDPWD} + done + if [ ${#nextroundlist[*]} -eq 0 ] + then + echo "ALL JOBS DONE!!!" + break + fi + if [ $lastroundlen -eq ${#nextroundlist[*]} ] + then + echo "Please check the dependencies of these items:" + echo " "${nextroundlist[*]} + jobFlag=false + fi + done +} + +main(){ + checkbuildenv + + readdonelibs "`pwd`/usr/hpk_build.csv" + + if [ $# -ne 0 ] + then + makelibsdir $* + else + findmainhpkdir ${PWD}/main + # exit 2 + fi + + prepareshell + buildhpk + + cleanhpkdir +} + +main $* diff --git a/tools/doc/cmake_specification.md b/tools/doc/cmake_specification.md new file mode 100755 index 00000000..079e138f --- /dev/null +++ b/tools/doc/cmake_specification.md @@ -0,0 +1,74 @@ +CMAKE 规范 + +1. CMakeLists.txt 只能作为cmake的文件名 + +2. add_subdirectory()只能添加当前目录子目录,不能添加当前目录的父目录,兄目录,孙目录 + +3. 顶层CMakeLists.txt所在的目录必须包含本工程所有的源码,不能访问该目录以外的源码 + +4. cmake脚本必须以 .cmake 结尾 # ***.cmake 为cmake脚本 cjsonconfigure.cmake + +5. cmake脚本中不可以调用CMakeLists.txt # include(${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt) + +6. 不可以再cmake脚本中调用add_subdirectory(),隐藏了代码的物理结构 + +7. 同一个代码库中相同部署关系的不同模块,使用同一个CMake工程 + +8. 支持通过find_package()机制访问发布件 + +9. cmake命令小写,属性大写 + +10. 自定义变量名禁止 CMAKE 开头 + +11. 明确写出target依赖,不要使用通配符 + +12. 不使用过时以及未公开的cmake命令 cmake_minimum_required(VERSION 3.4.1) + +13. 路径变量采用完整路径,不要相对路径 + + set(XXX ${CMAKE_CURRENT_SOURCE_DIR }/x.cpp) + + CMAKE_SOURCE_DIR 表示代码根路径,即顶层CMakeLists.txt所在路径 + + CMAKE_CURRENT_SOURCE_DIR 当前CMakeLists.txt所在路径 + + CMAKE_BINARY_DIR 目标文件根目录,cmake的执行目录 + + CMAKE_CURRENT_BINARY_DIR 当前目标文件路径 + + CMAKE_CURRENT_LIST_DIR 当前脚本文件路径 + +14. 优先使用target_*** 命令 + + target_compile_definitions + + target_compile_features **在CMAKE_C_COMPILE_FEATURES,CMAKE_CUDA_COMPILE_FEATURES或CMAKE_CXX_COMPILE_FEATURES内** + + target_compile_options + + target_include_directories + + target_link_directories + + target_link_libraries + + target_link_options + + target_sources + +15. target_link_libraries() 显示声明库的依赖关系和PRIVATE/PUBLIC/INTERFACE属性 + + PRIVATE: + + PUBLIC: + + INTERFACE: + +16. add_libray 函数使用 + + add_libray(targetName [STATIC | SHARED | MODULE]) + + add_libray(targetName INTERFACE) + + add_libray(targetName IMPORTED) + diff --git a/tools/doc/ohos_use_sdk/OHOS_SDK-Usage--depend-libs.md b/tools/doc/ohos_use_sdk/OHOS_SDK-Usage--depend-libs.md new file mode 100755 index 00000000..486c6480 --- /dev/null +++ b/tools/doc/ohos_use_sdk/OHOS_SDK-Usage--depend-libs.md @@ -0,0 +1,272 @@ +# OpenHarmony Linux 环境 SDK 使用说明(进阶--依赖库的解决方法) + +​ 我们在移植三方库的时候,很多库是有依赖的。面对这种情况我们应该如何处理。下面以libzip为例讲解下如何为ohos编译带依赖的库。 + +## 编译libzip + +### 源码准备 + +下载最新版本的 libzip 和 xz (libzip 是可以依赖 xz 项目中的 liblzma.so 的) + +```shell +#解压源码 +ohos@ubuntu20:~/openHarmony/ohos_libzip$ ls +libzip-1.9.2.tar.gz xz-5.4.1.tar.gz +ohos@ubuntu20:~/openHarmony/ohos_libzip$ +ohos@ubuntu20:~/openHarmony/ohos_libzip$ tar -zxf xz-5.4.1.tar.gz +ohos@ubuntu20:~/openHarmony/ohos_libzip$ tar -zxf libzip-1.9.2.tar.gz +ohos@ubuntu20:~/openHarmony/ohos_libzip$ ls +libzip-1.9.2 libzip-1.9.2.tar.gz xz-5.4.1 xz-5.4.1.tar.gz +ohos@ubuntu20:~/openHarmony/ohos_libzip$ +``` + +### 编译libzip + +``` +ohos@ubuntu20:~/openHarmony/ohos_libzip$ +ohos@ubuntu20:~/openHarmony/ohos_libzip$ export OHOS_SDK=/home/ohos/tools/OH_SDK/ohos-sdk/linux +ohos@ubuntu20:~/openHarmony/ohos_libzip$ cd libzip-1.9.2/ +ohos@ubuntu20:~/openHarmony/ohos_libzip/libzip-1.9.2$ ls +android AUTHORS cmake-config.h.in examples libzip-config.cmake.in man regress THANKS +API-CHANGES.md cmake CMakeLists.txt INSTALL.md libzip.pc.in NEWS.md SECURITY.md TODO.md +appveyor.yml cmake-compat cmake-zipconf.h.in lib LICENSE README.md src +ohos@ubuntu20:~/openHarmony/ohos_libzip/libzip-1.9.2$ mkdir ohos64build +ohos@ubuntu20:~/openHarmony/ohos_libzip/libzip-1.9.2$ cd ohos64build/ +ohos@ubuntu20:~/openHarmony/ohos_libzip/libzip-1.9.2/ohos64build$ ${OHOS_SDK}/native/build-tools/cmake/bin/cmake -DCMAKE_TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake .. -L +-- The C compiler identification is Clang 12.0.1 +-- Check for working C compiler: /home/ohos/tools/OH_NDK/ohos-sdk/linux/native/llvm/bin/clang +-- Check for working C compiler: /home/ohos/tools/OH_NDK/ohos-sdk/linux/native/llvm/bin/clang -- works +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Detecting C compile features +-- Detecting C compile features - done +-- Looking for include file CommonCrypto/CommonCrypto.h +-- Looking for include file CommonCrypto/CommonCrypto.h - not found +-- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.1") +-- Could NOT find Nettle (missing: Nettle_LIBRARY Nettle_INCLUDE_DIR) (Required is at least version "3.0") +-- Could NOT find GnuTLS (missing: GNUTLS_LIBRARY GNUTLS_INCLUDE_DIR) +-- Could NOT find MbedTLS (missing: MbedTLS_LIBRARY MbedTLS_INCLUDE_DIR) (Required is at least version "1.0") +# 删除大量日志 +-- Check if the system is big endian - little endian +-- Found ZLIB: /home/ohos/tools/OH_NDK/ohos-sdk/linux/native/sysroot/usr/lib/aarch64-linux-ohos/libz.so (found suitable version "1.2.12", minimum required is "1.1.2") +-- Could NOT find BZip2 (missing: BZIP2_LIBRARIES BZIP2_INCLUDE_DIR) +CMake Warning at CMakeLists.txt:186 (message): + -- bzip2 library not found; bzip2 support disabled + +# 可以发现此时是无法找到 liblzma 的,这样虽然没有报错,但是编译出来的libzip是不支持 lzma 算法的。为了使我们编译出来的libzip支持lamz算法,我们希望这里能找到liblzma.so +-- Could NOT find LibLZMA (missing: LIBLZMA_LIBRARY LIBLZMA_INCLUDE_DIR LIBLZMA_HAS_AUTO_DECODER LIBLZMA_HAS_EASY_ENCODER LIBLZMA_HAS_LZMA_PRESET) (Required is at least version "5.2") +CMake Warning at CMakeLists.txt:195 (message): + -- lzma library not found; lzma/xz support disabled + + +-- Could NOT find Zstd (missing: Zstd_LIBRARY Zstd_INCLUDE_DIR) (Required is at least version "1.3.6") +CMake Warning at CMakeLists.txt:204 (message): + -- zstd library not found; zstandard support disabled + + +CMake Warning at CMakeLists.txt:226 (message): + -- neither Common Crypto, GnuTLS, mbed TLS, OpenSSL, nor Windows + Cryptography found; AES support disabled + + +-- Looking for getopt +-- Looking for getopt - found +-- Found Perl: /usr/local/bin/perl (found version "5.34.1") +-- Configuring done +-- Generating done +-- Build files have been written to: /home/ohos/openHarmony/ohos_libzip/libzip-1.9.2/ohos64build +-- Cache values +BUILD_DOC:BOOL=ON +BUILD_EXAMPLES:BOOL=ON +BUILD_REGRESS:BOOL=ON +BUILD_SHARED_LIBS:BOOL=ON +BUILD_TOOLS:BOOL=ON +CMAKE_ASM_FLAGS:STRING= +CMAKE_ASM_FLAGS_DEBUG:STRING= +CMAKE_ASM_FLAGS_RELEASE:STRING= +CMAKE_BUILD_TYPE:STRING= +CMAKE_CXX_FLAGS:STRING= +CMAKE_CXX_FLAGS_DEBUG:STRING= +CMAKE_CXX_FLAGS_RELEASE:STRING= +CMAKE_INSTALL_PREFIX:PATH=/usr/local +CMAKE_TOOLCHAIN_FILE:FILEPATH=/home/ohos/tools/OH_SDK/ohos-sdk/linux/native/build/cmake/ohos.toolchain.cmake +DOCUMENTATION_FORMAT:STRING=mdoc +ENABLE_BZIP2:BOOL=ON +ENABLE_COMMONCRYPTO:BOOL=ON +ENABLE_GNUTLS:BOOL=ON +ENABLE_LZMA:BOOL=ON +ENABLE_MBEDTLS:BOOL=ON +ENABLE_OPENSSL:BOOL=ON +ENABLE_WINDOWS_CRYPTO:BOOL=ON +ENABLE_ZSTD:BOOL=ON +LIBZIP_DO_INSTALL:BOOL=ON +MDOCTOOL:FILEPATH=/usr/bin/groff +SHARED_LIB_VERSIONNING:BOOL=ON +ohos@ubuntu20:~/openHarmony/ohos_libzip/libzip-1.9.2/ohos64build$ +``` + +### 解决依赖无法找到的问题 + +#### 先编译安装 xz + +``` +ohos@ubuntu20:~/openHarmony/ohos_libzip$ cd xz-5.4.1/ +ohos@ubuntu20:~/openHarmony/ohos_libzip/xz-5.4.1$ mkdir ohos64build +ohos@ubuntu20:~/openHarmony/ohos_libzip/xz-5.4.1$ cd ohos64build/ +ohos@ubuntu20:~/openHarmony/ohos_libzip/xz-5.4.1/ohos64build$ ${OHOS_SDK}/native/build-tools/cmake/bin/cmake -DCMAKE_TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake .. -L -DCMAKE_INSTALL_PREFIX=`pwd`/../../usr/ -DBUILD_SHARED_LIBS=ON + # 指定安装目录为~/openHarmony/ohos_libzip/usr +-- The C compiler identification is Clang 12.0.1 +-- Check for working C compiler: /home/ohos/tools/OH_SDK/ohos-sdk/linux/native/llvm/bin/clang +-- Check for working C compiler: /home/ohos/tools/OH_SDK/ohos-sdk/linux/native/llvm/bin/clang -- works +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Detecting C compile features +# 删除大量 cmake 日志 +CMAKE_CXX_FLAGS_RELEASE:STRING= +CMAKE_INSTALL_PREFIX:PATH=/home/ohos/openHarmony/ohos_libzip/usr +CMAKE_TOOLCHAIN_FILE:FILEPATH=/home/ohos/tools/OH_SDK/ohos-sdk/linux/native/build/cmake/ohos.toolchain.cmake +CREATE_LZMA_SYMLINKS:BOOL=ON +CREATE_XZ_SYMLINKS:BOOL=ON +TUKLIB_FAST_UNALIGNED_ACCESS:BOOL=ON +TUKLIB_USE_UNSAFE_TYPE_PUNNING:BOOL=OFF +liblzma_INSTALL_CMAKEDIR:STRING=lib/cmake/liblzma +ohos@ubuntu20:~/openHarmony/ohos_libzip/xz-5.4.1/ohos64build$ +ohos@ubuntu20:~/openHarmony/ohos_libzip/xz-5.4.1/ohos64build$ make -j4 +Scanning dependencies of target lzcat.1 +Scanning dependencies of target xzcat.1 +Scanning dependencies of target unlzma.1 +Scanning dependencies of target liblzma +[ 0%] Built target lzcat.1 +[ 0%] Built target xzcat.1 +#删除大量 make 日志 +[100%] Built target lzma +Scanning dependencies of target unlzma +[100%] Built target unlzma +ohos@ubuntu20:~/openHarmony/ohos_libzip/xz-5.4.1/ohos64build$ make install +[ 65%] Built target liblzma +[ 66%] Built target test_vli +#删除大量 make install 日志 +-- Installing: /home/ohos/openHarmony/ohos_libzip/usr/share/man/man1/lzcat.1 +ohos@ubuntu20:~/openHarmony/ohos_libzip/xz-5.4.1/ohos64build$ +#检查编译好的 liblzma 库 +ohos@ubuntu20:~/openHarmony/ohos_libzip/xz-5.4.1/ohos64build$ ls ../../usr/ +bin include lib share +ohos@ubuntu20:~/openHarmony/ohos_libzip/xz-5.4.1/ohos64build$ cd ../../usr/lib/ +ohos@ubuntu20:~/openHarmony/ohos_libzip/usr/lib$ file * +cmake: directory +liblzma.a: current ar archive +liblzma.so: symbolic link to liblzma.so.5 +liblzma.so.5: symbolic link to liblzma.so.5.4.1 +liblzma.so.5.4.1: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=709b7d1f2a5caf197f168982bf374638b8479a3e, with debug_info, not stripped +ohos@ubuntu20:~/openHarmony/ohos_libzip/usr/lib$ +``` + +#### 再次编译 libzip + +``` + +ohos@ubuntu20:~/openHarmony/ohos_libzip/usr/lib$ cd ../../libzip-1.9.2/ohos64build/ +ohos@ubuntu20:~/openHarmony/ohos_libzip/libzip-1.9.2/ohos64build$ ls +CMakeCache.txt cmake_install.cmake config.h examples libzip-config.cmake libzip.pc Makefile regress zipconf.h +CMakeFiles compile_commands.json CTestTestfile.cmake lib libzip-config-version.cmake libzip-targets.cmake man src +ohos@ubuntu20:~/openHarmony/ohos_libzip/libzip-1.9.2/ohos64build$ rm * -rf +ohos@ubuntu20:~/openHarmony/ohos_libzip/libzip-1.9.2/ohos64build$ ${OHOS_SDK}/native/build-tools/cmake/bin/cmake -DCMAKE_TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake .. -L -DCMAKE_INSTALL_PREFIX=`pwd`/../../usr/ -DCMAKE_FIND_ROOT_PATH=`pwd`/../../usr +#-DCMAKE_INSTALL_PREFIX= 指定了libzip编译好后的安装目录 +#-DCMAKE_FIND_ROOT_PATH= 指定了cmake find package 的路径,如果有多个需要用";"隔开 +-- The C compiler identification is Clang 12.0.1 +-- Check for working C compiler: /home/ohos/tools/OH_SDK/ohos-sdk/linux/native/llvm/bin/clang +-- Check for working C compiler: /home/ohos/tools/OH_SDK/ohos-sdk/linux/native/llvm/bin/clang -- works +# 删除大量 cmake 日志 +-- Check if the system is big endian - little endian +-- Found ZLIB: /home/ohos/tools/OH_SDK/ohos-sdk/linux/native/sysroot/usr/lib/aarch64-linux-ohos/libz.so (found suitable version "1.2.12", minimum required is "1.1.2") +-- Could NOT find BZip2 (missing: BZIP2_LIBRARIES BZIP2_INCLUDE_DIR) +CMake Warning at CMakeLists.txt:186 (message): + -- bzip2 library not found; bzip2 support disabled +CHECK_STARTLooking for lzma_auto_decoder in /home/ohos/openHarmony/ohos_libzip/libzip-1.9.2/ohos64build/../../usr/lib/liblzma.so +CHECK_PASSfound +CHECK_STARTLooking for lzma_easy_encoder in /home/ohos/openHarmony/ohos_libzip/libzip-1.9.2/ohos64build/../../usr/lib/liblzma.so +CHECK_PASSfound +CHECK_STARTLooking for lzma_lzma_preset in /home/ohos/openHarmony/ohos_libzip/libzip-1.9.2/ohos64build/../../usr/lib/liblzma.so +CHECK_PASSfound +# 日志显示找到了 liblzma 并满足版本要求 +-- Found LibLZMA: /home/ohos/openHarmony/ohos_libzip/libzip-1.9.2/ohos64build/../../usr/lib/liblzma.so (found suitable version "5.4.1", minimum required is "5.2") +-- Could NOT find Zstd (missing: Zstd_LIBRARY Zstd_INCLUDE_DIR) (Required is at least version "1.3.6") +CMake Warning at CMakeLists.txt:204 (message): + -- zstd library not found; zstandard support disabled + + +CMake Warning at CMakeLists.txt:226 (message): + -- neither Common Crypto, GnuTLS, mbed TLS, OpenSSL, nor Windows + Cryptography found; AES support disabled + + +-- Looking for getopt +-- Looking for getopt - found +-- Found Perl: /usr/local/bin/perl (found version "5.34.1") +# 删除大量 cmake 日志 +MDOCTOOL:FILEPATH=/usr/bin/groff +SHARED_LIB_VERSIONNING:BOOL=ON +ohos@ubuntu20:~/openHarmony/ohos_libzip/libzip-1.9.2/ohos64build$ +ohos@ubuntu20:~/openHarmony/ohos_libzip/libzip-1.9.2/ohos64build$ make -j && make install +Scanning dependencies of target nonrandomopen +Scanning dependencies of target man +Scanning dependencies of target liboverride +Scanning dependencies of target testinput +Scanning dependencies of target zip +[ 1%] Preparing ZIP_SOURCE_GET_ARGS.3 +# 删除大量的 make && make install 日志 +-- Installing: /home/ohos/openHarmony/ohos_libzip/usr/bin/zipcmp +-- Set runtime path of "/home/ohos/openHarmony/ohos_libzip/usr/bin/zipcmp" to "/home/ohos/openHarmony/ohos_libzip/usr/lib" +-- Installing: /home/ohos/openHarmony/ohos_libzip/usr/bin/zipmerge +-- Set runtime path of "/home/ohos/openHarmony/ohos_libzip/usr/bin/zipmerge" to "/home/ohos/openHarmony/ohos_libzip/usr/lib" +-- Installing: /home/ohos/openHarmony/ohos_libzip/usr/bin/ziptool +-- Set runtime path of "/home/ohos/openHarmony/ohos_libzip/usr/bin/ziptool" to "/home/ohos/openHarmony/ohos_libzip/usr/lib" +ohos@ubuntu20:~/openHarmony/ohos_libzip/libzip-1.9.2/ohos64build$ +# 检查编译出的libzip +ohos@ubuntu20:~/openHarmony/ohos_libzip/libzip-1.9.2/ohos64build$ cd ../../usr/ +ohos@ubuntu20:~/openHarmony/ohos_libzip/usr$ ls +bin include lib share +ohos@ubuntu20:~/openHarmony/ohos_libzip/usr$ ls bin/ +lzcat lzma unlzma unxz xz xzcat xzdec zipcmp zipmerge ziptool +ohos@ubuntu20:~/openHarmony/ohos_libzip/usr$ ls lib/ +cmake liblzma.a liblzma.so liblzma.so.5 liblzma.so.5.4.1 libzip.so libzip.so.5 libzip.so.5.5 pkgconfig +ohos@ubuntu20:~/openHarmony/ohos_libzip/usr$ file lib/libzip.so.5.5 +lib/libzip.so.5.5: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0a2918c4f372d034a02297310869a18d9dd2ae1a, with debug_info, not stripped +ohos@ubuntu20:~/openHarmony/ohos_libzip/usr$ readelf -d lib/libzip.so.5.5 + +Dynamic section at offset 0x1fff8 contains 28 entries: + Tag Type Name/Value + 0x000000000000001d (RUNPATH) Library runpath: [/home/ohos/openHarmony/ohos_libzip/usr/lib] + 0x0000000000000001 (NEEDED) Shared library: [liblzma.so.5] # 可以看到 liblzma.so.5 是 NEEDED + 0x0000000000000001 (NEEDED) Shared library: [libz.so] + 0x0000000000000001 (NEEDED) Shared library: [libc.so] + 0x000000000000000e (SONAME) Library soname: [libzip.so.5] + 0x000000000000001e (FLAGS) BIND_NOW + 0x000000006ffffffb (FLAGS_1) Flags: NOW + 0x0000000000000007 (RELA) 0x28a0 + 0x0000000000000008 (RELASZ) 3120 (bytes) + 0x0000000000000009 (RELAENT) 24 (bytes) + 0x000000006ffffff9 (RELACOUNT) 123 + 0x0000000000000017 (JMPREL) 0x34d0 + 0x0000000000000002 (PLTRELSZ) 2760 (bytes) + 0x0000000000000003 (PLTGOT) 0x22220 + 0x0000000000000014 (PLTREL) RELA + 0x0000000000000006 (SYMTAB) 0x2a8 + 0x000000000000000b (SYMENT) 24 (bytes) + 0x0000000000000005 (STRTAB) 0x1ca8 + 0x000000000000000a (STRSZ) 3060 (bytes) + 0x000000006ffffef5 (GNU_HASH) 0x13a0 + 0x0000000000000004 (HASH) 0x16f8 + 0x0000000000000019 (INIT_ARRAY) 0x21c90 + 0x000000000000001b (INIT_ARRAYSZ) 8 (bytes) + 0x000000000000001a (FINI_ARRAY) 0x21c98 + 0x000000000000001c (FINI_ARRAYSZ) 16 (bytes) + 0x000000000000000c (INIT) 0x2051c + 0x000000000000000d (FINI) 0x2052c + 0x0000000000000000 (NULL) 0x0 +ohos@ubuntu20:~/openHarmony/ohos_libzip/usr$ +``` + +完成。 + +大家可以自己试试 zstd openssl 等库的依赖实现。 \ No newline at end of file diff --git a/tools/doc/ohos_use_sdk/OHOS_SDK-Usage.md b/tools/doc/ohos_use_sdk/OHOS_SDK-Usage.md new file mode 100755 index 00000000..11d7f144 --- /dev/null +++ b/tools/doc/ohos_use_sdk/OHOS_SDK-Usage.md @@ -0,0 +1,369 @@ +Linux 环境下 使用 OpenHarmony SDK 编译,OpenHarmony standard 系统北向应用 c/c++ 库 + +## OpenHarmony Linux 环境 SDK 使用说明 + +### 下载SDK + +​ 从 openHarmony SDK [官方发布渠道](https://gitee.com/openharmony-sig/oh-inner-release-management/blob/master/Release-Testing-Version.md)(13b8b5812ce3b3b135743baa6629ed84bd380d8c)下载SDK + +![](./ohos_sdk下载.png) + +​ 可以同时下载对应的系统镜像(这里提供的是 32bit OHOS 镜像下载),后面依次为 Windows/Linux 环境下的 SDK,SDK 分为两个版本 full 版本和 public 版本。这两个版本的 SDK 中关于 c/c++ 编译的部分是相同的,因此我们下载那个都一样( full 版本的 SDK 在 ets 层提供了更多的 API )。再后面是 mac 环境的OHOS SDK 。根据自己环境自行下载对应版本的 SDK 。 + +### 解压SDK + +```shell + tar -zxvf version-Master_Version-OpenHarmony_3.2.10.3-20230105_163913-ohos-sdk-full.tar.gz +``` + +进入解压得到 ohos_sdk 目录,可以看到 Linux 和 windows 两个平台的 SDK 目录,我们进入 linux。 + +``` +ohos@ubuntu20:~/tools/OH_SDK$ cd ohos-sdk +ohos@ubuntu20:~/tools/OH_SDK/ohos-sdk$ ls +linux windows +ohos@ubuntu20:~/tools/OH_SDK/ohos-sdk$ cd linux/ +ohos@ubuntu20:~/tools/OH_SDK/ohos-sdk/linux$ ls +ets-linux-x64-4.0.1.2-Canary1.zip native-linux-x64-4.0.1.2-Canary1.zip toolchains-linux-x64-4.0.1.2-Canary1.zip +js-linux-x64-4.0.1.2-Canary1.zip previewer-linux-x64-4.0.1.2-Canary1.zip +``` + +解压 Linux 环境下的 OHOS SDK 工具包,得到对应的工具目录。由于我们是 c/c++ 库的编译,我们只关注 native 目录。 + +```shell +ohos@ubuntu20:~/tools/OH_SDK/ohos-sdk/linux$ for i in *.zip;do unzip ${i};done +ohos@ubuntu20:~/tools/OH_SDK/ohos-sdk/linux$ ls +ets native toolchains +ets-linux-x64-4.0.1.2-Canary1.zip native-linux-x64-4.0.1.2-Canary1.zip toolchains-linux-x64-4.0.1.2-Canary1.zip +js previewer +js-linux-x64-4.0.1.2-Canary1.zip previewer-linux-x64-4.0.1.2-Canary1.zip +``` + +### native 目录介绍 + +```sh +ohos@ubuntu20:~/tools/OH_SDK/ohos-sdk/linux$ cd native/ +ohos@ubuntu20:~/tools/OH_SDK/ohos-sdk/linux/native$ ls +build docs nativeapi_syscap_config.json NOTICE.txt sysroot +build-tools llvm ndk_system_capability.json oh-uni-package.json +``` + +build 目录存放的是 构建时 cmake 依赖的配置文件 + +build-tools 目录存放的是 构建工具包含 cmake 和 ninja,我们后面采用 make 进行构建。 + +docs 目录存放 使用说明 + +llvm 目录存放 clang 编译器 + +sysroot 目录为编译器的 sysroot 目录,存放 SDK 内部的已经包含的库和对应的头文件 + +oh-uni-package.json 为 SDK 信息描述,如版本 + +NOTICE.txt 为注意事项,内容多为 SDK 的详细描述 + +ndk_system_capability.json 记录 SDK 提供的能力 + +nativeapi_syscap_config.json 记录 SDK 提供的能力对应的头文件 + +**build和build-tools目录提供构建时的 cmake,ninja,以及 toolchain 依赖。llvm 提供编译工具链。sysroot 提供 usr 系统资源** + +## OHOS SDK 使用 +本片介绍基本用法, 涉及到库有依赖的情况请[移步](./OHOS_SDK-Usage--depend-libs.md). +### 编译cmake构建的库 + +​ SDK 采用 cmake 作为默认的编译脚本工具和 deveco 开发工具是一致的。并且 cmake 也是现如今 c/c++ 开发最流行的编译构建脚本。以下我使用 cjson 作为实例演示一下 OHOS SDK 构建 cmake 项目的步骤。 + +​ 首先下载/clone cJSON 源码,我这里下载的 v1.7.15 版本 + +```shell +ohos@ubuntu20:~/openHarmony$ git clone https://github.com/DaveGamble/cJSON.git -b v1.7.15 +Cloning into 'cJSON'... +remote: Enumerating objects: 4545, done. +remote: Total 4545 (delta 0), reused 0 (delta 0), pack-reused 4545 +Receiving objects: 100% (4545/4545), 2.45 MiB | 1.65 MiB/s, done. +Resolving deltas: 100% (3026/3026), done. +Note: switching to 'd348621ca93571343a56862df7de4ff3bc9b5667'. + +You are in 'detached HEAD' state. You can look around, make experimental +changes and commit them, and you can discard any commits you make in this +state without impacting any branches by switching back to a branch. + +If you want to create a new branch to retain commits you create, you may +do so (now or later) by using -c with the switch command. Example: + + git switch -c + +Or undo this operation with: + + git switch - + +Turn off this advice by setting config variable advice.detachedHead to false + +ohos@ubuntu20:~/openHarmony$ +``` + +​ 进入 cJson 目录,创建 ohos64build 目录(存放构建文件)。执行 cmake,生成 makefile + +``` +ohos@ubuntu20:~/openHarmony/cJSON/ohos64build$ /home/ohos/tools/OH_SDK/ohos-sdk/linux/native/build-tools/cmake/bin/cmake -DCMAKE_TOOLCHAIN_FILE=/home/ohos/tools/OH_SDK/ohos-sdk/linux/native/build/cmake/ohos.toolchain.cmake .. -L + # 如果需要编译静态库则需要设置 cmake 变量 -DBUILD_SHARED_LIBS=OFF + # 可以通过-DCMAKE_INSTALL_PREFIX=xxx 设置库的安装目录 + # 编译 arm32 -DOHOS_ARCH=armeabi-v7a +-- The C compiler identification is Clang 12.0.1 +-- Check for working C compiler: /home/ohos/tools/OH_SDK/ohos-sdk/linux/native/llvm/bin/clang # 采用sdk内的编译器 +-- Check for working C compiler: /home/ohos/tools/OH_SDK/ohos-sdk/linux/native/llvm/bin/clang -- works +# 删除大量 cmake 日志 +ENABLE_PUBLIC_SYMBOLS:BOOL=ON +ENABLE_SAFE_STACK:BOOL=OFF +ENABLE_SANITIZERS:BOOL=OFF +ENABLE_TARGET_EXPORT:BOOL=ON +ENABLE_VALGRIND:BOOL=OFF +ohos@ubuntu20:~/openHarmony/cJSON/ohos64build$ +``` + +​ 注意这里执行的 cmake 是 SDK 内的 cmake ,不是你自己系统上原有的 cmake 。包括 toolchain file 也是 SDK 内的。执行 make 即可编译出 cjson 库 + +``` +ohos@ubuntu20:~/openHarmony/cJSON/ohos64build$ make +Scanning dependencies of target cjson +[ 2%] Building C object CMakeFiles/cjson.dir/cJSON.c.o +clang: warning: argument unused during compilation: '--gcc-toolchain=/home/ohos/tools/OH_SDK/ohos-sdk/linux/native/llvm' [-Wunused-command-line-argument] +# 删除大量 make 日志 +[100%] Linking C executable fuzz_main +[100%] Built target fuzz_main +ohos@ubuntu20:~/openHarmony/cJSON/ohos64build$ +``` + +​ 使用 file 命令,查看编译出的 elf 文件的属性。可以看到动态库和可执行程序都是 ARM aarch64 架构的。ohos cmake toolchainfile 在不设置 cpu 架构时默认为 aarch64 . 如果你需要编译 arm32 的需要在cmake时加上参数 -DOHOS_ARCH=armeabi-v7a + +```sh +ohos@ubuntu20:~/openHarmony/cJSON/ohos64build$ ls +cJSONConfig.cmake cJSON_test CMakeFiles CTestTestfile.cmake libcjson.pc libcjson.so.1 Makefile +cJSONConfigVersion.cmake CMakeCache.txt cmake_install.cmake fuzzing libcjson.so libcjson.so.1.7.15 tests +ohos@ubuntu20:~/openHarmony/cJSON/ohos64build$ file libcjson.so.1.7.15 cJSON_test +libcjson.so.1.7.15: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=98d32cd8235a77985fec1419150fe2c97c8c8c38, with debug_info, not stripped +cJSON_test: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-aarch64.so.1, BuildID[sha1]=20770aaad711d8286819f193e8d10034cdb3cedc, with debug_info, not stripped +ohos@ubuntu20:~/openHarmony/cJSON/ohos64build$ +``` + +### 编译非 cmake 构建的库 + +​ 开源社区存在着大量的非 cmake 构建的库,如何使用 OpenHarmony 的 SDK 编译它们呢? + +#### 方法1:我们可以使用 cmake 构建脚本重写开源库的构建过程 + +​ 这种方法需要分析源库的构建脚本或者分析源库的编译构建日志,我这里推荐简单点的分析构建日志(可以不必去学习 configure 的语法)。很多库为了性能一般会对代码进行处理器级的优化(SIMD: SSE,AVX; NEON),因此编译构建日志最好采用交叉编译工具链的日志,不要盲目的根据 x86_64 的构建日志进行翻译(cmake)。如果使用此方法请参考 oh 三方库 [cmake 编写指导](https://gitee.com/huangminzhong/cmake_study)及[编写规范](../cmake_specification.md)。 + +#### 方法2:使用项目原生的构建工具例如 configure、makefile + +​ 如何使用原生的构建工具?首先我们需要知道构建脚本并不是直接调用 gcc 或者 clang 编译工具链的。而是优先调用 CC 环境变量以达到调用 c 编译器的目的,对应的 CXX 环境变量对应 c++ 编译器...。等等一系列的编译工具都有自己对应的环境变量。通过设置这些环境变量,让构建工具使用 ohos SDK 的编译工具链。 + +​ 设置 ohos 64bit 库编译工具链环境变量 + +``` +#aarch64-linux-ohos +export OHOS_SDK=/home/ohos/tools/OH_SDK/ohos-sdk/linux # 此处是我的ohos_sdk解压目录,请替换为你自己的解压目录 +export AS=${OHOS_SDK}/native/llvm/bin/llvm-as +export CC="${OHOS_SDK}/native/llvm/bin/clang --target=aarch64-linux-ohos" +export CXX="${OHOS_SDK}/native/llvm/bin/clang++ --target=aarch64-linux-ohos" +export LD=${OHOS_SDK}/native/llvm/bin/ld.lld +export STRIP=${OHOS_SDK}/native/llvm/bin/llvm-strip +export RANLIB=${OHOS_SDK}/native/llvm/bin/llvm-ranlib +export OBJDUMP=${OHOS_SDK}/native/llvm/bin/llvm-objdump +export OBJCOPY=${OHOS_SDK}/native/llvm/bin/llvm-objcopy +export NM=${OHOS_SDK}/native/llvm/bin/llvm-nm +export AR=${OHOS_SDK}/native/llvm/bin/llvm-ar +export CFLAGS="-fPIC -D__MUSL__=1" +export CXXFLAGS="-fPIC -D__MUSL__=1" +``` + +​ 设置 ohos 32bit 库编译工具链环境变量 + +``` +linux-arm +export OHOS_SDK=/home/ohos/tools/OH_SDK/ohos-sdk/linux # 此处是我的ohos_sdk解压目录,请替换为你自己的解压目录 +export AS=${OHOS_SDK}/native/llvm/bin/llvm-as +export CC="${OHOS_SDK}/native/llvm/bin/clang --target=arm-linux-ohos" +export CXX="${OHOS_SDK}/native/llvm/bin/clang++ --target=arm-linux-ohos" +export LD=${OHOS_SDK}/native/llvm/bin/ld.lld +export STRIP=${OHOS_SDK}/native/llvm/bin/llvm-strip +export RANLIB=${OHOS_SDK}/native/llvm/bin/llvm-ranlib +export OBJDUMP=${OHOS_SDK}/native/llvm/bin/llvm-objdump +export OBJCOPY=${OHOS_SDK}/native/llvm/bin/llvm-objcopy +export NM=${OHOS_SDK}/native/llvm/bin/llvm-nm +export AR=${OHOS_SDK}/native/llvm/bin/llvm-ar +export CFLAGS="-fPIC -march=armv7a -D__MUSL__=1" +export CXXFLAGS="-fPIC -march=armv7a -D__MUSL__=1" +``` + + 使用unset 命令可以撤销环境变量 + +``` + unset OHOS_SDK AS CC CXX LD STRIP RANLIB OBJDUMP OBJCOPY NM AR CFLAGS CXXFLAGS +``` + + 设置好编译工具链之后,只要按照标准的 configure 用法即可. + +### 实例操作 + +​ 下面以 openssl 为例,使用 ohos 的 SDK 编译 openharmony 系统下的 openssl 库( openssl 官方仓使用 configure 编译)。 + +​ 首先下载/clone openssl 官方源码,我是用的版本为 OpenSSL_1_1_1t + +``` +ohos@ubuntu20:~/openHarmony$ git clone https://github.com/openssl/openssl.git -b OpenSSL_1_1_1t +Cloning into 'openssl'... +remote: Enumerating objects: 446051, done. +remote: Counting objects: 100% (342/342), done. +remote: Compressing objects: 100% (183/183), done. +remote: Total 446051 (delta 207), reused 259 (delta 159), pack-reused 445709 +Receiving objects: 100% (446051/446051), 272.13 MiB | 1.53 MiB/s, done. +Resolving deltas: 100% (316557/316557), done. +Note: switching to '830bf8e1e4749ad65c51b6a1d0d769ae689404ba'. + +You are in 'detached HEAD' state. You can look around, make experimental +changes and commit them, and you can discard any commits you make in this +state without impacting any branches by switching back to a branch. + +If you want to create a new branch to retain commits you create, you may +do so (now or later) by using -c with the switch command. Example: + + git switch -c + +Or undo this operation with: + + git switch - + +Turn off this advice by setting config variable advice.detachedHead to false +``` + +​ 设置需要的编译工具链环境变量,这里设置的时 ohos64bit 库的编译工具链,如果需要编译 ohos32bit 库请设置为 32bit 编译工具链 + +``` +ohos@ubuntu20:~/openHarmony/openssl$ export OHOS_SDK=/home/ohos/tools/OH_SDK/ohos-sdk/linux #这里根据自己的SDK解压目录设置 +ohos@ubuntu20:~/openHarmony/openssl$ export AS=${OHOS_SDK}/native/llvm/bin/llvm-as +ohos@ubuntu20:~/openHarmony/openssl$ export CC="${OHOS_SDK}/native/llvm/bin/clang --target=aarch64-linux-ohos" +ohos@ubuntu20:~/openHarmony/openssl$ export CXX="${OHOS_SDK}/native/llvm/bin/clang++ --target=aarch64-linux-ohos" +ohos@ubuntu20:~/openHarmony/openssl$ export LD=${OHOS_SDK}/native/llvm/bin/lld +ohos@ubuntu20:~/openHarmony/openssl$ export STRIP=${OHOS_SDK}/native/llvm/bin/llvm-strip +ohos@ubuntu20:~/openHarmony/openssl$ export RANLIB=${OHOS_SDK}/native/llvm/bin/llvm-ranlib +ohos@ubuntu20:~/openHarmony/openssl$ export OBJDUMP=${OHOS_SDK}/native/llvm/bin/llvm-objdump +ohos@ubuntu20:~/openHarmony/openssl$ export OBJCOPY=${OHOS_SDK}/native/llvm/bin/llvm-objcopy +ohos@ubuntu20:~/openHarmony/openssl$ export NM=${OHOS_SDK}/native/llvm/bin/llvm-nm +ohos@ubuntu20:~/openHarmony/openssl$ export AR=${OHOS_SDK}/native/llvm/bin/llvm-ar +ohos@ubuntu20:~/openHarmony/openssl$ export CFLAGS="-fPIC -D__MUSL__=1" +ohos@ubuntu20:~/openHarmony/openssl$ export CXXFLAGS="-fPIC -D__MUSL__=1" +``` + +​ 执行 Configure 构建脚本 + +``` +ohos@ubuntu20:~/openHarmony/openssl$ ./Configure linux-aarch64 --prefix=/home/ohos/openHarmony/openssl_instrall + # 在需要选择系统的时候由于configure不识别ohos,因此我们需要使用Linux aarch64等价系统和cpu架构 为了方便打包,需要指定安装目录 +Configuring OpenSSL version 1.1.1t (0x1010114fL) for linux-aarch64 +Using os-specific seed configuration +Creating configdata.pm +Creating Makefile + +********************************************************************** +*** *** +*** OpenSSL has been successfully configured *** +*** *** +*** If you encounter a problem while building, please open an *** +*** issue on GitHub *** +*** and include the output from the following command: *** +*** *** +*** perl configdata.pm --dump *** +*** *** +*** (If you are new to OpenSSL, you might want to consult the *** +*** 'Troubleshooting' section in the INSTALL file first) *** +*** *** +********************************************************************** +ohos@ubuntu20:~/openHarmony/openssl$ make +/usr/bin/perl "-I." -Mconfigdata "util/dofile.pl" \ + "-oMakefile" include/crypto/bn_conf.h.in > include/crypto/bn_conf.h +/usr/bin/perl "-I." -Mconfigdata "util/dofile.pl" \ + "-oMakefile" include/crypto/dso_conf.h.in > include/crypto/dso_conf.h +/usr/bin/perl "-I." -Mconfigdata "util/dofile.pl" \ + "-oMakefile" include/openssl/opensslconf.h.in > include/openssl/opensslconf.h +make depend && make _all +make[1]: Entering directory '/home/ohos/openHarmony/openssl' +make[1]: Leaving directory '/home/ohos/openHarmony/openssl' +make[1]: Entering directory '/home/ohos/openHarmony/openssl' +/home/ohos/tools/OH_SDK/ohos-sdk/linux/native/llvm/bin/clang -I. -Iinclude -fPIC -pthread -Wa,--noexecstack -Qunused-arguments -fPIC --target=aarch64-linux-ohos -D__MUSL__=1 -DOPENSSL_USE_NODELETE -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DVPAES_ASM -DECP_NISTZ256_ASM -DPOLY1305_ASM -DOPENSSLDIR="\"/home/ohos/openHarmony/openssl_install/ssl\"" -DENGINESDIR="\"/home/ohos/openHarmony/openssl_install/lib/engines-1.1\"" -DNDEBUG -MMD -MF apps/app_rand.d.tmp -MT apps/app_rand.o -c -o apps/app_rand.o apps/app_rand.c +# 删除大量 make 日志 +${LDCMD:-/home/ohos/tools/OH_SDK/ohos-sdk/linux/native/llvm/bin/clang} -pthread -Wa,--noexecstack -Qunused-arguments -fPIC --target=aarch64-linux-ohos -D__MUSL__=1 -L. \ + -o test/x509aux test/x509aux.o \ + test/libtestutil.a -lcrypto -ldl -pthread +/usr/bin/perl "-I." -Mconfigdata "util/dofile.pl" \ + "-oMakefile" apps/CA.pl.in > "apps/CA.pl" +chmod a+x apps/CA.pl +/usr/bin/perl "-I." -Mconfigdata "util/dofile.pl" \ + "-oMakefile" apps/tsget.in > "apps/tsget.pl" +chmod a+x apps/tsget.pl +/usr/bin/perl "-I." -Mconfigdata "util/dofile.pl" \ + "-oMakefile" tools/c_rehash.in > "tools/c_rehash" +chmod a+x tools/c_rehash +/usr/bin/perl "-I." -Mconfigdata "util/dofile.pl" \ + "-oMakefile" util/shlib_wrap.sh.in > "util/shlib_wrap.sh" +chmod a+x util/shlib_wrap.sh +make[1]: Leaving directory '/home/ohos/openHarmony/openssl' +ohos@ubuntu20:~/openHarmony/openssl$ make install +make depend && make _build_libs +make[1]: Entering directory '/home/ohos/openHarmony/openssl' +make[1]: Leaving directory '/home/ohos/openHarmony/openssl' +make[1]: Entering directory '/home/ohos/openHarmony/openssl' +make[1]: Nothing to be done for '_build_libs'. +make[1]: Leaving directory '/home/ohos/openHarmony/openssl' +created directory `/home/ohos/openHarmony/openssl_install/lib' +*** Installing runtime libraries +install libcrypto.so.1.1 -> /home/ohos/openHarmony/openssl_install/lib/libcrypto.so.1.1 +install libssl.so.1.1 -> /home/ohos/openHarmony/openssl_install/lib/libssl.so.1.1 +*** Installing development files +created directory `/home/ohos/openHarmony/openssl_install/include' +created directory `/home/ohos/openHarmony/openssl_install/include/openssl' +install ./include/openssl/aes.h -> /home/ohos/openHarmony/openssl_install/include/openssl/aes.h +install ./include/openssl/asn1.h -> /home/ohos/openHarmony/openssl_install/include/openssl/asn1.h +install ./include/openssl/asn1_mac.h -> /home/ohos/openHarmony/openssl_install/include/openssl/asn1_mac.h +# 删除大量 install 日志 +/home/ohos/openHarmony/openssl_install/share/doc/openssl/html/man7/X25519.html +/home/ohos/openHarmony/openssl_install/share/doc/openssl/html/man7/X448.html -> /home/ohos/openHarmony/openssl_install/share/doc/openssl/html/man7/X25519.html +/home/ohos/openHarmony/openssl_install/share/doc/openssl/html/man7/x509.html +ohos@ubuntu20:~/openHarmony/openssl$ +``` + +​ 安装完成后查看安装目录,可以看到可执行程序,动态库,静态库,头文件均已安装到指定目录 + +``` +ohos@ubuntu20:~/openHarmony/openssl$ cd ../openssl_install/ +ohos@ubuntu20:~/openHarmony/openssl_install$ ls +bin include lib share ssl +ohos@ubuntu20:~/openHarmony/openssl_install$ ls bin/ +c_rehash openssl +ohos@ubuntu20:~/openHarmony/openssl_install$ ls lib/ +engines-1.1 libcrypto.a libcrypto.so libcrypto.so.1.1 libssl.a libssl.so libssl.so.1.1 pkgconfig +ohos@ubuntu20:~/openHarmony/openssl_install$ ls include/ +openssl +ohos@ubuntu20:~/openHarmony/openssl_install$ ls include/openssl/ +aes.h bnerr.h comp.h dh.h engine.h md2.h opensslconf.h rand_drbg.h seed.h store.h x509.h +asn1err.h bn.h conf_api.h dsaerr.h e_os2.h md4.h opensslv.h randerr.h sha.h symhacks.h x509v3err.h +asn1.h buffererr.h conferr.h dsa.h err.h md5.h ossl_typ.h rand.h srp.h tls1.h x509v3.h +asn1_mac.h buffer.h conf.h dtls1.h evperr.h mdc2.h pem2.h rc2.h srtp.h tserr.h x509_vfy.h +asn1t.h camellia.h cryptoerr.h ebcdic.h evp.h modes.h pemerr.h rc4.h ssl2.h ts.h +asyncerr.h cast.h crypto.h ecdh.h hmac.h objectserr.h pem.h rc5.h ssl3.h txt_db.h +async.h cmac.h cterr.h ecdsa.h idea.h objects.h pkcs12err.h ripemd.h sslerr.h uierr.h +bioerr.h cmserr.h ct.h ecerr.h kdferr.h obj_mac.h pkcs12.h rsaerr.h ssl.h ui.h +bio.h cms.h des.h ec.h kdf.h ocsperr.h pkcs7err.h rsa.h stack.h whrlpool.h +blowfish.h comperr.h dherr.h engineerr.h lhash.h ocsp.h pkcs7.h safestack.h storeerr.h x509err.h +ohos@ubuntu20:~/openHarmony/openssl_install$ file lib/* +lib/engines-1.1: directory +lib/libcrypto.a: current ar archive +lib/libcrypto.so: symbolic link to libcrypto.so.1.1 +lib/libcrypto.so.1.1: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, with debug_info, not stripped +lib/libssl.a: current ar archive +lib/libssl.so: symbolic link to libssl.so.1.1 +lib/libssl.so.1.1: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, with debug_info, not stripped +lib/pkgconfig: directory + +``` diff --git "a/tools/doc/ohos_use_sdk/ohos_sdk\344\270\213\350\275\275.png" "b/tools/doc/ohos_use_sdk/ohos_sdk\344\270\213\350\275\275.png" new file mode 100755 index 0000000000000000000000000000000000000000..dae8a157f1b38d7aaa1672cc743c1579a214e276 GIT binary patch literal 97904 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 literal 0 HcmV?d00001 diff --git a/tools/script/build_hpk.sh b/tools/script/build_hpk.sh new file mode 100755 index 00000000..79f5fb22 --- /dev/null +++ b/tools/script/build_hpk.sh @@ -0,0 +1,175 @@ +#!/bin/bash +# 退出码检查 +sure() +{ + eval $* + err=$? + if [ "$err" != "0" ] + then + echo "ERROR during : $*" + echo "ERROR during : $* $err" > last_error + exit 1 + fi +} + +# 加载库信息 +source ${PWD}/HPKBUILD + +# 下载库压缩包 +# 参数1 链接地址 +# 参数2 压缩包名 +download() { + if [ -s ${PWD}/$2 ] + then + echo ${PWD}/$2",存在" + else + curl -f -L -- "$1" > ${PWD}/$2 + fi +} + +# 库的完整性校验 +checksum() { + sha512sum -c ${PWD}/$1 + ret=$? + if [ $ret -ne 0 ] + then + echo ${PWD}/$1" ERROR!" + echo "请检查$pkgname SHA512SUM 文件, 并重新下载src压缩包." + exit $ret + fi +} + +# 解压库 +# 参数1 压缩包名 +unpack(){ + if [ -f ${PWD}/$1 ] + then + if [[ "$1" == *.tar.gz ]] + then + echo ${PWD}/$1 + tar -zxvf ${PWD}/$1 > /dev/null + elif [[ "$1" == *.tgz ]] + then + echo ${PWD}/$1 + tar -zxvf ${PWD}/$1 > /dev/null + + elif [[ "$1" == *.tar.xz ]] + then + echo ${PWD}/$1 + tar -xvJf ${PWD}/$1 > /dev/null + elif [[ "$1" == *.tar.bz2 ]] + then + echo ${PWD}/$1 + tar -xvjf ${PWD}/$1 > /dev/null + elif [[ "$1" == *.zip ]] + then + echo ${PWD}/$1 + unzip ${PWD}/$1 > /dev/null + else + echo "ERROR Package Format!" + exit 2 + fi + else + echo "ERROR Package Not Found!" + exit 2 + fi +} + +builddepends() { + donelist=($*) + # 如果有依赖没有编译完,则跳过编译后续再次编译 + deplen=${#depends[*]} + count=0 + for depend in ${depends[@]} + do + for donelib in ${donelist[@]} + do + if [ $depend == $donelib ] + then + count=$((count+1)) + fi + done + done + if [ $count -ne $deplen ] + then + return 101 + fi + return 0 +} + +recordbuildlibs() { + echo $2,$3,$1>> `pwd`/../../usr/hpk_build.csv +} + +dependpath= +cmakedependpath() { + dependpath="-DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake -DCMAKE_INSTALL_PREFIX=`pwd`/../../usr/$pkgname-$1-install " + if [ ${#depends[@]} -ne 0 ] + then + tmppath="\"" + for depend in ${depends[@]} + do + tmppath=$tmppath"`pwd`/../../usr/$depend-$1-install;" + done + tmppath=$tmppath"\"" + dependpath=$dependpath"-DCMAKE_FIND_ROOT_PATH="$tmppath + fi +} +configuredependpath() { + dependpath="--prefix=`pwd`/../../usr/$pkgname-$1-install" +} + +builpackage() { + donelist=($*) + builddepends "${donelist[*]}" + if [ $? -eq 101 ] + then + echo $pkgname" not ready. wait "${depends[*]} + exit 101 + fi + echo "Build $pkgname $pkgver strat!" + if [ ! $downloadpackage ] || [ $downloadpackage != false ] + then + sure download $source $packageName + sure checksum SHA512SUM + fi + if [ ! $autounpack ] || [ $autounpack != false ] + then + sure unpack $packageName + fi + for arch in ${archs[@]} + do + echo "Compileing OpenHarmony $arch $pkgname $pkgver libs..." + ARCH=$arch + sure prepare + if [ ! $buildtools ] || [ $buildtools == "cmake" ] + then + sure cmakedependpath $ARCH + elif [ $buildtools == "configure" ] + then + sure configuredependpath $ARCH + else + echo "buildtools $buildtools, 需要用户自己传入编译参数(安装路径)" + fi + sure build $dependpath + sure package + sure check + sure recordbuildlibs $ARCH $pkgname $pkgver + done + echo "Build $pkgname $pkgver end!" +} + +cleanhpk(){ + sure cleanbuild +} + +main() { + # 根目录 + LYCIUM_ROOT=`pwd`/../.. + # 清理上次的环境 + sure cleanhpk + # 编译 PKG + sure builpackage $* +} + +main $* \ No newline at end of file diff --git a/tools/script/envset.sh b/tools/script/envset.sh new file mode 100755 index 00000000..485746e0 --- /dev/null +++ b/tools/script/envset.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +setarm32ENV(){ + export AS=${OHOS_SDK}/native/llvm/bin/llvm-as + export CC=${OHOS_SDK}/native/llvm/bin/arm-linux-ohos-clang + export CXX=${OHOS_SDK}/native/llvm/bin/arm-linux-ohos-clang++ + export LD=${OHOS_SDK}/native/llvm/bin/ld.lld + export STRIP=${OHOS_SDK}/native/llvm/bin/llvm-strip + export RANLIB=${OHOS_SDK}/native/llvm/bin/llvm-ranlib + export OBJDUMP=${OHOS_SDK}/native/llvm/bin/llvm-objdump + export OBJCOPY=${OHOS_SDK}/native/llvm/bin/llvm-objcopy + export NM=${OHOS_SDK}/native/llvm/bin/llvm-nm + export AR=${OHOS_SDK}/native/llvm/bin/llvm-ar + export CFLAGS="-fPIC -march=armv7a -D__MUSL__=1" + export CXXFLAGS="-fPIC -march=armv7a -D__MUSL__=1" + export LDFLAGS="" +} + +unsetarm32ENV(){ + unset AS CC CXX LD STRIP RANLIB OBJDUMP OBJCOPY NM AR CFLAGS CXXFLAGS LDFLAGS +} + +setarm64ENV(){ + export AS=${OHOS_SDK}/native/llvm/bin/llvm-as + export CC=${OHOS_SDK}/native/llvm/bin/aarch64-linux-ohos-clang + export CXX=${OHOS_SDK}/native/llvm/bin/aarch64-linux-ohos-clang++ + export LD=${OHOS_SDK}/native/llvm/bin/ld.lld + export STRIP=${OHOS_SDK}/native/llvm/bin/llvm-strip + export RANLIB=${OHOS_SDK}/native/llvm/bin/llvm-ranlib + export OBJDUMP=${OHOS_SDK}/native/llvm/bin/llvm-objdump + export OBJCOPY=${OHOS_SDK}/native/llvm/bin/llvm-objcopy + export NM=${OHOS_SDK}/native/llvm/bin/llvm-nm + export AR=${OHOS_SDK}/native/llvm/bin/llvm-ar + export CFLAGS="-fPIC -D__MUSL__=1" + export CXXFLAGS="-fPIC -D__MUSL__=1" + export LDFLAGS="" +} + +unsetarm64ENV(){ + unset AS CC CXX LD STRIP RANLIB OBJDUMP OBJCOPY NM AR CFLAGS CXXFLAGS LDFLAGS +} diff --git a/tools/template/HPKBUILD b/tools/template/HPKBUILD new file mode 100755 index 00000000..27f52b9d --- /dev/null +++ b/tools/template/HPKBUILD @@ -0,0 +1,63 @@ +# This is an example HPKBUILD file. Use this as a start to creating your own, +# and remove these comments. +# NOTE: Please fill out the license field for your package! If it is unknown, +# then please put 'unknown'. + +# Contributor: Your Name +# Maintainer: Your Name + +pkgname=NAME # 库名 +pkgver=VERSION # 库版本 +pkgrel=0 # 发布号 +pkgdesc="" # 库描述 +url="" # 官网链接 +archs=("armeabi-v7a" "arm64-v8a") # cpu 架构 +license=() +depends=() # 依赖库的目录名 必须保证被依赖的库的archs是当前库的archs的超集 +makedepends=() # 构建库时的依赖工具 +source="https://downloads.sourceforge.net/$pkgname/$pkgname-$pkgver.tar.gz" # 库源码下载链接 + +downloadpackage=true # 是否自动下载压缩包,如若不写默认 true, 一些特殊情况,代码需要代码只能 git clone (项目中依赖 submoudle ) +autounpack=true # 是否自动解压,如若不写默认 true, 如果为 false 则需要用户在 prepare 函数中自行解压 +buildtools= # 编译方法, 暂时支持cmake, configure, make等, 是什么就填写什么. 如若不写默认为cmake. + +builddir= # 源码压缩包解压后目录名 编译目录名 +packageName=$builddir.tar.gz # 压缩包名 + +# 为编译设置环境,如设置环境变量,创建编译目录等 +prepare() { + cd $builddir + cd ${OLDPWD} +} + +# ${OHOS_SDK} oh sdk安装路径 +# $ARCH 编译的架构是 archs 的遍历 +# $LYCIUM_ROOT/usr/$pkgname-$ARCH-install 安装到顶层目录的usr/$pkgname-$ARCH-install +# 执行编译构建的命令 +build() { + # 如果是cmake构建 $*=-DCMAKE_FIND_ROOT_PATH="..." -DCMAKE_TOOLCHAIN_FILE="..." -DCMAKE_INSTALL_PREFIX="..." 依赖库的搜索路径,toolchain file 路径,安装路径 + cd $builddir + ${OHOS_SDK}/native/build-tools/cmake/bin/cmake $* -DOHOS_ARCH=$ARCH -B$ARCH-build -S./ -L + make -j4 -C $ARCH-build + # 对最关键一步的退出码进行判断 + ret=$? + cd $OLDPWD + return $ret +} + +# 打包安装 +package() { + cd $builddir + make -C $ARCH-build install + cd $OLDPWD +} + +# 进行测试的准备和说明 +check() { + echo "The test must be on an OpenHarmony device!" +} + +# 清理环境 +cleanbuild(){ + rm -rf ${PWD}/$builddir #${PWD}/$packageName +} diff --git a/tools/template/README.md b/tools/template/README.md new file mode 100755 index 00000000..e8fff40d --- /dev/null +++ b/tools/template/README.md @@ -0,0 +1,5 @@ +## HPKBUILD 文件的格式 +请阅读HPKBUILD 文件. + +## SHA512SUM的格式 +SHA512SUM 记录库的压缩包的 sha512sum 值, 以及库对应的 patch 文件的sha512值. \ No newline at end of file diff --git a/tools/template/SHA512SUM b/tools/template/SHA512SUM new file mode 100755 index 00000000..16934b8a --- /dev/null +++ b/tools/template/SHA512SUM @@ -0,0 +1 @@ +*************************************************************************************** xxx.tar.gz \ No newline at end of file -- Gitee