Update the documentation on "How to Release LLVM". It lays out a new way of

tagging and branching for the release. I will update this more throughout the
2.9 release process.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126604 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bill Wendling
2011-02-28 01:10:44 +00:00
parent cdac46d18e
commit 36d6c4d5f6

View File

@ -17,7 +17,8 @@
<div class="doc_author"> <div class="doc_author">
<p>Written by <a href="mailto:tonic@nondot.org">Tanya Lattner</a>, <p>Written by <a href="mailto:tonic@nondot.org">Tanya Lattner</a>,
<a href="mailto:rspencer@x10sys.com">Reid Spencer</a>, <a href="mailto:rspencer@x10sys.com">Reid Spencer</a>,
<a href="mailto:criswell@cs.uiuc.edu">John Criswell</a> <a href="mailto:criswell@cs.uiuc.edu">John Criswell</a>, &amp;
<a href="mailto:wendling@apple.com">Bill Wendling</a>
</p> </p>
</div> </div>
@ -26,44 +27,60 @@
<!-- *********************************************************************** --> <!-- *********************************************************************** -->
<div class="doc_text"> <div class="doc_text">
<p>
This document collects information about successfully releasing LLVM <p>This document contains information about successfully releasing LLVM &mdash;
(including subprojects llvm-gcc and Clang) to the public. including subprojects: e.g., <tt>llvm-gcc</tt> and <tt>clang</tt> &mdash; to
It is the release manager's responsibility to ensure that a high quality the public. It is the Release Manager's responsibility to ensure that a high
build of LLVM is released. quality build of LLVM is released.</p>
</p>
</div> </div>
<!-- *********************************************************************** --> <!-- *********************************************************************** -->
<div class="doc_section"><a name="process">Release Timeline</a></div> <div class="doc_section"><a name="process">Release Timeline</a></div>
<!-- *********************************************************************** --> <!-- *********************************************************************** -->
<div class="doc_text"> <div class="doc_text">
<p>LLVM is released on a time based schedule (currently every 6 months). We
do not have dot releases because of the nature of LLVM incremental
development philosophy. The release schedule is roughly as follows:
</p>
<ol>
<li>Set code freeze and branch creation date for 6 months after last code freeze
date. Announce release schedule to the LLVM community and update the website.</li>
<li>Create release branch and begin release process. </li>
<li>Send out pre-release for first round of testing. Testing will last 7-10 days.
During the first round of testing, regressions should be found and fixed. Patches
are merged from mainline to the release branch.</li>
<li>Generate and send out second pre-release. Bugs found during this time will
not be fixed unless absolutely critical. Bugs introduce by patches merged in
will be fixed and if so, a 3rd round of testing is needed.</li>
<li>The release notes should be updated during the first and second round of
pre-release testing.</li>
<li>Finally, release!</li>
</ol>
</div>
<p>LLVM is released on a time based schedule &mdash; roughly every 6 months. We
do not normally have dot releases because of the nature of LLVM's incremental
development philosophy. That said, the only thing preventing dot releases for
critical bug fixes from happening is a lack of resources &mdash; testers,
machines, time, etc. And, because of the high quality we desire for LLVM
releases, we cannot allow for a truncated form of release qualification.</p>
<p>The release process is roughly as follows:</p>
<ul>
<li><p>Set code freeze and branch creation date for 6 months after last code
freeze date. Announce release schedule to the LLVM community and update
the website.</p></li>
<li><p>Create release branch and begin release process.</p></li>
<li><p>Send out release candidate sources for first round of testing. Testing
lasts 7-10 days. During the first round of testing, any regressions found
should be fixed. Patches are merged from mainline into the release
branch. Also, all features need to be completed during this time. Any
features not completed at the end of the first round of testing will be
removed or disabled for the release.</p></li>
<li><p>Generate and send out the second release candidate sources. Only
<em>critial</em> bugs found during this testing phase will be fixed. Any
bugs introduced by merged patches will be fixed. If so a third round of
testing is needed.</p></li>
<li><p>The release notes are updated.</p></li>
<li><p>Finally, release!</p></li>
</ul>
</div>
<!-- *********************************************************************** --> <!-- *********************************************************************** -->
<div class="doc_section"><a name="process">Release Process</a></div> <div class="doc_section"><a name="process">Release Process</a></div>
<!-- *********************************************************************** --> <!-- *********************************************************************** -->
<div class="doc_text"> <div class="doc_text">
<ol> <ol>
<li><a href="#release-admin">Release Administrative Tasks</a></li> <li><a href="#release-admin">Release Administrative Tasks</a></li>
<ol> <ol>
@ -78,7 +95,6 @@ pre-release testing.</li>
<li><a href="#clangbin">Build the Clang Binary Distribution</a></li> <li><a href="#clangbin">Build the Clang Binary Distribution</a></li>
<li><a href="#target-build">Target Specific Build Details</a></li> <li><a href="#target-build">Target Specific Build Details</a></li>
</ol> </ol>
<li><a href="#release-qualify">Release Qualification Criteria</a></li> <li><a href="#release-qualify">Release Qualification Criteria</a></li>
<ol> <ol>
<li><a href="#llvm-qualify">Qualify LLVM</a></li> <li><a href="#llvm-qualify">Qualify LLVM</a></li>
@ -89,211 +105,256 @@ pre-release testing.</li>
<li><a href="#commTest">Community Testing</a></li> <li><a href="#commTest">Community Testing</a></li>
<li><a href="#release-patch">Release Patch Rules</a></li> <li><a href="#release-patch">Release Patch Rules</a></li>
<li><a href="#release-final">Release final tasks</a></li> <li><a href="#release-final">Release final tasks</a></li>
<ol> <ol>
<li><a href="#updocs">Update Documentation</a></li> <li><a href="#updocs">Update Documentation</a></li>
<li><a href="#tag">Tag the LLVM Release Branch</a></li> <li><a href="#tag">Tag the LLVM Final Release</a></li>
<li><a href="#updemo">Update the LLVM Demo Page</a></li> <li><a href="#updemo">Update the LLVM Demo Page</a></li>
<li><a href="#webupdates">Update the LLVM Website</a></li> <li><a href="#webupdates">Update the LLVM Website</a></li>
<li><a href="#announce">Announce the Release</a></li> <li><a href="#announce">Announce the Release</a></li>
</ol> </ol>
</ol> </ol>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsection"><a name="release-admin"> <div class="doc_subsection"><a name="release-admin">Release Administrative Tasks</a></div>
Release Administrative Tasks</a></div>
<div class="doc_text"> <div class="doc_text">
This section describes a few administrative tasks that need to be done for the
release process to begin. Specifically, it involves creating the release branch, <p>This section describes a few administrative tasks that need to be done for
resetting version numbers, and creating the release tarballs for the release the release process to begin. Specifically, it involves:</p>
team to begin testing.
<ul>
<li>Creating the release branch,</li>
<li>Setting version numbers, and</li>
<li>Tagging release candidates for the release team to begin testing</li>
</ul>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="branch">Create Release Branch</a></div> <div class="doc_subsubsection"><a name="branch">Create Release Branch</a></div>
<div class="doc_text"> <div class="doc_text">
<p>Branch the Subversion HEAD using the following procedure:</p>
<p>Branch the Subversion trunk using the following procedure:</p>
<ol> <ol>
<li> <li><p>Remind developers that the release branching is imminent and to refrain
<p>Verify that the current Subversion HEAD is in decent shape by examining from committing patches that might break the build. E.g., new features,
nightly tester or buildbot results.</p></li> large patches for works in progress, an overhaul of the type system, an
<li> exciting new TableGen feature, etc.</p></li>
<p>Request all developers to refrain from committing. Offenders get commit
rights taken away (temporarily).</p></li> <li><p>Verify that the current Subversion trunk is in decent shape by
<li> examining nightly tester and buildbot results.</p></li>
<p> Create the release branch for <tt>llvm</tt>, <tt>llvm-gcc4.2</tt>,
<tt>clang</tt>, and the <tt>test-suite</tt>. The branch name will be <li><p>Create the release branch for <tt>llvm</tt>, <tt>llvm-gcc-4.2</tt>,
<tt>release_XX</tt>,where <tt>XX</tt> is the major and minor release numbers. <tt>clang</tt>, and the <tt>test-suite</tt> from the last known good
<tt>Clang</tt> will have a different release number than <tt>llvm</tt>/ revision. The branch's name is <tt>release_XY</tt>, where <tt>X</tt> is
<tt>llvm-gcc4</tt> since its first release was years later the major and <tt>Y</tt> the minor release numbers. The branches should be
(still deciding if this will be true or not). These branches created using the following commands:</p>
can be created without checking out anything from subversion.
</p>
<div class="doc_code"> <div class="doc_code">
<pre> <pre>
svn copy https://llvm.org/svn/llvm-project/llvm/trunk \ $ svn copy https://llvm.org/svn/llvm-project/llvm/trunk \
https://llvm.org/svn/llvm-project/llvm/branches/release_<i>XX</i> https://llvm.org/svn/llvm-project/llvm/branches/release_<i>XY</i>
svn copy https://llvm.org/svn/llvm-project/llvm-gcc-4.2/trunk \
https://llvm.org/svn/llvm-project/llvm-gcc-4.2/branches/release_<i>XX</i>
svn copy https://llvm.org/svn/llvm-project/test-suite/trunk \
https://llvm.org/svn/llvm-project/test-suite/branches/release_<i>XX</i>
svn copy https://llvm.org/svn/llvm-project/cfe/trunk \
https://llvm.org/svn/llvm-project/cfe/branches/release_<i>XX</i>
</pre>
</div>
<li> $ svn copy https://llvm.org/svn/llvm-project/llvm-gcc-4.2/trunk \
<p>Advise developers they can work on Subversion HEAD again.</p></li> https://llvm.org/svn/llvm-project/llvm-gcc-4.2/branches/release_<i>XY</i>
<li> $ svn copy https://llvm.org/svn/llvm-project/test-suite/trunk \
<p>The Release Manager should switch to the release branch (as all changes https://llvm.org/svn/llvm-project/test-suite/branches/release_<i>XY</i>
to the release will now be done in the branch). The easiest way to do this
is to grab another working copy using the following commands:</p>
<div class="doc_code"> $ svn copy https://llvm.org/svn/llvm-project/cfe/trunk \
<pre> https://llvm.org/svn/llvm-project/cfe/branches/release_<i>XY</i>
svn co https://llvm.org/svn/llvm-project/llvm/branches/release_<i>XX</i>
svn co https://llvm.org/svn/llvm-project/llvm-gcc-4.2/branches/release_<i>XX</i>
svn co https://llvm.org/svn/llvm-project/test-suite/branches/release_<i>XX</i>
svn co https://llvm.org/svn/llvm-project/cfe/branches/release_<i>XX</i>
</pre> </pre>
</div></li> </div></li>
<li><p>Advise developers that they may now check their patches into the
Subversion tree again.</p></li>
<li><p>The Release Manager should switch to the release branch, because all
changes to the release will now be done in the branch. The easiest way to
do this is to grab a working copy using the following commands:</p>
<div class="doc_code">
<pre>
$ svn co https://llvm.org/svn/llvm-project/llvm/branches/release_<i>XY</i> llvm-<i>X.Y</i>
$ svn co https://llvm.org/svn/llvm-project/llvm-gcc-4.2/branches/release_<i>XY</i> llvm-gcc-4.2-<i>X.Y</i>
$ svn co https://llvm.org/svn/llvm-project/test-suite/branches/release_<i>XY</i> test-suite-<i>X.Y</i>
$ svn co https://llvm.org/svn/llvm-project/cfe/branches/release_<i>XY</i> clang-<i>X.Y</i>
</pre>
</div></li>
</ol> </ol>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="verchanges">Update LLVM Version</a></div> <div class="doc_subsubsection"><a name="verchanges">Update LLVM Version</a></div>
<div class="doc_text"> <div class="doc_text">
<p>
After creating the LLVM release branch, update the release branches' <p>After creating the LLVM release branch, update the release branches'
autoconf/configure.ac version from X.Xsvn to just X.X. Update it on mainline <tt>autoconf</tt> and <tt>configure.ac</tt> versions from '<tt>X.Ysvn</tt>'
as well to be the next version (X.X+1svn). Regenerated the configure script to '<tt>X.Y</tt>'. Update it on mainline as well to be the next version
for both. This must be done for both <tt>llvm</tt> and the ('<tt>X.Y+1svn</tt>'). Regenerate the configure scripts for both
<tt>test-suite</tt>. <tt>llvm</tt> and the <tt>test-suite</tt>.</p>
</p>
<p>FIXME: Add a note about <tt>clang</tt>.</p> <p>In addition, the version numbers of all the Bugzilla components must be
<p>In addition, the version number of all the Bugzilla components must be updated for the next release.</p>
updated for the next release.
</p>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="dist">Build the LLVM Source Distributions</a></div> <div class="doc_subsubsection"><a name="dist">Build the LLVM Release Candidates</a></div>
<div class="doc_text"> <div class="doc_text">
<p>
Create source distributions for <tt>LLVM</tt>, <tt>LLVM-GCC</tt>, <p>Create release candidates for <tt>llvm</tt>, <tt>llvm-gcc</tt>,
<tt>clang</tt>, and the llvm <tt>test-suite</tt> by exporting the source from <tt>clang</tt>, and the LLVM <tt>test-suite</tt> by tagging the branch with
Subversion and archiving it. This can be done with the following commands: the respective release candidate number. For instance, to create <b>Release
</p> Candidate 1</b> you would issue the following commands:</p>
<div class="doc_code"> <div class="doc_code">
<pre> <pre>
svn export https://llvm.org/svn/llvm-project/llvm/branches/release_<i>XX</i> llvm-X.X $ svn mkdir https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_<i>XY</i>
svn export https://llvm.org/svn/llvm-project/llvm-gcc-4.2/branches/release_<i>XX</i> llvm-gcc4.2-X.X.source $ svn copy https://llvm.org/svn/llvm-project/llvm/branches/release_<i>XY</i> \
svn export https://llvm.org/svn/llvm-project/test-suite/branches/release_<i>XX</i> llvm-test-X.X https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_<i>XY</i>/RC1
svn export https://llvm.org/svn/llvm-project/cfe/branches/release_<i>XX</i> clang-X.X
tar -czvf - llvm-X.X | gzip &gt; llvm-X.X.tar.gz $ svn mkdir https://llvm.org/svn/llvm-project/llvm-gcc-4.2/tags/RELEASE_<i>XY</i>
tar -czvf - llvm-test-X.X | gzip &gt; llvm-test-X.X.tar.gz $ svn copy https://llvm.org/svn/llvm-project/llvm-gcc-4.2/branches/release_<i>XY</i> \
tar -czvf - llvm-gcc4.2-X.X.source | gzip &gt; llvm-gcc-4.2-X.X.source.tar.gz https://llvm.org/svn/llvm-project/llvm-gcc-4.2/tags/RELEASE_<i>XY</i>/RC1
tar -czvf - clang-X.X | gzip &gt; clang-X.X.tar.gz
$ svn mkdir https://llvm.org/svn/llvm-project/test-suite/tags/RELEASE_<i>XY</i>
$ svn copy https://llvm.org/svn/llvm-project/test-suite/branches/release_<i>XY</i> \
https://llvm.org/svn/llvm-project/test-suite/tags/RELEASE_<i>XY</i>/RC1
$ svn mkdir https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_<i>XY</i>
$ svn copy https://llvm.org/svn/llvm-project/cfe/branches/release_<i>XY</i> \
https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_<i>XY</i>/RC1
</pre> </pre>
</div> </div>
<p>Similarly, <b>Release Candidate 2</b> would be named <tt>RC2</tt> and so
on. This keeps a permanent copy of the release candidate around for people to
export and build as they wish. The final released sources will be tagged in
the <tt>RELEASE_<i>XY</i></tt> directory as <tt>Final</tt>
(c.f. <a href="#tag">Tag the LLVM Final Release</a>).</p>
<p>The Release Manager may supply pre-packaged source tarballs for users. This
can be done with the following commands:</p>
<div class="doc_code">
<pre>
$ svn export https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_<i>XY</i>/RC1 llvm-<i>X.Y</i>rc1
$ svn export https://llvm.org/svn/llvm-project/llvm-gcc-4.2/tags/RELEASE_<i>XY</i>/RC1 llvm-gcc4.2-<i>X.Y</i>rc1
$ svn export https://llvm.org/svn/llvm-project/test-suite/tags/RELEASE_<i>XY</i>/RC1 llvm-test-<i>X.Y</i>rc1
$ svn export https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_<i>XY</i>/RC1 clang-<i>X.Y</i>rc1
$ tar -czvf - llvm-<i>X.Y</i>rc1 | gzip &gt; llvm-<i>X.Y</i>rc1.src.tar.gz
$ tar -czvf - llvm-test-<i>X.Y</i>rc1 | gzip &gt; llvm-test-<i>X.Y</i>rc1.src.tar.gz
$ tar -czvf - llvm-gcc4.2-<i>X.Y</i>rc1 | gzip &gt; llvm-gcc-4.2-<i>X.Y</i>rc1.src.tar.gz
$ tar -czvf - clang-<i>X.Y</i>rc1 | gzip &gt; clang-<i>X.Y</i>rc1.src.tar.gz
</pre>
</div>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsection"><a name="release-build"> <div class="doc_subsection"><a name="release-build">Building the Release</a></div>
Building the Release</a></div>
<div class="doc_text"> <div class="doc_text">
The build of <tt>llvm</tt>, <tt>llvm-gcc</tt>, and <tt>clang</tt> must be free
of errors and warnings in both debug, release+asserts, and release builds.
If all builds are clean, then the release passes build qualification.
<ol> <p>The builds of <tt>llvm</tt>, <tt>llvm-gcc</tt>, and <tt>clang</tt>
<li>debug: ENABLE_OPTIMIZED=0</li> <em>must</em> be free of errors and warnings in Debug, Release+Asserts, and
<li>release+asserts: ENABLE_OPTIMIZED=1</li> Release builds. If all builds are clean, then the release passes Build
<li>release: ENABLE_OPTIMIZED=1 DISABLE_ASSERTIONS=1</li> Qualification.</p>
</ol>
<p>The <tt>make</tt> options for building the different modes:</p>
<table>
<tr><th>Mode</th><th>Options</th></tr>
<tr align="left"><td>Debug</td><td><tt>ENABLE_OPTIMIZED=0</tt></td></tr>
<tr align="left"><td>Release+Asserts</td><td><tt>ENABLE_OPTIMIZED=1</tt></td></tr>
<tr align="left"><td>Release</td><td><tt>ENABLE_OPTIMIZED=1 DISABLE_ASSERTIONS=1</tt></td></tr>
</table>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="build">Build LLVM</a></div> <div class="doc_subsubsection"><a name="build">Build LLVM</a></div>
<div class="doc_text"> <div class="doc_text">
<p>
Build both debug, release+asserts (optimized), and release versions of <p>Build <tt>Debug</tt>, <tt>Release+Asserts</tt>, and <tt>Release</tt> versions
LLVM on all supported platforms. Direction to build llvm are of <tt>llvm</tt> on all supported platforms. Directions to build
<a href="http://llvm.org/docs/GettingStarted.html#quickstart">here</a>. <tt>llvm</tt> are
</p> <a href="http://llvm.org/docs/GettingStarted.html#quickstart">here</a>.</p>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="llvmgccbin">Build the LLVM GCC Binary Distribution</a></div> <div class="doc_subsubsection"><a name="llvmgccbin">Build the LLVM GCC Binary Distribution</a></div>
<div class="doc_text"> <div class="doc_text">
<p>
Creating the LLVM GCC binary distribution (release/optimized) requires <p>Creating the <tt>llvm-gcc</tt> binary distribution (Release/Optimized)
performing the following steps for each supported platform: requires performing the following steps for each supported platform:</p>
</p>
<ol> <ol>
<li> <li><p>Build the <tt>llvm-gcc</tt> front-end by following the directions in
Build the LLVM GCC front-end by following the directions in the README.LLVM the <tt>README.LLVM</tt> file. The front-end must be compiled with C, C++,
file. The frontend must be compiled with c, c++, objc (mac only), Objective-C (Mac only), Objective-C++ (Mac only), and Fortran
objc++ (mac only) and fortran support. </li> support.</p></li>
<li>Please boostrap as well.</li>
<li>Be sure to build with LLVM_VERSION_INFO=X.X, where X is the major and
minor release numbers.
</li>
<li> <li><p>Boostrapping must be enabled.</p></li>
Copy the installation directory to a directory named for the specific target.
For example on Red Hat Enterprise Linux, the directory would be named <li><p>Be sure to build with <tt>LLVM_VERSION_INFO=X.Y</tt>, where <tt>X</tt>
<tt>llvm-gcc4.2-2.6-x86-linux-RHEL4</tt>. Archive and compress the new directory. is the major and <tt>Y</tt> is the minor release numbers.</p></li>
</li>
<li><p>Copy the installation directory to a directory named for the specific
target. For example on Red Hat Enterprise Linux, the directory would be
named <tt>llvm-gcc4.2-2.6-x86-linux-RHEL4</tt>. Archive and compress the
new directory.</p></li>
</ol> </ol>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="clangbin">Build Clang <div class="doc_subsubsection"><a name="clangbin">Build Clang Binary Distribution</a></div>
Binary Distribution</a></div>
<div class="doc_text"> <div class="doc_text">
<p>
Creating the Clang binary distribution (debug/release/release) requires <p>Creating the <tt>clang</tt> binary distribution
performing the following steps for each supported platform: (Debug/Release+Asserts/Release) requires performing the following steps for
</p> each supported platform:</p>
<ol> <ol>
<li> <li>Build clang according to the directions
Build clang according to the directions <a href="http://clang.llvm.org/get_started.html">here</a>.</li>
<a href="http://clang.llvm.org/get_started.html">here</a>.
</li>
<li>Build both a debug and release version of clang, but the binary <li>Build both a debug and release version of clang. The binary will be the
will be a release build.</lI> release build.</lI>
<li> <li>Package <tt>clang</tt> (details to follow).</li>
Package clang (details to follow).
</li>
</ol> </ol>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="target-build">Target Specific Build <div class="doc_subsubsection"><a name="target-build">Target Specific Build Details</a></div>
Details</a></div>
<div class="doc_text"> <div class="doc_text">
<p>
The table below specifies which compilers are used for each arch/os combination <p>The table below specifies which compilers are used for each Arch/OS
when qualifying the build of <tt>llvm</tt>, <tt>llvm-gcc</tt>, <tt>clang. combination when qualifying the build of <tt>llvm</tt>, <tt>llvm-gcc</tt>,
</tt></p> and <tt>clang</tt>.</p>
<p>
<table> <table>
<tr><th>Architecture</th><th>OS</th><th>compiler</th></tr> <tr><th>Architecture</th><th>OS</th><th>compiler</th></tr>
<tr><td>x86-32</td><td>Mac OS 10.5</td><td>gcc 4.0.1</td></tr> <tr><td>x86-32</td><td>Mac OS 10.5</td><td>gcc 4.0.1</td></tr>
@ -303,209 +364,251 @@ Details</a></div>
<tr><td>x86-64</td><td>Mac OS 10.5</td><td>gcc 4.0.1</td></tr> <tr><td>x86-64</td><td>Mac OS 10.5</td><td>gcc 4.0.1</td></tr>
<tr><td>x86-64</td><td>Linux</td><td>gcc 4.2.X, gcc 4.3.X</td></tr> <tr><td>x86-64</td><td>Linux</td><td>gcc 4.2.X, gcc 4.3.X</td></tr>
<tr><td>x86-64</td><td>FreeBSD</td><td>gcc 4.2.X</td></tr> <tr><td>x86-64</td><td>FreeBSD</td><td>gcc 4.2.X</td></tr>
</table> </table>
</p>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsection"><a name="release-qualify"> <div class="doc_subsection"><a name="release-qualify">
Building the Release</a></div> Building the Release</a></div>
<div class="doc_text"> <div class="doc_text">
A release is qualified when it has no regressions from the previous
release (or baseline). Regressions are related to correctness only and not
performance at this time. <b>Regressions are new failures in the set of tests that
are used to qualify each product and only include things on the list.
Ultimately, there is no end to the number of possible bugs in a release. We
need a very concrete and definitive release criteria that ensures we have
monotonically improving quality on some metric. The metric we use is
described below. This doesn't mean that we don't care about other things,
but this are things that must be satisfied before a release can go out</b>
</div>
<p>A release is qualified when it has no regressions from the previous release
(or baseline). Regressions are related to correctness first and performance
second. (We may tolerate some minor performance regressions if they are
deemed necessary for the general quality of the compiler.)</p>
<p><b>Regressions are new failures in the set of tests that are used to qualify
each product and only include things on the list. Every release will have
some bugs in it. It is the reality of developing a complex piece of
software. We need a very concrete and definitive release criteria that
ensures we have monotonically improving quality on some metric. The metric we
use is described below. This doesn't mean that we don't care about other
criteria, but these are the criteria which we found to be most important and
which must be satisfied before a release can go out</b></p>
</div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="llvm-qualify">Qualify LLVM</a></div> <div class="doc_subsubsection"><a name="llvm-qualify">Qualify LLVM</a></div>
<div class="doc_text"> <div class="doc_text">
<p>
LLVM is qualified when it has a clean dejagnu test run without a frontend and <p>LLVM is qualified when it has a clean test run without a front-end. And it
it has no regressions when using either <tt>llvm-gcc</tt> or <tt>clang</tt> has no regressions when using either <tt>llvm-gcc</tt> or <tt>clang</tt> with
with the <tt>test-suite</tt> from the previous release. the <tt>test-suite</tt> from the previous release.</p>
</p>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="llvmgcc-qualify">Qualify LLVM-GCC</a></div> <div class="doc_subsubsection"><a name="llvmgcc-qualify">Qualify LLVM-GCC</a></div>
<div class="doc_text"> <div class="doc_text">
<p>
<tt>LLVM-GCC</tt> is qualified when front-end specific tests in the <p><tt>LLVM-GCC</tt> is qualified when front-end specific tests in the
<tt>llvm</tt> dejagnu test suite all pass and there are no regressions in <tt>llvm</tt> regression test suite all pass and there are no regressions in
the <tt>test-suite</tt>.</p> the <tt>test-suite</tt>.</p>
<p>We do not use the gcc dejagnu test suite as release criteria.</p>
<p>We do not use the GCC DejaGNU test suite as release criteria.</p>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="clang-qualify">Qualify Clang</a></div> <div class="doc_subsubsection"><a name="clang-qualify">Qualify Clang</a></div>
<div class="doc_text"> <div class="doc_text">
<tt>Clang</tt> is qualified when front-end specific tests in the
<p><tt>Clang</tt> is qualified when front-end specific tests in the
<tt>llvm</tt> dejagnu test suite all pass, clang's own test suite passes <tt>llvm</tt> dejagnu test suite all pass, clang's own test suite passes
cleanly, and there are no regressions in the <tt>test-suite</tt>.</p> cleanly, and there are no regressions in the <tt>test-suite</tt>.</p>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="targets">Specific Target <div class="doc_subsubsection"><a name="targets">Specific Target
Qualification Details</a></div> Qualification Details</a></div>
<div class="doc_text"> <div class="doc_text">
<p><table>
<tr><th>Architecture</th><th>OS</th><th>llvm-gcc baseline</th><th>clang baseline <table>
</th><th>tests</th></tr> <tr><th>Architecture</th><th>OS</th><th>llvm-gcc baseline</th><th>clang baseline</th><th>tests</th></tr>
<tr><td>x86-32</td><td>Linux</td><td>last release</td><td>last release</td><td>llvm dejagnu, clang tests, test-suite (including spec)</td></tr> <tr><td>x86-32</td><td>Linux</td><td>last release</td><td>last release</td><td>llvm dejagnu, clang tests, test-suite (including spec)</td></tr>
<tr><td>x86-32</td><td>FreeBSD</td><td>none</td><td>last release</td><td>llvm dejagnu, clang tests, test-suite</td></tr> <tr><td>x86-32</td><td>FreeBSD</td><td>none</td><td>last release</td><td>llvm dejagnu, clang tests, test-suite</td></tr>
<tr><td>x86-32</td><td>mingw</td><td>last release</td><td>none</td><td>QT</td></tr> <tr><td>x86-32</td><td>mingw</td><td>last release</td><td>none</td><td>QT</td></tr>
<tr><td>x86-64</td><td>Mac OS 10.X</td><td>last release</td><td>last release</td><td>llvm dejagnu, clang tests, test-suite (including spec)</td></tr> <tr><td>x86-64</td><td>Mac OS 10.X</td><td>last release</td><td>last release</td><td>llvm dejagnu, clang tests, test-suite (including spec)</td></tr>
<tr><td>x86-64</td><td>Linux</td><td>last release</td><td>last release</td><td>llvm dejagnu, clang tests, test-suite (including spec)</td></tr> <tr><td>x86-64</td><td>Linux</td><td>last release</td><td>last release</td><td>llvm dejagnu, clang tests, test-suite (including spec)</td></tr>
<tr><td>x86-64</td><td>FreeBSD</td><td>none</td><td>last release</td><td>llvm dejagnu, clang tests, test-suite</td></tr> <tr><td>x86-64</td><td>FreeBSD</td><td>none</td><td>last release</td><td>llvm dejagnu, clang tests, test-suite</td></tr>
</table></p> </table>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsection"><a name="commTest">Community Testing</a></div> <div class="doc_subsection"><a name="commTest">Community Testing</a></div>
<div class="doc_text"> <div class="doc_text">
<p>
Once all testing has been completed and appropriate bugs filed, the pre-release <p>Once all testing has been completed and appropriate bugs filed, the release
tar balls may be put on the website and the LLVM community is notified. Ask that candidate tarballs are put on the website and the LLVM community is
all LLVM developers test the release in 2 ways:</p> notified. Ask that all LLVM developers test the release in 2 ways:</p>
<ol> <ol>
<li>Download llvm-X.X, llvm-test-X.X, and the appropriate llvm-gcc4 <li>Download <tt>llvm-<i>X.Y</i></tt>, <tt>llvm-test-<i>X.Y</i></tt>, and the
and/or clang binary. Build LLVM. appropriate <tt>llvm-gcc</tt> and/or <tt>clang</tt> binary. Build
Run "make check" and the full llvm-test suite (make TEST=nightly report).</li> LLVM. Run <tt>make check</tt> and the full LLVM test suite (<tt>make
<li>Download llvm-X.X, llvm-test-X.X, and the llvm-gcc4 and/or clang source. TEST=nightly report</tt>).</li>
Compile everything. Run "make check" and the full llvm-test suite (make TEST=nightly
report).</li> <li>Download <tt>llvm-<i>X.Y</i></tt>, <tt>llvm-test-<i>X.Y</i></tt>, and the
<tt>llvm-gcc</tt> and/or <tt>clang</tt> source. Compile everything. Run
<tt>make check</tt> and the full LLVM test suite (<tt>make TEST=nightly
report</tt>).</li>
</ol> </ol>
<p>Ask LLVM developers to submit the report and make check results to the list.
Attempt to verify that there are no regressions from the previous release.
The results are not used to qualify a release, but to spot other potential
problems. For unsupported targets, verify that make check at least is
clean.</p>
<p>During the first round of testing time, <p>Ask LLVM developers to submit the test suite report and <tt>make check</tt>
all regressions must be fixed before the second pre-release is created.</p> results to the list. Verify that there are no regressions from the previous
release. The results are not used to qualify a release, but to spot other
potential problems. For unsupported targets, verify that <tt>make check</tt>
is at least clean.</p>
<p>During the first round of testing, all regressions must be fixed before the
second release candidate is tagged.</p>
<p>If this is the second round of testing, the testing is only to ensure that
bug fixes previously merged in have not created new major problems. <i>This
is not the time to solve additional and unrelated bugs!</i> If no patches are
merged in, the release is determined to be ready and the release manager may
move onto the next stage.</p>
<p>If this is the second round of testing, this is only to ensure the bug
fixes previously merged in have not created new major problems. This is not
the time to solve additional and unrelated bugs. If no patches are merged in,
the release is determined to be ready and the release manager may move onto
the next step.
</p>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsection"><a name="release-patch">Release Patch Rules <div class="doc_subsection"><a name="release-patch">Release Patch Rules</a></div>
</a></div>
<div class="doc_text"> <div class="doc_text">
<p>
Below are the rules regarding patching the release branch.</p>
<p>
<li>Patches applied to the release branch are only applied by the release
manager.</li>
<li>During the first round of testing, patches that fix regressions or that
are small and relatively risk free (verified by the appropriate code owner)
are applied to the branch. Code owners are asked to be very conservative in
approving patches for the branch and we reserve the right to reject any patch
that does not fix a regression as previously defined.</li>
<li>During the remaining rounds of testing, only patches that fix regressions
may be applied.</li>
</p> <p>Below are the rules regarding patching the release branch:</p>
<ol>
<li><p>Patches applied to the release branch may only be applied by the
release manager.</p></li>
<li><p>During the first round of testing, patches that fix regressions or that
are small and relatively risk free (verified by the appropriate code
owner) are applied to the branch. Code owners are asked to be very
conservative in approving patches for the branch. We reserve the right to
reject any patch that does not fix a regression as previously
defined.</p></li>
<li><p>During the remaining rounds of testing, only patches that fix critical
regressions may be applied.</p></li>
</ol>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsection"><a name="release-final">Release Final Tasks <div class="doc_subsection"><a name="release-final">Release Final Tasks
</a></div> </a></div>
<div class="doc_text"> <div class="doc_text">
<p>
The final stages of the release process involving tagging the release branch, <p>The final stages of the release process involves tagging the "final" release
updating documentation that refers to the release, and updating the demo branch, updating documentation that refers to the release, and updating the
page.</p> demo page.</p>
<p>FIXME: Add a note if anything needs to be done to the clang website.
Eventually the websites will be merged hopefully.</p>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="updocs">Update Documentation</a></div> <div class="doc_subsubsection"><a name="updocs">Update Documentation</a></div>
<div class="doc_text"> <div class="doc_text">
<p>
Review the documentation and ensure that it is up to date. The Release Notes <p>Review the documentation and ensure that it is up to date. The "Release
must be updated to reflect bug fixes, new known issues, and changes in the Notes" must be updated to reflect new features, bug fixes, new known issues,
list of supported platforms. The Getting Started Guide should be updated to and changes in the list of supported platforms. The "Getting Started Guide"
reflect the new release version number tag avaiable from Subversion and should be updated to reflect the new release version number tag avaiable from
changes in basic system requirements. Merge both changes from mainline into Subversion and changes in basic system requirements. Merge both changes from
the release branch. mainline into the release branch.</p>
</p>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="tag">Tag the Release Branch</a></div> <div class="doc_subsubsection"><a name="tag">Tag the LLVM Final Release</a></div>
<div class="doc_text"> <div class="doc_text">
<p>Tag the release branch using the following procedure:</p>
<p>Tag the final release sources using the following procedure:</p>
<div class="doc_code"> <div class="doc_code">
<pre> <pre>
svn copy https://llvm.org/svn/llvm-project/llvm/branches/release_XX \ $ svn copy https://llvm.org/svn/llvm-project/llvm/branches/release_XY \
https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_<i>XX</i> https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_<i>XY</i>/Final
svn copy https://llvm.org/svn/llvm-project/llvm-gcc-4.2/branches/release_XX \
https://llvm.org/svn/llvm-project/llvm-gcc-4.2/tags/RELEASE_<i>XX</i> $ svn copy https://llvm.org/svn/llvm-project/llvm-gcc-4.2/branches/release_XY \
svn copy https://llvm.org/svn/llvm-project/test-suite/branches/release_XX \ https://llvm.org/svn/llvm-project/llvm-gcc-4.2/tags/RELEASE_<i>XY</i>/Final
https://llvm.org/svn/llvm-project/test-suite/tags/RELEASE_<i>XX</i>
$ svn copy https://llvm.org/svn/llvm-project/test-suite/branches/release_XY \
https://llvm.org/svn/llvm-project/test-suite/tags/RELEASE_<i>XY</i>/Final
$ svn copy https://llvm.org/svn/llvm-project/cfe/branches/release_XY \
https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_<i>XY</i>/Final
</pre> </pre>
</div> </div>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsection"><a name="updemo">Update the LLVM Demo Page</a></div> <div class="doc_subsection"><a name="updemo">Update the LLVM Demo Page</a></div>
<div class="doc_text"> <div class="doc_text">
<p>
The LLVM demo page must be updated to use the new release. This consists of <p>The LLVM demo page must be updated to use the new release. This consists of
using the llvm-gcc binary and building LLVM. Update the website demo page using the new <tt>llvm-gcc</tt> binary and building LLVM.</p>
configuration to use the new release.</p>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="webupdates">Update the LLVM Website</a></div> <div class="doc_subsubsection"><a name="webupdates">Update the LLVM Website</a></div>
<div class="doc_text"> <div class="doc_text">
<p>
The website must be updated before the release announcement is sent out. Here is <p>The website must be updated before the release announcement is sent out. Here
what to do:</p> is what to do:</p>
<ol> <ol>
<li> Check out the <tt>website</tt> module from CVS. </li> <li>Check out the <tt>www</tt> module from Subversion.</li>
<li> Create a new subdirectory X.X in the releases directory. </li>
<li>Create a new subdirectory <tt>X.Y</tt> in the releases directory.</li>
<li>Commit the <tt>llvm</tt>, <tt>test-suite</tt>, <tt>llvm-gcc</tt> source, <li>Commit the <tt>llvm</tt>, <tt>test-suite</tt>, <tt>llvm-gcc</tt> source,
<tt>clang source</tt>, <tt>clang binaries</tt>, <tt>clang source</tt>, <tt>clang binaries</tt>, and <tt>llvm-gcc</tt>
and <tt>llvm-gcc</tt> binaries in this new directory. </li> binaries in this new directory.</li>
<li> Copy and commit the <tt>llvm/docs</tt> and <tt>LICENSE.txt</tt>
files into this new directory. The docs should be built with BUILD_FOR_WEBSITE=1.</li> <li>Copy and commit the <tt>llvm/docs</tt> and <tt>LICENSE.txt</tt> files
<li> Commit the index.html to the release/X.X directory to redirect (use from previous into this new directory. The docs should be built with
release. </li> <tt>BUILD_FOR_WEBSITE=1</tt>.</li>
<li>Commit the <tt>index.html</tt> to the <tt>release/X.Y</tt> directory to
redirect (use from previous release.</li>
<li>Update the <tt>releases/download.html</tt> file with the new release.</li> <li>Update the <tt>releases/download.html</tt> file with the new release.</li>
<li>Update the <tt>releases/index.html</tt> with the new release and link to <li>Update the <tt>releases/index.html</tt> with the new release and link to
release documentation.</li> release documentation.</li>
<li> Finally, update the main page (<tt>index.html</tt> and sidebar) to
point to the new release and release announcement. Make sure this all gets <li>Finally, update the main page (<tt>index.html</tt> and sidebar) to point
to the new release and release announcement. Make sure this all gets
committed back into Subversion.</li> committed back into Subversion.</li>
</ol> </ol>
</div> </div>
<!-- ======================================================================= --> <!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="announce">Announce the Release</a></div> <div class="doc_subsubsection"><a name="announce">Announce the Release</a></div>
<div class="doc_text"> <div class="doc_text">
<p>Have Chris send out the release announcement when everything is finished.</p> <p>Have Chris send out the release announcement when everything is finished.</p>
</div> </div>
<!-- *********************************************************************** --> <!-- *********************************************************************** -->