CN115437640A - 快速编译工程代码的方法 - Google Patents
快速编译工程代码的方法 Download PDFInfo
- Publication number
- CN115437640A CN115437640A CN202211038837.6A CN202211038837A CN115437640A CN 115437640 A CN115437640 A CN 115437640A CN 202211038837 A CN202211038837 A CN 202211038837A CN 115437640 A CN115437640 A CN 115437640A
- Authority
- CN
- China
- Prior art keywords
- target
- depth
- dependent
- dependency
- compiling
- 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.)
- Pending
Links
Images
Classifications
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明涉及快速编译工程代码的方法,提取工程所有Makefile文件,解析出编译目标target和依赖目标,生成target依赖关系文件;依据target依赖关系文件解析和计算出每个target的编译依赖深度;依据计算的target编译依赖深度结果利用多线程并发编译多个target。基于工程Makefile文件解析和运用多线程技术实现工程代码编译时间大幅降低,采用多线程技术充分发挥编译服务器的性能,充分利用CPU资源,并发编译多个target,极大的缩减了编译整个工程代码的时间,高效的完成全工程编译。
Description
技术领域
本发明涉及一种快速编译工程代码的方法。
背景技术
目前,嵌入式软件发展迅速,以政企网关设备为例,客户需求越来越多,进而设备所需的功能模块越来越多,导致工程代码日渐庞大,传统的编译方法为直接添加新target,整个工程target按顺序执行,从而编译时间会逐步变长,极大的影响了开发效率;并且当前编译服务器的CPU都是多核的,按传统的编译方法,如果单个target本身无法支持多核同时编译,则编译服务器的资源会极大的浪费,因此充分利用编译服务器性能快速高效的编译工程代码成为一个切实的需求。
发明内容
本发明的目的是克服现有技术存在的不足,提供一种快速编译工程代码的方法。
本发明的目的通过以下技术方案来实现:
快速编译工程代码的方法,特点是:对拥有多target的工程代码的Makefile文件解析提取出target和对应依赖,利用多线程并发编译多个target,包括以下步骤:
1)提取工程所有Makefile文件,解析出编译目标target和依赖目标,生成target依赖关系文件;
2)依据target依赖关系文件解析和计算出每个target的编译依赖深度;
3)依据计算的target编译依赖深度结果利用多线程并发编译多个target。
进一步地,上述的快速编译工程代码的方法,其中,所述步骤1),target依赖文件格式定义如下:
targetA=空
targetB=空
targetC=targetA,targetB
targetA、targetB和targetC为工程待编译目标,targetA无依赖,targetB无依赖,targetC依赖targetA和targetB,故targetA和targetB是targetC的依赖,多个依赖以逗号分隔。
进一步地,上述的快速编译工程代码的方法,其中,所述步骤2),依据target依赖关系文件解析和计算出每个target的编译依赖深度,步骤如下:
S21)依据target依赖文件解析出所有target进行保存,存储结构为Hash链表;
S22)依据target依赖文件解析出所有target的依赖进行保存,存储结构为字符串数组;
S23)target校验,剔除相同的target依赖记录;
S24)遍历步骤S21)中生成的Hash链表,若target对应的依赖为空,则依赖深度为1,若target有对应依赖,则依赖深度+1,将依赖当作target递归计算,得到最终依赖深度,相同依赖深度的target存储到同一链表,最终生成多条依赖深度不同的链表。
进一步地,上述的快速编译工程代码的方法,其中,步骤S21),依据target依赖文件解析出所有target进行保存,存储结构为Hash链表,4个target根据target名称按固定算法计算Hash的key值,targetA key值为0则存入list[0]链表,targetB和targetD key值为3则存入list[3]链表,targetC key值为10,则存入list[10]链表;
步骤S22),依据target依赖文件解析出所有target的依赖进行保存,存储结构为字符串数组;
步骤S23),target校验,剔除相同的target依赖记录,即在将target添加到p_key_list中时查找该target是否已存在于p_key_list中,若存在,则忽略;
步骤S24),遍历步骤S21)中生成的Hash链表,若target对应的依赖为空,则依赖深度为1,若target有对应依赖,则依赖深度+1,将依赖当作target递归计算,得到最终依赖深度,相同依赖深度的target存储到同一链表,最终生成多条依赖深度不同的链表,默认依赖深度为1,遍历p_key_list,计算targetA依赖深度,targetA依赖targetB,则依赖+1,继续查找targetB,targetB无依赖,则targetA的依赖深度为2,存入list[2]dnext链表;计算targetB依赖深度,targetB无依赖,则targetB依赖深度为1,存入list[1]dnext链表;计算targetC依赖深度,targetC无依赖,则targetC依赖深度为1,存入list[1]dnext链表;计算targetD依赖深度,targetD有多个依赖,则遍历所有依赖,首先依赖targetA,则依赖+1,继续查找targetA,targetA依赖targetB,则依赖+1,继续查找targetB,targetB无依赖,则targetD的目前依赖深度为3,然后依赖targetC,targetC无依赖,则targetD的目前依赖深度为2,取两次计算的targetD的依赖最大值,即3,存入list[3]dnext链表。
进一步地,上述的快速编译工程代码的方法,其中,步骤3),依据计算的target编译依赖深度结果运用多线程技术并发编译多个target,步骤如下:
S31)遍历步骤S24)中生成的多条依赖深度不同的链表,按照依赖深度从小到大进行遍历,因待编译target在其所有依赖编译完成之后编译,按线程配置个数启动线程,每个线程步骤如下:
S311)若当前依赖深度链表不为空,则线程取当前未编译的target进行编译,并设置编译标记,编译完成则从当前链表删除target并退出,编译失败,则设置错误标记,通知其他线程退出,所有步骤结束;
S312)若当前依赖深度链表不为空同时依赖深度链表所有target未全部编译完成,则继续步骤S311);
S313)若当前依赖深度链表为空同时依赖深度链表所有target未全部编译完成,则线程直接退出;
S314)若当前依赖深度链表为空同时依赖深度链表所有target全部编译完成,继续步骤S32);
S32)选取下一条依赖深度的链表,继续步骤S31),若所有依赖深度的链表均编译完成,则编译完成,程序退出。
本发明与现有技术相比具有显著的优点和有益效果,具体体现在以下方面:
本发明基于工程Makefile文件解析和运用多线程技术实现工程代码编译时间大幅降低,采用多线程技术充分发挥编译服务器的性能,充分利用CPU资源,并发编译多个target,极大的缩减了编译整个工程代码的时间,高效的完成全工程编译,显著提高了开发的效率。
本发明的其他特征和优点将在随后的说明书阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明具体实施方式了解。本发明的目的和其他优点可通过在所写的说明书以及附图中所特别指出的结构来实现和获得。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1:本发明方法的流程图;
图2:自定义target依赖文件格式说明;
图3:自定义数据存储结构说明;
图4:数据存储举例示意图。
具体实施方式
下面将结合本发明实施例中附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。同时,在本发明的描述中,方位术语和次序术语等仅用于区分描述,而不能理解为指示或暗示相对重要性。
由于传统编译模式下,当工程代码模块逐步增多时,是依次顺序编译,编译时间会依次累加,越来越长。而本发明基于工程Makefile文件解析和运用多线程技术实现工程代码编译时间大幅降低。
本发明快速编译工程代码的方法,对拥有多target的工程代码的Makefile文件解析提取出target和对应依赖,利用多线程并发编译多个target。其步骤为:
步骤S1,提取工程所有Makefile文件,解析出编译目标target和依赖目标,生成target依赖关系文件;
步骤S2,依据target依赖关系文件解析和计算出每个target的编译依赖深度;
步骤S3,依据计算的target编译依赖深度结果运用多线程技术并发编译多个target。
步骤S1中,target依赖关系文件数据格式如图2所示,工程代码共包含4个target,targetA依赖targetB,targetB和targetC无依赖,targetD依赖targetA和targetC。
步骤S2中,具体包括:
步骤S21,依据target依赖文件解析出所有target进行保存,存储结构为Hash链表,如图3的数据结构元素key和图4的p_key_list,4个target根据target名称按固定算法计算Hash的key值,targetA key值为0则存入list[0]链表,targetB和targetD key值为3则存入list[3]链表,targetC key值为10,则存入list[10]链表;
步骤S22,依据target依赖文件解析出所有target的依赖进行保存,存储结构为字符串数组,如图3的数据结构元素value;
步骤S23,target校验,剔除相同的target依赖记录,即在将target添加到p_key_list中时需查找该target是否已存在于p_key_list中,若存在,则忽略;
步骤S24,遍历步骤S21中生成的Hash链表,若target对应的依赖为空,则依赖深度为1,若target有对应依赖,则依赖深度+1,将依赖当作target递归计算,得到最终依赖深度,相同依赖深度的target存储到同一链表,最终生成多条依赖深度不同的链表,默认依赖深度为1,遍历p_key_list,计算targetA依赖深度,targetA依赖targetB,则依赖+1,继续查找targetB,targetB无依赖,则targetA的依赖深度为2,存入list[2]dnext链表;计算targetB依赖深度,targetB无依赖,则targetB依赖深度为1,存入list[1]dnext链表;计算targetC依赖深度,targetC无依赖,则targetC依赖深度为1,存入list[1]dnext链表;计算targetD依赖深度,targetD有多个依赖,则遍历所有依赖,首先依赖targetA,则依赖+1,继续查找targetA,targetA依赖targetB,则依赖+1,继续查找targetB,targetB无依赖,则targetD的目前依赖深度为3,然后依赖targetC,targetC无依赖,则targetD的目前依赖深度为2,取两次计算的targetD的依赖最大值,即3,存入list[3]dnext链表;最终结果如图4的p_make_list;
步骤S3中,具体包括:
步骤S31,遍历步骤S24中生成的多条依赖深度不同的链表,按照依赖深度从小到大进行遍历,因为待编译target只能在其所有依赖编译完成之后才能编译,按线程配置个数启动线程,每个线程步骤如下:
步骤S311、若当前依赖深度链表不为空,则线程取当前未编译的target进行编译,并设置编译标记,编译完成则从当前链表删除target并退出,编译失败,则设置错误标记,通知其他线程退出;
步骤S312、若当前依赖深度链表不为空同时依赖深度链表所有target未全部编译完成,则继续S311;
步骤S313、若当前依赖深度链表为空同时依赖深度链表所有target未全部编译完成,则线程直接退出;
步骤S314、若当前依赖深度链表为空同时依赖深度链表所有target全部编译完成,继续S32;
S32:选取下一条依赖深度的链表,继续步骤S31,若所有依赖深度的链表均编译完成,则编译完成,程序退出。
依次遍历图4中p_make_list的list[1]、list[2]、list[3],线程配置个数为3,具体步骤如下:
a)线程1选取list[1]targetB编译,线程2选取list[1]targetC编译,线程3启动发现list[1]已经无可编译target则退出;
b)若线程1或线程2编译出错,则互相通知线程退出,编译结束;
c)若线程1和线程2均编译成功,则开始遍历list[2],线程1选取list[2]targetA编译,线程2和3启动发现list[2]已经无可编译target则退出;
d)若线程1编译出错,则线程退出,编译结束;
e)若线程1编译成功,则开始遍历list[3],线程1选取list[3]targetD编译,线程2和3启动发现list[2]已经无可编译target则退出;
f)若线程1编译出错,则线程退出,编译结束;
g)若线程1编译成功,则工程编译完成。
综上所述,本发明采用多线程技术充分发挥编译服务器的性能,充分利用CPU资源,并发编译多个target,极大的缩减了编译整个工程代码的时间,高效的完成全工程编译,显著提高了开发的效率。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
上述仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
Claims (5)
1.快速编译工程代码的方法,其特征在于:对拥有多target的工程代码的Makefile文件解析提取出target和对应依赖,利用多线程并发编译多个target,包括以下步骤:
1)提取工程所有Makefile文件,解析出编译目标target和依赖目标,生成target依赖关系文件;
2)依据target依赖关系文件解析和计算出每个target的编译依赖深度;
3)依据计算的target编译依赖深度结果利用多线程并发编译多个target。
2.根据权利要求1所述的快速编译工程代码的方法,其特征在于:所述步骤1),target依赖文件格式定义如下:
targetA=空
targetB=空
targetC=targetA,targetB
targetA、targetB和targetC为工程待编译目标,targetA无依赖,targetB无依赖,targetC依赖targetA和targetB,故targetA和targetB是targetC的依赖,多个依赖以逗号分隔。
3.根据权利要求1所述的快速编译工程代码的方法,其特征在于:所述步骤2),依据target依赖关系文件解析和计算出每个target的编译依赖深度,步骤如下:
S21)依据target依赖文件解析出所有target进行保存,存储结构为Hash链表;
S22)依据target依赖文件解析出所有target的依赖进行保存,存储结构为字符串数组;
S23)target校验,剔除相同的target依赖记录;
S24)遍历步骤S21)中生成的Hash链表,若target对应的依赖为空,则依赖深度为1,若target有对应依赖,则依赖深度+1,将依赖当作target递归计算,得到最终依赖深度,相同依赖深度的target存储到同一链表,最终生成多条依赖深度不同的链表。
4.根据权利要求1或3所述的快速编译工程代码的方法,其特征在于:
步骤S21),依据target依赖文件解析出所有target进行保存,存储结构为Hash链表,4个target根据target名称按固定算法计算Hash的key值,targetA key值为0则存入list[0]链表,targetB和targetD key值为3则存入list[3]链表,targetC key值为10,则存入list[10]链表;
步骤S22),依据target依赖文件解析出所有target的依赖进行保存,存储结构为字符串数组;
步骤S23),target校验,剔除相同的target依赖记录,即在将target添加到p_key_list中时查找该target是否已存在于p_key_list中,若存在,则忽略;
步骤S24),遍历步骤S21)中生成的Hash链表,若target对应的依赖为空,则依赖深度为1,若target有对应依赖,则依赖深度+1,将依赖当作target递归计算,得到最终依赖深度,相同依赖深度的target存储到同一链表,最终生成多条依赖深度不同的链表,默认依赖深度为1,遍历p_key_list,计算targetA依赖深度,targetA依赖targetB,则依赖+1,继续查找targetB,targetB无依赖,则targetA的依赖深度为2,存入list[2]dnext链表;计算targetB依赖深度,targetB无依赖,则targetB依赖深度为1,存入list[1]dnext链表;计算targetC依赖深度,targetC无依赖,则targetC依赖深度为1,存入list[1]dnext链表;计算targetD依赖深度,targetD有多个依赖,则遍历所有依赖,首先依赖targetA,则依赖+1,继续查找targetA,targetA依赖targetB,则依赖+1,继续查找targetB,targetB无依赖,则targetD的目前依赖深度为3,然后依赖targetC,targetC无依赖,则targetD的目前依赖深度为2,取两次计算的targetD的依赖最大值,即3,存入list[3]dnext链表。
5.根据权利要求1所述的快速编译工程代码的方法,其特征在于:步骤3),依据计算的target编译依赖深度结果运用多线程技术并发编译多个target,步骤如下:
S31)遍历步骤S24)中生成的多条依赖深度不同的链表,按照依赖深度从小到大进行遍历,因待编译target在其所有依赖编译完成之后编译,按线程配置个数启动线程,每个线程步骤如下:
S311)若当前依赖深度链表不为空,则线程取当前未编译的target进行编译,并设置编译标记,编译完成则从当前链表删除target并退出,编译失败,则设置错误标记,通知其他线程退出,所有步骤结束;
S312)若当前依赖深度链表不为空同时依赖深度链表所有target未全部编译完成,则继续步骤S311);
S313)若当前依赖深度链表为空同时依赖深度链表所有target未全部编译完成,则线程直接退出;
S314)若当前依赖深度链表为空同时依赖深度链表所有target全部编译完成,继续步骤S32);
S32)选取下一条依赖深度的链表,继续步骤S31),若所有依赖深度的链表均编译完成,则编译完成,程序退出。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211038837.6A CN115437640A (zh) | 2022-08-29 | 2022-08-29 | 快速编译工程代码的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211038837.6A CN115437640A (zh) | 2022-08-29 | 2022-08-29 | 快速编译工程代码的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115437640A true CN115437640A (zh) | 2022-12-06 |
Family
ID=84245201
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211038837.6A Pending CN115437640A (zh) | 2022-08-29 | 2022-08-29 | 快速编译工程代码的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115437640A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116755991A (zh) * | 2023-08-14 | 2023-09-15 | 北京精琢科技有限公司 | 通用跨平台cpu算力评估方法、电子设备 |
-
2022
- 2022-08-29 CN CN202211038837.6A patent/CN115437640A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116755991A (zh) * | 2023-08-14 | 2023-09-15 | 北京精琢科技有限公司 | 通用跨平台cpu算力评估方法、电子设备 |
CN116755991B (zh) * | 2023-08-14 | 2023-11-17 | 北京精琢科技有限公司 | 通用跨平台cpu算力评估方法、电子设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Gabel et al. | A study of the uniqueness of source code | |
EP2784665B1 (en) | Program and version control method | |
CN101308471B (zh) | 一种恢复数据的方法及装置 | |
US11429572B2 (en) | Rules-based dataset cleaning | |
CN107545071B (zh) | 一种字符串匹配的方法和装置 | |
CN110334326B (zh) | 一种识别配方文件并转化为xml文件的方法及系统 | |
Alawneh et al. | Pattern recognition techniques applied to the abstraction of traces of inter-process communication | |
US20110320876A1 (en) | Systems and methods for processing source code during debugging operations | |
CN114398069B (zh) | 一种基于交叉指纹分析的公共组件库精确版本识别方法及系统 | |
US20180165333A1 (en) | Big data calculation method and system | |
CN107239549A (zh) | 数据库术语检索的方法、装置及终端 | |
CN115437640A (zh) | 快速编译工程代码的方法 | |
CN110990055B (zh) | 一种基于程序分析的Pull Request功能分类方法 | |
CN114780138A (zh) | 流场模拟软件代码版本管理方法、装置和存储介质 | |
CN112698866B (zh) | 一种基于Git的代码行生命周期追溯方法及电子装置 | |
CN113792026A (zh) | 数据库脚本的部署方法、装置及计算机可读存储介质 | |
Michaud et al. | Recovering commit branch of origin from github repositories | |
CN104714956A (zh) | 一种异构记录集对比方法及装置 | |
CN107239399A (zh) | 用于测试的索引生成方法、装置、系统及可读存储介质 | |
CN115373699B (zh) | 自动化部署方法和系统 | |
CN115640155A (zh) | 基于语句依赖和补丁相似性的程序自动修复方法与系统 | |
CN112115125B (zh) | 数据库访问对象名称解析方法、装置及电子设备 | |
CN115168085A (zh) | 一种基于diff代码块匹配的重复冲突方案检测方法 | |
CN111400243B (zh) | 基于流水线服务的研发管理系统以及文件存储方法、装置 | |
CN110032366B (zh) | 一种代码定位方法及装置 |
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 |