# HG changeset patch # User kcr # Date 1535574146 25200 # Wed Aug 29 13:22:26 2018 -0700 # Node ID 1f363940105a1c075732139ffe71b2148609c788 # Parent e594cf4f5334708c98096c5fbf675bc0a74917ed 8201553: Update FX build to use gradle 4.8 Reviewed-by: diff --git a/build.gradle b/build.gradle --- a/build.gradle +++ b/build.gradle @@ -769,21 +769,14 @@ NUM_COMPILE_THREADS = 1 } -// Check that Gradle 1.8 is in use. -if (gradle.gradleVersion != "1.8") { +// Check for Gradle 4.8, error if < 4.8. +if (gradle.gradleVersion != "4.8") { def ver = gradle.gradleVersion.split("[\\.]"); def gradleMajor = Integer.parseInt(ver[0]); - def gradleMinor = Integer.parseInt(ver[1]); + def gradleMinor = Integer.parseInt(ver[1].split("[^0-9]")[0]); def err = ""; - if (gradleMajor == 1) { - if (gradleMinor < 8) { - err = "Gradle version too old: ${gradle.gradleVersion}; must be at least 1.8" - } - - // Blacklisted versions of gradle - if (gradleMinor == 11) { - err = "JavaFX fails to build with Gradle ${gradle.gradleVersion}; supported version is 1.8" - } + if (gradleMajor < 4 || (gradleMajor == 4 && gradleMinor < 8)) { + err = "Gradle version too old: ${gradle.gradleVersion}; must be at least 4.8" } if (IS_GRADLE_VERSION_CHECK && err != "") { @@ -792,7 +785,7 @@ logger.warn("*****************************************************************"); logger.warn("Unsupported gradle version $gradle.gradleVersion in use."); - logger.warn("Only version 1.8 is supported. Use this version at your own risk"); + logger.warn("Only version 4.8 is supported. Use this version at your own risk"); if ( err != "") logger.warn(err); logger.warn("*****************************************************************"); } @@ -806,6 +799,7 @@ * * *****************************************************************************/ +logger.quiet("gradle.gradleVersion: $gradle.gradleVersion") logger.quiet("OS_NAME: $OS_NAME") logger.quiet("OS_ARCH: $OS_ARCH") logger.quiet("JAVA_HOME: $JAVA_HOME") @@ -907,12 +901,12 @@ def javahTask = project.task("javah${t.capital}${capitalName}", type: JavaHeaderTask, dependsOn: project.classes, group: "Build") { description = "Generates JNI Headers for ${name} for ${t.name}" if (properties.javahSource == null) { - source(project.sourceSets.main.output.classesDir) + source(project.sourceSets.main.java.outputDir) } else { source(properties.javahSource) } if (properties.javahClasspath == null) { - classpath = project.files(project.sourceSets.main.output.classesDir) + classpath = project.files(project.sourceSets.main.java.outputDir) classpath += project.sourceSets.main.compileClasspath } else { classpath = project.files(properties.javahClasspath) @@ -978,7 +972,7 @@ def compileCompilers = project.task("compile${name}Compilers", type: JavaCompile, dependsOn: project.compileJava) { description = "Compile the $name JSL Compilers" - classpath = project.files(project.sourceSets.main.output.classesDir) + + classpath = project.files(project.sourceSets.main.java.outputDir) + rootProject.BUILD_SRC + project.configurations.antlr3 source = [project.file("src/main/jsl-$lowerName")] @@ -998,7 +992,7 @@ project.task("compile${name}JavaShaders", type: JavaCompile, dependsOn: generateShaders) { description = "Compile the Java $name JSL shaders" - classpath = project.files(project.sourceSets.main.output.classesDir) + rootProject.BUILD_SRC + classpath = project.files(project.sourceSets.main.java.outputDir) + rootProject.BUILD_SRC source = [project.file("$project.buildDir/generated-src/jsl-$lowerName")] destinationDir = project.file("$project.buildDir/classes/jsl-$lowerName") } @@ -1461,7 +1455,7 @@ workingDir = "modules/graphics" main = settings.generator classpath = configurations.compile + configurations.antlr3 - classpath += files("$buildDir/classes/main") + classpath += files("$buildDir/classes/java/main") classpath += files("$buildDir/classes/jsl-compilers/decora") args = ["-i", sourceDir, "-o", destinationDir, "-t", "-pkg", "com/sun/scenario/effect", "$settings.outputs", "$settings.fileName"] jvmArgs "-Djava.ext.dirs=" @@ -1472,9 +1466,9 @@ task generateDecoraNativeHeaders(type: JavaHeaderTask, dependsOn: compileDecoraJavaShaders) { description = "Generates JNI Headers for Decora SSE Natives" source file("$buildDir/classes/jsl-decora") - source file("$buildDir/classes/main") + source file("$buildDir/classes/java/main") include("com/sun/scenario/effect/impl/sw/sse/*"); - classpath = files("$buildDir/classes/main", "$buildDir/classes/jsl-decora") + classpath = files("$buildDir/classes/java/main", "$buildDir/classes/jsl-decora") output = file("$buildDir/generated-src/headers/jsl-decora") } @@ -1569,7 +1563,7 @@ processResources.dependsOn processDecoraShaders, processPrismShaders test { - def cssDir = file("$buildDir/classes/main/javafx") + def cssDir = file("$buildDir/classes/java/main/javafx") jvmArgs "-Djava.ext.dirs=", "-Djavafx.toolkit=com.sun.javafx.pgstub.StubToolkit", "-DCSS_META_DATA_TEST_DIR=$cssDir" enableAssertions = true @@ -1584,38 +1578,40 @@ // To enable the IDEs to all be happy (no red squiggles) we need to have the libraries // available in some known location. Maybe in the future the Gradle plugins to each // of the IDEs will be good enough that we won't need this hack anymore. - classes << { - // Copy all of the download libraries to the libs directory for the sake of the IDEs - File libsDir = rootProject.file("build/libs"); - - // In some IDEs (Eclipse for example), touching these libraries cauese a full build - // within the IDE. When gradle is used outside of the IDE, for example to build the - // native code, a full rebuild is caused within the IDE. The fix is to check for the - // lib directory and not copy the files - // - // This means that in order to update the dependent libraries for the IDE's, a clean - // build is required - // - if (libsDir.exists()) return; - libsDir.mkdirs(); - for (File f : [configurations.compile.files, configurations.antlr3.files].flatten()) { - copy { - into libsDir - from f.getParentFile() - include "**/antlr-3.1.3.jar" - include "**/stringtemplate-3.2.jar" - include "**/antlr-runtime-3.1.3.jar" - includeEmptyDirs = false - } - // Have to rename the swt jar because it is some platform specific name but - // for the sake of the IDEs we need to have a single stable name that works - // on every platform - copy { - into libsDir - from f.getParentFile() - include "**/*swt*.jar" - includeEmptyDirs = false - rename ".*swt.*jar", "swt-debug\\.jar" + classes { + doLast { + // Copy all of the download libraries to the libs directory for the sake of the IDEs + File libsDir = rootProject.file("build/libs"); + + // In some IDEs (Eclipse for example), touching these libraries cauese a full build + // within the IDE. When gradle is used outside of the IDE, for example to build the + // native code, a full rebuild is caused within the IDE. The fix is to check for the + // lib directory and not copy the files + // + // This means that in order to update the dependent libraries for the IDE's, a clean + // build is required + // + if (libsDir.exists()) return; + libsDir.mkdirs(); + for (File f : [configurations.compile.files, configurations.antlr3.files].flatten()) { + copy { + into libsDir + from f.getParentFile() + include "**/antlr-3.1.3.jar" + include "**/stringtemplate-3.2.jar" + include "**/antlr-runtime-3.1.3.jar" + includeEmptyDirs = false + } + // Have to rename the swt jar because it is some platform specific name but + // for the sake of the IDEs we need to have a single stable name that works + // on every platform + copy { + into libsDir + from f.getParentFile() + include "**/*swt*.jar" + includeEmptyDirs = false + rename ".*swt.*jar", "swt-debug\\.jar" + } } } } @@ -1630,7 +1626,7 @@ } test { - def cssDir = file("$buildDir/classes/main/javafx") + def cssDir = file("$buildDir/classes/java/main/javafx") jvmArgs "-Djavafx.toolkit=com.sun.javafx.pgstub.StubToolkit", "-DCSS_META_DATA_TEST_DIR=$cssDir" } @@ -1638,25 +1634,27 @@ // TODO Css2Bin really should be moved out and put into buildSrc if it can be // TODO could change script to dynamically locate all .css files and create bss for them, probably better // TODO also not sure there is any benefit to having css files in the jfxrt.jar at all - processResources << { - ["$buildDir/resources/main/com/sun/javafx/scene/control/skin/caspian/caspian.css", - "$buildDir/resources/main/com/sun/javafx/scene/control/skin/caspian/caspian-no-transparency.css", - "$buildDir/resources/main/com/sun/javafx/scene/control/skin/caspian/embedded-qvga.css", - "$buildDir/resources/main/com/sun/javafx/scene/control/skin/caspian/embedded.css", - "$buildDir/resources/main/com/sun/javafx/scene/control/skin/caspian/fxvk.css", - "$buildDir/resources/main/com/sun/javafx/scene/control/skin/caspian/highcontrast.css", - "$buildDir/resources/main/com/sun/javafx/scene/control/skin/modena/modena.css", - "$buildDir/resources/main/com/sun/javafx/scene/control/skin/modena/modena-no-transparency.css", - "$buildDir/resources/main/com/sun/javafx/scene/control/skin/modena/touch.css"].each { css -> - javaexec { - executable = JAVA - workingDir = "modules/controls" - classpath files("$buildDir/classes/main", - project(":graphics").sourceSets.main.output, - project(":base").sourceSets.main.output) - main = "com.sun.javafx.css.parser.Css2Bin" - args css - jvmArgs "-Djava.ext.dirs=" + processResources { + doLast { + ["$buildDir/resources/main/com/sun/javafx/scene/control/skin/caspian/caspian.css", + "$buildDir/resources/main/com/sun/javafx/scene/control/skin/caspian/caspian-no-transparency.css", + "$buildDir/resources/main/com/sun/javafx/scene/control/skin/caspian/embedded-qvga.css", + "$buildDir/resources/main/com/sun/javafx/scene/control/skin/caspian/embedded.css", + "$buildDir/resources/main/com/sun/javafx/scene/control/skin/caspian/fxvk.css", + "$buildDir/resources/main/com/sun/javafx/scene/control/skin/caspian/highcontrast.css", + "$buildDir/resources/main/com/sun/javafx/scene/control/skin/modena/modena.css", + "$buildDir/resources/main/com/sun/javafx/scene/control/skin/modena/modena-no-transparency.css", + "$buildDir/resources/main/com/sun/javafx/scene/control/skin/modena/touch.css"].each { css -> + javaexec { + executable = JAVA + workingDir = "modules/controls" + classpath files("$buildDir/classes/java/main", + project(":graphics").sourceSets.main.output, + project(":base").sourceSets.main.output) + main = "com.sun.javafx.css.parser.Css2Bin" + args css + jvmArgs "-Djava.ext.dirs=" + } } } } @@ -1838,7 +1836,7 @@ from "$buildDir/native/WinLauncher/WinLauncher.exe" from "$MSVCR" from "$MSVCP" - into "$buildDir/classes/main/com/oracle/tools/packager/windows" + into "$buildDir/classes/java/main/com/oracle/tools/packager/windows" } } } @@ -1859,7 +1857,7 @@ doLast { copy { from "$buildDir/native/WinLauncher/packager.dll" - into "$buildDir/classes/main/com/oracle/tools/packager/windows" + into "$buildDir/classes/java/main/com/oracle/tools/packager/windows" } } } @@ -1875,7 +1873,7 @@ doLast { copy { from "$buildDir/native/WinLauncherSvc/WinLauncherSvc.exe" - into "$buildDir/classes/main/com/oracle/tools/packager/windows" + into "$buildDir/classes/java/main/com/oracle/tools/packager/windows" } } } @@ -1891,7 +1889,7 @@ doLast { copy { from "$buildDir/native/IconSwap/IconSwap.exe" - into "$buildDir/classes/main/com/oracle/tools/packager/windows" + into "$buildDir/classes/java/main/com/oracle/tools/packager/windows" } } } @@ -1904,7 +1902,7 @@ source file("src/main/native/launcher/mac") params.addAll(MAC.launcher.ccFlags) compiler = MAC.launcher.compiler - output(file("$buildDir/classes/main/com/oracle/tools/packager/mac")) + output(file("$buildDir/classes/java/main/com/oracle/tools/packager/mac")) eachOutputFile = { f -> return new File(f.getParent(), "JavaAppLauncher") } @@ -1922,7 +1920,7 @@ objectDir = file("$buildDir/native/maclauncher/obj") linkParams.addAll(MAC.launcherlibrary.linkFlags) linker = MAC.launcherlibrary.linker - lib = file("$buildDir/classes/main/com/oracle/tools/packager/mac/libpackager.dylib") + lib = file("$buildDir/classes/java/main/com/oracle/tools/packager/mac/libpackager.dylib") } task compileLauncher(dependsOn: [buildMacLauncher, linkMacLibrary]) jar.dependsOn compileLauncher; @@ -1940,7 +1938,7 @@ objectDir = file("$buildDir/native/linuxlauncher/launcherobj") linkParams.addAll(LINUX.launcher.linkFlags) linker = LINUX.launcher.linker - lib = file("$buildDir/classes/main/com/oracle/tools/packager/linux/JavaAppLauncher") + lib = file("$buildDir/classes/java/main/com/oracle/tools/packager/linux/JavaAppLauncher") } task compileLinuxLibrary(type: CCTask, group: "Build") { description = "Compiles native sources for the application co-bundle launcher library" @@ -1955,7 +1953,7 @@ objectDir = file("$buildDir/native/linuxlauncher/obj") linkParams.addAll(LINUX.launcherlibrary.linkFlags) linker = LINUX.launcherlibrary.linker - lib = file("$buildDir/classes/main/com/oracle/tools/packager/linux/libpackager.so") + lib = file("$buildDir/classes/java/main/com/oracle/tools/packager/linux/libpackager.so") } task compileLauncher(dependsOn: [linkLinuxLauncher, linkLinuxLibrary]) jar.dependsOn compileLauncher; @@ -2045,7 +2043,7 @@ description = "Creates the packager.jar" archiveName = "packager.jar"; includeEmptyDirs = false - from("$buildDir/classes/main"); + from("$buildDir/classes/java/main"); from("$buildDir/resources/main"); include('jdk/packager/**') @@ -2055,17 +2053,19 @@ jar.dependsOn buildJavaPackager jar.dependsOn packagerJar - classes << { - // Copy all of the download libraries to libs directory for the sake of the IDEs - File libsDir = rootProject.file("build/libs"); - File antLib = new File(libsDir, "ant-1.8.2.jar") - libsDir.mkdirs(); - for (File f : configurations.compile.files) { - copy { - into libsDir - from f.getParentFile() - include "**/ant-1.8.2.jar" - includeEmptyDirs = false + classes { + doLast { + // Copy all of the download libraries to libs directory for the sake of the IDEs + File libsDir = rootProject.file("build/libs"); + File antLib = new File(libsDir, "ant-1.8.2.jar") + libsDir.mkdirs(); + for (File f : configurations.compile.files) { + copy { + into libsDir + from f.getParentFile() + include "**/ant-1.8.2.jar" + includeEmptyDirs = false + } } } } @@ -2382,35 +2382,37 @@ } if (t.name == "win") { - def buildResources = task("buildResources") << { - def rcOutputDir = "${nativeOutputDir}/${buildType}" - mkdir rcOutputDir - exec { - environment(WINDOWS_NATIVE_COMPILE_ENVIRONMENT) - commandLine (WIN.media.rcCompiler) - args(WIN.media.glibRcFlags) - args("/Fo${rcOutputDir}/${WIN.media.glibRcFile}", WIN.media.rcSource) - } - - exec { - environment(WINDOWS_NATIVE_COMPILE_ENVIRONMENT) - commandLine (WIN.media.rcCompiler) - args(WIN.media.gstreamerRcFlags) - args("/Fo${rcOutputDir}/${WIN.media.gstreamerRcFile}", WIN.media.rcSource) - } - - exec { - environment(WINDOWS_NATIVE_COMPILE_ENVIRONMENT) - commandLine (WIN.media.rcCompiler) - args(WIN.media.fxpluginsRcFlags) - args("/Fo${rcOutputDir}/${WIN.media.fxpluginsRcFile}", WIN.media.rcSource) - } - - exec { - environment(WINDOWS_NATIVE_COMPILE_ENVIRONMENT) - commandLine (WIN.media.rcCompiler) - args(WIN.media.jfxmediaRcFlags) - args("/Fo${rcOutputDir}/${WIN.media.jfxmediaRcFile}", WIN.media.rcSource) + def buildResources = task("buildResources") { + doLast { + def rcOutputDir = "${nativeOutputDir}/${buildType}" + mkdir rcOutputDir + exec { + environment(WINDOWS_NATIVE_COMPILE_ENVIRONMENT) + commandLine (WIN.media.rcCompiler) + args(WIN.media.glibRcFlags) + args("/Fo${rcOutputDir}/${WIN.media.glibRcFile}", WIN.media.rcSource) + } + + exec { + environment(WINDOWS_NATIVE_COMPILE_ENVIRONMENT) + commandLine (WIN.media.rcCompiler) + args(WIN.media.gstreamerRcFlags) + args("/Fo${rcOutputDir}/${WIN.media.gstreamerRcFile}", WIN.media.rcSource) + } + + exec { + environment(WINDOWS_NATIVE_COMPILE_ENVIRONMENT) + commandLine (WIN.media.rcCompiler) + args(WIN.media.fxpluginsRcFlags) + args("/Fo${rcOutputDir}/${WIN.media.fxpluginsRcFile}", WIN.media.rcSource) + } + + exec { + environment(WINDOWS_NATIVE_COMPILE_ENVIRONMENT) + commandLine (WIN.media.rcCompiler) + args(WIN.media.jfxmediaRcFlags) + args("/Fo${rcOutputDir}/${WIN.media.jfxmediaRcFile}", WIN.media.rcSource) + } } } @@ -2511,8 +2513,8 @@ task generateHeaders(dependsOn: compileJava) { doLast { - def classpath = files("$buildDir/classes/main", - project(":graphics").sourceSets.main.output.classesDir) + def classpath = files("$buildDir/classes/java/main", + project(":graphics").sourceSets.main.java.outputDir) def dest = file("$buildDir/generated-src/headers"); mkdir dest; exec { @@ -2567,87 +2569,89 @@ File nativeBuildDir = new File("${webkitOutputDir}") nativeBuildDir.mkdirs() - def compileNativeTask = task("compileNative${t.capital}", dependsOn: generateHeaders) << { - println "Building Webkit configuration /$webkitConfig/ into $webkitOutputDir" - - exec { - workingDir("$webkitOutputDir") - commandLine("perl", "$projectDir/src/main/native/Tools/Scripts/set-webkit-configuration", "--$webkitConfig") - environment(["WEBKIT_OUTPUTDIR" : webkitOutputDir]) - } - - exec { - workingDir("$projectDir/src/main/native") - def cmakeArgs = "-DENABLE_TOOLS=1" - if (t.name == "win") { - String parfaitPath = IS_COMPILE_PARFAIT ? System.getenv().get("PARFAIT_PATH") + ";" : ""; - Map environmentSettings = new HashMap(WINDOWS_NATIVE_COMPILE_ENVIRONMENT) - environmentSettings["PATH"] = parfaitPath + "$WINDOWS_VS_PATH" - /* To build with ICU: - 1. Download http://javaweb.us.oracle.com/jcg/fx-webrevs/RT-17164/WebKitLibrariesICU.zip - and unzip it to WebKitLibraries folder. - 2. Copy DLLs from - WebKitLibrariesICU.zip\WebKitLibraries\import\runtime - to %windir%\system32 - 3. Uncomment the line below - */ - // args("--icu-unicode") - } else if (t.name == "mac") { - cmakeArgs = "-DCMAKE_OSX_DEPLOYMENT_TARGET=$MACOSX_MIN_VERSION -DCMAKE_OSX_SYSROOT=$MACOSX_SDK_PATH" - } else if (t.name == "linux") { - cmakeArgs = "-DCMAKE_SYSTEM_NAME=Linux -DCMAKE_C_COMPILER=${webkitProperties.compiler}" + def compileNativeTask = task("compileNative${t.capital}", dependsOn: generateHeaders) { + doLast { + println "Building Webkit configuration /$webkitConfig/ into $webkitOutputDir" + + exec { + workingDir("$webkitOutputDir") + commandLine("perl", "$projectDir/src/main/native/Tools/Scripts/set-webkit-configuration", "--$webkitConfig") + environment(["WEBKIT_OUTPUTDIR" : webkitOutputDir]) + } + + exec { + workingDir("$projectDir/src/main/native") + def cmakeArgs = "-DENABLE_TOOLS=1" + if (t.name == "win") { + String parfaitPath = IS_COMPILE_PARFAIT ? System.getenv().get("PARFAIT_PATH") + ";" : ""; + Map environmentSettings = new HashMap(WINDOWS_NATIVE_COMPILE_ENVIRONMENT) + environmentSettings["PATH"] = parfaitPath + "$WINDOWS_VS_PATH" + /* To build with ICU: + 1. Download http://javaweb.us.oracle.com/jcg/fx-webrevs/RT-17164/WebKitLibrariesICU.zip + and unzip it to WebKitLibraries folder. + 2. Copy DLLs from + WebKitLibrariesICU.zip\WebKitLibraries\import\runtime + to %windir%\system32 + 3. Uncomment the line below + */ + // args("--icu-unicode") + } else if (t.name == "mac") { + cmakeArgs = "-DCMAKE_OSX_DEPLOYMENT_TARGET=$MACOSX_MIN_VERSION -DCMAKE_OSX_SYSROOT=$MACOSX_SDK_PATH" + } else if (t.name == "linux") { + cmakeArgs = "-DCMAKE_SYSTEM_NAME=Linux -DCMAKE_C_COMPILER=${webkitProperties.compiler}" + if (IS_64) { + cmakeArgs = "$cmakeArgs -DCMAKE_SYSTEM_PROCESSOR=x86_64" + } else { + cmakeArgs = "$cmakeArgs -DCMAKE_SYSTEM_PROCESSOR=i586" + } + // TODO: Use cflags and ldflags from all platforms + def cFlags = webkitProperties.ccFlags?.join(' ') ?: '' + def lFlags = webkitProperties.linkFlags?.join(' ') ?: '' + // -shared flag should be omitted while creating executable. + def exeFlags = webkitProperties.linkFlags?.join(' ')?.replace('-shared', '') ?: '' + cmakeArgs = "$cmakeArgs -DCMAKE_C_FLAGS='${cFlags}' -DCMAKE_CXX_FLAGS='${cFlags}'" + cmakeArgs = "$cmakeArgs -DCMAKE_SHARED_LINKER_FLAGS='${lFlags}' -DCMAKE_EXE_LINKER_FLAGS='${exeFlags}'" + } else if (t.name.startsWith("arm")) { + fail("ARM target is not supported as of now.") + } + + if (IS_COMPILE_PARFAIT) { + environment([ + "COMPILE_PARFAIT" : "true" + ]) + cmakeArgs = "-DCMAKE_C_COMPILER=parfait-gcc -DCMAKE_CXX_COMPILER=parfait-g++" + } + + environment([ + "JAVA_HOME" : JDK_HOME, + "WEBKIT_OUTPUTDIR" : webkitOutputDir, + "PYTHONDONTWRITEBYTECODE" : "1", + ]) + + def targetCpuBitDepthSwitch = "" if (IS_64) { - cmakeArgs = "$cmakeArgs -DCMAKE_SYSTEM_PROCESSOR=x86_64" + targetCpuBitDepthSwitch = "--64-bit" } else { - cmakeArgs = "$cmakeArgs -DCMAKE_SYSTEM_PROCESSOR=i586" + targetCpuBitDepthSwitch = "--32-bit" } - // TODO: Use cflags and ldflags from all platforms - def cFlags = webkitProperties.ccFlags?.join(' ') ?: '' - def lFlags = webkitProperties.linkFlags?.join(' ') ?: '' - // -shared flag should be omitted while creating executable. - def exeFlags = webkitProperties.linkFlags?.join(' ')?.replace('-shared', '') ?: '' - cmakeArgs = "$cmakeArgs -DCMAKE_C_FLAGS='${cFlags}' -DCMAKE_CXX_FLAGS='${cFlags}'" - cmakeArgs = "$cmakeArgs -DCMAKE_SHARED_LINKER_FLAGS='${lFlags}' -DCMAKE_EXE_LINKER_FLAGS='${exeFlags}'" - } else if (t.name.startsWith("arm")) { - fail("ARM target is not supported as of now.") + + cmakeArgs += " -DJAVAFX_RELEASE_VERSION=8.0" + commandLine("perl", "$projectDir/src/main/native/Tools/Scripts/build-webkit", + "--java", "--icu-unicode", targetCpuBitDepthSwitch, + "--cmakeargs=${cmakeArgs}") } - if (IS_COMPILE_PARFAIT) { - environment([ - "COMPILE_PARFAIT" : "true" - ]) - cmakeArgs = "-DCMAKE_C_COMPILER=parfait-gcc -DCMAKE_CXX_COMPILER=parfait-g++" + // Cmake places Windows DLL in bin directory + def dllDir = IS_WINDOWS ? "bin" : "lib" + def library = rootProject.ext[t.upper].library + copy { + from "$webkitOutputDir/$webkitConfig/$dllDir/${library('jfxwebkit')}" + into "$buildDir/libs/${t.name}" } - - environment([ - "JAVA_HOME" : JDK_HOME, - "WEBKIT_OUTPUTDIR" : webkitOutputDir, - "PYTHONDONTWRITEBYTECODE" : "1", - ]) - - def targetCpuBitDepthSwitch = "" - if (IS_64) { - targetCpuBitDepthSwitch = "--64-bit" - } else { - targetCpuBitDepthSwitch = "--32-bit" + copy { + from "$webkitOutputDir/$webkitConfig/$dllDir/${library('DumpRenderTreeJava')}" + into "$buildDir/test/${t.name}" } - - cmakeArgs += " -DJAVAFX_RELEASE_VERSION=8.0" - commandLine("perl", "$projectDir/src/main/native/Tools/Scripts/build-webkit", - "--java", "--icu-unicode", targetCpuBitDepthSwitch, - "--cmakeargs=${cmakeArgs}") - } - - // Cmake places Windows DLL in bin directory - def dllDir = IS_WINDOWS ? "bin" : "lib" - def library = rootProject.ext[t.upper].library - copy { - from "$webkitOutputDir/$webkitConfig/$dllDir/${library('jfxwebkit')}" - into "$buildDir/libs/${t.name}" - } - copy { - from "$webkitOutputDir/$webkitConfig/$dllDir/${library('DumpRenderTreeJava')}" - into "$buildDir/test/${t.name}" } } @@ -2676,7 +2680,7 @@ task drtJar(type: Jar, dependsOn: compileJava) { archiveName = "drt.jar" destinationDir = file("$buildDir/test") - from "$buildDir/classes/main" + from "$buildDir/classes/java/main" include drtClasses } if (IS_COMPILE_WEBKIT) { @@ -2928,25 +2932,25 @@ description = "Creates the jfxrt.jar for the $t.name target" archiveName = "build/${sdkDirName}/rt/lib/ext/jfxrt.jar"; includeEmptyDirs = false - from("modules/base/build/classes/main", + from("modules/base/build/classes/java/main", "modules/base/build/resources/main", - "modules/builders/build/classes/main", - "modules/graphics/build/classes/main", + "modules/builders/build/classes/java/main", + "modules/graphics/build/classes/java/main", "modules/graphics/build/resources/main", - "modules/controls/build/classes/main", + "modules/controls/build/classes/java/main", "modules/controls/build/resources/main", - "modules/fxml/build/classes/main", + "modules/fxml/build/classes/java/main", "modules/fxml/build/resources/main", "modules/graphics/build/classes/jsl-decora", "modules/graphics/build/resources/jsl-decora", "modules/graphics/build/classes/jsl-prism", "modules/graphics/build/resources/jsl-prism", - "modules/media/build/classes/main", + "modules/media/build/classes/java/main", "modules/media/build/resources/main") - if (COMPILE_SWING) from ("modules/swing/build/classes/main", "modules/swing/build/resources/main") + if (COMPILE_SWING) from ("modules/swing/build/classes/java/main", "modules/swing/build/resources/main") if (!IS_MAC) { - exclude ("modules/media/build/classes/main/com/sun/media/jfxmediaimpl/platform/osx/**", + exclude ("modules/media/build/classes/java/main/com/sun/media/jfxmediaimpl/platform/osx/**", "com/sun/prism/es2/MacGL*", "com/sun/glass/events/mac", "com/sun/glass/ui/mac", @@ -2989,7 +2993,7 @@ exclude ("com/sun/prism/null3d") } if (t.name != 'ios') { - exclude ("modules/media/build/classes/main/com/sun/media/jfxmediaimpl/platform/ios/**", + exclude ("modules/media/build/classes/java/main/com/sun/media/jfxmediaimpl/platform/ios/**", "com/sun/glass/ui/ios", "com/sun/prism/es2/IOS*" ) @@ -3008,7 +3012,7 @@ "modules/web/build/resources/ios", "modules/extensions/build/classes/ios") } else { - from ("modules/web/build/classes/main", "modules/web/build/resources/main") + from ("modules/web/build/classes/java/main", "modules/web/build/resources/main") } exclude("**/javafx/embed/swt/**") @@ -3049,8 +3053,8 @@ description = "Creates the jfxswt.jar for the $t.name target" archiveName = "build/${sdkDirName}/rt/lib/jfxswt.jar"; includeEmptyDirs = false - from("modules/swt/build/classes/main"); - from("modules/builders/build/classes/main"); + from("modules/swt/build/classes/java/main"); + from("modules/builders/build/classes/java/main"); include("**/javafx/embed/swt/**") exclude("**/*.java"); // Builder java files are in build/classes and should be excluded @@ -3071,7 +3075,7 @@ description = "Creates the javafx-mx.jar" archiveName = "build/${sdkDirName}/lib/javafx-mx.jar"; includeEmptyDirs = false - from "modules/jmx/build/classes/main" + from "modules/jmx/build/classes/java/main" from "modules/jmx/build/resources/main" dependsOn project(":jmx").assemble } @@ -3248,14 +3252,14 @@ */ ext.JFXRT_CP = files( - project(":base").sourceSets.main.output.classesDir, - project(":graphics").sourceSets.main.output.classesDir, - project(":controls").sourceSets.main.output.classesDir, - project(":fxml").sourceSets.main.output.classesDir, - project(":swing").sourceSets.main.output.classesDir, //NOTE - used by 3Dviewer - project(":builders").sourceSets.main.output.classesDir, - "modules/media/build/classes/main", - "modules/web/build/classes/main", + project(":base").sourceSets.main.java.outputDir, + project(":graphics").sourceSets.main.java.outputDir, + project(":controls").sourceSets.main.java.outputDir, + project(":fxml").sourceSets.main.java.outputDir, + project(":swing").sourceSets.main.java.outputDir, //NOTE - used by 3Dviewer + project(":builders").sourceSets.main.java.outputDir, + "modules/media/build/classes/java/main", + "modules/web/build/classes/java/main", ) project(":apps") { diff --git a/buildSrc/android.gradle b/buildSrc/android.gradle --- a/buildSrc/android.gradle +++ b/buildSrc/android.gradle @@ -283,9 +283,9 @@ dependsOn(project(":graphics").classes, project(":base").classes) description = "Task compiles web component for Android." classpath = files( - project(":controls").sourceSets.main.output.classesDir, - project(":graphics").sourceSets.main.output.classesDir, - project(":base").sourceSets.main.output.classesDir + project(":controls").sourceSets.main.java.outputDir, + project(":graphics").sourceSets.main.java.outputDir, + project(":base").sourceSets.main.java.outputDir ) destinationDir = file("modules/web/build/classes/android") dependencyCacheDir = file("modules/web/build/dependency-cache") diff --git a/buildSrc/dalvik.gradle b/buildSrc/dalvik.gradle --- a/buildSrc/dalvik.gradle +++ b/buildSrc/dalvik.gradle @@ -279,9 +279,9 @@ dependsOn(project(":graphics").classes, project(":base").classes) description = "Task compiles web component for Android." classpath = files( - project(":controls").sourceSets.main.output.classesDir, - project(":graphics").sourceSets.main.output.classesDir, - project(":base").sourceSets.main.output.classesDir, + project(":controls").sourceSets.main.java.outputDir, + project(":graphics").sourceSets.main.java.outputDir, + project(":base").sourceSets.main.java.outputDir, "modules/graphics/build/classes/dalvik" ) destinationDir = file("modules/web/build/classes/android") diff --git a/buildSrc/ios.gradle b/buildSrc/ios.gradle --- a/buildSrc/ios.gradle +++ b/buildSrc/ios.gradle @@ -521,12 +521,12 @@ dependsOn(project(":graphics").classes, project(":base").classes) description = "Task compiles web component for iOS." classpath = files( - project(":controls").sourceSets.main.output.classesDir, - project(":graphics").sourceSets.main.output.classesDir, - project(":base").sourceSets.main.output.classesDir + project(":controls").sourceSets.main.java.outputDir, + project(":graphics").sourceSets.main.java.outputDir, + project(":base").sourceSets.main.java.outputDir ) destinationDir = file("modules/web/build/classes/ios") - sourceSets.main.output.classesDir = destinationDir + sourceSets.main.java.outputDir = destinationDir dependencyCacheDir = file("modules/web/build/dependency-cache") source file("modules/web/src/ios/java") doLast { @@ -549,9 +549,9 @@ addNative(project, "webview") javahIosWebview.dependsOn(compileWebJavaIos) - javahIosWebview.classpath += files(project(":base").sourceSets.main.output.classesDir, - project(":graphics").sourceSets.main.output.classesDir, - project(":controls").sourceSets.main.output.classesDir) + javahIosWebview.classpath += files(project(":base").sourceSets.main.java.outputDir, + project(":graphics").sourceSets.main.java.outputDir, + project(":controls").sourceSets.main.java.outputDir) jfxrtIos { from ("modules/web/build/classes/ios", "modules/web/build/resources/main"); @@ -652,8 +652,8 @@ afterEvaluate { addNative(project, "extensions") - javahIosExtensions.classpath += files(project(":base").sourceSets.main.output.classesDir, - project(":graphics").sourceSets.main.output.classesDir) + javahIosExtensions.classpath += files(project(":base").sourceSets.main.java.outputDir, + project(":graphics").sourceSets.main.java.outputDir) sdkIos { doLast { diff --git a/gradle/legal/THIRDPARTYLICENSEREADME.txt b/gradle/legal/THIRDPARTYLICENSEREADME.txt new file mode 100644 --- /dev/null +++ b/gradle/legal/THIRDPARTYLICENSEREADME.txt @@ -0,0 +1,208 @@ +DO NOT TRANSLATE OR LOCALIZE + +*************************************************************************** + +%%The following software may be included in this product: +Gradle v4.8 + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1948b9074f1016d15d505d185bc3f73deb82d8c8 GIT binary patch literal 54413 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

?l5tHL))j{R3_Y34|!F%%DHbVu26NWnr2p6)E3 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%0A9{P7-p9TrYGvUVc=SMy<_4` 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/modules/controls/src/test/java/javafx/scene/control/ControlTest.java b/modules/controls/src/test/java/javafx/scene/control/ControlTest.java --- a/modules/controls/src/test/java/javafx/scene/control/ControlTest.java +++ b/modules/controls/src/test/java/javafx/scene/control/ControlTest.java @@ -1000,6 +1000,7 @@ f = new File(base.toURI()); } //System.err.println(f.getPath()); + assertTrue("" + f.getCanonicalPath() + " is not a directory", f.isDirectory()); recursiveCheck(f, f.getPath().length() - 7); } catch (Exception ex) { ex.printStackTrace(System.err); diff --git a/modules/graphics/src/test/java/com/sun/javafx/css/CssMetaDataTest.java b/modules/graphics/src/test/java/com/sun/javafx/css/CssMetaDataTest.java --- a/modules/graphics/src/test/java/com/sun/javafx/css/CssMetaDataTest.java +++ b/modules/graphics/src/test/java/com/sun/javafx/css/CssMetaDataTest.java @@ -1122,6 +1122,7 @@ f = new File(base.toURI()); } //System.err.println(f.getPath()); + assertTrue("" + f.getCanonicalPath() + " is not a directory", f.isDirectory()); recursiveCheck(f, f.getPath().length() - 7); } catch (Exception ex) { ex.printStackTrace(System.err);