最近在iMX6x开发板下制作Linux根文件系统,前期需要自己整理与平台无关的Core软件包的依赖关系、修改软件包对应的Spec文件、将下载的.tar.gz等源代码包打包成rpm包,然后使用rpmbuild编译打包成rpm包,最后rpm安装。很头痛的一个问题就是整理软件包的依赖关系、确定它们的编译顺序。
可以从http://www.linuxfromscratch.org/blfs/view/svn/index.html网站查询下载的软件包的依赖关系,
GLib-2.34.3依赖于:libffi-3.0.13 pkg-config-0.28 Python-2.7.4 PCRE-8.32 attr-2.4.46 D-Bus-1.6.10 GTK-Doc-1.18
libffi-3.0.13依赖于:DejaGnu-1.5.1
gst-libav-1.0.7依赖于:gst-plugins-base-1.0.7 yasm-1.2.0
GCC-4.7.2依赖于:DejaGnu-1.5.1 Zip-3.0 UnZip-6.0 which-2.20
usbutils-006依赖于:libusb-1.0.9 pkg-config-0.28
GStreamer-0.10.36依赖于:GLib-2.34.3 libxml2-2.9.1 gobject-introspection-1.34.2 GTK-Doc-1.18 Python-2.7.4
Python-2.7.4依赖于: expat-2.1.0 libffi-3.0.13 pkg-config-0.28 BlueZ-4.101
SQLite-3.7.16.2依赖于:UnZip-6.0
Samba-3.6.12依赖于:libtirpc-0.2.3
FFmpeg-1.2依赖于:FAAC-1.28, FreeType-2.4.11,LAME-3.99.5,OpenJPEG-1.5.1,PulseAudio-3.0, Speex-1.2rc1,libtheora-1.1.1, libvorbis-1.3.3,libvpx-1.1.0,XviD-1.3.2, OpenSSL-1.0.1e,SDL-1.2.15,Xorg Libraries, yasm-1.2.0
MPlayer-1.1依赖于:yasm-1.2.0 GTK+-2.24.17
.............................................................................................................................
反正有一大堆的软件依赖,我从Linxux From Scratch网站下载了源代码,并根据这个网站所给出的软件依赖关系整理出了一些与平台无关的软件依赖关系表,但是在编译的顺序上不知道该如何处理,毕竟在一个软件比较少的Linux平台下安装软件会提示各种软件依赖的问题。
在打包编译的时候需要知道软件包的编译顺序,本来可以通过编程建立不同软件包的依赖关系树的,应该是从叶子节点依次往上层节点编译,直至根节点吧。但是用C语言或者C++编写起来需要不少时间,毕竟需要构建树这种数据结构,最后师傅告诉我一个简单的方法:使用Make的自动功能实现软件包编译顺序的确定,编写一个Makefile就能轻松实现。
为了简便起见,举个例子吧。
有软件包a~n, 依赖关系描述如下:
软件包a依赖于b c d e,b依赖于f g,c依赖于h,d依赖于i j,e依赖于k,f依赖于l,g依赖于m n
对应的依赖关系图如下:
要得到他们编译的顺序,那么对应的Makefile可以这样写:
all: a b c d e f g h i j k l m n @echo $@ a: b c d e @echo $@ b: f g @echo $@ c: h @echo $@ d: i j @echo $@ e: k @echo $@ f: l @echo $@ g: m n @echo $@ h: @echo $@ i: @echo $@ j: @echo $@ k: @echo $@ l: @echo $@ m: @echo $@ n: @echo $@
在Linux终端中执行make命令输出对应的编译顺序,如下:
l
f
m
n
g
b
h
c
i
j
d
k
e
a
all
当然以上输出的软件编译顺序也不是绝对的,只不过是其中的一个方案而已,如果编译依赖没问题的话,就可以按照这个顺序编译软件包,进行系统集成了,使用make工具来解析依赖关系确实蛮方便的!