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:
40 <li>Create the LLVM source distribution.</li>
41 <li>Create the LLVM GCC source distribtuion.</li>
42 <li>Create a set of LLVM GCC binary distribtuions for each supported
43 platform. These binary distributions must include compiled versions
44 of the libraries found in <tt>llvm/runtime</tt> from the LLVM
45 source distribution created in Step 1.</li>
49 <!-- *********************************************************************** -->
50 <div class="doc_section"><a name="process">Release Process</a></div>
51 <!-- *********************************************************************** -->
53 <!-- ======================================================================= -->
54 <div class="doc_subsection"><a name="overview">Process Overview</a></div>
55 <div class="doc_text">
57 <li><a href="#updocs">Update Documentation</a></li>
58 <li><a href="#merge">Merge Branches</a></li>
59 <li><a href="#deps">Make LibDeps.txt</a></li>
60 <li><a href="#settle">Settle LLVM HEAD</a></li>
61 <li><a href="#tag">Tag LLVM and Create the Release Branch</a></li>
62 <li><a href="#verchanges">Update LLVM Version </a></li>
63 <li><a href="#build">Build LLVM</a></li>
64 <li><a href="#check">Run 'make check'</a></li>
65 <li><a href="#test">Run LLVM Test Suite</a></li>
66 <li><a href="#dist">Build the LLVM Source Distributions</a></li>
67 <li><a href="#rpm">Build RPM Packages (optional)</a></li>
68 <li><a href="#llvmgccbin">Build the LLVM GCC Binary Distribution</a></li>
69 <li><a href="#webupdates">Update the LLVM Website</a></li>
73 <!-- ======================================================================= -->
74 <div class="doc_subsection"><a name="updocs">Update Documentation</a></div>
75 <div class="doc_text">
77 Review the documentation and ensure that it is up to date. The Release Notes
78 must be updated to reflect bug fixes, new known issues, and changes in the
79 list of supported platforms. The Getting Started Guide should be updated to
80 reflect the new release version number tag avaiable from Subversion and
81 changes in basic system requirements.
85 <!-- ======================================================================= -->
86 <div class="doc_subsection"><a name="merge">Merge Branches</a></div>
87 <div class="doc_text">
89 Merge any work done on branches intended for release into mainline. Finish and
90 commit all new features or bug fixes that are scheduled to go into the
91 release. Work that is not to be incorporated into the release should not be
92 merged from branchs or commited from developer's working directories.
96 From this point until the release branch is created, developers should
97 <em>not</em> commit changes to the <tt>llvm</tt> and <tt>llvm-gcc</tt>
98 Subversion repositories unless it is a bug fix <em>for the release</em>.
102 <!-- ======================================================================= -->
103 <div class="doc_subsection"><a name="deps">Make LibDeps.txt</a></div>
104 <div class="doc_text">
106 Rebuild the <tt>LibDeps.txt</tt> target in <tt>utils/llvm-config</tt>. This
107 makes sure that the <tt>llvm-config</tt> utility remains relevant for the
108 release, reflecting any changes in the library dependencies.
112 <!-- ======================================================================= -->
113 <div class="doc_subsection"><a name="settle">Settle Subversion HEAD</a></div>
114 <div class="doc_text">
116 Use the nightly test reports and 'make check' (deja-gnu based tests) to
117 ensure that recent changes and merged branches have not destabilized LLVM.
118 Platforms which are used less often should be given special attention as they
119 are the most likely to break from commits from the previous step.
123 <!-- ======================================================================= -->
124 <div class="doc_subsection"><a name="tag">Subversion Tag And Branch</a></div>
125 <div class="doc_text">
126 <p>Tag and branch the Subversion HEAD using the following procedure:</p>
129 <p>Request all developers to refrain from committing. Offenders get commit
130 rights taken away (temporarily).</p></li>
133 <p>The Release Manager updates his/her <tt>llvm</tt>, <tt>llvm-test</tt>,
134 and <tt>llvm-gcc</tt> source trees with the latest sources from mainline
135 Subversion. The Release Manager may want to consider using a new working
136 directory for this to keep current uncommitted work separate from release
140 <p>The Release Manager tags his/her <tt>llvm</tt>, <tt>llvm-test</tt>, and
141 <tt>llvm-gcc</tt> working directories with "<tt>RELEASE_XX</tt>" where
142 <tt>XX</tt> is the major and minor release numbers. So, for Release 1.2,
143 <tt>XX=12</tt> and for Release 1.10, <tt>XX=110</tt>.</p>
145 <div class="doc_code">
147 svn copy https://llvm.org/svn/llvm-project/llvm/trunk \
148 https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_<i>XX</i>
149 svn copy https://llvm.org/svn/llvm-project/llvm-gcc-4.0/trunk \
150 https://llvm.org/svn/llvm-project/llvm-gcc-4.0/tags/RELEASE_<i>XX</i>
151 svn copy https://llvm.org/svn/llvm-project/test-suite/trunk \
152 https://llvm.org/svn/llvm-project/test-suite/tags/RELEASE_<i>XX</i>
158 <p>Immediately create Subversion branches based on the
159 <tt>RELEASE_<i>XX</i></tt> tag. The tag should be
160 "<tt>release_<i>XX</i></tt>" (where XX matches that used for the
161 <tt>RELEASE_<i>XX</i></tt> tag). This is where the release distribution
164 <div class="doc_code">
166 svn copy https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_<i>XX</i> \
167 https://llvm.org/svn/llvm-project/llvm/branches/release_<i>XX</i>
168 svn copy https://llvm.org/svn/llvm-project/llvm-gcc-4.0/tags/RELEASE_<i>XX</i> \
169 https://llvm.org/svn/llvm-project/llvm-gcc-4.0/branches/release_<i>XX</i>
170 svn copy https://llvm.org/svn/llvm-project/test-suite/tags/RELEASE_<i>XX</i> \
171 https://llvm.org/svn/llvm-project/test-suite/branches/release_<i>XX</i>
177 <p>Advise developers they can work on Subversion HEAD again.</p></li>
180 <p>The Release Manager and any developers working on the release should switch
181 to the release branch (as all changes to the release will now be done in
182 the branch). The easiest way to do this is to grab another working copy
183 using the following commands:</p>
185 <div class="doc_code">
187 svn co https://llvm.org/svn/llvm-project/llvm/branches/release_<i>XX</i>
188 svn co https://llvm.org/svn/llvm-project/llvm-gcc-4.0/branches/release_<i>XX</i>
189 svn co https://llvm.org/svn/llvm-project/test-suite/branches/release_<i>XX</i>
195 <!-- ======================================================================= -->
196 <div class="doc_subsection"><a name="verchanges">Update LLVM Version</a></div>
197 <div class="doc_text">
199 After creating the LLVM release branch, update the release branchs'
200 autoconf/configure.ac version from X.Xsvn to just X.X. Update it on mainline
201 as well to be the next version (X.X+1svn).
205 <!-- ======================================================================= -->
206 <div class="doc_subsection"><a name="build">Build LLVM</a></div>
207 <div class="doc_text">
209 Build both debug and release (optimized) versions of LLVM on all
210 platforms. Ensure the build is warning and error free on each platform.
214 Build a new version of the LLVM GCC front-end after building the LLVM tools.
215 Once that is complete, go back to the LLVM source tree and build and install
216 the <tt>llvm/runtime</tt> libraries.
220 <!-- ======================================================================= -->
221 <div class="doc_subsection"><a name="check">Run 'make check'</a></div>
222 <div class="doc_text">
224 Run <tt>make check</tt> and ensure there are no unexpected failures. If there
225 are, resolve the failures, commit them back into the release branch, and
226 restart testing by <a href="#build">re-building LLVM</a>.
230 Ensure that '<tt>make check</tt>' passes on all platforms for all targets. If
231 certain failures cannot be resolved before release time, determine if marking
232 them <tt>XFAIL</tt> is appropriate. If not, fix the bug and go back. The test
233 suite must complete with "0 unexpected failures" for release.
237 <!-- ======================================================================= -->
238 <div class="doc_subsection"><a name="test">LLVM Test Suite</a></div>
239 <div class="doc_text">
241 Run the <tt>llvm-test</tt> suite and ensure there are no unacceptable
242 failures. If there are, resolve the failures and go back to <a
243 href="#build">re-building LLVM</a>. The test suite should be run in Nightly
244 Test mode. All tests must pass.
248 <!-- ======================================================================= -->
249 <div class="doc_subsection"><a name="dist">Build the LLVM Source Distributions</a></div>
250 <div class="doc_text">
252 Create source distributions for LLVM, LLVM GCC, and the LLVM Test Suite by
253 exporting the source from Subversion and archiving it. This can be done with
254 the following commands:
257 <div class="doc_code">
259 svn export https://llvm.org/svn/llvm-project/llvm/branches/release_<i>XX</i> llvm
260 svn export https://llvm.org/svn/llvm-project/llvm-gcc-4.0/branches/release_<i>XX</i> llvm-gcc
261 svn export https://llvm.org/svn/llvm-project/test-suite/branches/release_<i>XX</i> llvm-test
262 mkdir cfrontend; mv llvm-gcc cfrontend/src
263 tar -cvf - llvm | gzip > llvm-X.X.tar.gz
264 tar -cvf - llvm-test | gzip > llvm-test-X.X.tar.gz
265 tar -cvf - cfrontend/src | gzip > cfrontend-X.X.source.tar.gz
270 <!-- ======================================================================= -->
271 <div class="doc_subsection"><a name="rpm">Building RPM packages (optional)</a></div>
272 <div class="doc_text">
274 You can, optionally, create source and binary RPM packages for LLVM. These may
275 make it easier to get LLVM into a distribution. This can be done with the
279 <div class="doc_code">
281 make dist # Build the distribution source tarball
282 make dist-check # Check that the source tarball can build itself.
283 cp llvm-M.m.tar.gz /usr/src/redhat/SOURCES # Required by rpmbuild
284 make srpm # for source rpm
285 make rpm # for binary rpm
290 First, use <tt>make dist</tt> to simply build the distribution. Any failures
291 need to be corrected (on the branch). Once <tt>make dist</tt> can be
292 successful, do <tt>make dist-check</tt>. This target will do the same thing as
293 the 'dist' target but also test that distribution to make sure it can build
294 itself and runs <tt>make check</tt> as well. This ensures that needed files
295 are not missing and that the src tarball can be successfully unpacked, built,
296 installed, and cleaned. Once you have a reliable tarball, you need to copy it
297 to the <tt>/usr/src/redhat/SOURCES</tt> directory which is a requirement of
298 the rpmbuild tool. The last two <tt>make</tt> invocations just run rpmbuild to
299 build either a source (<tt>srpm</tt>) or binary (<tt>rpm</tt>) RPM package.
303 <!-- ======================================================================= -->
304 <div class="doc_subsection"><a name="llvmgccbin">Build the LLVM GCC Binary Distribution</a></div>
305 <div class="doc_text">
307 Creating the LLVM GCC binary distribution requires performing the following
308 steps for each supported platform:
313 Build the LLVM GCC front-end. The LLVM GCC front-end must be installed in
314 a directory named <tt>cfrontend/<platform>/llvm-gcc</tt>. For
315 example, the Sparc/Solaris directory is named
316 <tt>cfrontend/sparc/llvm-gcc</tt>.
320 Build the libraries in <tt>llvm/runtime</tt> and install them into the
321 created LLVM GCC installation directory.
325 For systems with non-distributable header files (e.g. Solaris), manually
326 remove header files that the GCC build process has "fixed." This process
327 is admittedly painful, but not as bad as it looks; these header files are
328 almost always easily identifiable with simple grep expressions and are
329 installed in only a few directories in the GCC installation directory.
333 Add the copyright files and header file fix script.
337 Archive and compress the installation directory. These can be found in
338 previous releases of the LLVM-GCC front-end.
344 <!-- ======================================================================= -->
345 <div class="doc_subsection"><a name="webupdates">Update the LLVM Website</a></div>
346 <div class="doc_text">
348 Check out the <tt>website</tt> module from Subversion. Create a new
349 subdirectory X.X in the releases directory. Place the <tt>llvm</tt>,
350 <tt>llvm-test</tt>, <tt>llvm-gcc</tt> source, and <tt>llvm-gcc</tt> binaries
351 in this new directory. Copy the <tt>llvm/docs</tt> and <tt>LICENSE.txt</tt>
352 files into this new directory. Update the <tt>releases/download.html</tt> file
353 with the new release. Update the <tt>releases/index.html</tt> with the new
354 release. Finally, update the main page (<tt>index.html</tt> and sidebar) to
355 point to the new release and release announcement. Make sure this all gets
356 commited back into Subversion.
361 <div class="doc_subsection"><a name="release">Release</a></div>
362 <div class="doc_text">
363 <p>Release the distribution tarball to the public. This consists of generating
364 several tarballs. The first set, the source distributions, are automatically
365 generated by the "make dist" and "make dist-check". There are gzip, bzip2, and
366 zip versions of these bundles.</p>
367 <p>The second set of tarballs is the binary release. When "make dist-check"
368 succeeds, it will have created an _install directory into which it installed
369 the binary release. You need to rename that directory as "llvm" and then
370 create tarballs from the contents of that "llvm" directory.</p>
371 <p>Finally, use rpm to make an rpm package based on the llvm.spec file. Don't
372 forget to update the version number, documentation, etc. in the llvm.spec
377 <!-- *********************************************************************** -->
378 <div class="doc_section"><a name="dist_targets">Distribution Targets</a></div>
379 <!-- *********************************************************************** -->
381 <!-- ======================================================================= -->
382 <div class="doc_subsection">Overview</div>
383 <div class="doc_text">
385 The first thing you need to understand is that there are multiple make targets
386 to support this feature. Here's an overview, we'll delve into the details
391 <li><b>distdir</b> - builds the distribution directory from which the
392 distribution will be packaged</li>
393 <li><b>dist</b> - builds each of the distribution tarballs (tar.gz,
394 tar.bzip2, .zip). These can be built individually as well, with separate
396 <li><b>dist-check</b> - this is identical to <tt>dist</tt> but includes a
397 check on the distribution that ensures the tarball can: unpack
398 successfully, compile correctly, pass '<tt>make check</tt>', and pass
399 '<tt>make clean</tt>'.</li>
400 <li><b>dist-clean</b>- this just does a normal clean but also cleans up the
401 stuff generated by the other three <tt>dist</tt> targets (above).</li>
405 Okay, that's the basic functionality. When making a release, we want to ensure
406 that the tree you build the distribution from passes
407 <tt>dist-check</tt>. Beyond fixing the usual bugs, there is generally one
408 impediment to making the release in this fashion: missing files. The
409 <tt>dist-check</tt> process guards against that possibility. It will either
410 fail and that failure will indicate what's missing, or it will succeed meaning
411 that it has proved that the tarballs can actually succeed in building LLVM
412 correctly and that it passes <tt>make check</tt>.
416 <!-- ======================================================================= -->
418 <div class="doc_subsection">distdir</div>
419 <div class="doc_text">
421 This target builds the distribution directory which is the directory from
422 which the tarballs are generated. The distribution directory has the same
423 name as the release, e.g. LLVM-1.7). This target goes through the following
428 <li>First, if there was an old distribution directory (for the current
429 release), it is removed in its entirety and you see <tt>Removing old
431 <li>Second, it issues a <tt>make all ENABLE_OPTIMIZED=3D1</tt> to ensure
432 that the everything in your tree can be built in release mode. Often
433 times there are discrepancies in building between debug and release
434 modes so it enforces release mode first. If that fails, the
435 <tt>distdir</tt> target fails too. This is preceded by the message
436 <tt>Making 'all' to verify build</tt>.</li>
437 <li>Next, it traverses your source tree and copies it to a new directory
438 that has the name of the release (<tt>LLVM-M.m</tt> in our current
439 case). This is the directory that will get tar'd. It contains all the
440 software that needs to be in the distribution. During the copying
441 process, it omits generated files, CVS directories, and any other
442 "cruft" that's in your build tree. This is done to eliminate the
443 possibility of huge distribution tarballs that include useless or
444 irrelevant stuff in them. This is the trickiest part of making the
445 distribution. Done manually you will either include stuff that
446 shouldn't be in the distribution or exclude stuff that should. This
447 step is preceded by the message <tt>Building Distribution Directory
449 <li>The distribution directory is then traversed and all <tt>CVS</tt> or
450 <tt>.svn</tt> directories are removed. You see: <tt>Eliminating CVS/.svn
451 directories from distribution</tt></li>
452 <li>The recursive <tt>dist-hook</tt> target is executed. This gives each
453 directory a chance to modify the distribution in some way (more on this
455 <li>The distribution directory is traversed and the correct file
456 permissions and modes are set based on the type of file.</li>
460 To control the process of making the distribution directory correctly, each
461 Makefile can utilize two features:
465 <li><b><tt>EXTRA_DIST</tt></B> - this make variable specifies which files
466 it should distribute. By default, all source files are automatically
467 included for distribution as well as certain <tt>well known</tt> files
468 (see DistAlways variable in Makefile.rules for details). Each Makefile
469 specifies, via the <tt>EXTRA_DIST</tt> variable, which additional files
470 need to be distributed. Only those files that are needed to build LLVM
471 should be added to <tt>EXTRA_DIST</tt>. <tt>EXTRA_DIST</tt> contains a
472 list of file or directory names that should be distributed. For example,
473 the top level Makefile contains <tt>EXTRA_DIST := test llvm.spec
474 include</tt>. This means that in addition to regular things that are
475 distributed at the top level (<tt>CREDITS.txt, LICENSE.txt</tt>, etc.)
476 the distribution should contain the entire <tt>test</tt> and
477 <tt>include</tt> directories as well as the <tt>llvm.spec</tt> file.</li>
478 <li><b><tt>dist-hook</tt></B> - this make target can be used to alter the
479 content of the distribution directory. For example, in the top level
480 Makefile there is some logic to eliminate files in the <tt>include</tt>
481 subtree that are generated by the configure script. These should not be
482 distributed. Similarly, any <tt>dist-hook</tt> target found in any
483 directory can add or remove or modify things just before it gets
484 packaged. Any transformation is permitted. Generally, not much is
489 You will see various messages if things go wrong:
493 <li>During the copying process, any files that are missing will be flagged
494 with: <tt>===== WARNING: Distribution Source 'dir/file' Not Found!</tt>
495 These must be corrected by either adding the file or removing it from
496 <tt>EXTRA_DIST</tt>.</li>
497 <li>If you build the distribution with <tt>VERBOSE=1</tt>, then you might
498 also see: <tt>Skipping non-existent 'dir/file'</tt> in certain cases
499 where it's okay to skip the file.</li>
500 <li>The target can fail if any of the things it does fail. Error messages
501 should indicate what went wrong.</li>
505 <!-- ======================================================================= -->
506 <div class="doc_subsection">dist</div>
507 <div class="doc_text">
509 This target does exactly what <tt>distdir</tt> target does, but also includes
510 assembling the tarballs. There are actually four related targets here:
514 <li><b><tt>dist-gzip</tt></b>: package the gzipped distribution tar
515 file. The distribution directory is packaged into a single file ending
516 in <tt>.tar.gz</tt> which is gzip compressed.</li>
517 <li><b><tt>dist-bzip2</tt></b>: package the bzip2 distribution tar file.
518 The distribution directory is packaged into a single file ending in
519 <tt>.tar.bzip2</tt> which is bzip2 compressed.</li>
520 <li><b><tt>dist-zip</tt></b>: package the zip distribution file. The
521 distribution directory is packaged into a single file ending in
522 <tt>.zip</tt> which is zip compressed.</li>
523 <li><b><tt>dist</tt></b>: does all three, dist-gzip, dist-bzip2,
528 <!-- ======================================================================= -->
529 <div class="doc_subsection">dist-check</div>
530 <div class="doc_text">
532 This target checks the distribution. The basic idea is that it unpacks the
533 distribution tarball and ensures that it can build. It takes the following
538 <li>It depends on the <tt>dist-gzip</tt> target which, if it hasn't already
539 been built, builds the gzip tar bundle (see dist and distdir
541 <li>removes any pre-existing <tt>_distcheckdir</tt> at the top level.</li>
542 <li>creates a new <tt>_distcheckdir</tt> directory at the top level.</li>
543 <li>creates a <tt>build</tt> subdirectory and an <tt>install</tt>
544 subdirectory under <tt>_distcheckdir</tt>.</li>
545 <li>unzips and untars the release tarball into <tt>_distcheckdir</tt>,
546 creating <tt>LLVM-1.7</tt> directory (from the tarball).</li>
547 <li>in the build subdirectory, it configures with appropriate options to
548 build from the unpacked source tarball into the <tt>build</tt> directory
549 with installation in the <tt>install</tt> directory.</li>
550 <li>runs <tt>make all</tt></li>
551 <li>runs <tt>make </tt><tt>check</tt></li>
552 <li>runs <tt>make install</tt></li>
553 <li>runs <tt>make uninstall</tt></li>
554 <li>runs <tt>make dist</tt></li>
555 <li>runs <tt>make clean</tt></li>
556 <li>runs <tt>make dist-clean</tt></li>
560 If it can pass all that, the distribution will be deemed distribution worth y
564 <pre>===== LLVM-1.7.tar.gz Ready For Distribution =====</pre>
567 This means the tarball should then be tested on other platforms and have the
568 nightly test run against it. If those all pass, THEN it is ready for
573 A note about disk space: using <tt>dist-check</tt> will easily triple the
574 amount of disk space your build tree is using. You might want to check
575 available space before you begin.
579 <!-- ======================================================================= -->
580 <div class="doc_subsection">dist-clean</div>
581 <div class="doc_text">
583 In addition to doing a normal <tt>clean</tt>, this target will clean up the
584 files and directories created by the distribution targets. In particular the
585 distribution directory (<tt>LLVM-X.X</tt>), check directory
586 (<tt>_distcheckdir</tt>), and the various tarballs will be removed. You do
587 this after the release has shipped and you no longer need this stuff in your
592 <!-- *********************************************************************** -->
595 <a href="http://jigsaw.w3.org/css-validator/check/referer"><img
596 src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!"></a>
597 <a href="http://validator.w3.org/check/referer"><img
598 src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!" /></a>
600 <a href="mailto:rspencer@x10sys.com">Reid Spencer</a><br>
601 <a href="http://llvm.cs.uiuc.edu">The LLVM Compiler Infrastructure</a>
603 Last modified: $Date$