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