From 5eea4fd98db50f12d4a5b10428aa2a88fbdc6a83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=94=A1=E5=A5=87?= Date: Wed, 12 Oct 2022 18:21:30 +0800 Subject: [PATCH] add zstd MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 蔡奇 --- zstd/BUILD.gn | 516 +++++++++++++++++++++++++++++++++++++ zstd/README.OpenSource | 11 + zstd/README_zh.md | 10 + zstd/bundle.json | 33 +++ zstd/docs/pic/results.png | Bin 0 -> 31138 bytes zstd/docs/rom_integrate.md | 108 ++++++++ 6 files changed, 678 insertions(+) create mode 100644 zstd/BUILD.gn create mode 100644 zstd/README.OpenSource create mode 100644 zstd/README_zh.md create mode 100644 zstd/bundle.json create mode 100644 zstd/docs/pic/results.png create mode 100644 zstd/docs/rom_integrate.md diff --git a/zstd/BUILD.gn b/zstd/BUILD.gn new file mode 100644 index 00000000..99cc7199 --- /dev/null +++ b/zstd/BUILD.gn @@ -0,0 +1,516 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build/ohos.gni") + +declare_args() { + enable_zstd_test = false +} + +config("libzstd_config") { + include_dirs = [ + ".", + "./zstd", + "./zstd/lib", + "./zstd/lib/common", + "./zstd/lib/compress", + "./zstd/lib/decompress", + "./zstd/lib/deprecated", + "./zstd/lib/dictBuilder", + "./zstd/lib/legacy", + "../lz4", + "../lz4/lib", + "../zlib", + "../xz/xz/", + "../xz/xz/src/", + "../xz/xz/dos/", + "../xz/xz/src/liblzma/api/", + "../xz/xz/src/liblzma/api/lzma/", + "../xz/xz/src/common/", + "../xz/xz/src/liblzma", + "../xz/xz/src/liblzma/common/", + "../xz/xz/src/liblzma/check", + "../xz/xz/src/lz", + "../xz/xz/src/lzma", + ] + + cflags = [ + "-fPIC", + "-Wall", + "-Wextra", + "-fexceptions", + "-Wno-error=unused-parameter", + "-Wno-error=int-conversion", + "-Wno-error=format", + "-DZSTD_BUILD_CONTRIB", + "-DZSTD_BUILD_STATIC", + "-DZSTD_BUILD_TESTS", + "-DZSTD_ZLIB_SUPPORT", + "-DZSTD_LZMA_SUPPORT", + "-Dzstd_COMPRESSION", + "-Dzstd_DECOMPRESSION", + "-Dzstd_DICTBUILDER", + "-DHAVE_LZ4", + "-DZSTD_LZ4COMPRESS", + "-DZSTD_LZ4DECOMPRESS", + "-DHAVE_PTHREAD", + "-DHAVE_THREAD", + "-DZSTD_MULTITHREAD", + "-DHAVE_ZLIB", + "-DZSTD_GZCOMPRESS", + "-DZSTD_GZDECOMPRESS", + "-DHAVE_LZMA", + "-DZSTD_LZMACOMPRESS", + "-DZSTD_LZMADECOMPRESS", + ] +} +ohos_shared_library("zstd_shared") { + sources = [ + "./zstd/lib/common/debug.c", + "./zstd/lib/common/entropy_common.c", + "./zstd/lib/common/error_private.c", + "./zstd/lib/common/fse_decompress.c", + "./zstd/lib/common/pool.c", + "./zstd/lib/common/threading.c", + "./zstd/lib/common/xxhash.c", + "./zstd/lib/common/zstd_common.c", + "./zstd/lib/compress/fse_compress.c", + "./zstd/lib/compress/hist.c", + "./zstd/lib/compress/huf_compress.c", + "./zstd/lib/compress/zstd_compress.c", + "./zstd/lib/compress/zstd_compress_literals.c", + "./zstd/lib/compress/zstd_compress_sequences.c", + "./zstd/lib/compress/zstd_compress_superblock.c", + "./zstd/lib/compress/zstd_double_fast.c", + "./zstd/lib/compress/zstd_fast.c", + "./zstd/lib/compress/zstd_lazy.c", + "./zstd/lib/compress/zstd_ldm.c", + "./zstd/lib/compress/zstd_opt.c", + "./zstd/lib/compress/zstdmt_compress.c", + "./zstd/lib/decompress/huf_decompress.c", + "./zstd/lib/decompress/zstd_ddict.c", + "./zstd/lib/decompress/zstd_decompress.c", + "./zstd/lib/decompress/zstd_decompress_block.c", + "./zstd/lib/deprecated/zbuff_common.c", + "./zstd/lib/deprecated/zbuff_compress.c", + "./zstd/lib/deprecated/zbuff_decompress.c", + "./zstd/lib/dictBuilder/cover.c", + "./zstd/lib/dictBuilder/divsufsort.c", + "./zstd/lib/dictBuilder/fastcover.c", + "./zstd/lib/dictBuilder/zdict.c", + "./zstd/lib/legacy/zstd_v01.c", + "./zstd/lib/legacy/zstd_v02.c", + "./zstd/lib/legacy/zstd_v03.c", + "./zstd/lib/legacy/zstd_v04.c", + "./zstd/lib/legacy/zstd_v05.c", + "./zstd/lib/legacy/zstd_v06.c", + "./zstd/lib/legacy/zstd_v07.c", + ] + + configs = [ + ":libzstd_config" + ] + + deps = [ + "../lz4:liblz4_static", + "../zlib:libz", + "../xz:libxz", + ] + + part_name = "zstd" +} + + +config ("regression_config") { + include_dirs = [ + "./zstd", + "./zstd/lib/", + "./zstd/programs/", + "./zstd/lib/common/", + "../curl/", + "../curl/include/", + "../curl/include/curl/", + ] + + cflags = [ + "-fPIC", + "-Wall", + "-Wextra", + "-fexceptions", + "-Wno-error=unused-parameter", + "-Wno-error=unused-variable", + "-Wno-error=unused-function", + "-Wno-error=sign-compare", + "-Wno-error=undef", + "-Wno-error=macro-redefined", + "-Wno-error=int-conversion", + "-Wno-error=format", + "-Wno-error=logical-op-parentheses", + "-Wno-error=parentheses", + "-Wno-error=deprecated-declarations", + "-Wno-error=missing-field-initializers", + ] + + ldflags = [ + "-lpthread", + ] +} + +ohos_executable("zst_test_regression") { + sources = [ + "./zstd/tests/regression/config.c", + "./zstd/tests/regression/data.c", + "./zstd/tests/regression/method.c", + "./zstd/tests/regression/result.c", + "./zstd/tests/regression/test.c", + "./zstd/programs/util.c", + "./zstd/lib/common/xxhash.c", + ] + + public_configs = [ ":regression_config" ] + + deps = [ + ":zstd_shared", + "../curl:curl_target" + ] + + defines = [ + ] + + part_name = "zstd" +} + + + +config ("zstd_tests_config") { + include_dirs = [ + "./zstd", + "./zstd/lib", + "./zstd/examples", + ] + + cflags = [ + "-fPIC", + "-Wall", + "-Wextra", + "-fexceptions", + "-Wno-error=unused-parameter", + "-Wno-error=unused-variable", + "-Wno-error=unused-function", + "-Wno-error=sign-compare", + "-Wno-error=undef", + "-Wno-error=macro-redefined", + "-Wno-error=int-conversion", + "-Wno-error=format", + "-Wno-error=logical-op-parentheses", + "-Wno-error=parentheses", + ] +} + +ohos_executable("dictionary_compression") { + sources = [ + "./zstd/examples/dictionary_compression.c", + ] + + public_configs = [ ":zstd_tests_config" ] + + deps = [ + ":zstd_shared", + ] + + defines = [ + ] + + part_name = "zstd" +} + + +ohos_executable("dictionary_decompression") { + sources = [ + "./zstd/examples/dictionary_decompression.c", + ] + + public_configs = [ ":zstd_tests_config" ] + + deps = [ + ":zstd_shared", + ] + + defines = [ + ] + + part_name = "zstd" +} + + +ohos_executable("multiple_simple_compression") { + sources = [ + "./zstd/examples/multiple_simple_compression.c", + ] + + public_configs = [ ":zstd_tests_config" ] + + deps = [ + ":zstd_shared", + ] + + defines = [ + ] + + part_name = "zstd" +} + + +ohos_executable("multiple_streaming_compression") { + sources = [ + "./zstd/examples/multiple_streaming_compression.c", + ] + + public_configs = [ ":zstd_tests_config" ] + + deps = [ + ":zstd_shared", + ] + + defines = [ + ] + + part_name = "zstd" +} + + +ohos_executable("simple_compression") { + sources = [ + "./zstd/examples/simple_compression.c", + ] + + public_configs = [ ":zstd_tests_config" ] + + deps = [ + ":zstd_shared", + ] + + defines = [ + ] + + part_name = "zstd" +} + + +ohos_executable("simple_decompression") { + sources = [ + "./zstd/examples/simple_decompression.c", + ] + + public_configs = [ ":zstd_tests_config" ] + + deps = [ + ":zstd_shared", + ] + + defines = [ + ] + + part_name = "zstd" +} + +ohos_executable("streaming_compression_thread_pool") { + sources = [ + "./zstd/examples/streaming_compression_thread_pool.c", + ] + + public_configs = [ ":zstd_tests_config" ] + + deps = [ + ":zstd_shared", + ] + + defines = [ + ] + + part_name = "zstd" +} + + +ohos_executable("streaming_compression") { + sources = [ + "./zstd/examples/streaming_compression.c", + ] + + public_configs = [ ":zstd_tests_config" ] + + deps = [ + ":zstd_shared", + ] + + defines = [ + ] + + part_name = "zstd" +} + + +ohos_executable("streaming_decompression") { + sources = [ + "./zstd/examples/streaming_decompression.c", + ] + + public_configs = [ ":zstd_tests_config" ] + + deps = [ + ":zstd_shared", + ] + + defines = [ + ] + + part_name = "zstd" +} + + +ohos_executable("streaming_memory_usage") { + sources = [ + "./zstd/examples/streaming_memory_usage.c" + ] + + public_configs = [ ":zstd_tests_config" ] + + deps = [ + ":zstd_shared", + ] + + defines = [ + ] + + part_name = "zstd" +} + + +config ("zstd_programs_config") { + include_dirs = [ + "./zstd", + "./zstd/programs", + "./zstd/lib", + "./zstd/zlibWrapper", + "../lz4", + "../lz4/lib", + "../zlib", + "../xz/xz/", + "../xz/xz/src/", + "../xz/xz/dos/", + "../xz/xz/src/liblzma/api/", + "../xz/xz/src/liblzma/api/lzma/", + "../xz/xz/src/common/", + "../xz/xz/src/liblzma", + "../xz/xz/src/liblzma/common/", + "../xz/xz/src/liblzma/check", + "../xz/xz/src/lz", + "../xz/xz/src/lzma", + ] + + cflags = [ + "-fPIC", + "-Wall", + "-Wextra", + "-fexceptions", + "-Wno-error=unused-parameter", + "-Wno-error=unused-variable", + "-Wno-error=sign-compare", + "-Wno-error=undef", + "-Wno-error=macro-redefined", + "-Wno-error=int-conversion", + "-Wno-error=format", + "-Wno-error=logical-op-parentheses", + "-Wno-error=parentheses", + "-Wno-error=implicit-function-declaration", + "-DHAVE_LZ4", + "-DZSTD_LZ4COMPRESS", + "-DZSTD_LZ4DECOMPRESS", + "-DHAVE_PTHREAD", + "-DHAVE_THREAD", + "-DZSTD_MULTITHREAD", + "-DHAVE_ZLIB", + "-DZSTD_GZCOMPRESS", + "-DZSTD_GZDECOMPRESS", + "-DHAVE_LZMA", + "-DZSTD_LZMACOMPRESS", + "-DZSTD_LZMADECOMPRESS", + ] + + ldflags = [ + "-lpthread", + ] +} + +ohos_executable("zstd") { + sources = [ + "./zstd/programs/benchfn.c", + "./zstd/programs/benchzstd.c", + "./zstd/programs/datagen.c", + "./zstd/programs/dibio.c", + "./zstd/programs/fileio.c", + "./zstd/programs/timefn.c", + "./zstd/programs/util.c", + "./zstd/programs/zstdcli.c", + "./zstd/programs/zstdcli_trace.c", + ] + + public_configs = [ ":zstd_programs_config" ] + + deps = [ + ":zstd_shared", + "../lz4:liblz4_static", + "../zlib:libz", + "../xz:libxz", + ] + + defines = [ + "PACKAGE_VERSION", + ] + + part_name = "zstd" +} + +group("examples") { + if (enable_zstd_test) { + deps = [ + ":dictionary_compression", + ":dictionary_decompression", + ":multiple_simple_compression", + ":multiple_streaming_compression", + ":simple_compression", + ":simple_decompression", + ":streaming_compression_thread_pool", + ":streaming_compression", + ":streaming_decompression", + ":streaming_memory_usage", + ] + } +} + +group("zstd_exe") { + if (enable_zstd_test) { + deps = [ + ":zstd" + ] + } +} + +group("zst_regression") { + if (enable_zstd_test) { + deps = [ + ":zst_test_regression" + ] + } +} + diff --git a/zstd/README.OpenSource b/zstd/README.OpenSource new file mode 100644 index 00000000..f6786dae --- /dev/null +++ b/zstd/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "zstd", + "License": "BSD and GPLv2", + "License File": "COPYRIGHT", + "Version Number": "v1.5.2", + "Owner": "caiqi14@huawei.com", + "Upstream URL": "https://github.com/facebook/zstd", + "Description": "Zstandard, or zstd as short version, is a fast lossless compression algorithm, targeting real-time compression scenarios at zlib-level and better compression ratios. " + } +] \ No newline at end of file diff --git a/zstd/README_zh.md b/zstd/README_zh.md new file mode 100644 index 00000000..87a7a870 --- /dev/null +++ b/zstd/README_zh.md @@ -0,0 +1,10 @@ +# zstd 三方库说明 +## 功能简介 +zstd 是一种快速的无损压缩算法,是针对 zlib 级别的实时压缩方案,以及更好的压缩比。 +## 使用约束 +- ROM版本:OpenHarmony3.2 Beta1 +- 三方库版本:v1.5.2 +- 当前适配的功能:完成了生成和解码 .zst 格式以及字典压缩、解压缩 +- [License : BSD and GPLv2](https://github.com/facebook/zstd/tree/zstd-0.4.2) +## 集成方式 ++ [系统Rom包集成](docs/rom_integrate.md) \ No newline at end of file diff --git a/zstd/bundle.json b/zstd/bundle.json new file mode 100644 index 00000000..d9d31017 --- /dev/null +++ b/zstd/bundle.json @@ -0,0 +1,33 @@ +{ + "name": "@ohos/zstd_lib", + "description": "Zstd, short for Zstandard, is a fast lossless compression algorithm, targeting real-time compression scenarios at zlib-level compression ratio.", + "version": "3.1", + "license": "BSD and GPLv2", + "publishAs": "code-segment", + "segment": { + "destPath": "third_party/zstd" + }, + "dirs": {}, + "scripts": {}, + "readmePath": { + "en": "README" + }, + "component": { + "name": "zstd_lib", + "subsystem": "thirdparty", + "syscap": [], + "features": [], + "adapted_system_type": [], + "rom": "", + "ram": "", + "deps": { + "components": [], + "third_party": [] + }, + "build": { + "sub_component": ["//third_party/zstd:zstd_shared","//third_party/zstd:examples","//third_party/zstd:zstd_exe","//third_party/zstd:zst_regression"], + "inner_kits": [], + "test": [] + } + } +} \ No newline at end of file diff --git a/zstd/docs/pic/results.png b/zstd/docs/pic/results.png new file mode 100644 index 0000000000000000000000000000000000000000..d42365e818698ed10c51e62a5a4137cbbc24aed7 GIT binary patch literal 31138 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 G>Hh(;%topJ literal 0 HcmV?d00001 diff --git a/zstd/docs/rom_integrate.md b/zstd/docs/rom_integrate.md new file mode 100644 index 00000000..e5b28e03 --- /dev/null +++ b/zstd/docs/rom_integrate.md @@ -0,0 +1,108 @@ +# zstd如何集成到系统Rom +## 准备源码工程 +本库是基于OpenHarmony-v3.2-Beta1版本,在润和RK3568开发板上验证的。如果是从未使用过RK3568,可以先查看[润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld)。 +## 准备系统Rom源码 +源码获取方法请参照:[OpenHarmony源码下载](https://gitee.com/openharmony/docs/blob/OpenHarmony-v3.2-Beta1/zh-cn/release-notes/OpenHarmony-v3.2-beta1.md#%E6%BA%90%E7%A0%81%E8%8E%B7%E5%8F%96) +## 增加构建脚本及配置文件 +- 下载本仓库代码 + ``` + cd ~/ + git clone git@gitee.com:openharmony-sig/tpc_c_cplusplus.git --depth=1 + ``` +- 三方库目录结构 + ``` + tpc_c_cplusplus/zstd + |-- docs # 存放三方库相关文档的文件夹 + |-- BUILD.gn # 构建脚本,支持rom包集成 + |-- bundle.json # 三方库组件定义文件 + ├── README.OpenSource # 说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md + ``` +- 将本仓库文件夹拷贝到third_party下 + ``` + cp ~/tpc_c_cplusplus/zstd ~/openharmony/third_party/ -rf + ``` +## 准备三方库源码 +- 将源码下载到zstd目录并将其解压出来。 +``` +cd ~/openharmony/third_party/zstd # 进入到zstd目录 +git clone -b v1.5.2 https://github.com/facebook/zstd.git # 下载三方库 +``` +## 系统Rom中引入三方库 +准备完三方库代码后,我们需要将三方库加入到编译构建体系中。标准系统编译构建可以参考文档[标准系统编译构建指导](https://gitee.com/openharmony/docs/blob/OpenHarmony-3.2-Beta1/zh-cn/device-dev/subsystems/subsys-build-standard-large.md)。 +我们默认三方库是属于OpenHarmony的thirdparty子系统,如果需要自己定义子系统参考文档[如何为三方库组件中添加一个三方库](https://gitee.com/openharmony-sig/knowledge/blob/master/docs/openharmony_getstarted/port_thirdparty/README.md) +在OpenHarmony源码的vendor/hihope/rk3568/config.json文件中,新增需要编译的组件,如下: +``` +{ + "subsystem": "thirdparty", + "components": [ + { + "component": "musl", + "features": [] + }, + { + "component": "zstd", + "features": [] + } + ] +} +``` +## 系统Rom中引入三方库测试程序 +在OpenHarmony源码的vendor/hihope/rk3568/config.json文件,对应组件的features中打开编译选项,如下: +``` +{ + "subsystem": "thirdparty", + "components": [ + { + "component": "musl", + "features": [] + }, + { + "component": "zstd", + "features": ["enable_zstd_test=true"] + } + ] +} +``` +## 编译工程 +在OpenHarmony源码根目录下 +``` +cd ~/openharmony +``` +- 选择产品 +``` +hb set #该命令会列出所有可选平台,这里我们选择rk3568 +``` +- 运行编译 +``` +hb build --target-cpu arm64 #编译64位系统使用:arm64, 编译32位系统使用:arm +``` +- 生成文件的路径,可执行文件和库文件都在out/rk3568/thirdparty/zstd目录下,同时也打包到了镜像中 +## 安装应用程序 +将编译生成的库和测试文件放到板子上运行,为避免每次将文件推入设备都烧录整个镜像,我们使用hdc_std工具将文件推到开发板上 +- 首先,将hdc_std工具编译出来 + ``` + hb set #源码根目录下使用hb set 选择产品ohos-sdk + hb build #然后编译,工具编译出来在out/sdk/ohos-sdk/windows/toolchains/hdc_std.exe + ``` +- 然后,将工具拷贝到Windows,可以为工具目录配置环境变量,也可以在工具所在目录打开windows命令行 +- 最后,将原生库测试需要的所有文件打包成zstd.tar,并拷贝到windows下 +- 将文件推送到开发板,在windows命令行进行如下操作 + ``` + hdc_std shell mount -o remount,rw / #修改系统权限为可读写 + hdc_std file send zstd.tar / #将文件包推入开发板 + hdc_std shell #进入开发板 + tar xvf zstd.tar #解压 + cd zstd #进入zstd 目录 + mv libzstd_shared.z.so /system/lib64/ #64位系统需要将库文件拷贝到系统lib64目录, 32位系统则是lib目录 + ``` +## 运行效果 +由于测试用例比较多,这里演示常用的.zst文件压缩和解压缩功能,并将运行结果和期望结果做对比,内容一致,如下图: + ![results](pic/results.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) +- [OpenHarmony源码下载](https://gitee.com/openharmony/docs/blob/OpenHarmony-v3.2-Beta1/zh-cn/release-notes/OpenHarmony-v3.2-beta1.md#%E6%BA%90%E7%A0%81%E8%8E%B7%E5%8F%96) +- [标准系统编译构建指导](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) \ No newline at end of file -- Gitee