Linux软件编译-打包-依赖处理
Tofloor
poster avatar
ylxdxx
deepin
2020-08-10 03:36
Author
这是一份初级的教程,或者说是一个说明,本人小白一枚,若有错误,请君指出,欢迎交流,共同学习。



以inkscape为例,下面是编译、打包、依赖处理的一条龙服务





## 编译安装



在编译前,需要解决编译前的依赖问题,利用官方的脚本可以很好的解决

```
wget -v https://gitlab.com/inkscape/inks ... all_dependencies.sh -O install_dependencies.sh
```

打开上面的文件,手动修改或者添加uos系统的名字,再运行脚本

```
bash install_dependencies.sh --recommended
```

配置好编译环境后,下载官方源码

```
wget https://media.inkscape.org/dl/:/file/inkscape-1.0.tar.xz
tar xvJf inkscape-1.0.tar.xz
mkdir build
cd build
cmake ..
make -j12
```

编译完成后,直接使用`sudo make install`既可以安装使用。

一般情况下软件的官方都会提供编译的教程,大家在自行编译软件之前看看官方的文档会省很多事情。



## 打包

打包成deb包,既可以分享给广大网友,也可以作为备份,下次安装也就方便多了,下面提供两种打包的方法

### 使用 checkinstall



我们首先需要安装 `checkinstall`工具,一般使用如下命令安装即可

```
sudo apt install checkinstall
```

但是`uos`的源里没有这个包,需要到第三方下载再安装

```
wget http://ftp.br.debian.org/debian/ ... l_1.6.2-4_amd64.deb
```



安装好后进入头开始编译的文件夹,不再使用`sudo make install`安装,转而使用如下命令


```
sudo checkinstall
```

此时会询问你一些问题,根据自己的情况填写即可。在安装软件的同时还会生成一个`deb`的包,此处自动生成的安装包有一个坏处,里面的依赖项可能没有,或者可能不完整,别人安装了这个软件后,还需要手动补齐软件才能正常运行。

填写依赖项,可以利用下面的命令查看其用了那些库,再根据显示的结果手动补全依赖。

```
ldd ./build/bin/inkscape
```





下面提供一种自动的方法来补全打包过程中的依赖项,利用`dpkg-shlibdeps`。为了能让`dpkg-shlibdeps`工作,在解包之前还得创建一个打包的样式,如下

```
mkdir debian
mkdir debian/tmp
touch ./debian/control
```

例如生成的包名为`build.deb`,将其进行解包到`debian/tmp`文件夹下

```
dpkg-deb -R build.deb ./debian/tmp
```

此时`dpkg-shlibdeps`便可以正常使用了,使用如下命令生成相应的依赖项

```
dpkg-shlibdeps -O ./debian/tmp/usr/local/bin/inkscape ./debian/tmp/usr/local/bin/inkview > shlibs.txt
```

将`shlibs.txt`里面的依赖内容填入原来的`control`中`Depends`项即可,文件位于`./debian/tmp/DEBIAN/control`,做完这些,再还原成deb包

```
fakeroot chown -R root:root debian/tmp/usr
fakeroot dpkg-deb -b debian/tmp .
```



### 使用debian官方套件

详情参见:https://www.debian.org/doc/manuals/debmake-doc/index.zh-cn.html

此种打包优点为基本全程自动化,依赖自动补全,模板自动生成,自己只需要改一些描述性文件即可。

开始前需要安装相应的工具

```
sudo apt install debmake
```

下载到源码包后,使用`debmake`命令进行初步构建

```
debmake -a inkscape-1.0.tar.xz
```

这里报了一个名字错误

```
NameError: name 'CalledProcessError' is not defined
```

是由于解压出来文件夹的名字造成的

```
inkscape-1.0_2020-05-01_4035a4fb49 #解压的名字
inkscape-1.0 #改成标准名字名称加版本号
tar zcvf  inkscape-1.0.tar.gz inkscape-1.0/ #重新打包成tar.gz的文件夹
```

此时可以重新执行上面一开始的命令。也可以直接进入解压文件夹执行`debmake`

```
cd inkscape-1.0/
debmake       
```

这里有时会有一个询问,例如

```
W: many ext = "python" type extension programs without matching -b set.
?: -b":python, ..." or -b":python3" missing. Continue? [Y/n]:
```

可以选择Y忽略后继续执行,没啥大影响,也可选择n后,重新运行如下命令

```
debmake -b ":python3" #这里会将python3相关的东西一起编译打包
```

这里如果选择python3的选项后,需要安装相应的依赖`sudo apt install python3-all`,否则会报依赖错误

```
dpkg-checkbuilddeps: error: Unmet build dependencies: python3-all
```

`debmake`会自动生成各种文件,我们需要修改的是`debin/control`文件。



说一下其中的`Section`字段,官方描述为:

```
This field specifies an application area into which the package has been classified.
```

可选值有:

```
还有需要注意,其中的`Depends`项需要有`${shlibsepends}`,亦即

```
Depends: ${miscepends}, ${shlibsepends}
```



自己选择合适的就ok.配置好后,开始编译:

```
debuild -j12
```

我这里主体编译完成,在编译测试文件的时候报错

```
Errors while running CTest
```

我的处理很暴力,直接在编译测试的控制文件里面下手,在编译的过程中,会生成如下文件

```
inkscape-1.0/obj-x86_64-linux-gnu/testfiles/CTestTestfile.cmake
```

开始编译后删除`CTestTestfile.cmake`文件里面的东西,只留下最后一行

```
subdirs("rendering_tests")
```

即可通过完整编译,也会自动再上一级目录生成相应的deb包。

如果编译完成后,想修改里面的描述文件,不需要重新编译,加入-nc选项重新打包即可

```
debuild -nc
```



## 注:

### 打包中的各个标识文件

```
control : 用了记录软件标识,版本号,平台,依赖信息等数据
conffiles : 当软件包升级的时候,你将会被询问是否要保留你的旧配置文件。
md5sums : md5校验
preinst : Debian软件包(".deb")解压前执行的脚本, 为正在被升级的包停止相关服务,直到升级或安装完成.(成功后
执行 'postinst' 脚本).
postinst : 在解包后运行的脚本,主要完成软件包(".deb")安装完成后所需的配置工作. 通常, postinst 脚本要求用
户输入, 和/或警告用户如果接受默认值, 应该记得按要求返回重新配置这个软件. 一个软件包安装或升级完成后。
config : 启动配置
templates : 定制模板
prerm : 卸载时,在删除文件之前运行的脚本(停止一个软件包的相关进程, 要卸载软件包的相关文件前执行。)
postrm : 在删除文件之后运行的脚本(修改相关文件或连接, 和/或卸载软件包所创建的文件)

其中 preinst, postinst, prerm, 和 postrm 脚本,是软件包安装前后自动运行的可执行脚本. 统称为控制文件,
是 Deian 软件包的"控制"部分
```



### 检查deb包

主要是检查其打包是否合乎规范,可以使用Lintian检查安装包,我这里Lintian出问题了,没法测试

### LaTex插件

此处LaTex插件需要安装`textext-1.1.0`的版本

Reply Favorite View the author
All Replies
avatar
ylxdxx
deepin
2020-08-10 03:38
#1
这不支持markdown编辑,b站也不支持,还好b站有插件能够支持,各位将就看一下
Reply View the author
avatar
GBwater
deepin
2020-08-10 03:52
#2
收藏一下( ´◡‿ゝ◡`)
Reply View the author
avatar
忘记、过去
deepin
2020-08-10 04:05
#3
顶一下,收藏了,下次可以自己编译更新了......
Reply View the author