/* *ThisfiledefinesbuildprofilesfortheJIBtoolandothers. * *Abuildprofiledefinesasetofconfigurationoptionsandexternal *dependenciesthatweforsomereasonorothercareaboutspecifically. *Typically,buildprofilesaredefinedforthebuildconfigurationswe *buildregularly. * *Contractagainstthisfilefromthetoolsthatuseit,istoprovide *afunctionontheform: * *getJibProfiles(input) * *whichreturnsanobjectgraphdescribingtheprofilesandtheir *dependencies.Thenameofthefunctionisbasedonthenameofthis *file,minustheextensionandthe'-',camelcasedandprefixedwith *'get'. * * *Theparameter'input'isanobjectthatoptionallycontainssomedata. *Optionallybecauseatoolmayreadtheconfigurationfordifferentpurposes. *Toinitiallygetalistofavailableprofiles,theactiveprofilemaynot *yetbeknownforinstance. * *Datathatmaybesetontheinputobject: * *input.profile=<nameofactiveprofile> * *Iftheactiveprofileisset,thefollowingdatafromitmustalso *beprovided: * *input.profile *input.build_id *input.target_os *input.target_cpu *input.build_os *input.build_cpu *input.target_platform *input.build_platform *// The build_osenv_* variables describe the unix layer on Windows systems, *// i.e. Cygwin, which may also be 32 or 64 bit. *input.build_osenv *input.build_osenv_cpu *input.build_osenv_platform *input.build_osenv_version * *Formorecomplexnestedattributes,thereisamethod"get": * *input.get("<dependency>","<attribute>") * *Validattributesare: *install_path *download_path *download_dir *home_path * * *Theoutputdatageneratedbythisconfigurationfilehasthefollowing *format: * *data:{ *// Identifies the version of this format to the tool reading it *format_version:"1.0", * *// Name of base outputdir. JIB assumes the actual output dir is formed *// by adding the configuration name: <output_basedir>/<config-name> *output_basedir:"build", *// Configure argument to use to specify configuration name *configuration_configure_arg: *// Make argument to use to specify configuration name *configuration_make_arg: * *profiles:{ *<profile-name>:{ *// Name of os the profile is built to run on *target_os;<string> *// Name of cpu the profile is built to run on *target_cpu;<string> *// Combination of target_os and target_cpu for convenience *target_platform;<string> *// Name of os the profile is built on *build_os;<string> *// Name of cpu the profile is built on *build_cpu;<string> *// Combination of build_os and build_cpu for convenience *build_platform;<string> * *// List of dependencies needed to build this profile *dependencies:<Arrayofstrings> * *// List of configure args to use for this profile *configure_args:<Arrayofstrings> * *// List of free form labels describing aspects of this profile *labels:<Arrayofstrings> *} *} * *// Dependencies use a Maven like deployment structure *dependencies:{ *<dependency-name>:{ *// Organization part of path defining this dependency *organization:<string> *// File extension for this dependency *ext:<string> *// Module part of path for defining this dependency, *// defaults to <dependency-name> *module:<string> *// Revision part of path for defining this dependency *revision:<string> * *// List of configure args to add when using this dependency, *// defaults to *// "--with-<dependency-name>=input.get("<dependency-name", "install_path")" *configure_args:<arrayofstrings> * *// Name of environment variable to set when using this dependency *// when running make *environment_name:<string> *// Value of environment variable to set when using this dependency *// when running make *environment_value:<string> * *// Value to add to the PATH variable when using this dependency, *// applies to both make and configure *environment_path:<string> *} * *<dependency-name>:{ *// For certain dependencies where a legacy distribution mechanism is *// already in place, the "javare" server layout is also supported *// Indicate that an alternate server source and layout should be used *server:"javare" * *// For "javare", a combination of module, revision, *// build number (optional), files and checksum file is possible for *// artifacts following the standard layout. *module:<string> *revision:<string> *build_number:<string> *checksum_file:<string> *file:<string> * *// For other files, use checksum path and path instead *checksum_path:<string> *path:<string> *} *} *}
*/
/** *Mainentrytogeneratetheprofileconfiguration * *@paraminputExternaldatatouseforgeneratingtheconfiguration *@returns{{}}Profileconfiguration
*/ var getJibProfiles = function (input) {
var data = {};
// Identifies the version of this format to the tool reading it. // 1.1 signifies that the publish, publish-src and get-src features are usable. // 1.2 signifies that artifact uploads should fail on missing artifacts by default. // 1.3 input.get(<dep>, "home_path") automatically goes down into a single top // dir just like default configure_args and environment_path variables.
data.format_version = "1.3";
// Organization, product and version are used when uploading/publishing build results
data.organization = "";
data.product = "jdk";
data.version = getVersion();
// The base directory for the build output. JIB will assume that the // actual build directory will be <output_basedir>/<configuration>
data.output_basedir = "build"; // The configure argument to use to specify the name of the configuration
data.configuration_configure_arg = "--with-conf-name="; // The make argument to use to specify the name of the configuration
data.configuration_make_arg = "CONF_NAME=";
// Exclude list to use when Jib creates a source bundle
data.src_bundle_excludes = [ "build", "{,**/}webrev*", "{,**/}.hg", "{,**/}JTwork*", "{,**/}JTreport*", "{,**/}.git"
]; // Include list to use when creating a minimal jib source bundle which // contains just the jib configuration files.
data.conf_bundle_includes = [ "make/conf/version-numbers.conf",
];
// Define some common values var common = getJibProfilesCommon(input, data); // Generate the profiles part of the configuration
data.profiles = getJibProfilesProfiles(input, common, data); // Generate the dependencies part of the configuration
data.dependencies = getJibProfilesDependencies(input, common, data);
return data;
};
/** *Generatessomecommonvalues * *@paraminputExternaldatatouseforgeneratingtheconfiguration *@returnsCommonvalues
*/ var getJibProfilesCommon = function (input, data) { var common = {};
// List of the main profile names used for iteration
common.main_profile_names = [ "linux-x64", "linux-x86", "macosx-x64", "macosx-aarch64", "windows-x64", "windows-x86", "windows-aarch64", "linux-aarch64", "linux-arm32", "linux-ppc64le", "linux-s390x"
];
// These are the base settings for all the main build profiles.
common.main_profile_base = {
dependencies: ["boot_jdk", "gnumake", "jtreg", "jib", "autoconf", "jmh", "jcov"],
default_make_targets: ["product-bundles", "test-bundles", "static-libs-bundles"],
configure_args: concat("--enable-jtreg-failure-handler", "--with-exclude-translations=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", "--disable-manpages", "--disable-jvm-feature-shenandoahgc",
versionArgs(input, common))
};
// Extra settings for debug profiles
common.debug_suffix = "-debug";
common.debug_profile_base = {
configure_args: ["--enable-debug"],
labels: "debug"
}; // Extra settings for slowdebug profiles
common.slowdebug_suffix = "-slowdebug";
common.slowdebug_profile_base = {
configure_args: ["--with-debug-level=slowdebug"],
labels: "slowdebug"
}; // Extra settings for optimized profiles
common.optimized_suffix = "-optimized";
common.optimized_profile_base = {
configure_args: ["--with-debug-level=optimized"],
labels: "optimized",
}; // Extra settings for openjdk only profiles
common.open_suffix = "-open";
common.open_profile_base = {
configure_args: ["--enable-openjdk-only"],
labels: "open"
};
/** *Generatestheprofilespartoftheconfiguration. * *@paraminputExternaldatatouseforgeneratingtheconfiguration *@paramcommonThecommonvalues *@returns{{}}Profilespartoftheconfiguration
*/ var getJibProfilesProfiles = function (input, common, data) { // Main SE profiles var profiles = {
"macosx-x64": {
target_os: "macosx",
target_cpu: "x64",
dependencies: ["devkit", "gtest", "pandoc"],
configure_args: concat(common.configure_args_64bit, "--with-zlib=system", "--with-macosx-version-max=10.12.00", "--enable-compatible-cds-alignment", // Use system SetFile instead of the one in the devkit as the // devkit one may not work on Catalina. "SETFILE=/usr/bin/SetFile"),
},
// Add the base settings to all the main profiles
common.main_profile_names.forEach(function (name) {
profiles[name] = concatObjects(common.main_profile_base, profiles[name]);
});
// Generate debug versions of all the main profiles
common.main_profile_names.forEach(function (name) { var debugName = name + common.debug_suffix;
profiles[debugName] = concatObjects(profiles[name],
common.debug_profile_base);
}); // Generate slowdebug versions of all the main profiles
common.main_profile_names.forEach(function (name) { var debugName = name + common.slowdebug_suffix;
profiles[debugName] = concatObjects(profiles[name],
common.slowdebug_profile_base);
}); // Generate optimized versions of all the main profiles
common.main_profile_names.forEach(function (name) { var optName = name + common.optimized_suffix;
profiles[optName] = concatObjects(profiles[name],
common.optimized_profile_base);
profiles[optName].default_make_targets = [ "hotspot" ];
}); // Generate testmake profiles for the main profile of each build host // platform. This profile only runs the makefile tests. // Ant is needed to run the idea project generator test. var testmakeBase = {
dependencies: [ "ant" ],
environment: { "ANT_HOME": input.get("ant", "home_path")
}
};
[ "linux-x64", "macosx-aarch64", "macosx-x64", "windows-x64", "linux-aarch64"]
.forEach(function (name) { var maketestName = name + "-testmake";
profiles[maketestName] = concatObjects(profiles[name], testmakeBase);
profiles[maketestName].default_make_targets = [ "test-make" ];
});
// Profiles for building the zero jvm variant. These are used for verification. var zeroProfiles = { "linux-x64-zero": {
target_os: "linux",
target_cpu: "x64",
dependencies: ["devkit", "gtest"],
configure_args: concat(common.configure_args_64bit, [ "--with-zlib=system", "--with-jvm-variants=zero", "--enable-libffi-bundling"
])
},
// Add the base settings to the zero profiles and generate debug profiles
Object.keys(zeroProfiles).forEach(function (name) { var debugName = name + common.debug_suffix;
profiles[name] = concatObjects(common.main_profile_base, profiles[name]);
profiles[debugName] = concatObjects(profiles[name], common.debug_profile_base);
});
// Define a profile with precompiled headers disabled. This is just used for // verification of this build configuration. var noPchProfiles = { "linux-x64-debug-nopch": {
target_os: "linux",
target_cpu: "x64",
dependencies: ["devkit", "gtest"],
configure_args: concat(common.configure_args_64bit, "--with-zlib=system", "--disable-precompiled-headers"),
},
};
profiles = concatObjects(profiles, noPchProfiles); // Add base settings to noPch profiles
Object.keys(noPchProfiles).forEach(function (name) {
profiles[name] = concatObjects(common.main_profile_base, profiles[name]);
profiles[name] = concatObjects(common.debug_profile_base, profiles[name]); // Override default make target with hotspot as that's the only part of // the build using precompiled headers.
profiles[name].default_make_targets = ["hotspot"];
});
// Bootcycle profiles runs the build with itself as the boot jdk. This can // be done in two ways. Either using the builtin bootcycle target in the // build system. Or by supplying the main jdk build as bootjdk to configure.
[ "linux-x64", "macosx-x64", "windows-x64", "linux-aarch64" ]
.forEach(function (name) { var bootcycleName = name + "-bootcycle"; var bootcyclePrebuiltName = name + "-bootcycle-prebuilt"; // The base bootcycle profile just changes the default target // compared to the base profile
profiles[bootcycleName] = clone(profiles[name]);
profiles[bootcycleName].default_make_targets = [ "bootcycle-images" ]; // The prebuilt bootcycle variant modifies the boot jdk argument var bootcyclePrebuiltBase = {
dependencies: [ name + ".jdk" ],
configure_args: [ "--with-boot-jdk=" + input.get(name + ".jdk", "home_path"),
]
}
profiles[bootcyclePrebuiltName] = concatObjects(profiles[name],
bootcyclePrebuiltBase); var bootJdkIndex = profiles[bootcyclePrebuiltName].dependencies.indexOf("boot_jdk"); delete profiles[bootcyclePrebuiltName].dependencies[bootJdkIndex];
profiles[bootcyclePrebuiltName].default_make_targets = [ "product-images" ];
});
// Generate common artifacts for all debug profiles
Object.keys(artifactData).forEach(function (name) { var debugName = name + common.debug_suffix;
profiles[debugName] = concatObjects(profiles[debugName],
common.debug_profile_artifacts(artifactData[name]));
});
// Generate open only profiles for all the main and debug profiles. // Rewrite artifact remote paths by adding "openjdk/GPL".
common.main_profile_names.forEach(function (name) { var openName = name + common.open_suffix;
profiles[openName] = concatObjects(profiles[name],
common.open_profile_base); for (artifactName in profiles[openName].artifacts) { var artifact = profiles[openName].artifacts[artifactName];
artifact.remote = replaceAll( "bundles\/", "bundles/openjdk/GPL/",
(artifact.remote != null ? artifact.remote : artifact.local));
} var debugName = name + common.debug_suffix; var openDebugName = name + common.open_suffix + common.debug_suffix;
profiles[openDebugName] = concatObjects(profiles[debugName],
common.open_profile_base); for (artifactName in profiles[openDebugName].artifacts) { var artifact = profiles[openDebugName].artifacts[artifactName];
artifact.remote = replaceAll( "bundles\/", "bundles/openjdk/GPL/",
(artifact.remote != null ? artifact.remote : artifact.local));
}
});
// Define the reference implementation profiles. These are basically the same // as the open profiles, but upload artifacts to a different location.
common.main_profile_names.forEach(function (name) { var riName = name + "-ri"; var riDebugName = riName + common.debug_suffix; var openName = name + common.open_suffix; var openDebugName = openName + common.debug_suffix;
profiles[riName] = clone(profiles[openName]);
profiles[riDebugName] = clone(profiles[openDebugName]); // Rewrite all remote dirs to "bundles/openjdk/BCL/..." for (artifactName in profiles[riName].artifacts) { var artifact = profiles[riName].artifacts[artifactName];
artifact.remote = replaceAll( "\/GPL\/", "/BCL/",
(artifact.remote != null ? artifact.remote : artifact.local));
}
});
// For open profiles, the non-debug jdk bundles, need an "open" prefix on the // remote bundle names, forming the word "openjdk". See JDK-8188789.
common.main_profile_names.forEach(function (name) { var openName = name + common.open_suffix;
profiles[openName].artifacts["jdk"].remote = replaceAll( "\/jdk-", "/openjdk-",
replaceAll("\/\\1", "/open\\1",
profiles[openName].artifacts["jdk"].remote));
});
// Generate cmp-baseline profiles for each main profile and their // corresponding debug profile. This profile does a compare build run with no // changes to verify that the compare script has a clean baseline
common.main_profile_names.forEach(function (name) {
[ "", common.open_suffix ].forEach(function (suffix) { var cmpBaselineName = name + suffix + "-cmp-baseline";
profiles[cmpBaselineName] = clone(profiles[name + suffix]); // Only compare the images target. This should presumably be expanded // to include more build targets when possible.
profiles[cmpBaselineName].default_make_targets = [ "images", "test-image" ]; if (name == "linux-x64") {
profiles[cmpBaselineName].default_make_targets
= concat(profiles[cmpBaselineName].default_make_targets, "docs");
}
profiles[cmpBaselineName].make_args = [ "COMPARE_BUILD=CONF=" ];
profiles[cmpBaselineName].configure_args = concat(
profiles[cmpBaselineName].configure_args, "--with-hotspot-build-time=n/a", "--disable-precompiled-headers"); // Do not inherit artifact definitions from base profile delete profiles[cmpBaselineName].artifacts;
});
});
// Profiles used to run tests. var testOnlyProfiles = { "run-test": {
target_os: input.build_os,
target_cpu: input.build_cpu,
dependencies: [ "jtreg", "gnumake", "boot_jdk", "devkit", "jib" ],
labels: "test",
environment: { "JT_JAVA": common.boot_jdk_home
}
}
};
profiles = concatObjects(profiles, testOnlyProfiles);
// Profiles used to run tests using Jib for internal dependencies. var testedProfile = input.testedProfile; if (testedProfile == null) {
testedProfile = input.build_os + "-" + input.build_cpu;
} var testedProfileJdk = testedProfile + ".jdk"; // Make it possible to use the test image from a different profile var testImageProfile; if (input.testImageProfile != null) {
testImageProfile = input.testImageProfile;
} elseif (testedProfile.endsWith("-jcov")) {
testImageProfile = testedProfile.substring(0, testedProfile.length - "-jcov".length);
} else {
testImageProfile = testedProfile;
} var testedProfileTest = testImageProfile + ".test" var testOnlyMake = [ "test-prebuilt", "LOG_CMDLINES=true", "JTREG_VERBOSE=fail,error,time" ]; if (testedProfile.endsWith("-gcov")) {
testOnlyMake = concat(testOnlyMake, "GCOV_ENABLED=true")
} var testOnlyProfilesPrebuilt = { "run-test-prebuilt": {
target_os: input.build_os,
target_cpu: input.build_cpu,
dependencies: [ "jtreg", "gnumake", "boot_jdk", "devkit", "jib", "jcov", testedProfileJdk,
testedProfileTest,
],
src: "src.conf",
make_args: testOnlyMake,
environment: { "BOOT_JDK": common.boot_jdk_home, "JT_HOME": input.get("jtreg", "home_path"), "JDK_IMAGE_DIR": input.get(testedProfileJdk, "home_path"), "TEST_IMAGE_DIR": input.get(testedProfileTest, "home_path"), "SYMBOLS_IMAGE_DIR": input.get(testedProfile + ".jdk_symbols", "home_path")
},
labels: "test"
}
}; if (!testedProfile.endsWith("-jcov")) {
testOnlyProfilesPrebuilt["run-test-prebuilt"]["dependencies"].push(testedProfile + ".jdk_symbols");
}
// If actually running the run-test-prebuilt profile, verify that the input // variable is valid and if so, add the appropriate target_* values from // the tested profile. Use testImageProfile value as backup. if (input.profile == "run-test-prebuilt") { if (profiles[testedProfile] == null && profiles[testImageProfile] == null) {
error("testedProfile is not defined: " + testedProfile + " " + testImageProfile);
}
} if (profiles[testedProfile] != null) {
testOnlyProfilesPrebuilt["run-test-prebuilt"]["target_os"]
= profiles[testedProfile]["target_os"];
testOnlyProfilesPrebuilt["run-test-prebuilt"]["target_cpu"]
= profiles[testedProfile]["target_cpu"];
} elseif (profiles[testImageProfile] != null) {
testOnlyProfilesPrebuilt["run-test-prebuilt"]["target_os"]
= profiles[testImageProfile]["target_os"];
testOnlyProfilesPrebuilt["run-test-prebuilt"]["target_cpu"]
= profiles[testImageProfile]["target_cpu"];
}
profiles = concatObjects(profiles, testOnlyProfilesPrebuilt);
// On macosx add the devkit bin dir to the path in all the run-test profiles. // This gives us a guaranteed working version of lldb for the jtreg failure handler. if (input.build_os == "macosx") {
macosxRunTestExtra = {
dependencies: [ "lldb" ],
environment_path: [
input.get("gnumake", "install_path") + "/bin",
input.get("lldb", "install_path") + "/Xcode/Contents/Developer/usr/bin",
],
};
profiles["run-test"] = concatObjects(profiles["run-test"], macosxRunTestExtra);
profiles["run-test-prebuilt"] = concatObjects(profiles["run-test-prebuilt"], macosxRunTestExtra);
}
// The profile run-test-prebuilt defines src.conf as the src bundle. When // running in Mach 5, this reduces the time it takes to populate the // considerably. But with just src.conf, we cannot actually run any tests, // so if running from a workspace with just src.conf in it, we need to also // get src.full as a dependency, and define the work_dir (where make gets // run) to be in the src.full install path. By running in the install path, // the same cached installation of the full src can be reused for multiple // test tasks. Care must however be taken not to pollute that work dir by // setting the appropriate make variables to control output directories. // // Use the existence of the top level README.md as indication of if this is // the full source or just src.conf. if (!new java.io.File(__DIR__, "../../README.md").exists()) { var runTestPrebuiltSrcFullExtra = {
dependencies: "src.full",
work_dir: input.get("src.full", "install_path"),
}
profiles["run-test-prebuilt"] = concatObjects(profiles["run-test-prebuilt"],
runTestPrebuiltSrcFullExtra);
}
// This adds java jib as a dependency for the test artifacts resolver
jib: {
organization: "com.oracle.java.jib",
ext: "zip",
classifier: "distribution",
revision: "3.0-SNAPSHOT",
environment_name: "JIB_HOME",
environment_value: input.get("jib", "home_path")
},
/** *Generatethemissingplatformattributesforprofiles * *@paramprofilesProfilesmaptogenerateattributeson *@returns{{}}Newprofilesmapwithplatformattributesfullyfilledin
*/ var generatePlatformAttributes = function (profiles) { var ret = concatObjects(profiles, {}); for (var profile in profiles) { if (ret[profile].build_os == null) {
ret[profile].build_os = ret[profile].target_os;
} if (ret[profile].build_cpu == null) {
ret[profile].build_cpu = ret[profile].target_cpu;
}
ret[profile].target_platform = ret[profile].target_os + "_" + ret[profile].target_cpu;
ret[profile].build_platform = ret[profile].build_os + "_" + ret[profile].build_cpu;
} return ret;
};
/** *Thedefault_make_targetsattributeonaprofileisnotarealJibattribute. *Thisfunctionrewritesthatattributeintothecorrespondingconfigurearg. *Callingthisfunctionmultipletimesonthesameprofilesobjectissafe. * *@paramcommonCommonvalues *@paramprofilesProfilesmaptorewriteprofilesfor *@returns{{}}Newmapofprofileswiththemaketargetsconverted
*/ var generateDefaultMakeTargetsConfigureArg = function (common, profiles) { var ret = concatObjects(profiles, {}); for (var profile in ret) { if (ret[profile]["default_make_targets"] != null) { var targetsString = concat(ret[profile].default_make_targets).join(" "); // Iterate over all configure args and see if --with-default-make-target // is already there and change it, otherwise add it. var found = false; for (var i in ret[profile].configure_args) { var arg = ret[profile].configure_args[i]; if (arg != null && arg.startsWith("--with-default-make-target=")) {
found = true;
ret[profile].configure_args[i]
= "--with-default-make-target=" + targetsString;
}
} if (!found) {
ret[profile].configure_args = concat(
ret[profile].configure_args, "--with-default-make-target=" + targetsString);
}
}
} return ret;
}
var getBuildId = function (input) { if (input.build_id != null) { return input.build_id;
} else { var topdir = new java.io.File(__DIR__, "../..").getCanonicalFile().getName(); var userName = java.lang.System.getProperty("user.name"); return userName + "." + topdir;
}
}
/** *Deepclonesanobjecttree. * *@paramoObjecttoclone *@returns{{}}Cloneofo
*/ var clone = function (o) { return JSON.parse(JSON.stringify(o));
};
/** *Concatenatesallargumentsintoanewarray * *@returns{Array.<T>}Newarraycontainingallarguments
*/ var concat = function () { return Array.prototype.concat.apply([], arguments);
};
/** *TakesaStringorArrayofStringsanddoesareplaceoperationoneach *ofthem. * *@parampatternPatterntolookfor *@paramreplacementReplacementtexttoinsert *@paramaStringorArrayofStringstoreplace *@returns{Array}Eitheranewarrayoranewstringdependingontheinput
*/ var replaceAll = function (pattern, replacement, a) { // If a is an array if (Array === a.constructor) { var newA = []; for (var i in a) {
newA.push(a[i].replace(pattern, replacement));
} return newA;
} else { return a.replace(pattern, replacement);
}
};
/** *Deepconcatenationoftwoobjects.Foreachnodeencountered,merge *thecontentswiththecorrespondingnodeintheotherobjecttree, *treatingallstringsasarrayelements. * *@paramo1Objecttoconcatenate *@paramo2Objecttoconcatenate *@returns{{}}Newobjecttreecontainingtheconcatenationofo1ando2
*/ var concatObjects = function (o1, o2) { if (o1 == null) { return clone(o2);
} if (o2 == null) { return clone(o1);
} var ret = {}; for (var a in o1) { if (o2[a] == null) {
ret[a] = clone(o1[a]);
}
} for (var a in o2) { if (o1[a] == null) {
ret[a] = clone(o2[a]);
} else { if (typeof o1[a] == 'string') {
ret[a] = clone([o1[a]].concat(o2[a]));
} elseif (Array.isArray(o1[a])) {
ret[a] = clone(o1[a].concat(o2[a]));
} elseif (typeof o1[a] == 'object') {
ret[a] = concatObjects(o1[a], o2[a]);
}
}
} return ret;
};
// Properties representation of the make/conf/version-numbers.conf file. Lazily // initiated by the function below. var version_numbers;
/** *Readthemake/conf/version-numbers.conffileintoaPropertiesobject. * *@returns{java.utilProperties}
*/ var getVersionNumbers = function () { // Read version information from make/conf/version-numbers.conf if (version_numbers == null) {
version_numbers = new java.util.Properties(); var stream = new java.io.FileInputStream(__DIR__ + "/version-numbers.conf");
version_numbers.load(stream);
stream.close();
} return version_numbers;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.