CN104866369A - 一种数据处理的方法以及装置 - Google Patents
一种数据处理的方法以及装置 Download PDFInfo
- Publication number
- CN104866369A CN104866369A CN201510267105.8A CN201510267105A CN104866369A CN 104866369 A CN104866369 A CN 104866369A CN 201510267105 A CN201510267105 A CN 201510267105A CN 104866369 A CN104866369 A CN 104866369A
- Authority
- CN
- China
- Prior art keywords
- target
- compiling
- script
- dependence
- build
- 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
Landscapes
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明实施例公开了一种数据处理的方法以及装置,其中方法包括:获取至少一个构建脚本中各构建脚本中的第一编译目标以及与所述第一编译目标为直接依赖关系的第二编译目标;根据所述各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系,计算所述至少一个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,所述依赖关系树包括所述各第一编译目标和所述各第二编译目标之间的直接依赖关系以及间接依赖关系。采用本发明,可通过计算间接依赖关系,以避免各个编译目标之间出现冗余依赖的现象,从而提高构建代码的效率。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种数据处理的方法以及装置。
背景技术
GNU构建系统主要是指通过autoconf,automake和libtool这三个工具构建出来的软件结构体系,又名Autotools。通常和GNU make,gettext以及GCC一起配套使用。在linux系统上,通常都是定义Makefile通过GNU make工具来完成编译的。
软件项目用各种工具来构建代码,最常用的是GNU make。但是通过GNUmake工具构建代码仍然会存在以下问题:由于每个开发人员的Makefile编写不一致,所以可能会导致出现库文件的冗余依赖,从而影响了构建代码的效率。例如,Makfile_svrA:依赖的库包括libA、libB、libC,Makefile_libB:依赖的库包括libA、libC、libD,那么svrA的依赖关系就出现了冗余,冗余的依赖是libA、libC。
发明内容
本发明实施例提供一种数据处理的方法以及装置,可提高构建代码的效率。
本发明实施例第一方面提供了一种数据处理的方法,包括:
获取至少一个构建脚本中各构建脚本中的第一编译目标以及与所述第一编译目标为直接依赖关系的第二编译目标;
根据所述各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系,计算所述至少一个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,所述依赖关系树包括所述各第一编译目标和所述各第二编译目标之间的直接依赖关系以及间接依赖关系;
当检测到在所述各第一编译目标或所述各第二编译目标中存在代码更新时,根据所述依赖关系树对与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标进行重新编译。
本发明实施例第二方面提供了一种数据处理的装置,包括:
获取模块,用于获取至少一个构建脚本中各构建脚本中的第一编译目标以及与所述第一编译目标为直接依赖关系的第二编译目标;
计算模块,用于根据所述各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系,计算所述至少一个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,所述依赖关系树包括所述各第一编译目标和所述各第二编译目标之间的直接依赖关系以及间接依赖关系;
编译模块,用于当检测到在所述各第一编译目标或所述各第二编译目标中存在代码更新时,根据所述依赖关系树对与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标进行重新编译。
本发明实施例通过根据各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系,计算至少一个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,依赖关系树包括各第一编译目标和各第二编译目标之间的直接依赖关系以及间接依赖关系,从而可以避免各个编译目标之间出现冗余依赖的现象,以提高构建代码的效率;而且基于依赖关系树,可以在检测到在各第一编译目标或各第二编译目标中存在代码更新时,快速地查找到与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标,并对该初始编译目标进行重新编译,从而进一步提高了构建代码的效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的一种数据处理的方法的流程示意图;
图2是本发明实施例提供的另一种数据处理的方法的流程示意图;
图3是本发明实施例提供的一种数据处理的装置的结构示意图;
图4是本发明实施例提供的另一种数据处理的装置的结构示意图;
图5是本发明实施例提供的又一种数据处理的装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参见图1,是本发明实施例提供的一种数据处理的方法的流程示意图,所述方法可以包括:
S101,获取至少一个构建脚本中各构建脚本中的第一编译目标以及与所述第一编译目标为直接依赖关系的第二编译目标;
具体的,在获取至少一个构建脚本中各构建脚本中的第一编译目标以及与所述第一编译目标为直接依赖关系的第二编译目标之前,可先在所述至少一个构建脚本中声明需要构建的目标、目标的源代码、以及其直接依赖的其他目标,再对声明后的各个构建脚本进行编译,以获取至少一个构建脚本中各构建脚本中的第一编译目标以及与所述第一编译目标为直接依赖关系的第二编译目标。其中,所述第一编译目标可以为构建脚本中所声明的需要构建的目标,所述第二编译目标可以为与所述第一编译目标为直接依赖的目标。其中,在所述至少一个构建脚本中无需说明如何构建,从而可以降低使用难度,以提高开发效率。其中,直接依赖是指直接引用的关系,例如,库是用于将相似函数打包在一个单元中,这些单元就可以为其他开发人员所共享,那么在构建程序的过程中,一个单元直接引用另一个单元时,即可说明这两个单元为直接依赖关系。
可选的,所述构建脚本为编译二进制库的BUILD文件或编译二进制程序的BUILD文件;所述编译二进制库的BUILD文件包括:target的类型和名字、源代码列表、宏定义列表、优化选项、额外编译参数选项列表、引用头文件路径以及对外提供头文件路径;所述编译二进制程序的BUILD文件包括:target的类型和名字、源代码列表以及依赖代码列表。其中,所述编译二进制库的BUILD文件中的源代码列表可以为第一编译目标,引用头文件路径可以为第二编译目标;所述编译二进制程序的BUILD文件中的源代码列表可以为第一编译目标,依赖代码列表可以为第二编译目标。本实施例统一化了BUILD文件的写法以及每个关键字的定义,即编译每个二进制库的BUILD文件之前都需要先声明如target的类型和名字、源代码列表、宏定义列表、优化选项、额外编译参数选项列表、引用头文件路径以及对外提供头文件路径这些关键字所对应的内容,编译每个二进制程序的BUILD文件之前都需要先声明如target的类型和名字、源代码列表以及依赖代码列表这些关键字所对应的内容。其中,target的类型可以包括库类型、程序类型、测试类型、规则类型。
S102,根据所述各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系,计算所述至少一个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,所述依赖关系树包括所述各第一编译目标和所述各第二编译目标之间的直接依赖关系以及间接依赖关系;
具体的,获取到所述各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系后,可以根据所述各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系,计算所述至少一个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,即计算各个第一编译目标和各个第二编译目标之间的间接依赖关系。例如,有3个构建脚本,若第一个构建脚本的第一编译目标为A、第二编译目标为B,则A与B之间的直接依赖关系记录为A->B,第二个构建脚本中的直接依赖关系为B->C,第三个构建脚本中的直接依赖关系为C->D,根据这3个构建脚本的直接依赖关系,计算这3个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,该依赖关系树为A->B->C->D,由此可见,C和D是A的间接依赖关系,D是B的间接依赖关系。
S103,当检测到在所述各第一编译目标或所述各第二编译目标中存在代码更新时,根据所述依赖关系树对与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标进行重新编译;
具体的,当检测到在所述各第一编译目标或所述各第二编译目标中存在代码更新时,可以根据所述依赖关系树对与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标进行重新编译。例如,依赖关系树为A->B->C->D,那么编译目标A为依赖关系树的顶端,由于A与B是直接依赖关系,A与(C、D)均为间接依赖关系,所以A是(B、C、D)的初始编译目标,当B或C或D中发生代码更新时,即可根据所述依赖关系树对与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标(A)进行重新编译。
本发明实施例通过根据各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系,计算至少一个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,依赖关系树包括各第一编译目标和各第二编译目标之间的直接依赖关系以及间接依赖关系,从而可以避免各个编译目标之间出现冗余依赖的现象,以提高构建代码的效率;而且基于依赖关系树,可以在检测到在各第一编译目标或各第二编译目标中存在代码更新时,快速地查找到与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标,并对该初始编译目标进行重新编译,从而进一步提高了构建代码的效率。
再请参见图2,是本发明实施例提供的另一种数据处理的方法的流程示意图,所述方法可以包括:
S201,在现代构建系统中对所述至少一个构建脚本进行编译;
具体的,所述现代构建系统(modern construct system,MCS)是由main函数对外提供构建服务的,main函数主要包括6个类,6个类分别为用于封装基础操作的工具类、平台封装类、对构建脚本的管理类、命令行解析类、规则生成类、编译类。其中,所述用于封装基础操作的工具类主要用于封装基础操作,所述基础操作包括:获取相对路径、变量转化、读写锁、MD5(Message-DigestAlgorithm 5,信息-摘要算法5)值获取。所述平台封装类主要是用于编译平台类的封装,主要包括两个方面:第一方面,包括诸如获取gcc(GNU CompilerCollection,GNU编译器套件)版本、python头文件、java头文件等系统信息;第二方面,把常用的编译选项和不同的编译器自动关联,例如gcc/g++/clang,这三类不同的编译器加载不同的编译选项以及不同的库文件目录。所述对构建脚本的管理类是MCS的核心,主要负责解析编译配置文件,具体包括三个方面的内容解析:第一方面,编译目标的定义与解析;第二方面,根据直接依赖关系,动态计算间接依赖关系树;第三方面,定义动、静态库的不同生成方法。所述命令行解析类主要用于解析用户在终端输入的命令行,传递给最终执行的blade工具,并给用户提示。所述规则生成类主要用于支持用户配置的自动生成规则、自动生成代码或者其他规则定义。所述编译类主要用于将所述用于封装基础操作的工具类、所述平台封装类、所述对构建脚本的管理类、所述命令行解析类、所述规则生成类进行融合,且用于生成真正执行编译构建的动作,如编译目标、编译源程序等。
在建立好MCS后,即可在MCS中对所述至少一个构建脚本进行编译。其中,在编译所述至少一个构建脚本之前,还需要先在所述至少一个构建脚本中声明需要构建的目标、目标的源代码、以及其直接依赖的其他目标,再对声明后的各个构建脚本进行编译。其中,在所述至少一个构建脚本中无需说明如何构建,从而可以降低使用难度,以提高开发效率。
S202,获取至少一个构建脚本中各构建脚本中的第一编译目标以及与所述第一编译目标为直接依赖关系的第二编译目标;
具体的,在现代构建系统中对所述至少一个构建脚本进行编译后,可以获取至少一个构建脚本中各构建脚本中的第一编译目标以及与所述第一编译目标为直接依赖关系的第二编译目标。
可选的,所述构建脚本为编译二进制库的BUILD文件或编译二进制程序的BUILD文件;所述编译二进制库的BUILD文件包括:target的类型和名字、源代码列表、宏定义列表、优化选项、额外编译参数选项列表、引用头文件路径以及对外提供头文件路径;所述编译二进制程序的BUILD文件包括:target的类型和名字、源代码列表以及依赖代码列表。其中,所述编译二进制库的BUILD文件中的源代码列表可以为第一编译目标,引用头文件路径可以为第二编译目标;所述编译二进制程序的BUILD文件中的源代码列表可以为第一编译目标,依赖代码列表可以为第二编译目标。本实施例统一化了BUILD文件的写法以及每个关键字的定义,即编译每个二进制库的BUILD文件之前都需要先声明如target的类型和名字、源代码列表、宏定义列表、优化选项、额外编译参数选项列表、引用头文件路径以及对外提供头文件路径这些关键字所对应的内容,编译每个二进制程序的BUILD文件之前都需要先声明如target的类型和名字、源代码列表以及依赖代码列表这些关键字所对应的内容。其中,target的类型可以包括库类型、程序类型、测试类型、规则类型。
可选的,通过MCS编译一个BUILD文件的基本步骤如下:
1、定义好BUILD文件;
2、可以执行blade build,其中支持的参数如下,
ymcs build:构建当前目录下的所有目标;
ymcs build…:构建当前目录及其子目录下的所有目标;
ymcs build base/string/…system/…:构建base/string和system子目录下的所有target;
ymcs build:regex:构建当前目录下的regex目标;
ymcs build–m32–pdebug:构建32位debug版本;
ymcs test:XXX:自动构建并运行当前目录下的XXX目标;
3、编译出来的两个版本的二进制分别存放于:
debug版本的目标二进制生成的目录存放于debug主目录中;
release版本的目标二进制生成的目录存放于release主目录中。
S203,根据所述各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系,计算所述至少一个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,所述依赖关系树包括所述各第一编译目标和所述各第二编译目标之间的直接依赖关系以及间接依赖关系;
具体的,获取到所述各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系后,可以根据所述各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系,计算所述至少一个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,即计算各个第一编译目标和各个第二编译目标之间的间接依赖关系。例如,有3个构建脚本,若第一个构建脚本的第一编译目标为A、第二编译目标为B,则A与B之间的直接依赖关系记录为A->B,第二个构建脚本中的直接依赖关系为B->C,第三个构建脚本中的直接依赖关系为C->D,根据这3个构建脚本的直接依赖关系,计算这3个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,该依赖关系树为A->B->C->D,由此可见,C和D是A的间接依赖关系,D是B的间接依赖关系。
S204,当检测到在所述各第一编译目标或所述各第二编译目标中存在代码更新时,根据所述依赖关系树对与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标进行重新编译;
具体的,当检测到在所述各第一编译目标或所述各第二编译目标中存在代码更新时,可以根据所述依赖关系树对与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标进行重新编译。例如,依赖关系树为A->B->C->D,那么编译目标A为依赖关系树的顶端,由于A与B是直接依赖关系,A与(C、D)均为间接依赖关系,所以A是(B、C、D)的初始编译目标,当B或C或D中发生代码更新时,即可根据所述依赖关系树对与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标(A)进行重新编译。
S205,当检测到新增构建脚本,且获取到新增的构建脚本中的第一编译目标和第二编译目标之间的直接依赖关系时,根据所述新增的构建脚本中的第一编译目标和第二编译目标之间的直接依赖关系对所述依赖关系树进行更新;
具体的,在计算出依赖关系树后,并检测到新增构建脚本时,通过获取新增的构建脚本中的第一编译目标和第二编译目标之间的直接依赖关系,可以对所述依赖关系树进行更新。例如,所述依赖关系树为A->B->C->D,当新增的构建脚本中的直接依赖关系为D->E,那么可以将已有的所述依赖关系树更新为A->B->C->D->E,即通过统一化BUILD解析,可以实现每个程序或者库依赖关系动态更新以及源代码统一管理。
S206,用于当检测到所述至少一个构建脚本中存在头文件更新时,对引用更新后的头文件的构建脚本进行重新构建;
具体的,由于通过在构建脚本中定义“引用头文件路径”以及“对外提供头文件路径”,所以用于当检测到所述至少一个构建脚本中存在头文件更新时,即可快速找到引用该更新后的头文件的源文件,并对该源文件对应的构建脚本进行重新构建。
本发明实施例通过根据各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系,计算至少一个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,依赖关系树包括各第一编译目标和各第二编译目标之间的直接依赖关系以及间接依赖关系,从而可以避免各个编译目标之间出现冗余依赖的现象,以提高构建代码的效率;而且基于依赖关系树,可以在检测到在各第一编译目标或各第二编译目标中存在代码更新时,快速地查找到与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标,并对该初始编译目标进行重新编译,从而进一步提高了构建代码的效率。
优选地,运行MCS所需的条件包括:SCons v2.0or later(required);Pythonv2.6or later(required);ccache v3.1or later(optional)。
请参见图3,是本发明实施例提供的一种数据处理的装置的结构示意图,所述装置1可以包括:获取模块10、计算模块20、编译模块30;
所述获取模块10,用于获取至少一个构建脚本中各构建脚本中的第一编译目标以及与所述第一编译目标为直接依赖关系的第二编译目标;
具体的,在所述获取模块10获取至少一个构建脚本中各构建脚本中的第一编译目标以及与所述第一编译目标为直接依赖关系的第二编译目标之前,可先在所述至少一个构建脚本中声明需要构建的目标、目标的源代码、以及其直接依赖的其他目标,再对声明后的各个构建脚本进行编译,以通过所述获取模块10获取至少一个构建脚本中各构建脚本中的第一编译目标以及与所述第一编译目标为直接依赖关系的第二编译目标。其中,所述第一编译目标可以为构建脚本中所声明的需要构建的目标,所述第二编译目标可以为与所述第一编译目标为直接依赖的目标。其中,在所述至少一个构建脚本中无需说明如何构建,从而可以降低使用难度,以提高开发效率。
可选的,所述构建脚本为编译二进制库的BUILD文件或编译二进制程序的BUILD文件;所述编译二进制库的BUILD文件包括:target的类型和名字、源代码列表、宏定义列表、优化选项、额外编译参数选项列表、引用头文件路径以及对外提供头文件路径;所述编译二进制程序的BUILD文件包括:target的类型和名字、源代码列表以及依赖代码列表。其中,所述编译二进制库的BUILD文件中的源代码列表可以为第一编译目标,引用头文件路径可以为第二编译目标;所述编译二进制程序的BUILD文件中的源代码列表可以为第一编译目标,依赖代码列表可以为第二编译目标。本实施例统一化了BUILD文件的写法以及每个关键字的定义,即编译每个二进制库的BUILD文件之前都需要先声明如target的类型和名字、源代码列表、宏定义列表、优化选项、额外编译参数选项列表、引用头文件路径以及对外提供头文件路径这些关键字所对应的内容,编译每个二进制程序的BUILD文件之前都需要先声明如target的类型和名字、源代码列表以及依赖代码列表这些关键字所对应的内容。其中,target的类型可以包括库类型、程序类型、测试类型、规则类型。
所述计算模块20,用于根据所述各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系,计算所述至少一个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,所述依赖关系树包括所述各第一编译目标和所述各第二编译目标之间的直接依赖关系以及间接依赖关系;
具体的,所述获取模块10获取到所述各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系后,所述计算模块20可以根据所述各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系,计算所述至少一个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,即计算各个第一编译目标和各个第二编译目标之间的间接依赖关系。例如,有3个构建脚本,若第一个构建脚本的第一编译目标为A、第二编译目标为B,则A与B之间的直接依赖关系记录为A->B,第二个构建脚本中的直接依赖关系为B->C,第三个构建脚本中的直接依赖关系为C->D,根据这3个构建脚本的直接依赖关系,所述计算模块20可以计算出这3个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,该依赖关系树为A->B->C->D,由此可见,C和D是A的间接依赖关系,D是B的间接依赖关系。
所述编译模块30,用于当检测到在所述各第一编译目标或所述各第二编译目标中存在代码更新时,根据所述依赖关系树对与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标进行重新编译。
具体的,当检测到在所述各第一编译目标或所述各第二编译目标中存在代码更新时,所述编译模块30可以根据所述依赖关系树对与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标进行重新编译。例如,依赖关系树为A->B->C->D,那么编译目标A为依赖关系树的顶端,由于A与B是直接依赖关系,A与(C、D)均为间接依赖关系,所以A是(B、C、D)的初始编译目标,当B或C或D中发生代码更新时,所述编译模块30可根据所述依赖关系树对与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标(A)进行重新编译。
本发明实施例通过根据各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系,计算至少一个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,依赖关系树包括各第一编译目标和各第二编译目标之间的直接依赖关系以及间接依赖关系,从而可以避免各个编译目标之间出现冗余依赖的现象,以提高构建代码的效率;而且基于依赖关系树,可以在检测到在各第一编译目标或各第二编译目标中存在代码更新时,快速地查找到与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标,并对该初始编译目标进行重新编译,从而进一步提高了构建代码的效率。
再请参见图4,是本发明实施例提供的另一种数据处理的装置的结构示意图,所述装置1可以包括上述图3对应实施例中的获取模块10、计算模块20、编译模块30,进一步的,所述装置1还可以包括:更新模块40、重新构建模块50;
所述更新模块40,用于当检测到新增构建脚本,且获取到新增的构建脚本中的第一编译目标和第二编译目标之间的直接依赖关系时,根据所述新增的构建脚本中的第一编译目标和第二编译目标之间的直接依赖关系对所述依赖关系树进行更新;
具体的,在计算出依赖关系树后,并检测到新增构建脚本时,所述更新模块40通过获取新增的构建脚本中的第一编译目标和第二编译目标之间的直接依赖关系,可以对所述依赖关系树进行更新。例如,所述依赖关系树为A->B->C->D,当新增的构建脚本中的直接依赖关系为D->E,那么所述更新模块40可以将已有的所述依赖关系树更新为A->B->C->D->E,即通过统一化BUILD解析,可以实现每个程序或者库依赖关系动态更新以及源代码统一管理。
所述重新构建模块50,用于当检测到所述至少一个构建脚本中存在头文件更新时,对引用更新后的头文件的构建脚本进行重新构建;
具体的,由于通过在构建脚本中定义“引用头文件路径”以及“对外提供头文件路径”,所以用于当检测到所述至少一个构建脚本中存在头文件更新时,所述重新构建模块50可快速找到引用该更新后的头文件的源文件,并对该源文件对应的构建脚本进行重新构建。
其中,在所述获取模块10获取至少一个构建脚本中各构建脚本中的第一编译目标以及与所述第一编译目标为直接依赖关系的第二编译目标之前,所述编译模块30还用于在现代构建系统中对所述至少一个构建脚本进行编译;
具体的,所述现代构建系统是由main函数对外提供构建服务的,main函数主要包括6个类,6个类分别为用于封装基础操作的工具类、平台封装类、对构建脚本的管理类、命令行解析类、规则生成类、编译类。其中,所述用于封装基础操作的工具类主要用于封装基础操作,所述基础操作包括:获取相对路径、变量转化、读写锁、MD5值获取。所述平台封装类主要是用于编译平台类的封装,主要包括两个方面:第一方面,包括诸如获取gcc版本、python头文件、java头文件等系统信息;第二方面,把常用的编译选项和不同的编译器自动关联,例如gcc/g++/clang,这三类不同的编译器加载不同的编译选项以及不同的库文件目录。所述对构建脚本的管理类是MCS的核心,主要负责解析编译配置文件,具体包括三个方面的内容解析:第一方面,编译目标的定义与解析;第二方面,根据直接依赖关系,动态计算间接依赖关系树;第三方面,定义动、静态库的不同生成方法。所述命令行解析类主要用于解析用户在终端输入的命令行,传递给最终执行的blade工具,并给用户提示。所述规则生成类主要用于支持用户配置的自动生成规则、自动生成代码或者其他规则定义。所述编译类主要用于将所述用于封装基础操作的工具类、所述平台封装类、所述对构建脚本的管理类、所述命令行解析类、所述规则生成类进行融合,且用于生成真正执行编译构建的动作,如编译目标、编译源程序等。
在建立好MCS后,所述编译模块30可在MCS中对所述至少一个构建脚本进行编译。其中,在编译所述至少一个构建脚本之前,还需要先在所述至少一个构建脚本中声明需要构建的目标、目标的源代码、以及其直接依赖的其他目标,再对声明后的各个构建脚本进行编译。其中,在所述至少一个构建脚本中无需说明如何构建,从而可以降低使用难度,以提高开发效率。
可选的,通过MCS编译一个BUILD文件的基本步骤如下:
1、定义好BUILD文件;
2、可以执行blade build,其中支持的参数如下,
ymcs build:构建当前目录下的所有目标;
ymcs build…:构建当前目录及其子目录下的所有目标;
ymcs build base/string/…system/…:构建base/string和system子目录下的所有target;
ymcs build:regex:构建当前目录下的regex目标;
ymcs build–m32–pdebug:构建32位debug版本;
ymcs test:XXX:自动构建并运行当前目录下的XXX目标;
3、编译出来的两个版本的二进制分别存放于:
debug版本的目标二进制生成的目录存放于debug主目录中;
release版本的目标二进制生成的目录存放于release主目录中。
本发明实施例通过根据各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系,计算至少一个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,依赖关系树包括各第一编译目标和各第二编译目标之间的直接依赖关系以及间接依赖关系,从而可以避免各个编译目标之间出现冗余依赖的现象,以提高构建代码的效率;而且基于依赖关系树,可以在检测到在各第一编译目标或各第二编译目标中存在代码更新时,快速地查找到与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标,并对该初始编译目标进行重新编译,从而进一步提高了构建代码的效率。
请参见图5,是本发明实施例提供的又一种数据处理的装置的结构示意图,所述装置1000可以包括处理器1001、通信接口1002和存储器1003(所述装置1000中的处理器1001的数量可以为一个或多个,图5中以一个处理器1001为例)。本发明的一些实施例中,处理器1001、通信接口1002和存储器1003可通过通信总线或其他方式连接,其中,图5以通过通信总线连接为例。
所述存储器1003用于存储程序;
所述处理器1001用于执行所述程序,以实现:
获取至少一个构建脚本中各构建脚本中的第一编译目标以及与所述第一编译目标为直接依赖关系的第二编译目标;
根据所述各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系,计算所述至少一个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,所述依赖关系树包括所述各第一编译目标和所述各第二编译目标之间的直接依赖关系以及间接依赖关系;
当检测到在所述各第一编译目标或所述各第二编译目标中存在代码更新时,根据所述依赖关系树对与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标进行重新编译。
其中,所述构建脚本为编译二进制库的BUILD文件或编译二进制程序的BUILD文件;
所述编译二进制库的BUILD文件包括:target的类型和名字、源代码列表、宏定义列表、优化选项、额外编译参数选项列表、引用头文件路径以及对外提供头文件路径;
所述编译二进制程序的BUILD文件包括:target的类型和名字、源代码列表以及依赖代码列表。
其中,所述处理器1001还用于:
在现代构建系统中对所述至少一个构建脚本进行编译;
其中,所述现代构建系统包括用于封装基础操作的工具类、平台封装类、对构建脚本的管理类、命令行解析类、规则生成类、编译类;
其中,所述平台封装类用于将常用的编译选项和多种编译器自动关联,所述对构建脚本的管理类用于建立所述依赖关系树。
其中,所述处理器1001还用于:
当检测到新增构建脚本,且获取到新增的构建脚本中的第一编译目标和第二编译目标之间的直接依赖关系时,根据所述新增的构建脚本中的第一编译目标和第二编译目标之间的直接依赖关系对所述依赖关系树进行更新。
其中,所述处理器1001还用于:
用于当检测到所述至少一个构建脚本中存在头文件更新时,对引用更新后的头文件的构建脚本进行重新构建。
本发明实施例通过根据各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系,计算至少一个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,依赖关系树包括各第一编译目标和各第二编译目标之间的直接依赖关系以及间接依赖关系,从而可以避免各个编译目标之间出现冗余依赖的现象,以提高构建代码的效率;而且基于依赖关系树,可以在检测到在各第一编译目标或各第二编译目标中存在代码更新时,快速地查找到与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标,并对该初始编译目标进行重新编译,从而进一步提高了构建代码的效率。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
以上所揭露的仅为本发明较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。
Claims (10)
1.一种数据处理的方法,其特征在于,包括:
获取至少一个构建脚本中各构建脚本中的第一编译目标以及与所述第一编译目标为直接依赖关系的第二编译目标;
根据所述各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系,计算所述至少一个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,所述依赖关系树包括所述各第一编译目标和所述各第二编译目标之间的直接依赖关系以及间接依赖关系;
当检测到在所述各第一编译目标或所述各第二编译目标中存在代码更新时,根据所述依赖关系树对与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标进行重新编译。
2.如权利要求1所述的方法,其特征在于,所述构建脚本为编译二进制库的BUILD文件或编译二进制程序的BUILD文件;
所述编译二进制库的BUILD文件包括:target的类型和名字、源代码列表、宏定义列表、优化选项、额外编译参数选项列表、引用头文件路径以及对外提供头文件路径;
所述编译二进制程序的BUILD文件包括:target的类型和名字、源代码列表以及依赖代码列表。
3.如权利要求1所述的方法,其特征在于,在所述获取至少一个构建脚本中各构建脚本中的第一编译目标以及与所述第一编译目标为直接依赖关系的第二编译目标的步骤之前,还包括:
在现代构建系统中对所述至少一个构建脚本进行编译;
其中,所述现代构建系统包括用于封装基础操作的工具类、平台封装类、对构建脚本的管理类、命令行解析类、规则生成类、编译类;
其中,所述平台封装类用于将常用的编译选项和多种编译器自动关联,所述对构建脚本的管理类用于建立所述依赖关系树。
4.如权利要求1所述的方法,其特征在于,还包括:
当检测到新增构建脚本,且获取到新增的构建脚本中的第一编译目标和第二编译目标之间的直接依赖关系时,根据所述新增的构建脚本中的第一编译目标和第二编译目标之间的直接依赖关系对所述依赖关系树进行更新。
5.如权利要求1所述的方法,其特征在于,还包括:
当检测到所述至少一个构建脚本中存在头文件更新时,对引用更新后的头文件的构建脚本进行重新构建。
6.一种数据处理的装置,其特征在于,包括:
获取模块,用于获取至少一个构建脚本中各构建脚本中的第一编译目标以及与所述第一编译目标为直接依赖关系的第二编译目标;
计算模块,用于根据所述各构建脚本中的第一编译目标与第二编译目标之间的直接依赖关系,计算所述至少一个构建脚本中各第一编译目标和各第二编译目标之间的依赖关系树,所述依赖关系树包括所述各第一编译目标和所述各第二编译目标之间的直接依赖关系以及间接依赖关系;
编译模块,用于当检测到在所述各第一编译目标或所述各第二编译目标中存在代码更新时,根据所述依赖关系树对与代码更新后的编译目标具有直接依赖关系或间接依赖关系的初始编译目标进行重新编译。
7.如权利要求6所述的装置,其特征在于,所述构建脚本为编译二进制库的BUILD文件或编译二进制程序的BUILD文件;
所述编译二进制库的BUILD文件包括:target的类型和名字、源代码列表、宏定义列表、优化选项、额外编译参数选项列表、引用头文件路径以及对外提供头文件路径;
所述编译二进制程序的BUILD文件包括:target的类型和名字、源代码列表以及依赖代码列表。
8.如权利要求6所述的装置,其特征在于,
所述编译模块,还用于在现代构建系统中对所述至少一个构建脚本进行编译;
其中,所述现代构建系统包括用于封装基础操作的工具类、平台封装类、对构建脚本的管理类、命令行解析类、规则生成类、编译类;
其中,所述平台封装类用于将常用的编译选项和多种编译器自动关联,所述对构建脚本的管理类用于建立所述依赖关系树。
9.如权利要求6所述的装置,其特征在于,还包括:
更新模块,用于当检测到新增构建脚本,且获取到新增的构建脚本中的第一编译目标和第二编译目标之间的直接依赖关系时,根据所述新增的构建脚本中的第一编译目标和第二编译目标之间的直接依赖关系对所述依赖关系树进行更新。
10.如权利要求6所述的装置,其特征在于,还包括:
重新构建模块,用于当检测到所述至少一个构建脚本中存在头文件更新时,对引用更新后的头文件的构建脚本进行重新构建。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510267105.8A CN104866369B (zh) | 2015-05-22 | 2015-05-22 | 一种数据处理的方法以及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510267105.8A CN104866369B (zh) | 2015-05-22 | 2015-05-22 | 一种数据处理的方法以及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104866369A true CN104866369A (zh) | 2015-08-26 |
CN104866369B CN104866369B (zh) | 2018-05-08 |
Family
ID=53912218
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510267105.8A Active CN104866369B (zh) | 2015-05-22 | 2015-05-22 | 一种数据处理的方法以及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104866369B (zh) |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105718296A (zh) * | 2016-04-21 | 2016-06-29 | 北京元心科技有限公司 | 编译依赖关系树的生成显示方法及装置 |
CN106682529A (zh) * | 2017-01-04 | 2017-05-17 | 北京国舜科技股份有限公司 | 一种防篡改方法和防篡改终端 |
CN107885503A (zh) * | 2017-11-11 | 2018-04-06 | 湖南大学 | 一种基于程序特征分析的迭代编译优化方法 |
CN108153529A (zh) * | 2017-12-22 | 2018-06-12 | 杭州迪普科技股份有限公司 | 一种文件编译的方法及装置 |
CN108304185A (zh) * | 2016-08-09 | 2018-07-20 | 上海思立微电子科技有限公司 | 一种编译模块的方法和装置 |
CN109067713A (zh) * | 2018-07-17 | 2018-12-21 | 北京元心科技有限公司 | 软件安全防护方法、装置、电子设备及计算机存储介质 |
CN110262803A (zh) * | 2019-06-30 | 2019-09-20 | 潍柴动力股份有限公司 | 一种依赖关系的生成方法及装置 |
CN110333872A (zh) * | 2019-07-09 | 2019-10-15 | 广州虎牙科技有限公司 | 一种应用的处理方法、装置、设备和介质 |
CN110737429A (zh) * | 2018-07-20 | 2020-01-31 | 北京君正集成电路股份有限公司 | 一种利用Makefile自身的依赖关系的模块化编译方法和装置 |
CN110765100A (zh) * | 2019-09-09 | 2020-02-07 | 湖南天云软件技术有限公司 | 标签的生成方法、装置、计算机可读存储介质及服务器 |
CN111158701A (zh) * | 2019-12-18 | 2020-05-15 | 广州华多网络科技有限公司 | 库模块发布方法、装置、设备及存储介质 |
CN111290739A (zh) * | 2020-02-10 | 2020-06-16 | 腾讯科技(深圳)有限公司 | 文件引用策略的确定方法、装置、设备及存储介质 |
CN113296778A (zh) * | 2020-04-13 | 2021-08-24 | 阿里巴巴集团控股有限公司 | 一种资源文件的处理方法、装置、服务器、客户端及系统 |
CN113495728A (zh) * | 2020-03-18 | 2021-10-12 | 腾讯科技(深圳)有限公司 | 依赖关系确定方法、装置、电子设备及介质 |
CN114817061A (zh) * | 2022-05-16 | 2022-07-29 | 厦门大学 | 虚拟构建脚本的依赖性错误检测方法 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090049434A1 (en) * | 2007-08-14 | 2009-02-19 | Oki Electric Industry Co., Ltd. | Program translating apparatus and compiler program |
CN103020075A (zh) * | 2011-09-23 | 2013-04-03 | 启碁科技股份有限公司 | 分析目标对象的依赖关系的方法 |
CN103870310A (zh) * | 2014-02-18 | 2014-06-18 | 小米科技有限责任公司 | 程序编译方法及相关装置 |
CN104063220A (zh) * | 2014-06-25 | 2014-09-24 | 清华大学 | 基于文件的Linux基础软件依赖关系分析方法 |
CN104077140A (zh) * | 2014-07-04 | 2014-10-01 | 用友软件股份有限公司 | 用于持续集成的自动化编译方法和编译装置 |
CN104391733A (zh) * | 2014-12-10 | 2015-03-04 | 华中科技大学 | 一种依据依赖关系动态编译软件包的方法 |
-
2015
- 2015-05-22 CN CN201510267105.8A patent/CN104866369B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090049434A1 (en) * | 2007-08-14 | 2009-02-19 | Oki Electric Industry Co., Ltd. | Program translating apparatus and compiler program |
CN103020075A (zh) * | 2011-09-23 | 2013-04-03 | 启碁科技股份有限公司 | 分析目标对象的依赖关系的方法 |
CN103870310A (zh) * | 2014-02-18 | 2014-06-18 | 小米科技有限责任公司 | 程序编译方法及相关装置 |
CN104063220A (zh) * | 2014-06-25 | 2014-09-24 | 清华大学 | 基于文件的Linux基础软件依赖关系分析方法 |
CN104077140A (zh) * | 2014-07-04 | 2014-10-01 | 用友软件股份有限公司 | 用于持续集成的自动化编译方法和编译装置 |
CN104391733A (zh) * | 2014-12-10 | 2015-03-04 | 华中科技大学 | 一种依据依赖关系动态编译软件包的方法 |
Cited By (23)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105718296B (zh) * | 2016-04-21 | 2019-11-08 | 北京元心科技有限公司 | 编译依赖关系树的生成显示方法及装置 |
CN105718296A (zh) * | 2016-04-21 | 2016-06-29 | 北京元心科技有限公司 | 编译依赖关系树的生成显示方法及装置 |
CN108304185A (zh) * | 2016-08-09 | 2018-07-20 | 上海思立微电子科技有限公司 | 一种编译模块的方法和装置 |
CN106682529A (zh) * | 2017-01-04 | 2017-05-17 | 北京国舜科技股份有限公司 | 一种防篡改方法和防篡改终端 |
CN107885503B (zh) * | 2017-11-11 | 2021-01-08 | 湖南大学 | 一种基于程序特征分析的迭代编译优化方法 |
CN107885503A (zh) * | 2017-11-11 | 2018-04-06 | 湖南大学 | 一种基于程序特征分析的迭代编译优化方法 |
CN108153529A (zh) * | 2017-12-22 | 2018-06-12 | 杭州迪普科技股份有限公司 | 一种文件编译的方法及装置 |
CN109067713A (zh) * | 2018-07-17 | 2018-12-21 | 北京元心科技有限公司 | 软件安全防护方法、装置、电子设备及计算机存储介质 |
CN110737429A (zh) * | 2018-07-20 | 2020-01-31 | 北京君正集成电路股份有限公司 | 一种利用Makefile自身的依赖关系的模块化编译方法和装置 |
CN110262803A (zh) * | 2019-06-30 | 2019-09-20 | 潍柴动力股份有限公司 | 一种依赖关系的生成方法及装置 |
CN110333872A (zh) * | 2019-07-09 | 2019-10-15 | 广州虎牙科技有限公司 | 一种应用的处理方法、装置、设备和介质 |
CN110333872B (zh) * | 2019-07-09 | 2023-06-16 | 广州虎牙科技有限公司 | 一种应用的处理方法、装置、设备和介质 |
CN110765100A (zh) * | 2019-09-09 | 2020-02-07 | 湖南天云软件技术有限公司 | 标签的生成方法、装置、计算机可读存储介质及服务器 |
CN110765100B (zh) * | 2019-09-09 | 2022-08-02 | 天云软件技术有限公司 | 标签的生成方法、装置、计算机可读存储介质及服务器 |
CN111158701A (zh) * | 2019-12-18 | 2020-05-15 | 广州华多网络科技有限公司 | 库模块发布方法、装置、设备及存储介质 |
CN111158701B (zh) * | 2019-12-18 | 2023-08-08 | 广州华多网络科技有限公司 | 库模块发布方法、装置、设备及存储介质 |
CN111290739A (zh) * | 2020-02-10 | 2020-06-16 | 腾讯科技(深圳)有限公司 | 文件引用策略的确定方法、装置、设备及存储介质 |
CN111290739B (zh) * | 2020-02-10 | 2022-02-22 | 腾讯科技(深圳)有限公司 | 文件引用策略的确定方法、装置、设备及存储介质 |
CN113495728A (zh) * | 2020-03-18 | 2021-10-12 | 腾讯科技(深圳)有限公司 | 依赖关系确定方法、装置、电子设备及介质 |
CN113495728B (zh) * | 2020-03-18 | 2024-06-28 | 腾讯科技(深圳)有限公司 | 依赖关系确定方法、装置、电子设备及介质 |
CN113296778A (zh) * | 2020-04-13 | 2021-08-24 | 阿里巴巴集团控股有限公司 | 一种资源文件的处理方法、装置、服务器、客户端及系统 |
CN113296778B (zh) * | 2020-04-13 | 2024-06-25 | 灵犀互动娱乐控股有限公司 | 一种资源文件的处理方法、装置、服务器、客户端及系统 |
CN114817061A (zh) * | 2022-05-16 | 2022-07-29 | 厦门大学 | 虚拟构建脚本的依赖性错误检测方法 |
Also Published As
Publication number | Publication date |
---|---|
CN104866369B (zh) | 2018-05-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104866369A (zh) | 一种数据处理的方法以及装置 | |
US10496839B2 (en) | Protecting sensitive data in software products and in generating core dumps | |
US10019256B2 (en) | Systems and methods for incremental software development | |
CN102222012B (zh) | 针对外部数据源的静态类型检查 | |
CN111090433B (zh) | 一种数据处理的方法、装置和存储介质 | |
CN105511911B (zh) | 系统固件升级包的生成方法及装置 | |
TWI566180B (zh) | 一種動態創建可附加和可拆除二進位檔案的系統和方法 | |
CN107506221B (zh) | 应用程序升级方法、装置及设备 | |
CN111414169B (zh) | Bmc镜像升级方法及相关组件 | |
CN103942065A (zh) | 用于更新固件兼容性数据的方法和系统 | |
CN110083360B (zh) | 一种应用程序代码的编译方法、装置、设备及存储介质 | |
US20120227034A1 (en) | Incremental generation of managed assemblies | |
US9690567B2 (en) | Runtime detection of software configurations and upgrades | |
CN111399840A (zh) | 一种模块开发方法及装置 | |
CN110058861B (zh) | 源码处理方法及装置、存储介质、电子设备 | |
US20170344345A1 (en) | Versioning of build environment information | |
CN102955698A (zh) | 基于多终端的软件开发的处理方法和装置 | |
CN103186463B (zh) | 确定软件的测试范围的方法和系统 | |
US20190205239A1 (en) | Code update based on detection of change in runtime code during debugging | |
CN110851168B (zh) | 数据处理方法及其装置、计算机可读存储介质 | |
CN111324591B (zh) | 区块链分叉的检测方法及相关装置 | |
CN112419057A (zh) | 智能合约的日志生成及保存方法、装置、设备和存储介质 | |
CN111435312A (zh) | 应用程序管理方法、装置及电子设备 | |
CN117076296A (zh) | 网络嵌入式设备的控制系统、方法、设备及介质 | |
CN116893960A (zh) | 代码质量检测方法、装置、计算机设备和存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
EXSB | Decision made by sipo to initiate substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
CB02 | Change of applicant information |
Address after: 510000, Guangdong Province, Guangzhou, Panyu District Town, Huambo business district, Wanda Plaza, block B1, 28 floor Applicant after: Guangzhou Huaduo Network Technology Co., Ltd. Address before: 510655, Guangzhou, Whampoa Avenue, No. 2, creative industrial park, building 3-08, Applicant before: Guangzhou Huaduo Network Technology Co., Ltd. |
|
CB02 | Change of applicant information | ||
GR01 | Patent grant | ||
GR01 | Patent grant |