import org.gradle.api.internal.HasConvention import org.gradle.internal.impldep.org.apache.http.client.methods.RequestBuilder.options import org.jetbrains.kotlin.contracts.model.structure.UNKNOWN_COMPUTATION.type import org.jetbrains.kotlin.gradle.dsl.Coroutines import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.android.AndroidGradleWrapper.getTestVariants import org.jetbrains.kotlin.gradle.plugin.android.AndroidGradleWrapper.srcDir import java.util.Collections import java.time.Instant plugins { java maven kotlin("jvm").version("1.2.41") } apply { plugin("java") plugin("kotlin") } kotlin.experimental.coroutines = Coroutines.ENABLE group = "com.dorkbox" version = "3.13-SNAPSHOT" description = "Cross-platform SystemTray support for Swing/AWT, GtkStatusIcon, and AppIndicator on Java 6+" java { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } //configure { // setSourceCompatibility(1.7) // setTargetCompatibility(1.7) //// if (project.hasProperty("env")) { //// var env = project.property("env"); //// sourceSets.getByName("main") //// .resources.srcDirs("src/main/profile/" + env) //// } //} // This creates the configurations usable inside dependencies and allowing us custom libs when building the example jars val swingExampleCompile = configurations.create("swingExampleCompile") val javaFxExampleCompile = configurations.create("javaFxExampleCompile") val swtExampleCompile = configurations.create("swtExampleCompile") // make working with sourceSets easier val sourceSets = java.sourceSets fun sourceSets(block: SourceSetContainer.() -> Unit) = sourceSets.apply(block) val SourceSetContainer.main: SourceSet get() = maybeCreate("main") fun SourceSetContainer.main(block: SourceSet.() -> Unit) = main.apply(block) val SourceSetContainer.test: SourceSet get() = maybeCreate("test") fun SourceSetContainer.test(block: SourceSet.() -> Unit) = test.apply(block) // test/example jars val SourceSetContainer.swingExample: SourceSet get() = maybeCreate("swingExample") fun SourceSetContainer.swingExample(block: SourceSet.() -> Unit) = swingExample.apply(block) val org.gradle.api.tasks.SourceSetContainer.javaFxExample: SourceSet get() = maybeCreate("javaFxExample") fun SourceSetContainer.javaFxExample(block: SourceSet.() -> Unit) = javaFxExample.apply(block) val org.gradle.api.tasks.SourceSetContainer.swtExample: SourceSet get() = maybeCreate("swtExample") fun SourceSetContainer.swtExample(block: SourceSet.() -> Unit) = swtExample.apply(block) var SourceDirectorySet.sourceDirs: Iterable get() = srcDirs set(value) { setSrcDirs(value) } fun javaFile(vararg fileNames: String): Iterable { val fileList = ArrayList() for (name in fileNames) { val fixed = name.replace('.', '/') + ".java" fileList.add(fixed) } return fileList } sourceSets { main { java { sourceDirs = files("src") // only want to include java files for the source. 'setSrcDirs' resets includes... include("**/*.java") resources { sourceDirs = files("src") include("dorkbox/systemTray/gnomeShell/extension.js", "dorkbox/systemTray/util/error_32.png") } } } test { java { sourceDirs = files("test") // only want to include java files for the source. 'setSrcDirs' resets includes... include("**/*.java") // this is required because we reset the srcDirs to 'test' above, and 'main' must manually be added back srcDir(sourceSets.main.allJava) } } swingExample { java { sourceDirs = files("test") include(javaFile("dorkbox.TestTray", "dorkbox.CustomSwingUI")) srcDir(sourceSets.main.allJava) } resources { sourceDirs = files("test") include("dorkbox/*.png") } } javaFxExample { java { sourceDirs = files("test") include(javaFile("dorkbox.TestTray", "dorkbox.TestTrayJavaFX", "dorkbox.CustomSwingUI")) srcDir(sourceSets.main.allJava) } resources { sourceDirs = files("test") include("dorkbox/*.png") } } swtExample { java { sourceDirs = files("test") include(javaFile("dorkbox.TestTray", "dorkbox.TestTraySwt", "dorkbox.CustomSwingUI")) srcDir(sourceSets.main.allJava) } resources { sourceDirs = files("test") include("dorkbox/*.png") } } } repositories { mavenLocal() // this must be first! mavenCentral() // because the eclipse release of SWT is abandoned on maven, this MAVEN repo has newer version of SWT, maven(url = "http://maven-eclipse.github.io/maven") maven(url = "https://oss.sonatype.org/content/repositories/snapshots/") mavenCentral() } dependencies { compile(project("Utilities")) { // don't include any of the project dependencies for anything isTransitive = false } // our main dependencies are ALSO the same as the limited utilities (they are not automatically pulled in from other sourceSets) // needed by the utilities (custom since we don't want to include everything). IntelliJ includes everything, but our builds do not compile(group = "com.dorkbox", name = "ShellExecutor", version = "1.1+") compile(group = "org.javassist", name = "javassist", version = "3.21.0-GA") compile(group = "net.java.dev.jna", name = "jna", version = "4.3.0") compile(group = "net.java.dev.jna", name = "jna-platform", version = "4.3.0") compile(group = "org.slf4j", name = "slf4j-api", version = "1.7.25") val log = runtime(group = "ch.qos.logback", name = "logback-classic", version = "1.1.6") // because the eclipse release of SWT is abandoned on maven, this repo has a newer version of SWT, // http://maven-eclipse.github.io/maven // 4.4 is the oldest version that works with us. We use reflection to access SWT, so we can compile the project without needing SWT val swtDep = testCompileOnly(group = "org.eclipse.swt", name = getSwtMavenName(), version = "4.4+") // JavaFX isn't always added to the compile classpath.... testCompile(files(System.getProperty("java.home", ".") + "/lib/ext/jfxrt.jar")) // dependencies for our test examples swingExampleCompile(configurations.compile) javaFxExampleCompile(configurations.compile) swtExampleCompile(configurations.compile) swtExampleCompile(swtDep) swingExampleCompile(log) javaFxExampleCompile(log) swtExampleCompile(log) } project("Utilities") { tasks.withType { // want to remove utilities project from unit tests. It's unnecessary to run unit tests for the entire Utilities project exclude("**/*") } tasks.withType { options.encoding = "UTF-8" options.isIncremental = true options.isFork = true options.forkOptions.executable = "javac" // setup compile options. we specifically want to suppress usage of "Unsafe" options.compilerArgs = listOf("-XDignore.symbol.file", "-Xlint:deprecation") } } /////////////////////////////// ////// Task defaults /////////////////////////////// tasks.withType { options.encoding = "UTF-8" // options.bootstrapClasspath = files("/jre/lib/rt.jar") sourceCompatibility = JavaVersion.VERSION_1_6.toString() targetCompatibility = JavaVersion.VERSION_1_6.toString() } tasks.withType { setDuplicatesStrategy(DuplicatesStrategy.FAIL) manifest { attributes["Implementation-Version"] = version attributes["Built-Date"] = Instant.now().toString() } } /////////////////////////////// ////// UTILITIES COMPILE (for inclusion into jars) /////////////////////////////// task("compileUtils") { // we don't want the default include of **/*.java includes.clear() source = fileTree("../Utilities/src") include(javaFile ( "dorkbox.util.SwingUtil", "dorkbox.util.OS", "dorkbox.util.OSUtil", "dorkbox.util.OSType", "dorkbox.util.ImageResizeUtil", "dorkbox.util.ImageUtil", "dorkbox.util.CacheUtil", "dorkbox.util.IO", "dorkbox.util.JavaFX", "dorkbox.util.Property", "dorkbox.util.Keep", "dorkbox.util.FontUtil", "dorkbox.util.ScreenUtil", "dorkbox.util.ClassLoaderUtil", "dorkbox.util.Swt", "dorkbox.util.NamedThreadFactory", "dorkbox.util.ActionHandlerLong", "dorkbox.util.FileUtil", "dorkbox.util.MathUtil", "dorkbox.util.LocationResolver", "dorkbox.util.Desktop")) // entire packages/directories include("dorkbox/util/jna/**/*.java") include("dorkbox/util/windows/**/*.java") include("dorkbox/util/swing/**/*.java") classpath = sourceSets.main.compileClasspath destinationDir = file("$rootDir/build/classes_utilities") } /////////////////////////////// ////// Tasks to launch examples from gradle /////////////////////////////// task("swingExample") { classpath = sourceSets.swingExample.runtimeClasspath main = "dorkbox.TestTray" standardInput = System.`in` } task("javaFxExample") { classpath = sourceSets.javaFxExample.runtimeClasspath main = "dorkbox.TestTrayJavaFX" standardInput = System.`in` } task("swtExample") { classpath = sourceSets.swtExample.runtimeClasspath main = "dorkbox.TestTraySwt" standardInput = System.`in` } /////////////////////////////// ////// Jar Tasks /////////////////////////////// val jar: Jar by tasks jar.apply { dependsOn("compileUtils") // include applicable class files from subset of Utilities project from((tasks["compileUtils"] as JavaCompile).destinationDir) } task("jarSwingExample") { dependsOn("jar") baseName = "SystemTray-SwingExample" group = BasePlugin.BUILD_GROUP description = "Create an all-in-one example for testing, using Swing" from(sourceSets.swingExample.output.classesDirs) from(sourceSets.swingExample.output.resourcesDir) // add all of the main project jars as a fat-jar for all examples, exclude the Utilities.jar contents from(configurations.compile.filter { it.nameWithoutExtension != "Utilities"} .map { if (it.isDirectory) it else zipTree(it) }) // include applicable class files from subset of Utilities project from((tasks["compileUtils"] as JavaCompile).destinationDir) manifest { attributes["Main-Class"] = "dorkbox.TestTray" } } task("jarJavaFxExample") { dependsOn("jar") baseName = "SystemTray-JavaFxExample" group = BasePlugin.BUILD_GROUP description = "Create an all-in-one example for testing, using JavaFX" from(sourceSets.javaFxExample.output.classesDirs) from(sourceSets.javaFxExample.output.resourcesDir) // add all of the main project jars as a fat-jar for all examples, exclude the Utilities.jar contents from(configurations.compile.filter { it.nameWithoutExtension != "Utilities" } .map { if (it.isDirectory) it else zipTree(it) }) // include applicable class files from subset of Utilities project from((tasks["compileUtils"] as JavaCompile).destinationDir) manifest { attributes["Main-Class"] = "dorkbox.TestTrayJavaFX" attributes["Class-Path"] = System.getProperty("java.home", ".") + "/lib/ext/jfxrt.jar" } } task("jarSwtExample") { dependsOn("jar") baseName = "SystemTray-SwtExample" group = BasePlugin.BUILD_GROUP description = "Create an all-in-one example for testing, using SWT" from(sourceSets.swtExample.output.classesDirs) from(sourceSets.swtExample.output.resourcesDir) // add all of the main project jars as a fat-jar for all examples, exclude the Utilities.jar contents from(configurations.compile.filter { it.nameWithoutExtension != "Utilities" } .map { if (it.isDirectory) it else zipTree(it) }) // include applicable class files from subset of Utilities project from((tasks["compileUtils"] as JavaCompile).destinationDir) manifest { attributes["Main-Class"] = "dorkbox.TestTraySwt" } } task("jarAllExamples") { dependsOn("jarSwingExample") dependsOn("jarJavaFxExample") dependsOn("jarSwtExample") group = BasePlugin.BUILD_GROUP description = "Create all-in-one examples for testing, using Swing, JavaFX, and SWT" } operator fun Regex.contains(text: CharSequence): Boolean = this.matches(text) fun getSwtMavenName(): String { var platform = System.getProperty("os.name") when (platform.replace("\\s".toRegex(), "").toLowerCase()) { in Regex(".*linux.*") -> platform = "linux" in Regex(".*darwin.*") -> platform = "macosx" in Regex(".*osx.*") -> platform = "macosx" in Regex(".*win.*") -> platform = "win32" } var arch = System.getProperty("os.arch") if (arch.matches(".*64.*".toRegex())) { arch = "x86_64" } else { arch = "x86" } // because the eclipse release of SWT is abandoned on maven, this MAVEN repo has newer version of SWT, // https://github.com/maven-eclipse/maven-eclipse.github.io for the website about it // http://maven-eclipse.github.io/maven for the maven repo return "org.eclipse.swt.gtk.${platform}.${arch}" }