<!-- $Id$ -->

<html>
  <head>
    <title>BOINC: Build system</title>
  </head>

  <body>

    <h2>Details of BOINC's new automake/autoconf build system</h2>
    <p>
      The BOINC build system uses <a href=
      "http://www.gnu.org/software/autoconf/">autoconf</a> 2.57 and <a
      href="http://www.gnu.org/software/automake/automake.html">automake</a>
      1.7.
    </p>

    <p>
      Much of these instructions are generic to automake but are provided here
      for convenience.
    </p>

    <h3>Notes</h3>
    <ul>
      <li><b>Maintainer mode</b>
        <p>
          The BOINC automake files use the <i>maintainer-mode</i> setting
          which by default disables automatic maintainer dependencies. If you
          modify makefiles or <code>configure.ac</code> you should enable them
          by adding the <code>--enable-maintainer-mode</code> option
          to <code>configure</code>:
          <pre>
            ./configure --enable-maintainer-mode
          </pre>

          You should modify only the <code>Makefile.am</code> files, which
          generate the <code>Makefile.in</code> files (and
          the <code>configure</code> script produced by autoconf will generate
          the <code>Makefile</code>s from those). If you don't have automake
          (or not a new enough version), the build system will warn you and
          continue without regenerating <code>Makefile.in</code>. (When
          checking out from CVS or extracting from a source distribution,
          sometimes <code>make</code> will think that
          the <code>makefile.in</code> files need to be regenerated because
          they aren't newer than the <code>Makefile.am</code> files.)
        </p>
      <li><b>Layout</b>
        <p>
          The top-level <code>Makefile.am</code> contains the
          <code>SUBDIRS=</code> line which sets up directory recursion, and
          the rules for creating source distributions.
        </p>
        <p>
          Each subdirectory's <code>Makefile.am</code> contains the rules for
          making the binaries and libraries in that directory and any extra
          files to distribute.
        </p>
        <p>
          Usually you will want to run <code>make</code> from the toplevel
          (the directory containing the file <code>configure</code>), but
          sometimes it is useful to run <code>make</code> and <code>make
            check</code> in certain subdirectories.
        </p>
      </li>
      <li><b>Dependencies</b>
        <p>
          Automake takes care of all dependency issues.
          Calling <code>make</code> will automagically regenerate the
          dependencies themselves as necessary.  This includes source
          dependencies (on header files) as well as Makefile dependencies
          (<code>Makefile</code> depends on <code>Makefile.in</code> which
          depends on <code>Makefile.am</code>).
        </p>
      </li>
      <li><b>Expanding</b>
        <p>
          If you create a new directory with another <code>Makefile.am</code>,
          you should <b>A)</b> make sure the directory is referenced by
          a <code>SUBDIRS=</code> line from its
          parent <code>Makefile.am</code> and <b>B)</b> add it to the
          AC_CONFIG_FILES directive in <code>configure.ac</code>.
        </p>
      </li>
    </ul>

    <h3>Tasks</h3>
    <ul>
      <li><b>Compiling</b>
        <p>
          To compile, use the usual
          <pre>
            ./configure
            make
          </pre>
        </p>
        <p>
          Example using multiple build directories under a single source
          directory (assuming the same directory is mounted
          on <code>milkyway</code> and <code>shaggy</code>):
          <pre>
            milkyway$ mkdir build
            milkyway$ mkdir build/solaris2.7
            milkyway$ cd build/solaris2.7
            milkyway$ ../../configure
            milkyway$ make

            milkyway$ mkdir build/solaris2.7-gcc3
            milkyway$ cd build/solaris2.7-gcc3
            milkyway$ ../../configure CC=/opt/misc/gcc-3.0.4/bin/gcc CXX=/opt/misc/gcc-3.0.4/bin/g++
            milkyway$ make

            shaggy$ mkdir build/linux
            shaggy$ cd build/linux
            shaggy$ ../../configure
            shaggy$ make
          </pre>
        </p>
      </li>
      <li><b>Testing</b>
        <p>
          To test the code:
          <pre>
            make check
          </pre> This runs the python tests in the <code>test/</code>
          directory; requires Python2.2, MySQLdb.  Old PHP-based tests in
          <code>test/</code>are also available to be run individually.
        </p>
      </li>
      <li><b>Version number</b>
        <p>
          The version number is set in the line
          <pre>
            AC_INIT(BOINC, 1.03)
          </pre>
          in <code>configure.ac</code>.  If you change this, run
          <code>make</code> and it will rebuild any files necessary to
          propagate the version number into source files and scripts (if
          maintainer-mode is on).  This is the only location the version
          number is set (in unix); all other uses of it come from here (no
          environment variables used).
        </p>
      </li>
      <li><b>Archiving</b>
        <p>
          To make source distributions:
          <pre>
            make dist
          </pre>
        </p>

        <p>
          This will make <code>.tar.gz</code>, <code>.tar.bz2</code>,
          and <code>.zip</code> files.  You can also make only the individual
          ones using the make
          targets <code>dist-bzip2</code>, <code>dist-gzip</code>, <code>dist-zip</code>.
          The source distributions contain everything necessary to build and
          run the server, and also remake distributions.
        </p>

        <p>
          (There used to be a separate client distribution requiring
           complicated rules for picking subdirectories to compile and
           distribute, but it has been obsoleted because few people will
           download the distribution to build only the client.)
        </p>

        <p>
          There is also a very handy target:
          <pre>
            make distcheck
          </pre>
          In a temporary directory, <code>make</code> will extract the
          distribution tarball, <code>make all</code>, <code>make
          check</code>, <code>make install</code> (to another temporary
          directory). This simulates what the developer end-user can do with
          the tarball.
        </p>
      </li>
      <li><b>Cleaning</b>
        <p>
          To clean out built object files:
          <pre>
            make clean
          </pre>
          To clean out built object files and generated files such
          as <code>Makefile.in</code>:
          <pre>
            make distclean
          </pre>
        </p>
      </li>
    </ul>
  </body>
</html>