blob: 9c713190034be8b58e9c2b60b8d0de8bb256b0ed [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001Working on OpenJDK using NetBeans
2 This note describes how to work on the OpenJDK from NetBeans. We've
3 provided several NetBeans projects as starting points. Below we'll
4 describe how to use them, as well as how to create your own.
5
6Getting Started
7 In addition to the source bundle for Open JDK, you'll need to download
8 and install copies of the JDK and of NetBeans 6. And if you want to run
9 tests on the JDK (you do want to run tests, right?), you'll need to
10 install the jtreg test harness.
11
12 In this note, when pathnames are not fully specified, they should be
13 interpreted as being relative to the directory containing this README
14 and the NetBeans projects themselves.
15
16 The JDK build process is largely make-based, and is not
17 exceptionally tolerant of pathnames with spaces in them (such as
18 "Program Files". Please be sure to install everything in a
19 directories whose paths don't have any spaces!
20
21 Downloading the JDK
22 You've probably done this a million times. Download and install it
23 from http://java.sun.com/javase
24
25 Downloading the OpenJDK sources
26 Since you're reading this, d you've already downloaded the OpenJDK
27 source bundle. Later in this document we'll refer to the location
28 where you installed the Open JDK sources as *install-dir*.
29
30 Downloading a pre-built, JDK 7
31 This will be necessary to do builds of some of the projects. In
32 general, you want to download and install a pre-built JDK that
33 corresponds to the OpenJDK sources you download. Building the entire
34 OpenJDK depends on a few parts of the pre-built JDK. Get this from
35 http://download.java.net/jdk7/binaries
36
37 Note: For working on certain projects, like JMX and JConsole, you
38 may find convenient to use a pre-built version of JDK 7 (or
39 OpenJDK) rather than building your own. This will allow you
40 to build only that part of the OpenJDK sources which correspond
41 to that project.
42
43 NetBeans 6
44 Yep, NetBeans *6*. Nope, not FCS'd yet. We're on the edge here,
45 enjoy it! Get the latest working development build of NetBeans 6
46 from http://netbeans.org
47
48 jtreg
49 "jtreg" is the test harness for running OpenJDK's regression tests.
50 Get it from http://openjdk.java.net/jtreg
51
52 Ant
53 NetBeans comes with ant, but if you use a separately-installed copy
54 please make sure that it is at least version 1.7.0.
55
56Configuring
57 Building OpenJDK is hard and complex. No, strike that. While it's not
58 exactly "easy", we've got it down to *relatively* small set of
59 properties you need to set.
60
61 The NetBeans projects provided here share a fair amount of common
62 structure. They share properties values where it makes sense. Each
63 project loads properties from these properties files, in this order
64
65 ${basedir}/nbproject/private/build.properties
66 $HOME/.openjdk/${ant.project.name}-build.properties
67 $HOME/.openjdk/build.properties
68 ${basedir}/build.properties
69
70 (${basedir} refers to the directory containing a particular NetBeans
71 project.) The first time a property defined determines value: it is
72 *not* overridden if it is read from properties files read later. The net
73 result is that by carefully choosing where to define a property, you can
74 have it for a specific project, all uses of a specific project (useful
75 if you work on multiple copies of the OpenJDK sources), all projects, or
76 only projects in a specific sandbox.
77
78 With that in mind, please set the following properties. Presuming you
79 want the same values for all your work, set them in
80 $HOME/.openjdk/build.properties.
81
82 * bootstrap.jdk
83 Set to the location where you installed JDK 7.
84
85 * jtreg.home
86 Set to the location where you installed jtreg.
87
88 * make.options
89 Some of the projects invoke "make", since they compile native code.
90 The make.options property is for passing information about what you
91 installed where to make. Change the paths to fit your particular
92 situation:
93
94 make.options=\
95 ALT_BOOTDIR=/home/me/bin/jdk1.6.0 \
96 ALT_BINARY_PLUGS_PATH=/home/me/bin/openjdk-binary-plugs \
97 ALT_JDK_IMPORT_PATH=/home/me/bin/jdk1.7.0 \
98 OPENJDK=true
99
100 The trailing '\' are important, so that make gets the above as a
101 single set of options.
102
103 You might want to add additional additional options: see the README
104 for the project you're using for more information. And see
105 *install-dir*/jdk/make/README-builds.html
106 to read much more about building the JDK.
107
108 Windows-specific configuration
109 First, please note that the entire JDK cannot currently be built on
110 Windows platforms. This will likely limit your ability to build
111 make-based projects. See
112 *install-dir*/jdk/make/README-builds.html
113 for full information on issues with building on the Windows platform.
114
115 That said, there are two ways to work with the Windows-required settings
116 for the Microsoft tools. Either:
117
118 * Set environment variables values in Windows
119 Doing so means accessing the System control panel in Windows, and
120 setting the environment variables there.
121
122 By doing so, you can launch NetBeans by double-clicking its icon,
123 and the environment variable values will be available.
124
125 * Set environment variable values in a shell
126 Doing so means adding the settings to an init file (e.g. .bashrc,
127 .cshrc, etc.) or a file that you source before running NetBeans. In
128 this case, you'll have to launch NetBeans from the command line in a
129 shell in which you've set the environment variables.
130
131 In either case, the end result should be that the settings are available
132 to the make-based build process when it runs from within NetBeans.
133
134 The make-based builds presumes that you're using cygwin, and expects to
135 find "make" in c:\cygwin\bin\make. If you've installed cygwin elsewhere,
136 set "make" in a properties file.
137
138 Configuring Project Properties
139 A note of caution is in order: These are NetBeans *freeform* projects.
140 If you use the NetBeans GUI to examine them, things are likely to not
141 look "right". Please don't edit them there, please instead use a text
142 editor.
143
144 Locale Requirements
145 To build the Open JDK sources, be certain that you are using the "C"
146 locale on Unix (R) platforms, or "English (United States)" locale on
147 Windows.
148
149Platforms and architectures, oh my!
150 The Open JDK can be built for a variety of operating system platforms
151 and hardware architectures. The resulting builds are always placed in a
152 directory which contains the platform and architecture as part of the
153 pathname, as in *platform*-*arch*. For example, if you build the jdk
154 project on a Linux platform running on x86 hardware, the resulting build
155 will be in:
156
157 *install-dir*/jdk/build/linux-i586
158
159 We've provided support for some platforms and architectures in
160 common/architectures. Add another, if your needs require it.
161
162Provided NetBeans projects
163 This section describes the NetBeans projects that help you work on
164 particular parts of the JDK. While they're largely similar in structure
165 and should work the way you expect NetBeans projects to work: edit,
166 build, test, etc. But there are some differences. They don't all support
167 the same targets (e.g., there's nothing to run in jarzip project).
168
169 Some projects are built by invoking make, since they involve compilation
170 of native code or other activities that cannot be done by javac. We call
171 these "make-based", and call all others "ant-based".
172
173 They all are configured by way of a build.properties file, which
174 specifies what subdirectories of the JDK sources they manipulate, what
175 directories contain their tests, whether they use make or ant, etc.
176
177 The very first time you open any one of these projects on set of Open
178 JDK sources, NetBeans will scan the entire set of sources, not just
179 those for the project you opened. This will take a few minutes, but will
180 ensure that Go To Type, Go To Source, and so on work as expected. Later,
181 when you open other projects on the same Open JDK sources, there will be
182 at most a slight delay.
183
184 There's a README accompanying each project. Most are text files, which
185 you can Open in NetBeans, some are HTML files, in which case unless you
186 enjoy reading raw HTML, you're better off choosing the *View* menu item
187 from the context menu, which will display the README in your web
188 browser.
189
190 Finally, note that these projects were all created by different people,
191 and are while some attempt has been made to make them look and behave
192 the same, they are maintained separately and will vary somewhat.
193
194 The projects currently provided are:
195
196 jdk (directory "jdk")
197 A convenient starting point for the other projects, and from which
198 you can build the entire OpenJDK. Please note that depending on your
199 hardware, this could take a *very* long time. The results of the
200 build are in *install-dir*/jdk/build/*platform*-*arch*.
201
202 world (directory "world")
203 This project builds both the Hotspot VM and all of JavaSE. Please
204 note that pretty much regardless of your hardware, this *will* take
205 a long time, and use *lots* of disk space (more than 3GB). The
206 results of the build are in
207 *install-dir*/control/build/*platform*-*arch* and
208 *install-dir*/control/build/*platform*-*arch*-fastdebug.
209
210 Consult the project's README file for details.
211
212 AWT & Java2d (directory "awt2d")
213 For working on AWT and Java2d. Supports running the Font2DTest demo.
214
215 This is a make-based project: In order to build this project, you
216 should build the jdk project first, since AWT and Java2d include
217 native code.
218
219 JConsole (directory "jconsole")
220 For working on JConsole. Creates ../dist/lib/jconsole.jar. Supports
221 running and debugging JConsole.
222
223 This ant-based project does *not* require that you build the jdk
224 project first, provided that you use a pre-built version of JDK 7.
225
226 Java (TM) Management Extensions (JMX(TM)) API (directory "jmx")
227 For working on JMX source code. Creates ../dist/lib/jmx.jar.
228
229 This ant-based project does *not* require that you build the jdk
230 project first, provided that you use a pre-built version of JDK 7.
231
232 Jar & Zip (directory "jarzip")
233 For working on jar & zip. It builds the zip library (including
234 native code), the jar library, and the jar tool. Creates an
235 executable jar program in ../build/*platform*-*arch*/bin/jar.
236
237 This is a make-based project: In order to build this project, you
238 should build the jdk project first, since AWT and Java2d include
239 native code.
240
241 Swing (directory "swing")
242 For working on Swing. Creates ../dist/lib/swing.jar. Supports
243 running and debugging the SampleTree demo.
244
245 This ant-based project does *not* require that you build the jdk
246 project first, provided that you use a pre-built version of JDK 7.
247
248 In addition, there are projects for building the compiler, javadoc,
249 and related tools, in the OpenJDK langtools component. These
250 projects are separate from those described here, and have their
251 own set of guidelines and conventions. For more details, see the
252 README files in make/netbeans in the OpenJDK langtools component.
253
254Running Tests
255 We use the jtreg test harness, described more fully at
256 http://openjdk.java.net/jtreg
257
258 The OpenJDK tests are in the default Java package, are public classes,
259 and have a "static void main(String[] args)" with which they are
260 invoked. Some tests are actually shell scripts, which might compile
261 code, etc. jtreg is quite flexible.
262
263 To run tests for a project, use *Test Project* from NetBeans. From the
264 command line, you can invoke "ant jtreg" on any individual project's
265 build.xml file.
266
267 In either NetBeans of on the command line, jtreg prints summary output
268 about the pass/fail nature of each test. An HTML report of the entire
269 test run is
270
271 ../build/*platform*-*arch*/jtreg/*ant-project-name*/JTreport/report.html
272
273 In that same JTreport directory are also individual HTML files
274 summarizing the test environment, test passes and failures, etc.
275
276 More detail on any individual test is under
277
278 ../build/*platform*-*arch*/jtreg/*ant-project-name*/JTwork.
279
280 For example, details about the awt/Modal/SupportedTest/SupportedTest
281 test are under the JTwork directory at the same pathname as the test
282 itself in a ".jtr" file. For example:
283
284 ../build/*platform*-*arch*/jtreg/*ant-project-name*/JTwork/awt/Modal/SupportedTest/SupportedTest.jtr
285
286 Sometimes you will see that running jtreg has resulted in a failure.
287 This does not always mean that a test has an error in it. Jtreg
288 distinguishes between these two cases. There are a number of tests that
289 are "ignored", and not run, and these are reported as failures.
290
291 You can run a single test by right clicking on it and choosing *Run
292 File* from the context menu. Similarly, you can debug a single test by
293 choosing *Debug File*.
294
295Debugging
296 Debugging is enabled by default in ant-based projects, as if
297 "-g:lines,vars,source" were given. You can alter these settings via
298 entries in one of the configuration properties files. For example:
299
300 javac.debug=false
301 javac.debuglevel=<debug level options>
302
303 To debug a project or test, use NetBeans in the normal way, with *Debug
304 Project* or *Debug File*. Note that not all projects provide a target
305 that can be debugged, but tests can be debugged.
306
307Creating Javadoc
308 You can create Javadoc for any of the projects: just choose *Generate
309 Javadoc for Project* from the NetBeans menu. Your default browser will
310 open up, displaying the just-generated javadoc.
311
312 Javadoc gets generated into a separate subdirectory for each project.
313 For example, the Jar & Zip project's javadoc gets generated in
314
315 ../build/*platform*-*arch*/jtreg/*ant-project-name*/javadoc/jarzip
316
317Cleaning projects
318 Each project can of course be cleaned. Make-based and ant-based projects
319 differ a little in what exactly gets cleaned. In both cases, all jtreg
320 results and javadoc are removed.
321
322 In ant-based projects, project-specific files as determined by the
323 project's build.properties file are removed from the classes and gensrc
324 directories that are under ../build/*platform*-*arch*.
325
326 In make-based projects, "make clean" is run in the same directories as
327 "make all" is run when building the project.
328
329 Please note that the jdk project is "special" with respect to
330 cleaning: in this case, the entire ../build directory is removed.
331 Similar for the world project.
332
333Creating your own NetBeans project
334 The project's we've provided are hopefully a useful starting point, but
335 chances are that you want to work on something else. This section will
336 describe how to select an existing project, and then adapt it to your
337 needs.
338
339 Considerations
340 The first consideration is whether or not the code in which you're
341 interested needs anything beyond javac and copying of resources to
342 build. If so, then you'll need to create a make-based project. If not,
343 an ant-based project is possible. See the project descriptions above to
344 learn which are make-based, and which are ant-based.
345
346 The second consideration is to consider the files that you'll need. Each
347 project is defined by 3 files:
348
349 * build.xml
350 This is the ant build script. For a make-based project, they tend to
351 have a target for "make clean" and another for "make all", each of
352 which invokes "make-run" in the same set of directories. Take a look
353 at jarzip/build.xml for an example.
354
355 For an ant-based project, there might be nothing, with all the work
356 done via the declaration of properties in the build.properties file.
357 Take a look at jconsole/build.xml for an example, and notice how it
358 overrides the -pre-compile and -post-compile targets that are
359 defined in common/shared.xml (where they are defined to do nothing).
360
361 * build.properties
362 This file defines the directories (and possibly files) that are
363 included in and excluded from. Basically, a file is considered to be
364 in a project if it is mentioned in the includes list, or is
365 contained under a directory mentioned in that list, *unless* it is
366 explicitly excluded or is contained under a directory that is
367 excluded. Take a look awt2d/build.properties for an example.
368
369 * nbproject/project.xml
370 This file defines a project for NetBeans for a "freeform" project.
371 Each declares several entity references, which are used later in the
372 project. For an example, see javadoc/nbproject/project.xml, which is
373 an ant-based project. Compare that with
374 jarzip/nbproject/project.xml, which is make-based. Not much
375 difference! That's because while the jarzip project is make-based,
376 it does not have any platform-specifc native code. Contrast that
377 with awt2d/nbproject/project.xml, which does have native code;
378 notice that it uses platform-specific entity references.
379
380 In summary, we recommend exploring the given projects, and choosing one
381 that most closely suits our needs.
382
383 Example: A project for working on collections
384 Let's create a project to work with on the collections classes. There's no native
385 code here, so an ant-based project will do. Therefore, the jconsole
386 project is a reasonable project to use as a starting point.
387
388 Clone the existing project
389 Make a directory for the collections project next to the existing projects:
390
391 % mkdir -p collections/nbproject
392
393 Copy files from the jconsole project:
394
395 % cp jconsole/build.properties collections
396 % cp jconsole/build.xml collections
397 % cp jconsole/nbproject/project.xml collections/nbproject
398
399 Change the set of files included in the project
400 The collections sources are all under one directory, and we want to include
401 them all. The same is true of the tests. So edit
402 collections/build.properties so that it contains these lines:
403
404 includes=\
405 java/util/
406 excludes=\
407 java/util/Calendar.java,\
408 java/util/jar/,\
409 java/util/logging/,\
410 java/util/prefs/,\
411 java/util/regex/,\
412 java/util/spi/,\
413 java/util/zip/,\
414 **/*-XLocales.java
415 jtreg.tests=\
416 java/util/**/*Collection/ \
417 java/util/**/*Map/ \
418 java/util/**/*Set/ \
419 java/util/**/*List/
420
421 Notice the trailing "/" in some of those pathnames: that tells NetBeans to
422 treat the path as a directory and include (or exclude) everything beneath
423 it in the hierarchy. Note also how we include java/util, but then exclude
424 several directories under that which are not related to collections.
425
426 The build.xml for collections is about as simple as can be. First, change the
427 name of the project:
428
429 <project name="collections" default="build" basedir=".">
430
431 Then remove the -pre-compile target from the build.xml. Change the
432 -post-compile target to create collections.jar without any manifest, and
433 to only contain the collections-related classes. The jar task now looks
434 like this:
435
436 <jar destfile="${dist.dir}/lib/collections.jar">
437 <fileset dir="${classes.dir}">
438 <include name="java/util/*.class"/>
439 <exclude name="java/util/Calendar*.class"/>
440 </fileset>
441 </jar>
442
443 Also, change the clean target to remove collections.jar instead of
444 jconsole.jar.
445
446 Now edit project.xml file. NetBeans uses an internal name and a
447 user-visible name, both of which should be changed:
448
449 <name>Collections</name> <!-- Customized -->
450
451 <property name="name">collections</property> <!-- Customized -->
452
453 Inside of <ide-actions>, you'll see actions defined for "run" and
454 "debug". The Open JDK sources don't include any interesting Collections
455 demos, but leave these here for now: Chances are you'll find or create
456 some collections app of your own, and want to run and or debug it.
457
458 Now, open the Collections project in NetBeans. You'll find that it operates
459 just like all the other projects.
460
461 If/when you want to have this project run a collections demo, change the run
462 target in collections/build.xml to invoke it in whatever manner is appropriate
463 for the app. From NetBeans, you should be able to run and debug the app,
464 including setting breakpoints in collections code.
465
466Appendix 1: Customizations
467 There are several ways to customize NetBeans projects. These projects
468 share a common structure, based on common/shared.xml and
469 common/make.xml. Because of that sharing, some mechanisms described
470 below apply to most any project.
471
472 Several properties can be user-defined (and several should not be
473 user-defined!). There are different properties files read. Some default
474 targets can be overridden.
475
476 Property files
477 When projects are started, and when when ant runs (whether from NetBeans
478 or the command line), these properties files are loaded in the order
479 shown:
480
481 ${basedir}/nbproject/private/build.properties
482 $HOME/.openjdk/${ant.project.name}-build.properties
483 $HOME/.openjdk/build.properties
484 ${basedir}/build.properties
485
486 Recall that with ant, once a property is defined, its value cannot be
487 changed, so it's "first one wins".
488
489 To set or change a property for all your projects, put the change into
490 $HOME/.openjdk/build.properties. This will affect all projects,
491 regardless of how many copies of the Open JDK sources you have
492 installed.
493
494 Let's say you have 2 copies of the Open JDK sources installed on your
495 machine. To set or change a property for only the jconsole projects, but
496 for both of them, make the change in
497 $HOME/.openjdk/${ant.project.name}-build.properties. If you wanted to
498 make the change for only one of them, do it in that project's
499 ${basedir}/build.properties or
500 ${basedir}/nbproject/private/build.properties.
501
502 Note that the ${basedir}/build.properties file is provided as part of
503 the Open JDK sources. If you want to make a change for a particular
504 project, you can do so there. To be sure that you don't ever
505 accidentally check it in to the Open JDK sources, you might prefer to
506 change it in ${basedir}/nbproject/private/build.properties.
507
508 User-definable Properties
509 You can provide your own definitions for the properties listed below. We
510 don't recommend overriding the definitions of other properties.
511
512 The following two properties should be set before you try to use the
513 projects with NetBeans or ant:
514
515 * bootstrap.jdk
516 Default: None. Please set this, normally in
517 $HOME/.openjdk/build.properties.
518
519 * jtreg.home
520 Default: None. Please set this, normally in
521 $HOME/.openjdk/build.properties.
522
523 These options are for configuring the behavior of make:
524
525 * use.make
526 Default: Not set. Set this, normally in ${basedir}/build.properties,
527 for a project which is make-based.
528
529 * make
530 Default: The right make for the platform, at the normal location, set
531 in *install-dir*/jdk/make/netbeans/common/make.xml
532
533 * make.options
534 Default: Empty string. Set this to any options you want to pass to
535 make, normally in ${basedir}/build.properties.
536
537 The remaining options are for use at your discretion:
538
539 * javac.options
540 Default: -Xlint
541
542 * javac.debug
543 Default: true
544
545 * javac.debuglevel
546 Default: lines,vars,source
547
548 * javadoc.options
549 Default: Empty string. Some projects will need to set this to
550 increase the heap for running javadoc. For example, see the jconsole
551 project.
552
553 * javadoc.packagenames
554 Default: "none". Set this only if your project has packages that
555 should be javadoc'd which are outside of those listed in the javadoc
556 target's packageset. See the jconsole project for an example.
557
558 * jtreg.tests
559 Default: None. Set this to a list of tests and/or directories
560 containing regression tests, normally in
561 ${basedir}/build.properties.
562
563 * jtreg.options
564 Default: Empty string. See http://openjdk.java.net/jtreg
565
566 * jtreg.vm.options
567 Default: Empty string. See http://openjdk.java.net/jtreg
568
569 * jtreg.samevm
570 Default: false. See http://openjdk.java.net/jtreg
571
572 User-overridable Targets
573 The following targets are provided for your convenience in customizing
574 various standard actions of the build process. The default action for
575 each one is to do nothing.
576
577 These come in pairs, allowing your scripts to take some action before or
578 after a standard action.
579
580 * -pre-init
581 Runs before any other initialization has been done.
582
583 * -post-init
584 Runs before after all other initialization has been done.
585
586 * -pre-compile
587 Runs before compilation, whether via ant or make. Note that in the
588 case of make, it is before the -build-make target has run, not after
589 each individual make-run has run.
590
591 * -post-compile
592 Runs after compilation, whether via ant or make.
593
594 * -pre-jtreg
595 Runs before regression tests are run.
596
597 * -post-jtreg
598 Runs before after regression tests are run.
599
600 In a make-based project, you should override these targets to do the
601 build and clean actions required of your project.
602
603 * -build-make
604 * -clean-make
605
606Known Issues
607 Tests won't run: waiting for lock
608 Occasionally when running tests, there will be a delay, followed by a
609 message like this:
610 Waiting to lock test result cache for
611 /tmp/jdk/build/linux-i586/jtreg/jconsole/JTwork for 20 seconds
612 The workaround is to stop the tests, rm -rf the offending jtreg/<project>
613 directory by hand, and re-run the tests.
614
615 Can't run nor debug a single test in the JConsole test
616 In most projects, you can run a single test by opening it in the editor,
617 and choosing Run File from the context menu. If you try this with the a
618 JConsole test, instead you'll see that *all* tests from *all* projects
619 are run. The workaround is to not try to run a single JConsole test.
620 Debugging is similarly problematic (both running and debugging use the
621 same underlying infrastructure).
622
623 If you do Run File a JConsole tests, you can always stop them by pressing
624 the stop button in the NetBeans output window. But you'll be surprised to
625 learn that they are actually still running in the background. The only
626 way out of this situation is to exit NetBeans. A few more tests will run,
627 but after restarting NetBeans things will be OK.
628
629Attribution
630 UNIX is a registered trademark in the United States and other countries,
631 exclusively licensed through X/Open Company, Ltd.
632