Arch下通过代理FQ来进行包安装的配制方法【makepkg,curl,pacman】

Arch下所有软件的安装都是通过pacman来管理的,不过pacman只会根据/etc/pacman.d/mirrorlist中提供的镜像来下载最新版的软件。

如果你需要一些老版的软件,例如gcc 4.1.2这种“比较老”的编译器,用pacman是搞不定的,这时候需要用到另外一套系统pkgbuild。

以安装gcc 4.1.2为例子。

首先到AUR上找到gcc 4.1.2的PKGBUILD文件:https://aur.archlinux.org/packages/gcc41/

 

raywill@localhost /home/raywill/tools $ cat PKGBUILD 
# Contributor: Claudio Pisa <clauz@ninux.org>
# based con gcc43 PKGBUILD

pkgname=gcc41
_ver=4.1
pkgver=4.1.2
pkgrel=1
pkgdesc="The GNU Compiler Collection"
arch=('i686' 'x86_64')
license=('GPL' 'LGPL')
url="http://gcc.gnu.org"
depends=('glibc' 'binutils' 'gmp' 'mpfr' 'ppl')
makedepends=('flex' 'bison')
options=('!libtool')
source=(ftp://gcc.gnu.org/pub/gcc/releases/gcc-${pkgver}/gcc-{core,g++}-${pkgver}.tar.bz2)
md5sums=('2af3fb599635219171c6ae1f3034888a' 
                 '75c6d5fa3415d614314caf0f509e8933' 
                 '39621038e425c73f955db8c8db411c34' 
     'abda05c0ab99059e8f9e7a625361fd87')


build() {
  if ! locale -a | grep ^de_DE; then
          echo "You need the de_DE locale to build gcc."
    return 1
  fi

  cd ${srcdir}/gcc-${pkgver}
  # Don't install libiberty
  sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in

  echo ${pkgver} > gcc/BASE-VER

  # Don't run fixincludes
  sed -i -e 's@\./fixinc\.sh@-c true@' gcc/Makefile.in

  mkdir build
  cd build
  ../configure --prefix=/usr --enable-shared \
      --enable-languages=c,c++ \
      --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info \
      --enable-__cxa_atexit  --disable-multilib --libdir=/usr/lib \
      --libexecdir=/usr/lib --enable-clocale=gnu --disable-libstdcxx-pch \
      --with-tune=i686 \
      --disable-werror --enable-checking=release \
      --program-suffix=-${_ver} --enable-version-specific-runtime-libs
  make || return 1
  make DESTDIR=${pkgdir} install || return 1

  # Lazy way of dealing with conflicting man and info pages...
  rm -rf ${pkgdir}/usr/share
}

 



 

将PKGBUILD文件下载到本地,然后执行makepkg,它会自动分析PKGBUILD描述的任务,下载依赖包、gcc安装包等,下载完毕后会自动编译。可能的输出:

 

raywill@localhost /home/raywill/tools $ makepkg 
==> Making package: gcc41 4.1.2-1 (Sun Aug 25 22:58:42 UTC 2013)
==> WARNING: Using a PKGBUILD without a package() function is deprecated.
==> Checking runtime dependencies...
==> Checking buildtime dependencies...
==> Retrieving sources...
  -> Downloading gcc-core-4.1.2.tar.bz2...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 16.6M  100 16.6M    0     0  19652      0  0:14:49  0:14:49 --:--:-- 42037
  -> Downloading gcc-g++-4.1.2.tar.bz2...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
 61 3719k   61 2288k    0     0  15009      0  0:04:13  0:02:36  0:01:37 19470

 

下载过程走的是代理服务器。对应pacman,需要设置/etc/pacman.conf中的XferCommand = /usr/bin/curl --socks4a 192.168.17.2:1080 -C - -f %u > %o 。
 --socks4a 192.168.17.2:1080表示走socks代理,并指定了代理ip和端口。


对于makepkg,也需要设置代理,设置文件/etc/makepkg.conf,如下,里面ip端口跟上面一致。

 

DLAGENTS=('ftp::/usr/bin/curl --socks4a 192.168.17.2:1080 -fC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u'
          'http::/usr/bin/curl  --socks4a 192.168.17.2:1080 -fLC - --retry 3 --retry-delay 3 -o %o %u'
          'https::/usr/bin/curl  --socks4a 192.168.17.2:1080 -fLC - --retry 3 --retry-delay 3 -o %o %u'
          'rsync::/usr/bin/rsync --no-motd -z %u %o'
          'scp::/usr/bin/scp -C %u %o')

为了找到makepkg配置文件的位置,我用到了strace,通过跟踪makepkg用到的open调用才知道makepkg.conf的绝对位置。这是个小技巧,大家可以学习下。

 

 

strace makepkg  1 > log.txt 2 > log.txt
然后在log.txt中搜conf关键字即可找到。

 


总结一下:

pacman,负责安装最新的应用。

makepkg,负责安装一些老版本的应用。这些老应用在Mirror Site上不存在,但在AUR上可以下载到。

raywill@localhost /home/raywill/tools $ cat PKGBUILD 
# Contributor: Claudio Pisa <clauz@ninux.org>
# based con gcc43 PKGBUILD

pkgname=gcc41
_ver=4.1
pkgver=4.1.2
pkgrel=1
pkgdesc="The GNU Compiler Collection"
arch=('i686' 'x86_64')
license=('GPL' 'LGPL')
url="http://gcc.gnu.org"
depends=('glibc' 'binutils' 'gmp' 'mpfr' 'ppl')
makedepends=('flex' 'bison')
options=('!libtool')
source=(ftp://gcc.gnu.org/pub/gcc/releases/gcc-${pkgver}/gcc-{core,g++}-${pkgver}.tar.bz2)
md5sums=('2af3fb599635219171c6ae1f3034888a' 
                 '75c6d5fa3415d614314caf0f509e8933' 
                 '39621038e425c73f955db8c8db411c34' 
     'abda05c0ab99059e8f9e7a625361fd87')


build() {
  if ! locale -a | grep ^de_DE; then
          echo "You need the de_DE locale to build gcc."
    return 1
  fi

  cd ${srcdir}/gcc-${pkgver}
  # Don't install libiberty
  sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in

  echo ${pkgver} > gcc/BASE-VER

  # Don't run fixincludes
  sed -i -e 's@\./fixinc\.sh@-c true@' gcc/Makefile.in

  mkdir build
  cd build
  ../configure --prefix=/usr --enable-shared \
      --enable-languages=c,c++ \
      --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info \
      --enable-__cxa_atexit  --disable-multilib --libdir=/usr/lib \
      --libexecdir=/usr/lib --enable-clocale=gnu --disable-libstdcxx-pch \
      --with-tune=i686 \
      --disable-werror --enable-checking=release \
      --program-suffix=-${_ver} --enable-version-specific-runtime-libs
  make || return 1
  make DESTDIR=${pkgdir} install || return 1

  # Lazy way of dealing with conflicting man and info pages...
  rm -rf ${pkgdir}/usr/share
}


posted on 2013-08-26 19:58  新一  阅读(107)  评论(0)    收藏  举报

导航