<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
                      "http://www.w3.org/TR/html4/strict.dtd">
<html>

<head>
    <title>How to Setup a MinGW Buildbot Slave on Windows</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="author" content="Mikael Lyngvig">
    <link rel="stylesheet" href="llvm.css" type="text/css">
</head>

<body>

<h1>How to Setup a MinGW Buildbot Slave on Windows</h1>

<ul>
    <li><a href="#Introduction">Introduction</a></li>
    <li><a href="#Preparing">Preparing the System</a></li>
    <li><a href="#Software">Software Setup</a>
    <ol>
        <li><a href="#Mingw32">Installing MinGW 32-bit</a></li>
        <li><a href="#Mingw64">Installing MinGW 64-bit</a></li>
        <li><a href="#GnuWin32">Installing GnuWin32</a></li>
        <li><a href="#Subversion">Installing Subversion</a></li>
        <li><a href="#CMake">Installing CMake</a></li>
        <li><a href="#Python">Installing Python v2.x</a></li>
        <li><a href="#SetupTools">Installing Python v2.x SetupTools</a></li>
        <li><a href="#PyWin32">Installing the Python Win32 Bindings</a></li>
        <li><a href="#Cygwin">Installing Cygwin</a></li>
    </ol></li>
    <li><a href="#Post">Post-Installation Setup</a></li>
    <li><a href="#Testing">Testing the Build Environment</a>
    <ol>
        <li><a href="#Pulling">Pulling the Sources</a></li>
        <li><a href="#Makefiles">Making the Makefiles</a></li>
        <li><a href="#Building">Building the Sources</a></li>
    </ol></li>
    <li><a href="#Slavery">Making a Buildbot Slave</a>
    <ol>
        <li><a href="#Buildbot">Installing the Buildbot Slave</a></li>
        <li><a href="#Starting">Starting the Buildbot Slave</a></li>
        <li><a href="#Booting">Starting the Slave when Windows Boots</a></li>
        <li><a href="#BootTest">Booting the Slave as a Test</a></li>
        <li><a href="#Registering">Registering the Slave with the LLVM team</a></li>
    </ol></li>
    <li><a href="#Congrats">Congratulations...</a></li>
    <li><a href="#AppendixA">Appendix A: CMakefile Snippet Illustrating Link
        Order</a></li>
    <li><a href="#Debugging">Appendix B: Debugging MinGW Programs on Windows
        </a></li>
</ul>

<div>
<p><b>Written by:</b> <a href="mailto:mikael@lyngvig.org">Mikael Lyngvig</a>.
</div>

<h2><a name="Introduction">Introduction</a></h2>
<div>
<p>Building LLVM on Windows using the MinGW32 or MinGW64 toolchains can seem
daunting at first.  After a few days of experimentation, you gradually
come to realize that it is not that difficult at all.  However, I'd
like to spare you these two or three days of experimentation so that you can
easily set up your own Windows build slave - or, perhaps, just build LLVM
and Clang manually under Windows using the MinGW toolchains.</p>

<p>There are a number of reasons why you'd want to use the MinGW tools instead
of, say, Microsoft Visual Studio:</p>

<ol>
    <li>Microsoft Visual Studio is closed source.</li>
    <li>Microsoft Visual Studio will set you back a quite considerable sum.
        </li>
    <li>Microsoft Visual Studio generally only works with Microsoft-prescribed
        tools and technologies.</li>
    <li>The LLVM Clang++ compiler does not yet support the Microsoft C++ ABI,
        for which reason you are effectively forced into using MinGW if you
        want to do C++ using Clang++ as the front-end.  This is seen by
        odd unresolved symbols when doing a link by asking Clang++ to figure
        out how to perform the link (what tools to invoke and what libraries
        to use).</li>
    <li>The LLVM Clang++ compiler does not yet support the Microsoft <tt>
        force_inline</tt> feature for which reason you have to use the MinGW
        header files (such as <tt>Windows.h</tt>) when building with Microsoft
        Visual C++.  So, either way, you'll have to use parts of MinGW -
        and if you are using parts of MinGW, then why not use all of it?
        </li>
</ol>

<p>A user has reported, though, that it is possible to develop your project
using Microsoft Visual Studio, if only you remember to use the MinGW linker
(<tt>ld</tt>) instead of letting Clang++ invoke the Microsoft <tt>link.exe
</tt> linker.  Please see Appendix A for a CMakefile snippet that
illustrates in what order you should link the various libraries when using
<tt>ld</tt>.</p>

<p><b>Notice:</b> You don't need Microsoft Visual Studio to build LLVM and
Clang on Windows.  If you need to link in special Microsoft libraries,
that are not part of the MinGW64 distribution, you can get access to those
merely by downloading the Microsoft Windows SDK for Windows 7 and .NET 4.0
from <a href="http://www.microsoft.com/en-us/download/details.aspx?id=8442"
Microsoft Download Center</a>  That should get you going without the
need for Visual Studio.</p>

<p>This document will provide you with a very precise step by step procedure
for setting up a new Windows build slave from scratch, where from scratch
means just that: All you need is the hardware (the machine you are going to
turn into a build slave), the Windows installation media, and a reasonably
fast Internet connection (I suggest you wire up the box, at least during the
setup).</p>

<p>The procedure is already pretty well documented in the
<a href="http://www.llvm.org/docs/GettingStarted.html">Getting Started with
the LLVM System</a> guide, but I found that there are sufficient unspecified
things, that <i>I</i> believe it makes sense to make a Windows-specific guide.
  If this guide fails you, you can always resort to the <i>Getting
Started with the LLVM System</i> guide.</p>

<p>Due to general lack of knowledge of <a href="http://www.cygwin.com">Cygwin
</a>, I've chosen a method that does <b>not</b> rely on Cygwin.  Some of
the tools required by the build process, AFAIK, are installed with Cygwin, but
you don't need to start up the Cygwin bash shell (a Unix equivalent to
<tt>CMD.EXE</tt>), instead you can run the build from an ordinary Windows
console window.  The Cygwin binaries directory is, however, added to the
path used during the build so as to make Cygwin available to the build system.
</p>

<p>This step-by-step build slave set up procedure was written by <a href=
"mailto:mikael@lyngvig.org">Mikael Lyngvig</a>.  Please contact Mikael
directly if you find errors or outdated material in this document.  Any
and all errors in this document are solely the responsibility of the author.
</p>
</div>

<h2><a name="Preparing">Preparing the System</a></h2>
<div>
<p>Before you start out setting up a Windows build slave, you should do a
number of things:</p>

<ol>
    <li>You should choose a box that is fast enough to act as a build slave
        (2,5 GHz Core 2 Duo and up).  If you pick a slower box, you'll
        regret it once you've spent hours setting up the machine and then
        realize that it is too slow to use.  Also, you want to make sure
        that there's at least 6 gigabytes of RAM in the machine as
        <tt>ld</tt> (the GNU linker) uses a lot of memory (about 5 gigabytes)
        when linking <tt>clang.exe</tt> with debug info in a Subversion build.
        </li>
    <li>You should dedicate the machine to be an LLVM build slave, otherwise
        you'll probably run into issues such as your main desktop (if that's
        the one you use as a build slave) suddenly becomes very slow while
        you're playing Skyrim because a background build has started and is
        pulling all the juice in the system.</li>
    <li>You should decide upon a partition layout for your new machine. 
        If you have only one harddisk in the system, you should probably
        reserve, say, 65 gigabytes to Windows and allocate the rest in one
        huge partition to be used by the build system.  If you have two
        or more harddisks, you can reserve one for Windows and other software,
        and use another as a dedicated build device.</li>
    <li>Then I suggest you start out by (re-)installing Windows from scratch.
          The main reason for doing so is that you want to be 100 percent
        certain why the build succeeded or failed.  If you have all sorts
        of old software lying around on your system, you may likely get odd
        and/or unwanted results, which you can then waste precious time on
        figuring out how they came to be.</li>
    <li>When you install Windows, create a new user account named
        <tt>Build</tt>.  Give it any password you like, but be sure
        to <b>not</b> use a password that you already use on your network so
        as to make sure that hackers and hostile build masters cannot access
        all of your computers on your local network (Windows by default does
        not ask for a password when you connect to another computer if that
        other computer's user's password is identical to the one you are using
        on the connecting computer).</li>
    <li>Now that you've (re-)installed Windows, you need to run Windows Update
        (Control Panel, Windows Update) over and over again, until such a time
        that Windows has finally updated itself completely.  This can
        take hours and quite a few reboots.</li>
    <li>Don't install antivirus software (simply tell the Solution Center to
        keep quiet about missing antivirus software).  There are two
        reasons for this:<br>
        <ul>
            <li>Enabling an antivirus solution will likely slow down your
                builds by a noticable percentage.</li>
            <li>One of the LLVM test cases includes a DOS virus.  I don't
                know why, but I do know that if you do not disable and remove
                your antivirus software, this procedure will fail once you get
                to the point where you pull sources from the Subversion
                repository.  As a build slave regularly gets files from
                the Subversion repository, you'll regularly need to disable
                your antivirus solution and since you're not using the machine
                for anything other than building LLVM and Clang, you don't
                need an antivirus solution at all.</li>
        </ul>
    </li>
    <li>Mark the user <tt>Build</tt> for automatic login.  On Windows 7,
        you do this by running the command <tt>control userpasswords2</tt> and
        then uncheck the <tt>Users must enter a user name and password to use
        this computer.</tt> checkbox.  Then click the <tt>Apply</tt>
        button and enter the user name <tt>Build</tt> and the password that
        you gave this account.</li>
</ol>

<p>So far, so good.  The next chapter will detail what software packages
you need to install and in what order.</p>
</div>

<h2><a name="Software">Software Setup</a></h2>
<div>
<p>In this chapter, you'll be walked through downloading and installing all of
the software packages that are needed to do a full build including running the
test suite.  If you do not plan to run the test suite, you can leave out
some of these components, but given the low price of secondary storage such as
harddisks, there doesn't really seem to be a good reason to do so.</p>
</div>

<h3><a name="Mingw32">Installing MinGW 32-bit</a></h3>
<div>
<p>Download and install MinGW(32) using the MinGW installer found at the
<a href="http://sourceforge.net/projects/mingw/">MinGW project at SourceForge
</a>.  Download the file marked as the default download
(<tt>mingw-get-inst-YYYYMMDD.exe</tt>).  Run it then select <tt>Download
latest repository catalogues</tt> (the other choice may work too, I haven't
tried it).  Install to <tt>C:\Mingw32</tt> as you'll perhaps also be
installing MinGW 64-bit later on.   Select and check all checkboxes (even
though you won't be needing all of them) so as to be safe rather than sorry if
future changes to LLVM makes more features mandatory.</p>

<p><b>Notice:</b> If you only want to build x64 programs, you do <b>not</b>
need to install Mingw32.</p>
</div>

<h3><a name="Mingw64">Installing MinGW 64-bit</a></h3>
<div>
<p>Install MinGW-W64 by downloading the most recent version from
<a href="http://code.google.com/p/mingw-w64-dgn/"> Drangon's MinGW-W64
prebuilt binaries</a>.  Unzip it, using 7-Zip from
<a href="http://www.7-zip.org/">www.7-Zip.org</a>, to <tt>C:\MinGW64</tt>.
  Extract to <tt>C:\</tt> as the 7-zip archive already includes the
<tt>\MinGW64</tt> part (you may want to verify that this is still the case
prior to unpacking to <tt>C:\</tt>).</p>

<p><b>Notice:</b> If you want to do a MinGW 32-bit build and/or provide a
MinGW 32-bit build slave, you do <b>not</b> need to install MinGW 64-bit.</p>
</div>

<h3><a name="GnuWin32">Installing GnuWin32</a></h3>
<div>
<p>Install GnuWin32 by following the <tt>Looking for the latest version?</tt>
link at <a href="http://sourceforge.net/projects/getgnuwin32/files/">GnuWin32
on SourceForge.net</a>.  Download and run the executable.  Once it
has run to completion, you need to run both the <tt>download</tt> and
<tt>install</tt> scripts that are in the download directory (please notice
that you should specify an installation directory, say, <tt>C:\GnuWin32</tt>,
to the <tt>install</tt> script).  The download directory is by default
identical to <tt>C:\Users\Build\Downloads\GetGnuWin32</tt>.  You almost
certainly don't need all of GnuWin32 to build LLVM/Clang, but better safe than
sorry.</p>

<p><b>Notice:</b> If you do not plan to run the test suite, you don't need
GnuWin32.  You can build LLVM + Clang with only Subversion, MingwNN, and
CMake.</p>
</div>

<h3><a name="Subversion">Installing Subversion</a></h3>
<div>
<p>Download and install Subversion from the
<a href="http://subversion.apache.org/packages.html#windows">Subversion
download page</a>.  Pick SlikSVN (so as to avoid registering) then follow
the link and pick the appropriate version of Slik-Subversion.  Install
it using the <tt>Typical</tt> choice.  It automatically adds itself to
the global PATH environment variable, so it works right away (when you open
up a new console window, that is).</p>
</div>

<h3><a name="CMake">Installing CMake</a></h3>
<div>
<p>Navigate to
<a href="http://www.cmake.org/cmake/resources/software.html#latest">CMake
download page</a> and download the latest Win32 installer.  Run it and
install CMake to its default location while making sure you select the <tt>
Add CMake to the system PATH for current user</tt> option during setup.</p>

<p><b>Notice:</b> You need to rename or delete the file
<tt>C:\Mingw32\msys\1.0\bin\sh.exe</tt> before you run CMake for the first
time as it will report and error and halt if <tt>sh.exe</tt> is found in the
path.  The same goes for <tt>C:\Cygwin\bin\sh.exe</tt>.</p>
</div>

<h3><a name="Python">Installing Python v2.x</a></h3>
<div>
<p>Download and install the latest recommended <b>32-bit</b> release of v2.x
of Python from the <a href="http://www.python.org/">Python website</a>. 
You need to download and install the <b>32-bit</b> release because Buildbot
relies on the Win32 bindings.</p>

<p><b>Notice:</b> It <b>may</b> work with the Win64 bindings, but I have not
tested that configuration.</p>
</div>

<h3><a name="SetupTools">Installing Python v2.x SetupTools</a></h3>
<div>
<p>Download and install the latest version of SetupTools for Python from the
<a href="http://pypi.python.org/pypi/setuptools#files"> PyPi page for the
SetupTools</a>.  Be sure to pick the version that matches your Python
version!</p>
</div>

<h3><a name="PyWin32">Installing the Python Win32 Bindings</a></h3>
<div>
<p>Download and install the most recent Python v2.7 version of PyWin32 from
the
<a href="http://sourceforge.net/projects/pywin32/files/pywin32/">PyWin32
website</a>.  Pick the newest build (with the highest number) and then
download the appropriate version for your version of Python.</p>
</div>

<h3><a name="Cygwin">Installing Cygwin</a></h3>
<div>
<p>Download and install the most recent Cygwin release from the
<a href="http://www.cygwin.com/">Cygwin website</a>.  Now for the most
painful part of this guide: Picking what Cygwin components you want to
install.  Unfortunately, there's no <tt>install all</tt> feature in the
Cygwin installation program (perhaps because the total size is rather large),
so you have to use the GUI setup program and manually pick these items:</p>

<ol>
    <li>Devel/DejaGnu (search <b>without</b> hitting Enter as hitting Enter
        causes the setup program to proceed).</li>
    <li>Interpreter/tcl.</li>
    <li>Tcl/expect.</li>
</ol>

<p><b>Notice:</b> If you do not plan to run the test suite, you don't need
Cygwin.  You can build LLVM + Clang with only Subversion, MingwNN, and
CMake.</p>
</div>

<h2><a name="Post">Post-Installation Setup</a></h2>
<div>
<p>After you've installed all of the above, you need a small batch file (shell
script) to set up your environment variables.  According to my
experiences, you only need to set up the <tt>PATH</tt> environment variable.
  So, go ahead and create a file named <tt>setenv.bat</tt> in the
outermost directory of your LLVM build tree (<tt>D:\bld</tt>), and copy and
paste the CMD.EXE code snippet below into it:</p>

<div class="doc_code">
<pre>
@echo off
rem This script sets up the paths BEFORE the system tools
rem so as to avoid accidentally invoking Windows tools.

rem Set up Cygwin as the fifth item in the search path
path c:\Cygwin\bin;%path%

rem Set up Python as the fourth item in the search path
path c:\Python27;C:\Python27\Scripts;%path%

rem Set up Mingw32 as the third item in the search path
rem Comment out the next line if you're doing 64-bit builds.
path c:\Mingw32\bin;c:\Mingw32\msys\1.0\bin;%path%

rem Set up GnuWin32 as the second item in the search path
rem GnuWin32 must come before MingW32 to get the right Make.
path c:\GnuWin32\bin;%path%

rem Set up Mingw64 as the first item in the search path
rem Comment out the next line if you're doing 32-bit builds.
path c:\Mingw64\bin;%path%
</pre>
</div>

<p><b>Notice:</b> If you are targetting MinGW 32-bit, please leave out the
last pair of lines (<tt>rem Set up MingW64...</tt> and
<tt>path c:\Mingw64\bin;%path%</tt>).</p>

<p><b>Notice:</b> If you are targetting MinGW 64-bit, please leave out the
middle pair of lines (<tt>rem Set up Mingw32...</tt>).</p>

<p>If you want to, you can make two scripts: <tt>setenv32.bat</tt> and
<tt>setenv64.bat</tt>, adapted to each of the two build environments.</p>
</div>

<h2><a name="Testing">Testing the Build Environment</a></h2>
<div>
<p>Before we proceed to setting up the build slave, we need to verify that the
configured environment is actually capable of building LLVM and Clang. 
To this end, we'll manually pull all of LLVM, Clang, and the test suite and
then manually start a build.  Once this has commenced and completed, we
can do the formal steps required to register our new build slave with the LLVM
build master.</p>
</div>

<h3><a name="Pulling">Pulling the Sources</a></h3>
<div>
<p>Open a command-prompt (CMD.EXE, found under Accessories in the Start Menu),
and change to the directory on <tt>D:</tt> where you will be building LLVM:
</p>

<div class="doc_code">
<pre>
d:
md \bld
cd \bld
setenv.bat
</pre>
</div>

<p><b>Notice:</b> If you are only aiming to build LLVM and Clang using MinGW,
you should disable your antivirus solution before proceeding.  Disable it
for at least 15 minutes so that you can pull all sources without interruption.</p>

<p>Now you can pull the sources by using this <tt>CMD.EXE</tt> batch file:</p>

<div class="doc_code">
<pre>
@echo off
rem Pulls (checks out) all LLVM and Clang sources from www.llvm.org

svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm-trunk
if errorlevel 1 goto Error

cd llvm-trunk\tools
if errorlevel 1 goto Error
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
if errorlevel 1 goto Error

cd ..\projects
if errorlevel 1 goto Error
svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
if errorlevel 1 goto Error

svn co http://llvm.org/svn/llvm-project/test-suite/trunk test-suite
if errorlevel 1 goto Error

cd ..\..
if errorlevel 1 goto Error

goto End

:Error
echo Error: Subversion pull failed
goto End

:End
</pre>
</div>

<p>If you want to save yourself some work, you can copy and paste the above
code snippet into a batch file by the name <tt>d:\bld\svnpull.bat</tt> and
then run that batch file.  Then you don't have wait for each command to
complete before pasting the next command.</p>

<p>If everything went okay and there were no error messages, you've
succesfully pulled all of the relevant sources from
<a href="http://www.llvm.org/">www.llvm.org</a>.</p>
</div>

<h3><a name="Makefiles">Making the Makefiles</a></h3>
<div>
<p>Now you just need to initiate the build and then wait for a long while
(about an hour) until everything has been built:</p>

<div class="doc_code">
<pre>
cd \bld
md llvm-build
cd llvm-build
cmake -G "MinGW Makefiles" ..\llvm
</pre>
</div>
</div>

<h3><a name="Building">Building the Sources</a></h3>
<div>
<p>You are now ready to launch the test build:</p>

<div class="doc_code">
<pre>
make -j2
</pre>
</div>

<p>The option <tt>-j2</tt> to Make instructs it to use multiple simultaneous
processes when building so that it builds two files in parallel instead of
just one.  If you have a quad-core system, you can use the value
<tt>-j4</tt> for even faster builds.  If you are using a single-core or
single-processor system, you should leave out the <tt>-j</tt> option
altogether so that Make uses only one process at a time.</p>

<h2><a name="Slavery">Making a Buildbot Slave</a></h2>
<p>This procedure is already well documented in the document
<a href="http://llvm.org/docs/HowToAddABuilder.html">How to Add Your Build
Configuration to LLVM Buildbot Infrastructure</a>, but this document aims to
provide a concise and complete procedure for how to set up a Windows buildbot
slave, so let's go through the few final steps in this rather long process.
</p>
</div>

<h3><a name="Buildbot">Installing the Buildbot Slave</a></h3>
<div>
<p>The process is very simple due to the fact that we have already installed
Python's SetupTools:</p>

<div class="doc_code">
<pre>
cd \bld
mkdir llvm-slave
cd llvm-slave
easy_install virtualenv
virtualenv sandbox
sandbox\scripts\activate
easy_install buildbot-slave
</pre>
</div>

<p>After some downloading and installing, your new
<a href="http://trac.buildbot.net/">Buildbot slave</a> should
now be installed.  Please notice that all dependent packages were
downloaded automatically so that you do not need to worry about installing
<tt>Twisted</tt> and the remainder of packages that <tt>buildbot</tt> uses.
</p>

<div class="doc_code">
<pre>
buildslave create-slave d:\bld\llvm-slave lab.llvm.org:9990 yourname1 password
</pre>
</div>

<p>Please write down or remember <tt>yourname1</tt> and <tt>password</tt>: You
are later going to email them to the build master at LLVM.org.  Also,
please notice that I am so optimistic that I suggested you call your first
build slave for "yourname<b>1</b>": I hope that you will one day add another
build slave and perhaps another one so that LLVM gets all the build power it
ever needs :-).</p>

<p>Now you need to edit two text files so as to provide the LLVM build server
(and especially its staff) cruicial information about you and your system.
  First, change into the directory <tt>info</tt> and edit the file
<tt>admin</tt> (I'm showing you my file, don't reuse it blindly, but edit it
to match your own values):</p>

<div class="doc_code">
<pre>
Mikael Lyngvig <mikael@lyngvig.org>
</pre>
</div>

<p>Save and close the <tt>admin</tt> file and then edit the <tt>host</tt> file
(again, I'm showing you my configuration):</p>

<div class="doc_code">
<pre>
Windows 7 x64
Intel Core 2 Duo 3 GHz with 8 GB RAM

GNU g++ 4.7.1
GNU binutils 2.22
CMake 2.8.8
NO Microsoft Visual Studio installed!
</pre>
</div>
</div>

<h2><a name="Starting">Starting the Buildbot Slave</a></h2>
<div>
<p>Now you just need to verify that you can actually start the buildbot slave:
</p>

<div class="doc_code">
<pre>
buildslave start d:\bld\llvm-slave
</pre>
</div>

<p>To see if it runs, type this command:</p>

<div class="doc_code">
<pre>
tail -f d:\bld\llvm-slave\twistd.log
</pre>
</div>

<p>There should be lots of lines similar to the ones shown below:</p>

<div class="doc_code">
<pre>
2009-07-29 20:59:18+0200 [Broker,client] message from master: attached
2009-07-29 20:59:18+0200 [Broker,client] SlaveBuilder.remote_print(buildbot-full): message from master: attached
2009-07-29 20:59:18+0200 [Broker,client] sending application-level keepalives every 600 seconds
</pre>
</div>

<p>Now hit <tt>Ctrl-C</tt> to abort the slave so that you can finish the last
few steps of this installation guide.</p>
</div>

<h3><a name="Booting">Starting the Slave when Windows Boots</a></h3>
<div>
<p>Now you need to create a new batch file in <tt>d:\bld\startup.bat</tt>:</p>

<div class="doc_code">
<pre>
@echo off
setlocal
call d:\bld\setenv.bat
pushd d:\bld\llvm-slave
call sandbox\scripts\activate
popd
buildslave start d:\bld\llvm-slave
endlocal
</pre>
</div>

<p>Now we're almost at the end of this long process:</p>

<p>Open <tt>Windows Explorer</tt> and Copy and Paste
<tt>c:\Users\Build\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup</tt>
into the <tt>Address</tt> bar at the very top of <tt>Windows Explorer</tt>.
  Then right-click on a white area on the right side of the two panes
that appear, and select <tt>New</tt>, then <tt>Shortcut</tt>, type
<tt>d:\bld\startup.bat</tt> in the edit field that appears, and then hit
<tt>Next</tt> and name it something appropriate such as <tt>Buildslave startup
</tt>.</p>
</div>

<h3><a name="BootTest">Booting the Slave as a Test</a></h3>
<div>
<p>Now you just need to restart your build slave and execute the <tt>tail -f
d:\bld\llvm-slave\twistd.log</tt> command to see whether or not your build
slave has started.  <b>Please do not let your slave run until after you
have received word from the <a href="http://www.llvm.org">LLVM.org</a> build
master that your slave has been accepted as a build slave.</b> 
Otherwise, the build slave will attempt to connect to the LLVM server over and
over again indefinitely until such a time that you stop it again or it is
accepted as a build slave.</p>
</div>

<h3><a name="Registering">Registering the Slave with the LLVM team</a></h3>
<div>
<p>You now need to submit a simple simple patch, which you make with the
<tt>svn diff</tt> command:</p>

<div class="doc_code">
<pre>
cd \bld
svn co http://llvm.org/svn/llvm-project/zorg/trunk zorg
cd zorg\buildbot\osuosl\master\config
(Fire up your editor and edit slaves.py)
</pre>
</div>

<p>Scroll all the way to the bottom, then scroll up again until you are just
above the long list of defunct boxes, where you'll be adding three or four
lines.  I'll show you "my" lines and you then need to figure out what
your lines are:</p>

<div class="doc_code">
<pre>
# Intel(R) Core(TM) 2 Duo, 3.0 GHz, 8 GB RAM, Windows 7 x64, Mingw64
create_slave("milyng1", properties={'jobs': 2}, max_builds=1),

</pre>
</div>

<p>Please notice that the last line is empty - please make an empty line
between your build slave and the list of defunct build slaves.</p>

<p>You also need to update the <tt>builders.py</tt> file in the same directory
as the <tt>slaves.py</tt> file.  Insert just before the list of cross
compilers:</p>

<div class="doc_code">
<pre>

{'name'      : "clang-native-mingw64-win7",
 'slavenames': ["milyng1"],
 'builddir'  : "clang-native-mingw64-win7",
 'factory'   : ClangBuilder.getClangMinGWBuildFactory()},

</pre>
</div>

<p>These are <i>my</i> values; you must change them to reflect your system.</p>

<p>Then you need to make the <tt>svn diff</tt> patch, which you'll submit:</p>

<div class="doc_code">
<pre>
cd \bld\zorg
svn diff
(Verify that the output is okay and that there are only three new lines)
svn diff > ..\zorg.patch
</pre>
</div>
</div>

<h2><a name="Congrats">Congratulations, You Are Now (Almost) an LLVM Builder!
</a></h2>
<div>
<p>All you need to do now is to send off your username (<tt>username1</tt>),
your password (<tt>password</tt>), the path of the root build directory
(<tt>d:\bld</tt>), and the patch we made in the previous chapter to the build
master at <a href="http://www.llvm.org">LLVM.org</a>: Her name is
<a href="mailto:gkistanova@gmail.com">Galina Kistanova</a> and I guess she
has the final say on whether your machine is powerful enough to be admitted
into the exclusive group of LLVM build machines.</p>

<p>If you have comments, critique, ideas, proposals about this article, etc.,
please feel to write the author.</p>
</div>

<h2><a name="AppendixA">Appendix A: CMakefile Snippet Illustrating Link Order
</a></h2>
<div>
<p>Below you'll find a <tt>CMake</tt> snippet kindly contributed by Nathan
Jeffords, which illustrates the link order of the LLVM libraries:</p>

<div class="doc_code">
<pre>
${PLATFORM_LIBS}

#LLVMX86Disassembler
#LLVMX86AsmParser
LLVMX86AsmPrinter
LLVMX86CodeGen
LLVMX86Utils
LLVMX86Desc
LLVMX86Info

LLVMSelectionDAG

LLVMAsmPrinter

#LLVMJIT
#LLVMExecutionEngine

LLVMCodeGen
LLVMScalarOpts
LLVMTransformUtils

#LLVMipa
LLVMAnalysis
LLVMTarget

LLVMMCParser
LLVMMC

LLVMCore
LLVMSupport
</pre>
</div>
</div>

<h2><a name="Debugging">Appendix B: Debugging MinGW Programs on Windows</a></h2>
<div>
<p>You basically have three choices for debugging MinGW programs on Windows
(that I know of!):</p>

<ol>
    <li>GDB - The GNU Debugger.  This is mostly intended for nostalgic
        users who miss early 1980s debugging.</li>
    <li>DDD - The Data Display Debugger.  This requires that you install
        Cygwin, but, hey, you already did that.  If you did not install
        <tt>ddd</tt> when you installed Cygwin, you have to restart the Cygwin
        setup program and then type <tt>ddd</tt> in the search pane, select
        <tt>ddd</tt>, and press Enter to complete the installation. 
        Please notice that I did not manage to get <tt>ddd</tt> to work during
        the initial tries.  I guess it is because I need an X11 server.
          An additional try where I installed an X server didn't work
        either.</li>
    <li>ADG - <a href="http://www.affinic.com/?page_id=109">The Affinic
        Debugger GUI</a>.  I tried this debugger but it only works with
        the Cygwin <tt>gdb</tt>, which does not support x86_64 (64-bit)
        Windows.</li>
</ol>

<p>So, if you want a graphical debugger, you must use Mingw32.</p>

<p>Once you've built all of LLVM and Clang using debug symbols, the default
for Subversion sources, you should be able to fire up the debugger you've
chosen and simply pass the path of the program you want to debug, and any
arguments to it, as the arguments following the program name:</p>

<div class="doc_code">
<pre>
gdb d:\bld\llvm-slave\llvm\bin\clang.exe -c test.c
</pre>
</div>

<p>or</p>

<div class="doc_code">
<pre>
ddd d:\bld\llvm-slave\llvm\bin\clang.exe -c test.c
</pre>
</div>

<p>or</p>

<div class="doc_code">
<pre>
adg d:\bld\llvm-slave\llvm\bin\clang.exe -c test.c
</pre>
</div>

<p>Both of the GUI frontends run on top of <tt>gdb</tt> for which reason they
cannot support executable formats not supported by <tt>gdb</tt>.</p>

<p>Personally, I've long ago gotten used to using simple <tt>printf()</tt>
statements when debugging code.  You may wish to consider that path.
  It works for all languages and on all platforms, every time.  It
does require you to think through what you are doing, because of the expensive
compile/link/execute cycle, but you should always think when debugging.</p>
</div>

<!-- *********************************************************************** -->

<hr>
<address>
  <a href="http://jigsaw.w3.org/css-validator/check/referer"><img
  src="http://jigsaw.w3.org/css-validator/images/vcss-blue" alt="Valid CSS"></a>
  <a href="http://validator.w3.org/check/referer"><img
  src="http://www.w3.org/Icons/valid-html401-blue" alt="Valid HTML 4.01"></a>

  <a href="mailto:mikael@lyngvig.org">Mikael Lyngvig</a><br>
  <a href="http://llvm.org/">The LLVM Compiler Infrastructure</a><br>
  Last modified: $Date: 2012-06-09 06:25:00 +0200 (Sat, 06 Jun 2012) $
</address>

</body>
</html>