From 01e25bd508e3cbf6c167612d6094bdaaf67346d9 Mon Sep 17 00:00:00 2001 From: sunying2022 Date: Mon, 9 Jan 2023 15:12:58 +0800 Subject: [PATCH] add package kconfigDetector v1.0.0 --- README.en.md | 68 +++++++++++++++++++++++++--------- README.md | 65 +++++++++++++++++++++++--------- kconfigDetector-v1.0.0.tar.gz | Bin 0 -> 32527 bytes kconfigDetector.spec | 41 ++++++++++++++++++++ 4 files changed, 139 insertions(+), 35 deletions(-) create mode 100644 kconfigDetector-v1.0.0.tar.gz create mode 100644 kconfigDetector.spec diff --git a/README.en.md b/README.en.md index 62ac45a..f6ae6a3 100644 --- a/README.en.md +++ b/README.en.md @@ -1,22 +1,63 @@ # kconfigDetector #### Description -Tools for detection kernel configuration error values. - +kconfigDetector is a series of detection tools provided for kernel configuration, which include: +* kconfigDepDetector + kernel configuration error value detection tool. + Based on the Kconfig definition of each configuration item in the kernel source code, it detects the error values in the kernel configuration file that do not satisfy the constraints of dependencies and fetches, and provides a query function for parent and child configuration items. + #### Software Architecture -Software architecture description +* Basic logic for error value detection + + Preprocessing: Read all the Kconfig content to be parsed to generate the ".Kconfig" file + + Parse: Grammar analysis, read the .Kconfig file and generate the data structure of the node tree + + Checker: Based on the syntax analysis results, check whether the profile takes values that satisfy the constraint logical expressions #### Installation -1. xxxx -2. xxxx -3. xxxx +1. Installing dependencies + > yum install -y python3 python3-devel python3-setuptools python-ply + > pip3 install ply +2. Get Code + > git clone https://gitee.com/openeuler/kconfigDetector.git + #### Instructions -1. xxxx -2. xxxx -3. xxxx +* kconfigDepDetector +1. Run command + check_kconfig_dep + + Parameter Description + - OPTIONS + +| Parameter | Description | +| ---- | ---- | +| --checkfile, -c | Required, profile to be checked | +| --kernelversion, -v | Required, kernel version | +| --kernelpath, -s | Optional, kernel source path (required for the first check of this version)| +| --output, -o | Optional, the output path of the detect result, default current directory| +| --arch, -a | Optional, target architecture, local architecture of the default check environment | + + +2. Output + After running, the check result file version_architecture_error.json is output, and the error message is printed in the terminal category as follows + > ---------error type: num------------- + > [Configuration item name] + > value = Configuration item value + > path = Configuration item definition file path + > type = Configuration item type (printed only on type error) + > rev_select = Expression and value of the parent configuration item for forced selection (printed only when unmet dependence) + > depends = Expressions and values of parent configuration items for dependencies (printed only when depends error and unmet dependence) + > restrict = Expression and value of the value constraint (printed only in case of range error and restrict warning) + + + Error types include: + - type error: The value of the configuration item does not match the type. + - depends error: The configuration item is not started by select and the dependency is not satisfied. + - lack config: The specified configuration item is not found in the kernel Kconfig file. + - range error: Does not meet the range of values specified by range. + - restrict warning: The value of the configuration item does not meet the requirements, usually for the default or simply keyword. + - unmet dependences: The configuration item is forced to start by select, but the dependency is not satisfied. #### Contribution @@ -25,12 +66,3 @@ Software architecture description 3. Commit your code 4. Create Pull Request - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md index b1ef943..0b43a61 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,63 @@ # kconfigDetector #### 介绍 -Tools for detection kernel configuration error values. +kconfigDetector是为内核配置提供的一系列检测工具. 包括: +* kconfigDepDetector 内核配置项错误值检测工具 + 依据内核源码中各配置项的Kconfig定义,检测出内核配置文件中不满足依赖、取值等约束条件的错误值,并提供父类和子类配置项查询功能。 + #### 软件架构 -软件架构说明 +* 错误值检测基本逻辑 + + 预处理(Preprocessing),读取所有需要解析的Kconfig内容生成".Kconfig"文件 + + 语法分析(Parse),读取.Kconfig文件,生成节点树的数据结构 + + 检查配置文件(Checker),根据语法分析结果,检查配置文件取值是否满足约束条件的逻辑表达式 #### 安装教程 -1. xxxx -2. xxxx -3. xxxx +1. 安装依赖 + > yum install -y python3 python3-devel python3-setuptools python-ply + > pip3 install ply +2. 获取代码 + > git clone https://gitee.com/openeuler/kconfigDetector.git #### 使用说明 +* kconfigDepDetector +1. 运行命令 + check_kconfig_dep + + 参数说明 + - OPTIONS + +| 参数 | 描述 | +| ---- | ---- | +| --checkfile, -c | 必填,待检查配置文件 | +| --kernelversion, -v | 必填,内核版本 | +| --kernelpath, -s | 可选,内核源码路径(该版本首次检查必填)| +| --output, -o | 可选,检查结果输出路径,默认当前目录 | +| --arch, -a | 可选,目标体系架构,默认检查环境的本地架构 | + + +2. 输出说明 + 运行完成后,输出检查结果文件 版本号_架构_error.json,并在终端分类打印错误信息如下 + > ---------错误类型: 个数------------- + > [配置项名称] + > value = 取值 + > path = 配置项定义文件路径 + > type = 配置项类型 (仅在type error时打印) + > rev_select = 强制选择的父类配置项表达式及取值 (仅在unmet dependence时打印) + > depends = 依赖关系的父类配置项表达式及取值 (仅在depends error和unmet dependence时打印) + > restrict = 取值约束的表达式及取值 (仅在range error和restrict warning时打印) + + + 错误类型包括: + - 类型错误: type error, 配置项取值与类型不符 + - 依赖不满足: depends error, 配置项未通过select启动且依赖不满足 + - 未找到配置项: lack config, 未在内核Kconfig文件中找到指定配置项 + - range未满足: range error,不满足range规定的取值范围 + - 取值告警: restrict warning, 配置项取值未满足要求, 通常为default或imply关键字 + - 依赖风险: unmet dependences, 配置项通过select强制启动, 但是依赖未满足 -1. xxxx -2. xxxx -3. xxxx #### 参与贡献 @@ -26,12 +66,3 @@ Tools for detection kernel configuration error values. 3. 提交代码 4. 新建 Pull Request - -#### 特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/kconfigDetector-v1.0.0.tar.gz b/kconfigDetector-v1.0.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..22e64bdad0a787044ab63a5529ff8baf7386f393 GIT binary patch literal 32527 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�jG;oPIHiA0^ck>)EE>%^7TMu+?Zu$xx| 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 PAiw#9KR=)x6!3ol>ab@4 literal 0 HcmV?d00001 diff --git a/kconfigDetector.spec b/kconfigDetector.spec new file mode 100644 index 0000000..c0bfe7e --- /dev/null +++ b/kconfigDetector.spec @@ -0,0 +1,41 @@ +Name: kconfigDetector +Version: v1.0.0 +Release: 1 +Summary: A series of detection tools provided for kernel configuration, include kconfig dependence check. +License: MulanPSL2 +URL: https://gitee.com/openeuler/%{name} +Source0: %{name}-%{version}.tar.gz + +BuildArch: noarch +BuildRequires: python3-devel +BuildRequires: python3-setuptools +Requires: python3 python-ply +Requires: bash + + +%description +A series of detection tools provided for kernel configuration. + + +%prep +%autosetup -n %{name}-%{version} + + +%build +%py3_build + + +%install +%py3_install + + +%files +%{_bindir}/check_kconfig_dep +%{python3_sitelib}/kconfigDetector*.egg-info +%{python3_sitelib}/kconfigDepDetector/* +%attr(0777,root,root) %{python3_sitelib}/kconfigDepDetector/tools + + +%changelog +* Wed Dec 21 2022 sunying2022 - v1.0.0-1 +- Package init