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