Label Cloud

Thursday, February 12, 2009

修改rules文件,给configure加上参数

本文转自Debian新维护人员手册

rules文件

  现在我们需要来看看dpkg-buildpackage(1)用来创建 软件包的精确规则了。这个实际上是另一个Makefile脚本,但同上游源代码中的 那个不同。与debian/目录中的其它文件不同的是这个文件有可执行标记。

  就象其它的Makefile一样,每个“rules”文件都有一些用来指导如何处理源代码的 规则。每个规则都由目标、文件名或者是需要执行的操作的名 称(如“build:”、“install:”)组成。当你要执行一个规则时可以在命令行参数上 加入参数(比如“./debian/rules build”或者“make -f rules install”)。在目 标名称之后,你可以写这个规则对程序活文件的倚赖性。之后,可以有任意数目 的命令,这些命令要用符号缩进。新的规则以位于第一列上目标声明 开始。空白行和以“#”(井字号)开始的行将会被作为注释忽略掉。

  现在你可能已经听糊涂了,但只要看一下dh_make为我们创建的缺省的“rules”文 件你就能明白了。另外你也应该读一下info中的“make”项目来获得更多的信息。

  有一个关于dh_make所创建的rules文件的重要问题是你应该知道的:它只是一个 建议版本。对于一些简单的软件包它可以工作,但对于稍为复杂一些的,应当敢 于增加或者删减其内容使其符合你的需求。唯一你不能修改的就是规则的名称, 因为政策手册中提到的所有工具都将使用它们。

  这里是dh_make为我们产生的缺省的debian/rules文件:

           1  #!/usr/bin/make -f
           2  # -*- makefile -*-
           3  # Sample debian/rules that uses debhelper.
           4  # This file was originally written by Joey Hess and Craig Small.
           5  # As a special exception, when this file is copied by dh-make into a
           6  # dh-make output file, you may use that output file without restriction.
           7  # This special exception was added by Craig Small in version 0.37 of dh-make.
           8  # Uncomment this to turn on verbose mode.
           9  #export DH_VERBOSE=1
          10  configure: configure-stamp
          11  configure-stamp:
          12          dh_testdir
          13          # Add here commands to configure the package.
          14          touch configure-stamp
          15  build: build-stamp
          16  build-stamp: configure-stamp
          17          dh_testdir
          18          # Add here commands to compile the package.
          19          $(MAKE)
          20          #docbook-to-man debian/testpack.sgml > testpack.1
          21          touch $@
          22  clean:
          23          dh_testdir
          24          dh_testroot
          25          rm -f build-stamp configure-stamp
          26          # Add here commands to clean up after the build process.
          27          $(MAKE) clean
          28          dh_clean
           29  install: build
          30          dh_testdir
          31          dh_testroot
          32          dh_clean -k
          33          dh_installdirs
          34          # Add here commands to install the package into debian/testpack.
          35          $(MAKE) DESTDIR=$(CURDIR)/debian/testpack install
          36  # Build architecture-independent files here.
          37  binary-indep: build install
          38  # We have nothing to do by default.
          39  # Build architecture-dependent files here.
          40  binary-arch: build install
          41          dh_testdir
          42          dh_testroot
          43          dh_installchangelogs
           44          dh_installdocs
          45          dh_installexamples
          46  #       dh_install
          47  #       dh_installmenu
          48  #       dh_installdebconf
                 49  #       dh_installlogrotate
          50  #       dh_installemacsen
          51  #       dh_installpam
          52  #       dh_installmime
          53  #       dh_python
          54  #       dh_installinit
          55  #       dh_installcron
          56  #       dh_installinfo
          57          dh_installman
          58          dh_link
          59          dh_strip
          60          dh_compress
          61          dh_fixperms
          62  #       dh_perl
          63  #       dh_makeshlibs
          64          dh_installdeb
          65          dh_shlibdeps
          66          dh_gencontrol
          67          dh_md5sums
          68          dh_builddeb
          69  binary: binary-indep binary-arch
          70  .PHONY: build clean binary-indep binary-arch binary install configure 

(我为它增加了行号。在实际的 debian/rules 文件中,行首的空白是 制表符TAB。)

  对于第1行你一定很熟悉,因为它和shell及Perl脚本很象。它告诉操作系统这个 文件应当交给/usr/bin/make来处理。

  第6到9行上提到的DH_*变量应当被简短明确的说明。要想知道关于DH_COMPAT的更 多信息,可以阅读debhelper(1)手册中关于“Debhelper compatibility levels”一节。

  第11到16行是一个支持DEB_BUILD_OPTIONS的骨架,它的描述可以在政策文档的 第10.1节“Binaries”中找到。简单的说,它们控制着在构造二进制文件的时候是 否要加入调试符号,是否要在安装的时候进行裁减。再重复一下,这只是一个骨 架,一个你应当做这件事的提示。你需要找出上游的构建系统是如何处理调试符 号和install-strip的,然后自己实现它们。

  一般情况下,你可以通过CFLAGS变量来让gcc在编译的时候使用“-g”选项——如果这 是你的软件包的情况,你可以把CFLAGS="$(CFLAGS)"附加到$(MAKE)调 用的后面来propagete这个变量(看下面)。还有另外一种方法,如果你 的软件包使用了autoconf脚本,你可以把通过给./configure调用加上前 缀来把它传递给构建规则。

  关于裁减的问题,一般情况下程序自己的安装配制都不会进行裁减,而且通常也 不会包含一个选项让 你来做这件事情。幸运的是,你有dh_strip(1),而且当你设定了DEB_BUILD_OPTIONS=nostrip时,他会安静地退出。

  第18到26行描述了“build”(和“build-stamp”)规则,它们运行应用程序自己 的Makefile来编译它。如果你的软件包使用GNU配置工具来构造,请一定要阅 读/usr/share/doc/autotools-dev/README.Debian.gz。稍后在manpage.1.ex, manpage.sgml.ex, 第 5.8 节中我们会讨 论docbook-to-man的例子。

  第28到36行的“clean”规则会清除所有不需要的二进制文件和自动产生的东西,在 每次构建软件包的时候都会首先执行。这个规则必须在所有的时候都能正常工 作(即便源代码目录已经清理被清理好的),所以请使用强制选项(比 如对于rm是“-f”),或者通过在命令的名字前加上“-”让make忽略返回值(失败)。

  “install”规则从第38行开始,它指导了安装过程。它通常去执行软件自己 的Makefile中的“install”规则,但会把软件包安装 在$(CURDIR)/debian/gentoo目录中——这就是为什么我们要 在gentoo的Makefile中指定$(DESTDIR)作为安装的跟目录。

  就象注释中说明的那样,第48行上的“binary-indep”规则是用来构建体系结构无 关的软件包的。因为这里我们并没有这样的软件包,所以什么都不用做了。

  在52-79行上是下一条规则“binary-arch”,在这里我们运行了好几个debhelper软 件包中的小工具,它们将会在你的软件包上执行不同的操作来使其符合政策。

  如果你的软件包是“Architecture: all”的,那么你需要在“binary-indep”中包含 所有的命令,而让“binary-arch”保持空白。

  debhelper程序都是以dh_开始的,剩下的部分描述了这个工具具体的作用。其实 它们的名字都已经说的很清楚了,但这里我们还是给出一些额外的解释:

  • dh_testdir(1)检查你是不是在正确的目录中(比如源代码目录的最上层);

  • dh_testroot(1)检查你是否拥有在“binary-arch”、“binary-indep”和“clean”时需要用到的root权限;

  • dh_installman(1)把手册页文件复制到正确的目标目录中你不需要告诉它究竟相对于最高层源代码目录的那个位置是哪里;

  • dh_strip(1)从可执行文件和库文件中裁减掉调试信息,使它们更小一些;

  • dh_compress(1)gzip(1)压缩所有大于4 kB的手册页和文档;

  • dh_installdeb(1)把与软件包相关的所有文件(例如维护脚本)复制到debian/gentoo/DEBIAN目录中;

  • dh_shlibdeps(1)计算库文件和可执行文件对共享库的倚赖性;

  • dh_gencontrol(1)在控制文件插入一个已经格式化(fine-tuned)好的debian/gentoo/DEBIAN文件;

  • dh_md5sums(1)为软件包中的所有文件产生MD5校验码。

  要想了解更完整的的关于这些dh_*脚本究竟会做什么的信息以及它们其它的选项, 请阅读它们相应的手册。还有一些可能是非常有用的dh_*脚本文件在这里没有提 及。如果你需要使用它们,情阅读debhelper的文档。

  在binary-arch一节中,你必须要注释掉或者删除掉你不需要的功能调用。对 于gentoo,我把关于examples、cron、init、man和info的行注释掉了,因 为gentoo根本不需要它们。而且在第68行上,我把“ChangeLog”换成了“FIXES”, 因为那是上游的changelog文件的真实名字。

  最后的两行(和其它这里未曾解释的地方)是需要的,在make的手册和Debian政策 文件都是可以找到。现在知道它们的作用并不重要。

No comments: