[您也可以查看此文档的 单页版本。]

构建和测试

Unix 下的配置/构建系统

Greg Stein 为 Subversion 编写了一个自定义构建系统,该系统以前使用 `automake' 和递归 Makefile。现在它使用单个顶层 Makefile,该文件从 Makefile.in(在版本控制下)生成。`Makefile.in' 反过来包含 `build-outputs.mk',该文件由 `gen-make.py' 脚本从 `build.conf' 自动生成。因此,后两者在版本控制下,但 `build-outputs.mk' 不在。

以下是 Greg 描述该系统的原始邮件,以及一些关于修改它的建议

   From: Greg Stein <[email protected]>
   Subject:  new build system (was: Re: CVS update: MODIFIED: ac-helpers ...)
   To: [email protected]
   Date: Thu, 24 May 2001 07:20:55 -0700
   Message-ID: <[email protected]>

   On Thu, May 24, 2001 at 01:40:17PM -0000, [email protected] wrote:
   >   User: gstein
   >   Date: 01/05/24 06:40:17
   >
   >   Modified:    ac-helpers .cvsignore svn-apache.m4
   >   Added:       .        Makefile.in
   >   Log:
   >   Switch over to the new non-recursive build system.
   >...

   Okay... this is it. We're now on the build system.

       "It works on my machine."

   I suspect there may be some tweaks to make on different OSs. I'd be
   interested to hear if Ben can really build with normal BSD make. It
   should be possible.

   The code supports building, installation, checking, and
   dependencies. It does *NOT* yet deal with the doc/ subdirectory. That
   is next; I figured this could be rolled out and get the kinks worked
   out while I do the doc/ stuff.  Oh, it doesn't build Neon or APR yet
   either. I also saw a problem where libsvn_fs wasn't getting built
   before linking one of the test proggies (see below).

   Basic operation: same as before.

   $ ./autogen.sh
   $ ./configure OPTIONS
   $ make
   $ make check
   $ make install

   There are some "make check" scripts that need to be fixed up. That'll
   happen RSN. Some of them create their own log, rather than spewing to
   stdout (where the top-level make will place the output into
   [TOP]/tests.log).

   The old Makefile.am files are still around, but I'll be tossing those
   along with a bunch of tweaks to all the .cvsignore files. There are a
   few other cleanups, too. But that can happen as a step two.

   [ $ cvs rm -f `find . -name Makefile.rm`

     See the mistake in that line? I didn't when I typed it. The find
     returned nothing, so cvs rm -f proceeded to delete my entire
     tree. And the -f made sure to delete all my source files, too. Good
     fugging thing that I had my mods in some Emacs buffers, or I'd be
     bitching.

     I am *so* glad that Ben coded SVN to *not* delete locally modified
     files *and* that we have an "undel" command. I had to go and tweak a
     bazillion Entries files to undo the delete...
   ]

   The top-level make has a number of shortcuts in it (well, actually in
   build-outputs.mk):

   $ make subversion/libsvn_fs/libsvn_fs.la

   or

   $ make libsvn_fs

   The two are the same. So... when your test proggie fails to link
   because libsvn_fs isn't around, just run "make libsvn_fs" to build it
   immediately, then go back to the regular "make".

   Note that the system still conditionally builds the FS stuff based
   on whether DB (See 'Building on Unix' below) is available, and
   mod_dav_svn if Apache is available.

   Handy hint: if you don't like dependencies, then you can do:

   $ ./autogen.sh -s

   That will skip the dependency generation that goes into
   build-outputs.mk. It makes the script run quite a bit faster (48 secs
   vs 2 secs on my poor little Pentium 120).

   Note that if you change build.conf, you can simply run:

   $ ./gen-make.py build.conf

   to regen build-outputs.mk. You don't have to go back through the whole
   autogen.sh / configure process.

   You should also note that autogen.sh and configure run much faster now
   that we don't have the automake crap. Oh, and our makefiles never
   re-run configure on you out of the blue (gawd, I hated when automake
   did that to me).

   Obviously, there are going to be some tweaky things going on. I also
   think that the "shadow" builds or whatever they're called (different
   source and build dirs) are totally broken. Something tweaky will have
   to happen there.  But, thankfully, we only have one Makefile to deal
   with.

   Note that I arrange things so that we have one generated file
   (build-outputs.mk), and one autoconf-generated file (Makefile from
   .in).  I also tried to shove as much logic/rules into
   Makefile.in. Keeping build-outputs.mk devoid of rules (thus, implying
   gen-make.py devoid of rules in its output generation) manes that
   tweaking rules in Makefile.in is much more approachable to people.

   I think that is about it. Send problems to the dev@ list and/or feel
   free to dig in and fix them yourself. My next steps are mostly
   cleanup. After that, I'm going to toss out our use of libtool and rely
   on APR's libtool setup (no need for us to replicate what APR already
   did).

   Cheers,
   -g

   --
   Greg Stein, http://www.lyra.org/

以下是一些针对更改或测试配置/构建系统的建议

   From: Karl Fogel <[email protected]>
   To: [email protected]
   Subject: when changing build/config stuff, always do this first
   Date: Wed 28 Nov 2001

   Yo everyone: if you change part of the configuration/build system,
   please make sure to clean out any old installed Subversion libs
   *before* you try building with your changes.  If you don't do this,
   your changes may appear to work fine, when in fact they would fail if
   run on a truly pristine system.

   This script demonstrates what I mean by "clean out".  This is
   `/usr/local/cleanup.sh' on my system.  It cleans out the Subversion
   libs (and the installed httpd-2.0 libs, since I'm often reinstalling
   that too):

      #!/bin/sh

      # Take care of libs
      cd /usr/local/lib || exit 1
      rm -f APRVARS
      rm -f libapr*
      rm -f libexpat*
      rm -f libneon*
      rm -f libsvn*

      # Take care of headers
      cd /usr/local/include || exit 1
      rm -f apr*
      rm -f svn*
      rm -f neon/*

      # Take care of headers
      cd /usr/local/apache2/lib || exit 1
      rm -f *

   When someone reports a configuration bug and you're trying to
   reproduce it, run this first. :-)

   The voice of experience,
   -Karl

恢复破坏性更改

构建系统是所有在 trunk 上工作的开发人员的重要工具。有时,对构建系统所做的更改对于一个开发人员来说运行良好,但无意中破坏了另一个开发人员的构建系统。

为了防止生产力下降,任何提交者(全部或部分)都可以立即撤销任何破坏其在所选平台上有效进行开发的能力的构建系统更改,作为常规操作,无需担心被指责过度反应。撤销更改的提交日志消息应包含说明更改被撤销原因的解释性说明,其中包含足够的细节,以便在有人选择回复提交邮件时适合开始关于该问题的讨论。

但是,应注意不要进入“默认撤销模式”。如果您能快速解决问题,请这样做。如果不能,请停下来思考一分钟。在您思考之后,如果仍然没有解决方案,请继续撤销更改,并将讨论带到列表中。

一旦更改被撤销,就由撤销更改的原始提交者决定是重新提交其原始更改的修复版本(如果根据撤销提交者的理由,他们确信其新版本肯定已修复),还是将修改后的版本提交给撤销提交者进行测试,然后再重新提交。

自动化测试

有关如何使用和向 Subversion 的自动化测试框架添加测试的说明,请阅读 subversion/tests/READMEsubversion/tests/cmdline/README

构建农场

Apache 软件基金会基础设施团队管理着一个 BuildBot 构建/测试农场。Subversion 项目的 BuildBot 水平线位于此处

有关构建服务的更多信息,请访问 ci2.apache.org

如果您想接收有关 Buildbot 构建和测试失败的通知,请订阅 notifications@ 邮件列表。

Buildbot 在 Infra 存储库 中配置,具体来说是 subversion.py 文件。

在代码之前编写测试用例

From: Karl Fogel <[email protected]>
Subject: writing test cases
To: [email protected]
Date: Mon, 5 Mar 2001 15:58:46 -0600

Many of us implementing the filesystem interface have now gotten into
the habit of writing the test cases (see fs-test.c) *before* writing
the actual code.  It's really helping us out a lot -- for one thing,
it forces one to define the task precisely in advance, and also it
speedily reveals the bugs in one's first try (and second, and
third...).

I'd like to recommend this practice to everyone.  If you're
implementing an interface, or adding an entirely new feature, or even
just fixing a bug, a test for it is a good idea.  And if you're going
to write the test anyway, you might as well write it first. :-)

Yoshiki Hayashi's been sending test cases with all his patches lately,
which is what inspired me to write this mail to encourage everyone to
do the same.  Having those test cases makes patches easier to examine,
because they show the patch's purpose very clearly.  It's like having
a second log message, one whose accuracy is verified at run-time.

That said, I don't think we want a rigid policy about this, at least
not yet.  If you encounter a bug somewhere in the code, but you only
have time to write a patch with no test case, that's okay -- having
the patch is still useful; someone else can write the test case.

As Subversion gets more complex, though, the automated test suite gets
more crucial, so let's all get in the habit of using it early.

-K