Total Pageviews

Sunday, 30 December 2012

打造ArchLinux下的类apt-get source工具

首先广告一下,Arch Linux 是 我用过的最喜欢的一个Linux发行版,它是一个滚动升级模式的i686/x86-64 Linux发行版,它的开发注重于系设计简洁、结构优雅、代码 准确、体验新潮的完美权衡。它给你一个最小的系统,但是提供很强大的包管理,从而你可以自由的构建一个理想的系统,它的包管理强大之处在于它有两套包管理 系统,一个是基于pacman的二进制包管理系统,类似ubuntu下的apt-get 系统,使用官方仓库,提供大量打包好的软件包可供直接使用,另外一个就是全功能的类ports的ABS(Arch Build System)软件包管理系统,类似gentoo的emerge系统,可以很方便的从源码构建软件,而且构建出来的软件也纳入pacman的包管理系统, 这样就可以方便的缷载软件,避免了最普通的configure&&make&&make install这一种从源码构建方式不易缷载的问题。ABS实际上维护了一个PKGBUILD文件集合,其中每个PKGBUILD文件对应一个软件,可以 使用makepkg命令来通过PKGBUILD构建软件。ABS其中的软件包是社区维护用户的,任何人都可以提交可以构建软件的PKGBUILD,从而形 成了一个非常巨大的仓库,这个仓库就叫AURArch Linux User-community Repository)。
很多人习惯了用apt-get source来下载一个软件的源码包,但是pacman却没有直接提供这样的功能,显得有些不便,其实ArchLinux把包源码相关的事都交给ABS去 做了,下载源码可以通过abs命令及其它的命令组合来完成,稍显麻烦,所以写了一个脚本进行了包装,实现把源码下载到当前目录的功能,同时也把下载好的源 码包解开,同时打上patch(如果有的话)。

pkgsrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/sh
# This script is used for downloading package source tarball under Archlinux,  just like apt-get source pkg in ubuntu.
 
#make sure abs is installed
pacman -Q abs >/dev/null 2>&1
if [ $? -ne 0 ];then
    echo "abs is not installed."
    echo "installing abs..."
    if [ `whoami` == "root" ];then
        pacman -S abs
        abs -t
    else
        sudo pacman -S abs
        if [ $? -ne 0 ];then
            exit
        fi 
        sudo abs -t
    fi 
fi
 
#geting source through the PKGBUILD file
find /var/abs -type d -name $1 -exec cp -a {} /tmp/ \;
if [  -d /tmp/$1 ];then
    echo package found.
else
    echo package not found.
    exit
fi
pushd /tmp/$1 >/dev/null 2>&1
sed -i 's:\./configure.*$:exit:' PKGBUILD
makepkg
popd >/dev/null 2>&1
cp -a /tmp/$1/src ./$1 >/dev/null 2>&1
脚本原理就是利用abs得到AUR中的软件的PKGBUILD,然后修改一下PKGBUILD从而让makepkg只做下载源码包并解开和打补丁的工作,在配置和编译前停下来,这样就得到了需要的软件包的源码。


修正一下代码:

#!/bin/bash
# This script is used for downloading package source tarball under Archlinux,  just like apt-get source pkg in ubuntu.
 
#make sure abs is installed
pacman -Q abs >/dev/null 2>&1
if [ $? -ne 0 ];then
    echo "abs is not installed."
    echo "installing abs..."
    if [ `whoami` == "root" ];then
        pacman -S abs 
        abs -t
    else
        sudo pacman -S abs 
        if [ $? -ne 0 ];then
            exit
        fi 
        sudo abs -t
    fi 
fi
 
#geting source through the PKGBUILD file
find /var/abs -type d -name $1 -exec cp -a {} /tmp/ \;
if [  -d /tmp/$1 ];then
    echo package found.
else
    echo package not found.
    exit
fi
pushd /tmp/$1 >/dev/null 2>&1
sed -i 's:\./configure.*$:exit:' PKGBUILD
makepkg -od --asroot
 
makepkg的参数asroot是给root用的,这个脚本要让普通用户也能用。
另外关于od参数,我之前也考虑过,d参数可以加上去,o的话之所以没加是因为对于一般的包不做build可以达到效果,但是对于要用版本控制工具拉取源代码的程序来说,就不行,比如vim的拉取代码就是在build()中做的,用o参数就完全得不到源码。