| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
| <html> |
| <head> |
| <title>OpenJDK Build README</title> |
| </head> |
| <body style="background-color:aquamarine"> |
| |
| <!-- ====================================================== --> |
| <table width="100%"> |
| <tr> |
| <td align="center"> |
| <img alt="OpenJDK" |
| src="http://openjdk.java.net/images/openjdk.png" |
| width=256> |
| </td> |
| </tr> |
| <tr> |
| <td align=center> |
| <h1>OpenJDK Build README</h1> |
| </td> |
| </tr> |
| </table> |
| |
| <!-- ====================================================== --> |
| <hr> |
| <h2><a name="introduction">Introduction</a></h2> |
| <blockquote> |
| This README file contains build instructions for the |
| <a href="http://openjdk.java.net" target="_blank">OpenJDK</a>. |
| Building the source code for the |
| OpenJDK |
| requires |
| a certain degree of technical expertise. |
| |
| <!-- ====================================================== --> |
| <h3>!!!!!!!!!!!!!!! THIS IS A MAJOR RE-WRITE of this document. !!!!!!!!!!!!!</h3> |
| <blockquote> |
| Some Headlines: |
| <ul> |
| <li> |
| The build is now a "<code>configure && make</code>" style build |
| </li> |
| <li> |
| Any GNU make 3.81 or newer should work |
| </li> |
| <li> |
| The build should scale, i.e. more processors should |
| cause the build to be done in less wall-clock time |
| </li> |
| <li> |
| Nested or recursive make invocations have been significantly |
| reduced, as has the total fork/exec or spawning |
| of sub processes during the build |
| </li> |
| <li> |
| Windows MKS usage is no longer supported |
| </li> |
| <li> |
| Windows Visual Studio <code>vsvars*.bat</code> and |
| <code>vcvars*.bat</code> files are run automatically |
| </li> |
| <li> |
| Ant is no longer used when building the OpenJDK |
| </li> |
| <li> |
| Use of ALT_* environment variables for configuring the |
| build is no longer supported |
| </li> |
| </ul> |
| </blockquote> |
| </blockquote> |
| |
| <!-- ====================================================== --> |
| <hr> |
| <h2><a name="contents">Contents</a></h2> |
| <blockquote> |
| <ul> |
| <li><a href="#introduction">Introduction</a></li> |
| |
| <li><a href="#hg">Use of Mercurial</a> |
| <ul> |
| <li><a href="#get_source">Getting the Source</a></li> |
| <li><a href="#repositories">Repositories</a></li> |
| </ul> |
| </li> |
| |
| <li><a href="#building">Building</a> |
| <ul> |
| <li><a href="#setup">System Setup</a> |
| <ul> |
| <li><a href="#linux">Linux</a></li> |
| <li><a href="#solaris">Solaris</a></li> |
| <li><a href="#macosx">Mac OS X</a></li> |
| <li><a href="#windows">Windows</a></li> |
| </ul> |
| </li> |
| <li><a href="#configure">Configure</a></li> |
| <li><a href="#make">Make</a></li> |
| </ul> |
| </li> |
| <li><a href="#testing">Testing</a></li> |
| </ul> |
| <hr> |
| <ul> |
| <li><a href="#hints">Appendix A: Hints and Tips</a> |
| <ul> |
| <li><a href="#faq">FAQ</a></li> |
| <li><a href="#performance">Build Performance Tips</a></li> |
| <li><a href="#troubleshooting">Troubleshooting</a></li> |
| </ul> |
| </li> |
| <li><a href="#gmake">Appendix B: GNU Make Information</a></li> |
| <li><a href="#buildenvironments">Appendix C: Build Environments</a></li> |
| |
| <!-- Leave out |
| <li><a href="#mapping">Appendix D: Mapping Old Builds to the New Builds</a></li> |
| --> |
| |
| </ul> |
| </blockquote> |
| |
| <!-- ====================================================== --> |
| <hr> |
| <h2><a name="hg">Use of Mercurial</a></h2> |
| <blockquote> |
| The OpenJDK sources are maintained with the revision control system |
| <a href="http://mercurial.selenic.com/wiki/Mercurial">Mercurial</a>. |
| If you are new to Mercurial, please see the |
| <a href="http://mercurial.selenic.com/wiki/BeginnersGuides"> |
| Beginner Guides</a> |
| or refer to the <a href="http://hgbook.red-bean.com/"> |
| Mercurial Book</a>. |
| The first few chapters of the book provide an excellent overview of |
| Mercurial, what it is and how it works. |
| <br> |
| For using Mercurial with the OpenJDK refer to the |
| <a href="http://openjdk.java.net/guide/repositories.html#installConfig"> |
| Developer Guide: Installing and Configuring Mercurial</a> |
| section for more information. |
| |
| <h3><a name="get_source">Getting the Source</a></h3> |
| <blockquote> |
| To get the entire set of OpenJDK Mercurial repositories |
| use the script <code>get_source.sh</code> located in the |
| root repository: |
| <blockquote> |
| <code> |
| hg clone http://hg.openjdk.java.net/jdk8/jdk8 |
| <i>YourOpenJDK</i> |
| <br> |
| cd <i>YourOpenJDK</i> |
| <br> |
| bash ./get_source.sh |
| </code> |
| </blockquote> |
| Once you have all the repositories, keep in mind that each |
| repository is its own independent repository. |
| You can also re-run <code>./get_source.sh</code> anytime to |
| pull over all the latest changesets in all the repositories. |
| This set of nested repositories has been given the term |
| "forest" and there are various ways to apply the same |
| <code>hg</code> command to each of the repositories. |
| For example, the script <code>make/scripts/hgforest.sh</code> |
| can be used to repeat the same <code>hg</code> |
| command on every repository, e.g. |
| <blockquote> |
| <code> |
| cd <i>YourOpenJDK</i> |
| <br> |
| bash ./make/scripts/hgforest.sh status |
| </code> |
| </blockquote> |
| </blockquote> |
| |
| <h3><a name="repositories">Repositories</a></h3> |
| <blockquote> |
| <p>The set of repositories and what they contain:</p> |
| <table border="1"> |
| <thead> |
| <tr> |
| <th>Repository</th> |
| <th>Contains</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td> |
| . (root) |
| </td> |
| <td> |
| common configure and makefile logic |
| </td> |
| </tr> |
| <tr> |
| <td> |
| hotspot |
| </td> |
| <td> |
| source code and make files for building |
| the OpenJDK Hotspot Virtual Machine |
| </td> |
| </tr> |
| <tr> |
| <td> |
| langtools |
| </td> |
| <td> |
| source code for the OpenJDK javac and language tools |
| </td> |
| </tr> |
| <tr> |
| <td> |
| jdk |
| </td> |
| <td> |
| source code and make files for building |
| the OpenJDK runtime libraries and misc files |
| </td> |
| </tr> |
| <tr> |
| <td> |
| jaxp |
| </td> |
| <td> |
| source code for the OpenJDK JAXP functionality |
| </td> |
| </tr> |
| <tr> |
| <td> |
| jaxws |
| </td> |
| <td> |
| source code for the OpenJDK JAX-WS functionality |
| </td> |
| </tr> |
| <tr> |
| <td> |
| corba |
| </td> |
| <td> |
| source code for the OpenJDK Corba functionality |
| </td> |
| </tr> |
| <tr> |
| <td> |
| nashorn |
| </td> |
| <td> |
| source code for the OpenJDK JavaScript implementation |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </blockquote> |
| |
| <h3><a name="guidelines">Repository Source Guidelines</a></h3> |
| <blockquote> |
| There are some very basic guidelines: |
| <ul> |
| <li> |
| Use of whitespace in source files |
| (.java, .c, .h, .cpp, and .hpp files) |
| is restricted. |
| No TABs, no trailing whitespace on lines, and files |
| should not terminate in more than one blank line. |
| </li> |
| <li> |
| Files with execute permissions should not be added |
| to the source repositories. |
| </li> |
| <li> |
| All generated files need to be kept isolated from |
| the files |
| maintained or managed by the source control system. |
| The standard area for generated files is the top level |
| <code>build/</code> directory. |
| </li> |
| <li> |
| The default build process should be to build the product |
| and nothing else, in one form, e.g. a product (optimized), |
| debug (non-optimized, -g plus assert logic), or |
| fastdebug (optimized, -g plus assert logic). |
| </li> |
| <li> |
| The <tt>.hgignore</tt> file in each repository |
| must exist and should |
| include <tt>^build/</tt>, <tt>^dist/</tt> and |
| optionally any |
| <tt>nbproject/private</tt> directories. |
| <strong>It should NEVER</strong> include |
| anything in the |
| <tt>src/</tt> or <tt>test/</tt> |
| or any managed directory area of a repository. |
| </li> |
| <li> |
| Directory names and file names should never contain |
| blanks or |
| non-printing characters. |
| </li> |
| <li> |
| Generated source or binary files should NEVER be added to |
| the repository (that includes <tt>javah</tt> output). |
| There are some exceptions to this rule, in particular |
| with some of the generated configure scripts. |
| </li> |
| <li> |
| Files not needed for typical building |
| or testing of the repository |
| should not be added to the repository. |
| </li> |
| </ul> |
| </blockquote> |
| |
| </blockquote> |
| |
| <!-- ====================================================== --> |
| <hr> |
| <h2><a name="building">Building</a></h2> |
| <blockquote> |
| The very first step in building the OpenJDK is making sure the |
| system itself has everything it needs to do OpenJDK builds. |
| Once a system is setup, it generally doesn't need to be done again. |
| <br> |
| Building the OpenJDK is now done with running a |
| <a href="#configure"><code>configure</code></a> |
| script which will try and find and verify you have everything |
| you need, followed by running |
| <a href="#gmake"><code>make</code></a>, e.g. |
| <blockquote> |
| <b> |
| <code> |
| bash ./configure<br> |
| make all |
| </code> |
| </b> |
| </blockquote> |
| Where possible the <code>configure</code> script will attempt to located the |
| various components in the default locations or via component |
| specific variable settings. |
| When the normal defaults fail or components cannot be found, |
| additional <code>configure</code> options may be necessary to help <code>configure</code> |
| find the necessary tools for the build, or you may need to |
| re-visit the setup of your system due to missing software |
| packages. |
| <br> |
| <strong>NOTE:</strong> The <code>configure</code> script |
| file does not have |
| execute permissions and will need to be explicitly run with |
| <code>bash</code>, |
| see the <a href="#guidelines">source guidelines</a>. |
| |
| <!-- ====================================================== --> |
| <hr> |
| <h3><a name="setup">System Setup</a></h3> |
| <blockquote> |
| Before even attempting to use a system to build the OpenJDK |
| there are some very basic system setups needed. |
| For all systems: |
| <ul> |
| <li> |
| Be sure the GNU make utility is version 3.81 or newer, |
| e.g. run "<code>make -version</code>" |
| </li> |
| <li> |
| Install a |
| <a name="bootjdk">Bootstrap JDK</a>. |
| All OpenJDK builds require access to a previously released |
| JDK called the <i>bootstrap JDK</i> or <i>boot JDK.</i> |
| The general rule is that the bootstrap JDK |
| must be an instance of the previous major |
| release of the JDK. In addition, there may be |
| a requirement to use a release at or beyond a |
| particular update level. |
| <br> <br> |
| |
| <b><i>Building JDK 8 requires use of a version |
| of JDK 7 that is at Update 7 or newer. JDK 8 |
| developers should not use JDK 8 as the boot |
| JDK, to ensure that JDK 8 dependencies are |
| not introduced into the parts of the system |
| that are built with JDK 7.</i></b> |
| |
| <br> <br> |
| The JDK 7 binaries can be downloaded from Oracle's |
| <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" |
| target="_blank">JDK 7 download site</a>. |
| For build performance reasons |
| is very important that this bootstrap JDK be made available |
| on the local disk of the machine doing the build. |
| You should add its <code>bin</code> directory |
| to the <code>PATH</code> environment variable. |
| If <code>configure</code> has any issues finding this JDK, you may |
| need to use the <code>configure</code> option |
| <code>--with-boot-jdk</code>. |
| </li> |
| <li> |
| Ensure that GNU make, the Bootstrap JDK, |
| and the compilers are all |
| in your PATH environment variable |
| </li> |
| </ul> |
| And for specific systems: |
| <table border="1"> |
| <thead> |
| <tr> |
| <th>Linux</th> |
| <th>Solaris</th> |
| <th>Windows</th> |
| <th>Mac OS X</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td> |
| Install all the software development |
| packages needed including |
| <a href="#alsa">alsa</a>, |
| <a href="#freetype">freetype</a>, |
| <a href="#cups">cups</a>, and |
| <a href="#xrender">xrender</a>. |
| <br> |
| See |
| <a href="#SDBE">specific system packages</a>. |
| </td> |
| <td> |
| Install all the software development |
| packages needed including |
| <a href="#studio">Studio Compilers</a>, |
| <a href="#freetype">freetype</a>, |
| <a href="#cups">cups</a>, and |
| <a href="#xrender">xrender</a>. |
| <br> |
| See |
| <a href="#SDBE">specific system packages</a>. |
| </td> |
| <td> |
| <ul> |
| <li> |
| Install one of |
| <a href="#cygwin">CYGWIN</a> or |
| <a href="#msys">MinGW/MSYS</a> |
| </li> |
| <li> |
| Install |
| <a href="#vs2010">Visual Studio 2010</a> |
| </li> |
| </ul> |
| </td> |
| <td> |
| Install |
| <a href="https://developer.apple.com/xcode/">XCode 4.5.2</a> |
| and also install the "Command line tools" found under the |
| preferences pane "Downloads" |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <h4><a name="linux">Linux</a></h4> |
| <blockquote> |
| With Linux, try and favor the system packages over |
| building your own |
| or getting packages from other areas. |
| Most Linux builds should be possible with the system's |
| available packages. |
| <br> |
| Note that some Linux systems have a habit of pre-populating |
| your environment variables for you, for example <code>JAVA_HOME</code> |
| might get pre-defined for you to refer to the JDK installed on |
| your Linux system. |
| You will need to unset <code>JAVA_HOME</code>. |
| It's a good idea to run <code>env</code> and verify the |
| environment variables you are getting from the default system |
| settings make sense for building the OpenJDK. |
| |
| </blockquote> |
| |
| <h4><a name="solaris">Solaris</a></h4> |
| <blockquote> |
| <h5><a name="studio">Studio Compilers</a></h5> |
| <blockquote> |
| At a minimum, the |
| <a href="http://www.oracle.com/technetwork/server-storage/solarisstudio/downloads/index.htm" target="_blank"> |
| Studio 12 Update 1 Compilers</a> |
| (containing version 5.10 of the C and C++ compilers) is required, |
| including specific patches. |
| <p> |
| The Solaris SPARC patch list is: |
| <ul> |
| <li> |
| 118683-05: SunOS 5.10: Patch for profiling libraries and assembler |
| </li> |
| <li> |
| 119963-21: SunOS 5.10: Shared library patch for C++ |
| </li> |
| <li> |
| 120753-08: SunOS 5.10: Microtasking libraries (libmtsk) patch |
| </li> |
| <li> |
| 128228-09: Sun Studio 12 Update 1: Patch for Sun C++ Compiler |
| </li> |
| <li> |
| 141860-03: Sun Studio 12 Update 1: Patch for Compiler Common patch for Sun C C++ F77 F95 |
| </li> |
| <li> |
| 141861-05: Sun Studio 12 Update 1: Patch for Sun C Compiler |
| </li> |
| <li> |
| 142371-01: Sun Studio 12.1 Update 1: Patch for dbx |
| </li> |
| <li> |
| 143384-02: Sun Studio 12 Update 1: Patch for debuginfo handling |
| </li> |
| <li> |
| 143385-02: Sun Studio 12 Update 1: Patch for Compiler Common patch for Sun C C++ F77 F95 |
| </li> |
| <li> |
| 142369-01: Sun Studio 12.1: Patch for Performance Analyzer Tools |
| </li> |
| </ul> |
| <p> |
| The Solaris X86 patch list is: |
| <ul> |
| <li> |
| 119961-07: SunOS 5.10_x86, x64, Patch for profiling libraries and assembler |
| </li> |
| <li> |
| 119964-21: SunOS 5.10_x86: Shared library patch for C++_x86 |
| </li> |
| <li> |
| 120754-08: SunOS 5.10_x86: Microtasking libraries (libmtsk) patch |
| </li> |
| <li> |
| 141858-06: Sun Studio 12 Update 1_x86: Sun Compiler Common patch for x86 backend |
| </li> |
| <li> |
| 128229-09: Sun Studio 12 Update 1_x86: Patch for C++ Compiler |
| </li> |
| <li> |
| 142363-05: Sun Studio 12 Update 1_x86: Patch for C Compiler |
| </li> |
| <li> |
| 142368-01: Sun Studio 12.1_x86: Patch for Performance Analyzer Tools |
| </li> |
| </ul> |
| <p> |
| Place the <code>bin</code> directory in <code>PATH</code>. |
| <p> |
| The Oracle Solaris Studio Express compilers at: |
| <a href="http://www.oracle.com/technetwork/server-storage/solarisstudio/downloads/index-jsp-142582.html" target="_blank"> |
| Oracle Solaris Studio Express Download site</a> |
| are also an option, although these compilers have not |
| been extensively used yet. |
| </blockquote> |
| |
| </blockquote> <!-- Solaris --> |
| |
| <h4><a name="windows">Windows</a></h4> |
| <blockquote> |
| |
| <h5><a name="toolkit">Windows Unix Toolkit</a></h5> |
| <blockquote> |
| Building on Windows requires a Unix-like environment, notably a |
| Unix-like shell. |
| There are several such environments available of which |
| <a href="http://www.cygwin.com/">Cygwin</a> and |
| <a href="http://www.mingw.org/wiki/MSYS">MinGW/MSYS</a> are |
| currently supported for |
| the OpenJDK build. One of the differences of these |
| systems from standard Windows tools is the way |
| they handle Windows path names, particularly path names which contain |
| spaces, backslashes as path separators and possibly drive letters. |
| Depending |
| on the use case and the specifics of each environment these path |
| problems can |
| be solved by a combination of quoting whole paths, translating |
| backslashes to |
| forward slashes, escaping backslashes with additional backslashes and |
| translating the path names to their |
| <a href="http://en.wikipedia.org/wiki/8.3_filename"> |
| "8.3" version</a>. |
| |
| <h6><a name="cygwin">CYGWIN</a></h6> |
| <blockquote> |
| CYGWIN is an open source, Linux-like environment which tries to emulate |
| a complete POSIX layer on Windows. It tries to be smart about path names |
| and can usually handle all kinds of paths if they are correctly quoted |
| or escaped although internally it maps drive letters <code><drive>:</code> |
| to a virtual directory <code>/cygdrive/<drive></code>. |
| <p> |
| You can always use the <code>cygpath</code> utility to map pathnames with spaces |
| or the backslash character into the <code>C:/</code> style of pathname |
| (called 'mixed'), e.g. <code>cygpath -s -m "<i>path</i>"</code>. |
| </p> |
| <p> |
| Note that the use of CYGWIN creates a unique problem with regards to |
| setting <a href="#path"><code>PATH</code></a>. Normally on Windows |
| the <code>PATH</code> variable contains directories |
| separated with the ";" character (Solaris and Linux use ":"). |
| With CYGWIN, it uses ":", but that means that paths like "C:/path" |
| cannot be placed in the CYGWIN version of <code>PATH</code> and |
| instead CYGWIN uses something like <code>/cygdrive/c/path</code> |
| which CYGWIN understands, but only CYGWIN understands. |
| </p> |
| <p> |
| The OpenJDK build requires CYGWIN version 1.7.16 or newer. |
| Information about CYGWIN can |
| be obtained from the CYGWIN website at |
| <a href="http://www.cygwin.com" target="_blank">www.cygwin.com</a>. |
| </p> |
| <p> |
| By default CYGWIN doesn't install all the tools required for building |
| the OpenJDK. |
| Along with the default installation, you need to install |
| the following tools. |
| <blockquote> |
| <table border="1"> |
| <thead> |
| <tr> |
| <td>Binary Name</td> |
| <td>Category</td> |
| <td>Package</td> |
| <td>Description</td> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td>ar.exe</td> |
| <td>Devel</td> |
| <td>binutils</td> |
| <td> |
| The GNU assembler, linker and binary utilities |
| </td> |
| </tr> |
| <tr> |
| <td>make.exe</td> |
| <td>Devel</td> |
| <td>make</td> |
| <td> |
| The GNU version of the 'make' utility built for CYGWIN |
| </td> |
| </tr> |
| <tr> |
| <td>m4.exe</td> |
| <td>Interpreters</td> |
| <td>m4</td> |
| <td> |
| GNU implementation of the traditional Unix macro |
| processor |
| </td> |
| </tr> |
| <tr> |
| <td>cpio.exe</td> |
| <td>Utils</td> |
| <td>cpio</td> |
| <td> |
| A program to manage archives of files |
| </td> |
| </tr> |
| <tr> |
| <td>gawk.exe</td> |
| <td>Utils</td> |
| <td>awk</td> |
| <td> |
| Pattern-directed scanning and processing language |
| </td> |
| </tr> |
| <tr> |
| <td>file.exe</td> |
| <td>Utils</td> |
| <td>file</td> |
| <td> |
| Determines file type using 'magic' numbers |
| </td> |
| </tr> |
| <tr> |
| <td>zip.exe</td> |
| <td>Archive</td> |
| <td>zip</td> |
| <td> |
| Package and compress (archive) files |
| </td> |
| </tr> |
| <tr> |
| <td>unzip.exe</td> |
| <td>Archive</td> |
| <td>unzip</td> |
| <td> |
| Extract compressed files in a ZIP archive |
| </td> |
| </tr> |
| <tr> |
| <td>free.exe</td> |
| <td>System</td> |
| <td>procps</td> |
| <td> |
| Display amount of free and used memory in the system |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </blockquote> |
| Note that the CYGWIN software can conflict with other non-CYGWIN |
| software on your Windows system. |
| CYGWIN provides a |
| <a href="http://cygwin.com/faq/faq.using.html" target="_blank">FAQ</a> for |
| known issues and problems, of particular interest is the |
| section on |
| <a href="http://cygwin.com/faq/faq.using.html#faq.using.bloda" target="_blank"> |
| BLODA (applications that interfere with CYGWIN)</a>. |
| </blockquote> |
| |
| <h6><a name="msys">MinGW/MSYS</a></h6> |
| <blockquote> |
| MinGW ("Minimalist GNU for Windows") is a collection of free Windows |
| specific header files and import libraries combined with GNU toolsets that |
| allow one to produce native Windows programs that do not rely on any |
| 3rd-party C runtime DLLs. MSYS is a supplement to MinGW which allows building |
| applications and programs which rely on traditional UNIX tools to |
| be present. Among others this includes tools like <code>bash</code> |
| and <code>make</code>. |
| See <a href="http://www.mingw.org/wiki/MSYS" target="_blank">MinGW/MSYS</a> |
| for more information. |
| <p> |
| Like Cygwin, MinGW/MSYS can handle different types of path formats. They |
| are internally converted to paths with forward slashes and drive letters |
| <code><drive>:</code> replaced by a virtual |
| directory <code>/<drive></code>. Additionally, MSYS automatically |
| detects binaries compiled for the MSYS environment and feeds them with the |
| internal, Unix-style path names. If native Windows applications are called |
| from within MSYS programs their path arguments are automatically converted |
| back to Windows style path names with drive letters and backslashes as |
| path separators. This may cause problems for Windows applications which |
| use forward slashes as parameter separator (e.g. <code>cl /nologo /I</code>) |
| because MSYS may wrongly <a href="http://mingw.org/wiki/Posix_path_conversion"> |
| replace such parameters by drive letters</a>. |
| </p> |
| <p> |
| In addition to the tools which will be installed |
| by default, you have |
| to manually install the |
| <code>msys-zip</code> and |
| <code>msys-unzip</code> packages. |
| This can be easily done with the MinGW command line installer: |
| <blockquote> |
| <code>mingw-get.exe install msys-zip</code> |
| <br> |
| <code>mingw-get.exe install msys-unzip</code> |
| </blockquote> |
| </blockquote> |
| |
| </blockquote> |
| |
| <h5><a name="vs2010">Visual Studio 2010 Compilers</a></h5> |
| <blockquote> |
| <p> |
| The 32-bit and 64-bit OpenJDK Windows build requires |
| Microsoft Visual Studio C++ 2010 (VS2010) Professional |
| Edition or Express compiler. |
| The compiler and other tools are expected to reside |
| in the location defined by the variable |
| <code>VS100COMNTOOLS</code> which |
| is set by the Microsoft Visual Studio installer. |
| </p> |
| <p> |
| Only the C++ part of VS2010 is needed. |
| Try to let the installation go to the default |
| install directory. |
| Always reboot your system after installing VS2010. |
| The system environment variable VS100COMNTOOLS |
| should be |
| set in your environment. |
| </p> |
| <p> |
| Make sure that TMP and TEMP are also set |
| in the environment |
| and refer to Windows paths that exist, |
| like <code>C:\temp</code>, |
| not <code>/tmp</code>, not <code>/cygdrive/c/temp</code>, |
| and not <code>C:/temp</code>. |
| <code>C:\temp</code> is just an example, |
| it is assumed that this area is |
| private to the user, so by default |
| after installs you should |
| see a unique user path in these variables. |
| </p> |
| </blockquote> |
| |
| |
| </blockquote> <!-- Windows --> |
| |
| <h4><a name="macosx">Mac OS X</a></h4> |
| <blockquote> |
| Make sure you get the right XCode version. |
| </blockquote> <!-- Mac OS X --> |
| |
| </blockquote> |
| |
| <!-- ====================================================== --> |
| <hr> |
| <h3><a name="configure">Configure</a></h3> |
| <blockquote> |
| The basic invocation of the <code>configure</code> script |
| looks like: |
| <blockquote> |
| <b><code>bash ./configure [<i>options</i>]</code></b> |
| </blockquote> |
| This will create an output directory containing the |
| "configuration" and setup an area for the build result. |
| This directory typically looks like: |
| <blockquote> |
| <b><code>build/linux-x64-normal-server-release</code></b> |
| </blockquote> |
| <code>configure</code> will try to figure out what system you are running on |
| and where all necessary build components are. |
| If you have all prerequisites for building installed, |
| it should find everything. |
| If it fails to detect any component automatically, |
| it will exit and inform you about the problem. |
| When this happens, read more below in |
| <a href="#configureoptions">the <code>configure</code> options</a>. |
| <p> |
| Some examples: |
| </p> |
| <table border="1"> |
| <thead> |
| <tr> |
| <th>Description</th> |
| <th>Configure Command Line</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td>Windows 32bit build with freetype specified</td> |
| <td> |
| <code>bash ./configure --with-freetype=/cygdrive/c/freetype-i586 --with-target-bits=32</code> |
| </td> |
| </tr> |
| <tr> |
| <td>Debug 64bit Build</td> |
| <td> |
| <code>bash ./configure --enable-debug --with-target-bits=64</code> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <!-- ====================================================== --> |
| <h4><a name="configureoptions">Configure Options</a></h4> |
| <blockquote> |
| Complete details on all the OpenJDK <code>configure</code> options can |
| be seen with: |
| <blockquote> |
| <b><code>bash ./configure --help=short</code></b> |
| </blockquote> |
| Use <code>-help</code> to see all the <code>configure</code> options |
| available. |
| |
| You can generate any number of different configurations, |
| e.g. debug, release, 32, 64, etc. |
| |
| Some of the more commonly used <code>configure</code> options are: |
| |
| <table border="1"> |
| <thead> |
| <tr> |
| <th width="300">OpenJDK Configure Option</th> |
| <th>Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td><b><code>--enable-debug</code></b></td> |
| <td> |
| set the debug level to fastdebug (this is a shorthand for |
| <code>--with-debug-level=fastdebug</code>) |
| </td> |
| </tr> |
| <tr> |
| <td><b><code>--with-alsa=</code></b><i>path</i></td> |
| <td> |
| select the location of the |
| <a name="alsa">Advanced Linux Sound Architecture (ALSA)</a> |
| <br> |
| Version 0.9.1 or newer of the ALSA files are |
| required for building the OpenJDK on Linux. |
| These Linux files are usually available from an "alsa" |
| of "libasound" |
| development package, |
| and it's highly recommended that you try and use |
| the package provided by the particular version of Linux that |
| you are using. |
| </td> |
| </tr> |
| <tr> |
| <td><b><code>--with-boot-jdk=</code></b><i>path</i></td> |
| <td> |
| select the <a href="#bootjdk">Bootstrap JDK</a> |
| </td> |
| </tr> |
| <tr> |
| <td><b><code>--with-boot-jdk-jvmargs=</code></b>"<i>args</i>"</td> |
| <td> |
| provide the JVM options to be used to run the |
| <a href="#bootjdk">Bootstrap JDK</a> |
| </td> |
| </tr> |
| <tr> |
| <td><b><code>--with-cacerts=</code></b><i>path</i></td> |
| <td> |
| select the path to the cacerts file. |
| <br> |
| See <a href="http://en.wikipedia.org/wiki/Certificate_Authority" target="_blank"> |
| http://en.wikipedia.org/wiki/Certificate_Authority</a> |
| for a better understanding of the Certificate Authority (CA). |
| A certificates file named "cacerts" |
| represents a system-wide keystore with CA certificates. |
| In JDK and JRE |
| binary bundles, the "cacerts" file contains root CA certificates from |
| several public CAs (e.g., VeriSign, Thawte, and Baltimore). |
| The source contain a cacerts file |
| without CA root certificates. |
| Formal JDK builders will need to secure |
| permission from each public CA and include the certificates into their |
| own custom cacerts file. |
| Failure to provide a populated cacerts file |
| will result in verification errors of a certificate chain during runtime. |
| By default an empty cacerts file is provided and that should be |
| fine for most JDK developers. |
| </td> |
| </tr> |
| <tr> |
| <td><b><code>--with-cups=</code></b><i>path</i></td> |
| <td> |
| select the CUPS install location |
| <br> |
| The |
| <a name="cups">Common UNIX Printing System (CUPS) Headers</a> |
| are required for building the |
| OpenJDK on Solaris and Linux. |
| The Solaris header files can be obtained by installing |
| the package <strong>SFWcups</strong> from the Solaris Software |
| Companion CD/DVD, these often will be installed into the |
| directory <code>/opt/sfw/cups</code>. |
| <br> |
| The CUPS header files can always be downloaded from |
| <a href="http://www.cups.org" target="_blank">www.cups.org</a>. |
| </td> |
| </tr> |
| <tr> |
| <td><b><code>--with-cups-include=</code></b><i>path</i></td> |
| <td> |
| select the CUPS include directory location |
| </td> |
| </tr> |
| <tr> |
| <td><b><code>--with-debug-level=</code></b><i>level</i></td> |
| <td> |
| select the debug information level of release, |
| fastdebug, or slowdebug |
| </td> |
| </tr> |
| <tr> |
| <td><b><code>--with-dev-kit=</code></b><i>path</i></td> |
| <td> |
| select location of the compiler install or |
| developer install location |
| </td> |
| </tr> |
| <tr> |
| <td><b><code>--with-freetype=</code></b><i>path</i></td> |
| <td> |
| select the freetype files to use. |
| <br> |
| Expecting the |
| <a name="freetype">freetype</a> libraries under |
| <code>lib/</code> and the |
| headers under <code>include/</code>. |
| <br> |
| Version 2.3 or newer of FreeType is required. |
| On Unix systems required files can be available as part of your |
| distribution (while you still may need to upgrade them). |
| Note that you need development version of package that |
| includes both the FreeType library and header files. |
| <br> |
| You can always download latest FreeType version from the |
| <a href="http://www.freetype.org" target="_blank">FreeType website</a>. |
| <br> |
| Building the freetype 2 libraries from scratch is also possible, |
| however on Windows refer to the |
| <a href="http://freetype.freedesktop.org/wiki/FreeType_DLL"> |
| Windows FreeType DLL build instructions</a>. |
| <br> |
| Note that by default FreeType is built with byte code hinting |
| support disabled due to licensing restrictions. |
| In this case, text appearance and metrics are expected to |
| differ from Sun's official JDK build. |
| See |
| <a href="http://freetype.sourceforge.net/freetype2/index.html"> |
| the SourceForge FreeType2 Home Page |
| </a> |
| for more information. |
| </td> |
| </tr> |
| <tr> |
| <td><b><code>--with-import-hotspot=</code></b><i>path</i></td> |
| <td> |
| select the location to find hotspot |
| binaries from a previous build to avoid building |
| hotspot |
| </td> |
| </tr> |
| <tr> |
| <td><b><code>--with-target-bits=</code></b><i>arg</i></td> |
| <td> |
| select 32 or 64 bit build |
| </td> |
| </tr> |
| <tr> |
| <td><b><code>--with-jvm-variants=</code></b><i>variants</i></td> |
| <td> |
| select the JVM variants to build from, comma |
| separated list that can include: |
| server, client, kernel, zero and zeroshark |
| </td> |
| </tr> |
| <tr> |
| <td><b><code>--with-memory-size=</code></b><i>size</i></td> |
| <td> |
| select the RAM size that GNU make will think |
| this system has |
| </td> |
| </tr> |
| <tr> |
| <td><a name="msvcrNN"><b><code>--with-msvcr-dll=</code></b><i>path</i></a></td> |
| <td> |
| select the <code>msvcr100.dll</code> |
| file to include in the |
| Windows builds (C/C++ runtime library for |
| Visual Studio). |
| <br> |
| This is usually picked up automatically |
| from the redist |
| directories of Visual Studio 2010. |
| </td> |
| </tr> |
| <tr> |
| <td><b><code>--with-num-cores=</code></b><i>cores</i></td> |
| <td> |
| select the number of cores to use (processor |
| count or CPU count) |
| </td> |
| </tr> |
| <tr> |
| <td><b><code>--with-x=</code></b><i>path</i></td> |
| <td> |
| select the location of the X11 and xrender files. |
| <br> |
| The |
| <a name="xrender">XRender Extension Headers</a> |
| are required for building the |
| OpenJDK on Solaris and Linux. |
| <br> |
| The Linux header files are usually available from a "Xrender" |
| development package, it's recommended that you try and use |
| the package provided by the particular distribution of Linux that |
| you are using. |
| <br> |
| The Solaris XRender header files is |
| included with the other X11 header files |
| in the package <strong>SFWxwinc</strong> |
| on new enough versions of |
| Solaris and will be installed in |
| <code>/usr/X11/include/X11/extensions/Xrender.h</code> or |
| <code>/usr/openwin/share/include/X11/extensions/Xrender.h</code> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </blockquote> |
| |
| </blockquote> |
| |
| <!-- ====================================================== --> |
| <hr> |
| <h3><a name="make">Make</a></h3> |
| <blockquote> |
| The basic invocation of the <code>make</code> utility |
| looks like: |
| <blockquote> |
| <b><code>make all</code></b> |
| </blockquote> |
| This will start the build to the output directory containing the |
| "configuration" that was created by the <code>configure</code> |
| script. Run <code>make help</code> for more information on |
| the available targets. |
| <br> |
| There are some of the make targets that |
| are of general interest: |
| <table border="1"> |
| <thead> |
| <tr> |
| <th>Make Target</th> |
| <th>Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td><i>empty</i></td> |
| <td>build everything but no images</td> |
| </tr> |
| <tr> |
| <td><b><code>all</code></b></td> |
| <td>build everything including images</td> |
| </tr> |
| <tr> |
| <td><b><code>all-conf</code></b></td> |
| <td>build all configurations</td> |
| </tr> |
| <tr> |
| <td><b><code>images</code></b></td> |
| <td>create complete j2sdk and j2re images</td> |
| </tr> |
| <tr> |
| <td><b><code>install</code></b></td> |
| <td>install the generated images locally, |
| typically in <code>/usr/local</code></td> |
| </tr> |
| <tr> |
| <td><b><code>clean</code></b></td> |
| <td>remove all files generated by make, |
| but not those generated by <code>configure</code></td> |
| </tr> |
| <tr> |
| <td><b><code>dist-clean</code></b></td> |
| <td>remove all files generated by both |
| and <code>configure</code> (basically killing the configuration)</td> |
| </tr> |
| <tr> |
| <td><b><code>help</code></b></td> |
| <td>give some help on using <code>make</code>, |
| including some interesting make targets</td> |
| </tr> |
| </tbody> |
| </table> |
| </blockquote> |
| </blockquote> |
| |
| <!-- ====================================================== --> |
| <hr> |
| <h2><a name="testing">Testing</a></h2> |
| <blockquote> |
| When the build is completed, you should see the generated |
| binaries and associated files in the <code>j2sdk-image</code> |
| directory in the output directory. |
| In particular, the |
| <code>build/<i>*</i>/images/j2sdk-image/bin</code> |
| directory should contain executables for the |
| OpenJDK tools and utilities for that configuration. |
| The testing tool <code>jtreg</code> will be needed |
| and can be found at: |
| <a href="http://openjdk.java.net/jtreg/" target="_blank"> |
| the jtreg site</a>. |
| The provided regression tests in the repositories |
| can be run with the command: |
| <blockquote> |
| <code><b>cd test && make PRODUCT_HOME=`pwd`/../build/*/images/j2sdk-image all</b></code> |
| </blockquote> |
| </blockquote> |
| |
| <!-- ====================================================== --> |
| <!-- ====================================================== --> |
| <!-- ====================================================== --> |
| <!-- ====================================================== --> |
| <!-- ====================================================== --> |
| <!-- ====================================================== --> |
| <!-- ====================================================== --> |
| <!-- ====================================================== --> |
| <!-- ====================================================== --> |
| |
| <!-- ====================================================== --> |
| <hr> |
| <h2><a name="hints">Appendix A: Hints and Tips</a></h2> |
| <blockquote> |
| |
| <h3><a name="faq">FAQ</a></h3> |
| <blockquote> |
| |
| <p> |
| <b>Q:</b> The <code>generated-configure.sh</code> file looks horrible! |
| How are you going to edit it? |
| <br> |
| <b>A:</b> The <code>generated-configure.sh</code> file is generated (think |
| "compiled") by the autoconf tools. The source code is |
| in <code>configure.ac</code> and various .m4 files in common/autoconf, |
| which are much more readable. |
| </p> |
| |
| <p> |
| <b>Q:</b> |
| Why is the <code>generated-configure.sh</code> file checked in, |
| if it is generated? |
| <br> |
| <b>A:</b> |
| If it was not generated, every user would need to have the autoconf |
| tools installed, and re-generate the <code>configure</code> file |
| as the first step. |
| Our goal is to minimize the work needed to be done by the user |
| to start building OpenJDK, and to minimize |
| the number of external dependencies required. |
| </p> |
| |
| <p> |
| <b>Q:</b> |
| Do you require a specific version of autoconf for regenerating |
| <code>generated-configure.sh</code>? |
| <br> |
| <b>A:</b> |
| Yes, version 2.69 is required and should be easy |
| enough to aquire on all supported operating |
| systems. The reason for this is to avoid |
| large spurious changes in <code>generated-configure.sh</code>. |
| </p> |
| |
| <p> |
| <b>Q:</b> |
| How do you regenerate <code>generated-configure.sh</code> |
| after making changes to the input files? |
| <br> |
| <b>A:</b> |
| Regnerating <code>generated-configure.sh</code> |
| should always be done using the |
| script <code>common/autoconf/autogen.sh</code> to |
| ensure that the correct files get updated. This |
| script should also be run after mercurial tries to |
| merge <code>generated-configure.sh</code> as a |
| merge of the generated file is not guaranteed to |
| be correct. |
| </p> |
| |
| <p> |
| <b>Q:</b> |
| What are the files in <code>common/makefiles/support/*</code> for? |
| They look like gibberish. |
| <br> |
| <b>A:</b> |
| They are a somewhat ugly hack to compensate for command line length |
| limitations on certain platforms (Windows, Solaris). |
| Due to a combination of limitations in make and the shell, |
| command lines containing too many files will not work properly. |
| These |
| helper files are part of an elaborate hack that will compress the |
| command line in the makefile and then uncompress it safely. |
| We're |
| not proud of it, but it does fix the problem. |
| If you have any better suggestions, we're all ears! :-) |
| </p> |
| |
| <p> |
| <b>Q:</b> |
| I want to see the output of the commands that make runs, |
| like in the old build. How do I do that? |
| <br> |
| <b>A:</b> |
| You specify the <code>LOG</code> variable to make. There are |
| several log levels: |
| </p> |
| <blockquote> |
| <ul> |
| <li> |
| <b><code>warn</code></b> — Default and very quiet. |
| </li> |
| <li> |
| <b><code>info</code></b> — Shows more progress information |
| than warn. |
| </li> |
| <li> |
| <b><code>debug</code></b> — Echos all command lines and |
| prints all macro calls for compilation definitions. |
| </li> |
| <li> |
| <b><code>trace</code></b> — Echos all $(shell) command |
| lines as well. |
| </li> |
| </ul> |
| </blockquote> |
| |
| <p> |
| <b>Q:</b> |
| When do I have to re-run <code>configure</code>? |
| <br> |
| <b>A:</b> |
| Normally you will run <code>configure</code> only once for creating a |
| configuration. |
| You need to re-run configuration only if you want to change any |
| configuration options, |
| or if you pull down changes to the <code>configure</code> script. |
| </p> |
| |
| <p> |
| <b>Q:</b> |
| I have added a new source file. Do I need to modify the makefiles? |
| <br> |
| <b>A:</b> |
| Normally, no. If you want to create e.g. a new native |
| library, |
| you will need to modify the makefiles. But for normal file |
| additions or removals, no changes are needed. There are certan |
| exceptions for some native libraries where the source files are spread |
| over many directories which also contain sources for other |
| libraries. In these cases it was simply easier to create include lists |
| rather than excludes. |
| </p> |
| |
| <p> |
| <b>Q:</b> |
| When I run <code>configure --help</code>, I see many strange options, |
| like <code>--dvidir</code>. What is this? |
| <br> |
| <b>A:</b> |
| Configure provides a slew of options by default, to all projects |
| that use autoconf. Most of them are not used in OpenJDK, |
| so you can safely ignore them. To list only OpenJDK specific features, |
| use <code>configure --help=short</code> instead. |
| </p> |
| |
| <p> |
| <b>Q:</b> |
| <code>configure</code> provides OpenJDK-specific features such as |
| <code>--with-builddeps-server</code> that are not |
| described in this document. What about those? |
| <br> |
| <b>A:</b> |
| Try them out if you like! But be aware that most of these are |
| experimental features. |
| Many of them don't do anything at all at the moment; the option |
| is just a placeholder. Others depend on |
| pieces of code or infrastructure that is currently |
| not ready for prime time. |
| </p> |
| |
| <p> |
| <b>Q:</b> |
| How will you make sure you don't break anything? |
| <br> |
| <b>A:</b> |
| We have a script that compares the result of the new build system |
| with the result of the old. For most part, we aim for (and achieve) |
| byte-by-byte identical output. There are however technical issues |
| with e.g. native binaries, which might differ in a byte-by-byte |
| comparison, even |
| when building twice with the old build system. |
| For these, we compare relevant aspects |
| (e.g. the symbol table and file size). |
| Note that we still don't have 100% |
| equivalence, but we're close. |
| </p> |
| |
| <p> |
| <b>Q:</b> |
| I noticed this thing X in the build that looks very broken by design. |
| Why don't you fix it? |
| <br> |
| <b>A:</b> |
| Our goal is to produce a build output that is as close as |
| technically possible to the old build output. |
| If things were weird in the old build, |
| they will be weird in the new build. |
| Often, things were weird before due to obscurity, |
| but in the new build system the weird stuff comes up to the surface. |
| The plan is to attack these things at a later stage, |
| after the new build system is established. |
| </p> |
| |
| <p> |
| <b>Q:</b> |
| The code in the new build system is not that well-structured. |
| Will you fix this? |
| <br> |
| <b>A:</b> |
| Yes! The new build system has grown bit by bit as we converted |
| the old system. When all of the old build system is converted, |
| we can take a step back and clean up the structure of the new build |
| system. Some of this we plan to do before replacing the old build |
| system and some will need to wait until after. |
| </p> |
| |
| <p> |
| <b>Q:</b> |
| Is anything able to use the results of the new build's default make target? |
| <br> |
| <b>A:</b> |
| Yes, this is the minimal (or roughly minimal) |
| set of compiled output needed for a developer to actually |
| execute the newly built JDK. The idea is that in an incremental |
| development fashion, when doing a normal make, |
| you should only spend time recompiling what's changed |
| (making it purely incremental) and only do the work that's |
| needed to actually run and test your code. |
| The packaging stuff that is part of the <code>images</code> |
| target is not needed for a normal developer who wants to |
| test his new code. Even if it's quite fast, it's still unnecessary. |
| We're targeting sub-second incremental rebuilds! ;-) |
| (Or, well, at least single-digit seconds...) |
| </p> |
| |
| <p> |
| <b>Q:</b> |
| I usually set a specific environment variable when building, |
| but I can't find the equivalent in the new build. |
| What should I do? |
| <br> |
| <b>A:</b> |
| It might very well be that we have neglected to add support for |
| an option that was actually used from outside the build system. |
| Email us and we will add support for it! |
| </p> |
| |
| </blockquote> |
| |
| <h3><a name="performance">Build Performance Tips</a></h3> |
| <blockquote> |
| |
| <p>Building OpenJDK requires a lot of horsepower. |
| Some of the build tools can be adjusted to utilize more or less |
| of resources such as |
| parallel threads and memory. |
| The <code>configure</code> script analyzes your system and selects reasonable |
| values for such options based on your hardware. |
| If you encounter resource problems, such as out of memory conditions, |
| you can modify the detected values with:</p> |
| |
| <ul> |
| <li> |
| <b><code>--with-num-cores</code></b> |
| — |
| number of cores in the build system, |
| e.g. <code>--with-num-cores=8</code> |
| </li> |
| <li> |
| <b><code>--with-memory-size</code></b> |
| — memory (in MB) available in the build system, |
| e.g. <code>--with-memory-size=1024</code> |
| </li> |
| </ul> |
| |
| <p>It might also be necessary to specify the JVM arguments passed |
| to the Bootstrap JDK, using e.g. |
| <code>--with-boot-jdk-jvmargs="-Xmx8G -enableassertions"</code>. |
| Doing this will override the default JVM arguments |
| passed to the Bootstrap JDK.</p> |
| |
| |
| <p>One of the top goals of the new build system is to improve the |
| build performance and decrease the time needed to build. This will |
| soon also apply to the java compilation when the Smart Javac wrapper |
| is making its way into jdk8. It can be tried in the build-infra |
| repository already. You are likely to find that the new build system |
| is faster than the old one even without this feature.</p> |
| |
| <p>At the end of a successful execution of <code>configure</code>, |
| you will get a performance summary, |
| indicating how well the build will perform. Here you will |
| also get performance hints. |
| If you want to build fast, pay attention to those!</p> |
| |
| <h4>Building with ccache</h4> |
| |
| <p>A simple way to radically speed up compilation of native code |
| (typically hotspot and native libraries in JDK) is to install |
| ccache. This will cache and reuse prior compilation results, if the |
| source code is unchanged. However, ccache versions prior to 3.1.4 |
| does not work correctly with the precompiled headers used in |
| OpenJDK. So if your platform supports ccache at 3.1.4 or later, we |
| highly recommend installing it. This is currently only supported on |
| linux.</p> |
| |
| <h4>Building on local disk</h4> |
| |
| <p>If you are using network shares, e.g. via NFS, for your source code, |
| make sure the build directory is situated on local disk. |
| The performance |
| penalty is extremely high for building on a network share, |
| close to unusable.</p> |
| |
| <h4>Building only one JVM</h4> |
| |
| <p>The old build builds multiple JVMs on 32-bit systems (client and |
| server; and on Windows kernel as well). In the new build we have |
| changed this default to only build server when it's available. This |
| improves build times for those not interested in multiple JVMs. To |
| mimic the old behavior on platforms that support it, |
| use <code>--with-jvm-variants=client,server</code>.</p> |
| |
| <h4>Selecting the number of cores to build on</h4> |
| |
| <p>By default, <code>configure</code> will analyze your machine and run the make |
| process in parallel with as many threads as you have cores. This |
| behavior can be overridden, either "permanently" (on a <code>configure</code> |
| basis) using <code>--with-num-cores=N</code> or for a single build |
| only (on a make basis), using <code>make JOBS=N</code>.</p> |
| |
| <p>If you want to make a slower build just this time, to save some CPU |
| power for other processes, you can run |
| e.g. <code>make JOBS=2</code>. This will force the makefiles |
| to only run 2 parallel processes, or even <code>make JOBS=1</code> |
| which will disable parallelism.</p> |
| |
| <p>If you want to have it the other way round, namely having slow |
| builds default and override with fast if you're |
| impatient, you should call <code>configure</code> with |
| <code>--with-num-cores=2</code>, making 2 the default. |
| If you want to run with more |
| cores, run <code>make JOBS=8</code></p> |
| |
| </blockquote> |
| |
| <h3><a name="troubleshooting">Troubleshooting</a></h3> |
| <blockquote> |
| |
| <h4>Solving build problems</h4> |
| |
| <blockquote> |
| If the build fails (and it's not due to a compilation error in |
| a source file you've changed), the first thing you should do |
| is to re-run the build with more verbosity. |
| Do this by adding <code>LOG=debug</code> to your make command line. |
| <br> |
| The build log (with both stdout and stderr intermingled, |
| basically the same as you see on your console) can be found as |
| <code>build.log</code> in your build directory. |
| <br> |
| You can ask for help on build problems with the new build system |
| on either the |
| <a href="http://mail.openjdk.java.net/mailman/listinfo/build-dev"> |
| build-dev</a> |
| or the |
| <a href="http://mail.openjdk.java.net/mailman/listinfo/build-infra-dev"> |
| build-infra-dev</a> |
| mailing lists. Please include the relevant parts |
| of the build log. |
| <br> |
| A build can fail for any number of reasons. |
| Most failures |
| are a result of trying to build in an environment in which all the |
| pre-build requirements have not been met. |
| The first step in |
| troubleshooting a build failure is to recheck that you have satisfied |
| all the pre-build requirements for your platform. |
| Scanning the <code>configure</code> log is a good first step, making |
| sure that what it found makes sense for your system. |
| Look for strange error messages or any difficulties that |
| <code>configure</code> had in finding things. |
| <br> |
| Some of the more common problems with builds are briefly |
| described |
| below, with suggestions for remedies. |
| <ul> |
| <li> |
| <b>Corrupted Bundles on Windows:</b> |
| <blockquote> |
| Some virus scanning software has been known to |
| corrupt the |
| downloading of zip bundles. |
| It may be necessary to disable the 'on access' or |
| 'real time' |
| virus scanning features to prevent this corruption. |
| This type of "real time" virus scanning can also |
| slow down the |
| build process significantly. |
| Temporarily disabling the feature, or excluding the build |
| output directory may be necessary to get correct and |
| faster builds. |
| </blockquote> |
| </li> |
| <li> |
| <b>Slow Builds:</b> |
| <blockquote> |
| If your build machine seems to be overloaded from too many |
| simultaneous C++ compiles, try setting the |
| <code>JOBS=1</code> on the <code>make</code> command line. |
| Then try increasing the count slowly to an acceptable |
| level for your system. Also: |
| <blockquote> |
| Creating the javadocs can be very slow, |
| if you are running |
| javadoc, consider skipping that step. |
| <br> |
| Faster CPUs, more RAM, and a faster DISK usually helps. |
| The VM build tends to be CPU intensive |
| (many C++ compiles), |
| and the rest of the JDK will often be disk intensive. |
| <br> |
| Faster compiles are possible using a tool called |
| <a href="http://ccache.samba.org/" target="_blank">ccache</a>. |
| </blockquote> |
| </blockquote> |
| </li> |
| <li> |
| <b>File time issues:</b> |
| <blockquote> |
| If you see warnings that refer to file time stamps, e.g. |
| <blockquote> |
| <i>Warning message:</i><code> |
| File `xxx' has modification time in |
| the future.</code> |
| <br> |
| <i>Warning message:</i> <code> Clock skew detected. |
| Your build may |
| be incomplete.</code> |
| </blockquote> |
| These warnings can occur when the clock on the build |
| machine is out of |
| sync with the timestamps on the source files. |
| Other errors, apparently |
| unrelated but in fact caused by the clock skew, |
| can occur along with |
| the clock skew warnings. |
| These secondary errors may tend to obscure the |
| fact that the true root cause of the problem |
| is an out-of-sync clock. |
| <p> |
| If you see these warnings, reset the clock on the |
| build |
| machine, run "<code><i>gmake</i> clobber</code>" |
| or delete the directory |
| containing the build output, and restart the |
| build from the beginning. |
| </blockquote> |
| </li> |
| <li> |
| <b>Error message: |
| <code>Trouble writing out table to disk</code></b> |
| <blockquote> |
| Increase the amount of swap space on your build machine. |
| This could be caused by overloading the system and |
| it may be necessary to use: |
| <blockquote> |
| <code>make JOBS=1</code> |
| </blockquote> |
| to reduce the load on the system. |
| </blockquote> |
| </li> |
| <li> |
| <b>Error Message: |
| <code>libstdc++ not found:</code></b> |
| <blockquote> |
| This is caused by a missing libstdc++.a library. |
| This is installed as part of a specific package |
| (e.g. libstdc++.so.devel.386). |
| By default some 64-bit Linux versions (e.g. Fedora) |
| only install the 64-bit version of the libstdc++ package. |
| Various parts of the JDK build require a static |
| link of the C++ runtime libraries to allow for maximum |
| portability of the built images. |
| </blockquote> |
| </li> |
| <li> |
| <b>Linux Error Message: |
| <code>cannot restore segment prot after reloc</code></b> |
| <blockquote> |
| This is probably an issue with SELinux (See |
| <a href="http://en.wikipedia.org/wiki/SELinux" target="_blank"> |
| http://en.wikipedia.org/wiki/SELinux</a>). |
| Parts of the VM is built without the <code>-fPIC</code> for |
| performance reasons. |
| <p> |
| To completely disable SELinux: |
| <ol> |
| <li><code>$ su root</code></li> |
| <li><code># system-config-securitylevel</code></li> |
| <li><code>In the window that appears, select the SELinux tab</code></li> |
| <li><code>Disable SELinux</code></li> |
| </ol> |
| <p> |
| Alternatively, instead of completely disabling it you could |
| disable just this one check. |
| <ol> |
| <li>Select System->Administration->SELinux Management</li> |
| <li>In the SELinux Management Tool which appears, |
| select "Boolean" from the menu on the left</li> |
| <li>Expand the "Memory Protection" group</li> |
| <li>Check the first item, labeled |
| "Allow all unconfined executables to use |
| libraries requiring text relocation ..."</li> |
| </ol> |
| </blockquote> |
| </li> |
| <li> |
| <b>Windows Error Messages:</b> |
| <br> |
| <code>*** fatal error - couldn't allocate heap, ... </code> |
| <br> |
| <code>rm fails with "Directory not empty"</code> |
| <br> |
| <code>unzip fails with "cannot create ... Permission denied"</code> |
| <br> |
| <code>unzip fails with "cannot create ... Error 50"</code> |
| <br> |
| <blockquote> |
| The CYGWIN software can conflict with other non-CYGWIN |
| software. See the CYGWIN FAQ section on |
| <a href="http://cygwin.com/faq/faq.using.html#faq.using.bloda" target="_blank"> |
| BLODA (applications that interfere with CYGWIN)</a>. |
| </blockquote> |
| </li> |
| <li> |
| <b>Windows Error Message: <code>spawn failed</code></b> |
| <blockquote> |
| Try rebooting the system, or there could be some kind of |
| issue with the disk or disk partition being used. |
| Sometimes it comes with a "Permission Denied" message. |
| </blockquote> |
| </li> |
| </ul> |
| </blockquote> |
| |
| </blockquote> <!-- Troubleshooting --> |
| |
| </blockquote> <!-- Appendix A --> |
| |
| <!-- ====================================================== --> |
| <hr> |
| <h2><a name="gmake">Appendix B: GNU make</a></h2> |
| <blockquote> |
| |
| The Makefiles in the OpenJDK are only valid when used with the |
| GNU version of the utility command <code>make</code> |
| (usually called <code>gmake</code> on Solaris). |
| A few notes about using GNU make: |
| <ul> |
| <li> |
| You need GNU make version 3.81 or newer. |
| If the GNU make utility on your systems is not |
| 3.81 or newer, |
| see <a href="#buildgmake">"Building GNU make"</a>. |
| </li> |
| <li> |
| Place the location of the GNU make binary in the |
| <code>PATH</code>. |
| </li> |
| <li> |
| <strong>Solaris:</strong> |
| Do NOT use <code>/usr/bin/make</code> on Solaris. |
| If your Solaris system has the software |
| from the Solaris Developer Companion CD installed, |
| you should try and use <code>gmake</code> |
| which will be located in either the |
| <code>/usr/bin</code>, <code>/opt/sfw/bin</code> or |
| <code>/usr/sfw/bin</code> directory. |
| </li> |
| <li> |
| <strong>Windows:</strong> |
| Make sure you start your build inside a bash shell. |
| </li> |
| <li> |
| <strong>Mac OS X:</strong> |
| The XCode "command line tools" must be installed on your Mac. |
| </li> |
| </ul> |
| <p> |
| Information on GNU make, and access to ftp download sites, are |
| available on the |
| <a href="http://www.gnu.org/software/make/make.html" target="_blank"> |
| GNU make web site |
| </a>. |
| The latest source to GNU make is available at |
| <a href="http://ftp.gnu.org/pub/gnu/make/" target="_blank"> |
| ftp.gnu.org/pub/gnu/make/</a>. |
| </p> |
| |
| <h3><a name="buildgmake">Building GNU make</a></h3> |
| <blockquote> |
| First step is to get the GNU make 3.81 or newer source from |
| <a href="http://ftp.gnu.org/pub/gnu/make/" target="_blank"> |
| ftp.gnu.org/pub/gnu/make/</a>. |
| Building is a little different depending on the OS but is |
| basically done with: |
| <blockquote> |
| <code>bash ./configure</code> |
| <br> |
| <code>make</code> |
| </blockquote> |
| </blockquote> |
| |
| </blockquote> <!-- Appendix B --> |
| |
| <!-- ====================================================== --> |
| <hr> |
| <h2><a name="buildenvironments">Appendix C: Build Environments</a></h2> |
| <blockquote> |
| |
| <h3><a name="MBE">Minimum Build Environments</a></h3> |
| <blockquote> |
| This file often describes specific requirements for what we |
| call the |
| "minimum build environments" (MBE) for this |
| specific release of the JDK. |
| What is listed below is what the Oracle Release |
| Engineering Team will use to build the Oracle JDK product. |
| Building with the MBE will hopefully generate the most compatible |
| bits that install on, and run correctly on, the most variations |
| of the same base OS and hardware architecture. |
| In some cases, these represent what is often called the |
| least common denominator, but each Operating System has different |
| aspects to it. |
| <p> |
| In all cases, the Bootstrap JDK version minimum is critical, |
| we cannot guarantee builds will work with older Bootstrap JDK's. |
| Also in all cases, more RAM and more processors is better, |
| the minimums listed below are simply recommendations. |
| <p> |
| With Solaris and Mac OS X, the version listed below is the |
| oldest release we can guarantee builds and works, and the |
| specific version of the compilers used could be critical. |
| <p> |
| With Windows the critical aspect is the Visual Studio compiler |
| used, which due to it's runtime, generally dictates what Windows |
| systems can do the builds and where the resulting bits can |
| be used.<br> |
| <b>NOTE: We expect a change here off these older Windows OS releases |
| and to a 'less older' one, probably Windows 2008R2 X64.</b> |
| <p> |
| With Linux, it was just a matter of picking a |
| stable distribution that is a good representative for Linux |
| in general.<br> |
| <b>NOTE: We expect a change here from Fedora 9 to something else, |
| but it has not been completely determined yet, possibly |
| Ubuntu 12.04 X64, unbiased community feedback would be welcome on |
| what a good choice would be here.</b> |
| <p> |
| It is understood that most developers will NOT be using these |
| specific versions, and in fact creating these specific versions |
| may be difficult due to the age of some of this software. |
| It is expected that developers are more often using the more |
| recent releases and distributions of these operating systems. |
| <p> |
| Compilation problems with newer or different C/C++ compilers is a |
| common problem. |
| Similarly, compilation problems related to changes to the |
| <code>/usr/include</code> or system header files is also a |
| common problem with older, newer, or unreleased OS versions. |
| Please report these types of problems as bugs so that they |
| can be dealt with accordingly. |
| </p> |
| <table border="1"> |
| <thead> |
| <tr> |
| <th>Base OS and Architecture</th> |
| <th>OS</th> |
| <th>C/C++ Compiler</th> |
| <th>Bootstrap JDK</th> |
| <th>Processors</th> |
| <th>RAM Minimum</th> |
| <th>DISK Needs</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td>Linux X86 (32-bit) and X64 (64-bit)</td> |
| <td>Fedora 9</td> |
| <td>gcc 4.3 </td> |
| <td>JDK 7u7</td> |
| <td>2 or more</td> |
| <td>1 GB</td> |
| <td>6 GB</td> |
| </tr> |
| <tr> |
| <td>Solaris SPARC (32-bit) and SPARCV9 (64-bit)</td> |
| <td>Solaris 10 Update 6</td> |
| <td>Studio 12 Update 1 + patches</td> |
| <td>JDK 7u7</td> |
| <td>4 or more</td> |
| <td>4 GB</td> |
| <td>8 GB</td> |
| </tr> |
| <tr> |
| <td>Solaris X86 (32-bit) and X64 (64-bit)</td> |
| <td>Solaris 10 Update 6</td> |
| <td>Studio 12 Update 1 + patches</td> |
| <td>JDK 7u7</td> |
| <td>4 or more</td> |
| <td>4 GB</td> |
| <td>8 GB</td> |
| </tr> |
| <tr> |
| <td>Windows X86 (32-bit)</td> |
| <td>Windows XP</td> |
| <td>Microsoft Visual Studio C++ 2010 Professional Edition</td> |
| <td>JDK 7u7</td> |
| <td>2 or more</td> |
| <td>2 GB</td> |
| <td>6 GB</td> |
| </tr> |
| <tr> |
| <td>Windows X64 (64-bit)</td> |
| <td>Windows Server 2003 - Enterprise x64 Edition</td> |
| <td>Microsoft Visual Studio C++ 2010 Professional Edition</td> |
| <td>JDK 7u7</td> |
| <td>2 or more</td> |
| <td>2 GB</td> |
| <td>6 GB</td> |
| </tr> |
| <tr> |
| <td>Mac OS X X64 (64-bit)</td> |
| <td>Mac OS X 10.7 "Lion"</td> |
| <td>XCode 4.5.2 or newer</td> |
| <td>JDK 7u7</td> |
| <td>2 or more</td> |
| <td>4 GB</td> |
| <td>6 GB</td> |
| </tr> |
| </tbody> |
| </table> |
| </blockquote> |
| |
| <!-- ====================================================== --> |
| <hr> |
| <h3><a name="SDBE">Specific Developer Build Environments</a></h3> |
| <blockquote> |
| We won't be listing all the possible environments, but |
| we will try to provide what information we have available to us. |
| <p> |
| <strong>NOTE: The community can help out by updating |
| this part of the document. |
| </strong> |
| |
| <h4><a name="fedora">Fedora</a></h4> |
| <blockquote> |
| After installing the latest |
| <a href="http://fedoraproject.org">Fedora</a> |
| you need to install several build dependencies. |
| The simplest way to do it is to execute the |
| following commands as user <code>root</code>: |
| <blockquote> |
| <code>yum-builddep java-1.7.0-openjdk</code> |
| <br> |
| <code>yum install gcc gcc-c++</code> |
| </blockquote> |
| <p> |
| In addition, it's necessary to set a few environment |
| variables for the build: |
| <blockquote> |
| <code>export LANG=C</code> |
| <br> |
| <code>export PATH="/usr/lib/jvm/java-openjdk/bin:${PATH}"</code> |
| </blockquote> |
| </blockquote> |
| |
| |
| <h4><a name="centos">CentOS 5.5</a></h4> |
| <blockquote> |
| After installing |
| <a href="http://www.centos.org/">CentOS 5.5</a> |
| you need to make sure you have |
| the following Development bundles installed: |
| <blockquote> |
| <ul> |
| <li>Development Libraries</li> |
| <li>Development Tools</li> |
| <li>Java Development</li> |
| <li>X Software Development (Including XFree86-devel)</li> |
| </ul> |
| </blockquote> |
| <p> |
| Plus the following packages: |
| <blockquote> |
| <ul> |
| <li>cups devel: Cups Development Package</li> |
| <li>alsa devel: Alsa Development Package</li> |
| <li>Xi devel: libXi.so Development Package</li> |
| </ul> |
| </blockquote> |
| <p> |
| The freetype 2.3 packages don't seem to be available, |
| but the freetype 2.3 sources can be downloaded, built, |
| and installed easily enough from |
| <a href="http://downloads.sourceforge.net/freetype"> |
| the freetype site</a>. |
| Build and install with something like: |
| <blockquote> |
| <code>bash ./configure</code> |
| <br> |
| <code>make</code> |
| <br> |
| <code>sudo -u root make install</code> |
| </blockquote> |
| <p> |
| Mercurial packages could not be found easily, but a Google |
| search should find ones, and they usually include Python if |
| it's needed. |
| </blockquote> |
| |
| <h4><a name="debian">Debian 5.0 (Lenny)</a></h4> |
| <blockquote> |
| After installing <a href="http://debian.org">Debian</a> 5 |
| you need to install several build dependencies. |
| The simplest way to install the build dependencies is to |
| execute the following commands as user <code>root</code>: |
| <blockquote> |
| <code>aptitude build-dep openjdk-7</code> |
| <br> |
| <code>aptitude install openjdk-7-jdk libmotif-dev</code> |
| </blockquote> |
| <p> |
| In addition, it's necessary to set a few environment |
| variables for the build: |
| <blockquote> |
| <code>export LANG=C</code> |
| <br> |
| <code>export PATH="/usr/lib/jvm/java-7-openjdk/bin:${PATH}"</code> |
| </blockquote> |
| </blockquote> |
| |
| <h4><a name="ubuntu">Ubuntu 12.04</a></h4> |
| <blockquote> |
| After installing <a href="http://ubuntu.org">Ubuntu</a> 12.04 |
| you need to install several build dependencies. The simplest |
| way to do it is to execute the following commands: |
| <blockquote> |
| <code>sudo aptitude build-dep openjdk-7</code> |
| <br> |
| <code>sudo aptitude install openjdk-7-jdk</code> |
| </blockquote> |
| <p> |
| In addition, it's necessary to set a few environment |
| variables for the build: |
| <blockquote> |
| <code>export LANG=C</code> |
| <br> |
| <code>export PATH="/usr/lib/jvm/java-7-openjdk/bin:${PATH}"</code> |
| </blockquote> |
| </blockquote> |
| |
| <h4><a name="opensuse">OpenSUSE 11.1</a></h4> |
| <blockquote> |
| After installing <a href="http://opensuse.org">OpenSUSE</a> 11.1 |
| you need to install several build dependencies. |
| The simplest way to install the build dependencies is to |
| execute the following commands: |
| <blockquote> |
| <code>sudo zypper source-install -d java-1_7_0-openjdk</code> |
| <br> |
| <code>sudo zypper install make</code> |
| </blockquote> |
| <p> |
| In addition, it is necessary to set a few environment |
| variables for the build: |
| <blockquote> |
| <code>export LANG=C</code> |
| <br> |
| <code>export PATH="/usr/lib/jvm/java-1.7.0-openjdk/bin:$[PATH}"</code> |
| </blockquote> |
| <p> |
| Finally, you need to unset the <code>JAVA_HOME</code> |
| environment variable: |
| <blockquote> |
| <code>export -n JAVA_HOME</code> |
| </blockquote> |
| </blockquote> |
| |
| <h4><a name="mandriva">Mandriva Linux One 2009 Spring</a></h4> |
| <blockquote> |
| After installing <a href="http://mandriva.org">Mandriva</a> |
| Linux One 2009 Spring |
| you need to install several build dependencies. |
| The simplest way to install the build dependencies is to |
| execute the following commands as user <code>root</code>: |
| <blockquote> |
| <code>urpmi java-1.7.0-openjdk-devel make gcc gcc-c++ |
| freetype-devel zip unzip libcups2-devel libxrender1-devel |
| libalsa2-devel libstc++-static-devel libxtst6-devel |
| libxi-devel</code> |
| </blockquote> |
| <p> |
| In addition, it is necessary to set a few environment |
| variables for the build: |
| <blockquote> |
| <code>export LANG=C</code> |
| <br> |
| <code>export PATH="/usr/lib/jvm/java-1.7.0-openjdk/bin:${PATH}"</code> |
| </blockquote> |
| </blockquote> |
| |
| <h4><a name="opensolaris">OpenSolaris 2009.06</a></h4> |
| <blockquote> |
| After installing <a href="http://opensolaris.org">OpenSolaris</a> 2009.06 |
| you need to install several build dependencies. |
| The simplest way to install the build dependencies is to |
| execute the following commands: |
| <blockquote> |
| <code>pfexec pkg install SUNWgmake SUNWj7dev |
| sunstudioexpress SUNWcups SUNWzip SUNWunzip SUNWxwhl |
| SUNWxorg-headers SUNWaudh SUNWfreetype2</code> |
| </blockquote> |
| <p> |
| In addition, it is necessary to set a few environment |
| variables for the build: |
| <blockquote> |
| <code>export LANG=C</code> |
| <br> |
| <code>export PATH="/opt/SunStudioExpress/bin:${PATH}"</code> |
| </blockquote> |
| </blockquote> |
| |
| </blockquote> |
| |
| </blockquote> <!-- Appendix C --> |
| |
| <!-- ====================================================== --> |
| |
| <!-- Leave out Appendix D -- |
| |
| <hr> |
| <h2><a name="mapping">Appendix D: Mapping Old to New</a></h2> |
| <blockquote> |
| <p>This table will help you convert some idioms of the old build |
| system to the new build system.</p> |
| <table summary="Cheat sheet for converting from old to new build system"> |
| <tr valign="top"> |
| <th>In the old build system, you used to...</th> |
| <th>In the new build system, you should ...</th> |
| </tr> |
| <tr valign="top"> |
| <td>run <code>make sanity</code></td> |
| <td>run <code>bash ./configure</code></td> |
| </tr> |
| <tr valign="top"> |
| <td>set <code>ALT_OUTPUTDIR=build/my-special-output</code></td> |
| <td>before building the first time: |
| <br> |
| <code>cd build/my-special-output</code> |
| <br> |
| <code>bash ../../configure</code> |
| <br> |
| to build: |
| <br> |
| <code>cd build/my-special-output</code> |
| <br> |
| <code>make</code> |
| </td> |
| </tr> |
| <tr valign="top"> |
| <td>set <code>ALT_BOOTDIR=/opt/java/jdk7</code></td> |
| <td>run <code>configure --with-boot-jdk=/opt/java/jdk7</code></td> |
| </tr> |
| <tr valign="top"> |
| <td>run <code>make ARCH_DATA_MODEL=32</code></td> |
| <td>run <code>configure --with-target-bits=32</code></td> |
| </tr> |
| <tr valign="top"> |
| <td>set <code>BUILD_CLIENT_ONLY=true</code></td> |
| <td>run <code>configure --with-jvm-variants=client</code></td> |
| </tr> |
| <tr valign="top"> |
| <td>set <code>ALT_FREETYPE_LIB_PATH=/opt/freetype/lib</code> |
| and <code>ALT_FREETYPE_HEADERS_PATH=/opt/freetype/include</code></td> |
| <td>run <code>configure --with-freetype=/opt/freetype</code></td> |
| </tr> |
| <tr valign="top"> |
| <td>set <code>ALT_CUPS_HEADERS_PATH=/opt/cups/include</code></td> |
| <td>run <code>configure --with-cups=/opt/cups</code></td> |
| </tr> |
| <tr valign="top"> |
| <td>set <code>ALT_OPENWIN_HOME=/opt/X11R6</code></td> |
| <td>run <code>configure --with-x=/opt/X11R6</code></td> |
| </tr> |
| <tr valign="top"> |
| <td>set <code>ALT_MSVCRNN_DLL_PATH=c:/vc_redist</code></td> |
| <td>run <code>configure --with-msvcr100dll=/cygdrive/c/vc_redist</code></td> |
| </tr> |
| <tr valign="top"> |
| <td>set <code>ALT_COMPILER_PATH=/opt/my-gcc/bin/gcc</code></td> |
| <td>run <code>CC=/opt/my-gcc/bin/gcc configure</code> |
| or <code>CXX=/opt/my-gcc/bin/g++ configure</code> |
| </td> |
| </tr> |
| <tr valign="top"> |
| <td>set <code>BUILD_HEADLESS_ONLY=true</code></td> |
| <td>run <code>configure --disable-headful</code></td> |
| </tr> |
| <tr valign="top"> |
| <td>set <code>ALT_DEVTOOLS_PATH=/opt/mytools</code></td> |
| <td>just run <code>configure</code>, |
| your tools should be detected automatically. |
| If you have an unusual configuration, |
| add the tools directory to your <code>PATH</code>. |
| </td> |
| </tr> |
| <tr valign="top"> |
| <td>set <code>ALT_DROPS_DIR=/home/user/dropdir</code></td> |
| <td>source drops are not used anymore</td> |
| </tr> |
| <tr valign="top"> |
| <td>set <code>USE_ONLY_BOOTDIR_TOOLS=true</code></td> |
| <td>not needed, <code>configure</code> should always do the Right Thing automatically</td> |
| </tr> |
| <tr valign="top"> |
| <td>set <code>ALT_JDK_IMPORT_PATH=/opt/java/import-jdk</code> |
| or <code>ALT_BUILD_JDK_IMPORT_PATH=/opt/java/import-jdk</code> |
| </td> |
| <td>Importing JDKs is no longer possible, |
| but hotspot can be imported using |
| <code>--with-import-hotspot</code>. |
| Documentation on how to achieve a |
| similar solution will come soon! |
| </td> |
| </tr> |
| <tr valign="top"> |
| <td>set <code>EXTRA_CFLAGS=-Xfoo</code></td> |
| <td>run <code>CFLAGS=-Xfoo configure</code></td> |
| </tr> |
| <tr valign="top"> |
| <td>set <code>CROSS_COMPILE_ARCH=i586</code></td> |
| <td>see <a href="#sec7.3"> section 7.3, Cross-compilation</a></td> |
| </tr> |
| <tr valign="top"> |
| <td>set <code>SKIP_BOOT_CYCLE=false</code></td> |
| <td>Run <code>make bootcycle-images</code>.</td> |
| </tr> |
| </table> |
| |
| <h3><a name="variables">Environment/Make Variables</a></h3> |
| <p> |
| Some of the |
| environment or make variables (just called <b>variables</b> in this |
| document) that can impact the build are: |
| <blockquote> |
| <dl> |
| <dt><a name="path"><code>PATH</code></a> </dt> |
| <dd>Typically you want to set the <code>PATH</code> to include: |
| <ul> |
| <li>The location of the GNU make binary</li> |
| <li>The location of the Bootstrap JDK <code>java</code> |
| (see <a href="#bootjdk">Bootstrap JDK</a>)</li> |
| <li>The location of the C/C++ compilers |
| (see <a href="#compilers"><code>compilers</code></a>)</li> |
| <li>The location or locations for the Unix command utilities |
| (e.g. <code>/usr/bin</code>)</li> |
| </ul> |
| </dd> |
| <dt><code>MILESTONE</code> </dt> |
| <dd> |
| The milestone name for the build (<i>e.g.</i>"beta"). |
| The default value is "internal". |
| </dd> |
| <dt><code>BUILD_NUMBER</code> </dt> |
| <dd> |
| The build number for the build (<i>e.g.</i> "b27"). |
| The default value is "b00". |
| </dd> |
| <dt><a name="arch_data_model"><code>ARCH_DATA_MODEL</code></a></dt> |
| <dd>The <code>ARCH_DATA_MODEL</code> variable |
| is used to specify whether the build is to generate 32-bit or 64-bit |
| binaries. |
| The Solaris build supports either 32-bit or 64-bit builds, but |
| Windows and Linux will support only one, depending on the specific |
| OS being used. |
| Normally, setting this variable is only necessary on Solaris. |
| Set <code>ARCH_DATA_MODEL</code> to <code>32</code> for generating 32-bit binaries, |
| or to <code>64</code> for generating 64-bit binaries. |
| </dd> |
| <dt><a name="ALT_BOOTDIR"><code>ALT_BOOTDIR</code></a></dt> |
| <dd> |
| The location of the bootstrap JDK installation. |
| See <a href="#bootjdk">Bootstrap JDK</a> for more information. |
| You should always install your own local Bootstrap JDK and |
| always set <code>ALT_BOOTDIR</code> explicitly. |
| </dd> |
| <dt><a name="ALT_OUTPUTDIR"><code>ALT_OUTPUTDIR</code></a> </dt> |
| <dd> |
| An override for specifying the (absolute) path of where the |
| build output is to go. |
| The default output directory will be build/<i>platform</i>. |
| </dd> |
| <dt><a name="ALT_COMPILER_PATH"><code>ALT_COMPILER_PATH</code></a> </dt> |
| <dd> |
| The location of the C/C++ compiler. |
| The default varies depending on the platform. |
| </dd> |
| <dt><code><a name="ALT_CACERTS_FILE">ALT_CACERTS_FILE</a></code></dt> |
| <dd> |
| The location of the <a href="#cacerts">cacerts</a> file. |
| The default will refer to |
| <code>jdk/src/share/lib/security/cacerts</code>. |
| </dd> |
| <dt><a name="ALT_CUPS_HEADERS_PATH"><code>ALT_CUPS_HEADERS_PATH</code></a> </dt> |
| <dd> |
| The location of the CUPS header files. |
| See <a href="#cups">CUPS information</a> for more information. |
| If this path does not exist the fallback path is |
| <code>/usr/include</code>. |
| </dd> |
| <dt><a name="ALT_FREETYPE_LIB_PATH"><code>ALT_FREETYPE_LIB_PATH</code></a></dt> |
| <dd> |
| The location of the FreeType shared library. |
| See <a href="#freetype">FreeType information</a> for details. |
| </dd> |
| <dt><a name="ALT_FREETYPE_HEADERS_PATH"><code>ALT_FREETYPE_HEADERS_PATH</code></a></dt> |
| <dd> |
| The location of the FreeType header files. |
| See <a href="#freetype">FreeType information</a> for details. |
| </dd> |
| <dt><a name="ALT_JDK_DEVTOOLS_PATH"><code>ALT_JDK_DEVTOOLS_PATH</code></a></dt> |
| <dd> |
| The default root location of the devtools. |
| The default value is |
| <code>$(ALT_SLASH_JAVA)/devtools</code>. |
| </dd> |
| <dt><code><a name="ALT_DEVTOOLS_PATH">ALT_DEVTOOLS_PATH</a></code> </dt> |
| <dd> |
| The location of tools like the |
| <a href="#zip"><code>zip</code> and <code>unzip</code></a> |
| binaries, but might also contain the GNU make utility |
| (<code><i>gmake</i></code>). |
| So this area is a bit of a grab bag, especially on Windows. |
| The default value depends on the platform and |
| Unix Commands being used. |
| On Linux the default will be |
| <code>$(ALT_JDK_DEVTOOLS_PATH)/linux/bin</code>, |
| on Solaris |
| <code>$(ALT_JDK_DEVTOOLS_PATH)/<i>{sparc,i386}</i>/bin</code>, |
| and on Windows with CYGWIN |
| <code>/usr/bin</code>. |
| </dd> |
| <dt><a name="ALT_UNIXCCS_PATH"><code>ALT_UNIXCCS_PATH</code></a></dt> |
| <dd> |
| <strong>Solaris only:</strong> |
| An override for specifying where the Unix CCS |
| command set are located. |
| The default location is <code>/usr/ccs/bin</code> |
| </dd> |
| <dt><a name="ALT_SLASH_JAVA"><code>ALT_SLASH_JAVA</code></a></dt> |
| <dd> |
| The default root location for many of the ALT path locations |
| of the following ALT variables. |
| The default value is |
| <code>"/java"</code> on Solaris and Linux, |
| <code>"J:"</code> on Windows. |
| </dd> |
| |
| <dt><a name="ALT_OPENWIN_HOME"><code>ALT_OPENWIN_HOME</code></a></dt> |
| <dd> |
| The top-level directory of the libraries and include files |
| for the platform's |
| graphical programming environment. |
| The default location is platform specific. |
| For example, on Linux it defaults to <code>/usr/X11R6/</code>. |
| </dd> |
| <dt><strong>Windows specific:</strong></dt> |
| <dd> |
| <dl> |
| <dt><a name="ALT_WINDOWSSDKDIR"><code>ALT_WINDOWSSDKDIR</code></a> </dt> |
| <dd> |
| The location of the |
| Microsoft Windows SDK where some tools will be |
| located. |
| The default is whatever WINDOWSSDKDIR is set to |
| (or WindowsSdkDir) or the path |
| <br> |
| <code>c:\Program Files\Microsoft SDKs\Windows\v7.0a</code> |
| </dd> |
| <dt><code><a name="ALT_DXSDK_PATH">ALT_DXSDK_PATH</a></code> </dt> |
| <dd> |
| The location of the |
| <a href="#dxsdk">Microsoft DirectX 9 SDK</a>. |
| The default will be to try and use the DirectX environment |
| variable <code>DXSDK_DIR</code>, |
| failing that, look in <code>C:/DXSDK</code>. |
| </dd> |
| <dt><code><a name="ALT_MSVCRNN_DLL_PATH">ALT_MSVCRNN_DLL_PATH</a></code> </dt> |
| <dd> |
| The location of the |
| <a href="#msvcrNN"><code>MSVCR100.DLL</code></a>. |
| </dd> |
| </dl> |
| </dd> |
| <dt><strong>Cross-Compilation Support:</strong></dt> |
| <dd> |
| <dl> |
| <dt><a name="CROSS_COMPILE_ARCH"><code>CROSS_COMPILE_ARCH</code></a> </dt> |
| <dd> |
| Set to the target architecture of a |
| cross-compilation build. If set, this |
| variable is used to signify that we are |
| cross-compiling. The expectation |
| is that |
| <a href="#ALT_COMPILER_PATH"><code>ALT_COMPILER_PATH</code></a> |
| is set |
| to point to the cross-compiler and that any |
| cross-compilation specific flags |
| are passed using |
| <a href="#EXTRA_CFLAGS"><code>EXTRA_CFLAGS</code></a>. |
| The <a href="#ALT_OPENWIN_HOME"><code>ALT_OPENWIN_HOME</code></a> |
| variable should |
| also be set to point to the graphical header files |
| (e.g. X11) provided with |
| the cross-compiler. |
| When cross-compiling we skip execution of any demos |
| etc that may be built, and |
| also skip binary-file verification. |
| </dd> |
| <dt><code><a name="EXTRA_CFLAGS">EXTRA_CFLAGS</a></code> </dt> |
| <dd> |
| Used to pass cross-compilation options to the |
| cross-compiler. |
| These are added to the <code>CFLAGS</code> |
| and <code>CXXFLAGS</code> variables. |
| </dd> |
| <dt><code><a name="USE_ONLY_BOOTDIR_TOOLS">USE_ONLY_BOOTDIR_TOOLS</a></code> </dt> |
| <dd> |
| Used primarily for cross-compilation builds |
| (and always set in that case) |
| this variable indicates that tools from the |
| boot JDK should be used during |
| the build process, not the tools |
| (<code>javac</code>, <code>javah</code>, <code>jar</code>) |
| just built (which can't execute on the build host). |
| </dd> |
| <dt><code><a name="HOST_CC">HOST_CC</a></code> </dt> |
| <dd> |
| The location of the C compiler to generate programs |
| to run on the build host. |
| Some parts of the build generate programs that are |
| then compiled and executed |
| to produce other parts of the build. Normally the |
| primary C compiler is used |
| to do this, but when cross-compiling that would be |
| the cross-compiler and the |
| resulting program could not be executed. |
| On Linux this defaults to <code>/usr/bin/gcc</code>; |
| on other platforms it must be |
| set explicitly. |
| </dd> |
| </dl> |
| <dt><strong>Specialized Build Options:</strong></dt> |
| <dd> |
| Some build variables exist to support specialized build |
| environments and/or specialized |
| build products. Their use is only supported in those contexts: |
| <dl> |
| <dt><code><a name="BUILD_CLIENT_ONLY">BUILD_CLIENT_ONLY</a></code> </dt> |
| <dd> |
| Indicates this build will only contain the |
| Hotspot client VM. In addition to |
| controlling the Hotspot build target, |
| it ensures that we don't try to copy |
| any server VM files/directories, |
| and defines a default <code>jvm.cfg</code> file |
| suitable for a client-only environment. |
| Using this in a 64-bit build will |
| generate a sanity warning as 64-bit client |
| builds are not directly supported. |
| </dd> |
| <dt><code><a name="BUILD_HEADLESS_ONLY"></a>BUILD_HEADLESS_ONLY</code> </dt> |
| <dd> |
| Used when the build environment has no graphical |
| capabilities at all. This |
| excludes building anything that requires graphical |
| libraries to be available. |
| </dd> |
| <dt><code><a name="JAVASE_EMBEDDED"></a>JAVASE_EMBEDDED</code> </dt> |
| <dd> |
| Used to indicate this is a build of the Oracle |
| Java SE Embedded product. |
| This will enable the directives included in the |
| SE-Embedded specific build |
| files. |
| </dd> |
| <dt><code><a name="LIBZIP_CAN_USE_MMAP">LIBZIP_CAN_USE_MMAP</a></code> </dt> |
| <dd> |
| If set to false, disables the use of mmap by the |
| zip utility. Otherwise, |
| mmap will be used. |
| </dd> |
| <dt><code><a name="COMPRESS_JARS"></a>COMPRESS_JARS</code> </dt> |
| <dd> |
| If set to true, causes certain jar files that |
| would otherwise be built without |
| compression, to use compression. |
| </dd> |
| </dl> |
| </dd> |
| </dl> |
| </blockquote> |
| |
| </blockquote> <!-- Appendix D --> |
| |
| <!-- ====================================================== --> |
| <hr> |
| <p>End of OpenJDK README-builds.html document.<br>Please come again! |
| <hr> |
| |
| </body> |
| </html> |