ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

archlinux的安装是如何从源码到二进制

2021-02-05 11:32:03  阅读:320  来源: 互联网

标签:tar PKGBUILD 二进制 typora gz archlinux pkg 源码 dwm


  其实不管是什么linux的发行版本,都需要一个软件包管理器,负责将用户需要的软件从源代码转换成二进制程序。无论是早期的rpm、yum、apt、emerge还是pacman都是这个原理,但是具体细节呢。manjaro是基于arch的,也是使用了makepkg 工具,它会按照 PKGBUILD 文件生成一个二进制包。有些时候,makepkg 还需要 install 文件(主要用来显示提示信息、备份用户设置等)和其他的配置文件。PKGBUILD 中包含了安装使用一个软件需要的所有信息。下面是 dwm(一个非常非常简捷、高效的窗口管理器)的 PKGBUILD 文件:

1、PKGBUILD 文件,以typora为例子

 1 # Maintainer: Jonathan Duck <duckbrain30@gmail.com>
 2
 3 # Expiremental System electron package, set ELECTRON env to electron
 4 pkgname=typora
 5 pkgver=0.9.98
 6 pkgrel=1
 7 pkgdesc="Typora will give you a seamless experience as both a reader and a writ   er."
 8 arch=('x86_64')
 9 filename="${pkgname}_${pkgver}_amd64.deb"
10 license=('custom:"Copyright (c) 2015 Abner Lee All Rights Reserved."')
11 url="https://typora.io/"
12 depends=('libxss')
13 optdepends=(
14     'noto-fonts-emoji: Or some other emoji font to see emojis'
15     'pandoc: Import/export for extra file formats')
16 source=("https://typora.io/linux/$filename")
17 sha512sums=('a004ef3b336df25f4181927b864aa2fbee6f857b9afbe675e75b271dd9a8173e80   c7dca56e8074103908d78084370a0be082da2c96aea612bcb10751b5227cba')
18
19 if [[ ! -z $ELECTRON ]]; then
20     depends+=($ELECTRON)
21     source+=(typora.js)
22     sha512sums+=('8ce47de8b0d0ab4b0323ee4c19a4daaf313513700d8c191faab299bfa21aa   ba9b55cbcf945914103e5f53607228fec3411a83aea8007b192616ad845a3af5c98')
23 fi
24
25 package() {
26     bsdtar -xf data.tar.xz -C "$pkgdir/"
27     rm -rf "$pkgdir/usr/share/lintian/"
28     chmod 4755 "$pkgdir/usr/share/typora/chrome-sandbox"
29     sed -i '/Change Log/d' "$pkgdir/usr/share/applications/typora.desktop"
30     find "$pkgdir" -type d -exec chmod 755 {} \;
31     if [[ ! -z $ELECTRON ]]; then
32         appdir="${pkgdir}/usr/share/typora"
33         mv "${appdir}" tmp/
34         mv tmp/resources/app "${appdir}"
35         rm -rf tmp/
36         install -Dm755 "typora.js" "${pkgdir}/usr/bin/typora"
37     fi
38 }

 文件比较简单,包含了软件包的包名、版本号、包描述、包文件名、包的许可证、包的url地址、包依赖等等

2、编译部分通过Makefile文件,以typora为例子:

 1
 2 # This will update the checksums and build the package
 3 all:
 4     updpkgsums
 5     makepkg --printsrcinfo > .SRCINFO
 6     makepkg -sr
 7
 8 # This will do the same as all, but will install it to the local system as well
 9 install:
10     updpkgsums
11     makepkg --printsrcinfo > .SRCINFO
12     makepkg -sri
13
14 system:
15     ELECTRON=electron makepkg -sr
16
17 # This will update PKGBUILD with the latest version and build the package
18 update:
19     sed 's/^pkgver=.*$$/pkgver=$(shell $(MAKE) versions | tail -n 1)/' -i PKGBU   ILD
20     sed 's/^pkgrel=.*$$/pkgrel=1/' -i PKGBUILD
21     $(MAKE)
22
23 # This will list the versions available in the Ubuntu repository
24 versions:
25     curl -s https://www.typora.io/linux/Packages | perl -n -e '/^Version: (.*)-   [0-9]+$$/ && print "$$1\n"' | sort -V | uniq
26
27 # This will remove the files downloaded and created in the build process
28 clean:
29     rm -rf pkg src typora_*.deb typora-*.pkg.tar
30
31 publish:
32     git add .
33     git commit -m "Update to version $(shell $(MAKE) versions | tail -n 1)"
34     git push
35     git push aur master

  编译的过程”这个部分,很多代码都和我们在 shell 里编译的命令一样。Archlinux 不要求用户学习太多新的东西,PKGBUILD 很容易理解,因为里面都是基本的 shell 命令。把PKGBUILD,dwm.install 和 config.h(dwm 比较特殊,config.h 包含所有的配置信息,所以要在编译之前提供。其他的软件大多依靠外部的配置文件,像是 .bashrc 等)放在一个新的目录里之后。我们执行:

  makepkg命令 目录里出现了一些新的东西,包括:dwm-4.7-1-x86_64.pkg.tar.gz dwm-4.7.tar.gz 两个文件,还有两个目录srcpkg
  

通过比较这些文件、目录里的内容和 PKGBUILD,你就会明白 makepkg 到底做了些什么:

  1. 根据 source 里的内容下载了源代码文件 dwm-4.7.tar.gz;
  2. 通过 md5 验证码确定下载的源代码文件和 PKGBUILD 的作者使用的是一致的;
  3. 把源代码文件解压缩到 ./src/package/pkgver;
  4. 按照 build() 里的内容编译源代码,并把编译好的内容放在 ./pkg 里;
  5. 在 ./pkg 里加上其他的一些信息,包括 .PKGINFO 和 .INSTALL,也就是 dwm.install 的拷贝;
  6. 把 ./pkg 里面的内容打包形成 dwm-4.7-1-x86_64.pkg.tar.gz。

那么,我们有了一个 .pkg.tar.gz 这样一个二进制包之后,我们要如何安装呢?我们要使用这样一个命令:  

pacman -U dwm-4.7-1-x86_64.pkg.tar.gz

这个命令又完成了那些事情呢?

  1. 首先,二进制包被解压缩;
  2. 按照 .INSTALL 的内容执行一定的命令;
  3. 二进制包里面的内容会被拷贝到相应的目录(你注意到二进制包内的目录结构了吗?);
  4. 在 /var/lib/pacman/local 这个目录中建立 dwm-4.7-1 这样一个目录;
  5. 这个目录里包含了四个文件 depends、desc、files 和 install;
  6. depends 记录了 dependency,desc 是软件说明,files 记录了每一个安装到系统上的文件的路径,install 就是 .INSTALL 的拷贝。

从这以后,pacman 正是通过检查 /var/lib/pacman/local 里的内容来管理软件包的。比如说,在执行 pacman -R dwm 的过程中,pacman 首先在 /var/lib/pacman/local 找到了 dwm-4.7-1 这个目录,然后根据 files 的内容删除已安装的内容。Dependency 也是通过 depends 计算的。

OK!我已经解释了 PKGBUILD 的基本结构和 makepkg 的过程。

基本上是两步:从 PKGBUILD 到 .pkg.tar.gz 包,再从二进制包安装到系统。这样一种办法有很多好处。首先,PKGBUILD 非常方便用户交流。我的一个 PKGBUILD 如果编译成功了,就可以给别人用。PKGBUILD 的内容一目了然,不但有助于学习,也再不用担心木马的问题了。

另外,我通过一个小例子展现 Archlinux 的灵活性在哪里。比如,我要对 dwm 有自己的设置,也就是自己的 config.h,那我应该怎么做呢?我会做如下的事情:

  1. 编辑 config.h,另存为 myconfig.h;
  2. 编辑 PKGBUILD,把所有的 config.h 替换为 myconfig.h;
  3. 把 pkgrel 变成 2。

之后通过 makepkg,我会得到一个文件 dwm-4.7-2-x8664.pkg.tar.gz,这个和原来的 dwm-4.7-1-x8664.pkg.tar.gz 可以区别开。我可以安装 dwm-4.7-2-x8664.pkg.tar.gz,如果有问题我还可以通过 pacman -U dwm-4.7-1-x8664.pkg.tar.gz 来安装原来的二进制包。我还可以用同样的办法生成一系列的 .pkg.tar.gz 包,这在软件的安装调试过程中非常有用。你理解了 makepkg 和 PKBGUILD,安装软件会更加灵活。



 参考:https://www.jianshu.com/p/1b48ef4bc2ba

标签:tar,PKGBUILD,二进制,typora,gz,archlinux,pkg,源码,dwm
来源: https://www.cnblogs.com/guochaoxxl/p/14376774.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有