1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2 "http://www.w3.org/TR/html4/strict.dtd">
5 <title>How To Release LLVM To The Public</title>
6 <link rel="stylesheet" href="llvm.css" type="text/css">
10 <div class="doc_title">How To Release LLVM To The Public</div>
11 <p class="doc_warning">NOTE: THIS DOCUMENT IS A WORK IN PROGRESS!</p>
13 <li><a href="#introduction">Introduction</a></li>
14 <li><a href="#process">Release Process</a></li>
15 <li><a href="#dist_targets">Distribution Targets</a></li>
17 <div class="doc_author">
18 <p>Written by <a href="mailto:rspencer@x10sys.com">Reid Spencer</a>,
19 <a href="mailto:criswell@cs.uiuc.edu">John Criswell</a></p>
22 <!-- *********************************************************************** -->
23 <div class="doc_section"><a name="introduction">Introduction</a></div>
24 <!-- *********************************************************************** -->
26 <div class="doc_text">
28 This document collects information about successfully releasing LLVM to the
29 public. It is the release manager's guide to ensuring that a high quality
30 build of LLVM is released. Mostly, it's just a bunch of reminders of things to
31 do at release time so we don't inadvertently ship something that is utility
36 There are three main tasks for building a release of LLVM:
38 <li>Create the LLVM source distribution.</li>
39 <li>Create the LLVM GCC source distribtuion.</li>
40 <li>Create a set of LLVM GCC binary distribtuions for each supported
41 platform. These binary distributions must include compiled versions
42 of the libraries found in <tt>llvm/runtime</tt> from the LLVM
43 source distribution created in Step 1.</li>
48 <!-- *********************************************************************** -->
49 <div class="doc_section"><a name="process">Release Process</a></div>
50 <!-- *********************************************************************** -->
52 <!-- ======================================================================= -->
53 <div class="doc_subsection"><a name="overview">Process Overview</a></div>
54 <div class="doc_text">
56 <li><a href="#updocs">Update Documentation</a></li>
57 <li><a href="#merge">Merge Branches</a></li>
58 <li><a href="#deps">Make LibDeps.txt</a></li>
59 <li><a href="#settle">Settle LLVM HEAD</a></li>
60 <li><a href="#tag">Tag LLVM and Create the Release Branch</a></li>
61 <li><a href="#verchanges">Update LLVM Version </a></li>
62 <li><a href="#build">Build LLVM</a></li>
63 <li><a href="#check">Run 'make check'</a></li>
64 <li><a href="#test">Run LLVM Test Suite</a></li>
65 <li><a href="#dist">Build the LLVM Source Distributions</a></li>
66 <li><a href="#rpm">Build RPM Packages (optional)</a></li>
67 <li><a href="#llvmgccbin">Build the LLVM GCC Binary Distribution</a></li>
68 <li><a href="#webupdates">Update the LLVM Website</a></li>
72 <!-- ======================================================================= -->
73 <div class="doc_subsection"><a name="updocs">Update Documentation</a></div>
74 <div class="doc_text">
76 Review the documentation and ensure that it is up to date. The Release Notes
77 must be updated to reflect bug fixes, new known issues, and changes in the
78 list of supported platforms. The Getting Started Guide should be updated to
79 reflect the new release version number tag avaiable from Subversion and
80 changes in basic system requirements.
84 <!-- ======================================================================= -->
85 <div class="doc_subsection"><a name="merge">Merge Branches</a></div>
86 <div class="doc_text">
88 Merge any work done on branches intended for release into mainline. Finish and
89 commit all new features or bug fixes that are scheduled to go into the
90 release. Work that is not to be incorporated into the release should not be
91 merged from branchs or commited from developer's working directories.
95 From this point until the release branch is created, developers should
96 <em>not</em> commit changes to the <tt>llvm</tt> and <tt>llvm-gcc</tt>
97 Subversion repositories unless it is a bug fix <em>for the release</em>.
101 <!-- ======================================================================= -->
102 <div class="doc_subsection"><a name="deps">Make LibDeps.txt</a></div>
103 <div class="doc_text">
105 Rebuild the <tt>LibDeps.txt</tt> target in <tt>utils/llvm-config</tt>. This
106 makes sure that the <tt>llvm-config</tt> utility remains relevant for the
107 release, reflecting any changes in the library dependencies.
111 <!-- ======================================================================= -->
112 <div class="doc_subsection"><a name="settle">Settle Subversion HEAD</a></div>
113 <div class="doc_text">
115 Use the nightly test reports and 'make check' (deja-gnu based tests) to
116 ensure that recent changes and merged branches have not destabilized LLVM.
117 Platforms which are used less often should be given special attention as they
118 are the most likely to break from commits from the previous step.
122 <!-- ======================================================================= -->
123 <div class="doc_subsection"><a name="tag">Subversion Tag And Branch</a></div>
124 <div class="doc_text">
125 <p>Tag and branch the Subversion HEAD using the following procedure:</p>
128 <p>Request all developers to refrain from committing. Offenders get commit
129 rights taken away (temporarily).</p></li>
132 <p>The Release Manager updates his/her <tt>llvm</tt>, <tt>llvm-test</tt>,
133 and <tt>llvm-gcc</tt> source trees with the latest sources from mainline
134 Subversion. The Release Manager may want to consider using a new working
135 directory for this to keep current uncommitted work separate from release
139 <p>The Release Manager tags his/her <tt>llvm</tt>, <tt>llvm-test</tt>, and
140 <tt>llvm-gcc</tt> working directories with "<tt>RELEASE_XX</tt>" where
141 <tt>XX</tt> is the major and minor release numbers. So, for Release 1.2,
142 <tt>XX=12</tt> and for Release 1.10, <tt>XX=110</tt>.</p>
144 <div class="doc_code">
146 svn copy https://llvm.org/svn/llvm-project/llvm/trunk \
147 https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_<i>XX</i>
148 svn copy https://llvm.org/svn/llvm-project/llvm-gcc-4.0/trunk \
149 https://llvm.org/svn/llvm-project/llvm-gcc-4.0/tags/RELEASE_<i>XX</i>
150 svn copy https://llvm.org/svn/llvm-project/test-suite/trunk \
151 https://llvm.org/svn/llvm-project/test-suite/tags/RELEASE_<i>XX</i>
157 <p>Immediately create Subversion branches based on the
158 <tt>RELEASE_<i>XX</i></tt> tag. The tag should be
159 "<tt>release_<i>XX</i></tt>" (where XX matches that used for the
160 <tt>RELEASE_<i>XX</i></tt> tag). This is where the release distribution
163 <div class="doc_code">
165 svn copy https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_<i>XX</i> \
166 https://llvm.org/svn/llvm-project/llvm/branches/release_<i>XX</i>
167 svn copy https://llvm.org/svn/llvm-project/llvm-gcc-4.0/tags/RELEASE_<i>XX</i> \
168 https://llvm.org/svn/llvm-project/llvm-gcc-4.0/branches/release_<i>XX</i>
169 svn copy https://llvm.org/svn/llvm-project/test-suite/tags/RELEASE_<i>XX</i> \
170 https://llvm.org/svn/llvm-project/test-suite/branches/release_<i>XX</i>
176 <p>Advise developers they can work on Subversion HEAD again.</p></li>
179 <p>The Release Manager and any developers working on the release should switch
180 to the release branch (as all changes to the release will now be done in
181 the branch). The easiest way to do this is to grab another working copy
182 using the following commands:</p>
184 <div class="doc_code">
186 svn co https://llvm.org/svn/llvm-project/llvm/branches/release_<i>XX</i>
187 svn co https://llvm.org/svn/llvm-project/llvm-gcc-4.0/branches/release_<i>XX</i>
188 svn co https://llvm.org/svn/llvm-project/test-suite/branches/release_<i>XX</i>
194 <!-- ======================================================================= -->
195 <div class="doc_subsection"><a name="verchanges">Update LLVM Version</a></div>
196 <div class="doc_text">
198 After creating the LLVM release branch, update the release branchs'
199 autoconf/configure.ac version from X.Xsvn to just X.X. Update it on mainline
200 as well to be the next version (X.X+1svn).
204 <!-- ======================================================================= -->
205 <div class="doc_subsection"><a name="build">Build LLVM</a></div>
206 <div class="doc_text">
208 Build both debug and release (optimized) versions of LLVM on all
209 platforms. Ensure the build is warning and error free on each platform.
213 Build a new version of the LLVM GCC front-end after building the LLVM tools.
214 Once that is complete, go back to the LLVM source tree and build and install
215 the <tt>llvm/runtime</tt> libraries.
219 <!-- ======================================================================= -->
220 <div class="doc_subsection"><a name="check">Run 'make check'</a></div>
221 <div class="doc_text">
223 Run <tt>make check</tt> and ensure there are no unexpected failures. If there
224 are, resolve the failures, commit them back into the release branch, and
225 restart testing by <a href="#build">re-building LLVM</a>.
229 Ensure that '<tt>make check</tt>' passes on all platforms for all targets. If
230 certain failures cannot be resolved before release time, determine if marking
231 them <tt>XFAIL</tt> is appropriate. If not, fix the bug and go back. The test
232 suite must complete with "0 unexpected failures" for release.
236 <!-- ======================================================================= -->
237 <div class="doc_subsection"><a name="test">LLVM Test Suite</a></div>
238 <div class="doc_text">
240 Run the <tt>llvm-test</tt> suite and ensure there are no unacceptable
241 failures. If there are, resolve the failures and go back to <a
242 href="#build">re-building LLVM</a>. The test suite should be run in Nightly
243 Test mode. All tests must pass.
247 <!-- ======================================================================= -->
248 <div class="doc_subsection"><a name="dist">Build the LLVM Source Distributions</a></div>
249 <div class="doc_text">
251 Create source distributions for LLVM, LLVM GCC, and the LLVM Test Suite by
252 exporting the source from Subversion and archiving it. This can be done with
253 the following commands:
256 <div class="doc_code">
258 svn export https://llvm.org/svn/llvm-project/llvm/branches/release_<i>XX</i> llvm
259 svn export https://llvm.org/svn/llvm-project/llvm-gcc-4.0/branches/release_<i>XX</i> llvm-gcc
260 svn export https://llvm.org/svn/llvm-project/test-suite/branches/release_<i>XX</i> llvm-test
261 mkdir cfrontend; mv llvm-gcc cfrontend/src
262 tar -cvf - llvm | gzip > llvm-X.X.tar.gz
263 tar -cvf - llvm-test | gzip > llvm-test-X.X.tar.gz
264 tar -cvf - cfrontend/src | gzip > cfrontend-X.X.source.tar.gz
269 <!-- ======================================================================= -->
270 <div class="doc_subsection"><a name="rpm">Building RPM packages (optional)</a></div>
271 <div class="doc_text">
273 You can, optionally, create source and binary RPM packages for LLVM. These may
274 make it easier to get LLVM into a distribution. This can be done with the
278 <div class="doc_code">
280 make dist # Build the distribution source tarball
281 make dist-check # Check that the source tarball can build itself.
282 cp llvm-M.m.tar.gz /usr/src/redhat/SOURCES # Required by rpmbuild
283 make srpm # for source rpm
284 make rpm # for binary rpm
289 First, use <tt>make dist</tt> to simply build the distribution. Any failures
290 need to be corrected (on the branch). Once <tt>make dist</tt> can be
291 successful, do <tt>make dist-check</tt>. This target will do the same thing as
292 the 'dist' target but also test that distribution to make sure it can build
293 itself and runs <tt>make check</tt> as well. This ensures that needed files
294 are not missing and that the src tarball can be successfully unpacked, built,
295 installed, and cleaned. Once you have a reliable tarball, you need to copy it
296 to the <tt>/usr/src/redhat/SOURCES</tt> directory which is a requirement of
297 the rpmbuild tool. The last two <tt>make</tt> invocations just run rpmbuild to
298 build either a source (<tt>srpm</tt>) or binary (<tt>rpm</tt>) RPM package.
302 <!-- ======================================================================= -->
303 <div class="doc_subsection"><a name="llvmgccbin">Build the LLVM GCC Binary Distribution</a></div>
304 <div class="doc_text">
306 Creating the LLVM GCC binary distribution requires performing the following
307 steps for each supported platform:
312 Build the LLVM GCC front-end. The LLVM GCC front-end must be installed in
313 a directory named <tt>cfrontend/<platform>/llvm-gcc</tt>. For
314 example, the Sparc/Solaris directory is named
315 <tt>cfrontend/sparc/llvm-gcc</tt>.
319 Build the libraries in <tt>llvm/runtime</tt> and install them into the
320 created LLVM GCC installation directory.
324 For systems with non-distributable header files (e.g. Solaris), manually
325 remove header files that the GCC build process has "fixed." This process
326 is admittedly painful, but not as bad as it looks; these header files are
327 almost always easily identifiable with simple grep expressions and are
328 installed in only a few directories in the GCC installation directory.
332 Add the copyright files and header file fix script.
336 Archive and compress the installation directory. These can be found in
337 previous releases of the LLVM-GCC front-end.
343 <!-- ======================================================================= -->
344 <div class="doc_subsection"><a name="webupdates">Update the LLVM Website</a></div>
345 <div class="doc_text">
347 Check out the <tt>website</tt> module from Subversion. Create a new
348 subdirectory X.X in the releases directory. Place the <tt>llvm</tt>,
349 <tt>llvm-test</tt>, <tt>llvm-gcc</tt> source, and <tt>llvm-gcc</tt> binaries
350 in this new directory. Copy the <tt>llvm/docs</tt> and <tt>LICENSE.txt</tt>
351 files into this new directory. Update the <tt>releases/download.html</tt> file
352 with the new release. Update the <tt>releases/index.html</tt> with the new
353 release. Finally, update the main page (<tt>index.html</tt> and sidebar) to
354 point to the new release and release announcement. Make sure this all gets
355 commited back into Subversion.
360 <div class="doc_subsection"><a name="release">Release</a></div>
361 <div class="doc_text">
362 <p>Release the distribution tarball to the public. This consists of generating
363 several tarballs. The first set, the source distributions, are automatically
364 generated by the "make dist" and "make dist-check". There are gzip, bzip2, and
365 zip versions of these bundles.</p>
366 <p>The second set of tarballs is the binary release. When "make dist-check"
367 succeeds, it will have created an _install directory into which it installed
368 the binary release. You need to rename that directory as "llvm" and then
369 create tarballs from the contents of that "llvm" directory.</p>
370 <p>Finally, use rpm to make an rpm package based on the llvm.spec file. Don't
371 forget to update the version number, documentation, etc. in the llvm.spec
376 <!-- *********************************************************************** -->
377 <div class="doc_section"><a name="dist_targets">Distribution Targets</a></div>
378 <!-- *********************************************************************** -->
380 <!-- ======================================================================= -->
381 <div class="doc_subsection">Overview</div>
382 <div class="doc_text">
384 The first thing you need to understand is that there are multiple make targets
385 to support this feature. Here's an overview, we'll delve into the details
390 <li><b>distdir</b> - builds the distribution directory from which the
391 distribution will be packaged</li>
392 <li><b>dist</b> - builds each of the distribution tarballs (tar.gz,
393 tar.bzip2, .zip). These can be built individually as well, with separate
395 <li><b>dist-check</b> - this is identical to <tt>dist</tt> but includes a
396 check on the distribution that ensures the tarball can: unpack
397 successfully, compile correctly, pass '<tt>make check</tt>', and pass
398 '<tt>make clean</tt>'.</li>
399 <li><b>dist-clean</b>- this just does a normal clean but also cleans up the
400 stuff generated by the other three <tt>dist</tt> targets (above).</li>
404 Okay, that's the basic functionality. When making a release, we want to ensure
405 that the tree you build the distribution from passes
406 <tt>dist-check</tt>. Beyond fixing the usual bugs, there is generally one
407 impediment to making the release in this fashion: missing files. The
408 <tt>dist-check</tt> process guards against that possibility. It will either
409 fail and that failure will indicate what's missing, or it will succeed meaning
410 that it has proved that the tarballs can actually succeed in building LLVM
411 correctly and that it passes <tt>make check</tt>.
415 <!-- ======================================================================= -->
417 <div class="doc_subsection">distdir</div>
418 <div class="doc_text">
420 This target builds the distribution directory which is the directory from
421 which the tarballs are generated. The distribution directory has the same
422 name as the release, e.g. LLVM-1.7). This target goes through the following
427 <li>First, if there was an old distribution directory (for the current
428 release), it is removed in its entirety and you see <tt>Removing old
430 <li>Second, it issues a <tt>make all ENABLE_OPTIMIZED=3D1</tt> to ensure
431 that the everything in your tree can be built in release mode. Often
432 times there are discrepancies in building between debug and release
433 modes so it enforces release mode first. If that fails, the
434 <tt>distdir</tt> target fails too. This is preceded by the message
435 <tt>Making 'all' to verify build</tt>.</li>
436 <li>Next, it traverses your source tree and copies it to a new directory
437 that has the name of the release (<tt>LLVM-M.m</tt> in our current
438 case). This is the directory that will get tar'd. It contains all the
439 software that needs to be in the distribution. During the copying
440 process, it omits generated files, CVS directories, and any other
441 "cruft" that's in your build tree. This is done to eliminate the
442 possibility of huge distribution tarballs that include useless or
443 irrelevant stuff in them. This is the trickiest part of making the
444 distribution. Done manually you will either include stuff that
445 shouldn't be in the distribution or exclude stuff that should. This
446 step is preceded by the message <tt>Building Distribution Directory
448 <li>The distribution directory is then traversed and all <tt>CVS</tt> or
449 <tt>.svn</tt> directories are removed. You see: <tt>Eliminating CVS/.svn
450 directories from distribution</tt></li>
451 <li>The recursive <tt>dist-hook</tt> target is executed. This gives each
452 directory a chance to modify the distribution in some way (more on this
454 <li>The distribution directory is traversed and the correct file
455 permissions and modes are set based on the type of file.</li>
459 To control the process of making the distribution directory correctly, each
460 Makefile can utilize two features:
464 <li><b><tt>EXTRA_DIST</tt></B> - this make variable specifies which files
465 it should distribute. By default, all source files are automatically
466 included for distribution as well as certain <tt>well known</tt> files
467 (see DistAlways variable in Makefile.rules for details). Each Makefile
468 specifies, via the <tt>EXTRA_DIST</tt> variable, which additional files
469 need to be distributed. Only those files that are needed to build LLVM
470 should be added to <tt>EXTRA_DIST</tt>. <tt>EXTRA_DIST</tt> contains a
471 list of file or directory names that should be distributed. For example,
472 the top level Makefile contains <tt>EXTRA_DIST := test llvm.spec
473 include</tt>. This means that in addition to regular things that are
474 distributed at the top level (<tt>CREDITS.txt, LICENSE.txt</tt>, etc.)
475 the distribution should contain the entire <tt>test</tt> and
476 <tt>include</tt> directories as well as the <tt>llvm.spec</tt> file.</li>
477 <li><b><tt>dist-hook</tt></B> - this make target can be used to alter the
478 content of the distribution directory. For example, in the top level
479 Makefile there is some logic to eliminate files in the <tt>include</tt>
480 subtree that are generated by the configure script. These should not be
481 distributed. Similarly, any <tt>dist-hook</tt> target found in any
482 directory can add or remove or modify things just before it gets
483 packaged. Any transformation is permitted. Generally, not much is
488 You will see various messages if things go wrong:
492 <li>During the copying process, any files that are missing will be flagged
493 with: <tt>===== WARNING: Distribution Source 'dir/file' Not Found!</tt>
494 These must be corrected by either adding the file or removing it from
495 <tt>EXTRA_DIST</tt>.</li>
496 <li>If you build the distribution with <tt>VERBOSE=1</tt>, then you might
497 also see: <tt>Skipping non-existent 'dir/file'</tt> in certain cases
498 where it's okay to skip the file.</li>
499 <li>The target can fail if any of the things it does fail. Error messages
500 should indicate what went wrong.</li>
504 <!-- ======================================================================= -->
505 <div class="doc_subsection">dist</div>
506 <div class="doc_text">
508 This target does exactly what <tt>distdir</tt> target does, but also includes
509 assembling the tarballs. There are actually four related targets here:
513 <li><b><tt>dist-gzip</tt></b>: package the gzipped distribution tar
514 file. The distribution directory is packaged into a single file ending
515 in <tt>.tar.gz</tt> which is gzip compressed.</li>
516 <li><b><tt>dist-bzip2</tt></b>: package the bzip2 distribution tar file.
517 The distribution directory is packaged into a single file ending in
518 <tt>.tar.bzip2</tt> which is bzip2 compressed.</li>
519 <li><b><tt>dist-zip</tt></b>: package the zip distribution file. The
520 distribution directory is packaged into a single file ending in
521 <tt>.zip</tt> which is zip compressed.</li>
522 <li><b><tt>dist</tt></b>: does all three, dist-gzip, dist-bzip2,
527 <!-- ======================================================================= -->
528 <div class="doc_subsection">dist-check</div>
529 <div class="doc_text">
531 This target checks the distribution. The basic idea is that it unpacks the
532 distribution tarball and ensures that it can build. It takes the following
537 <li>It depends on the <tt>dist-gzip</tt> target which, if it hasn't already
538 been built, builds the gzip tar bundle (see dist and distdir
540 <li>removes any pre-existing <tt>_distcheckdir</tt> at the top level.</li>
541 <li>creates a new <tt>_distcheckdir</tt> directory at the top level.</li>
542 <li>creates a <tt>build</tt> subdirectory and an <tt>install</tt>
543 subdirectory under <tt>_distcheckdir</tt>.</li>
544 <li>unzips and untars the release tarball into <tt>_distcheckdir</tt>,
545 creating <tt>LLVM-1.7</tt> directory (from the tarball).</li>
546 <li>in the build subdirectory, it configures with appropriate options to
547 build from the unpacked source tarball into the <tt>build</tt> directory
548 with installation in the <tt>install</tt> directory.</li>
549 <li>runs <tt>make all</tt></li>
550 <li>runs <tt>make </tt><tt>check</tt></li>
551 <li>runs <tt>make install</tt></li>
552 <li>runs <tt>make uninstall</tt></li>
553 <li>runs <tt>make dist</tt></li>
554 <li>runs <tt>make clean</tt></li>
555 <li>runs <tt>make dist-clean</tt></li>
559 If it can pass all that, the distribution will be deemed distribution worth y
563 <pre>===== LLVM-1.7.tar.gz Ready For Distribution =====</pre>
566 This means the tarball should then be tested on other platforms and have the
567 nightly test run against it. If those all pass, THEN it is ready for
572 A note about disk space: using <tt>dist-check</tt> will easily triple the
573 amount of disk space your build tree is using. You might want to check
574 available space before you begin.
578 <!-- ======================================================================= -->
579 <div class="doc_subsection">dist-clean</div>
580 <div class="doc_text">
582 In addition to doing a normal <tt>clean</tt>, this target will clean up the
583 files and directories created by the distribution targets. In particular the
584 distribution directory (<tt>LLVM-X.X</tt>), check directory
585 (<tt>_distcheckdir</tt>), and the various tarballs will be removed. You do
586 this after the release has shipped and you no longer need this stuff in your
591 <!-- *********************************************************************** -->
594 <a href="http://jigsaw.w3.org/css-validator/check/referer"><img
595 src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!"></a>
596 <a href="http://validator.w3.org/check/referer"><img
597 src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!" /></a>
599 <a href="mailto:rspencer@x10sys.com">Reid Spencer</a><br>
600 <a href="http://llvm.cs.uiuc.edu">The LLVM Compiler Infrastructure</a>
602 Last modified: $Date$