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