442 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
			
		
		
	
	
			442 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
=================================
 | 
						|
How To Release LLVM To The Public
 | 
						|
=================================
 | 
						|
 | 
						|
.. contents::
 | 
						|
   :local:
 | 
						|
   :depth: 1
 | 
						|
 | 
						|
Introduction
 | 
						|
============
 | 
						|
 | 
						|
This document contains information about successfully releasing LLVM ---
 | 
						|
including subprojects: e.g., ``clang`` and ``dragonegg`` --- to the public.  It
 | 
						|
is the Release Manager's responsibility to ensure that a high quality build of
 | 
						|
LLVM is released.
 | 
						|
 | 
						|
If you're looking for the document on how to test the release candidates and
 | 
						|
create the binary packages, please refer to the :doc:`ReleaseProcess` instead.
 | 
						|
 | 
						|
.. _timeline:
 | 
						|
 | 
						|
Release Timeline
 | 
						|
================
 | 
						|
 | 
						|
LLVM is released on a time based schedule --- with major releases roughly
 | 
						|
every 6 months.  In between major releases there may be dot releases.
 | 
						|
The release manager will determine if and when to make a dot release based
 | 
						|
on feedback from the community.  Typically, dot releases should be made if
 | 
						|
there are large number of bug-fixes in the stable branch or a critical bug
 | 
						|
has been discovered that affects a large number of users.
 | 
						|
 | 
						|
Unless otherwise stated, dot releases will follow the same procedure as
 | 
						|
major releases.
 | 
						|
 | 
						|
The release process is roughly as follows:
 | 
						|
 | 
						|
* 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.
 | 
						|
 | 
						|
* Create release branch and begin release process.
 | 
						|
 | 
						|
* 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.
 | 
						|
 | 
						|
* Generate and send out the second release candidate sources.  Only *critial*
 | 
						|
  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.
 | 
						|
 | 
						|
* The release notes are updated.
 | 
						|
 | 
						|
* Finally, release!
 | 
						|
 | 
						|
The release process will be accelerated for dot releases.  If the first round
 | 
						|
of testing finds no critical bugs and no regressions since the last major release,
 | 
						|
then additional rounds of testing will not be required.
 | 
						|
 | 
						|
Release Process
 | 
						|
===============
 | 
						|
 | 
						|
.. contents::
 | 
						|
   :local:
 | 
						|
 | 
						|
Release Administrative Tasks
 | 
						|
----------------------------
 | 
						|
 | 
						|
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,
 | 
						|
 | 
						|
* Setting version numbers, and
 | 
						|
 | 
						|
* Tagging release candidates for the release team to begin testing.
 | 
						|
 | 
						|
Create Release Branch
 | 
						|
^^^^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
Branch the Subversion trunk using the following procedure:
 | 
						|
 | 
						|
#. Remind developers that the release branching is imminent and to refrain from
 | 
						|
   committing patches that might break the build.  E.g., new features, large
 | 
						|
   patches for works in progress, an overhaul of the type system, an exciting
 | 
						|
   new TableGen feature, etc.
 | 
						|
 | 
						|
#. Verify that the current Subversion trunk is in decent shape by
 | 
						|
   examining nightly tester and buildbot results.
 | 
						|
 | 
						|
#. Create the release branch for ``llvm``, ``clang``, the ``test-suite``, and
 | 
						|
   ``dragonegg`` from the last known good revision.  The branch's name is
 | 
						|
   ``release_XY``, where ``X`` is the major and ``Y`` the minor release
 | 
						|
   numbers.  The branches should be created using the following commands:
 | 
						|
 | 
						|
   ::
 | 
						|
 | 
						|
     $ svn copy https://llvm.org/svn/llvm-project/llvm/trunk \
 | 
						|
                https://llvm.org/svn/llvm-project/llvm/branches/release_XY
 | 
						|
 | 
						|
     $ svn copy https://llvm.org/svn/llvm-project/cfe/trunk \
 | 
						|
                https://llvm.org/svn/llvm-project/cfe/branches/release_XY
 | 
						|
 | 
						|
     $ svn copy https://llvm.org/svn/llvm-project/dragonegg/trunk \
 | 
						|
                https://llvm.org/svn/llvm-project/dragonegg/branches/release_XY
 | 
						|
 | 
						|
     $ svn copy https://llvm.org/svn/llvm-project/test-suite/trunk \
 | 
						|
                https://llvm.org/svn/llvm-project/test-suite/branches/release_XY
 | 
						|
 | 
						|
#. Advise developers that they may now check their patches into the Subversion
 | 
						|
   tree again.
 | 
						|
 | 
						|
#. 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:
 | 
						|
 | 
						|
   ::
 | 
						|
 | 
						|
     $ svn co https://llvm.org/svn/llvm-project/llvm/branches/release_XY llvm-X.Y
 | 
						|
 | 
						|
     $ svn co https://llvm.org/svn/llvm-project/cfe/branches/release_XY clang-X.Y
 | 
						|
 | 
						|
     $ svn co https://llvm.org/svn/llvm-project/dragonegg/branches/release_XY dragonegg-X.Y
 | 
						|
 | 
						|
     $ svn co https://llvm.org/svn/llvm-project/test-suite/branches/release_XY test-suite-X.Y
 | 
						|
 | 
						|
Update LLVM Version
 | 
						|
^^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
After creating the LLVM release branch, update the release branches'
 | 
						|
``autoconf`` and ``configure.ac`` versions from '``X.Ysvn``' to '``X.Y``'.
 | 
						|
Update it on mainline as well to be the next version ('``X.Y+1svn``').
 | 
						|
Regenerate the configure scripts for both ``llvm`` and the ``test-suite``.
 | 
						|
 | 
						|
In addition, the version numbers of all the Bugzilla components must be updated
 | 
						|
for the next release.
 | 
						|
 | 
						|
Build the LLVM Release Candidates
 | 
						|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
Create release candidates for ``llvm``, ``clang``, ``dragonegg``, and the LLVM
 | 
						|
``test-suite`` by tagging the branch with the respective release candidate
 | 
						|
number.  For instance, to create **Release Candidate 1** you would issue the
 | 
						|
following commands:
 | 
						|
 | 
						|
::
 | 
						|
 | 
						|
  $ svn mkdir https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_XYZ
 | 
						|
  $ svn copy https://llvm.org/svn/llvm-project/llvm/branches/release_XY \
 | 
						|
             https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_XYZ/rc1
 | 
						|
 | 
						|
  $ svn mkdir https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_XYZ
 | 
						|
  $ svn copy https://llvm.org/svn/llvm-project/cfe/branches/release_XY \
 | 
						|
             https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_XYZ/rc1
 | 
						|
 | 
						|
  $ svn mkdir https://llvm.org/svn/llvm-project/dragonegg/tags/RELEASE_XYZ
 | 
						|
  $ svn copy https://llvm.org/svn/llvm-project/dragonegg/branches/release_XY \
 | 
						|
             https://llvm.org/svn/llvm-project/dragonegg/tags/RELEASE_XYZ/rc1
 | 
						|
 | 
						|
  $ svn mkdir https://llvm.org/svn/llvm-project/test-suite/tags/RELEASE_XYZ
 | 
						|
  $ svn copy https://llvm.org/svn/llvm-project/test-suite/branches/release_XY \
 | 
						|
             https://llvm.org/svn/llvm-project/test-suite/tags/RELEASE_XYZ/rc1
 | 
						|
 | 
						|
Similarly, **Release Candidate 2** would be named ``RC2`` 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 ``RELEASE_XYZ``
 | 
						|
directory as ``Final`` (c.f. :ref:`tag`).
 | 
						|
 | 
						|
The Release Manager may supply pre-packaged source tarballs for users.  This can
 | 
						|
be done with the following commands:
 | 
						|
 | 
						|
::
 | 
						|
 | 
						|
  $ svn export https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_XYZ/rc1 llvm-X.Yrc1
 | 
						|
  $ svn export https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_XYZ/rc1 clang-X.Yrc1
 | 
						|
  $ svn export https://llvm.org/svn/llvm-project/dragonegg/tags/RELEASE_XYZ/rc1 dragonegg-X.Yrc1
 | 
						|
  $ svn export https://llvm.org/svn/llvm-project/test-suite/tags/RELEASE_XYZ/rc1 llvm-test-X.Yrc1
 | 
						|
 | 
						|
  $ tar -cvf - llvm-X.Yrc1        | gzip > llvm-X.Yrc1.src.tar.gz
 | 
						|
  $ tar -cvf - clang-X.Yrc1       | gzip > clang-X.Yrc1.src.tar.gz
 | 
						|
  $ tar -cvf - dragonegg-X.Yrc1   | gzip > dragonegg-X.Yrc1.src.tar.gz
 | 
						|
  $ tar -cvf - llvm-test-X.Yrc1   | gzip > llvm-test-X.Yrc1.src.tar.gz
 | 
						|
 | 
						|
Building the Release
 | 
						|
--------------------
 | 
						|
 | 
						|
The builds of ``llvm``, ``clang``, and ``dragonegg`` *must* be free of
 | 
						|
errors and warnings in Debug, Release+Asserts, and Release builds.  If all
 | 
						|
builds are clean, then the release passes Build Qualification.
 | 
						|
 | 
						|
The ``make`` options for building the different modes:
 | 
						|
 | 
						|
+-----------------+---------------------------------------------+
 | 
						|
| Mode            | Options                                     |
 | 
						|
+=================+=============================================+
 | 
						|
| Debug           | ``ENABLE_OPTIMIZED=0``                      |
 | 
						|
+-----------------+---------------------------------------------+
 | 
						|
| Release+Asserts | ``ENABLE_OPTIMIZED=1``                      |
 | 
						|
+-----------------+---------------------------------------------+
 | 
						|
| Release         | ``ENABLE_OPTIMIZED=1 DISABLE_ASSERTIONS=1`` |
 | 
						|
+-----------------+---------------------------------------------+
 | 
						|
 | 
						|
Build LLVM
 | 
						|
^^^^^^^^^^
 | 
						|
 | 
						|
Build ``Debug``, ``Release+Asserts``, and ``Release`` versions
 | 
						|
of ``llvm`` on all supported platforms.  Directions to build ``llvm``
 | 
						|
are :doc:`here <GettingStarted>`.
 | 
						|
 | 
						|
Build Clang Binary Distribution
 | 
						|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
Creating the ``clang`` binary distribution (Debug/Release+Asserts/Release)
 | 
						|
requires performing the following steps for each supported platform:
 | 
						|
 | 
						|
#. Build clang according to the directions `here
 | 
						|
   <http://clang.llvm.org/get_started.html>`__.
 | 
						|
 | 
						|
#. Build both a Debug and Release version of clang.  The binary will be the
 | 
						|
   Release build.
 | 
						|
 | 
						|
#. Package ``clang`` (details to follow).
 | 
						|
 | 
						|
Target Specific Build Details
 | 
						|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
The table below specifies which compilers are used for each Arch/OS combination
 | 
						|
when qualifying the build of ``llvm``, ``clang``, and ``dragonegg``.
 | 
						|
 | 
						|
+--------------+---------------+----------------------+
 | 
						|
| Architecture | OS            | compiler             |
 | 
						|
+==============+===============+======================+
 | 
						|
| x86-32       | Mac OS 10.5   | gcc 4.0.1            |
 | 
						|
+--------------+---------------+----------------------+
 | 
						|
| x86-32       | Linux         | gcc 4.2.X, gcc 4.3.X |
 | 
						|
+--------------+---------------+----------------------+
 | 
						|
| x86-32       | FreeBSD       | gcc 4.2.X            |
 | 
						|
+--------------+---------------+----------------------+
 | 
						|
| x86-32       | mingw         | gcc 3.4.5            |
 | 
						|
+--------------+---------------+----------------------+
 | 
						|
| x86-64       | Mac OS 10.5   | gcc 4.0.1            |
 | 
						|
+--------------+---------------+----------------------+
 | 
						|
| x86-64       | Linux         | gcc 4.2.X, gcc 4.3.X |
 | 
						|
+--------------+---------------+----------------------+
 | 
						|
| x86-64       | FreeBSD       | gcc 4.2.X            |
 | 
						|
+--------------+---------------+----------------------+
 | 
						|
| ARMv7        | Linux         | gcc 4.6.X, gcc 4.7.X |
 | 
						|
+--------------+---------------+----------------------+
 | 
						|
 | 
						|
Release Qualification Criteria
 | 
						|
------------------------------
 | 
						|
 | 
						|
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.)
 | 
						|
 | 
						|
**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.**
 | 
						|
 | 
						|
Qualify LLVM
 | 
						|
^^^^^^^^^^^^
 | 
						|
 | 
						|
LLVM is qualified when it has a clean test run without a front-end.  And it has
 | 
						|
no regressions when using either ``clang`` or ``dragonegg`` with the
 | 
						|
``test-suite`` from the previous release.
 | 
						|
 | 
						|
Qualify Clang
 | 
						|
^^^^^^^^^^^^^
 | 
						|
 | 
						|
``Clang`` is qualified when front-end specific tests in the ``llvm`` regression
 | 
						|
test suite all pass, clang's own test suite passes cleanly, and there are no
 | 
						|
regressions in the ``test-suite``.
 | 
						|
 | 
						|
Specific Target Qualification Details
 | 
						|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
+--------------+-------------+----------------+-----------------------------+
 | 
						|
| Architecture | OS          | clang baseline | tests                       |
 | 
						|
+==============+=============+================+=============================+
 | 
						|
| x86-32       | Linux       | last release   | llvm regression tests,      |
 | 
						|
|              |             |                | clang regression tests,     |
 | 
						|
|              |             |                | test-suite (including spec) |
 | 
						|
+--------------+-------------+----------------+-----------------------------+
 | 
						|
| x86-32       | FreeBSD     | last release   | llvm regression tests,      |
 | 
						|
|              |             |                | clang regression tests,     |
 | 
						|
|              |             |                | test-suite                  |
 | 
						|
+--------------+-------------+----------------+-----------------------------+
 | 
						|
| x86-32       | mingw       | none           | QT                          |
 | 
						|
+--------------+-------------+----------------+-----------------------------+
 | 
						|
| x86-64       | Mac OS 10.X | last release   | llvm regression tests,      |
 | 
						|
|              |             |                | clang regression tests,     |
 | 
						|
|              |             |                | test-suite (including spec) |
 | 
						|
+--------------+-------------+----------------+-----------------------------+
 | 
						|
| x86-64       | Linux       | last release   | llvm regression tests,      |
 | 
						|
|              |             |                | clang regression tests,     |
 | 
						|
|              |             |                | test-suite (including spec) |
 | 
						|
+--------------+-------------+----------------+-----------------------------+
 | 
						|
| x86-64       | FreeBSD     | last release   | llvm regression tests,      |
 | 
						|
|              |             |                | clang regression tests,     |
 | 
						|
|              |             |                | test-suite                  |
 | 
						|
+--------------+-------------+----------------+-----------------------------+
 | 
						|
| ARMv7A       | Linux       | last release   | llvm regression tests,      |
 | 
						|
|              |             |                | clang regression tests,     |
 | 
						|
|              |             |                | test-suite                  |
 | 
						|
+--------------+-------------+----------------+-----------------------------+
 | 
						|
 | 
						|
Community Testing
 | 
						|
-----------------
 | 
						|
 | 
						|
Once all testing has been completed and appropriate bugs filed, the release
 | 
						|
candidate tarballs are put on the website and the LLVM community is notified.
 | 
						|
Ask that all LLVM developers test the release in 2 ways:
 | 
						|
 | 
						|
#. Download ``llvm-X.Y``, ``llvm-test-X.Y``, and the appropriate ``clang``
 | 
						|
   binary.  Build LLVM.  Run ``make check`` and the full LLVM test suite (``make
 | 
						|
   TEST=nightly report``).
 | 
						|
 | 
						|
#. Download ``llvm-X.Y``, ``llvm-test-X.Y``, and the ``clang`` sources.  Compile
 | 
						|
   everything.  Run ``make check`` and the full LLVM test suite (``make
 | 
						|
   TEST=nightly report``).
 | 
						|
 | 
						|
Ask LLVM developers to submit the test suite report and ``make check`` 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 ``make check`` is at least
 | 
						|
clean.
 | 
						|
 | 
						|
During the first round of testing, all regressions must be fixed before the
 | 
						|
second release candidate is tagged.
 | 
						|
 | 
						|
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. *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 stage.
 | 
						|
 | 
						|
Release Patch Rules
 | 
						|
-------------------
 | 
						|
 | 
						|
Below are the rules regarding patching the release branch:
 | 
						|
 | 
						|
#. Patches applied to the release branch may only be applied by the release
 | 
						|
   manager.
 | 
						|
 | 
						|
#. 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.
 | 
						|
 | 
						|
#. During the remaining rounds of testing, only patches that fix critical
 | 
						|
   regressions may be applied.
 | 
						|
 | 
						|
#. For dot releases all patches must mantain both API and ABI compatibility with
 | 
						|
   the previous major release.  Only bugfixes will be accepted.
 | 
						|
 | 
						|
Release Final Tasks
 | 
						|
-------------------
 | 
						|
 | 
						|
The final stages of the release process involves tagging the "final" release
 | 
						|
branch, updating documentation that refers to the release, and updating the
 | 
						|
demo page.
 | 
						|
 | 
						|
Update Documentation
 | 
						|
^^^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
Review the documentation and ensure that it is up to date.  The "Release Notes"
 | 
						|
must be updated to reflect new features, bug fixes, new known issues, and
 | 
						|
changes in the list of supported platforms.  The "Getting Started Guide" should
 | 
						|
be updated to reflect the new release version number tag available from
 | 
						|
Subversion and changes in basic system requirements.  Merge both changes from
 | 
						|
mainline into the release branch.
 | 
						|
 | 
						|
.. _tag:
 | 
						|
 | 
						|
Tag the LLVM Final Release
 | 
						|
^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
Tag the final release sources using the following procedure:
 | 
						|
 | 
						|
::
 | 
						|
 | 
						|
  $ svn copy https://llvm.org/svn/llvm-project/llvm/branches/release_XY \
 | 
						|
             https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_XYZ/Final
 | 
						|
 | 
						|
  $ svn copy https://llvm.org/svn/llvm-project/cfe/branches/release_XY \
 | 
						|
             https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_XYZ/Final
 | 
						|
 | 
						|
  $ svn copy https://llvm.org/svn/llvm-project/dragonegg/branches/release_XY \
 | 
						|
             https://llvm.org/svn/llvm-project/dragonegg/tags/RELEASE_XYZ/Final
 | 
						|
 | 
						|
  $ svn copy https://llvm.org/svn/llvm-project/test-suite/branches/release_XY \
 | 
						|
             https://llvm.org/svn/llvm-project/test-suite/tags/RELEASE_XYZ/Final
 | 
						|
 | 
						|
Update the LLVM Demo Page
 | 
						|
-------------------------
 | 
						|
 | 
						|
The LLVM demo page must be updated to use the new release.  This consists of
 | 
						|
using the new ``clang`` binary and building LLVM.
 | 
						|
 | 
						|
Update the LLVM Website
 | 
						|
^^^^^^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
The website must be updated before the release announcement is sent out.  Here
 | 
						|
is what to do:
 | 
						|
 | 
						|
#. Check out the ``www`` module from Subversion.
 | 
						|
 | 
						|
#. Create a new subdirectory ``X.Y`` in the releases directory.
 | 
						|
 | 
						|
#. Commit the ``llvm``, ``test-suite``, ``clang`` source, ``clang binaries``,
 | 
						|
   ``dragonegg`` source, and ``dragonegg`` binaries in this new directory.
 | 
						|
 | 
						|
#. Copy and commit the ``llvm/docs`` and ``LICENSE.txt`` files into this new
 | 
						|
   directory.  The docs should be built with ``BUILD_FOR_WEBSITE=1``.
 | 
						|
 | 
						|
#. Commit the ``index.html`` to the ``release/X.Y`` directory to redirect (use
 | 
						|
   from previous release).
 | 
						|
 | 
						|
#. Update the ``releases/download.html`` file with the new release.
 | 
						|
 | 
						|
#. Update the ``releases/index.html`` with the new release and link to release
 | 
						|
   documentation.
 | 
						|
 | 
						|
#. Finally, update the main page (``index.html`` and sidebar) to point to the
 | 
						|
   new release and release announcement.  Make sure this all gets committed back
 | 
						|
   into Subversion.
 | 
						|
 | 
						|
Announce the Release
 | 
						|
^^^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
Have Chris send out the release announcement when everything is finished.
 | 
						|
 |