<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.12: http://docutils.sourceforge.net/" />
<title>How to build CCTBX on Windows</title>
    
    <link rel="stylesheet" type="text/css" href="css/html4css1.css" />
    <link rel="stylesheet" type="text/css" href="css/stylesheet.css" />
    
  </head>
  <body>
    
    <div id="header">
      <a href="index.html">
        <img src="icons/phenix-logo-small.jpg" alt="PHENIX" />
        <span>
          <strong>P</strong>ython-based
          <strong>H</strong>ierarchical
          <strong>EN</strong>vironment
          for
          <strong>I</strong>ntegrated
          <strong>X</strong>tallography
        </span>
      </a>
    </div>
    
    <div class="document" id="how-to-build-cctbx-on-windows">
<h1 class="title">How to build CCTBX on Windows</h1>
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<ul class="simple">
<li><a class="reference internal" href="#introduction" id="id1">Introduction</a></li>
<li><a class="reference internal" href="#necessary-prerequisites" id="id2">Necessary prerequisites</a><ul>
<li><a class="reference internal" href="#visual-c-9-0" id="id3">Visual C++ 9.0</a></li>
<li><a class="reference internal" href="#openssh-tools" id="id4">OpenSSH tools</a></li>
</ul>
</li>
<li><a class="reference internal" href="#manual-build" id="id5">Manual build</a><ul>
<li><a class="reference internal" href="#from-an-existing-cctbx-installation" id="id6">From an existing CCTBX installation</a></li>
<li><a class="reference internal" href="#from-bootstrap-py" id="id7">From bootstrap.py</a></li>
</ul>
</li>
<li><a class="reference internal" href="#useful-tweaks-for-running-as-a-buildbot-slave" id="id8">Useful tweaks for running as a Buildbot slave</a><ul>
<li><a class="reference internal" href="#automatically-run-script-for-every-command-prompt" id="id9">Automatically run script for every command prompt</a></li>
<li><a class="reference internal" href="#run-a-script-once-at-every-logon" id="id10">Run a script once at every logon</a></li>
</ul>
</li>
<li><a class="reference internal" href="#automated-build-with-buildbot" id="id11">Automated build with Buildbot</a><ul>
<li><a class="reference internal" href="#issue-defining-environment-variables-for-the-compiler" id="id12">Issue defining environment variables for the compiler</a></li>
<li><a class="reference internal" href="#setting-up-a-pc-as-a-buildbot-slave" id="id13">Setting up a PC as a Buildbot slave</a></li>
</ul>
</li>
<li><a class="reference internal" href="#bundling-base-components-together-as-zip-files" id="id14">Bundling base components together as zip files</a></li>
<li><a class="reference internal" href="#important-tweaks-for-shortening-duration-of-builds" id="id15">Important tweaks for shortening duration of builds</a></li>
</ul>
</div>
<div class="section" id="introduction">
<h1><a class="toc-backref" href="#id1">Introduction</a></h1>
<p>This document describes how to build CCTBX from sources on Windows 7 or more recent versions.
We cover how to build manually as well how to build automatically with BuildBot.
Given that Windows does not have all the necessary tools for building CCTBX, how to set up
these tools is covered here in some detail.</p>
<p>A typical CCTBX installation takes up the order of 1Gb disk space. If you build CCTBX
from scratch including an installer this will be of the order of 6Gb.
Throughout this document the &quot;command prompt&quot; (archaichally termed the &quot;DOS prompt&quot; by some)
refers to the commandline interpreter program, cmd.exe, which serves the
same purpose as bash or tcsh on Unix. On the Startup menu it is located in the &quot;Accessories&quot;
group.</p>
</div>
<div class="section" id="necessary-prerequisites">
<h1><a class="toc-backref" href="#id2">Necessary prerequisites</a></h1>
<p>To build CCTBX from scratch the following tools are required:</p>
<blockquote>
<ul class="simple">
<li>Python 2.7 (any version)</li>
<li>Microsoft Visual C++ 9.0 / Microsoft Visual Studio 2008</li>
<li>TortoiseSVN with command line tools ( for updating sources )</li>
<li>TortoiseGit (optionally)</li>
<li>Git ( for updating sources and providing some unix command line tools)</li>
<li>mtee.exe (optionally for duplicating stdout to file and console)</li>
</ul>
</blockquote>
<div class="section" id="visual-c-9-0">
<h2><a class="toc-backref" href="#id3">Visual C++ 9.0</a></h2>
<p>Microsoft Visual Studio 2008 compiler is available for free in the Windows 7
SDK from the Microsoft website:
<a class="reference external" href="https://www.microsoft.com/en-gb/download/details.aspx?id=3138&amp;fa43d42b-25b5-4a42-fe9b-1634f450f5ee=True">https://www.microsoft.com/en-gb/download/details.aspx?id=3138&amp;fa43d42b-25b5-4a42-fe9b-1634f450f5ee=True</a> .
It should be titled &quot;Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1&quot;.
Rather than doing the automated installation from the website it may be convenient to
download the DVD iso image of the SDK and then do the installation
from that. The 32 bit version is named
<tt class="docutils literal">GRMSDK_EN_DVD.iso</tt> whereas the 64 bit version is named <tt class="docutils literal">GRMSDKX_EN_DVD.iso</tt>.
There are newer versions of this SDK for Windows 7. But as these use more recent
C-runtime libraries compiled programs may not be binary compatible with Python 2.7 which
is compiled with Visual C++ 9.0. You would still be able to build individual statically
linked executables with those newer compilers. But whether or not compiled python modules
can run without crashing using a newer runtime is questionable. After installing the
compiler it can be invoked once environment variables have been set by calling scripts
such as <tt class="docutils literal">vcvars32.bat</tt> or <tt class="docutils literal">vcvars64.bat</tt> from a command prompt or in a build script prior
to compiling. These files live in the folder</p>
<pre class="literal-block">
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin
</pre>
</div>
<div class="section" id="openssh-tools">
<h2><a class="toc-backref" href="#id4">OpenSSH tools</a></h2>
<p>The OpenSSH tools used for the Windows build are the ones that come with Git for Windows.
If Git has been installed in</p>
<pre class="literal-block">
C:\Program Files\Git
</pre>
<p>then OpenSSH tools live in the directory</p>
<pre class="literal-block">
C:\Program Files\Git\usr\bin
</pre>
<p>which you must add to the %PATH% environment variable. To have the build run without
interrupts the private keys matching your public keys on the remote svn or git repositories
must be loaded prior to the build with
ssh-agent. Create a .ssh directory in the directory pointed to by the
%USERPROFILE% environment variable and store your private keys there.
Then add the lines</p>
<div id="Layer1" style=
"position:relative; width:90%; height:70px;  left: 4px; top: 0px; overflow: auto; background: #eee;">
<pre class="code">
call "C:\Program Files\Git\cmd\start-ssh-agent.cmd"
SETX SSH_AUTH_SOCK "%SSH_AUTH_SOCK%"
SETX SSH_AGENT_PID "%SSH_AGENT_PID%"
</pre>
</div><p>to your <strong>logon.cmd</strong> file. When you log on it will pick up the private keys in your %USERPROFILE%\.ssh
folder.
If keys require password you will be prompted for them when you logon to the PC. If a key, say
<tt class="docutils literal">mykey_rsa</tt>, is not picked up it can be loaded explicitly by adding the line</p>
<div id="Layer1" style=
"position:relative; width:90%; height:30px;  left: 4px; top: 0px; overflow: auto; background: #eee;">
<pre class="code">
ssh-add mykey_rsa
</pre>
</div><p>just below the above 3 lines.</p>
</div>
</div>
<div class="section" id="manual-build">
<h1><a class="toc-backref" href="#id5">Manual build</a></h1>
<div class="section" id="from-an-existing-cctbx-installation">
<h2><a class="toc-backref" href="#id6">From an existing CCTBX installation</a></h2>
<p>If you want to build CCTBX from an existing installation on Windows located say in
<tt class="docutils literal"><span class="pre">C:\Users\Mike\CCTBX\cctbx-installer-dev-983</span></tt> and do not intend to get updated sources
from remote repositories follow these steps:</p>
<blockquote>
<ol class="arabic simple">
<li>Open a command prompt and go to <tt class="docutils literal"><span class="pre">C:\users\Mike\CCTBX\cctbx-installer-dev-983\build</span></tt>.</li>
<li>Run one of the <tt class="docutils literal">vcvarsXX.bat</tt> scripts <a class="reference external" href="CCTBXBuild.html#Visual-c-9-0">depending on the platform</a> .</li>
<li>Run <tt class="docutils literal">setpaths.bat</tt></li>
<li>Run libtbx.scons -j &lt;nproc&gt;.</li>
</ol>
</blockquote>
</div>
<div class="section" id="from-bootstrap-py">
<h2><a class="toc-backref" href="#id7">From bootstrap.py</a></h2>
<p>Below is a cmd script for manually building CCTBX with bootstrap.py. It first downloads the base
components, HDF5 and Python, installs them, then downloads sources
from external repositories, compiles them, runs tests and finally creates a zipped up bundle
of the sources and the compiled CCTBX files. It is assumed the script is started with command
line arguments specifying platform and ooptionally a version label.</p>
<p><strong>CCTBXBuild.cmd</strong></p>
<div id="Layer1" style=
"position:relative; width:90%; height:400px;  left: 4px; top: 0px; overflow: auto; background: #eee;">
<pre class="code">
@REM Call script with argument x32 or x64 to specify platform. Optional 2nd argument is the release number, e.g. 123.456
@REM

SETLOCAL ENABLEDELAYEDEXPANSION

@REM enable the platform specific compiler and python executable

set MYPLATFORM=%1

IF DEFINED MYPLATFORM (
IF %MYPLATFORM% == x32 (
  call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat"
  set PYTHONEXE=C:\Python27_32\python.exe
)

IF %MYPLATFORM% == x64 (
  call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars64.bat"
  set PYTHONEXE=C:\Python27_64\python.exe
)
)

@REM                  Platform specific compiler and python executable now set
mkdir %MYPLATFORM%
cd %MYPLATFORM%

%PYTHONEXE% -c "import time; print '-' + str((int((time.time() - 1404950400) / (24*60*60))))" > buildnumber.txt
SET /p BUILDNUMBER= < buildnumber.txt
%PYTHONEXE% -c "import time; print 'dev-' + str((int((time.time() - 1404950400) / (24*60*60))))" > version.txt

SET RELEASENUMBER=%2
IF DEFINED RELEASENUMBER (
  SET CCTBXVERSION=!RELEASENUMBER!!BUILDNUMBER!
) ELSE (
  SET CCTBXVERSION=dev!BUILDNUMBER!
)

title Bootstrap %CCTBXVERSION% on %MYPLATFORM%

@REM mkdir %CCTBXVERSION%
@REM cd %CCTBXVERSION%
mkdir Current
del *.log
cd Current

@echo %DATE% %TIME% > ..\build%CCTBXVERSION%-%MYPLATFORM%.log

@REM                           get latest bootstrap.py file
set GETBOOTSTRAP=%3
IF DEFINED GETBOOTSTRAP (
   @echo Get bootstrap.py | mtee /+ ..\build%CCTBXVERSION%-%MYPLATFORM%.log
   ( curl https://raw.githubusercontent.com/cctbx/cctbx_project/master/libtbx/auto_build/bootstrap.py > bootstrap.py ) 2>&1 ^
   | mtee /+ ..\build%CCTBXVERSION%-%MYPLATFORM%.log
)

@REM   with no flags bootstrap defaults to doing cleanup, hot, update, base and build stages
title Bootstrap %CCTBXVERSION% on %MYPLATFORM%  build
@echo %DATE% %TIME% >> ..\build%CCTBXVERSION%-%MYPLATFORM%.log
%PYTHONEXE% bootstrap.py --builder=cctbx --nproc=10  2>&1 ^
 | mtee /+ ..\build%CCTBXVERSION%-%MYPLATFORM%.log
IF ERRORLEVEL 1 (
  GOTO Makesummary
)
@echo %DATE% %TIME% | mtee /+ ..\build%CCTBXVERSION%-%MYPLATFORM%.log

@REM                             run tests
title Bootstrap %CCTBXVERSION% on %MYPLATFORM% tests
@echo %DATE% %TIME% > ..\tests%CCTBXVERSION%-%MYPLATFORM%.log
%PYTHONEXE% bootstrap.py --builder=cctbx --nproc=10 tests 2>&1 ^
 | mtee /+ ..\tests%CCTBXVERSION%-%MYPLATFORM%.log
IF ERRORLEVEL 1 (
  GOTO Makesummary
)
@echo %DATE% %TIME% | mtee /+ ..\tests%CCTBXVERSION%-%MYPLATFORM%.log

@REM                            create installer
title Bootstrap %CCTBXVERSION% on %MYPLATFORM% create_installer
@echo %DATE% %TIME% > ..\CreateInstaller%CCTBXVERSION%-%MYPLATFORM%.log
call build\bin\libtbx.create_installer.bat --binary --version %CCTBXVERSION% ^
 --install_script modules\cctbx_project\libtbx\auto_build\plus_installer.py ^
 --dist_dir dist\%CCTBXVERSION% tmp/cctbx-installer-%CCTBXVERSION%-win7vc90 2>&1 ^
  | mtee /+ ..\CreateInstaller%CCTBXVERSION%-%MYPLATFORM%.log
IF ERRORLEVEL 1 (
  GOTO Makesummary
)
@echo %DATE% %TIME% | mtee /+ ..\CreateInstaller%CCTBXVERSION%-%MYPLATFORM%.log

:Makesummary
@echo %CCTBXVERSION%-%MYPLATFORM% > ..\summary.log
%PYTHONEXE% -c "lines = open('..\\build%CCTBXVERSION%-%MYPLATFORM%.log','r').readlines(); lastlines = lines[(len(lines) - 5): ]; print ''.join(lastlines); " >> ..\summary.log
%PYTHONEXE% -c "lines = open('..\\tests%CCTBXVERSION%-%MYPLATFORM%.log','r').readlines(); lastlines = lines[(len(lines) - 5): ]; print ''.join(lastlines); " >> ..\summary.log
%PYTHONEXE% -c "lines = open('..\\CreateInstaller%CCTBXVERSION%-%MYPLATFORM%.log','r').readlines(); lastlines = lines[(len(lines) - 20): ]; print ''.join(lastlines); " >> ..\summary.log

REM print concatenated summary of logfiles in a message box
type ..\summary.log | msg %USERNAME% /time:86400

@ENDLOCAL
EXIT
</pre>
</div><p>In the above script mtee.exe from <a class="reference external" href="https://ritchielawrence.github.io/mtee/">https://ritchielawrence.github.io/mtee/</a> is used for piping stdout to a
file as well as to the console.
It works similar to tee on Unix platforms. A newer version has been compiled that also retains the
error code of the program that streams to stdout. This is useful when checking for the success of
the builds. Source code and executable is available from <a class="reference external" href="http://oeffner.net/development/Stuff/mtee.zip">http://oeffner.net/development/Stuff/mtee.zip</a>.</p>
</div>
</div>
<div class="section" id="useful-tweaks-for-running-as-a-buildbot-slave">
<h1><a class="toc-backref" href="#id8">Useful tweaks for running as a Buildbot slave</a></h1>
<div class="section" id="automatically-run-script-for-every-command-prompt">
<h2><a class="toc-backref" href="#id9">Automatically run script for every command prompt</a></h2>
<p>On Unix a startup script such as .bashrc or .tcshrc
are convenient for initiating commonly used environment variables for a user.
Windows has a different technique for achieving the same for the command prompt.
In the registry editor, regedit.exe, locate the AutoRun registry key:</p>
<pre class="literal-block">
HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun
</pre>
<p>If there is no AutoRun key present under the &quot;Command Processor&quot; key then create a new one
of type string. The value of this key can be set to the full path of a cmd script you have
written that does something such as defining environment variables for that command prompt.
This script can have any name but we will call it <strong>ntshell.cmd</strong> and store it in path
pointed to by the %HOMEDRIVE%%HOMEPATH% environment variables.</p>
<div class="warning">
<p class="first admonition-title">Warning</p>
<p class="last">Entering wrong values in the registry or accidentally
deleting values may render Windows bricked. Always ensure you have a recent &quot;System Restore&quot;
point in your Windows backup. This will allow you to boot Windows to
&quot;Last known good configuration&quot; if the registry gets corrupted.</p>
</div>
<p>Alternatively one can also define environment variables through the
Control Panel\All Control Panel Items\User Accounts and click on
&quot;Change my enviroment variables&quot;.
But this method is not feasible if there are many variables or some variable values are
deduced on the fly from scripts. This is the case when initialising environment variables for
the compiler.</p>
</div>
<div class="section" id="run-a-script-once-at-every-logon">
<h2><a class="toc-backref" href="#id10">Run a script once at every logon</a></h2>
<p>Say you have a script in the directory pointed to by the %HOMEDRIVE%%HOMEPATH% environment
variables named <strong>logon.cmd</strong> or whatever.
To make this script run once every time you log on to your account, open the Task Scheduler
in the &quot;Administrative tools&quot; group in Control Panel,
click &quot;Create Task&quot;, set &quot;Triggers&quot; to &quot;At logon&quot; and set &quot;Action&quot; to the full path of the
logon.cmd file. This script will then run next time you log on.</p>
</div>
</div>
<div class="section" id="automated-build-with-buildbot">
<h1><a class="toc-backref" href="#id11">Automated build with Buildbot</a></h1>
<p>This section is relevant only if you plan to do automated builds using BuildBot.
Assuming the PC runs as a Buildbot slave builds are automated from the Buildbot master
machine. Required private keys should be loaded in a <strong>logon.cmd</strong> script with ssh-agent and
command prompts must set the compiler environment variables through an <strong>ntshell.cmd</strong> script
as <a class="reference external" href="CCTBXBuild.html#automatically-run-script-for-every-command-prompt">detailed above</a>.</p>
<div class="section" id="issue-defining-environment-variables-for-the-compiler">
<h2><a class="toc-backref" href="#id12">Issue defining environment variables for the compiler</a></h2>
<p>If doing an automated build with Buildbot
all the necessary prerequisites must be accessible from the %PATH% environment from a command prompt.
It is tempting to add the full path of one of the <a class="reference external" href="CCTBXBuild.html#Visual-c-9-0">vcvarsXX.bat scripts</a>  to
<strong>ntshell.cmd</strong>. However, due to a bug in those files this may lead all command prompts to hang in
an infinite loop.
A workaround is to copy vcvars32.bat and vcvars64.bat to the %HOMEDRIVE%%HOMEPATH% folder and
rename them myvcvars32.bat and myvcvars64.bat, respectively. Then replace the lines:</p>
<div id="Layer1" style=
"position:relative; width:90%; height:150px;  left: 4px; top: 0px; overflow: auto; background: #eee;">
<pre class="code">
:GetWindowsSdkDirHelper
@for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Microsoft\Microsoft SDKs\Windows" /v "CurrentInstallFolder"') DO (
  if "%%i"=="CurrentInstallFolder" (
    SET "WindowsSdkDir=%%k"
  )
)
</pre>
</div><p>with</p>
<div id="Layer1" style=
"position:relative; width:90%; height:220px;  left: 4px; top: 0px; overflow: auto; background: #eee;">
<pre class="code">
:GetWindowsSdkDirHelper
SET fname=%TEMP%\tmpSDKvars.txt
reg query "%1\SOFTWARE\Microsoft\Microsoft SDKs\Windows" /v "CurrentInstallFolder" > %fname%

@SET WindowsSdkDir=
@for /F "tokens=1,2*" %%i in (%fname%) DO (
  if "%%i"=="CurrentInstallFolder" (
    SET "WindowsSdkDir=%%k"
  )
)
del %fname%
</pre>
</div><p>then add a line to your <strong>ntshell.cmd</strong> with the full path of myvcvars32.bat or myvcvars64.bat
like:</p>
<pre class="literal-block">
call &quot;C:\Users\builder\myvcvars32.bat&quot;
</pre>
</div>
<div class="section" id="setting-up-a-pc-as-a-buildbot-slave">
<h2><a class="toc-backref" href="#id13">Setting up a PC as a Buildbot slave</a></h2>
<p>The Buildbot slave is installed as per
<a class="reference external" href="http://trac.buildbot.net/wiki/DownloadInstall">online documentation</a>. For instance
for installing a slave named intel-windows-x86_64 in C:\Users\builder\slave chdir to python
installed in C:\Python2.7.9x64 type:</p>
<div id="Layer1" style=
"position:relative; width:90%; height:50px;  left: 4px; top: 0px; overflow: auto; background: #eee;">
<pre class="code">
C:\Python2.7.9x64\Scripts\easy_install.exe buildbot-slave
</pre>
</div><p>and then:</p>
<div id="Layer1" style=
"position:relative; width:90%; height:50px;  left: 4px; top: 0px; overflow: auto; background: #eee;">
<pre class="code">
C:\Python2.7.9x64\Scripts\buildslave create-slave C:\Users\builder\slave cci-vm-6.lbl.gov:9989 intel-windows-x86_64 pass
</pre>
</div><p>which will make it listen to a master on port 9989 from cci-vm-6.lbl.gov. It is possible to
start this slave automatically as a Windows service (equivalent of a Unix daemon) but a simpler
procedure is to add the following line:</p>
<div id="Layer1" style=
"position:relative; width:90%; height:50px;  left: 4px; top: 0px; overflow: auto; background: #eee;">
<pre class="code">
START "Running BuildBot Slave. Do not close!" /MIN cmd /c C:\Python2.7.9x64\Scripts\buildslave start C:\Users\builder\slave
</pre>
</div><p>to your <strong>logon.cmd</strong> script. Once you have logged on this will place an icon of a minimised command
prompt on the taskbar which must not be interfered with, let alone closed. The account can now be
locked (Windows key + L) and is ready for doing regular builds from a Buildbot master.</p>
</div>
</div>
<div class="section" id="bundling-base-components-together-as-zip-files">
<h1><a class="toc-backref" href="#id14">Bundling base components together as zip files</a></h1>
<p>The Windows build does not need to compile Python or the HDF5 library from scratch.
Instead these two components are bundled as separate zip files which bootstrap.py
will download from
<a class="reference external" href="http://cci.lbl.gov/cctbx_dependencies">http://cci.lbl.gov/cctbx_dependencies</a> during the
first stages of the build. The Python bundle has had all the necessary 3rd party modules
added to it for running CCTBX on Windows.
<a class="reference external" href="cctbx_python_HDF5_bundles.html">Click here</a> for details on how these bundles were created
or on how to update this Python bundle with additional modules.</p>
</div>
<div class="section" id="important-tweaks-for-shortening-duration-of-builds">
<h1><a class="toc-backref" href="#id15">Important tweaks for shortening duration of builds</a></h1>
<p>Clear virtual memory at shutdown:
Go to Control Panel\All Control Panel Items\Administrative Tools-&gt;Local Security Policy-&gt;Local Policies-&gt;Security Options-&gt;Shutdown: Clear virtual memory pagefile</p>
<p>Adjust for best performance of background processes:
Check Control Panel\All Control Panel Items\System-&gt;Advanced system settings-&gt;System Properties | Advanced tab-&gt;Performance settings-&gt;Performance Options | Advanced tab-&gt;Adjust for best performance of Background services</p>
<p>Ensure at least weekly disk defragmentation which does not coincide with doing builds.</p>
<p>If used for nightly builds then disable automatic installation of updates as this often triggers an
automatic reboot of the PC. This can be done from the control panel on Windows 7. On
Windows 10 follow the steps described on <a class="reference external" href="http://www.howtogeek.com/224471/how-to-prevent-windows-10-from-automatically-downloading-updates/">http://www.howtogeek.com/224471/how-to-prevent-windows-10-from-automatically-downloading-updates/</a></p>
<p>For the directory where nightly builds are done:</p>
<blockquote>
<ul class="simple">
<li>Exclude it from Windows indexing.</li>
<li>Exclude it from on-access virus scan (both read and write)</li>
<li>Avoid storing several previous builds since NTFS doesn't perform well
when zillions of files are present on the same disc. Zip up previous builds
into single files or move them to a different partition if they have to be retained.</li>
</ul>
</blockquote>
<p>Failure to follow these steps could over time make successive builds very slow (+24 hours)</p>
</div>
</div>
    
  </body>
</html>
