Arch Linux怎样构建一个简单的软件包

作者&投稿:歧爬 (若有异议请与网页底部的电邮联系)
如何制作arch的软件包~

现在,你已设好了软件的一些信息——哪儿能下到源文件,包的名称是什么等等。下一步就是如何写出指令去编译、安装你想要打包的程序。一般来讲,在你开始自动打包处理之前,你至少要手动做一次,除非,你很清楚在此之前你所做的一切。但不管怎样你都应该首先说读读这个。很不幸的是,尽管很多程序都可以以“三步曲”——"./configure; make; make install"来安装,但这不是万能的。如果你必须要打补丁才能使之正常工作的话,你的包将变得很丑陋。单凭经验的方法:如果你不能从源码编译程序并将其安装到一个指定的临时子目录下的话,就别去尝试打包了。makepkg中没有能帮你解决源码问题的魔法小精灵。 也就是说,你应该下载源码包,解压,记下所有有关编译、安装的命令。PKGBUILD文件中的build函数将精确地重复这一步骤,并在编译完成后将一切捆在一起。 现在你可能需要编辑build函数。其实,它用的只是普通的shell命令——遵循bash语法。该函数的基本目的就是自动编译好程序,并且将其安装到新建的软件包目录,使makepkg可以轻松地打包,而不是要将所需的文件从你的系统中一个一个地找出来。 一般来说,build函数的第一步就是进入源文件解压后生成的目录。你可以使用$startdir——它代表PKGBUILD所在的目录。你也可以使用之前设置的$pkgname和$pkgver变量。例如,根据makepkg解压生成的目录,build函数的第一个命令可能就是cd $startdir/src/$pkgname-$pkgver,通常都会是这样,除非程序的作者是一个非常非常古怪的人。 编译程序就比较难一点了。我想,你应该设法手工编译。因为你不大可能将所有可能需要的步骤都包括进来。这就是希望程序的作者写README和INSTALL文件的原因。 现在,你就在这个目录中,你需要给出命令以编译程序。简单时,你只要使用./configure; make,尽管有很多变化——包括ant build或具体的编译软件的gcc命令。简单地说,软件可能不是以源码形式发布,而你必须用sh installer.run的形式运行。你可能需要多研究一下(读README,INSTALL,手册页,可能还要看一看如gentoo的ebuilds,甚至是MAKEFILE或源代码),使其可以正常使用。在某些极端情况下,你可能要修改源代码才能使之正常工作。不管怎样,makepkg需要完全独立地工作——不需要用户的输入。因此,如果你需要编辑Makefile,你应该自己做一个patch,并写在build函数中。或者你必须在build函数中加上sed命令。 好的一面就是,如果你已手动编译了整个软件,你只需将你所用的命令列下来就OK了。由于很多软件倾向于安装在/usr/local中,但Archlinux习惯上将软件安装在/usr中,你应该传递相应参数至configure或make命令,仔细一点。PKGBUILD的模板提供了这样的一个例子。 这可能与你的实际情况有点差异,但不管怎样,你还有一些工作要做。 build函数的下一步工作就是将已编译好的文件放在一个目录中,以方便makepkg将他们打包。这个目录就是pkg目录,它将被软件的安装进程当成你的系统的根目录。所有将被安装进你的系统的根目录的文件,实际上都会安装在pkg目录中的相同的目录结构中(也就是说,你如果要将myprog这个文件安装到/usr/bin中,它实际上是被安装到$startdir/pkg/usr/bin)。幸运的是,只有一小部分软件需要用户手工拷贝大量文件,但他们也提供某些安装程序来自动完成这一工作——通常都是通过调用"make install"来实现。这很危险,但不管怎样,你会发现如何告知安装进程不要将文件安装到系统的根目录,而是安装到$startdir/pkg。否则,你将发现,最终你得到的只是一空的软件包,而你所要打包的文件已“正确地”安装到了你的系统中。很多时候,你都必须像模板文件中那样在调用"make install"时,加上prefix参数。但这也很可能使程序以完全不同的途径来打包,下面还有一些提示: a.有时,configure脚本接受prefix参数——用来告知将文件安装在何处。例如,你会看到这样的配置:./configure --prefix=$startdir/pkg/usr。 b.有时,可以传递PREFIX选项给make install命令。这种情况下,有时是设置变量,有时是嵌入命令中。更糟的是,你可能必须编辑Makefile(如果软件使用ant的话,就要编辑ant build/properties)。可以使用sed或自己制作补丁。 c.可能也有允许指定安装目录的安装脚本存在。 d.还有一些软件是可以在单独一个目录中运行的。这时只需将其简单地拷入$startdir/pkg/opt即可。 就像你可能猜想的那样,你所知道的与你的经验是必不可少的。特别是在你浏览ABS树内的PKGBUILD文件时,这些知识与经验会很用的,因为有些文件是测试用的,其中可能包括一些有用的小窍门或是恶作剧。 安装程序时常会很小心地在pkg目录下建立子目录,如果它没有建立相应的子目录,你就会在安装过程中收到许多诸如文件拷贝到不存在的子目录中的错误信息。如果那样的话,在运行安装程序之前,你应该在build函数中加入相应的mkdir命令。实际的目录结构是和软件包相关的,有些程序需要将文件拷入/etc或/usr,有些可能需要使用/bin或/opt。大多数的软件需要建立数个目录,你可以使用mkdir -p $startdir/pkg/OTHER/DIRS/AS/NEEDED,“OTHER/DIRS/AS/NEEDED”代表系统根目录下的目录结构。 当你开始写PKGBUILD文件中的build函数时,你需要不停地测试以排除bug。你可以在PKGBUILD所在的目录中运行makepkg来测试。通过一个适当格式的PKGBUILD,很容易就可以创建一个软件包。但如果使用坏掉的或未完成的,这将导致错误。希望这仅仅是个描述性的错误! 如果makepkg成功运行完成,它将在你的工作目录中产生一个新得有点闪闪发亮的名为$pkgname-$pkgver.pkg.tar.gz文件。这是一个pacman可安装的软件包,可以通过pacman -U 或pacman -A 来安装或更新,也可以加入到本地或远程的软件包库中。注意,这只意味着软件包已建立,并不意味着它一定可用!如果你不恰当地使用了prefix参数,包中可能只包含目录结构而没有一个文件!你可以使用pacman的查询功能,显示出其中包含的文件清单及其依赖关系,并可与你认为正确的相比较。"pacman -Qlp "和"pacman -Qip "可以完成这个工作。 如果包看起来很正常,那就是你所要做的。不管怎样,如果你决定发布软件包或PKGBUILD,你应该强制你自己检查、再检查、再再检查其内容及依赖关系。检查时,应列出所有你的软件包所依赖的包的列表。但depends中只需列出第一层依赖关系即可。这就是说你不必在软件包把所有依赖的包都列进去。如果你的软件所依赖的包中已列出了它所依赖的包——尽管这个包你也需要,但你不必在你的软件包中列出来。 例如,gtk2依赖于glib2。列出所有需要的开源C程序,你会发现,gtk2出需要glibc。但glibc不必出现在gtk2的依赖包的名单中,因为glibc是glib2的依赖包,而glib2已经列在gtk2的依赖包的名单中了。 有很多工具可用来检查依赖关系,其中就包括Jason Chu的大名鼎鼎的namcap(在线安装:pacman -Sy namcap),还有神秘的ldd。读一读这些程序的手册页及本文结尾处的链接。你应该通读程序的文档及其WEB页(仔细的开发者会提供“dependencies”说明,这会很有帮助的)。 同时也要保证软件包可以完美地运行!

第一步,先写C程序。目录结构如下。
├── SayHello-0.1
│ ├── include
│ │ └── hello.h
│ ├── Makefile
│ ├── SayHello
│ └── src
│ └── hello.c
├── SayHello-0.1.md5
└── SayHello-0.1.tar.gz
SayHello-0.1是项目文件夹,SayHello-.0.1.tar.gz是项目文件夹打包得到的压缩文件。SayHello-0.1.md5是用md5sum SayHello-0.1.tar.gz > SayHello-0.1.md5得到的校验文件(不是非要这个文件,但在制作ArchLinux文件包时,它一直提醒没有校验,没办法了,只好做了一个)。
代码如下:
################################
hello.h
#include
#include

#define ERR_EXIT(m)\
do\
{\
perror(m);\
exit(-1);\
}while(0)
#####################################
hello.c
#include "hello.h"
int main(int argc ,char* argv[])
{
printf("Hello
");
printf("This is a test program
");

return 0;
}
#####################################
Makefile

CC = gcc
CFLAGS = -Wall -g
obj = hello.o

VPATH = include:src
#vpath %.c src
#vpath %.h include

SayHello:hello.o
$(CC) $(CFLAGS) -o $@ $<
hello.o:hello.c hello.h
$(CC) -c -Iinclude -o $@ $<

##SayHello:hello.c
##$(CC) $(FLAGS) -Iinclude $< -o $@

.PHONY:clean install uninstall
clean:
-rm hello.o SayHello
install:
cp SayHello ~/bin/
##sudo cp SayHello /usr/local/bin/
uninstall:
-rm ~/bin/SayHello
#######################################3

好了,程序部分已经完成了。然后再打包,建立校验文件。
tar zcvf SayHello-0.1.tar.gz SayHello-0.1
md5sum SayHello-0.1.tar.gz > SayHello-0.1.md5

把它们上传到虚拟机的服务器上去。
scp SayHello-0.1.* XXX@xxx.xxx.xxx.xxx:/var/myftp/pub/
(这一步可以省略,只要把下面的PBKBUILD文件修改一下就可以了。)




第二步,把程序打包成ArchLinux的安装包。
abs的安装配置省略,wiki上已经说得非常清楚了。
在家目录上建立打包目录。
mkdir -pv ~/abs/SayHello
cd ~/abs/SayHello
vi PKGBUILD
这里只有一个文件。代码如下。
#########
PKGBUILD

pkgname=SayHello
pkgver=0.1

pkgrel=20130324
pkgdesc="A Say Hello test program."
arch=('i686' 'x86_64')
url="ftp://xxx.xxx.xxx.xxx"
license=('GPL2')
#depends=()

source=("ftp://xxx.xxx.xxx.xxx/mypub/$pkgname-$pkgver.tar.gz")
md5sums=('这里就是md5文件中的内容,被我隐藏了')

##install=SayHello.install


build()
{
cd $startdir/src/$pkgname-$pkgver

make clean
make
make install
}

好了,现在打包。很简单,直接执行makepkg.现在得到文件
SayHello-0.1-20130324-x86_64.pkg.tar.xz,这个就是需要的archlinux安装包。


现在差不多是最后一步了,先建立仓库位置。
mkdir -pv ~/LocalRepo/Arch
cp SayHello-0.1-20130324-x86_64.pkg.tar.xz ~/LocalRepo/Arch/
cd ~/LocalRepo/Arch/
给仓库添加数据库。
repo-add ~/LocalRepo/Arch/LocalRepo.db.tar.gz SayHello-0.1-20130324-x86_64.pkg.tar.xz
最终的文件如下。
├── LocalRepo.db -> LocalRepo.db.tar.gz
├── LocalRepo.db.tar.gz
└── SayHello-0.1-20130324-x86_64.pkg.tar.xz
最后一步,在pacman.conf中加入本地库。
[LocalRepo]
Server = file:///××××××/LocalRepo/Arch/



好了,所有的流程都完毕了。可以开始测试了。
pacman -Sy
LocalRepo 428.0 B 569K/s 00:00 [######################] 100%
本地库已经载入
pacman -Sv SayHello
没有问题。
pacman -Rs SayHello
也没问题。


差不多就是这样了,当然,这只是最简单的应用。升级包什么的都没有做。纯粹是为了跑一遍流程。

这两天给 Kreogist µ 打 Arch Linux 包,照着 wiki 跟着搞,同时在肥猫和 Wicast C 及暴君还有 jimmy66 等强力大腿及小伙伴的支持下,几番折腾终于打好了,也算是入了个门。

搞完过来发现也算简单,总体来说其实就是一个 PKGBUILD 文件的编写。就着给 µ 打的这个包写个简单指南。在写的时候实在太不知道怎么写的地方还可以直接参考一下其他软件包的 PKGBUILD 是怎么写的我才不会说呢。

编写 PKGBUILD

在最开头,复制一份原型: /usr/share/pacman/PKGBUILD.proto(同目录下也有其他特别类型的原型),之后就从这个文件开始编写啦。

先读完文件开头那段注释,然后删掉它~

Maintainer

最开头一行注释是维护者的信息,按照它提供的格式填写上有效的信息即可。

pkgname

软件包的名字。只能用 小写字母、数字和@ . _ + - 这些字符,且不允许用.或者-作开头。

另外不要和 AUR 甚至是官方仓库里面的软件包重名了(´・ω・`)

pkgver

软件包的版本,就是你打包的那个软件的版本。可以使用数字和小数点,以及其它字符。进一步的规则可参考:VCS package guidelines - ArchWiki

pkgrel

软件包发行号,一般设为 1,如果你因为某些原因给同版本号的软件进行反复打包,那么每次打包的时候 pkgrel 就应该在原基础上递增一个数字,而在打包新的版本的时候,应该重新设为 1。

epoch

强行干涉包的新旧关系,拥有更大的 epoch 值的包会被认做更新的包(此时无视版本号),可以用在如版本号风格改变等需要的时候。默认值为 0,取值为正整数。一般不会用到。

pkgdesc

软件包的描述信息,最好一句话,且不包含软件的名字。

arch

表示支持的 Arch Linux 的架构,比如 i686、x86_64,如果包与平台无关的话就填 any。

url

与软件包相关的链接,一般是项目首页什么的。

license

软件发布协议,如果是常见的 GPL 的话可以对照下面填写:

  • (L)GPL - (L)GPLv2 及更新版本。

  • (L)GPL2 - 仅 (L)GPL2

  • (L)GPL3 - (L)GPL3 及更新版本

  • depends

    这是非常重要的一项,需要正确填写上软件的依赖。

    对于直接发布可执行程序的话,可以通过 ldd 来看程序连接了哪些库文件,结合搜索判断出具体依赖是什么软件包。你可以用谷歌在  上搜索具体库的文件名,一般都能够找到对应的软件包。

    如果你已经用 makepkg 打出了 .tar.xz 的包,也可以用 Namcap 来检查依赖是否存在问题,它会提供一些有用的信息帮助修正依赖。对于他的输出含义可以直接参考 ArchWiki。

    多测试多测试,确保依赖真的没问题。

    source

    构建软件包需要的文件。可以是一个本地文件,也可以是一个远程文件。 makepkg 会在构建包的时候自动下载填写的远程文件,并且会自动解包压缩文件。

    md5sums

    对应的 source 里面文件的 md5 校验码。

    package()

    在构架包的时候执行的函数。你需要把安装软件对应的操作写在这里。函数会在一个 fakeroot 环境下执行,对应的 root 目录就是 $pkgdir,比如你有一个可执行文件名为 $pkgname 要安装到 /usr/bin 下面,对应的命令就可以类似这么写:

  • install -m=775 $pkgname "${pkgdir}/usr/bin"

  • -m 选项表示目标文件的权限,和 chmod 参数同理。

    常用目录

    目录

    用途

    /etc    系统关键配置文件,如果件有多个,应该创建合适的子目录来存放    

    /usr/bin    二进制文件    

    /usr/lib    库    

    /usr/include    头文件    

    /usr/lib/{pkg}    模块,插件等    

    /usr/share/doc/{pkg}    应用程序文档    

    /usr/share/info    GNU Info 系统文件    

    /usr/share/man    手册    

    /usr/share/{pkg}    程序数据    

    /var/lib/{pkg}    应用持久数据    

    /etc/{pkg}    {pkg}的配置文件    

    /opt/{pkg}    大的独立程序,例如 Java    

    /usr/share/applications/    Desktop Entry (.desktop) 文件    

    /usr/share/icons/    图标,存在该目录下对应子目录位置    

    不该碰的目录:

  • /dev

  • /home

  • /srv

  • /media

  • /mnt

  • /proc

  • /root

  • /selinux

  • /sys

  • /tmp

  • /var/tmp

  • 构建/调试包

    在 PKGBUILD 所在目录下执行 makepkg 可以构建出对应的软件包,推荐用 namcap 检测一下构建出来的包有没有更显著的问题。

    然后你可以用 pacman -U 命令安装它,看看会不会发生什么奇怪的事情,以及软件是否正常等。

    当然还有可能因为 PKGBUILD 没写好,直接就报错不干了,这个时候需要顺着错误信息去修正 PKGBUILD。

    发布到 AUR

    在 PKGBUILD 所在目录执行 makepkg --source,会生成 .src.tar.gz 源码包,这就是需要上传到 AUR 的东西,注意不要把任何二进制文件加入源码包。

    在 AUR (Arch User Repository) 注册(登入)帐号。进入 Submit 页面,选择好软件包对应的分类,然后添加源码包上传即可。

    即使你是要更新一个包,也只需要直接在 Submit 页面上传,包的信息 AUR 会自己处理。

    如果觉得每次上传太麻烦,你可以尝试一下 aurupload 来简化发布。




陵县15151695265: Arch Linux是什么 -
豆茗感冒: Arc Linux(或称Arc)是一种以轻量简洁为设计理念的Linux发行版.其开发团队秉承简洁、优雅、正确和代码最小化的设计宗旨.Arc Linux项目受CRUX启发,由Judd Vinet于2002年启动.基本简介 ArchLinux是个针对i686优化的linux发行版....

陵县15151695265: 怎么样在u盘上做一个archlinux系统 -
豆茗感冒: 用Flashboot软件加载img文件然后写到U盘上,,然后进BIOS把你的系统启动改成usb-zip/usb-hdd.........etc.然后机器应该就从U盘启动了

陵县15151695265: 如何在虚拟机中安装archlinux -
豆茗感冒: 步骤如下:一、准备工作:1、下载安装VMware Workstation并安装.2、下载一个archlinux系统镜像.二、新建虚拟机:1、打开VMware,新建一个虚拟机.2、选择“典型(推荐)(T)”,点“下一步”.3、选择“稍后安装操作系统”,点“下一步”.4、选择Linux系统版本,点“下一步”.5、设置“虚拟机名称”跟虚拟机的存放“位置”,点“下一步”.6、设置“最大磁盘大小”,选择“将虚拟磁盘存储为单个文件”,点“下一步”.三、安装:1、在CD/DVD处加载第一步下载的archlinux系统镜像文件.2、点击虚拟机的电源键,然后按照步骤提示进行安装,完成后即可使用虚拟机了.

陵县15151695265: Linux新手如何在较短的时间内学习并使用archlinux? -
豆茗感冒: 我不认为ArchLinux适合新手,系统安装是一方面:Arch的安装需要大量使用命令行工具,根据wiki上的安装说明一步步来.如果一个完全没有Linux经验的新手,难保不卡在一些错误上面.楼上朋友也说了Arch需要各种折腾,许多的硬件驱动都...

陵县15151695265: archlinux安装到sdb上怎么改成sda -
豆茗感冒: 1、拥有一个U盘作为驱动,用U盘安装archlinux系统. 2、开机选择U盘驱动. 3、进入选择列表,根据需求选择(32位或者64位系统)进入安装. 4、检测网络是否连接,因为安装必须联网进行下载.输入ping baidu.com 如果网络连接失败,应连接成功,...

陵县15151695265: 如quirky linux那些系统是如何作的这样小的阿,怎么精简?
豆茗感冒: 先学习lfs去,这是基础系统的制作,然后是blfs,有些包你可以选择.做出来的系统足够小,只要你技术过关.

陵县15151695265: 如何安装ArchLinux
豆茗感冒: 1、分区 cfdisk ·新手可以不用分区,如果需要分多个区,建议一个 / 一个/home,如果内存大,不需要swap分区.使用cfdisk分区比较直观. ·注意【Bootable】,/ 分区一定要Bootable,如果你单独划分了/boot,那这个bootable. ...

陵县15151695265: 【Linux扫盲篇】:各发行版本简介&下载
豆茗感冒: ArchLinux简介:Arch Linux是个 针对i686优化的Linux发行版,其最初的构思来源于 Per Lidén 开发的一个 CRUX 发行版.特性:优势:Arch是针对i686处理器而优化过的,这样可以更好地利用CPU周期的性能.相比RedHat等其他发行版,Arch ...

陵县15151695265: 怎么在raspberry上安装系统 -
豆茗感冒: 就像每一个计算机那样,树莓派需要一个操作系统,最好是选择Linux.选择Linux是因为它免费,而且可支持ARM处理器.但是要注意,并不是所有的 Linux发行版都能运行于树莓派.因为有些Linux发行版不支持树莓派指定的ARM处理器.比如...

陵县15151695265: vmware虚拟机怎样安装archlinux2017.10.01 -
豆茗感冒: 如何在虚拟机中安装archlinux 工具/原料 VM虚拟机 arch镜像 方法/步骤 首先当然是创建虚拟机了.由于过程十分简单,这里就不再介绍了.直接加载镜像并开机.进入系统如图.如何在虚拟机中安装archlinux 第一步:分区.输入fdisk /dev/sda ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网