CN104391733B - 一种依据依赖关系动态编译软件包的方法 - Google Patents
一种依据依赖关系动态编译软件包的方法 Download PDFInfo
- Publication number
- CN104391733B CN104391733B CN201410750369.4A CN201410750369A CN104391733B CN 104391733 B CN104391733 B CN 104391733B CN 201410750369 A CN201410750369 A CN 201410750369A CN 104391733 B CN104391733 B CN 104391733B
- Authority
- CN
- China
- Prior art keywords
- stamp
- software kit
- file
- software
- name
- 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.)
- Expired - Fee Related
Links
Landscapes
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种依据依赖关系动态编译软件包的方法,设定特定变量为当前项目所在的目录;清空为标识依赖关系所设定的特定变量目录下所有文件;调用一个或多个所需要的主要软件包;在每个脚本中,根据本软件包的特性,依据约定依次调用本软件包所依赖的各个子软件包,然后调用run_task,传入参数为本软件包的包名;执行run_task。本发明能根据软件包之间的依赖关系自动的决定编译顺序,从而在软件包依赖关系变动时,自动的调整形成新的编译过程。
Description
技术领域
本发明属于编译技术,具体涉及一种依据依赖关系动态编译软件包的方法,应用于搭建基于linux内核的操作系统,并在软件包调整时自动调整新的编译顺序。
背景技术
随着linux系统内核和开放源码的不断发展,以Ubuntu、CentOS等为代表的新型操作系统,正逐渐在各个领域,取代传统的商用操作系统。企业和个人可以根据这些公开的知识,通过不断调试和增加自有内容,形成具有个性特点的全新操作系统。
构建这样一个开源操作系统的基本过程是,将大量的开源软件包经过编译,有机的结合在一起。在这一过程中,由于软件包彼此之间存在依赖关系,使得当软件包数量增加到一定程度时,整个系统复杂度无法通过手工的方式管理。
软件包之间的这种依赖关系存在几个特点:
1、软件包数量巨大,依赖关系非常复杂;
2、动态性。随着时间的演化,个别软件包改变了以往的所需的基础软件包,就会改变以往的依赖关系;
3、无论多么复杂的依赖关系图都不可能存在回路,因此可以用分支树来描述。
因此,构建一个开源操作系统不是静态的,而是一个动态决定各步骤顺序的批处理过程。
在企业或者组织的成长过程中,会加入自有知识产权的软件包,同时形成对既有软件包的依赖关系。这时,存在一个问题。已有的构建系统,比如ltib或者OpenEmbedded都是基于php或是python这样的脚本开发环境设计的一个系统,与编译、调试软件时使用的linux命令行操作不一样,因此需要引入较高的学习曲线来习惯和适应这一编译和管理系统。如何设计一个简易的系统,能根据软件包之间的依赖关系自动的决定编译顺序,从而在软件包依赖关系变动时,自动的调整形成新的编译过程,成为一个问题。
发明内容
本发明的目的在针对现有技术存在的上述问题,提供一种依据依赖关系动态编译软件包的方法,该方法具有较高的准确度和较广的适用性。
在本方法中,单个软件包以不包含版本号的全名作为唯一标识。比如busybox-1.20.2和busybox-1.19.4这两个软件包的全名都是busybox。
在本方法中,单个软件包的编译操作封装在"compile_"打头的BASH脚本函数中。例如,对于busybox的编译操作封装在"compile_busybox"脚本函数中,其中包含了对该软件包的具体编译方法,但不包含建立该软件包所依赖软件包的基础环境。
在本方法中,单个软件包的编译入口封装在"build_"打头的BASH脚本中,该脚本需要调用本软件包所依赖的相关软件包的"build_xxx"函数。"build_xxx"函数必须通过固定的run_task函数启动自身的"compile_xxx"函数。
在本方法中,称为ROOTDIR,该目录一般不是宿主机的根目录(/)。
一种依据依赖关系动态编译软件包的方法,包括以下步骤:
步骤(1)、设定特定变量(以ROOTDIR为例)为当前项目所在的目录;即 ROOTDIR=`(cd ".."; /bin/pwd)`;
步骤(2)、清空为标识依赖关系所设定的特定目录(以$ROOTDIR/.stamp为例)下所有文件;
步骤(3)、调用一个或多个所需要的主要软件包。比如build_x11、build_qt等,这一步完全取决于需要最终操作系统具有什么特性,不需要考虑先后顺序和各个软件包的依赖关系;
步骤(4)、在每个build_XXX脚本中,根据本软件包的特性,依据约定依次调用本软件包所依赖的各个子软件包build_YYY1、build_YYY2、……、build_YYYn。这时不需要考虑子软件包的二次依赖关系。然后调用run_task,传入参数为本软件包的包名;
步骤(5)、执行run_task <软件包名>;
步骤(5a)、首先判断"$ROOTDIR/.stamp/"目录下是否存在<软件包名.stamp>文件,如果存在,直接跳过整个步骤(5);
步骤(5b)、判断"$ROOTDIR/.stamp/"目录下是否存在".tasklist"文件,如果不存在则创建一个空文件;
步骤(5c)、判断"$ROOTDIR/.stamp/.tasklist"文件中是否存在一行的内容为本次编译的软件包名,如果存在,说明存在依赖关系环路,这是一种错误,在屏幕上打印出.tasklist文件内容,同时异常退出;否则在该文件末尾添加一行,内容为<软件包名>和一个回车;
步骤(5d)、初始化必要的环境变量,调用"compile_<软件包名>"开始编译,判断返回值,如果编译失败则异常退出,否则编译成功,创建一个后缀名为.stamp的<软件包名.stamp>文件。
步骤(5e)、将"$ROOTDIR/.stamp/"目录下".tasklist"文件最后一行删除。
步骤(6)、跳转到步骤(3)中继续开始下一个关键软件包的编译。
在本算法中,步骤(5b)、(5c)和步骤(5e)不是关键步骤。当省略掉这些步骤时,如果设定的软件包依赖关系存在环路,就会造成死锁,必须人为中断;而添加这些步骤后,可以立刻发现这一错误,并给出依赖环路关系。在个性化的操作系统的研发过程中,软件包自身、编译方法和所依赖的基础软件都是可能发生变化的,当软件包数量较大时,发生依赖环路错误的可能性较大,因此添加环路检测是更方便、有效的措施。
本发明与现有技术相比,具有以下有益效果:
与以往用基于php/ruby/python等脚本语言开发的软件系统相比,本发明方法使用更为直观、简易的特点。首先,BASH脚本本身就是linux的解释运行环境,不需要对宿主机提出额外的环境要求;其次,本方法将依赖关系和编译方法结合在一次,调试修改时只需要修改一个位置,不需要额外修改描述依赖关系的配置文件,更便于持续集成过程中的迭代修改。本方法对于自研操作系统的研发过程具有很好的作用和效果。
具体实施方式
一种依据依赖关系动态编译软件包的方法,包括以下步骤:
步骤(1)、设定特定变量(以ROOTDIR为例)为当前项目所在的目录;即 ROOTDIR=`(cd ".."; /bin/pwd)`;
步骤(2)、清空为标识依赖关系所设定的特定目录(以$ROOTDIR/.stamp为例)下所有文件;
步骤(3)、调用一个或多个所需要的主要软件包。比如build_x11、build_qt等,这一步完全取决于需要最终操作系统具有什么特性,不需要考虑先后顺序和各个软件包的依赖关系;
步骤(4)、在每个build_XXX脚本中,根据本软件包的特性,依据约定依次调用本软件包所依赖的各个子软件包build_YYY1、build_YYY2、……、build_YYYn。这时不需要考虑子软件包的二次依赖关系。然后调用run_task,传入参数为本软件包的包名;
步骤(5)、执行run_task <软件包名>;
步骤(5a)、首先判断"$ROOTDIR/.stamp/"目录下是否存在<软件包名.stamp>文件,如果存在,直接跳过整个步骤(5);
步骤(5b)、判断"$ROOTDIR/.stamp/"目录下是否存在".tasklist"文件,如果不存在则创建一个空文件;
步骤(5c)、判断"$ROOTDIR/.stamp/.tasklist"文件中是否存在一行的内容为本次编译的软件包名,如果存在,说明存在依赖关系环路,这是一种错误,在屏幕上打印出.tasklist文件内容,同时异常退出;否则在该文件末尾添加一行,内容为<软件包名>和一个回车;
步骤(5d)、初始化必要的环境变量,调用"compile_<软件包名>"开始编译,判断返回值,如果编译失败则异常退出,否则编译成功,创建一个后缀名为.stamp的<软件包名.stamp>文件。
步骤(5e)、将"$ROOTDIR/.stamp/"目录下".tasklist"文件最后一行删除。
步骤(6)、跳转到步骤(3)中继续开始下一个关键软件包的编译。
本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。
Claims (1)
1.一种依据依赖关系动态编译软件包的方法,包括以下步骤:
步骤1、设定特定变量为当前项目所在的目录;
步骤2、清空为标识依赖关系所设定的特定变量目录下所有文件;
步骤3、调用一个或多个所需要的主要软件包;
步骤4、在每个脚本中,根据本软件包的特性,依据约定依次调用本软件包所依赖的各个子软件包,然后调用run_task,传入参数为本软件包的包名;
步骤5、执行run_task;
步骤6、跳转到步骤3中继续开始下一个关键软件包的编译直至编译完成,
所述的步骤5包括以下步骤:
步骤5a、首先判断"$特定变量/.stamp/"目录下是否存在<软件包名.stamp>文件,如果存在,进入步骤6;
步骤5b、判断"$特定变量/.stamp/"目录下是否存在".tasklist"文件,如果不存在则创建一个空文件;
步骤5c、判断"$特定变量/.stamp/.tasklist"文件中是否存在一行的内容为本次编译的软件包名,如果存在,说明存在依赖关系环路,在屏幕上打印出.tasklist文件内容,同时异常退出;否则在该文件末尾添加一行,内容为<软件包名>和一个回车;
步骤5d、初始化必要的环境变量,调用"compile_<软件包名>"开始编译,判断返回值,如果编译失败则异常退出,否则编译成功,创建一个后缀名为.stamp的<软件包名.stamp>文件;
步骤5e、将"$特定变量/.stamp/"目录下".tasklist"文件最后一行删除。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410750369.4A CN104391733B (zh) | 2014-12-10 | 2014-12-10 | 一种依据依赖关系动态编译软件包的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410750369.4A CN104391733B (zh) | 2014-12-10 | 2014-12-10 | 一种依据依赖关系动态编译软件包的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104391733A CN104391733A (zh) | 2015-03-04 |
CN104391733B true CN104391733B (zh) | 2017-11-24 |
Family
ID=52609641
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410750369.4A Expired - Fee Related CN104391733B (zh) | 2014-12-10 | 2014-12-10 | 一种依据依赖关系动态编译软件包的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104391733B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104866369B (zh) * | 2015-05-22 | 2018-05-08 | 广州华多网络科技有限公司 | 一种数据处理的方法以及装置 |
CN106325965B (zh) * | 2015-06-24 | 2019-09-10 | 龙芯中科技术有限公司 | 操作系统的编译方法和装置 |
CN107704246A (zh) * | 2017-10-12 | 2018-02-16 | 北京元心科技有限公司 | 终端、编译的方法及装置 |
CN112214221B (zh) * | 2020-10-10 | 2023-04-28 | 上海上讯信息技术股份有限公司 | 一种用于Linux系统构建的方法与设备 |
CN114217773B (zh) * | 2021-12-13 | 2022-12-16 | 中国船舶重工集团公司第七0九研究所 | 一种c/c++语言软件包二进制接口兼容性自动化判别方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101563673A (zh) * | 2006-12-14 | 2009-10-21 | 富士通株式会社 | 编译方法以及编译器 |
CN103942083A (zh) * | 2014-04-28 | 2014-07-23 | 中国人民解放军国防科学技术大学 | 一种面向可变参函数的编译实现方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9081583B2 (en) * | 2012-08-23 | 2015-07-14 | National Instruments Corporation | Compile time execution |
-
2014
- 2014-12-10 CN CN201410750369.4A patent/CN104391733B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101563673A (zh) * | 2006-12-14 | 2009-10-21 | 富士通株式会社 | 编译方法以及编译器 |
CN103942083A (zh) * | 2014-04-28 | 2014-07-23 | 中国人民解放军国防科学技术大学 | 一种面向可变参函数的编译实现方法 |
Non-Patent Citations (1)
Title |
---|
一个基于Bash的轻量级构建系统的设计与实现;白云 等;《计算机科学》;20131130;第40卷(第11A期);第8-12页 * |
Also Published As
Publication number | Publication date |
---|---|
CN104391733A (zh) | 2015-03-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104391733B (zh) | 一种依据依赖关系动态编译软件包的方法 | |
US9471340B2 (en) | Global entry point and local entry point for callee function | |
CN111090433B (zh) | 一种数据处理的方法、装置和存储介质 | |
US8266588B2 (en) | Creating projects in a rational application developer workspace | |
KR101881625B1 (ko) | 가상 머신 이주 도구 | |
US8914780B2 (en) | Incremental generation of managed assemblies | |
CN103440156B (zh) | 一种能用于多种系统下的Linux软件包制作方法 | |
US20130104115A1 (en) | Systems and methods for upgrading a version of software | |
TWI566180B (zh) | 一種動態創建可附加和可拆除二進位檔案的系統和方法 | |
CN107526625B (zh) | 一种基于字节码检查的Java智能合约安全检测方法 | |
US7171649B1 (en) | Optimizing safe downcasting in an object-oriented programming language | |
US9063819B2 (en) | Extensible patch management | |
US9459986B2 (en) | Automatic generation of analysis-equivalent application constructs | |
US10248409B1 (en) | Limiting the effects of source code patches on corresponding native-code patches | |
US20150074640A1 (en) | Runtime detection of software configurations and upgrades | |
US9311077B2 (en) | Identification of code changes using language syntax and changeset data | |
US11231948B2 (en) | Applying security mitigation measures for stack corruption exploitation in intermediate code files | |
CN112905447B (zh) | 一种区块链虚拟机的测试方法和系统 | |
CN108197020A (zh) | 插件校验方法、电子设备及计算机存储介质 | |
CN108304184B (zh) | 编译方法及装置 | |
CN103927213B (zh) | 一种文件编译方法及编译装置 | |
CN108376074B (zh) | 一种基于嵌入式系统的RancherOS ros核心模块移植方法 | |
US12045324B2 (en) | Source modification engine | |
CN111897687B (zh) | 接口校验方法、装置、设备及存储介质 | |
US12131150B2 (en) | System and methods for patch management |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20171124 Termination date: 20201210 |
|
CF01 | Termination of patent right due to non-payment of annual fee |