CN114217773A - 一种c/c++语言软件包二进制接口兼容性自动化判别方法 - Google Patents
一种c/c++语言软件包二进制接口兼容性自动化判别方法 Download PDFInfo
- Publication number
- CN114217773A CN114217773A CN202111514612.9A CN202111514612A CN114217773A CN 114217773 A CN114217773 A CN 114217773A CN 202111514612 A CN202111514612 A CN 202111514612A CN 114217773 A CN114217773 A CN 114217773A
- Authority
- CN
- China
- Prior art keywords
- abi
- software package
- compatibility
- value
- version
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Computing Systems (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种C/C++语言软件包二进制接口(ABI)兼容性自动化判别方法。该方法包括:提供一个定义文件用于声明应用级ABI兼容性影响因子;为每个C/C++组件赋予一个ABI描述块,用于说明组件的ABI特性;给出一个软件包ABI标识计算算法,作为四元组坐标中的一个元素,用于发布组件二进制软件包;给出一个软件包依赖图ABI兼容性标识计算算法,用于辅助定位符合ABI兼容性要求的上游依赖包。本申请提供的方法针对目标软件包给定的ABI兼容性需求,能够自动判别目标软件包的上游依赖软件包(包括传递依赖包)是否与其具有一致的ABI兼容性,为解决C/C++软件持续集成过程中,软件依赖包的自动化定位和获取提供支持。
Description
技术领域
本发明属于C/C++持续集成技术领域,主要涉及一种C/C++语言软件包二进制接口兼容性自动化判别方法。
背景技术
随着移动互联网、云计算、大数据、人工智能等技术的日新月异,数字化转型浪潮正在席卷各行各业。如何快速地持续交付高质量的软件,满足用户的多样化需求,并借此提升企业的利润和市场占有率,已经成为企业必须要面对的现实问题。在这一需求牵引下,持续集成技术在众多软件研发企业中得到了广泛应用。
企业落地持续集成最佳实践,其中一个关键要求是在软件构建过程中能够支持依赖包的自动化获取,这通常需要借助软件包依赖管理系统来实现。目前现有的软件包管理系统对Java、Python、Nodejs等较新开发语言有很好的支持,但对C/C++软件包在依赖管理方面还存在不足。主要原因在于,使用C/C++语言开发的软件包存在二进制接口(Application Binary Interface,ABI)兼容性问题,具有不同ABI兼容性的C/C++库之间要么无法链接、要么在运行时会抛出异常。因此,C/C++软件包的依赖解析过程不能像传统方法那样仅靠匹配软件包名称和版本来确定,还需要考量ABI兼容性需求。
为了实现C/C++软件持续集成过程,需要找到一种方法自动判别C/C++依赖包的ABI是否与目标软件兼容。难点主要体现在如下几个方面:
(1)影响ABI的因素众多,而且各因素之间并非正交关系,彼此通常需要满足一定的关联规则。例如,工具链相关影响因素包括工具链版本以及使用的C++标准版本,但是除此之外,不同的工具链通常还会有其特有的影响因素。例如Visual Studio工具链特有的影响因素包括编译工具链工具集、运行时等;而GCC工具链特有的影响因素还包括选择的C++标准库实现、线程API模型、异常实现等。常见的ABI影响因素如表1所示,可以分为应用级和软件包级两大类:
表1ABI影响因素
(2)每个软件包都有自身的特性,不同软件包受ABI影响因素影响的方式和程度都是不同的。例如,纯头文件组成的软件包没有目标码,不存在ABI兼容性问题,因此完全不受任何ABI影响因素的影响;
(3)ABI兼容性需求不是由软件包的创建者决定的,而是由软件包的最终消费者(即目标软件)决定的;软件包创建时,并不知道会有哪些消费者,也无法知道消费者提出的具体ABI需求;
(4)理想情况下,我们期望依赖软件包与目标软件包在构建时的ABI影响因素取值是精确匹配的,这样可以确保两者之间具有一致的ABI兼容性。但实际在很多场景下并不需要如此严格。例如,一个用VisualStudio 2017(toolset 141)编译的软件包可以和一个VisualStudio 2019(toolset 142)编译的静态库链接,只要链接软件选用Visual Studio2019(toolset 142)即可;
(5)软件包ABI还会受到其依赖包的影响,依赖包版本升级,如何自动判断软件包是否需要重新编译,也是一个难点问题。
发明内容
针对现有技术的以上缺陷或改进需求,本发明提供了一种C/C++语言软件包二进制接口兼容性自动化判别方法,其目的在于针对目标软件包给定的ABI兼容性需求,能自动解析与目标软件包具有一致ABI兼容性的上游依赖软件包(包括传递依赖包),解决C/C++软件持续集成过程中,软件包ABI兼容性的自动化判别问题。
为实现上述目的,本发明提供了一种C/C++语言软件包二进制接口兼容性自动化判别方法,所述方法包括:
S1:提供一个ABI兼容性影响因子定义文件,所述ABI兼容性影响因子定义文件,包含可能影响C/C++软件包ABI的所有应用级影响因子的名称及其取值范围的定义;
S2:为每个C/C++组件赋予一个ABI描述块,所述ABI描述块包含ABI应用级影响因子投影定义,ABI应用级影响因子取值约束定义,以及软件包级影响因子定义三部分内容;
S3:给出一个软件包ABI标识生成算法,作为坐标元素之一,用于发布组件二进制软件包;
S4:给出一种C/C++软件仓库组织布局结构,所述软件仓库组织布局结构允许每个组件管理多个具有不同ABI兼容性的软件包;
S5:提供一个软件包依赖图ABI兼容性标识ABI_KEY计算算法,用于辅助定位符合ABI兼容性要求的上游依赖包;
S6:将S5所述软件包依赖图ABI兼容性标识计算算法得到的每个依赖组件的ABI_KEY,作为对应四元组坐标<组织名、组件名、版本号、ABI_KEY>中第四个元素的值,能够从S5所述C/C++软件仓库中定位目标软件包所需的所有满足ABI兼容性需求的依赖软件包。
本发明的一个实施例中,在所述步骤S1中:
所述应用级影响因子,采用分级哈希表的方式进行组织,以方便后续对其进行过滤和投影操作;
所述应用级影响因子取值范围定义,用于对后面S3给出的软件包ABI标识生成算法输入参数取值进行规范化和有效性验证。
本发明的一个实施例中,所述步骤S2包括:
S2.1:所述ABI应用级影响因子投影定义,指软件包根据自身特性,以列表的形式给出的,可能会受到所述ABI兼容性影响因子定义文件中定义的哪类应用级因子的影响;所述哪类应用级因子,指的是应用级影响因子分级哈希表的第一级分类;
S2.2:所述ABI应用级影响因子取值约束定义,采用三元组的方式定义应用级影响因子的取值约束,且所述三元组的实际值在ABI标识计算算法中动态计算,方便组件开发人员描述组件细粒度的ABI特性;
S2.3:所述软件包级影响因子定义,指软件包自身的编译选项定义,以及软件包版本命名模式定义。
本发明的一个实施例中,所述步骤S2.2包括:
S2.2.1:应用级影响因子三元表达式的形式为:(布尔表达式)?表达式1:表达式2;所述布尔表达式的取值,在执行后续S3中软件包ABI标识计算算法时计算,当布尔表达式计算值为真时,对应影响因子设置为所述表达式1的值,否则设置为表达式2的值;
S2.2.2:所述布尔表达式,是一个或多个基本布尔表达式,由括号以及AND、OR运算符,组合形成的复杂布尔表达式。
本发明的一个实施例中,所述基本布尔表达式,包括如下形式:
字符串或数值比较表达式:>,<,==,>=,<=;
范围表达式:x~[min,max),当且仅当x>=min且x<max时为真;
枚举表达式:x in[a,b,c],当且仅当x是a、b、c之一时为真。
本发明的一个实施例中,所述步骤S2.3包括:
S2.3.1:所述软件包编译选项定义,指软件包自身的编译选项名称、取值范围和缺省值定义;用于区分不同软件包特有的编译开关对ABI兼容性的影响;
S2.3.2:所述软件包版本命名模式定义,分为语义化版本模式、主版本模式和次版本模式;根据软件包版本实际升级演化约定,采用不同的分类规范化方法,区分了组件不同版本对下游软件包ABI的影响;
本发明的一个实施例中,在所述步骤S2.3.2中:
所述语义化版本模式,指软件包版本为正式版时,只有主版本变化,依赖该软件包的下游软件包才需要重新编译,当软件包版本为非正式版,Y和Z的任意变化都导致下游软件包需要重新编译;
所述主版本模式,指软件包不管是正式版还是非正式版,只要主版本号X不变,下游软件包都不需要重新编译,否则需要重新编译下游软件包;
所述次版本模式,指软件包版本X.Y.Z中,只要X和Y不变,下游软件包都不需要重新编译,否则只要X和Y中的任意一个发生变化,都需要重新编译下游软件包。
本发明的一个实施例中,所述步骤S3中软件包ABI标识生成算法执行步骤如下:
S3.1:获得软件包所属组件的所述ABI描述块;根据所述ABI描述快中的应用级影响因子投影定义,对输入的ABI影响因子中的应用级影响因子参数值进行过滤;
S3.2:针对S3.1处理后得到的每一个应用级影响因子,如果该组件所述ABI描述块对该影响因子设置了所述取值约束定义,则计算所述取值约束定义中的三元表达式的值作为该影响因子的新值;否则保留输入的影响因子值不变;
S3.3:针对所述ABI描述块中给出的所有所述软件包编译选项,如果输入的ABI软件包级影响因子中,对该编译选项设置了值,则将该值作为该编译选项的值;否则,使用编译选项的缺省值;
S3.4:将S3.2和S3.3处理后的所有影响因子及其取值,按影响因子名称的字母顺序进行排序,并拼接成[key1=v1;key2=v2…]形式的一个字符串,计算该字符串的HASH值,记为ABI_1;
S3.5:将该软件包所属组件的所有直接依赖组件的坐标信息拼接成[org1/comp1/ver1;org2/comp2/ver2…]形式的一个字符串,其中版本号verN依据所述ABI描述块中定义的所述软件包版本命名模式进行规范化处理,计算该字符串的HASH值,记为ABI_2;
S3.6:将ABI_1和ABI_2拼接成一个字符串ABI_1;ABI_2,计算该字符串的HASH值,作为该软件包的ABI标识。
本发明的一个实施例中,所述步骤S4包括:
S4.1:遵循所述软件仓库组织布局结构,当任意C/C++组件构建发布时,以构建时设置的ABI影响因子参数值作为输入,通过S3所述软件包ABI标识计算算法,获得构建软件包的ABI标识号,以四元组<组织名、组件名、版本号、ABI标识号>为坐标,将构建软件包发布到所述C/C++软件仓库中唯一路径下;
S4.2:遵循所述软件仓库组织布局结构,以四元组<组织名、组件名、版本号、ABI标识号>为坐标,能且仅能定位一个C/C++软件包。
本发明的一个实施例中,所述步骤S5中软件包依赖图ABI兼容性标识计算算法如下:
S5.1:在目标软件包构建之前,通过深度优先方法,解析其全部上游依赖组件,生成有向无环依赖图;
S5.2:遍历所述有向无环依赖图,对每个节点对应的组件,使用目标软件包构建时指定的ABI影响因子参数值作为输入,通过S3中软件包ABI标识生成算法,计算依赖组件的ABI兼容性标识。
总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有如下有益效果:
(1)可以结合目标软件给定的ABI兼容性需求和依赖组件附属的ABI描述块,在目标软件构建之前,动态计算出依赖组件二进制包的ABI兼容性标识(ABI_KEY);
(2)通过本发明给出的算法计算得到ABI兼容性标识,可以与组织名、组件名、版本号一起组成一个四元组,用于从软件包仓库中自动定位、获取二进制接口兼容的C/C++软件包;
(3)使用本发明给出的算法,同一个组件版本,ABI兼容的软件包一定会计算得到唯一的ABI_KEY,避免软件包管理软件存储多份二进制包,减少了不必要的存储需求,也减轻了管理负担。
附图说明
图1是本发明实施例中ABI兼容性影响因子定义文件;
图2是本发明实施例中组件ABI描述块;
图3是本发明实施例中软件包ABI标识计算算法;
图4是本发明实施例中C/C++软件仓库组织布局结构;
图5是本发明实施例中软件包依赖图ABI兼容性标识计算算法。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
本发明提供了一种C/C++语言软件包二进制接口兼容性自动化判别方法,所述方法包括:
S1:提供一个ABI兼容性影响因子定义文件,如图1所示,所述ABI兼容性影响因子定义文件,包含可能影响C/C++软件包ABI的所有应用级影响因子的名称及其取值范围的定义;包括:
S1.1:所述应用级影响因子,采用分级哈希表的方式进行组织,以方便后续对其进行过滤和投影操作;
S1.2:所述应用级影响因子取值范围定义,用于对后面S3给出的软件包ABI标识生成算法输入参数取值进行规范化和有效性验证;
在步骤S1中,所述ABI兼容性影响因子定义文件,采用分级哈希表的方式进行组织,便于本发明给出的ABI标识计算算法中对输入参数进行合规性检查和投影过滤操作;
S2:为每个C/C++组件赋予一个ABI描述块,如图2所示,所述ABI描述块包含ABI应用级影响因子投影定义,ABI应用级影响因子取值约束定义,以及软件包级影响因子定义三部分内容;包括:
S2.1:所述ABI应用级影响因子投影定义,指软件包根据自身特性,以列表的形式给出的,可能会受到所述ABI兼容性影响因子定义文件中定义的哪类应用级因子的影响;所述哪类应用级因子,指的是S1.1所述应用级影响因子分级哈希表的第一级分类;从而方便开发人员描述组件的较大粒度的ABI特性(例如是否纯头文件,是否区分Debug和Release版);
S2.2:所述ABI应用级影响因子取值约束定义,采用三元组的方式定义应用级影响因子的取值约束,且所述三元组的实际值在ABI标识计算算法中动态计算,方便组件开发人员描述组件细粒度的ABI特性;
S2.2.1:所述应用级影响因子三元表达式的形式为:(布尔表达式)?表达式1:表达式2;所述布尔表达式的取值,在执行后续S3所述软件包ABI标识计算算法时计算。当布尔表达式计算值为真时,对应影响因子设置为所述表达式1的值,否则设置为表达式2的值;包括:
S2.2.2:所述布尔表达式,可以是一个或多个基本布尔表达式,由括号以及AND、OR运算符,组合形成的复杂布尔表达式;
所述基本布尔表达式,包括但不限于如下形式:
字符串或数值比较表达式:>,<,==,>=,<=
范围表达式:x~[min,max),当且仅当x>=min且x<max时为真;
枚举表达式:x in[a,b,c],当且仅当x是a、b、c之一时为真;
S2.3:所述软件包级影响因子定义,指软件包自身的编译选项定义,以及软件包版本命名模式定义;包括:
S2.3.1:所述软件包编译选项定义,指软件包自身的编译选项名称、取值范围和缺省值定义;用于区分不同软件包特有的编译开关对ABI兼容性的影响;
S2.3.2:所述软件包版本命名模式定义,分为语义化版本模式、主版本模式和次版本模式;根据软件包版本实际升级演化约定,采用不同的分类规范化方法,区分了组件不同版本对下游软件包ABI的影响;其中:
所述语义化版本模式,指软件包版本大于1.0(正式版)时,只有主版本变化(X.Y.Z中的X变化),依赖该软件包的下游软件包才需要重新编译(即ABI不兼容),当软件包版本小于1.0时(例如0.Y.Z,孵化阶段的非正式版),Y和Z的任意变化都导致下游软件包需要重新编译;
所述主版本模式,指软件包不管是大于1.0的正式版还是小于1.0的非正式版,只要主版本号X不变,下游软件包都不需要重新编译,否则需要重新编译下游软件包;
所述次版本模式,指软件包版本X.Y.Z中,只要X和Y不变,下游软件包都不需要重新编译,否则只要X和Y中的任意一个发生变化,都需要重新编译下游软件包;
S3:给出一个软件包ABI标识生成算法,作为坐标元素之一,用于发布组件二进制软件包;如图3所示,所述软件包ABI标识生成算法执行步骤如下:
S3.1:获得软件包所属组件的所述ABI描述块;根据所述ABI描述快中的应用级影响因子投影定义,对本算法输入的ABI影响因子中的应用级影响因子参数值进行过滤;
S3.2:针对S3.1处理后得到的每一个应用级影响因子,如果该组件所述ABI描述块对该影响因子设置了所述取值约束定义,则计算所述取值约束定义中的三元表达式的值作为该影响因子的新值;否则保留输入的影响因子值不变;
S3.3:针对所述ABI描述块中给出的所有所述软件包编译选项,如果本算法输入的ABI软件包级影响因子中,对该编译选项设置了值,则将该值作为该编译选项的值;否则,使用编译选项的缺省值;
S3.4:将S3.2和S3.3处理后的所有影响因子及其取值,按影响因子名称的字母顺序进行排序,并拼接成[key1=v1;key2=v2…]形式的一个字符串,计算该字符串的HASH值,记为ABI_1;
S3.5:将该软件包所属组件的所有直接依赖组件的坐标信息拼接成[org1/comp1/ver1;org2/comp2/ver2…]形式的一个字符串,其中版本号verN依据所述ABI描述块中定义的所述软件包版本命名模式进行规范化处理,计算该字符串的HASH值,记为ABI_2;
S3.6:将ABI_1和ABI_2拼接成一个字符串ABI_1;ABI_2,计算该字符串的HASH值,作为该软件包的ABI标识;
在步骤S3中,软件包ABI标识计算算法通过投影过滤、三元组动态计算、依赖包版本规范化等方式,重新调整软件包ABI影响因子的取值,真实反映了组件的ABI特性。同时,通过对所有影响因子排序求HASH值,得到唯一的ABI标识。对于同一个组件的不同软件包,不同的ABI标识代表ABI不兼容,相同的ABI标识代表ABI一定兼容;
S4:给出一种C/C++软件仓库组织布局结构,所述软件仓库组织布局结构允许每个组件管理多个具有不同ABI兼容性的软件包;如图4所示,包括:
S4.1:遵循所述软件仓库组织布局结构,当任意C/C++组件构建发布时,以构建时设置的ABI影响因子参数值作为输入,通过S3所述软件包ABI标识计算算法,获得构建软件包的ABI标识号,以四元组<组织名、组件名、版本号、ABI标识号>为坐标,将构建软件包发布到所述C/C++软件仓库中唯一路径下;
S4.2:遵循所述软件仓库组织布局结构,以四元组<组织名、组件名、版本号、ABI标识号>为坐标,能且仅能定位一个C/C++软件包;
S5:提供一个软件包依赖图ABI兼容性标识(ABI_KEY)计算算法,用于辅助定位符合ABI兼容性要求的上游依赖包;如图5所示,所述软件包依赖图ABI兼容性标识计算算法如下:
S5.1:在目标软件包构建之前,通过深度优先方法,解析其全部上游依赖组件(包括传递依赖),生成有向无环依赖图;
S5.2:遍历所述有向无环依赖图,对每个节点对应的组件,使用目标软件包构建时指定的ABI影响因子参数值作为输入,通过S3给出的算法,计算依赖组件的ABI兼容性标识;
在步骤S5中,所述软件包依赖图ABI兼容性标识计算算法的输入参数是使用目标软件包构建时指定的影响因子参数值,而不是依赖软件包构建时指定的值,从而满足由软件包的最终消费者决定ABI需求的目标;
S6:将S5所述软件包依赖图ABI兼容性标识计算算法得到的每个依赖组件的ABI_KEY,作为对应四元组坐标<组织名、组件名、版本号、ABI_KEY>中第四个元素的值,能够从S5所述C/C++软件仓库中定位目标软件包所需的所有满足ABI兼容性需求的依赖软件包。
以下结合具体实施例说明本发明方法,如图1范例所示,给定一个ABI影响因子定义文件,其中以分级哈希表的方式,列出所有可能影响C/C++软件包ABI兼容性的应用级影响因子的名称,以及每个影响因子可能的取值范围;
所述ABI兼容性影响因子定义文件的内容组织方式,可以采用Yaml格式进行定义,以方便后续投影过滤操作;
分级哈希表的第一层key是对应用级影响因子的分类,包括“os”(操作系统)、“arch”(芯片架构)、“toolchain”(编译工具链)和“build_type”(编译类型)四种类型;
如图2范例所示,给组件定义一个ABI描述块;
filter参数指定应用级影响因子投影定义,[“os”、“arch”、“toolchain”、“build_type”]表明这个组件是一个普通组件,其软件包二进制兼容性受目标操作系统、芯片架构、编译工具链、以及编译类型影响。如果组件是头文件,可以设置filter:None;如果组件软件包Debug/Release兼容,则可以设置filter:[“os”,“arch”,“toolchain”];
constrains参数定义应用级影响因子取值约束,图2中范例表示“工具链多版本兼容(GCC4.7~4.9兼容,其他版本不兼容)”,并且使用相同条件构建得到的软件包对于vxworks和deltaos两个目标操作系统而言是二进制兼容的,也即为vxworks目标操作系统构建得到的该软件包,也可以在deltaos中运行;
option参数指定组件编译选项,编译选项属于软件包级的影响因子。取值范围中的第一个值是编译选项的缺省值;
version_mode参数指定版本命名模式,不同的模式使用不同的规范化处理方法。对于语义化版本模式“SemverMode”,当版本小于1.0时,保留版本值不变,当版本大于1.0是,次版本号用Y替代,修订号用Z替代;例如:0.3.14=>0.3.14,1.3.14=>1.X.Y;
假设图2范例所示ABI描述块属于组件net.cssc709.spl/A,组件A依赖组件B=<net.cssc709.spl,B,0.3.14>(假设组件B使用语义化版本命名模式)和组件C=<com.google,C,1.2.6>(假设组件C使用主版本模式),组件A要发布软件包1.2.0,构建时指定的影响因子输入参数取值如下:
os.name=Linux
arch=x86_64
toolchain.compiler=gcc
toolchain.version=4.8
build_type=Release
shared=false
则,1)根据算法S3,处理后的影响因子新值为:
os.name=Linux
arch=x86_64
toolchain.compiler=gcc
toolchain.version=“GCC版本兼容”
build_type=Release
shared=false
fPIC=true
2)根据算法S3,组件B的版本规范化后为0.3.14,组件C的版本规范化后为1.Y.Z3)根据算法S3,
ABI_1=Hash([arch=x86_64;build_type=Release;fPIC=true;os.name=Linux;shared=false;toolchain.compiler=gcc;toolchain.version=GCC版本兼容]);
ABI_2=Hash([net.cssc709.spl/B/0.3.14;com.google/C/1.Y.Z]);
假设组件A的1.2.0版软件包的ABI标识=Hash(“<ABI_1>;<ABI_2>”)=2d37ec80…;
如图4所示C/C++软件仓库组织布局结构,一个组件可以有多个版本,每个版本包含一个组件描述文件,组件描述文件中包含所述ABI描述块。组件的一个版本可以包含一个或多个二进制软件包,每个软件包存储在其ABI标识命名的子目录下,不同的ABI标识表示满足不同的ABI兼容性要求;
软件包<net.cssc709.spl,A,1.2.0,2d37ec80…>可以发布到如图4所示C/C++软件仓库的唯一路径“net/cssc709/spl/A/1.2.0/2d37ec80…/”下;
假设有一个应用软件X依赖组件net.cssc709.spl/A/1.2.0,当应用软件X构建时,指定的影响因子参数值如下:
os.name=Linux
arch=x86_64
toolchain.compiler=gcc
toolchain.version=4.9
build_type=Release
shared=false
虽然应用软件X是使用gcc 4.9编译的,但根据算法S5,X获取到的组件A使用gcc4.8构建的软件包<net.cssc709.spl,A,1.2.0,2d37ec80…>,与X应用仍然是二进制兼容的。
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种C/C++语言软件包二进制接口兼容性自动化判别方法,其特征在于,所述方法包括:
S1:提供一个ABI兼容性影响因子定义文件,所述ABI兼容性影响因子定义文件,包含可能影响C/C++软件包ABI的所有应用级影响因子的名称及其取值范围的定义;
S2:为每个C/C++组件赋予一个ABI描述块,所述ABI描述块包含ABI应用级影响因子投影定义,ABI应用级影响因子取值约束定义,以及软件包级影响因子定义三部分内容;
S3:给出一个软件包ABI标识生成算法,作为坐标元素之一,用于发布组件二进制软件包;
S4:给出一种C/C++软件仓库组织布局结构,所述软件仓库组织布局结构允许每个组件管理多个具有不同ABI兼容性的软件包;
S5:提供一个软件包依赖图ABI兼容性标识ABI_KEY计算算法,用于辅助定位符合ABI兼容性要求的上游依赖包;
S6:将S5所述软件包依赖图ABI兼容性标识计算算法得到的每个依赖组件的ABI_KEY,作为对应四元组坐标<组织名、组件名、版本号、ABI_KEY>中第四个元素的值,能够从S5所述C/C++软件仓库中定位目标软件包所需的所有满足ABI兼容性需求的依赖软件包。
2.如权利要求1所述的C/C++语言软件包二进制接口兼容性自动化判别方法,其特征在于,在所述步骤S1中:
所述应用级影响因子,采用分级哈希表的方式进行组织,以方便后续对其进行过滤和投影操作;
所述应用级影响因子取值范围定义,用于对后面S3给出的软件包ABI标识生成算法输入参数取值进行规范化和有效性验证。
3.如权利要求1或2所述的C/C++语言软件包二进制接口兼容性自动化判别方法,其特征在于,所述步骤S2包括:
S2.1:所述ABI应用级影响因子投影定义,指软件包根据自身特性,以列表的形式给出的,可能会受到所述ABI兼容性影响因子定义文件中定义的哪类应用级因子的影响;所述哪类应用级因子,指的是应用级影响因子分级哈希表的第一级分类;
S2.2:所述ABI应用级影响因子取值约束定义,采用三元组的方式定义应用级影响因子的取值约束,且所述三元组的实际值在ABI标识计算算法中动态计算,方便组件开发人员描述组件细粒度的ABI特性;
S2.3:所述软件包级影响因子定义,指软件包自身的编译选项定义,以及软件包版本命名模式定义。
4.如权利要求3所述的C/C++语言软件包二进制接口兼容性自动化判别方法,其特征在于,所述步骤S2.2包括:
S2.2.1:应用级影响因子三元表达式的形式为:(布尔表达式)?表达式1:表达式2;所述布尔表达式的取值,在执行后续S3中软件包ABI标识计算算法时计算,当布尔表达式计算值为真时,对应影响因子设置为所述表达式1的值,否则设置为表达式2的值;
S2.2.2:所述布尔表达式,是一个或多个基本布尔表达式,由括号以及AND、OR运算符,组合形成的复杂布尔表达式。
5.如权利要求4所述的C/C++语言软件包二进制接口兼容性自动化判别方法,其特征在于,所述基本布尔表达式,包括如下形式:
字符串或数值比较表达式:>,<,==,>=,<=;
范围表达式:x~[min,max),当且仅当x>=min且x<max时为真;
枚举表达式:x in[a,b,c],当且仅当x是a、b、c之一时为真。
6.如权利要求3所述的C/C++语言软件包二进制接口兼容性自动化判别方法,其特征在于,所述步骤S2.3包括:
S2.3.1:所述软件包编译选项定义,指软件包自身的编译选项名称、取值范围和缺省值定义;用于区分不同软件包特有的编译开关对ABI兼容性的影响;
S2.3.2:所述软件包版本命名模式定义,分为语义化版本模式、主版本模式和次版本模式;根据软件包版本实际升级演化约定,采用不同的分类规范化方法,区分了组件不同版本对下游软件包ABI的影响;
7.如权利要求6所述的C/C++语言软件包二进制接口兼容性自动化判别方法,其特征在于,在所述步骤S2.3.2中:
所述语义化版本模式,指软件包版本为正式版时,只有主版本变化,依赖该软件包的下游软件包才需要重新编译,当软件包版本为非正式版,Y和Z的任意变化都导致下游软件包需要重新编译;
所述主版本模式,指软件包不管是正式版还是非正式版,只要主版本号X不变,下游软件包都不需要重新编译,否则需要重新编译下游软件包;
所述次版本模式,指软件包版本X.Y.Z中,只要X和Y不变,下游软件包都不需要重新编译,否则只要X和Y中的任意一个发生变化,都需要重新编译下游软件包。
8.如权利要求1或2所述的C/C++语言软件包二进制接口兼容性自动化判别方法,其特征在于,所述步骤S3中软件包ABI标识生成算法执行步骤如下:
S3.1:获得软件包所属组件的所述ABI描述块;根据所述ABI描述快中的应用级影响因子投影定义,对输入的ABI影响因子中的应用级影响因子参数值进行过滤;
S3.2:针对S3.1处理后得到的每一个应用级影响因子,如果该组件所述ABI描述块对该影响因子设置了所述取值约束定义,则计算所述取值约束定义中的三元表达式的值作为该影响因子的新值;否则保留输入的影响因子值不变;
S3.3:针对所述ABI描述块中给出的所有所述软件包编译选项,如果输入的ABI软件包级影响因子中,对该编译选项设置了值,则将该值作为该编译选项的值;否则,使用编译选项的缺省值;
S3.4:将S3.2和S3.3处理后的所有影响因子及其取值,按影响因子名称的字母顺序进行排序,并拼接成[key1=v1;key2=v2…]形式的一个字符串,计算该字符串的HASH值,记为ABI_1;
S3.5:将该软件包所属组件的所有直接依赖组件的坐标信息拼接成[org1/comp1/ver1;org2/comp2/ver2…]形式的一个字符串,其中版本号verN依据所述ABI描述块中定义的所述软件包版本命名模式进行规范化处理,计算该字符串的HASH值,记为ABI_2;
S3.6:将ABI_1和ABI_2拼接成一个字符串ABI_1;ABI_2,计算该字符串的HASH值,作为该软件包的ABI标识。
9.如权利要求1或2所述的C/C++语言软件包二进制接口兼容性自动化判别方法,其特征在于,所述步骤S4包括:
S4.1:遵循所述软件仓库组织布局结构,当任意C/C++组件构建发布时,以构建时设置的ABI影响因子参数值作为输入,通过S3所述软件包ABI标识计算算法,获得构建软件包的ABI标识号,以四元组<组织名、组件名、版本号、ABI标识号>为坐标,将构建软件包发布到所述C/C++软件仓库中唯一路径下;
S4.2:遵循所述软件仓库组织布局结构,以四元组<组织名、组件名、版本号、ABI标识号>为坐标,能且仅能定位一个C/C++软件包。
10.如权利要求1或2所述的C/C++语言软件包二进制接口兼容性自动化判别方法,其特征在于,所述步骤S5中软件包依赖图ABI兼容性标识计算算法如下:
S5.1:在目标软件包构建之前,通过深度优先方法,解析其全部上游依赖组件,生成有向无环依赖图;
S5.2:遍历所述有向无环依赖图,对每个节点对应的组件,使用目标软件包构建时指定的ABI影响因子参数值作为输入,通过S3中软件包ABI标识生成算法,计算依赖组件的ABI兼容性标识。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111514612.9A CN114217773B (zh) | 2021-12-13 | 2021-12-13 | 一种c/c++语言软件包二进制接口兼容性自动化判别方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111514612.9A CN114217773B (zh) | 2021-12-13 | 2021-12-13 | 一种c/c++语言软件包二进制接口兼容性自动化判别方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114217773A true CN114217773A (zh) | 2022-03-22 |
CN114217773B CN114217773B (zh) | 2022-12-16 |
Family
ID=80701190
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111514612.9A Active CN114217773B (zh) | 2021-12-13 | 2021-12-13 | 一种c/c++语言软件包二进制接口兼容性自动化判别方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114217773B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114510267A (zh) * | 2022-04-20 | 2022-05-17 | 麒麟软件有限公司 | 基于Linux系统的程序ABI接口兼容性计算方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20120131564A1 (en) * | 2010-11-23 | 2012-05-24 | Kushal Das | Process Of Finding Out If Software Will Run On An Operating System Without Installing That Software |
CN104391733A (zh) * | 2014-12-10 | 2015-03-04 | 华中科技大学 | 一种依据依赖关系动态编译软件包的方法 |
CN108595186A (zh) * | 2018-03-27 | 2018-09-28 | 天津麒麟信息技术有限公司 | 一种飞腾平台上基于完全函数的多版本软件管理方法 |
CN112486505A (zh) * | 2019-09-12 | 2021-03-12 | 无锡江南计算技术研究所 | 容器化跨平台操作系统映像构建方法 |
US11042422B1 (en) * | 2020-08-31 | 2021-06-22 | Microsoft Technology Licensing, Llc | Hybrid binaries supporting code stream folding |
-
2021
- 2021-12-13 CN CN202111514612.9A patent/CN114217773B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20120131564A1 (en) * | 2010-11-23 | 2012-05-24 | Kushal Das | Process Of Finding Out If Software Will Run On An Operating System Without Installing That Software |
CN104391733A (zh) * | 2014-12-10 | 2015-03-04 | 华中科技大学 | 一种依据依赖关系动态编译软件包的方法 |
CN108595186A (zh) * | 2018-03-27 | 2018-09-28 | 天津麒麟信息技术有限公司 | 一种飞腾平台上基于完全函数的多版本软件管理方法 |
CN112486505A (zh) * | 2019-09-12 | 2021-03-12 | 无锡江南计算技术研究所 | 容器化跨平台操作系统映像构建方法 |
US11042422B1 (en) * | 2020-08-31 | 2021-06-22 | Microsoft Technology Licensing, Llc | Hybrid binaries supporting code stream folding |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114510267A (zh) * | 2022-04-20 | 2022-05-17 | 麒麟软件有限公司 | 基于Linux系统的程序ABI接口兼容性计算方法 |
Also Published As
Publication number | Publication date |
---|---|
CN114217773B (zh) | 2022-12-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20080082974A1 (en) | Managing Software Component Version Identifications in a Componentised Software System | |
US6415435B1 (en) | Method and apparatus for determining compatibility of parent classes in an object oriented environment using versioning | |
JP5354602B2 (ja) | プロデューサグラフ指向のプログラミング及び実行 | |
JP5354603B2 (ja) | シナリオサポートを伴うプロデューサグラフ指向のプログラミングフレームワーク | |
US5737609A (en) | Method and apparatus for testing object-oriented programming constructs | |
US8554599B2 (en) | Work item rules for a work item tracking system | |
US6901579B1 (en) | Generation of source code from classes and maintaining the comment that indicates the role of the class in the generated source code | |
US8122440B1 (en) | Method and apparatus for enumerating external program code dependencies | |
US8347266B2 (en) | Declarative object identity | |
CN111796831B (zh) | 一种多芯片兼容的编译方法和装置 | |
US20080127303A1 (en) | Generating security validation code automatically | |
Kaki et al. | Mergeable replicated data types | |
US8701087B2 (en) | System and method of annotating class models | |
US6895581B1 (en) | Replaceable classes and virtual constructors for object-oriented programming languages | |
US20050065953A1 (en) | System and method for changing defined elements in a previously compiled program using a description file | |
Barghouti | Concurrency Control in Rule-Based Software Development Environments | |
Shapiro et al. | Revising conflicting intention sets in BDI agents | |
Greiner et al. | Bidirectional transformations with QVT-R: a case study in round-trip engineering UML class models and Java source code | |
US6675377B1 (en) | Program conversion apparatus | |
CN117270960A (zh) | 一种应用系统架构的分析方法及装置 | |
CN114217773B (zh) | 一种c/c++语言软件包二进制接口兼容性自动化判别方法 | |
Volz et al. | Towards an open meta modeling environment | |
JP7373587B2 (ja) | Dbmsにおけるサービス管理 | |
Valliappan et al. | Typing the wild in Erlang | |
Heckel et al. | Visual smart contracts for DAML |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |