CN104391733B - 一种依据依赖关系动态编译软件包的方法 - Google Patents

一种依据依赖关系动态编译软件包的方法 Download PDF

Info

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
software kit
software
stamp
dependence
file
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
Application number
CN201410750369.4A
Other languages
English (en)
Other versions
CN104391733A (zh
Inventor
白云
喻莉
谢长生
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Huazhong University of Science and Technology
Original Assignee
Huazhong University of Science and Technology
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Huazhong University of Science and Technology filed Critical Huazhong University of Science and Technology
Priority to CN201410750369.4A priority Critical patent/CN104391733B/zh
Publication of CN104391733A publication Critical patent/CN104391733A/zh
Application granted granted Critical
Publication of CN104391733B publication Critical patent/CN104391733B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

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"文件最后一行删除。
CN201410750369.4A 2014-12-10 2014-12-10 一种依据依赖关系动态编译软件包的方法 Expired - Fee Related CN104391733B (zh)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9081583B2 (en) * 2012-08-23 2015-07-14 National Instruments Corporation Compile time execution

Patent Citations (2)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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) 一种依据依赖关系动态编译软件包的方法
CN106605212B (zh) 在动态链接的运行时环境中的模块化共同版本管理
US20080209316A1 (en) System and method of implementing an extensible command-line interface
US20080320453A1 (en) Type inference and late binding
US10248409B1 (en) Limiting the effects of source code patches on corresponding native-code patches
US20220067538A1 (en) Methods and systems for generating knowledge graphs from program source code
CA2292123A1 (en) Method and system for modifying executable code to add additional functionality
US20050065953A1 (en) System and method for changing defined elements in a previously compiled program using a description file
TW201545067A (zh) 一種動態創建可附加和可拆除二進位檔案的系統和方法
Salvador et al. Embedded Linux Development with Yocto Project
CN107832056B (zh) 基于jni的c++中java函数调用方法
CN108846264A (zh) 代码加固方法、装置、智能终端和计算机可读存储介质
CN109445832A (zh) 基于编程语言对应用程序进行热更新的方法以及电子设备
CN108241496A (zh) 应用程序的平滑升级方法及装置
US10452364B2 (en) Method and system for preparing code to be executed by programmable control devices
US10346144B2 (en) Methods and apparatus to map single static assignment instructions onto a data flow graph in a data flow architecture
AU2019203416A1 (en) Application deployment
CN103927213B (zh) 一种文件编译方法及编译装置
CN108376074B (zh) 一种基于嵌入式系统的RancherOS ros核心模块移植方法
CN110647349B (zh) 一种实现iOS APP持续交付的方法
CN110659022B (zh) 一种基于Java自动调用Python脚本的方法
CN111258595A (zh) 一种基于PyInstaller的python源代码封装方法
CN105335185B (zh) 红帽源码包管理srpm包的处理方法及装置
CN110990018B (zh) 一种嵌入式系统的编译方法及编译系统
WO2009112949A2 (en) Build process

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
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20171124

Termination date: 20201210