author | jjiang |
Tue, 23 Apr 2019 10:08:52 +0800 | |
changeset 54588 | f203906d0dde |
parent 54581 | 5c456dd47ff1 |
child 54635 | 14615b8ac24c |
permissions | -rw-r--r-- |
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1 |
% Building the JDK |
45763 | 2 |
|
3 |
## TL;DR (Instructions for the Impatient) |
|
4 |
||
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
5 |
If you are eager to try out building the JDK, these simple steps works most of |
45763 | 6 |
the time. They assume that you have installed Mercurial (and Cygwin if running |
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
7 |
on Windows) and cloned the top-level JDK repository that you want to build. |
45763 | 8 |
|
9 |
1. [Get the complete source code](#getting-the-source-code): \ |
|
48743
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
10 |
`hg clone http://hg.openjdk.java.net/jdk/jdk` |
45763 | 11 |
|
12 |
2. [Run configure](#running-configure): \ |
|
13 |
`bash configure` |
|
33030 | 14 |
|
45763 | 15 |
If `configure` fails due to missing dependencies (to either the |
48743
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
16 |
[toolchain](#native-compiler-toolchain-requirements), [build tools]( |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
17 |
#build-tools-requirements), [external libraries]( |
45763 | 18 |
#external-library-requirements) or the [boot JDK](#boot-jdk-requirements)), |
19 |
most of the time it prints a suggestion on how to resolve the situation on |
|
20 |
your platform. Follow the instructions, and try running `bash configure` |
|
21 |
again. |
|
33030 | 22 |
|
45763 | 23 |
3. [Run make](#running-make): \ |
24 |
`make images` |
|
25 |
||
26 |
4. Verify your newly built JDK: \ |
|
27 |
`./build/*/images/jdk/bin/java -version` |
|
28 |
||
29 |
5. [Run basic tests](##running-tests): \ |
|
30 |
`make run-test-tier1` |
|
31 |
||
32 |
If any of these steps failed, or if you want to know more about build |
|
33 |
requirements or build functionality, please continue reading this document. |
|
44078
673240c54c2e
8176509: Use pandoc for converting build readme to html
ihse
parents:
41040
diff
changeset
|
34 |
|
33030 | 35 |
## Introduction |
36 |
||
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
37 |
The JDK is a complex software project. Building it requires a certain amount of |
45763 | 38 |
technical expertise, a fair number of dependencies on external software, and |
39 |
reasonably powerful hardware. |
|
33030 | 40 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
41 |
If you just want to use the JDK and not build it yourself, this document is not |
45763 | 42 |
for you. See for instance [OpenJDK installation]( |
43 |
http://openjdk.java.net/install) for some methods of installing a prebuilt |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
44 |
JDK. |
33030 | 45 |
|
45763 | 46 |
## Getting the Source Code |
47 |
||
47217 | 48 |
Make sure you are getting the correct version. As of JDK 10, the source is no |
49 |
longer split into separate repositories so you only need to clone one single |
|
50 |
repository. At the [OpenJDK Mercurial server](http://hg.openjdk.java.net/) you |
|
52610
7ac273f045e3
8214062: JDK-8167368 Leftover: get_source.sh in build documentation
erikj
parents:
52351
diff
changeset
|
51 |
can see a list of all available repositories. If you want to build an older version, |
47217 | 52 |
e.g. JDK 8, it is recommended that you get the `jdk8u` forest, which contains |
53 |
incremental updates, instead of the `jdk8` forest, which was frozen at JDK 8 GA. |
|
45763 | 54 |
|
55 |
If you are new to Mercurial, a good place to start is the [Mercurial Beginner's |
|
56 |
Guide](http://www.mercurial-scm.org/guide). The rest of this document assumes a |
|
57 |
working knowledge of Mercurial. |
|
58 |
||
59 |
### Special Considerations |
|
60 |
||
61 |
For a smooth building experience, it is recommended that you follow these rules |
|
62 |
on where and how to check out the source code. |
|
63 |
||
64 |
* Do not check out the source code in a path which contains spaces. Chances |
|
65 |
are the build will not work. This is most likely to be an issue on Windows |
|
66 |
systems. |
|
67 |
||
68 |
* Do not check out the source code in a path which has a very long name or is |
|
69 |
nested many levels deep. Chances are you will hit an OS limitation during |
|
70 |
the build. |
|
71 |
||
72 |
* Put the source code on a local disk, not a network share. If possible, use |
|
73 |
an SSD. The build process is very disk intensive, and having slow disk |
|
74 |
access will significantly increase build times. If you need to use a |
|
75 |
network share for the source code, see below for suggestions on how to keep |
|
76 |
the build artifacts on a local disk. |
|
77 |
||
53110 | 78 |
* On Windows, if using [Cygwin](#cygwin), extra care must be taken to make sure |
79 |
the environment is consistent. It is recommended that you follow this |
|
45763 | 80 |
procedure: |
81 |
||
82 |
* Create the directory that is going to contain the top directory of the |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
83 |
JDK clone by using the `mkdir` command in the Cygwin bash shell. |
45763 | 84 |
That is, do *not* create it using Windows Explorer. This will ensure |
85 |
that it will have proper Cygwin attributes, and that it's children will |
|
86 |
inherit those attributes. |
|
87 |
||
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
88 |
* Do not put the JDK clone in a path under your Cygwin home |
45763 | 89 |
directory. This is especially important if your user name contains |
90 |
spaces and/or mixed upper and lower case letters. |
|
91 |
||
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
92 |
* Clone the JDK repository using the Cygwin command line `hg` client |
45763 | 93 |
as instructed in this document. That is, do *not* use another Mercurial |
94 |
client such as TortoiseHg. |
|
95 |
||
96 |
Failure to follow this procedure might result in hard-to-debug build |
|
97 |
problems. |
|
98 |
||
99 |
## Build Hardware Requirements |
|
100 |
||
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
101 |
The JDK is a massive project, and require machines ranging from decent to |
45763 | 102 |
powerful to be able to build in a reasonable amount of time, or to be able to |
103 |
complete a build at all. |
|
104 |
||
105 |
We *strongly* recommend usage of an SSD disk for the build, since disk speed is |
|
106 |
one of the limiting factors for build performance. |
|
107 |
||
108 |
### Building on x86 |
|
109 |
||
110 |
At a minimum, a machine with 2-4 cores is advisable, as well as 2-4 GB of RAM. |
|
111 |
(The more cores to use, the more memory you need.) At least 6 GB of free disk |
|
112 |
space is required (8 GB minimum for building on Solaris). |
|
113 |
||
114 |
Even for 32-bit builds, it is recommended to use a 64-bit build machine, and |
|
115 |
instead create a 32-bit target using `--with-target-bits=32`. |
|
116 |
||
117 |
### Building on sparc |
|
118 |
||
119 |
At a minimum, a machine with 4 cores is advisable, as well as 4 GB of RAM. (The |
|
120 |
more cores to use, the more memory you need.) At least 8 GB of free disk space |
|
121 |
is required. |
|
122 |
||
51644 | 123 |
### Building on aarch64 |
124 |
||
125 |
At a minimum, a machine with 8 cores is advisable, as well as 8 GB of RAM. |
|
126 |
(The more cores to use, the more memory you need.) At least 6 GB of free disk |
|
127 |
space is required. |
|
128 |
||
129 |
If you do not have access to sufficiently powerful hardware, it is also |
|
130 |
possible to use [cross-compiling](#cross-compiling). |
|
131 |
||
132 |
### Building on 32-bit arm |
|
45763 | 133 |
|
134 |
This is not recommended. Instead, see the section on [Cross-compiling]( |
|
135 |
#cross-compiling). |
|
136 |
||
137 |
## Operating System Requirements |
|
138 |
||
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
139 |
The mainline JDK project supports Linux, Solaris, macOS, AIX and Windows. |
45763 | 140 |
Support for other operating system, e.g. BSD, exists in separate "port" |
141 |
projects. |
|
142 |
||
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
143 |
In general, the JDK can be built on a wide range of versions of these operating |
45763 | 144 |
systems, but the further you deviate from what is tested on a daily basis, the |
145 |
more likely you are to run into problems. |
|
146 |
||
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
147 |
This table lists the OS versions used by Oracle when building the JDK. Such |
45763 | 148 |
information is always subject to change, but this table is up to date at the |
149 |
time of writing. |
|
150 |
||
151 |
Operating system Vendor/version used |
|
152 |
----------------- ------------------------------------------------------- |
|
54581
5c456dd47ff1
8222735: Update doc/building.md with current Oracle build platforms and compilers
erikj
parents:
54001
diff
changeset
|
153 |
Linux Oracle Enterprise Linux 6.4 / 7.6 |
5c456dd47ff1
8222735: Update doc/building.md with current Oracle build platforms and compilers
erikj
parents:
54001
diff
changeset
|
154 |
Solaris Solaris 11.3 SRU 20 |
5c456dd47ff1
8222735: Update doc/building.md with current Oracle build platforms and compilers
erikj
parents:
54001
diff
changeset
|
155 |
macOS Mac OS X 10.13 (High Sierra) |
45763 | 156 |
Windows Windows Server 2012 R2 |
33030 | 157 |
|
54581
5c456dd47ff1
8222735: Update doc/building.md with current Oracle build platforms and compilers
erikj
parents:
54001
diff
changeset
|
158 |
The double version numbers for Linux and Solaris are due to the hybrid model |
5c456dd47ff1
8222735: Update doc/building.md with current Oracle build platforms and compilers
erikj
parents:
54001
diff
changeset
|
159 |
used at Oracle, where header files and external libraries from an older version |
5c456dd47ff1
8222735: Update doc/building.md with current Oracle build platforms and compilers
erikj
parents:
54001
diff
changeset
|
160 |
are used when building on a more modern version of the OS. |
45763 | 161 |
|
162 |
The Build Group has a wiki page with [Supported Build Platforms]( |
|
163 |
https://wiki.openjdk.java.net/display/Build/Supported+Build+Platforms). From |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
164 |
time to time, this is updated by contributors to list successes or failures of |
45763 | 165 |
building on different platforms. |
166 |
||
167 |
### Windows |
|
168 |
||
169 |
Windows XP is not a supported platform, but all newer Windows should be able to |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
170 |
build the JDK. |
45763 | 171 |
|
172 |
On Windows, it is important that you pay attention to the instructions in the |
|
173 |
[Special Considerations](#special-considerations). |
|
174 |
||
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
175 |
Windows is the only non-POSIX OS supported by the JDK, and as such, requires |
50586
4bba6dea2e73
8200867: Remove references to "jdk 9" in build system
ihse
parents:
50490
diff
changeset
|
176 |
some extra care. A POSIX support layer is required to build on Windows. |
53110 | 177 |
Currently, the only supported such layers are Cygwin and Windows Subsystem for |
178 |
Linux (WSL). (Msys is no longer supported due to a too old bash; msys2 would |
|
179 |
likely be possible to support in a future version but that would require effort |
|
180 |
to implement.) |
|
45763 | 181 |
|
182 |
Internally in the build system, all paths are represented as Unix-style paths, |
|
183 |
e.g. `/cygdrive/c/hg/jdk9/Makefile` rather than `C:\hg\jdk9\Makefile`. This |
|
184 |
rule also applies to input to the build system, e.g. in arguments to |
|
49234
3375a8039fde
8193017: Import freetype sources into OpenJDK source tree
prr
parents:
49159
diff
changeset
|
185 |
`configure`. So, use `--with-msvcr-dll=/cygdrive/c/msvcr100.dll` rather than |
3375a8039fde
8193017: Import freetype sources into OpenJDK source tree
prr
parents:
49159
diff
changeset
|
186 |
`--with-msvcr-dll=c:\msvcr100.dll`. For details on this conversion, see the section |
45763 | 187 |
on [Fixpath](#fixpath). |
188 |
||
189 |
#### Cygwin |
|
190 |
||
53110 | 191 |
A functioning [Cygwin](http://www.cygwin.com/) environment is required for |
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
192 |
building the JDK on Windows. If you have a 64-bit OS, we strongly recommend |
45763 | 193 |
using the 64-bit version of Cygwin. |
194 |
||
195 |
**Note:** Cygwin has a model of continuously updating all packages without any |
|
196 |
easy way to install or revert to a specific version of a package. This means |
|
197 |
that whenever you add or update a package in Cygwin, you might (inadvertently) |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
198 |
update tools that are used by the JDK build process, and that can cause |
45763 | 199 |
unexpected build problems. |
200 |
||
53110 | 201 |
The JDK requires GNU Make 4.0 or greater in Cygwin. This is usually not a |
45763 | 202 |
problem, since Cygwin currently only distributes GNU Make at a version above |
203 |
4.0. |
|
204 |
||
205 |
Apart from the basic Cygwin installation, the following packages must also be |
|
206 |
installed: |
|
207 |
||
48743
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
208 |
* `autoconf` |
45763 | 209 |
* `make` |
210 |
* `zip` |
|
211 |
* `unzip` |
|
212 |
||
213 |
Often, you can install these packages using the following command line: |
|
214 |
``` |
|
48743
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
215 |
<path to Cygwin setup>/setup-x86_64 -q -P autoconf -P make -P unzip -P zip |
45763 | 216 |
``` |
217 |
||
218 |
Unfortunately, Cygwin can be unreliable in certain circumstances. If you |
|
219 |
experience build tool crashes or strange issues when building on Windows, |
|
220 |
please check the Cygwin FAQ on the ["BLODA" list]( |
|
221 |
https://cygwin.com/faq/faq.html#faq.using.bloda) and the section on [fork() |
|
222 |
failures](https://cygwin.com/faq/faq.html#faq.using.fixing-fork-failures). |
|
223 |
||
53110 | 224 |
#### Windows Subsystem for Linux (WSL) |
225 |
||
226 |
Windows 10 1809 or newer is supported due to a dependency on the wslpath utility |
|
227 |
and support for environment variable sharing through WSLENV. Version 1803 can |
|
228 |
work but intermittent build failures have been observed. |
|
229 |
||
230 |
It's possible to build both Windows and Linux binaries from WSL. To build |
|
231 |
Windows binaries, you must use a Windows boot JDK (located in a |
|
232 |
Windows-accessible directory). To build Linux binaries, you must use a Linux |
|
233 |
boot JDK. The default behavior is to build for Windows. To build for Linux, pass |
|
234 |
`--build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu` to |
|
235 |
`configure`. |
|
236 |
||
237 |
If building Windows binaries, the source code must be located in a Windows- |
|
238 |
accessible directory. This is because Windows executables (such as Visual Studio |
|
239 |
and the boot JDK) must be able to access the source code. Also, the drive where |
|
240 |
the source is stored must be mounted as case-insensitive by changing either |
|
241 |
/etc/fstab or /etc/wsl.conf in WSL. Individual directories may be corrected |
|
242 |
using the fsutil tool in case the source was cloned before changing the mount |
|
243 |
options. |
|
244 |
||
245 |
Note that while it's possible to build on WSL, testing is still not fully |
|
246 |
supported. |
|
247 |
||
45763 | 248 |
### Solaris |
249 |
||
250 |
See `make/devkit/solaris11.1-package-list.txt` for a list of recommended |
|
251 |
packages to install when building on Solaris. The versions specified in this |
|
252 |
list is the versions used by the daily builds at Oracle, and is likely to work |
|
253 |
properly. |
|
254 |
||
255 |
Older versions of Solaris shipped a broken version of `objcopy`. At least |
|
256 |
version 2.21.1 is needed, which is provided by Solaris 11 Update 1. Objcopy is |
|
257 |
needed if you want to have external debug symbols. Please make sure you are |
|
258 |
using at least version 2.21.1 of objcopy, or that you disable external debug |
|
259 |
symbols. |
|
260 |
||
261 |
### macOS |
|
262 |
||
263 |
Apple is using a quite aggressive scheme of pushing OS updates, and coupling |
|
264 |
these updates with required updates of Xcode. Unfortunately, this makes it |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
265 |
difficult for a project such as the JDK to keep pace with a continuously updated |
45763 | 266 |
machine running macOS. See the section on [Apple Xcode](#apple-xcode) on some |
267 |
strategies to deal with this. |
|
268 |
||
51237
ea900a7dc7d7
8208096: Update build documentation to reflect compiler upgrades at Oracle
erikj
parents:
50885
diff
changeset
|
269 |
It is recommended that you use at least Mac OS X 10.13 (High Sierra). At the time |
ea900a7dc7d7
8208096: Update build documentation to reflect compiler upgrades at Oracle
erikj
parents:
50885
diff
changeset
|
270 |
of writing, the JDK has been successfully compiled on macOS 10.12 (Sierra). |
45763 | 271 |
|
272 |
The standard macOS environment contains the basic tooling needed to build, but |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
273 |
for external libraries a package manager is recommended. The JDK uses |
45763 | 274 |
[homebrew](https://brew.sh/) in the examples, but feel free to use whatever |
275 |
manager you want (or none). |
|
276 |
||
277 |
### Linux |
|
278 |
||
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
279 |
It is often not much problem to build the JDK on Linux. The only general advice |
45763 | 280 |
is to try to use the compilers, external libraries and header files as provided |
281 |
by your distribution. |
|
282 |
||
283 |
The basic tooling is provided as part of the core operating system, but you |
|
284 |
will most likely need to install developer packages. |
|
285 |
||
286 |
For apt-based distributions (Debian, Ubuntu, etc), try this: |
|
287 |
``` |
|
288 |
sudo apt-get install build-essential |
|
289 |
``` |
|
290 |
||
291 |
For rpm-based distributions (Fedora, Red Hat, etc), try this: |
|
292 |
``` |
|
293 |
sudo yum groupinstall "Development Tools" |
|
294 |
``` |
|
295 |
||
296 |
### AIX |
|
297 |
||
54001 | 298 |
Please consult the AIX section of the [Supported Build Platforms]( |
299 |
https://wiki.openjdk.java.net/display/Build/Supported+Build+Platforms) OpenJDK |
|
300 |
Build Wiki page for details about which versions of AIX are supported. |
|
45763 | 301 |
|
302 |
## Native Compiler (Toolchain) Requirements |
|
303 |
||
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
304 |
Large portions of the JDK consists of native code, that needs to be compiled to |
45763 | 305 |
be able to run on the target platform. In theory, toolchain and operating |
306 |
system should be independent factors, but in practice there's more or less a |
|
307 |
one-to-one correlation between target operating system and toolchain. |
|
308 |
||
309 |
Operating system Supported toolchain |
|
310 |
------------------ ------------------------- |
|
311 |
Linux gcc, clang |
|
312 |
macOS Apple Xcode (using clang) |
|
313 |
Solaris Oracle Solaris Studio |
|
314 |
AIX IBM XL C/C++ |
|
315 |
Windows Microsoft Visual Studio |
|
316 |
||
317 |
Please see the individual sections on the toolchains for version |
|
318 |
recommendations. As a reference, these versions of the toolchains are used, at |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
319 |
the time of writing, by Oracle for the daily builds of the JDK. It should be |
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
320 |
possible to compile the JDK with both older and newer versions, but the closer |
45763 | 321 |
you stay to this list, the more likely you are to compile successfully without |
322 |
issues. |
|
323 |
||
324 |
Operating system Toolchain version |
|
325 |
------------------ ------------------------------------------------------- |
|
54581
5c456dd47ff1
8222735: Update doc/building.md with current Oracle build platforms and compilers
erikj
parents:
54001
diff
changeset
|
326 |
Linux gcc 8.2.0 |
5c456dd47ff1
8222735: Update doc/building.md with current Oracle build platforms and compilers
erikj
parents:
54001
diff
changeset
|
327 |
macOS Apple Xcode 10.1 (using clang 10.0.0) |
5c456dd47ff1
8222735: Update doc/building.md with current Oracle build platforms and compilers
erikj
parents:
54001
diff
changeset
|
328 |
Solaris Oracle Solaris Studio 12.6 (with compiler version 5.15) |
5c456dd47ff1
8222735: Update doc/building.md with current Oracle build platforms and compilers
erikj
parents:
54001
diff
changeset
|
329 |
Windows Microsoft Visual Studio 2017 update 15.9.6 |
45763 | 330 |
|
331 |
### gcc |
|
332 |
||
50586
4bba6dea2e73
8200867: Remove references to "jdk 9" in build system
ihse
parents:
50490
diff
changeset
|
333 |
The minimum accepted version of gcc is 4.8. Older versions will generate a warning |
45877
640f1904ebb8
8184338: switch minimum supported gcc version to 4.7
mbaesken
parents:
45763
diff
changeset
|
334 |
by `configure` and are unlikely to work. |
45763 | 335 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
336 |
The JDK is currently known to be able to compile with at least version 7.4 of |
50586
4bba6dea2e73
8200867: Remove references to "jdk 9" in build system
ihse
parents:
50490
diff
changeset
|
337 |
gcc. |
45763 | 338 |
|
339 |
In general, any version between these two should be usable. |
|
340 |
||
341 |
### clang |
|
342 |
||
343 |
The minimum accepted version of clang is 3.2. Older versions will not be |
|
344 |
accepted by `configure`. |
|
345 |
||
346 |
To use clang instead of gcc on Linux, use `--with-toolchain-type=clang`. |
|
347 |
||
348 |
### Apple Xcode |
|
349 |
||
51237
ea900a7dc7d7
8208096: Update build documentation to reflect compiler upgrades at Oracle
erikj
parents:
50885
diff
changeset
|
350 |
The oldest supported version of Xcode is 8. |
45763 | 351 |
|
352 |
You will need the Xcode command lines developers tools to be able to build |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
353 |
the JDK. (Actually, *only* the command lines tools are needed, not the IDE.) |
45763 | 354 |
The simplest way to install these is to run: |
355 |
``` |
|
356 |
xcode-select --install |
|
357 |
``` |
|
358 |
||
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
359 |
It is advisable to keep an older version of Xcode for building the JDK when |
45763 | 360 |
updating Xcode. This [blog page]( |
361 |
http://iosdevelopertips.com/xcode/install-multiple-versions-of-xcode.html) has |
|
362 |
good suggestions on managing multiple Xcode versions. To use a specific version |
|
363 |
of Xcode, use `xcode-select -s` before running `configure`, or use |
|
364 |
`--with-toolchain-path` to point to the version of Xcode to use, e.g. |
|
51237
ea900a7dc7d7
8208096: Update build documentation to reflect compiler upgrades at Oracle
erikj
parents:
50885
diff
changeset
|
365 |
`configure --with-toolchain-path=/Applications/Xcode8.app/Contents/Developer/usr/bin` |
45763 | 366 |
|
367 |
If you have recently (inadvertently) updated your OS and/or Xcode version, and |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
368 |
the JDK can no longer be built, please see the section on [Problems with the |
45763 | 369 |
Build Environment](#problems-with-the-build-environment), and [Getting |
370 |
Help](#getting-help) to find out if there are any recent, non-merged patches |
|
371 |
available for this update. |
|
372 |
||
373 |
### Oracle Solaris Studio |
|
374 |
||
375 |
The minimum accepted version of the Solaris Studio compilers is 5.13 |
|
376 |
(corresponding to Solaris Studio 12.4). Older versions will not be accepted by |
|
377 |
configure. |
|
33030 | 378 |
|
34595
09596fe63e2d
8145391: Updated jprt.properties, devtools, jib and readme with SS12u4
erikj
parents:
33030
diff
changeset
|
379 |
The Solaris Studio installation should contain at least these packages: |
33030 | 380 |
|
45763 | 381 |
Package Version |
382 |
-------------------------------------------------- ------------- |
|
383 |
developer/solarisstudio-124/backend 12.4-1.0.6.0 |
|
384 |
developer/solarisstudio-124/c++ 12.4-1.0.10.0 |
|
385 |
developer/solarisstudio-124/cc 12.4-1.0.4.0 |
|
386 |
developer/solarisstudio-124/library/c++-libs 12.4-1.0.10.0 |
|
387 |
developer/solarisstudio-124/library/math-libs 12.4-1.0.0.1 |
|
388 |
developer/solarisstudio-124/library/studio-gccrt 12.4-1.0.0.1 |
|
389 |
developer/solarisstudio-124/studio-common 12.4-1.0.0.1 |
|
390 |
developer/solarisstudio-124/studio-ja 12.4-1.0.0.1 |
|
391 |
developer/solarisstudio-124/studio-legal 12.4-1.0.0.1 |
|
392 |
developer/solarisstudio-124/studio-zhCN 12.4-1.0.0.1 |
|
393 |
||
394 |
Compiling with Solaris Studio can sometimes be finicky. This is the exact |
|
395 |
version used by Oracle, which worked correctly at the time of writing: |
|
396 |
``` |
|
397 |
$ cc -V |
|
398 |
cc: Sun C 5.13 SunOS_i386 2014/10/20 |
|
399 |
$ CC -V |
|
400 |
CC: Sun C++ 5.13 SunOS_i386 151846-10 2015/10/30 |
|
401 |
``` |
|
402 |
||
403 |
### Microsoft Visual Studio |
|
404 |
||
405 |
The minimum accepted version of Visual Studio is 2010. Older versions will not |
|
406 |
be accepted by `configure`. The maximum accepted version of Visual Studio is |
|
51237
ea900a7dc7d7
8208096: Update build documentation to reflect compiler upgrades at Oracle
erikj
parents:
50885
diff
changeset
|
407 |
2017. Versions older than 2017 are unlikely to continue working for long. |
45763 | 408 |
|
409 |
If you have multiple versions of Visual Studio installed, `configure` will by |
|
410 |
default pick the latest. You can request a specific version to be used by |
|
51237
ea900a7dc7d7
8208096: Update build documentation to reflect compiler upgrades at Oracle
erikj
parents:
50885
diff
changeset
|
411 |
setting `--with-toolchain-version`, e.g. `--with-toolchain-version=2015`. |
33030 | 412 |
|
45763 | 413 |
If you get `LINK: fatal error LNK1123: failure during conversion to COFF: file |
414 |
invalid` when building using Visual Studio 2010, you have encountered |
|
415 |
[KB2757355](http://support.microsoft.com/kb/2757355), a bug triggered by a |
|
416 |
specific installation order. However, the solution suggested by the KB article |
|
417 |
does not always resolve the problem. See [this stackoverflow discussion]( |
|
418 |
https://stackoverflow.com/questions/10888391) for other suggestions. |
|
33030 | 419 |
|
45763 | 420 |
### IBM XL C/C++ |
421 |
||
54001 | 422 |
Please consult the AIX section of the [Supported Build Platforms]( |
423 |
https://wiki.openjdk.java.net/display/Build/Supported+Build+Platforms) OpenJDK |
|
424 |
Build Wiki page for details about which versions of XLC are supported. |
|
45763 | 425 |
|
426 |
||
427 |
## Boot JDK Requirements |
|
33030 | 428 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
429 |
Paradoxically, building the JDK requires a pre-existing JDK. This is called the |
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
430 |
"boot JDK". The boot JDK does not, however, have to be a JDK built directly from |
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
431 |
the source code available in the OpenJDK Community. If you are porting the JDK |
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
432 |
to a new platform, chances are that there already exists another JDK for that |
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
433 |
platform that is usable as boot JDK. |
33030 | 434 |
|
45763 | 435 |
The rule of thumb is that the boot JDK for building JDK major version *N* |
49159
436f1e03fd04
8199266: Update boot and build jdk requirements in configure
erikj
parents:
48743
diff
changeset
|
436 |
should be a JDK of major version *N-1*, so for building JDK 9 a JDK 8 would be |
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
437 |
suitable as boot JDK. However, the JDK should be able to "build itself", so an |
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
438 |
up-to-date build of the current JDK source is an acceptable alternative. If |
49159
436f1e03fd04
8199266: Update boot and build jdk requirements in configure
erikj
parents:
48743
diff
changeset
|
439 |
you are following the *N-1* rule, make sure you've got the latest update |
436f1e03fd04
8199266: Update boot and build jdk requirements in configure
erikj
parents:
48743
diff
changeset
|
440 |
version, since JDK 8 GA might not be able to build JDK 9 on all platforms. |
436f1e03fd04
8199266: Update boot and build jdk requirements in configure
erikj
parents:
48743
diff
changeset
|
441 |
|
436f1e03fd04
8199266: Update boot and build jdk requirements in configure
erikj
parents:
48743
diff
changeset
|
442 |
Early in the release cycle, version *N-1* may not yet have been released. In |
436f1e03fd04
8199266: Update boot and build jdk requirements in configure
erikj
parents:
48743
diff
changeset
|
443 |
that case, the preferred boot JDK will be version *N-2* until version *N-1* |
436f1e03fd04
8199266: Update boot and build jdk requirements in configure
erikj
parents:
48743
diff
changeset
|
444 |
is available. |
33030 | 445 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
446 |
If the boot JDK is not automatically detected, or the wrong JDK is picked, use |
45763 | 447 |
`--with-boot-jdk` to point to the JDK to use. |
448 |
||
49159
436f1e03fd04
8199266: Update boot and build jdk requirements in configure
erikj
parents:
48743
diff
changeset
|
449 |
### Getting JDK binaries |
45763 | 450 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
451 |
JDK binaries for Linux, Windows and macOS can be downloaded from |
49159
436f1e03fd04
8199266: Update boot and build jdk requirements in configure
erikj
parents:
48743
diff
changeset
|
452 |
[jdk.java.net](http://jdk.java.net). An alternative is to download the |
436f1e03fd04
8199266: Update boot and build jdk requirements in configure
erikj
parents:
48743
diff
changeset
|
453 |
[Oracle JDK](http://www.oracle.com/technetwork/java/javase/downloads). Another |
436f1e03fd04
8199266: Update boot and build jdk requirements in configure
erikj
parents:
48743
diff
changeset
|
454 |
is the [Adopt OpenJDK Project](https://adoptopenjdk.net/), which publishes |
436f1e03fd04
8199266: Update boot and build jdk requirements in configure
erikj
parents:
48743
diff
changeset
|
455 |
experimental prebuilt binaries for various platforms. |
45763 | 456 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
457 |
On Linux you can also get a JDK from the Linux distribution. On apt-based |
49159
436f1e03fd04
8199266: Update boot and build jdk requirements in configure
erikj
parents:
48743
diff
changeset
|
458 |
distros (like Debian and Ubuntu), `sudo apt-get install openjdk-<VERSION>-jdk` |
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
459 |
is typically enough to install a JDK \<VERSION\>. On rpm-based distros (like |
49159
436f1e03fd04
8199266: Update boot and build jdk requirements in configure
erikj
parents:
48743
diff
changeset
|
460 |
Fedora and Red Hat), try `sudo yum install java-<VERSION>-openjdk-devel`. |
45763 | 461 |
|
462 |
## External Library Requirements |
|
463 |
||
464 |
Different platforms require different external libraries. In general, libraries |
|
465 |
are not optional - that is, they are either required or not used. |
|
466 |
||
467 |
If a required library is not detected by `configure`, you need to provide the |
|
468 |
path to it. There are two forms of the `configure` arguments to point to an |
|
469 |
external library: `--with-<LIB>=<path>` or `--with-<LIB>-include=<path to |
|
470 |
include> --with-<LIB>-lib=<path to lib>`. The first variant is more concise, |
|
471 |
but require the include files an library files to reside in a default hierarchy |
|
472 |
under this directory. In most cases, it works fine. |
|
33030 | 473 |
|
45763 | 474 |
As a fallback, the second version allows you to point to the include directory |
475 |
and the lib directory separately. |
|
476 |
||
477 |
### FreeType |
|
478 |
||
49234
3375a8039fde
8193017: Import freetype sources into OpenJDK source tree
prr
parents:
49159
diff
changeset
|
479 |
FreeType2 from [The FreeType Project](http://www.freetype.org/) is not required |
3375a8039fde
8193017: Import freetype sources into OpenJDK source tree
prr
parents:
49159
diff
changeset
|
480 |
on any platform. The exception is on Unix-based platforms when configuring such |
3375a8039fde
8193017: Import freetype sources into OpenJDK source tree
prr
parents:
49159
diff
changeset
|
481 |
that the build artifacts will reference a system installed library, |
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
482 |
rather than bundling the JDK’s own copy. |
33030 | 483 |
|
45763 | 484 |
* To install on an apt-based Linux, try running `sudo apt-get install |
49234
3375a8039fde
8193017: Import freetype sources into OpenJDK source tree
prr
parents:
49159
diff
changeset
|
485 |
libfreetype6-dev`. |
45763 | 486 |
* To install on an rpm-based Linux, try running `sudo yum install |
49234
3375a8039fde
8193017: Import freetype sources into OpenJDK source tree
prr
parents:
49159
diff
changeset
|
487 |
freetype-devel`. |
45763 | 488 |
* To install on Solaris, try running `pkg install system/library/freetype-2`. |
33030 | 489 |
|
49234
3375a8039fde
8193017: Import freetype sources into OpenJDK source tree
prr
parents:
49159
diff
changeset
|
490 |
Use `--with-freetype-include=<path>` and `--with-freetype-lib=<path>` |
3375a8039fde
8193017: Import freetype sources into OpenJDK source tree
prr
parents:
49159
diff
changeset
|
491 |
if `configure` does not automatically locate the platform FreeType files. |
45763 | 492 |
|
493 |
### CUPS |
|
494 |
||
495 |
CUPS, [Common UNIX Printing System](http://www.cups.org) header files are |
|
496 |
required on all platforms, except Windows. Often these files are provided by |
|
497 |
your operating system. |
|
33030 | 498 |
|
45763 | 499 |
* To install on an apt-based Linux, try running `sudo apt-get install |
500 |
libcups2-dev`. |
|
501 |
* To install on an rpm-based Linux, try running `sudo yum install |
|
502 |
cups-devel`. |
|
503 |
* To install on Solaris, try running `pkg install print/cups`. |
|
33030 | 504 |
|
45763 | 505 |
Use `--with-cups=<path>` if `configure` does not properly locate your CUPS |
506 |
files. |
|
507 |
||
508 |
### X11 |
|
509 |
||
510 |
Certain [X11](http://www.x.org/) libraries and include files are required on |
|
511 |
Linux and Solaris. |
|
33030 | 512 |
|
45763 | 513 |
* To install on an apt-based Linux, try running `sudo apt-get install |
52921 | 514 |
libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev`. |
45763 | 515 |
* To install on an rpm-based Linux, try running `sudo yum install |
52921 | 516 |
libXtst-devel libXt-devel libXrender-devel libXrandr-devel libXi-devel`. |
45763 | 517 |
* To install on Solaris, try running `pkg install x11/header/x11-protocols |
518 |
x11/library/libice x11/library/libpthread-stubs x11/library/libsm |
|
519 |
x11/library/libx11 x11/library/libxau x11/library/libxcb |
|
520 |
x11/library/libxdmcp x11/library/libxevie x11/library/libxext |
|
52921 | 521 |
x11/library/libxrender x11/library/libxrandr x11/library/libxscrnsaver |
522 |
x11/library/libxtst x11/library/toolkit/libxt`. |
|
45763 | 523 |
|
524 |
Use `--with-x=<path>` if `configure` does not properly locate your X11 files. |
|
525 |
||
526 |
### ALSA |
|
527 |
||
528 |
ALSA, [Advanced Linux Sound Architecture](https://www.alsa-project.org/) is |
|
529 |
required on Linux. At least version 0.9.1 of ALSA is required. |
|
33030 | 530 |
|
45763 | 531 |
* To install on an apt-based Linux, try running `sudo apt-get install |
532 |
libasound2-dev`. |
|
533 |
* To install on an rpm-based Linux, try running `sudo yum install |
|
534 |
alsa-lib-devel`. |
|
535 |
||
536 |
Use `--with-alsa=<path>` if `configure` does not properly locate your ALSA |
|
537 |
files. |
|
538 |
||
539 |
### libffi |
|
540 |
||
541 |
libffi, the [Portable Foreign Function Interface Library]( |
|
542 |
http://sourceware.org/libffi) is required when building the Zero version of |
|
543 |
Hotspot. |
|
544 |
||
545 |
* To install on an apt-based Linux, try running `sudo apt-get install |
|
546 |
libffi-dev`. |
|
547 |
* To install on an rpm-based Linux, try running `sudo yum install |
|
548 |
libffi-devel`. |
|
549 |
||
550 |
Use `--with-libffi=<path>` if `configure` does not properly locate your libffi |
|
551 |
files. |
|
552 |
||
48743
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
553 |
## Build Tools Requirements |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
554 |
|
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
555 |
### Autoconf |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
556 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
557 |
The JDK requires [Autoconf](http://www.gnu.org/software/autoconf) on all |
48743
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
558 |
platforms. At least version 2.69 is required. |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
559 |
|
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
560 |
* To install on an apt-based Linux, try running `sudo apt-get install |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
561 |
autoconf`. |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
562 |
* To install on an rpm-based Linux, try running `sudo yum install |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
563 |
autoconf`. |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
564 |
* To install on macOS, try running `brew install autoconf`. |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
565 |
* To install on Windows, try running `<path to Cygwin setup>/setup-x86_64 -q |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
566 |
-P autoconf`. |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
567 |
|
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
568 |
If `configure` has problems locating your installation of autoconf, you can |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
569 |
specify it using the `AUTOCONF` environment variable, like this: |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
570 |
|
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
571 |
``` |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
572 |
AUTOCONF=<path to autoconf> configure ... |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
573 |
``` |
33030 | 574 |
|
45763 | 575 |
### GNU Make |
576 |
||
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
577 |
The JDK requires [GNU Make](http://www.gnu.org/software/make). No other flavors |
45763 | 578 |
of make are supported. |
33030 | 579 |
|
45763 | 580 |
At least version 3.81 of GNU Make must be used. For distributions supporting |
581 |
GNU Make 4.0 or above, we strongly recommend it. GNU Make 4.0 contains useful |
|
582 |
functionality to handle parallel building (supported by `--with-output-sync`) |
|
583 |
and speed and stability improvements. |
|
33030 | 584 |
|
45763 | 585 |
Note that `configure` locates and verifies a properly functioning version of |
586 |
`make` and stores the path to this `make` binary in the configuration. If you |
|
587 |
start a build using `make` on the command line, you will be using the version |
|
588 |
of make found first in your `PATH`, and not necessarily the one stored in the |
|
589 |
configuration. This initial make will be used as "bootstrap make", and in a |
|
590 |
second stage, the make located by `configure` will be called. Normally, this |
|
591 |
will present no issues, but if you have a very old `make`, or a non-GNU Make |
|
592 |
`make` in your path, this might cause issues. |
|
593 |
||
594 |
If you want to override the default make found by `configure`, use the `MAKE` |
|
595 |
configure variable, e.g. `configure MAKE=/opt/gnu/make`. |
|
596 |
||
597 |
On Solaris, it is common to call the GNU version of make by using `gmake`. |
|
598 |
||
599 |
### GNU Bash |
|
33030 | 600 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
601 |
The JDK requires [GNU Bash](http://www.gnu.org/software/bash). No other shells |
45763 | 602 |
are supported. |
603 |
||
604 |
At least version 3.2 of GNU Bash must be used. |
|
605 |
||
606 |
## Running Configure |
|
33030 | 607 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
608 |
To build the JDK, you need a "configuration", which consists of a directory |
45763 | 609 |
where to store the build output, coupled with information about the platform, |
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
610 |
the specific build machine, and choices that affect how the JDK is built. |
33030 | 611 |
|
45763 | 612 |
The configuration is created by the `configure` script. The basic invocation of |
613 |
the `configure` script looks like this: |
|
33030 | 614 |
|
45763 | 615 |
``` |
616 |
bash configure [options] |
|
617 |
``` |
|
33030 | 618 |
|
45763 | 619 |
This will create an output directory containing the configuration and setup an |
620 |
area for the build result. This directory typically looks like |
|
621 |
`build/linux-x64-normal-server-release`, but the actual name depends on your |
|
622 |
specific configuration. (It can also be set directly, see [Using Multiple |
|
623 |
Configurations](#using-multiple-configurations)). This directory is referred to |
|
624 |
as `$BUILD` in this documentation. |
|
33030 | 625 |
|
626 |
`configure` will try to figure out what system you are running on and where all |
|
627 |
necessary build components are. If you have all prerequisites for building |
|
628 |
installed, it should find everything. If it fails to detect any component |
|
45763 | 629 |
automatically, it will exit and inform you about the problem. |
33030 | 630 |
|
45763 | 631 |
Some command line examples: |
33030 | 632 |
|
45763 | 633 |
* Create a 32-bit build for Windows with FreeType2 in `C:\freetype-i586`: |
634 |
``` |
|
635 |
bash configure --with-freetype=/cygdrive/c/freetype-i586 --with-target-bits=32 |
|
636 |
``` |
|
33030 | 637 |
|
45763 | 638 |
* Create a debug build with the `server` JVM and DTrace enabled: |
639 |
``` |
|
640 |
bash configure --enable-debug --with-jvm-variants=server --enable-dtrace |
|
641 |
``` |
|
33030 | 642 |
|
45763 | 643 |
### Common Configure Arguments |
33030 | 644 |
|
45763 | 645 |
Here follows some of the most common and important `configure` argument. |
33030 | 646 |
|
45763 | 647 |
To get up-to-date information on *all* available `configure` argument, please |
648 |
run: |
|
649 |
``` |
|
650 |
bash configure --help |
|
651 |
``` |
|
33030 | 652 |
|
45763 | 653 |
(Note that this help text also include general autoconf options, like |
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
654 |
`--dvidir`, that is not relevant to the JDK. To list only JDK-specific |
45763 | 655 |
features, use `bash configure --help=short` instead.) |
656 |
||
657 |
#### Configure Arguments for Tailoring the Build |
|
33030 | 658 |
|
45763 | 659 |
* `--enable-debug` - Set the debug level to `fastdebug` (this is a shorthand |
660 |
for `--with-debug-level=fastdebug`) |
|
661 |
* `--with-debug-level=<level>` - Set the debug level, which can be `release`, |
|
662 |
`fastdebug`, `slowdebug` or `optimized`. Default is `release`. `optimized` |
|
663 |
is variant of `release` with additional Hotspot debug code. |
|
664 |
* `--with-native-debug-symbols=<method>` - Specify if and how native debug |
|
665 |
symbols should be built. Available methods are `none`, `internal`, |
|
666 |
`external`, `zipped`. Default behavior depends on platform. See [Native |
|
667 |
Debug Symbols](#native-debug-symbols) for more details. |
|
668 |
* `--with-version-string=<string>` - Specify the version string this build |
|
669 |
will be identified with. |
|
670 |
* `--with-version-<part>=<value>` - A group of options, where `<part>` can be |
|
671 |
any of `pre`, `opt`, `build`, `major`, `minor`, `security` or `patch`. Use |
|
672 |
these options to modify just the corresponding part of the version string |
|
673 |
from the default, or the value provided by `--with-version-string`. |
|
674 |
* `--with-jvm-variants=<variant>[,<variant>...]` - Build the specified variant |
|
675 |
(or variants) of Hotspot. Valid variants are: `server`, `client`, |
|
47687 | 676 |
`minimal`, `core`, `zero`, `custom`. Note that not all |
45763 | 677 |
variants are possible to combine in a single build. |
678 |
* `--with-jvm-features=<feature>[,<feature>...]` - Use the specified JVM |
|
679 |
features when building Hotspot. The list of features will be enabled on top |
|
680 |
of the default list. For the `custom` JVM variant, this default list is |
|
681 |
empty. A complete list of available JVM features can be found using `bash |
|
682 |
configure --help`. |
|
683 |
* `--with-target-bits=<bits>` - Create a target binary suitable for running |
|
684 |
on a `<bits>` platform. Use this to create 32-bit output on a 64-bit build |
|
685 |
platform, instead of doing a full cross-compile. (This is known as a |
|
686 |
*reduced* build.) |
|
33030 | 687 |
|
52734
d537553ed639
8214332: Add a flag for overriding default JNI library search path
dholmes
parents:
52665
diff
changeset
|
688 |
On Linux, BSD and AIX, it is possible to override where Java by default |
d537553ed639
8214332: Add a flag for overriding default JNI library search path
dholmes
parents:
52665
diff
changeset
|
689 |
searches for runtime/JNI libraries. This can be useful in situations where |
d537553ed639
8214332: Add a flag for overriding default JNI library search path
dholmes
parents:
52665
diff
changeset
|
690 |
there is a special shared directory for system JNI libraries. This setting |
d537553ed639
8214332: Add a flag for overriding default JNI library search path
dholmes
parents:
52665
diff
changeset
|
691 |
can in turn be overriden at runtime by setting the `java.library.path` property. |
d537553ed639
8214332: Add a flag for overriding default JNI library search path
dholmes
parents:
52665
diff
changeset
|
692 |
|
d537553ed639
8214332: Add a flag for overriding default JNI library search path
dholmes
parents:
52665
diff
changeset
|
693 |
* `--with-jni-libpath=<path>` - Use the specified path as a default |
d537553ed639
8214332: Add a flag for overriding default JNI library search path
dholmes
parents:
52665
diff
changeset
|
694 |
when searching for runtime libraries. |
d537553ed639
8214332: Add a flag for overriding default JNI library search path
dholmes
parents:
52665
diff
changeset
|
695 |
|
45763 | 696 |
#### Configure Arguments for Native Compilation |
33030 | 697 |
|
45763 | 698 |
* `--with-devkit=<path>` - Use this devkit for compilers, tools and resources |
699 |
* `--with-sysroot=<path>` - Use this directory as sysroot |
|
700 |
* `--with-extra-path=<path>[;<path>]` - Prepend these directories to the |
|
701 |
default path when searching for all kinds of binaries |
|
702 |
* `--with-toolchain-path=<path>[;<path>]` - Prepend these directories when |
|
703 |
searching for toolchain binaries (compilers etc) |
|
704 |
* `--with-extra-cflags=<flags>` - Append these flags when compiling JDK C |
|
705 |
files |
|
706 |
* `--with-extra-cxxflags=<flags>` - Append these flags when compiling JDK C++ |
|
707 |
files |
|
708 |
* `--with-extra-ldflags=<flags>` - Append these flags when linking JDK |
|
709 |
libraries |
|
33030 | 710 |
|
45763 | 711 |
#### Configure Arguments for External Dependencies |
44078
673240c54c2e
8176509: Use pandoc for converting build readme to html
ihse
parents:
41040
diff
changeset
|
712 |
|
45763 | 713 |
* `--with-boot-jdk=<path>` - Set the path to the [Boot JDK]( |
714 |
#boot-jdk-requirements) |
|
715 |
* `--with-freetype=<path>` - Set the path to [FreeType](#freetype) |
|
716 |
* `--with-cups=<path>` - Set the path to [CUPS](#cups) |
|
717 |
* `--with-x=<path>` - Set the path to [X11](#x11) |
|
718 |
* `--with-alsa=<path>` - Set the path to [ALSA](#alsa) |
|
719 |
* `--with-libffi=<path>` - Set the path to [libffi](#libffi) |
|
720 |
* `--with-jtreg=<path>` - Set the path to JTReg. See [Running Tests]( |
|
721 |
#running-tests) |
|
33030 | 722 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
723 |
Certain third-party libraries used by the JDK (libjpeg, giflib, libpng, lcms |
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
724 |
and zlib) are included in the JDK repository. The default behavior of the |
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
725 |
JDK build is to use this version of these libraries, but they might be |
45763 | 726 |
replaced by an external version. To do so, specify `system` as the `<source>` |
727 |
option in these arguments. (The default is `bundled`). |
|
33030 | 728 |
|
45763 | 729 |
* `--with-libjpeg=<source>` - Use the specified source for libjpeg |
730 |
* `--with-giflib=<source>` - Use the specified source for giflib |
|
731 |
* `--with-libpng=<source>` - Use the specified source for libpng |
|
732 |
* `--with-lcms=<source>` - Use the specified source for lcms |
|
733 |
* `--with-zlib=<source>` - Use the specified source for zlib |
|
33030 | 734 |
|
45763 | 735 |
On Linux, it is possible to select either static or dynamic linking of the C++ |
736 |
runtime. The default is static linking, with dynamic linking as fallback if the |
|
737 |
static library is not found. |
|
738 |
||
739 |
* `--with-stdc++lib=<method>` - Use the specified method (`static`, `dynamic` |
|
740 |
or `default`) for linking the C++ runtime. |
|
741 |
||
742 |
### Configure Control Variables |
|
33030 | 743 |
|
45763 | 744 |
It is possible to control certain aspects of `configure` by overriding the |
745 |
value of `configure` variables, either on the command line or in the |
|
746 |
environment. |
|
33030 | 747 |
|
45763 | 748 |
Normally, this is **not recommended**. If used improperly, it can lead to a |
749 |
broken configuration. Unless you're well versed in the build system, this is |
|
750 |
hard to use properly. Therefore, `configure` will print a warning if this is |
|
751 |
detected. |
|
33030 | 752 |
|
45763 | 753 |
However, there are a few `configure` variables, known as *control variables* |
754 |
that are supposed to be overriden on the command line. These are variables that |
|
755 |
describe the location of tools needed by the build, like `MAKE` or `GREP`. If |
|
756 |
any such variable is specified, `configure` will use that value instead of |
|
757 |
trying to autodetect the tool. For instance, `bash configure |
|
758 |
MAKE=/opt/gnumake4.0/bin/make`. |
|
33030 | 759 |
|
45763 | 760 |
If a configure argument exists, use that instead, e.g. use `--with-jtreg` |
761 |
instead of setting `JTREGEXE`. |
|
762 |
||
763 |
Also note that, despite what autoconf claims, setting `CFLAGS` will not |
|
764 |
accomplish anything. Instead use `--with-extra-cflags` (and similar for |
|
765 |
`cxxflags` and `ldflags`). |
|
766 |
||
767 |
## Running Make |
|
33030 | 768 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
769 |
When you have a proper configuration, all you need to do to build the JDK is to |
45763 | 770 |
run `make`. (But see the warning at [GNU Make](#gnu-make) about running the |
771 |
correct version of make.) |
|
33030 | 772 |
|
45763 | 773 |
When running `make` without any arguments, the default target is used, which is |
774 |
the same as running `make default` or `make jdk`. This will build a minimal (or |
|
775 |
roughly minimal) set of compiled output (known as an "exploded image") needed |
|
776 |
for a developer to actually execute the newly built JDK. The idea is that in an |
|
777 |
incremental development fashion, when doing a normal make, you should only |
|
778 |
spend time recompiling what's changed (making it purely incremental) and only |
|
779 |
do the work that's needed to actually run and test your code. |
|
780 |
||
781 |
The output of the exploded image resides in `$BUILD/jdk`. You can test the |
|
782 |
newly built JDK like this: `$BUILD/jdk/bin/java -version`. |
|
33030 | 783 |
|
45763 | 784 |
### Common Make Targets |
33030 | 785 |
|
45763 | 786 |
Apart from the default target, here are some common make targets: |
33030 | 787 |
|
45763 | 788 |
* `hotspot` - Build all of hotspot (but only hotspot) |
789 |
* `hotspot-<variant>` - Build just the specified jvm variant |
|
50490 | 790 |
* `images` or `product-images` - Build the JDK image |
45763 | 791 |
* `docs` or `docs-image` - Build the documentation image |
792 |
* `test-image` - Build the test image |
|
793 |
* `all` or `all-images` - Build all images (product, docs and test) |
|
794 |
* `bootcycle-images` - Build images twice, second time with newly built JDK |
|
795 |
(good for testing) |
|
796 |
* `clean` - Remove all files generated by make, but not those generated by |
|
797 |
configure |
|
798 |
* `dist-clean` - Remove all files, including configuration |
|
33030 | 799 |
|
45763 | 800 |
Run `make help` to get an up-to-date list of important make targets and make |
801 |
control variables. |
|
33030 | 802 |
|
45763 | 803 |
It is possible to build just a single module, a single phase, or a single phase |
804 |
of a single module, by creating make targets according to these followin |
|
805 |
patterns. A phase can be either of `gensrc`, `gendata`, `copy`, `java`, |
|
806 |
`launchers`, `libs` or `rmic`. See [Using Fine-Grained Make Targets]( |
|
807 |
#using-fine-grained-make-targets) for more details about this functionality. |
|
808 |
||
809 |
* `<phase>` - Build the specified phase and everything it depends on |
|
810 |
* `<module>` - Build the specified module and everything it depends on |
|
811 |
* `<module>-<phase>` - Compile the specified phase for the specified module |
|
812 |
and everything it depends on |
|
33030 | 813 |
|
45763 | 814 |
Similarly, it is possible to clean just a part of the build by creating make |
815 |
targets according to these patterns: |
|
33030 | 816 |
|
45763 | 817 |
* `clean-<outputdir>` - Remove the subdir in the output dir with the name |
818 |
* `clean-<phase>` - Remove all build results related to a certain build |
|
819 |
phase |
|
820 |
* `clean-<module>` - Remove all build results related to a certain module |
|
821 |
* `clean-<module>-<phase>` - Remove all build results related to a certain |
|
822 |
module and phase |
|
44078
673240c54c2e
8176509: Use pandoc for converting build readme to html
ihse
parents:
41040
diff
changeset
|
823 |
|
45763 | 824 |
### Make Control Variables |
825 |
||
826 |
It is possible to control `make` behavior by overriding the value of `make` |
|
827 |
variables, either on the command line or in the environment. |
|
33030 | 828 |
|
45763 | 829 |
Normally, this is **not recommended**. If used improperly, it can lead to a |
830 |
broken build. Unless you're well versed in the build system, this is hard to |
|
831 |
use properly. Therefore, `make` will print a warning if this is detected. |
|
33030 | 832 |
|
45763 | 833 |
However, there are a few `make` variables, known as *control variables* that |
834 |
are supposed to be overriden on the command line. These make up the "make time" |
|
835 |
configuration, as opposed to the "configure time" configuration. |
|
33030 | 836 |
|
45763 | 837 |
#### General Make Control Variables |
33030 | 838 |
|
45763 | 839 |
* `JOBS` - Specify the number of jobs to build with. See [Build |
840 |
Performance](#build-performance). |
|
841 |
* `LOG` - Specify the logging level and functionality. See [Checking the |
|
842 |
Build Log File](#checking-the-build-log-file) |
|
843 |
* `CONF` and `CONF_NAME` - Selecting the configuration(s) to use. See [Using |
|
844 |
Multiple Configurations](#using-multiple-configurations) |
|
33030 | 845 |
|
45763 | 846 |
#### Test Make Control Variables |
33030 | 847 |
|
45763 | 848 |
These make control variables only make sense when running tests. Please see |
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
849 |
[Testing the JDK](testing.html) for details. |
33030 | 850 |
|
45763 | 851 |
* `TEST` |
852 |
* `TEST_JOBS` |
|
853 |
* `JTREG` |
|
854 |
* `GTEST` |
|
33030 | 855 |
|
45763 | 856 |
#### Advanced Make Control Variables |
33030 | 857 |
|
45763 | 858 |
These advanced make control variables can be potentially unsafe. See [Hints and |
859 |
Suggestions for Advanced Users](#hints-and-suggestions-for-advanced-users) and |
|
860 |
[Understanding the Build System](#understanding-the-build-system) for details. |
|
33030 | 861 |
|
45763 | 862 |
* `SPEC` |
863 |
* `CONF_CHECK` |
|
864 |
* `COMPARE_BUILD` |
|
865 |
* `JDK_FILTER` |
|
33030 | 866 |
|
45763 | 867 |
## Running Tests |
33030 | 868 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
869 |
Most of the JDK tests are using the [JTReg](http://openjdk.java.net/jtreg) |
45763 | 870 |
test framework. Make sure that your configuration knows where to find your |
871 |
installation of JTReg. If this is not picked up automatically, use the |
|
872 |
`--with-jtreg=<path to jtreg home>` option to point to the JTReg framework. |
|
873 |
Note that this option should point to the JTReg home, i.e. the top directory, |
|
874 |
containing `lib/jtreg.jar` etc. |
|
33030 | 875 |
|
50267
1582de22e3a1
8198323: testing.md not updated for repository layout change
ihse
parents:
49234
diff
changeset
|
876 |
The [Adoption Group](https://wiki.openjdk.java.net/display/Adoption) provides |
1582de22e3a1
8198323: testing.md not updated for repository layout change
ihse
parents:
49234
diff
changeset
|
877 |
recent builds of jtreg [here]( |
1582de22e3a1
8198323: testing.md not updated for repository layout change
ihse
parents:
49234
diff
changeset
|
878 |
https://adopt-openjdk.ci.cloudbees.com/job/jtreg/lastSuccessfulBuild/artifact). |
1582de22e3a1
8198323: testing.md not updated for repository layout change
ihse
parents:
49234
diff
changeset
|
879 |
Download the latest `.tar.gz` file, unpack it, and point `--with-jtreg` to the |
1582de22e3a1
8198323: testing.md not updated for repository layout change
ihse
parents:
49234
diff
changeset
|
880 |
`jtreg` directory that you just unpacked. |
1582de22e3a1
8198323: testing.md not updated for repository layout change
ihse
parents:
49234
diff
changeset
|
881 |
|
45763 | 882 |
To execute the most basic tests (tier 1), use: |
883 |
``` |
|
884 |
make run-test-tier1 |
|
885 |
``` |
|
33030 | 886 |
|
45763 | 887 |
For more details on how to run tests, please see the [Testing |
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
888 |
the JDK](testing.html) document. |
33030 | 889 |
|
45763 | 890 |
## Cross-compiling |
891 |
||
892 |
Cross-compiling means using one platform (the *build* platform) to generate |
|
893 |
output that can ran on another platform (the *target* platform). |
|
33030 | 894 |
|
45763 | 895 |
The typical reason for cross-compiling is that the build is performed on a more |
896 |
powerful desktop computer, but the resulting binaries will be able to run on a |
|
897 |
different, typically low-performing system. Most of the complications that |
|
898 |
arise when building for embedded is due to this separation of *build* and |
|
899 |
*target* systems. |
|
33030 | 900 |
|
45763 | 901 |
This requires a more complex setup and build procedure. This section assumes |
902 |
you are familiar with cross-compiling in general, and will only deal with the |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
903 |
particularities of cross-compiling the JDK. If you are new to cross-compiling, |
45763 | 904 |
please see the [external links at Wikipedia]( |
905 |
https://en.wikipedia.org/wiki/Cross_compiler#External_links) for a good start |
|
906 |
on reading materials. |
|
33030 | 907 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
908 |
Cross-compiling the JDK requires you to be able to build both for the build |
45763 | 909 |
platform and for the target platform. The reason for the former is that we need |
910 |
to build and execute tools during the build process, both native tools and Java |
|
911 |
tools. |
|
33030 | 912 |
|
45763 | 913 |
If all you want to do is to compile a 32-bit version, for the same OS, on a |
914 |
64-bit machine, consider using `--with-target-bits=32` instead of doing a |
|
915 |
full-blown cross-compilation. (While this surely is possible, it's a lot more |
|
916 |
work and will take much longer to build.) |
|
33030 | 917 |
|
52665
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
918 |
### Cross compiling the easy way with OpenJDK devkits |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
919 |
|
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
920 |
The OpenJDK build system provides out-of-the box support for creating and using |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
921 |
so called devkits. A `devkit` is basically a collection of a cross-compiling |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
922 |
toolchain and a sysroot environment which can easily be used together with the |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
923 |
`--with-devkit` configure option to cross compile the OpenJDK. On Linux/x86_64, |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
924 |
the following command: |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
925 |
``` |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
926 |
bash configure --with-devkit=<devkit-path> --openjdk-target=ppc64-linux-gnu && make |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
927 |
``` |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
928 |
|
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
929 |
will configure and build OpenJDK for Linux/ppc64 assuming that `<devkit-path>` |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
930 |
points to a Linux/x86_64 to Linux/ppc64 devkit. |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
931 |
|
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
932 |
Devkits can be created from the `make/devkit` directory by executing: |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
933 |
``` |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
934 |
make [ TARGETS="<TARGET_TRIPLET>+" ] [ BASE_OS=<OS> ] [ BASE_OS_VERSION=<VER> ] |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
935 |
``` |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
936 |
|
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
937 |
where `TARGETS` contains one or more `TARGET_TRIPLET`s of the form |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
938 |
described in [section 3.4 of the GNU Autobook]( |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
939 |
https://sourceware.org/autobook/autobook/autobook_17.html). If no |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
940 |
targets are given, a native toolchain for the current platform will be |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
941 |
created. Currently, at least the following targets are known to work: |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
942 |
|
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
943 |
Supported devkit targets |
52941 | 944 |
------------------------- |
52665
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
945 |
x86_64-linux-gnu |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
946 |
aarch64-linux-gnu |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
947 |
arm-linux-gnueabihf |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
948 |
ppc64-linux-gnu |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
949 |
ppc64le-linux-gnu |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
950 |
s390x-linux-gnu |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
951 |
|
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
952 |
`BASE_OS` must be one of "OEL6" for Oracle Enterprise Linux 6 or |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
953 |
"Fedora" (if not specified "OEL6" will be the default). If the base OS |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
954 |
is "Fedora" the corresponding Fedora release can be specified with the |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
955 |
help of the `BASE_OS_VERSION` option (with "27" as default version). |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
956 |
If the build is successful, the new devkits can be found in the |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
957 |
`build/devkit/result` subdirectory: |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
958 |
``` |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
959 |
cd make/devkit |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
960 |
make TARGETS="ppc64le-linux-gnu aarch64-linux-gnu" BASE_OS=Fedora BASE_OS_VERSION=21 |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
961 |
ls -1 ../../build/devkit/result/ |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
962 |
x86_64-linux-gnu-to-aarch64-linux-gnu |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
963 |
x86_64-linux-gnu-to-ppc64le-linux-gnu |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
964 |
``` |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
965 |
|
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
966 |
Notice that devkits are not only useful for targeting different build |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
967 |
platforms. Because they contain the full build dependencies for a |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
968 |
system (i.e. compiler and root file system), they can easily be used |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
969 |
to build well-known, reliable and reproducible build environments. You |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
970 |
can for example create and use a devkit with GCC 7.3 and a Fedora 12 |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
971 |
sysroot environment (with glibc 2.11) on Ubuntu 14.04 (which doesn't |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
972 |
have GCC 7.3 by default) to produce OpenJDK binaries which will run on |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
973 |
all Linux systems with runtime libraries newer than the ones from |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
974 |
Fedora 12 (e.g. Ubuntu 16.04, SLES 11 or RHEL 6). |
61dcd7cd48c3
8213698: Improve devkit creation and add support for linux/ppc64/ppc64le/s390x
simonis
parents:
52610
diff
changeset
|
975 |
|
45763 | 976 |
### Boot JDK and Build JDK |
33030 | 977 |
|
45763 | 978 |
When cross-compiling, make sure you use a boot JDK that runs on the *build* |
979 |
system, and not on the *target* system. |
|
33030 | 980 |
|
45763 | 981 |
To be able to build, we need a "Build JDK", which is a JDK built from the |
982 |
current sources (that is, the same as the end result of the entire build |
|
983 |
process), but able to run on the *build* system, and not the *target* system. |
|
984 |
(In contrast, the Boot JDK should be from an older release, e.g. JDK 8 when |
|
985 |
building JDK 9.) |
|
33030 | 986 |
|
45763 | 987 |
The build process will create a minimal Build JDK for you, as part of building. |
988 |
To speed up the build, you can use `--with-build-jdk` to `configure` to point |
|
989 |
to a pre-built Build JDK. Please note that the build result is unpredictable, |
|
990 |
and can possibly break in subtle ways, if the Build JDK does not **exactly** |
|
991 |
match the current sources. |
|
992 |
||
993 |
### Specifying the Target Platform |
|
33030 | 994 |
|
45763 | 995 |
You *must* specify the target platform when cross-compiling. Doing so will also |
996 |
automatically turn the build into a cross-compiling mode. The simplest way to |
|
997 |
do this is to use the `--openjdk-target` argument, e.g. |
|
998 |
`--openjdk-target=arm-linux-gnueabihf`. or `--openjdk-target=aarch64-oe-linux`. |
|
999 |
This will automatically set the `--build`, `--host` and `--target` options for |
|
1000 |
autoconf, which can otherwise be confusing. (In autoconf terminology, the |
|
1001 |
"target" is known as "host", and "target" is used for building a Canadian |
|
1002 |
cross-compiler.) |
|
1003 |
||
1004 |
### Toolchain Considerations |
|
33030 | 1005 |
|
45763 | 1006 |
You will need two copies of your toolchain, one which generates output that can |
1007 |
run on the target system (the normal, or *target*, toolchain), and one that |
|
1008 |
generates output that can run on the build system (the *build* toolchain). Note |
|
1009 |
that cross-compiling is only supported for gcc at the time being. The gcc |
|
1010 |
standard is to prefix cross-compiling toolchains with the target denominator. |
|
1011 |
If you follow this standard, `configure` is likely to pick up the toolchain |
|
1012 |
correctly. |
|
33030 | 1013 |
|
45763 | 1014 |
The *build* toolchain will be autodetected just the same way the normal |
1015 |
*build*/*target* toolchain will be autodetected when not cross-compiling. If |
|
1016 |
this is not what you want, or if the autodetection fails, you can specify a |
|
1017 |
devkit containing the *build* toolchain using `--with-build-devkit` to |
|
1018 |
`configure`, or by giving `BUILD_CC` and `BUILD_CXX` arguments. |
|
1019 |
||
1020 |
It is often helpful to locate the cross-compilation tools, headers and |
|
1021 |
libraries in a separate directory, outside the normal path, and point out that |
|
1022 |
directory to `configure`. Do this by setting the sysroot (`--with-sysroot`) and |
|
1023 |
appending the directory when searching for cross-compilations tools |
|
1024 |
(`--with-toolchain-path`). As a compact form, you can also use `--with-devkit` |
|
1025 |
to point to a single directory, if it is correctly setup. (See `basics.m4` for |
|
1026 |
details.) |
|
1027 |
||
1028 |
If you are unsure what toolchain and versions to use, these have been proved |
|
1029 |
working at the time of writing: |
|
33030 | 1030 |
|
45763 | 1031 |
* [aarch64]( |
1032 |
https://releases.linaro.org/archive/13.11/components/toolchain/binaries/gcc-linaro-aarch64-linux-gnu-4.8-2013.11_linux.tar.xz) |
|
1033 |
* [arm 32-bit hardware floating point]( |
|
1034 |
https://launchpad.net/linaro-toolchain-unsupported/trunk/2012.09/+download/gcc-linaro-arm-linux-gnueabihf-raspbian-2012.09-20120921_linux.tar.bz2) |
|
1035 |
||
1036 |
### Native Libraries |
|
1037 |
||
1038 |
You will need copies of external native libraries for the *target* system, |
|
1039 |
present on the *build* machine while building. |
|
33030 | 1040 |
|
45763 | 1041 |
Take care not to replace the *build* system's version of these libraries by |
1042 |
mistake, since that can render the *build* machine unusable. |
|
33030 | 1043 |
|
45763 | 1044 |
Make sure that the libraries you point to (ALSA, X11, etc) are for the |
1045 |
*target*, not the *build*, platform. |
|
1046 |
||
1047 |
#### ALSA |
|
1048 |
||
1049 |
You will need alsa libraries suitable for your *target* system. For most cases, |
|
1050 |
using Debian's pre-built libraries work fine. |
|
33030 | 1051 |
|
45763 | 1052 |
Note that alsa is needed even if you only want to build a headless JDK. |
1053 |
||
1054 |
* Go to [Debian Package Search](https://www.debian.org/distrib/packages) and |
|
1055 |
search for the `libasound2` and `libasound2-dev` packages for your *target* |
|
1056 |
system. Download them to /tmp. |
|
33030 | 1057 |
|
45763 | 1058 |
* Install the libraries into the cross-compilation toolchain. For instance: |
1059 |
``` |
|
1060 |
cd /tools/gcc-linaro-arm-linux-gnueabihf-raspbian-2012.09-20120921_linux/arm-linux-gnueabihf/libc |
|
1061 |
dpkg-deb -x /tmp/libasound2_1.0.25-4_armhf.deb . |
|
1062 |
dpkg-deb -x /tmp/libasound2-dev_1.0.25-4_armhf.deb . |
|
1063 |
``` |
|
33030 | 1064 |
|
45763 | 1065 |
* If alsa is not properly detected by `configure`, you can point it out by |
1066 |
`--with-alsa`. |
|
1067 |
||
1068 |
#### X11 |
|
1069 |
||
1070 |
You will need X11 libraries suitable for your *target* system. For most cases, |
|
1071 |
using Debian's pre-built libraries work fine. |
|
1072 |
||
1073 |
Note that X11 is needed even if you only want to build a headless JDK. |
|
33030 | 1074 |
|
45763 | 1075 |
* Go to [Debian Package Search](https://www.debian.org/distrib/packages), |
1076 |
search for the following packages for your *target* system, and download them |
|
1077 |
to /tmp/target-x11: |
|
1078 |
* libxi |
|
1079 |
* libxi-dev |
|
1080 |
* x11proto-core-dev |
|
1081 |
* x11proto-input-dev |
|
1082 |
* x11proto-kb-dev |
|
1083 |
* x11proto-render-dev |
|
1084 |
* x11proto-xext-dev |
|
1085 |
* libice-dev |
|
1086 |
* libxrender |
|
1087 |
* libxrender-dev |
|
52921 | 1088 |
* libxrandr-dev |
45763 | 1089 |
* libsm-dev |
1090 |
* libxt-dev |
|
1091 |
* libx11 |
|
1092 |
* libx11-dev |
|
1093 |
* libxtst |
|
1094 |
* libxtst-dev |
|
1095 |
* libxext |
|
1096 |
* libxext-dev |
|
33030 | 1097 |
|
45763 | 1098 |
* Install the libraries into the cross-compilation toolchain. For instance: |
1099 |
``` |
|
1100 |
cd /tools/gcc-linaro-arm-linux-gnueabihf-raspbian-2012.09-20120921_linux/arm-linux-gnueabihf/libc/usr |
|
1101 |
mkdir X11R6 |
|
1102 |
cd X11R6 |
|
1103 |
for deb in /tmp/target-x11/*.deb ; do dpkg-deb -x $deb . ; done |
|
1104 |
mv usr/* . |
|
1105 |
cd lib |
|
1106 |
cp arm-linux-gnueabihf/* . |
|
1107 |
``` |
|
33030 | 1108 |
|
45763 | 1109 |
You can ignore the following messages. These libraries are not needed to |
1110 |
successfully complete a full JDK build. |
|
1111 |
``` |
|
1112 |
cp: cannot stat `arm-linux-gnueabihf/libICE.so': No such file or directory |
|
1113 |
cp: cannot stat `arm-linux-gnueabihf/libSM.so': No such file or directory |
|
1114 |
cp: cannot stat `arm-linux-gnueabihf/libXt.so': No such file or directory |
|
1115 |
``` |
|
1116 |
||
1117 |
* If the X11 libraries are not properly detected by `configure`, you can |
|
1118 |
point them out by `--with-x`. |
|
1119 |
||
51515
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1120 |
### Creating And Using Sysroots With qemu-deboostrap |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1121 |
|
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1122 |
Fortunately, you can create sysroots for foreign architectures with tools |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1123 |
provided by your OS. On Debian/Ubuntu systems, one could use `qemu-deboostrap` to |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1124 |
create the *target* system chroot, which would have the native libraries and headers |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1125 |
specific to that *target* system. After that, we can use the cross-compiler on the *build* |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1126 |
system, pointing into chroot to get the build dependencies right. This allows building |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1127 |
for foreign architectures with native compilation speed. |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1128 |
|
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1129 |
For example, cross-compiling to AArch64 from x86_64 could be done like this: |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1130 |
|
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1131 |
* Install cross-compiler on the *build* system: |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1132 |
``` |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1133 |
apt install g++-aarch64-linux-gnu gcc-aarch64-linux-gnu |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1134 |
``` |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1135 |
|
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1136 |
* Create chroot on the *build* system, configuring it for *target* system: |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1137 |
``` |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1138 |
sudo qemu-debootstrap --arch=arm64 --verbose \ |
52921 | 1139 |
--include=fakeroot,build-essential,libx11-dev,libxext-dev,libxrender-dev,libxrandr-dev,libxtst-dev,libxt-dev,libcups2-dev,libfontconfig1-dev,libasound2-dev,libfreetype6-dev,libpng12-dev \ |
51515
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1140 |
--resolve-deps jessie /chroots/arm64 http://httpredir.debian.org/debian/ |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1141 |
``` |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1142 |
|
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1143 |
* Configure and build with newly created chroot as sysroot/toolchain-path: |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1144 |
``` |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1145 |
CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ sh ./configure --openjdk-target=aarch64-linux-gnu --with-sysroot=/chroots/arm64/ --with-toolchain-path=/chroots/arm64/ |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1146 |
make images |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1147 |
ls build/linux-aarch64-normal-server-release/ |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1148 |
``` |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1149 |
|
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1150 |
The build does not create new files in that chroot, so it can be reused for multiple builds |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1151 |
without additional cleanup. |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1152 |
|
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1153 |
Architectures that are known to successfully cross-compile like this are: |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1154 |
|
52941 | 1155 |
Target `CC` `CXX` `--arch=...` `--openjdk-target=...` |
1156 |
------------ ------------------------- --------------------------- ------------- ----------------------- |
|
1157 |
x86 default default i386 i386-linux-gnu |
|
1158 |
armhf gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf armhf arm-linux-gnueabihf |
|
1159 |
aarch64 gcc-aarch64-linux-gnu g++-aarch64-linux-gnu arm64 aarch64-linux-gnu |
|
1160 |
ppc64el gcc-powerpc64le-linux-gnu g++-powerpc64le-linux-gnu ppc64el powerpc64le-linux-gnu |
|
1161 |
s390x gcc-s390x-linux-gnu g++-s390x-linux-gnu s390x s390x-linux-gnu |
|
51515
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1162 |
|
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1163 |
Additional architectures might be supported by Debian/Ubuntu Ports. |
fa378e035b81
8208665: Amend cross-compilation docs with qemu-debootstrap recipe
shade
parents:
51237
diff
changeset
|
1164 |
|
45763 | 1165 |
### Building for ARM/aarch64 |
1166 |
||
1167 |
A common cross-compilation target is the ARM CPU. When building for ARM, it is |
|
1168 |
useful to set the ABI profile. A number of pre-defined ABI profiles are |
|
1169 |
available using `--with-abi-profile`: arm-vfp-sflt, arm-vfp-hflt, arm-sflt, |
|
1170 |
armv5-vfp-sflt, armv6-vfp-hflt. Note that soft-float ABIs are no longer |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1171 |
properly supported by the JDK. |
33030 | 1172 |
|
45763 | 1173 |
### Verifying the Build |
33030 | 1174 |
|
45763 | 1175 |
The build will end up in a directory named like |
1176 |
`build/linux-arm-normal-server-release`. |
|
33030 | 1177 |
|
50490 | 1178 |
Inside this build output directory, the `images/jdk` will contain the newly |
1179 |
built JDK, for your *target* system. |
|
45763 | 1180 |
|
1181 |
Copy these folders to your *target* system. Then you can run e.g. |
|
1182 |
`images/jdk/bin/java -version`. |
|
1183 |
||
1184 |
## Build Performance |
|
33030 | 1185 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1186 |
Building the JDK requires a lot of horsepower. Some of the build tools can be |
33030 | 1187 |
adjusted to utilize more or less of resources such as parallel threads and |
1188 |
memory. The `configure` script analyzes your system and selects reasonable |
|
1189 |
values for such options based on your hardware. If you encounter resource |
|
1190 |
problems, such as out of memory conditions, you can modify the detected values |
|
1191 |
with: |
|
1192 |
||
45763 | 1193 |
* `--with-num-cores` -- number of cores in the build system, e.g. |
1194 |
`--with-num-cores=8`. |
|
1195 |
||
1196 |
* `--with-memory-size` -- memory (in MB) available in the build system, e.g. |
|
1197 |
`--with-memory-size=1024` |
|
33030 | 1198 |
|
45763 | 1199 |
You can also specify directly the number of build jobs to use with |
1200 |
`--with-jobs=N` to `configure`, or `JOBS=N` to `make`. Do not use the `-j` flag |
|
1201 |
to `make`. In most cases it will be ignored by the makefiles, but it can cause |
|
1202 |
problems for some make targets. |
|
33030 | 1203 |
|
45763 | 1204 |
It might also be necessary to specify the JVM arguments passed to the Boot JDK, |
1205 |
using e.g. `--with-boot-jdk-jvmargs="-Xmx8G"`. Doing so will override the |
|
1206 |
default JVM arguments passed to the Boot JDK. |
|
33030 | 1207 |
|
1208 |
At the end of a successful execution of `configure`, you will get a performance |
|
1209 |
summary, indicating how well the build will perform. Here you will also get |
|
1210 |
performance hints. If you want to build fast, pay attention to those! |
|
1211 |
||
45763 | 1212 |
If you want to tweak build performance, run with `make LOG=info` to get a build |
1213 |
time summary at the end of the build process. |
|
1214 |
||
1215 |
### Disk Speed |
|
1216 |
||
1217 |
If you are using network shares, e.g. via NFS, for your source code, make sure |
|
1218 |
the build directory is situated on local disk (e.g. by `ln -s |
|
1219 |
/localdisk/jdk-build $JDK-SHARE/build`). The performance penalty is extremely |
|
1220 |
high for building on a network share; close to unusable. |
|
1221 |
||
1222 |
Also, make sure that your build tools (including Boot JDK and toolchain) is |
|
1223 |
located on a local disk and not a network share. |
|
1224 |
||
1225 |
As has been stressed elsewhere, do use SSD for source code and build directory, |
|
1226 |
as well as (if possible) the build tools. |
|
1227 |
||
1228 |
### Virus Checking |
|
1229 |
||
1230 |
The use of virus checking software, especially on Windows, can *significantly* |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1231 |
slow down building of the JDK. If possible, turn off such software, or exclude |
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1232 |
the directory containing the JDK source code from on-the-fly checking. |
45763 | 1233 |
|
1234 |
### Ccache |
|
33030 | 1235 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1236 |
The JDK build supports building with ccache when using gcc or clang. Using |
33030 | 1237 |
ccache can radically speed up compilation of native code if you often rebuild |
45763 | 1238 |
the same sources. Your milage may vary however, so we recommend evaluating it |
33030 | 1239 |
for yourself. To enable it, make sure it's on the path and configure with |
1240 |
`--enable-ccache`. |
|
1241 |
||
45763 | 1242 |
### Precompiled Headers |
1243 |
||
1244 |
By default, the Hotspot build uses preccompiled headers (PCH) on the toolchains |
|
1245 |
were it is properly supported (clang, gcc, and Visual Studio). Normally, this |
|
1246 |
speeds up the build process, but in some circumstances, it can actually slow |
|
1247 |
things down. |
|
33030 | 1248 |
|
45763 | 1249 |
You can experiment by disabling precompiled headers using |
1250 |
`--disable-precompiled-headers`. |
|
1251 |
||
1252 |
### Icecc / icecream |
|
33030 | 1253 |
|
45763 | 1254 |
[icecc/icecream](http://github.com/icecc/icecream) is a simple way to setup a |
1255 |
distributed compiler network. If you have multiple machines available for |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1256 |
building the JDK, you can drastically cut individual build times by utilizing |
45763 | 1257 |
it. |
33030 | 1258 |
|
45763 | 1259 |
To use, setup an icecc network, and install icecc on the build machine. Then |
1260 |
run `configure` using `--enable-icecc`. |
|
1261 |
||
1262 |
### Using sjavac |
|
1263 |
||
1264 |
To speed up Java compilation, especially incremental compilations, you can try |
|
1265 |
the experimental sjavac compiler by using `--enable-sjavac`. |
|
33030 | 1266 |
|
45763 | 1267 |
### Building the Right Target |
1268 |
||
1269 |
Selecting the proper target to build can have dramatic impact on build time. |
|
1270 |
For normal usage, `jdk` or the default target is just fine. You only need to |
|
1271 |
build `images` for shipping, or if your tests require it. |
|
1272 |
||
1273 |
See also [Using Fine-Grained Make Targets](#using-fine-grained-make-targets) on |
|
1274 |
how to build an even smaller subset of the product. |
|
1275 |
||
1276 |
## Troubleshooting |
|
33030 | 1277 |
|
45763 | 1278 |
If your build fails, it can sometimes be difficult to pinpoint the problem or |
1279 |
find a proper solution. |
|
1280 |
||
1281 |
### Locating the Source of the Error |
|
33030 | 1282 |
|
45763 | 1283 |
When a build fails, it can be hard to pinpoint the actual cause of the error. |
1284 |
In a typical build process, different parts of the product build in parallel, |
|
1285 |
with the output interlaced. |
|
1286 |
||
1287 |
#### Build Failure Summary |
|
1288 |
||
1289 |
To help you, the build system will print a failure summary at the end. It looks |
|
1290 |
like this: |
|
1291 |
||
1292 |
``` |
|
1293 |
ERROR: Build failed for target 'hotspot' in configuration 'linux-x64' (exit code 2) |
|
33030 | 1294 |
|
45763 | 1295 |
=== Output from failing command(s) repeated here === |
1296 |
* For target hotspot_variant-server_libjvm_objs_psMemoryPool.o: |
|
1297 |
/localhome/hg/jdk9-sandbox/hotspot/src/share/vm/services/psMemoryPool.cpp:1:1: error: 'failhere' does not name a type |
|
1298 |
... (rest of output omitted) |
|
33030 | 1299 |
|
45763 | 1300 |
* All command lines available in /localhome/hg/jdk9-sandbox/build/linux-x64/make-support/failure-logs. |
1301 |
=== End of repeated output === |
|
33030 | 1302 |
|
45763 | 1303 |
=== Make failed targets repeated here === |
1304 |
lib/CompileJvm.gmk:207: recipe for target '/localhome/hg/jdk9-sandbox/build/linux-x64/hotspot/variant-server/libjvm/objs/psMemoryPool.o' failed |
|
1305 |
make/Main.gmk:263: recipe for target 'hotspot-server-libs' failed |
|
1306 |
=== End of repeated output === |
|
33030 | 1307 |
|
45763 | 1308 |
Hint: Try searching the build log for the name of the first failed target. |
1309 |
Hint: If caused by a warning, try configure --disable-warnings-as-errors. |
|
1310 |
``` |
|
33030 | 1311 |
|
45763 | 1312 |
Let's break it down! First, the selected configuration, and the top-level |
1313 |
target you entered on the command line that caused the failure is printed. |
|
33030 | 1314 |
|
45763 | 1315 |
Then, between the `Output from failing command(s) repeated here` and `End of |
1316 |
repeated output` the first lines of output (stdout and stderr) from the actual |
|
1317 |
failing command is repeated. In most cases, this is the error message that |
|
1318 |
caused the build to fail. If multiple commands were failing (this can happen in |
|
1319 |
a parallel build), output from all failed commands will be printed here. |
|
1320 |
||
1321 |
The path to the `failure-logs` directory is printed. In this file you will find |
|
1322 |
a `<target>.log` file that contains the output from this command in its |
|
1323 |
entirety, and also a `<target>.cmd`, which contain the complete command line |
|
1324 |
used for running this command. You can re-run the failing command by executing |
|
1325 |
`. <path to failure-logs>/<target>.cmd` in your shell. |
|
33030 | 1326 |
|
45763 | 1327 |
Another way to trace the failure is to follow the chain of make targets, from |
1328 |
top-level targets to individual file targets. Between `Make failed targets |
|
1329 |
repeated here` and `End of repeated output` the output from make showing this |
|
1330 |
chain is repeated. The first failed recipe will typically contain the full path |
|
1331 |
to the file in question that failed to compile. Following lines will show a |
|
1332 |
trace of make targets why we ended up trying to compile that file. |
|
1333 |
||
1334 |
Finally, some hints are given on how to locate the error in the complete log. |
|
1335 |
In this example, we would try searching the log file for "`psMemoryPool.o`". |
|
1336 |
Another way to quickly locate make errors in the log is to search for "`] |
|
1337 |
Error`" or "`***`". |
|
33030 | 1338 |
|
45763 | 1339 |
Note that the build failure summary will only help you if the issue was a |
1340 |
compilation failure or similar. If the problem is more esoteric, or is due to |
|
1341 |
errors in the build machinery, you will likely get empty output logs, and `No |
|
1342 |
indication of failed target found` instead of the make target chain. |
|
1343 |
||
1344 |
#### Checking the Build Log File |
|
1345 |
||
1346 |
The output (stdout and stderr) from the latest build is always stored in |
|
1347 |
`$BUILD/build.log`. The previous build log is stored as `build.log.old`. This |
|
1348 |
means that it is not necessary to redirect the build output yourself if you |
|
1349 |
want to process it. |
|
33030 | 1350 |
|
45763 | 1351 |
You can increase the verbosity of the log file, by the `LOG` control variable |
1352 |
to `make`. If you want to see the command lines used in compilations, use |
|
1353 |
`LOG=cmdlines`. To increase the general verbosity, use `LOG=info`, `LOG=debug` |
|
1354 |
or `LOG=trace`. Both of these can be combined with `cmdlines`, e.g. |
|
1355 |
`LOG=info,cmdlines`. The `debug` log level will show most shell commands |
|
1356 |
executed by make, and `trace` will show all. Beware that both these log levels |
|
1357 |
will produce a massive build log! |
|
1358 |
||
1359 |
### Fixing Unexpected Build Failures |
|
33030 | 1360 |
|
45763 | 1361 |
Most of the time, the build will fail due to incorrect changes in the source |
1362 |
code. |
|
1363 |
||
1364 |
Sometimes the build can fail with no apparent changes that have caused the |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1365 |
failure. If this is the first time you are building the JDK on this particular |
45763 | 1366 |
computer, and the build fails, the problem is likely with your build |
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1367 |
environment. But even if you have previously built the JDK with success, and it |
45763 | 1368 |
now fails, your build environment might have changed (perhaps due to OS |
1369 |
upgrades or similar). But most likely, such failures are due to problems with |
|
1370 |
the incremental rebuild. |
|
1371 |
||
1372 |
#### Problems with the Build Environment |
|
33030 | 1373 |
|
45763 | 1374 |
Make sure your configuration is correct. Re-run `configure`, and look for any |
1375 |
warnings. Warnings that appear in the middle of the `configure` output is also |
|
1376 |
repeated at the end, after the summary. The entire log is stored in |
|
1377 |
`$BUILD/configure.log`. |
|
33030 | 1378 |
|
45763 | 1379 |
Verify that the summary at the end looks correct. Are you indeed using the Boot |
1380 |
JDK and native toolchain that you expect? |
|
33030 | 1381 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1382 |
By default, the JDK has a strict approach where warnings from the compiler is |
45763 | 1383 |
considered errors which fail the build. For very new or very old compiler |
1384 |
versions, this can trigger new classes of warnings, which thus fails the build. |
|
1385 |
Run `configure` with `--disable-warnings-as-errors` to turn of this behavior. |
|
1386 |
(The warnings will still show, but not make the build fail.) |
|
33030 | 1387 |
|
45763 | 1388 |
#### Problems with Incremental Rebuilds |
33030 | 1389 |
|
45763 | 1390 |
Incremental rebuilds mean that when you modify part of the product, only the |
1391 |
affected parts get rebuilt. While this works great in most cases, and |
|
1392 |
significantly speed up the development process, from time to time complex |
|
1393 |
interdependencies will result in an incorrect build result. This is the most |
|
52610
7ac273f045e3
8214062: JDK-8167368 Leftover: get_source.sh in build documentation
erikj
parents:
52351
diff
changeset
|
1394 |
common cause for unexpected build problems. |
33030 | 1395 |
|
45763 | 1396 |
Here are a suggested list of things to try if you are having unexpected build |
1397 |
problems. Each step requires more time than the one before, so try them in |
|
1398 |
order. Most issues will be solved at step 1 or 2. |
|
1399 |
||
52610
7ac273f045e3
8214062: JDK-8167368 Leftover: get_source.sh in build documentation
erikj
parents:
52351
diff
changeset
|
1400 |
1. Make sure your repository is up-to-date |
45763 | 1401 |
|
52610
7ac273f045e3
8214062: JDK-8167368 Leftover: get_source.sh in build documentation
erikj
parents:
52351
diff
changeset
|
1402 |
Run `hg pull -u` to make sure you have the latest changes. |
45763 | 1403 |
|
1404 |
2. Clean build results |
|
1405 |
||
1406 |
The simplest way to fix incremental rebuild issues is to run `make clean`. |
|
1407 |
This will remove all build results, but not the configuration or any build |
|
1408 |
system support artifacts. In most cases, this will solve build errors |
|
1409 |
resulting from incremental build mismatches. |
|
33030 | 1410 |
|
45763 | 1411 |
3. Completely clean the build directory. |
1412 |
||
1413 |
If this does not work, the next step is to run `make dist-clean`, or |
|
1414 |
removing the build output directory (`$BUILD`). This will clean all |
|
1415 |
generated output, including your configuration. You will need to re-run |
|
1416 |
`configure` after this step. A good idea is to run `make |
|
1417 |
print-configuration` before running `make dist-clean`, as this will print |
|
1418 |
your current `configure` command line. Here's a way to do this: |
|
33030 | 1419 |
|
45763 | 1420 |
``` |
1421 |
make print-configuration > current-configuration |
|
1422 |
make dist-clean |
|
1423 |
bash configure $(cat current-configuration) |
|
1424 |
make |
|
1425 |
``` |
|
33030 | 1426 |
|
52610
7ac273f045e3
8214062: JDK-8167368 Leftover: get_source.sh in build documentation
erikj
parents:
52351
diff
changeset
|
1427 |
4. Re-clone the Mercurial repository |
33030 | 1428 |
|
52610
7ac273f045e3
8214062: JDK-8167368 Leftover: get_source.sh in build documentation
erikj
parents:
52351
diff
changeset
|
1429 |
Sometimes the Mercurial repository gets in a state that causes the product |
7ac273f045e3
8214062: JDK-8167368 Leftover: get_source.sh in build documentation
erikj
parents:
52351
diff
changeset
|
1430 |
to be un-buildable. In such a case, the simplest solution is often the |
7ac273f045e3
8214062: JDK-8167368 Leftover: get_source.sh in build documentation
erikj
parents:
52351
diff
changeset
|
1431 |
"sledgehammer approach": delete the entire repository, and re-clone it. |
7ac273f045e3
8214062: JDK-8167368 Leftover: get_source.sh in build documentation
erikj
parents:
52351
diff
changeset
|
1432 |
If you have local changes, save them first to a different location using |
7ac273f045e3
8214062: JDK-8167368 Leftover: get_source.sh in build documentation
erikj
parents:
52351
diff
changeset
|
1433 |
`hg export`. |
45763 | 1434 |
|
1435 |
### Specific Build Issues |
|
1436 |
||
1437 |
#### Clock Skew |
|
33030 | 1438 |
|
45763 | 1439 |
If you get an error message like this: |
1440 |
``` |
|
1441 |
File 'xxx' has modification time in the future. |
|
1442 |
Clock skew detected. Your build may be incomplete. |
|
1443 |
``` |
|
1444 |
then the clock on your build machine is out of sync with the timestamps on the |
|
1445 |
source files. Other errors, apparently unrelated but in fact caused by the |
|
1446 |
clock skew, can occur along with the clock skew warnings. These secondary |
|
1447 |
errors may tend to obscure the fact that the true root cause of the problem is |
|
1448 |
an out-of-sync clock. |
|
33030 | 1449 |
|
45763 | 1450 |
If you see these warnings, reset the clock on the build machine, run `make |
1451 |
clean` and restart the build. |
|
1452 |
||
1453 |
#### Out of Memory Errors |
|
1454 |
||
1455 |
On Solaris, you might get an error message like this: |
|
1456 |
``` |
|
1457 |
Trouble writing out table to disk |
|
1458 |
``` |
|
1459 |
To solve this, increase the amount of swap space on your build machine. |
|
33030 | 1460 |
|
45763 | 1461 |
On Windows, you might get error messages like this: |
1462 |
``` |
|
1463 |
fatal error - couldn't allocate heap |
|
1464 |
cannot create ... Permission denied |
|
1465 |
spawn failed |
|
1466 |
``` |
|
1467 |
This can be a sign of a Cygwin problem. See the information about solving |
|
1468 |
problems in the [Cygwin](#cygwin) section. Rebooting the computer might help |
|
1469 |
temporarily. |
|
33030 | 1470 |
|
45763 | 1471 |
### Getting Help |
33030 | 1472 |
|
45763 | 1473 |
If none of the suggestions in this document helps you, or if you find what you |
1474 |
believe is a bug in the build system, please contact the Build Group by sending |
|
1475 |
a mail to [build-dev@openjdk.java.net](mailto:build-dev@openjdk.java.net). |
|
1476 |
Please include the relevant parts of the configure and/or build log. |
|
1477 |
||
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1478 |
If you need general help or advice about developing for the JDK, you can also |
45763 | 1479 |
contact the Adoption Group. See the section on [Contributing to OpenJDK]( |
1480 |
#contributing-to-openjdk) for more information. |
|
33030 | 1481 |
|
45763 | 1482 |
## Hints and Suggestions for Advanced Users |
1483 |
||
52610
7ac273f045e3
8214062: JDK-8167368 Leftover: get_source.sh in build documentation
erikj
parents:
52351
diff
changeset
|
1484 |
### Setting Up a Repository for Pushing Changes (defpath) |
45763 | 1485 |
|
1486 |
To help you prepare a proper push path for a Mercurial repository, there exists |
|
1487 |
a useful tool known as [defpath]( |
|
1488 |
http://openjdk.java.net/projects/code-tools/defpath). It will help you setup a |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1489 |
proper push path for pushing changes to the JDK. |
33030 | 1490 |
|
45763 | 1491 |
Install the extension by cloning |
1492 |
`http://hg.openjdk.java.net/code-tools/defpath` and updating your `.hgrc` file. |
|
1493 |
Here's one way to do this: |
|
33030 | 1494 |
|
45763 | 1495 |
``` |
1496 |
cd ~ |
|
1497 |
mkdir hg-ext |
|
1498 |
cd hg-ext |
|
1499 |
hg clone http://hg.openjdk.java.net/code-tools/defpath |
|
1500 |
cat << EOT >> ~/.hgrc |
|
1501 |
[extensions] |
|
1502 |
defpath=~/hg-ext/defpath/defpath.py |
|
1503 |
EOT |
|
1504 |
``` |
|
33030 | 1505 |
|
45763 | 1506 |
You can now setup a proper push path using: |
1507 |
``` |
|
1508 |
hg defpath -d -u <your OpenJDK username> |
|
1509 |
``` |
|
33030 | 1510 |
|
45763 | 1511 |
### Bash Completion |
1512 |
||
1513 |
The `configure` and `make` commands tries to play nice with bash command-line |
|
1514 |
completion (using `<tab>` or `<tab><tab>`). To use this functionality, make |
|
1515 |
sure you enable completion in your `~/.bashrc` (see instructions for bash in |
|
1516 |
your operating system). |
|
1517 |
||
1518 |
Make completion will work out of the box, and will complete valid make targets. |
|
1519 |
For instance, typing `make jdk-i<tab>` will complete to `make jdk-image`. |
|
1520 |
||
1521 |
The `configure` script can get completion for options, but for this to work you |
|
1522 |
need to help `bash` on the way. The standard way of running the script, `bash |
|
1523 |
configure`, will not be understood by bash completion. You need `configure` to |
|
1524 |
be the command to run. One way to achieve this is to add a simple helper script |
|
1525 |
to your path: |
|
33030 | 1526 |
|
45763 | 1527 |
``` |
1528 |
cat << EOT > /tmp/configure |
|
1529 |
#!/bin/bash |
|
1530 |
if [ \$(pwd) = \$(cd \$(dirname \$0); pwd) ] ; then |
|
1531 |
echo >&2 "Abort: Trying to call configure helper recursively" |
|
1532 |
exit 1 |
|
1533 |
fi |
|
33030 | 1534 |
|
45763 | 1535 |
bash \$PWD/configure "\$@" |
1536 |
EOT |
|
1537 |
chmod +x /tmp/configure |
|
1538 |
sudo mv /tmp/configure /usr/local/bin |
|
1539 |
``` |
|
1540 |
||
1541 |
Now `configure --en<tab>-dt<tab>` will result in `configure --enable-dtrace`. |
|
33030 | 1542 |
|
45763 | 1543 |
### Using Multiple Configurations |
33030 | 1544 |
|
52610
7ac273f045e3
8214062: JDK-8167368 Leftover: get_source.sh in build documentation
erikj
parents:
52351
diff
changeset
|
1545 |
You can have multiple configurations for a single source repository. When you |
45763 | 1546 |
create a new configuration, run `configure --with-conf-name=<name>` to create a |
1547 |
configuration with the name `<name>`. Alternatively, you can create a directory |
|
1548 |
under `build` and run `configure` from there, e.g. `mkdir build/<name> && cd |
|
1549 |
build/<name> && bash ../../configure`. |
|
33030 | 1550 |
|
45763 | 1551 |
Then you can build that configuration using `make CONF_NAME=<name>` or `make |
1552 |
CONF=<pattern>`, where `<pattern>` is a substring matching one or several |
|
1553 |
configurations, e.g. `CONF=debug`. The special empty pattern (`CONF=`) will |
|
1554 |
match *all* available configuration, so `make CONF= hotspot` will build the |
|
1555 |
`hotspot` target for all configurations. Alternatively, you can execute `make` |
|
1556 |
in the configuration directory, e.g. `cd build/<name> && make`. |
|
1557 |
||
1558 |
### Handling Reconfigurations |
|
33030 | 1559 |
|
52610
7ac273f045e3
8214062: JDK-8167368 Leftover: get_source.sh in build documentation
erikj
parents:
52351
diff
changeset
|
1560 |
If you update the repository and part of the configure script has changed, the |
45763 | 1561 |
build system will force you to re-run `configure`. |
1562 |
||
1563 |
Most of the time, you will be fine by running `configure` again with the same |
|
1564 |
arguments as the last time, which can easily be performed by `make |
|
1565 |
reconfigure`. To simplify this, you can use the `CONF_CHECK` make control |
|
1566 |
variable, either as `make CONF_CHECK=auto`, or by setting an environment |
|
1567 |
variable. For instance, if you add `export CONF_CHECK=auto` to your `.bashrc` |
|
1568 |
file, `make` will always run `reconfigure` automatically whenever the configure |
|
1569 |
script has changed. |
|
33030 | 1570 |
|
45763 | 1571 |
You can also use `CONF_CHECK=ignore` to skip the check for a needed configure |
1572 |
update. This might speed up the build, but comes at the risk of an incorrect |
|
1573 |
build result. This is only recommended if you know what you're doing. |
|
1574 |
||
1575 |
From time to time, you will also need to modify the command line to `configure` |
|
1576 |
due to changes. Use `make print-configure` to show the command line used for |
|
1577 |
your current configuration. |
|
1578 |
||
1579 |
### Using Fine-Grained Make Targets |
|
33030 | 1580 |
|
45763 | 1581 |
The default behavior for make is to create consistent and correct output, at |
1582 |
the expense of build speed, if necessary. |
|
33030 | 1583 |
|
45763 | 1584 |
If you are prepared to take some risk of an incorrect build, and know enough of |
1585 |
the system to understand how things build and interact, you can speed up the |
|
1586 |
build process considerably by instructing make to only build a portion of the |
|
1587 |
product. |
|
1588 |
||
1589 |
#### Building Individual Modules |
|
33030 | 1590 |
|
45763 | 1591 |
The safe way to use fine-grained make targets is to use the module specific |
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1592 |
make targets. All source code in the JDK is organized so it belongs to a |
50586
4bba6dea2e73
8200867: Remove references to "jdk 9" in build system
ihse
parents:
50490
diff
changeset
|
1593 |
module, e.g. `java.base` or `jdk.jdwp.agent`. You can build only a specific |
4bba6dea2e73
8200867: Remove references to "jdk 9" in build system
ihse
parents:
50490
diff
changeset
|
1594 |
module, by giving it as make target: `make jdk.jdwp.agent`. If the specified |
4bba6dea2e73
8200867: Remove references to "jdk 9" in build system
ihse
parents:
50490
diff
changeset
|
1595 |
module depends on other modules (e.g. `java.base`), those modules will be built |
4bba6dea2e73
8200867: Remove references to "jdk 9" in build system
ihse
parents:
50490
diff
changeset
|
1596 |
first. |
33030 | 1597 |
|
45763 | 1598 |
You can also specify a set of modules, just as you can always specify a set of |
1599 |
make targets: `make jdk.crypto.cryptoki jdk.crypto.ec jdk.crypto.mscapi |
|
1600 |
jdk.crypto.ucrypto` |
|
33030 | 1601 |
|
45763 | 1602 |
#### Building Individual Module Phases |
1603 |
||
1604 |
The build process for each module is divided into separate phases. Not all |
|
1605 |
modules need all phases. Which are needed depends on what kind of source code |
|
1606 |
and other artifact the module consists of. The phases are: |
|
33030 | 1607 |
|
45763 | 1608 |
* `gensrc` (Generate source code to compile) |
1609 |
* `gendata` (Generate non-source code artifacts) |
|
1610 |
* `copy` (Copy resource artifacts) |
|
1611 |
* `java` (Compile Java code) |
|
1612 |
* `launchers` (Compile native executables) |
|
1613 |
* `libs` (Compile native libraries) |
|
1614 |
* `rmic` (Run the `rmic` tool) |
|
1615 |
||
1616 |
You can build only a single phase for a module by using the notation |
|
1617 |
`$MODULE-$PHASE`. For instance, to build the `gensrc` phase for `java.base`, |
|
1618 |
use `make java.base-gensrc`. |
|
33030 | 1619 |
|
45763 | 1620 |
Note that some phases may depend on others, e.g. `java` depends on `gensrc` (if |
1621 |
present). Make will build all needed prerequisites before building the |
|
1622 |
requested phase. |
|
1623 |
||
1624 |
#### Skipping the Dependency Check |
|
33030 | 1625 |
|
45763 | 1626 |
When using an iterative development style with frequent quick rebuilds, the |
1627 |
dependency check made by make can take up a significant portion of the time |
|
1628 |
spent on the rebuild. In such cases, it can be useful to bypass the dependency |
|
1629 |
check in make. |
|
1630 |
||
1631 |
> **Note that if used incorrectly, this can lead to a broken build!** |
|
33030 | 1632 |
|
45763 | 1633 |
To achieve this, append `-only` to the build target. For instance, `make |
1634 |
jdk.jdwp.agent-java-only` will *only* build the `java` phase of the |
|
1635 |
`jdk.jdwp.agent` module. If the required dependencies are not present, the |
|
1636 |
build can fail. On the other hand, the execution time measures in milliseconds. |
|
33030 | 1637 |
|
45763 | 1638 |
A useful pattern is to build the first time normally (e.g. `make |
1639 |
jdk.jdwp.agent`) and then on subsequent builds, use the `-only` make target. |
|
1640 |
||
1641 |
#### Rebuilding Part of java.base (JDK\_FILTER) |
|
1642 |
||
1643 |
If you are modifying files in `java.base`, which is the by far largest module |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1644 |
in the JDK, then you need to rebuild all those files whenever a single file has |
45763 | 1645 |
changed. (This inefficiency will hopefully be addressed in JDK 10.) |
44078
673240c54c2e
8176509: Use pandoc for converting build readme to html
ihse
parents:
41040
diff
changeset
|
1646 |
|
45763 | 1647 |
As a hack, you can use the make control variable `JDK_FILTER` to specify a |
1648 |
pattern that will be used to limit the set of files being recompiled. For |
|
1649 |
instance, `make java.base JDK_FILTER=javax/crypto` (or, to combine methods, |
|
1650 |
`make java.base-java-only JDK_FILTER=javax/crypto`) will limit the compilation |
|
1651 |
to files in the `javax.crypto` package. |
|
33030 | 1652 |
|
45763 | 1653 |
### Learn About Mercurial |
1654 |
||
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1655 |
To become an efficient JDK developer, it is recommended that you invest in |
45763 | 1656 |
learning Mercurial properly. Here are some links that can get you started: |
33030 | 1657 |
|
45763 | 1658 |
* [Mercurial for git users](http://www.mercurial-scm.org/wiki/GitConcepts) |
1659 |
* [The official Mercurial tutorial](http://www.mercurial-scm.org/wiki/Tutorial) |
|
1660 |
* [hg init](http://hginit.com/) |
|
1661 |
* [Mercurial: The Definitive Guide](http://hgbook.red-bean.com/read/) |
|
33030 | 1662 |
|
45763 | 1663 |
## Understanding the Build System |
1664 |
||
1665 |
This section will give you a more technical description on the details of the |
|
1666 |
build system. |
|
1667 |
||
1668 |
### Configurations |
|
33030 | 1669 |
|
45763 | 1670 |
The build system expects to find one or more configuration. These are |
1671 |
technically defined by the `spec.gmk` in a subdirectory to the `build` |
|
1672 |
subdirectory. The `spec.gmk` file is generated by `configure`, and contains in |
|
1673 |
principle the configuration (directly or by files included by `spec.gmk`). |
|
33030 | 1674 |
|
45763 | 1675 |
You can, in fact, select a configuration to build by pointing to the `spec.gmk` |
1676 |
file with the `SPEC` make control variable, e.g. `make SPEC=$BUILD/spec.gmk`. |
|
1677 |
While this is not the recommended way to call `make` as a user, it is what is |
|
1678 |
used under the hood by the build system. |
|
33030 | 1679 |
|
45763 | 1680 |
### Build Output Structure |
1681 |
||
1682 |
The build output for a configuration will end up in `build/<configuration |
|
1683 |
name>`, which we refer to as `$BUILD` in this document. The `$BUILD` directory |
|
1684 |
contains the following important directories: |
|
33030 | 1685 |
|
45763 | 1686 |
``` |
1687 |
buildtools/ |
|
1688 |
configure-support/ |
|
1689 |
hotspot/ |
|
1690 |
images/ |
|
1691 |
jdk/ |
|
1692 |
make-support/ |
|
1693 |
support/ |
|
1694 |
test-results/ |
|
1695 |
test-support/ |
|
1696 |
``` |
|
1697 |
||
1698 |
This is what they are used for: |
|
33030 | 1699 |
|
45763 | 1700 |
* `images`: This is the directory were the output of the `*-image` make |
1701 |
targets end up. For instance, `make jdk-image` ends up in `images/jdk`. |
|
1702 |
||
1703 |
* `jdk`: This is the "exploded image". After `make jdk`, you will be able to |
|
1704 |
launch the newly built JDK by running `$BUILD/jdk/bin/java`. |
|
33030 | 1705 |
|
45763 | 1706 |
* `test-results`: This directory contains the results from running tests. |
33030 | 1707 |
|
45763 | 1708 |
* `support`: This is an area for intermediate files needed during the build, |
1709 |
e.g. generated source code, object files and class files. Some noteworthy |
|
1710 |
directories in `support` is `gensrc`, which contains the generated source |
|
1711 |
code, and the `modules_*` directories, which contains the files in a |
|
1712 |
per-module hierarchy that will later be collapsed into the `jdk` directory |
|
1713 |
of the exploded image. |
|
33030 | 1714 |
|
45763 | 1715 |
* `buildtools`: This is an area for tools compiled for the build platform |
1716 |
that are used during the rest of the build. |
|
1717 |
||
1718 |
* `hotspot`: This is an area for intermediate files needed when building |
|
1719 |
hotspot. |
|
1720 |
||
1721 |
* `configure-support`, `make-support` and `test-support`: These directories |
|
1722 |
contain files that are needed by the build system for `configure`, `make` |
|
1723 |
and for running tests. |
|
33030 | 1724 |
|
45763 | 1725 |
### Fixpath |
1726 |
||
1727 |
Windows path typically look like `C:\User\foo`, while Unix paths look like |
|
1728 |
`/home/foo`. Tools with roots from Unix often experience issues related to this |
|
1729 |
mismatch when running on Windows. |
|
1730 |
||
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1731 |
In the JDK build, we always use Unix paths internally, and only just before |
45763 | 1732 |
calling a tool that does not understand Unix paths do we convert them to |
1733 |
Windows paths. |
|
33030 | 1734 |
|
45763 | 1735 |
This conversion is done by the `fixpath` tool, which is a small wrapper that |
1736 |
modifies unix-style paths to Windows-style paths in command lines. Fixpath is |
|
1737 |
compiled automatically by `configure`. |
|
33030 | 1738 |
|
45763 | 1739 |
### Native Debug Symbols |
33030 | 1740 |
|
45763 | 1741 |
Native libraries and executables can have debug symbol (and other debug |
1742 |
information) associated with them. How this works is very much platform |
|
1743 |
dependent, but a common problem is that debug symbol information takes a lot of |
|
1744 |
disk space, but is rarely needed by the end user. |
|
33030 | 1745 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1746 |
The JDK supports different methods on how to handle debug symbols. The |
45763 | 1747 |
method used is selected by `--with-native-debug-symbols`, and available methods |
1748 |
are `none`, `internal`, `external`, `zipped`. |
|
33030 | 1749 |
|
45763 | 1750 |
* `none` means that no debug symbols will be generated during the build. |
1751 |
||
1752 |
* `internal` means that debug symbols will be generated during the build, and |
|
1753 |
they will be stored in the generated binary. |
|
33030 | 1754 |
|
45763 | 1755 |
* `external` means that debug symbols will be generated during the build, and |
1756 |
after the compilation, they will be moved into a separate `.debuginfo` file. |
|
1757 |
(This was previously known as FDS, Full Debug Symbols). |
|
1758 |
||
1759 |
* `zipped` is like `external`, but the .debuginfo file will also be zipped |
|
1760 |
into a `.diz` file. |
|
33030 | 1761 |
|
45763 | 1762 |
When building for distribution, `zipped` is a good solution. Binaries built |
1763 |
with `internal` is suitable for use by developers, since they facilitate |
|
1764 |
debugging, but should be stripped before distributed to end users. |
|
33030 | 1765 |
|
45763 | 1766 |
### Autoconf Details |
1767 |
||
1768 |
The `configure` script is based on the autoconf framework, but in some details |
|
1769 |
deviate from a normal autoconf `configure` script. |
|
33030 | 1770 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1771 |
The `configure` script in the top level directory of the JDK is just a thin |
48743
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
1772 |
wrapper that calls `make/autoconf/configure`. This in turn will run `autoconf` |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
1773 |
to create the runnable (generated) configure script, as |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
1774 |
`.build/generated-configure.sh`. Apart from being responsible for the |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
1775 |
generation of the runnable script, the `configure` script also provides |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
1776 |
functionality that is not easily expressed in the normal Autoconf framework. As |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
1777 |
part of this functionality, the generated script is called. |
33030 | 1778 |
|
45763 | 1779 |
The build system will detect if the Autoconf source files have changed, and |
48743
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
1780 |
will trigger a regeneration of the generated script if needed. You can also |
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
1781 |
manually request such an update by `bash configure autogen`. |
33030 | 1782 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1783 |
In previous versions of the JDK, the generated script was checked in at |
48743
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
1784 |
`make/autoconf/generated-configure.sh`. This is no longer the case. |
33030 | 1785 |
|
45763 | 1786 |
### Developing the Build System Itself |
33030 | 1787 |
|
45763 | 1788 |
This section contains a few remarks about how to develop for the build system |
1789 |
itself. It is not relevant if you are only making changes in the product source |
|
1790 |
code. |
|
33030 | 1791 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1792 |
While technically using `make`, the make source files of the JDK does not |
45763 | 1793 |
resemble most other Makefiles. Instead of listing specific targets and actions |
1794 |
(perhaps using patterns), the basic modus operandi is to call a high-level |
|
1795 |
function (or properly, macro) from the API in `make/common`. For instance, to |
|
1796 |
compile all classes in the `jdk.internal.foo` package in the `jdk.foo` module, |
|
1797 |
a call like this would be made: |
|
33030 | 1798 |
|
45763 | 1799 |
``` |
1800 |
$(eval $(call SetupJavaCompilation, BUILD_FOO_CLASSES, \ |
|
1801 |
SETUP := GENERATE_OLDBYTECODE, \ |
|
47219 | 1802 |
SRC := $(TOPDIR)/src/jkd.foo/share/classes, \ |
45763 | 1803 |
INCLUDES := jdk/internal/foo, \ |
1804 |
BIN := $(SUPPORT_OUTPUTDIR)/foo_classes, \ |
|
1805 |
)) |
|
1806 |
``` |
|
33030 | 1807 |
|
45763 | 1808 |
By encapsulating and expressing the high-level knowledge of *what* should be |
1809 |
done, rather than *how* it should be done (as is normal in Makefiles), we can |
|
1810 |
build a much more powerful and flexible build system. |
|
1811 |
||
1812 |
Correct dependency tracking is paramount. Sloppy dependency tracking will lead |
|
1813 |
to improper parallelization, or worse, race conditions. |
|
33030 | 1814 |
|
45763 | 1815 |
To test for/debug race conditions, try running `make JOBS=1` and `make |
1816 |
JOBS=100` and see if it makes any difference. (It shouldn't). |
|
1817 |
||
1818 |
To compare the output of two different builds and see if, and how, they differ, |
|
1819 |
run `$BUILD1/compare.sh -o $BUILD2`, where `$BUILD1` and `$BUILD2` are the two |
|
1820 |
builds you want to compare. |
|
33030 | 1821 |
|
45763 | 1822 |
To automatically build two consecutive versions and compare them, use |
1823 |
`COMPARE_BUILD`. The value of `COMPARE_BUILD` is a set of variable=value |
|
1824 |
assignments, like this: |
|
1825 |
``` |
|
1826 |
make COMPARE_BUILD=CONF=--enable-new-hotspot-feature:MAKE=hotspot |
|
1827 |
``` |
|
1828 |
See `make/InitSupport.gmk` for details on how to use `COMPARE_BUILD`. |
|
33030 | 1829 |
|
45763 | 1830 |
To analyze build performance, run with `LOG=trace` and check `$BUILD/build-trace-time.log`. |
1831 |
Use `JOBS=1` to avoid parallelism. |
|
33030 | 1832 |
|
45763 | 1833 |
Please check that you adhere to the [Code Conventions for the Build System]( |
1834 |
http://openjdk.java.net/groups/build/doc/code-conventions.html) before |
|
48743
ba52fa7bbf14
8195689: Remove generated-configure.sh and instead use autoconf
ihse
parents:
47928
diff
changeset
|
1835 |
submitting patches. |
45763 | 1836 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1837 |
## Contributing to the JDK |
45763 | 1838 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1839 |
So, now you've built your JDK, and made your first patch, and want to |
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1840 |
contribute it back to the OpenJDK Community. |
33030 | 1841 |
|
50885
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1842 |
First of all: Thank you! We gladly welcome your contribution. |
7c728fa9d1af
8205956: Fix usage of "OpenJDK" in build and test instructions
mr
parents:
50586
diff
changeset
|
1843 |
However, please bear in mind that the JDK is a massive project, and we must ask |
45763 | 1844 |
you to follow our rules and guidelines to be able to accept your contribution. |
33030 | 1845 |
|
45763 | 1846 |
The official place to start is the ['How to contribute' page]( |
1847 |
http://openjdk.java.net/contribute/). There is also an official (but somewhat |
|
1848 |
outdated and skimpy on details) [Developer's Guide]( |
|
1849 |
http://openjdk.java.net/guide/). |
|
33030 | 1850 |
|
45763 | 1851 |
If this seems overwhelming to you, the Adoption Group is there to help you! A |
1852 |
good place to start is their ['New Contributor' page]( |
|
1853 |
https://wiki.openjdk.java.net/display/Adoption/New+Contributor), or start |
|
1854 |
reading the comprehensive [Getting Started Kit]( |
|
1855 |
https://adoptopenjdk.gitbooks.io/adoptopenjdk-getting-started-kit/en/). The |
|
1856 |
Adoption Group will also happily answer any questions you have about |
|
1857 |
contributing. Contact them by [mail]( |
|
1858 |
http://mail.openjdk.java.net/mailman/listinfo/adoption-discuss) or [IRC]( |
|
1859 |
http://openjdk.java.net/irc/). |
|
33030 | 1860 |
|
45763 | 1861 |
--- |
1862 |
# Override styles from the base CSS file that are not ideal for this document. |
|
1863 |
header-includes: |
|
1864 |
- '<style type="text/css">pre, code, tt { color: #1d6ae5; }</style>' |
|
1865 |
--- |