1 /*
2 * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 /*
27 * This file defines build profiles for the JIB tool and others.
28 *
29 * A build profile defines a set of configuration options and external
30 * dependencies that we for some reason or other care about specifically.
31 * Typically, build profiles are defined for the build configurations we
32 * build regularly.
33 *
34 * Contract against this file from the tools that use it, is to provide
35 * a function on the form:
36 *
37 * getJibProfiles(input)
38 *
39 * which returns an object graph describing the profiles and their
40 * dependencies. The name of the function is based on the name of this
41 * file, minus the extension and the '-', camel cased and prefixed with
42 * 'get'.
43 *
44 *
45 * The parameter 'input' is an object that optionally contains some data.
46 * Optionally because a tool may read the configuration for different purposes.
47 * To initially get a list of available profiles, the active profile may not
48 * yet be known for instance.
49 *
50 * Data that may be set on the input object:
51 *
52 * input.profile = <name of active profile>
53 *
54 * If the active profile is set, the following data from it must also
55 * be provided:
56 *
57 * input.profile
58 * input.build_id
59 * input.target_os
60 * input.target_cpu
61 * input.build_os
62 * input.build_cpu
63 * input.target_platform
64 * input.build_platform
65 * // The build_osenv_* variables describe the unix layer on Windows systems,
66 * // i.e. Cygwin, which may also be 32 or 64 bit.
67 * input.build_osenv
68 * input.build_osenv_cpu
69 * input.build_osenv_platform
70 *
71 * For more complex nested attributes, there is a method "get":
72 *
73 * input.get("<dependency>", "<attribute>")
74 *
75 * Valid attributes are:
76 * install_path
77 * download_path
78 * download_dir
79 * home_path
80 *
81 *
82 * The output data generated by this configuration file has the following
83 * format:
84 *
85 * data: {
86 * // Identifies the version of this format to the tool reading it
87 * format_version: "1.0",
88 *
89 * // Name of base outputdir. JIB assumes the actual output dir is formed
90 * // by adding the configuration name: <output_basedir>/<config-name>
91 * output_basedir: "build",
92 * // Configure argument to use to specify configuration name
93 * configuration_configure_arg:
94 * // Make argument to use to specify configuration name
95 * configuration_make_arg:
96 *
97 * profiles: {
98 * <profile-name>: {
99 * // Name of os the profile is built to run on
100 * target_os; <string>
101 * // Name of cpu the profile is built to run on
102 * target_cpu; <string>
103 * // Combination of target_os and target_cpu for convenience
104 * target_platform; <string>
105 * // Name of os the profile is built on
106 * build_os; <string>
107 * // Name of cpu the profile is built on
108 * build_cpu; <string>
109 * // Combination of build_os and build_cpu for convenience
110 * build_platform; <string>
111 *
112 * // List of dependencies needed to build this profile
113 * dependencies: <Array of strings>
114 *
115 * // List of configure args to use for this profile
116 * configure_args: <Array of strings>
117 *
118 * // List of free form labels describing aspects of this profile
119 * labels: <Array of strings>
120 * }
121 * }
122 *
123 * // Dependencies use a Maven like deployment structure
124 * dependencies: {
125 * <dependency-name>: {
126 * // Organization part of path defining this dependency
127 * organization: <string>
128 * // File extension for this dependency
129 * ext: <string>
130 * // Module part of path for defining this dependency,
131 * // defaults to <dependency-name>
132 * module: <string>
133 * // Revision part of path for defining this dependency
134 * revision: <string>
135 *
136 * // List of configure args to add when using this dependency,
137 * // defaults to
138 * // "--with-<dependency-name>=input.get("<dependency-name", "install_path")"
139 * configure_args: <array of strings>
140 *
141 * // Name of environment variable to set when using this dependency
142 * // when running make
143 * environment_name: <string>
144 * // Value of environment variable to set when using this dependency
145 * // when running make
146 * environment_value: <string>
147 *
148 * // Value to add to the PATH variable when using this dependency,
149 * // applies to both make and configure
150 * environment_path: <string>
151 * }
152 *
153 * <dependency-name>: {
154 * // For certain dependencies where a legacy distribution mechanism is
155 * // already in place, the "javare" server layout is also supported
156 * // Indicate that an alternate server source and layout should be used
157 * server: "javare"
158 *
159 * // For "javare", a combination of module, revision,
160 * // build number (optional), files and checksum file is possible for
161 * // artifacts following the standard layout.
162 * module: <string>
163 * revision: <string>
164 * build_number: <string>
165 * checksum_file: <string>
166 * file: <string>
167 *
168 * // For other files, use checksum path and path instead
169 * checksum_path: <string>
170 * path: <string>
171 * }
172 * }
173 * }
174 */
175
176 /**
177 * Main entry to generate the profile configuration
178 *
179 * @param input External data to use for generating the configuration
180 * @returns {{}} Profile configuration
181 */
182 var getJibProfiles = function (input) {
183
184 var data = {};
185
186 // Identifies the version of this format to the tool reading it.
187 // 1.1 signifies that the publish, publish-src and get-src features are usable.
188 // 1.2 signifies that artifact uploads should fail on missing artifacts by default.
189 // 1.3 input.get(<dep>, "home_path") automatically goes down into a single top
190 // dir just like default configure_args and environment_path variables.
191 data.format_version = "1.3";
192
193 // Organization, product and version are used when uploading/publishing build results
194 data.organization = "";
195 data.product = "jdk";
196 data.version = getVersion();
197
198 // The base directory for the build output. JIB will assume that the
199 // actual build directory will be <output_basedir>/<configuration>
200 data.output_basedir = "build";
201 // The configure argument to use to specify the name of the configuration
202 data.configuration_configure_arg = "--with-conf-name=";
203 // The make argument to use to specify the name of the configuration
204 data.configuration_make_arg = "CONF_NAME=";
205
206 // Exclude list to use when Jib creates a source bundle
207 data.src_bundle_excludes = [
208 "build", "{,**/}webrev*", "{,**/}.hg", "{,**/}JTwork", "{,**/}JTreport",
209 "{,**/}.git"
210 ];
211 // Include list to use when creating a minimal jib source bundle which
212 // contains just the jib configuration files.
213 data.conf_bundle_includes = [
214 "make/autoconf/version-numbers",
215 ];
216
217 // Define some common values
218 var common = getJibProfilesCommon(input, data);
219 // Generate the profiles part of the configuration
220 data.profiles = getJibProfilesProfiles(input, common, data);
221 // Generate the dependencies part of the configuration
222 data.dependencies = getJibProfilesDependencies(input, common, data);
223
224 return data;
225 };
226
227 /**
228 * Generates some common values
229 *
230 * @param input External data to use for generating the configuration
231 * @returns Common values
232 */
233 var getJibProfilesCommon = function (input, data) {
234 var common = {};
235
236 common.organization = "jpg.infra.builddeps";
237 common.build_id = getBuildId(input);
238 common.build_number = input.build_number != null ? input.build_number : "0";
239
240 // List of the main profile names used for iteration
241 common.main_profile_names = [
242 "linux-x64", "linux-x86", "macosx-x64", "solaris-x64",
243 "solaris-sparcv9", "windows-x64", "windows-x86",
244 "linux-aarch64", "linux-arm32", "linux-ppc64le", "linux-s390x"
245 ];
246
247 // These are the base setttings for all the main build profiles.
248 common.main_profile_base = {
249 dependencies: ["boot_jdk", "gnumake", "jtreg", "jtregMW", "jib", "autoconf", "jmh", "jcov"],
250 default_make_targets: ["product-bundles", "test-bundles", "static-libs-bundles"],
251 configure_args: concat(["--enable-jtreg-failure-handler"],
252 "--with-exclude-translations=de,es,fr,it,ko,pt_BR,sv,ca,tr,cs,sk,ja_JP_A,ja_JP_HA,ja_JP_HI,ja_JP_I,zh_TW,zh_HK",
253 "--disable-manpages",
254 "--disable-jvm-feature-shenandoahgc",
255 versionArgs(input, common))
256 };
257 // Extra settings for debug profiles
258 common.debug_suffix = "-debug";
259 common.debug_profile_base = {
260 configure_args: ["--enable-debug"],
261 labels: "debug"
262 };
263 // Extra settings for slowdebug profiles
264 common.slowdebug_suffix = "-slowdebug";
265 common.slowdebug_profile_base = {
266 configure_args: ["--with-debug-level=slowdebug"],
267 labels: "slowdebug"
268 };
269 // Extra settings for openjdk only profiles
270 common.open_suffix = "-open";
271 common.open_profile_base = {
272 configure_args: ["--enable-openjdk-only"],
273 labels: "open"
274 };
275
276 common.configure_args_64bit = ["--with-target-bits=64"];
277 common.configure_args_32bit = ["--with-target-bits=32"];
278
279 /**
280 * Define common artifacts template for all main profiles
281 * @param o - Object containing data for artifacts
282 */
283 common.main_profile_artifacts = function (o) {
284 var jdk_subdir = (o.jdk_subdir != null ? o.jdk_subdir : "jdk-" + data.version);
285 var jdk_suffix = (o.jdk_suffix != null ? o.jdk_suffix : "tar.gz");
286 var pf = o.platform
287 return {
288 artifacts: {
289 jdk: {
290 local: "bundles/\\(jdk.*bin." + jdk_suffix + "\\)",
291 remote: [
292 "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin." + jdk_suffix,
293 "bundles/" + pf + "/\\1"
294 ],
295 subdir: jdk_subdir,
296 exploded: "images/jdk"
297 },
298 test: {
299 local: "bundles/\\(jdk.*bin-tests.tar.gz\\)",
300 remote: [
301 "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-tests.tar.gz",
302 "bundles/" + pf + "/\\1"
303 ],
304 exploded: "images/test"
305 },
306 test_demos: {
307 local: "bundles/\\(jdk.*bin-tests-demos.tar.gz\\)",
308 remote: [
309 "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-tests-demos.tar.gz",
310 "bundles/" + pf + "/\\1"
311 ],
312 exploded: "images/test"
313 },
314 jdk_symbols: {
315 local: "bundles/\\(jdk.*bin-symbols.tar.gz\\)",
316 remote: [
317 "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-symbols.tar.gz",
318 "bundles/" + pf + "/\\1"
319 ],
320 subdir: jdk_subdir,
321 exploded: "images/jdk"
322 },
323 static_libs: {
324 local: "bundles/\\(jdk.*bin-static-libs.tar.gz\\)",
325 remote: [
326 "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-static-libs.tar.gz",
327 "bundles/" + pf + "/\\1"
328 ],
329 subdir: jdk_subdir,
330 },
331 }
332 };
333 };
334
335
336 /**
337 * Define common artifacts template for all debug profiles
338 * @param o - Object containing data for artifacts
339 */
340 common.debug_profile_artifacts = function (o) {
341 var jdk_subdir = "jdk-" + data.version + "/fastdebug";
342 var jdk_suffix = (o.jdk_suffix != null ? o.jdk_suffix : "tar.gz");
343 var pf = o.platform
344 return {
345 artifacts: {
346 jdk: {
347 local: "bundles/\\(jdk.*bin-debug." + jdk_suffix + "\\)",
348 remote: [
349 "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-debug." + jdk_suffix,
350 "bundles/" + pf + "/\\1"
351 ],
352 subdir: jdk_subdir,
353 exploded: "images/jdk"
354 },
355 test: {
356 local: "bundles/\\(jdk.*bin-tests-debug.tar.gz\\)",
357 remote: [
358 "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-tests-debug.tar.gz",
359 "bundles/" + pf + "/\\1"
360 ],
361 exploded: "images/test"
362 },
363 jdk_symbols: {
364 local: "bundles/\\(jdk.*bin-debug-symbols.tar.gz\\)",
365 remote: [
366 "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-debug-symbols.tar.gz",
367 "bundles/" + pf + "/\\1"
368 ],
369 subdir: jdk_subdir,
370 exploded: "images/jdk"
371 },
372 static_libs: {
373 local: "bundles/\\(jdk.*bin-static-libs-debug.tar.gz\\)",
374 remote: [
375 "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-static-libs-debug.tar.gz",
376 "bundles/" + pf + "/\\1"
377 ],
378 subdir: jdk_subdir,
379 },
380 }
381 };
382 };
383
384 common.boot_jdk_version = "13";
385 common.boot_jdk_build_number = "33";
386 common.boot_jdk_home = input.get("boot_jdk", "install_path") + "/jdk-"
387 + common.boot_jdk_version
388 + (input.build_os == "macosx" ? ".jdk/Contents/Home" : "");
389
390 return common;
391 };
392
393 /**
394 * Generates the profiles part of the configuration.
395 *
396 * @param input External data to use for generating the configuration
397 * @param common The common values
398 * @returns {{}} Profiles part of the configuration
399 */
400 var getJibProfilesProfiles = function (input, common, data) {
401 // Main SE profiles
402 var profiles = {
403
404 "linux-x64": {
405 target_os: "linux",
406 target_cpu: "x64",
407 dependencies: ["devkit", "graphviz", "pandoc", "graalunit_lib"],
408 configure_args: concat(common.configure_args_64bit,
409 "--enable-full-docs", "--with-zlib=system",
410 (isWsl(input) ? [ "--host=x86_64-unknown-linux-gnu",
411 "--build=x86_64-unknown-linux-gnu" ] : [])),
412 default_make_targets: ["docs-bundles"],
413 },
414
415 "linux-x86": {
416 target_os: "linux",
417 target_cpu: "x86",
418 build_cpu: "x64",
419 dependencies: ["devkit"],
420 configure_args: concat(common.configure_args_32bit,
421 "--with-jvm-variants=minimal,server", "--with-zlib=system"),
422 },
423
424 "macosx-x64": {
425 target_os: "macosx",
426 target_cpu: "x64",
427 dependencies: ["devkit", "pandoc", "graalunit_lib"],
428 configure_args: concat(common.configure_args_64bit, "--with-zlib=system",
429 "--with-macosx-version-max=10.9.0"),
430 },
431
432 "solaris-x64": {
433 target_os: "solaris",
434 target_cpu: "x64",
435 dependencies: ["devkit", "cups"],
436 configure_args: concat(common.configure_args_64bit,
437 "--with-zlib=system", "--enable-dtrace", "--enable-deprecated-ports=yes"),
438 },
439
440 "solaris-sparcv9": {
441 target_os: "solaris",
442 target_cpu: "sparcv9",
443 dependencies: ["devkit", "cups"],
444 configure_args: concat(common.configure_args_64bit,
445 "--with-zlib=system", "--enable-dtrace", "--enable-deprecated-ports=yes"),
446 },
447
448 "windows-x64": {
449 target_os: "windows",
450 target_cpu: "x64",
451 dependencies: ["devkit", "pandoc", "graalunit_lib"],
452 configure_args: concat(common.configure_args_64bit),
453 },
454
455 "windows-x86": {
456 target_os: "windows",
457 target_cpu: "x86",
458 build_cpu: "x64",
459 dependencies: ["devkit"],
460 configure_args: concat(common.configure_args_32bit),
461 },
462
463 "linux-aarch64": {
464 target_os: "linux",
465 target_cpu: "aarch64",
466 build_cpu: "x64",
467 dependencies: ["devkit", "build_devkit", "cups"],
468 configure_args: [
469 "--openjdk-target=aarch64-linux-gnu",
470 ],
471 },
472
473 "linux-arm32": {
474 target_os: "linux",
475 target_cpu: "arm",
476 build_cpu: "x64",
477 dependencies: ["devkit", "build_devkit", "cups"],
478 configure_args: [
479 "--openjdk-target=arm-linux-gnueabihf", "--with-freetype=bundled",
480 "--with-abi-profile=arm-vfp-hflt", "--disable-warnings-as-errors"
481 ],
482 },
483
484 "linux-ppc64le": {
485 target_os: "linux",
486 target_cpu: "ppc64le",
487 build_cpu: "x64",
488 dependencies: ["devkit", "build_devkit", "cups"],
489 configure_args: [
490 "--openjdk-target=ppc64le-linux-gnu", "--with-freetype=bundled",
491 "--disable-warnings-as-errors"
492 ],
493 },
494
495 "linux-s390x": {
496 target_os: "linux",
497 target_cpu: "s390x",
498 build_cpu: "x64",
499 dependencies: ["devkit", "build_devkit", "cups"],
500 configure_args: [
501 "--openjdk-target=s390x-linux-gnu", "--with-freetype=bundled",
502 "--disable-warnings-as-errors"
503 ],
504 },
505 };
506
507 // Add the base settings to all the main profiles
508 common.main_profile_names.forEach(function (name) {
509 profiles[name] = concatObjects(common.main_profile_base, profiles[name]);
510 });
511
512 // Generate debug versions of all the main profiles
513 common.main_profile_names.forEach(function (name) {
514 var debugName = name + common.debug_suffix;
515 profiles[debugName] = concatObjects(profiles[name],
516 common.debug_profile_base);
517 });
518 // Generate slowdebug versions of all the main profiles
519 common.main_profile_names.forEach(function (name) {
520 var debugName = name + common.slowdebug_suffix;
521 profiles[debugName] = concatObjects(profiles[name],
522 common.slowdebug_profile_base);
523 });
524 // Generate testmake profiles for the main profile of each build host
525 // platform. This profile only runs the makefile tests.
526 // Ant is needed to run the idea project generator test.
527 var testmakeBase = {
528 dependencies: [ "ant" ],
529 environment: {
530 "ANT_HOME": input.get("ant", "home_path")
531 }
532 };
533 [ "linux-x64", "macosx-x64", "solaris-sparcv9", "solaris-x64", "windows-x64"]
534 .forEach(function (name) {
535 var maketestName = name + "-testmake";
536 profiles[maketestName] = concatObjects(profiles[name], testmakeBase);
537 profiles[maketestName].default_make_targets = [ "test-make" ];
538 });
539
540 // Generate -gcov profiles
541 [ "linux-aarch64", "linux-x64", "macosx-x64" ].forEach(function (name) {
542 var gcovName = name + "-gcov";
543 profiles[gcovName] = clone(profiles[name]);
544 profiles[gcovName].default_make_targets = ["product-bundles", "test-bundles"];
545 profiles[gcovName].configure_args = concat(profiles[gcovName].configure_args,
546 ["--enable-native-coverage", "--disable-warnings-as-errors"]);
547 });
548
549 // Profiles for building the zero jvm variant. These are used for verification.
550 var zeroProfiles = {
551 "linux-x64-zero": {
552 target_os: "linux",
553 target_cpu: "x64",
554 dependencies: ["devkit"],
555 configure_args: concat(common.configure_args_64bit, [
556 "--with-zlib=system",
557 "--with-jvm-variants=zero",
558 "--enable-libffi-bundling"
559 ])
560 },
561
562 "linux-x86-zero": {
563 target_os: "linux",
564 target_cpu: "x86",
565 build_cpu: "x64",
566 dependencies: ["devkit"],
567 configure_args: concat(common.configure_args_32bit, [
568 "--with-zlib=system",
569 "--with-jvm-variants=zero",
570 "--enable-libffi-bundling"
571 ])
572 }
573 }
574 profiles = concatObjects(profiles, zeroProfiles);
575
576 // Add the base settings to the zero profiles and generate debug profiles
577 Object.keys(zeroProfiles).forEach(function (name) {
578 var debugName = name + common.debug_suffix;
579 profiles[name] = concatObjects(common.main_profile_base, profiles[name]);
580 profiles[debugName] = concatObjects(profiles[name], common.debug_profile_base);
581 });
582
583 // Define a profile with precompiled headers disabled. This is just used for
584 // verfication of this build configuration.
585 var noPchProfiles = {
586 "linux-x64-debug-nopch": {
587 target_os: "linux",
588 target_cpu: "x64",
589 dependencies: ["devkit"],
590 configure_args: concat(common.configure_args_64bit,
591 "--with-zlib=system", "--disable-precompiled-headers"),
592 },
593 };
594 profiles = concatObjects(profiles, noPchProfiles);
595 // Add base settings to noPch profiles
596 Object.keys(noPchProfiles).forEach(function (name) {
597 profiles[name] = concatObjects(common.main_profile_base, profiles[name]);
598 profiles[name] = concatObjects(common.debug_profile_base, profiles[name]);
599 // Override default make target with hotspot as that's the only part of
600 // the build using precompiled headers.
601 profiles[name].default_make_targets = ["hotspot"];
602 });
603
604 // Bootcycle profiles runs the build with itself as the boot jdk. This can
605 // be done in two ways. Either using the builtin bootcycle target in the
606 // build system. Or by supplying the main jdk build as bootjdk to configure.
607 [ "linux-x64", "macosx-x64", "solaris-sparcv9", "windows-x64"]
608 .forEach(function (name) {
609 var bootcycleName = name + "-bootcycle";
610 var bootcyclePrebuiltName = name + "-bootcycle-prebuilt";
611 // The base bootcycle profile just changes the default target
612 // compared to the base profile
613 profiles[bootcycleName] = clone(profiles[name]);
614 profiles[bootcycleName].default_make_targets = [ "bootcycle-images" ];
615 // The prebuilt bootcycle variant modifies the boot jdk argument
616 var bootcyclePrebuiltBase = {
617 dependencies: [ name + ".jdk" ],
618 configure_args: "--with-boot-jdk=" + input.get(name + ".jdk", "home_path"),
619 }
620 profiles[bootcyclePrebuiltName] = concatObjects(profiles[name],
621 bootcyclePrebuiltBase);
622 var bootJdkIndex = profiles[bootcyclePrebuiltName].dependencies.indexOf("boot_jdk");
623 delete profiles[bootcyclePrebuiltName].dependencies[bootJdkIndex];
624 profiles[bootcyclePrebuiltName].default_make_targets = [ "product-images" ];
625 });
626
627 // JCov profiles build JCov-instrumented JDK image based on images provided through dependencies.
628 [ "linux-aarch64", "linux-x64", "macosx-x64", "solaris-sparcv9", "windows-x64"]
629 .forEach(function (name) {
630 var jcovName = name + "-jcov";
631 profiles[jcovName] = clone(common.main_profile_base);
632 profiles[jcovName].target_os = profiles[name].target_os
633 profiles[jcovName].target_cpu = profiles[name].target_cpu
634 profiles[jcovName].default_make_targets = [ "jcov-bundles" ];
635 profiles[jcovName].dependencies = concat(profiles[jcovName].dependencies,
636 [ name + ".jdk", "devkit" ]);
637 profiles[jcovName].configure_args = concat(profiles[jcovName].configure_args,
638 ["--with-jcov-input-jdk=" + input.get(name + ".jdk", "home_path")]);
639 });
640
641 //
642 // Define artifacts for profiles
643 //
644 // Macosx bundles are named osx
645 // tar.gz.
646 var artifactData = {
647 "linux-x64": {
648 platform: "linux-x64",
649 },
650 "linux-x86": {
651 platform: "linux-x86",
652 },
653 "macosx-x64": {
654 platform: "osx-x64",
655 jdk_subdir: "jdk-" + data.version + ".jdk/Contents/Home",
656 },
657 "solaris-x64": {
658 platform: "solaris-x64",
659 },
660 "solaris-sparcv9": {
661 platform: "solaris-sparcv9",
662 },
663 "windows-x64": {
664 platform: "windows-x64",
665 jdk_suffix: "zip",
666 },
667 "windows-x86": {
668 platform: "windows-x86",
669 jdk_suffix: "zip",
670 },
671 "linux-aarch64": {
672 platform: "linux-aarch64",
673 },
674 "linux-arm32": {
675 platform: "linux-arm32",
676 },
677 "linux-ppc64le": {
678 platform: "linux-ppc64le",
679 },
680 "linux-s390x": {
681 platform: "linux-s390x",
682 }
683 }
684 // Generate common artifacts for all main profiles
685 Object.keys(artifactData).forEach(function (name) {
686 profiles[name] = concatObjects(profiles[name],
687 common.main_profile_artifacts(artifactData[name]));
688 });
689
690 // Generate common artifacts for all debug profiles
691 Object.keys(artifactData).forEach(function (name) {
692 var debugName = name + common.debug_suffix;
693 profiles[debugName] = concatObjects(profiles[debugName],
694 common.debug_profile_artifacts(artifactData[name]));
695 });
696
697 profilesArtifacts = {
698 "linux-x64": {
699 artifacts: {
700 doc_api_spec: {
701 local: "bundles/\\(jdk.*doc-api-spec.tar.gz\\)",
702 remote: [
703 "bundles/common/jdk-" + data.version + "_doc-api-spec.tar.gz",
704 "bundles/linux-x64/\\1"
705 ],
706 },
707 }
708 }
709 };
710 profiles = concatObjects(profiles, profilesArtifacts);
711
712 // Generate open only profiles for all the main and debug profiles.
713 // Rewrite artifact remote paths by adding "openjdk/GPL".
714 common.main_profile_names.forEach(function (name) {
715 var openName = name + common.open_suffix;
716 profiles[openName] = concatObjects(profiles[name],
717 common.open_profile_base);
718 for (artifactName in profiles[openName].artifacts) {
719 var artifact = profiles[openName].artifacts[artifactName];
720 artifact.remote = replaceAll(
721 "bundles\/", "bundles/openjdk/GPL/",
722 (artifact.remote != null ? artifact.remote : artifact.local));
723 }
724 var debugName = name + common.debug_suffix;
725 var openDebugName = name + common.open_suffix + common.debug_suffix;
726 profiles[openDebugName] = concatObjects(profiles[debugName],
727 common.open_profile_base);
728 for (artifactName in profiles[openDebugName].artifacts) {
729 var artifact = profiles[openDebugName].artifacts[artifactName];
730 artifact.remote = replaceAll(
731 "bundles\/", "bundles/openjdk/GPL/",
732 (artifact.remote != null ? artifact.remote : artifact.local));
733 }
734 });
735
736 // Define the reference implementation profiles. These are basically the same
737 // as the open profiles, but upload artifacts to a different location.
738 common.main_profile_names.forEach(function (name) {
739 var riName = name + "-ri";
740 var riDebugName = riName + common.debug_suffix;
741 var openName = name + common.open_suffix;
742 var openDebugName = openName + common.debug_suffix;
743 profiles[riName] = clone(profiles[openName]);
744 profiles[riDebugName] = clone(profiles[openDebugName]);
745 // Rewrite all remote dirs to "bundles/openjdk/BCL/..."
746 for (artifactName in profiles[riName].artifacts) {
747 var artifact = profiles[riName].artifacts[artifactName];
748 artifact.remote = replaceAll(
749 "\/GPL\/", "/BCL/",
750 (artifact.remote != null ? artifact.remote : artifact.local));
751 }
752 });
753
754 // For open profiles, the non-debug jdk bundles, need an "open" prefix on the
755 // remote bundle names, forming the word "openjdk". See JDK-8188789.
756 common.main_profile_names.forEach(function (name) {
757 var openName = name + common.open_suffix;
758 profiles[openName].artifacts["jdk"].remote = replaceAll(
759 "\/jdk-", "/openjdk-",
760 replaceAll("\/\\1", "/open\\1",
761 profiles[openName].artifacts["jdk"].remote));
762 });
763
764 // Generate cmp-baseline profiles for each main profile and their
765 // corresponding debug profile. This profile does a compare build run with no
766 // changes to verify that the compare script has a clean baseline
767 common.main_profile_names.forEach(function (name) {
768 [ "", common.open_suffix ].forEach(function (suffix) {
769 var cmpBaselineName = name + suffix + "-cmp-baseline";
770 profiles[cmpBaselineName] = clone(profiles[name + suffix]);
771 // Only compare the images target. This should pressumably be expanded
772 // to include more build targets when possible.
773 profiles[cmpBaselineName].default_make_targets = [ "images", "test-image" ];
774 if (name == "linux-x64") {
775 profiles[cmpBaselineName].default_make_targets
776 = concat(profiles[cmpBaselineName].default_make_targets, "docs");
777 }
778 profiles[cmpBaselineName].make_args = [ "COMPARE_BUILD=CONF=" ];
779 // Do not inherit artifact definitions from base profile
780 delete profiles[cmpBaselineName].artifacts;
781 });
782 });
783
784 // Artifacts of JCov profiles
785 [ "linux-aarch64", "linux-x64", "macosx-x64", "solaris-sparcv9", "windows-x64"]
786 .forEach(function (name) {
787 var o = artifactData[name]
788 var jdk_subdir = (o.jdk_subdir != null ? o.jdk_subdir : "jdk-" + data.version);
789 var jdk_suffix = (o.jdk_suffix != null ? o.jdk_suffix : "tar.gz");
790 var pf = o.platform
791 var jcovName = name + "-jcov";
792 profiles[jcovName].artifacts = {
793 jdk: {
794 local: "bundles/\\(jdk-jcov.*bin." + jdk_suffix + "\\)",
795 remote: [
796 "bundles/" + pf + "/jdk-jcov-" + data.version + "_" + pf + "_bin." + jdk_suffix
797 ],
798 subdir: jdk_subdir,
799 exploded: "images/jdk-jcov"
800 }
801 };
802 });
803
804 // Artifacts of gcov (native-code-coverage) profiles
805 [ "linux-aarch64", "linux-x64", "macosx-x64" ].forEach(function (name) {
806 var o = artifactData[name]
807 var pf = o.platform
808 var jdk_subdir = (o.jdk_subdir != null ? o.jdk_subdir : "jdk-" + data.version);
809 var jdk_suffix = (o.jdk_suffix != null ? o.jdk_suffix : "tar.gz");
810 var gcovName = name + "-gcov";
811 profiles[gcovName].artifacts = {
812 jdk: {
813 local: "bundles/\\(jdk.*bin." + jdk_suffix + "\\)",
814 remote: [
815 "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-gcov." + jdk_suffix,
816 ],
817 subdir: jdk_subdir,
818 exploded: "images/jdk",
819 },
820 test: {
821 local: "bundles/\\(jdk.*bin-tests.tar.gz\\)",
822 remote: [
823 "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-gcov-tests.tar.gz",
824 ],
825 exploded: "images/test"
826 },
827 jdk_symbols: {
828 local: "bundles/\\(jdk.*bin-symbols.tar.gz\\)",
829 remote: [
830 "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-gcov-symbols.tar.gz",
831 ],
832 subdir: jdk_subdir,
833 exploded: "images/jdk"
834 },
835 };
836 });
837
838 // Profiles used to run tests.
839 var testOnlyProfiles = {
840 "run-test": {
841 target_os: input.build_os,
842 target_cpu: input.build_cpu,
843 dependencies: [ "jtreg", "jtregMW", "gnumake", "boot_jdk", "devkit", "jib" ],
844 labels: "test",
845 environment: {
846 "JT_JAVA": common.boot_jdk_home
847 }
848 }
849 };
850 profiles = concatObjects(profiles, testOnlyProfiles);
851
852 // Profiles used to run tests using Jib for internal dependencies.
853 var testedProfile = input.testedProfile;
854 if (testedProfile == null) {
855 testedProfile = input.build_os + "-" + input.build_cpu;
856 }
857 var testedProfileJdk = testedProfile + ".jdk";
858 // Make it possible to use the test image from a different profile
859 var testImageProfile;
860 if (input.testImageProfile != null) {
861 testImageProfile = input.testImageProfile;
862 } else if (testedProfile.endsWith("-jcov")) {
863 testImageProfile = testedProfile.substring(0, testedProfile.length - "-jcov".length);
864 } else {
865 testImageProfile = testedProfile;
866 }
867 var testedProfileTest = testImageProfile + ".test"
868 var testOnlyMake = [ "test-prebuilt", "LOG_CMDLINES=true", "JTREG_VERBOSE=fail,error,time" ];
869 if (testedProfile.endsWith("-gcov")) {
870 testOnlyMake = concat(testOnlyMake, "GCOV_ENABLED=true")
871 }
872 var testOnlyProfilesPrebuilt = {
873 "run-test-prebuilt": {
874 target_os: input.build_os,
875 target_cpu: input.build_cpu,
876 dependencies: [
877 "jtreg", "jtregMW", "gnumake", "boot_jdk", "devkit", "jib", "jcov", testedProfileJdk,
878 testedProfileTest
879 ],
880 src: "src.conf",
881 make_args: testOnlyMake,
882 environment: {
883 "BOOT_JDK": common.boot_jdk_home,
884 "JDK_IMAGE_DIR": input.get(testedProfileJdk, "home_path"),
885 "TEST_IMAGE_DIR": input.get(testedProfileTest, "home_path")
886 },
887 labels: "test"
888 }
889 };
890
891 // If actually running the run-test-prebuilt profile, verify that the input
892 // variable is valid and if so, add the appropriate target_* values from
893 // the tested profile. Use testImageProfile value as backup.
894 if (input.profile == "run-test-prebuilt") {
895 if (profiles[testedProfile] == null && profiles[testImageProfile] == null) {
896 error("testedProfile is not defined: " + testedProfile + " " + testImageProfile);
897 }
898 }
899 if (profiles[testedProfile] != null) {
900 testOnlyProfilesPrebuilt["run-test-prebuilt"]["target_os"]
901 = profiles[testedProfile]["target_os"];
902 testOnlyProfilesPrebuilt["run-test-prebuilt"]["target_cpu"]
903 = profiles[testedProfile]["target_cpu"];
904 } else if (profiles[testImageProfile] != null) {
905 testOnlyProfilesPrebuilt["run-test-prebuilt"]["target_os"]
906 = profiles[testImageProfile]["target_os"];
907 testOnlyProfilesPrebuilt["run-test-prebuilt"]["target_cpu"]
908 = profiles[testImageProfile]["target_cpu"];
909 }
910 profiles = concatObjects(profiles, testOnlyProfilesPrebuilt);
911
912 // On macosx add the devkit bin dir to the path in all the run-test profiles.
913 // This gives us a guaranteed working version of lldb for the jtreg failure handler.
914 if (input.build_os == "macosx") {
915 macosxRunTestExtra = {
916 environment_path: input.get("devkit", "install_path")
917 + "/Xcode.app/Contents/Developer/usr/bin"
918 };
919 profiles["run-test"] = concatObjects(profiles["run-test"], macosxRunTestExtra);
920 profiles["run-test-prebuilt"] = concatObjects(profiles["run-test-prebuilt"], macosxRunTestExtra);
921 }
922 // On windows we want the debug symbols available at test time
923 if (input.build_os == "windows") {
924 windowsRunTestPrebuiltExtra = {
925 dependencies: [ testedProfile + ".jdk_symbols" ],
926 environment: {
927 "SYMBOLS_IMAGE_DIR": input.get(testedProfile + ".jdk_symbols", "home_path"),
928 }
929 };
930 profiles["run-test-prebuilt"] = concatObjects(profiles["run-test-prebuilt"],
931 windowsRunTestPrebuiltExtra);
932 }
933
934 // The profile run-test-prebuilt defines src.conf as the src bundle. When
935 // running in Mach 5, this reduces the time it takes to populate the
936 // considerably. But with just src.conf, we cannot actually run any tests,
937 // so if running from a workspace with just src.conf in it, we need to also
938 // get src.full as a dependency, and define the work_dir (where make gets
939 // run) to be in the src.full install path. By running in the install path,
940 // the same cached installation of the full src can be reused for multiple
941 // test tasks. Care must however be taken not to polute that work dir by
942 // setting the appropriate make variables to control output directories.
943 //
944 // Use the existance of the top level README as indication of if this is
945 // the full source or just src.conf.
946 if (!new java.io.File(__DIR__, "../../README").exists()) {
947 var runTestPrebuiltSrcFullExtra = {
948 dependencies: "src.full",
949 work_dir: input.get("src.full", "install_path"),
950 }
951 profiles["run-test-prebuilt"] = concatObjects(profiles["run-test-prebuilt"],
952 runTestPrebuiltSrcFullExtra);
953 }
954
955 // Generate the missing platform attributes
956 profiles = generatePlatformAttributes(profiles);
957 profiles = generateDefaultMakeTargetsConfigureArg(common, profiles);
958 return profiles;
959 };
960
961 /**
962 * Generate the dependencies part of the configuration
963 *
964 * @param input External data to use for generating the configuration
965 * @param common The common values
966 * @returns {{}} Dependencies part of configuration
967 */
968 var getJibProfilesDependencies = function (input, common) {
969
970 var devkit_platform_revisions = {
971 linux_x64: "gcc8.3.0-OL6.4+1.0",
972 macosx_x64: "Xcode10.1-MacOSX10.14+1.0",
973 solaris_x64: "SS12u4-Solaris11u1+1.0",
974 solaris_sparcv9: "SS12u6-Solaris11u3+1.0",
975 windows_x64: "VS2017-15.9.16+1.0",
976 linux_aarch64: "gcc8.3.0-OL7.6+1.0",
977 linux_arm: "gcc8.2.0-Fedora27+1.0",
978 linux_ppc64le: "gcc8.2.0-Fedora27+1.0",
979 linux_s390x: "gcc8.2.0-Fedora27+1.0"
980 };
981
982 var devkit_platform = (input.target_cpu == "x86"
983 ? input.target_os + "_x64"
984 : input.target_platform);
985
986 var devkit_cross_prefix = "";
987 if (input.build_platform != input.target_platform
988 && input.build_platform != devkit_platform) {
989 devkit_cross_prefix = input.build_platform + "-to-";
990 }
991
992 var boot_jdk_platform = (input.build_os == "macosx" ? "osx" : input.build_os)
993 + "-" + input.build_cpu;
994 var boot_jdk_ext = (input.build_os == "windows" ? ".zip" : ".tar.gz")
995 // If running in WSL and building for Windows, it will look like Linux,
996 // but we need a Windows boot JDK.
997 if (isWsl(input) && input.target_os == "windows") {
998 boot_jdk_platform = "windows-" + input.build_cpu;
999 boot_jdk_ext = ".zip";
1000 }
1001
1002 var makeBinDir = (input.build_os == "windows"
1003 ? input.get("gnumake", "install_path") + "/cygwin/bin"
1004 : input.get("gnumake", "install_path") + "/bin");
1005
1006 if (input.build_cpu == 'aarch64') {
1007 boot_jdk = {
1008 organization: common.organization,
1009 ext: "tar.gz",
1010 module: "jdk-linux_aarch64",
1011 revision: "13+1.0",
1012 configure_args: "--with-boot-jdk=" + common.boot_jdk_home,
1013 environment_path: common.boot_jdk_home + "/bin"
1014 }
1015 } else {
1016 boot_jdk = {
1017 server: "jpg",
1018 product: "jdk",
1019 version: common.boot_jdk_version,
1020 build_number: common.boot_jdk_build_number,
1021 file: "bundles/" + boot_jdk_platform + "/jdk-" + common.boot_jdk_version + "_"
1022 + boot_jdk_platform + "_bin" + boot_jdk_ext,
1023 configure_args: "--with-boot-jdk=" + common.boot_jdk_home,
1024 environment_path: common.boot_jdk_home + "/bin"
1025 }
1026 }
1027
1028 var dependencies = {
1029 boot_jdk: boot_jdk,
1030
1031 devkit: {
1032 organization: common.organization,
1033 ext: "tar.gz",
1034 module: "devkit-" + devkit_cross_prefix + devkit_platform,
1035 revision: devkit_platform_revisions[devkit_platform],
1036 environment: {
1037 "DEVKIT_HOME": input.get("devkit", "home_path"),
1038 }
1039 },
1040
1041 build_devkit: {
1042 organization: common.organization,
1043 ext: "tar.gz",
1044 module: "devkit-" + input.build_platform,
1045 revision: devkit_platform_revisions[input.build_platform]
1046 },
1047
1048 cups: {
1049 organization: common.organization,
1050 ext: "tar.gz",
1051 revision: "1.0118+1.0"
1052 },
1053
1054 jtreg: {
1055 server: "jpg",
1056 product: "jtreg",
1057 version: "5.0",
1058 build_number: "b01",
1059 checksum_file: "MD5_VALUES",
1060 file: "bundles/jtreg_bin-5.0.zip",
1061 environment_name: "JT_HOME",
1062 environment_path: input.get("jtreg", "install_path") + "/jtreg/bin"
1063 },
1064
1065 jtregMW: {
1066 organization: common.organization,
1067 ext: "zip",
1068 revision: "5.0-virtual-1.1",
1069 environment_name: "JT_HOME_MW",
1070 environment_path: input.get("jtreg", "install_path") + "/jtreg/bin"
1071 },
1072
1073 jmh: {
1074 organization: common.organization,
1075 ext: "tar.gz",
1076 revision: "1.21+1.0"
1077 },
1078
1079 jcov: {
1080 // Until an official build of JCov is available, use custom
1081 // build to support classfile version 57.
1082 // See CODETOOLS-7902358 for more info.
1083 // server: "jpg",
1084 // product: "jcov",
1085 // version: "3.0",
1086 // build_number: "b07",
1087 // file: "bundles/jcov-3_0.zip",
1088 organization: common.organization,
1089 revision: "3.0-59-support+1.0",
1090 ext: "zip",
1091 environment_name: "JCOV_HOME",
1092 },
1093
1094 gnumake: {
1095 organization: common.organization,
1096 ext: "tar.gz",
1097 revision: "4.0+1.0",
1098
1099 module: (input.build_os == "windows"
1100 ? "gnumake-" + input.build_osenv_platform
1101 : "gnumake-" + input.build_platform),
1102
1103 configure_args: "MAKE=" + makeBinDir + "/make",
1104
1105 environment: {
1106 "MAKE": makeBinDir + "/make"
1107 },
1108
1109 environment_path: makeBinDir
1110 },
1111
1112 autoconf: {
1113 organization: common.organization,
1114 ext: "tar.gz",
1115 revision: "2.69+1.0.1",
1116 module: (input.build_os == "windows"
1117 ? "autoconf-" + input.build_osenv_platform
1118 : "autoconf-" + input.build_platform),
1119 configure_args: "",
1120 environment_path: input.get("autoconf", "install_path")
1121 },
1122
1123 graphviz: {
1124 organization: common.organization,
1125 ext: "tar.gz",
1126 revision: "2.38.0-1+1.1",
1127 module: "graphviz-" + input.target_platform,
1128 configure_args: "DOT=" + input.get("graphviz", "install_path") + "/dot",
1129 environment_path: input.get("graphviz", "install_path")
1130 },
1131
1132 pandoc: {
1133 organization: common.organization,
1134 ext: "tar.gz",
1135 revision: "2.3.1+1.0",
1136 module: "pandoc-" + input.build_platform,
1137 configure_args: "PANDOC=" + input.get("pandoc", "install_path") + "/pandoc/pandoc",
1138 environment_path: input.get("pandoc", "install_path") + "/pandoc"
1139 },
1140
1141 // This adds java jib as a dependency for the test artifacts resolver
1142 jib: {
1143 organization: "com.oracle.java.jib",
1144 ext: "zip",
1145 classifier: "distribution",
1146 revision: "3.0-SNAPSHOT",
1147 environment_name: "JIB_HOME",
1148 environment_value: input.get("jib", "home_path")
1149 },
1150
1151 ant: {
1152 organization: common.organization,
1153 ext: "zip",
1154 revision: "1.7.1+1.0",
1155 configure_args: "",
1156 },
1157
1158 graalunit_lib: {
1159 organization: common.organization,
1160 ext: "zip",
1161 revision: "619_Apr_12_2018",
1162 module: "graalunit-lib",
1163 configure_args: "--with-graalunit-lib=" + input.get("graalunit_lib", "install_path"),
1164 environment_name: "GRAALUNIT_LIB"
1165 },
1166 };
1167
1168 return dependencies;
1169 };
1170
1171 /**
1172 * Generate the missing platform attributes for profiles
1173 *
1174 * @param profiles Profiles map to generate attributes on
1175 * @returns {{}} New profiles map with platform attributes fully filled in
1176 */
1177 var generatePlatformAttributes = function (profiles) {
1178 var ret = concatObjects(profiles, {});
1179 for (var profile in profiles) {
1180 if (ret[profile].build_os == null) {
1181 ret[profile].build_os = ret[profile].target_os;
1182 }
1183 if (ret[profile].build_cpu == null) {
1184 ret[profile].build_cpu = ret[profile].target_cpu;
1185 }
1186 ret[profile].target_platform = ret[profile].target_os + "_" + ret[profile].target_cpu;
1187 ret[profile].build_platform = ret[profile].build_os + "_" + ret[profile].build_cpu;
1188 }
1189 return ret;
1190 };
1191
1192 /**
1193 * The default_make_targets attribute on a profile is not a real Jib attribute.
1194 * This function rewrites that attribute into the corresponding configure arg.
1195 * Calling this function multiple times on the same profiles object is safe.
1196 *
1197 * @param common Common values
1198 * @param profiles Profiles map to rewrite profiles for
1199 * @returns {{}} New map of profiles with the make targets converted
1200 */
1201 var generateDefaultMakeTargetsConfigureArg = function (common, profiles) {
1202 var ret = concatObjects(profiles, {});
1203 for (var profile in ret) {
1204 if (ret[profile]["default_make_targets"] != null) {
1205 var targetsString = concat(ret[profile].default_make_targets).join(" ");
1206 // Iterate over all configure args and see if --with-default-make-target
1207 // is already there and change it, otherwise add it.
1208 var found = false;
1209 for (var i in ret[profile].configure_args) {
1210 var arg = ret[profile].configure_args[i];
1211 if (arg != null && arg.startsWith("--with-default-make-target=")) {
1212 found = true;
1213 ret[profile].configure_args[i]
1214 = "--with-default-make-target=" + targetsString;
1215 }
1216 }
1217 if (!found) {
1218 ret[profile].configure_args = concat(
1219 ret[profile].configure_args,
1220 "--with-default-make-target=" + targetsString);
1221 }
1222 }
1223 }
1224 return ret;
1225 }
1226
1227 var getBuildId = function (input) {
1228 if (input.build_id != null) {
1229 return input.build_id;
1230 } else {
1231 var topdir = new java.io.File(__DIR__, "../..").getCanonicalFile().getName();
1232 var userName = java.lang.System.getProperty("user.name");
1233 return userName + "." + topdir;
1234 }
1235 }
1236
1237 /**
1238 * Deep clones an object tree.
1239 *
1240 * @param o Object to clone
1241 * @returns {{}} Clone of o
1242 */
1243 var clone = function (o) {
1244 return JSON.parse(JSON.stringify(o));
1245 };
1246
1247 /**
1248 * Concatenates all arguments into a new array
1249 *
1250 * @returns {Array.<T>} New array containing all arguments
1251 */
1252 var concat = function () {
1253 return Array.prototype.concat.apply([], arguments);
1254 };
1255
1256 /**
1257 * Takes a String or Array of Strings and does a replace operation on each
1258 * of them.
1259 *
1260 * @param pattern Pattern to look for
1261 * @param replacement Replacement text to insert
1262 * @param a String or Array of Strings to replace
1263 * @returns {Array} Either a new array or a new string depending on the input
1264 */
1265 var replaceAll = function (pattern, replacement, a) {
1266 // If a is an array
1267 if (Array === a.constructor) {
1268 var newA = [];
1269 for (var i in a) {
1270 newA.push(a[i].replace(pattern, replacement));
1271 }
1272 return newA;
1273 } else {
1274 return a.replace(pattern, replacement);
1275 }
1276 };
1277
1278 /**
1279 * Deep concatenation of two objects. For each node encountered, merge
1280 * the contents with the corresponding node in the other object tree,
1281 * treating all strings as array elements.
1282 *
1283 * @param o1 Object to concatenate
1284 * @param o2 Object to concatenate
1285 * @returns {{}} New object tree containing the concatenation of o1 and o2
1286 */
1287 var concatObjects = function (o1, o2) {
1288 if (o1 == null) {
1289 return clone(o2);
1290 }
1291 if (o2 == null) {
1292 return clone(o1);
1293 }
1294 var ret = {};
1295 for (var a in o1) {
1296 if (o2[a] == null) {
1297 ret[a] = clone(o1[a]);
1298 }
1299 }
1300 for (var a in o2) {
1301 if (o1[a] == null) {
1302 ret[a] = clone(o2[a]);
1303 } else {
1304 if (typeof o1[a] == 'string') {
1305 ret[a] = clone([o1[a]].concat(o2[a]));
1306 } else if (Array.isArray(o1[a])) {
1307 ret[a] = clone(o1[a].concat(o2[a]));
1308 } else if (typeof o1[a] == 'object') {
1309 ret[a] = concatObjects(o1[a], o2[a]);
1310 }
1311 }
1312 }
1313 return ret;
1314 };
1315
1316 /**
1317 * Constructs the numeric version string from reading the
1318 * make/autoconf/version-numbers file and removing all trailing ".0".
1319 *
1320 * @param feature Override feature version
1321 * @param interim Override interim version
1322 * @param update Override update version
1323 * @param patch Override patch version
1324 * @returns {String} The numeric version string
1325 */
1326 var getVersion = function (feature, interim, update, patch) {
1327 var version_numbers = getVersionNumbers();
1328 var version = (feature != null ? feature : version_numbers.get("DEFAULT_VERSION_FEATURE"))
1329 + "." + (interim != null ? interim : version_numbers.get("DEFAULT_VERSION_INTERIM"))
1330 + "." + (update != null ? update : version_numbers.get("DEFAULT_VERSION_UPDATE"))
1331 + "." + (patch != null ? patch : version_numbers.get("DEFAULT_VERSION_PATCH"))
1332 + "." + version_numbers.get("DEFAULT_VERSION_EXTRA1")
1333 + "." + version_numbers.get("DEFAULT_VERSION_EXTRA2")
1334 + "." + version_numbers.get("DEFAULT_VERSION_EXTRA3");
1335 while (version.match(".*\\.0$")) {
1336 version = version.substring(0, version.length - 2);
1337 }
1338 return version;
1339 };
1340
1341 /**
1342 * Constructs the common version configure args based on build type and
1343 * other version inputs
1344 */
1345 var versionArgs = function(input, common) {
1346 var args = ["--with-version-build=" + common.build_number];
1347 if (input.build_type == "promoted") {
1348 args = concat(args,
1349 "--with-version-pre=" + version_numbers.get("DEFAULT_PROMOTED_VERSION_PRE"),
1350 "--without-version-opt");
1351 } else if (input.build_type == "ci") {
1352 var optString = input.build_id_data.ciBuildNumber;
1353 var preString = input.build_id_data.projectName;
1354 if (preString == "jdk") {
1355 preString = version_numbers.get("DEFAULT_PROMOTED_VERSION_PRE");
1356 }
1357 args = concat(args, "--with-version-pre=" + preString,
1358 "--with-version-opt=" + optString);
1359 } else {
1360 args = concat(args, "--with-version-opt=" + common.build_id);
1361 }
1362 return args;
1363 }
1364
1365 // Properties representation of the make/autoconf/version-numbers file. Lazily
1366 // initiated by the function below.
1367 var version_numbers;
1368
1369 /**
1370 * Read the make/autoconf/version-numbers file into a Properties object.
1371 *
1372 * @returns {java.utilProperties}
1373 */
1374 var getVersionNumbers = function () {
1375 // Read version information from make/autoconf/version-numbers
1376 if (version_numbers == null) {
1377 version_numbers = new java.util.Properties();
1378 var stream = new java.io.FileInputStream(__DIR__ + "/../autoconf/version-numbers");
1379 version_numbers.load(stream);
1380 stream.close();
1381 }
1382 return version_numbers;
1383 }
1384
1385 /**
1386 * Returns true if running in Windows Subsystem for Linux. Jib does not yet
1387 * detect wsl as osenv, so fall back on linux with version containing Microsoft.
1388 */
1389 var isWsl = function (input) {
1390 return ( input.build_osenv == "wsl"
1391 || (input.build_os == "linux"
1392 && java.lang.System.getProperty("os.version").contains("Microsoft")));
1393 }
1394
1395 var error = function (s) {
1396 java.lang.System.err.println("[ERROR] " + s);
1397 exit(1);
1398 };