From 720b9e2fb0968905e5a80f6099eab37554a6af58 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Wed, 17 Nov 2021 03:06:39 +0100 Subject: build: move scripts into script plugins Script plugins allow applying other plugins from plugins { } blocks, which simplifies the build script. --- build.gradle | 6 +-- buildSrc/build.gradle | 12 +++++ buildSrc/settings.gradle | 9 ++++ .../groovy/tools.refinery.java-conventions.gradle | 45 +++++++++++++++++ .../groovy/tools.refinery.jmh-conventions.gradle | 58 ++++++++++++++++++++++ .../groovy/tools.refinery.junit-conventions.gradle | 33 ++++++++++++ .../groovy/tools.refinery.mwe2-conventions.gradle | 16 ++++++ .../groovy/tools.refinery.xtend-conventions.gradle | 37 ++++++++++++++ .../groovy/tools.refinery.xtext-conventions.gradle | 21 ++++++++ gradle/java-common.gradle | 43 ---------------- gradle/jmh.gradle | 53 -------------------- gradle/junit.gradle | 30 ----------- gradle/libs.versions.toml | 4 +- gradle/mwe2.gradle | 11 ---- gradle/xtend.gradle | 33 ------------ gradle/xtext-common.gradle | 18 ------- language-ide/build.gradle | 6 ++- language-model/build.gradle | 10 ++-- language-to-store/build.gradle | 10 ++-- language-web/build.gradle | 19 +++---- language/build.gradle | 14 +++--- store/build.gradle | 10 ++-- 22 files changed, 275 insertions(+), 223 deletions(-) create mode 100644 buildSrc/build.gradle create mode 100644 buildSrc/settings.gradle create mode 100644 buildSrc/src/main/groovy/tools.refinery.java-conventions.gradle create mode 100644 buildSrc/src/main/groovy/tools.refinery.jmh-conventions.gradle create mode 100644 buildSrc/src/main/groovy/tools.refinery.junit-conventions.gradle create mode 100644 buildSrc/src/main/groovy/tools.refinery.mwe2-conventions.gradle create mode 100644 buildSrc/src/main/groovy/tools.refinery.xtend-conventions.gradle create mode 100644 buildSrc/src/main/groovy/tools.refinery.xtext-conventions.gradle delete mode 100644 gradle/java-common.gradle delete mode 100644 gradle/jmh.gradle delete mode 100644 gradle/junit.gradle delete mode 100644 gradle/mwe2.gradle delete mode 100644 gradle/xtend.gradle delete mode 100644 gradle/xtext-common.gradle diff --git a/build.gradle b/build.gradle index 91478387..086e899a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,6 @@ plugins { - alias libs.plugins.shadow apply false - alias libs.plugins.frontend apply false - alias libs.plugins.sonarqube - alias libs.plugins.xtend apply false + id 'eclipse' + id 'org.sonarqube' } allprojects { diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle new file mode 100644 index 00000000..74fe04fb --- /dev/null +++ b/buildSrc/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'groovy-gradle-plugin' +} + +repositories { + gradlePluginPortal() +} + +dependencies { + implementation libs.sonarqubeGradle + implementation libs.xtendGradle +} diff --git a/buildSrc/settings.gradle b/buildSrc/settings.gradle new file mode 100644 index 00000000..794aa2a1 --- /dev/null +++ b/buildSrc/settings.gradle @@ -0,0 +1,9 @@ +enableFeaturePreview 'VERSION_CATALOGS' + +dependencyResolutionManagement { + versionCatalogs { + libs { + from files('../gradle/libs.versions.toml') + } + } +} diff --git a/buildSrc/src/main/groovy/tools.refinery.java-conventions.gradle b/buildSrc/src/main/groovy/tools.refinery.java-conventions.gradle new file mode 100644 index 00000000..6bea6e46 --- /dev/null +++ b/buildSrc/src/main/groovy/tools.refinery.java-conventions.gradle @@ -0,0 +1,45 @@ +plugins { + id 'eclipse' +} + +repositories { + mavenCentral() + maven { + url 'https://repo.eclipse.org/content/groups/releases/' + } +} + +sourceCompatibility = '17' +targetCompatibility = '17' + +tasks.named('jar') { + manifest { + attributes 'Bundle-SymbolicName': project.name + } +} + +def generateEclipseSourceFolders = tasks.register('generateEclipseSourceFolders') + +tasks.register('prepareEclipse') { + dependsOn generateEclipseSourceFolders + dependsOn tasks.named('eclipseJdt') +} + +tasks.named('eclipseClasspath') { + dependsOn generateEclipseSourceFolders +} + +eclipse { + classpath.file.whenMerged { + for (entry in entries) { + if (entry.path.endsWith('-gen')) { + entry.entryAttributes['ignore_optional_problems'] = true + } + } + } + + jdt.file.withProperties { properties -> + // Allow @SupperessWarnings to suppress SonarLint warnings + properties['org.eclipse.jdt.core.compiler.problem.unhandledWarningToken'] = 'ignore' + } +} diff --git a/buildSrc/src/main/groovy/tools.refinery.jmh-conventions.gradle b/buildSrc/src/main/groovy/tools.refinery.jmh-conventions.gradle new file mode 100644 index 00000000..0a82ae4b --- /dev/null +++ b/buildSrc/src/main/groovy/tools.refinery.jmh-conventions.gradle @@ -0,0 +1,58 @@ +plugins { + id 'org.sonarqube' + id 'tools.refinery.java-conventions' +} + +configurations { + jmh { + extendsFrom implementation + } +} + +sourceSets { + jmh { + java.srcDirs = ['src/jmh/java'] + resources.srcDirs = ['src/jmh/resources'] + compileClasspath += sourceSets.main.runtimeClasspath + compileClasspath += sourceSets.test.runtimeClasspath + } +} + +dependencies { + jmhImplementation libs.jmh.core + jmhAnnotationProcessor libs.jmh.annprocess +} + +tasks.register('jmh', JavaExec) { + dependsOn tasks.named('jmhClasses') + main = 'org.openjdk.jmh.Main' + classpath = sourceSets.jmh.compileClasspath + sourceSets.jmh.runtimeClasspath +} + +eclipse.classpath { + plusConfigurations += [configurations.jmhCompileClasspath, configurations.jmhRuntimeClasspath] + + file.whenMerged { classpath -> + for (entry in classpath.entries) { + // Workaround from https://github.com/gradle/gradle/issues/4802#issuecomment-407902081 + if (entry in org.gradle.plugins.ide.eclipse.model.AbstractClasspathEntry) { + def usedBy = (entry.entryAttributes['gradle_used_by_scope'] ?: '').split(',') + if (usedBy == ['jmh']) { + // Allow test helper classes to be used in benchmarks from Eclipse + // and do not expose JMH dependencies to the main source code. + entry.entryAttributes['test'] = true + } else if ((usedBy.contains('main') || usedBy.contains('test')) && !usedBy.contains('jmh')) { + // main and test sources are also used by jmh sources. + usedBy += 'jmh' + entry.entryAttributes['gradle_used_by_scope'] = usedBy.join(',') + } + } + } + } +} + +sonarqube.properties { + properties['sonar.tests'] += [ + 'src/jmh/java', + ] +} diff --git a/buildSrc/src/main/groovy/tools.refinery.junit-conventions.gradle b/buildSrc/src/main/groovy/tools.refinery.junit-conventions.gradle new file mode 100644 index 00000000..d62207b7 --- /dev/null +++ b/buildSrc/src/main/groovy/tools.refinery.junit-conventions.gradle @@ -0,0 +1,33 @@ +plugins { + id 'jacoco' + id 'tools.refinery.java-conventions' +} + +dependencies { + testImplementation libs.hamcrest + testImplementation libs.junit.api + testRuntimeOnly libs.junit.engine + testImplementation libs.junit.params + testImplementation libs.mockito.core + testImplementation libs.mockito.junit +} + +def jacocoTestReport = tasks.named('jacocoTestReport') +jacocoTestReport.configure { + dependsOn test + reports { + xml.required = true + } +} + +tasks.named('test') { + useJUnitPlatform { + excludeTags 'slow' + } + finalizedBy jacocoTestReport +} + +tasks.register('slowTest', Test) { + useJUnitPlatform() + finalizedBy jacocoTestReport +} diff --git a/buildSrc/src/main/groovy/tools.refinery.mwe2-conventions.gradle b/buildSrc/src/main/groovy/tools.refinery.mwe2-conventions.gradle new file mode 100644 index 00000000..fe213d42 --- /dev/null +++ b/buildSrc/src/main/groovy/tools.refinery.mwe2-conventions.gradle @@ -0,0 +1,16 @@ +plugins { + id 'eclipse' + id 'tools.refinery.java-conventions' +} + +configurations { + mwe2 { + extendsFrom implementation + } +} + +dependencies { + mwe2 libs.mwe2.launch +} + +eclipse.classpath.plusConfigurations += [configurations.mwe2] diff --git a/buildSrc/src/main/groovy/tools.refinery.xtend-conventions.gradle b/buildSrc/src/main/groovy/tools.refinery.xtend-conventions.gradle new file mode 100644 index 00000000..98fc131c --- /dev/null +++ b/buildSrc/src/main/groovy/tools.refinery.xtend-conventions.gradle @@ -0,0 +1,37 @@ +plugins { + id 'org.sonarqube' + id 'org.xtext.xtend' + id 'tools.refinery.java-conventions' +} + +sourceSets { + main { + xtendOutputDir = 'src/main/xtend-gen' + } + test { + xtendOutputDir = 'src/test/xtend-gen' + } +} + +xtend.generator { + // As of Xtext 2.26.0.M2, the Xbase compiler doesn't know how to handle Java 12 and up + // and the build fails with a NullPointerException if such Java version is specified. + javaSourceLevel = '11' +} + +tasks.named('clean') { + delete 'src/main/xtend-gen' + delete 'src/test/xtend-gen' +} + +sonarqube.properties { + properties['sonar.exclusions'] += [ + 'src/main/xtend-gen/**', + 'src/test/xtend-gen/**', + ] +} + +tasks.named('generateEclipseSourceFolders') { + dependsOn tasks.named('generateXtext') + dependsOn tasks.named('generateTestXtext') +} diff --git a/buildSrc/src/main/groovy/tools.refinery.xtext-conventions.gradle b/buildSrc/src/main/groovy/tools.refinery.xtext-conventions.gradle new file mode 100644 index 00000000..3fd2f9d6 --- /dev/null +++ b/buildSrc/src/main/groovy/tools.refinery.xtext-conventions.gradle @@ -0,0 +1,21 @@ +plugins { + id 'org.sonarqube' + id 'tools.refinery.java-conventions' +} + +sourceSets { + main { + java.srcDirs += ['src/main/xtext-gen'] + resources.srcDirs += ['src/main/xtext-gen'] + } +} + +tasks.named('clean') { + delete 'src/main/xtext-gen' +} + +sonarqube.properties { + properties['sonar.exclusions'] += [ + 'src/main/xtext-gen/**', + ] +} diff --git a/gradle/java-common.gradle b/gradle/java-common.gradle deleted file mode 100644 index 0a63cfe1..00000000 --- a/gradle/java-common.gradle +++ /dev/null @@ -1,43 +0,0 @@ -repositories { - mavenCentral() - maven { - url 'https://repo.eclipse.org/content/groups/releases/' - } -} - -sourceCompatibility = '17' -targetCompatibility = '17' - -tasks.named('jar') { - manifest { - attributes 'Bundle-SymbolicName': project.name - } -} - -apply plugin: 'eclipse' - -def generateEclipseSourceFolders = tasks.register('generateEclipseSourceFolders') - -tasks.register('prepareEclipse') { - dependsOn generateEclipseSourceFolders - dependsOn tasks.named('eclipseJdt') -} - -tasks.named('eclipseClasspath') { - dependsOn generateEclipseSourceFolders -} - -eclipse { - classpath.file.whenMerged { - for (entry in entries) { - if (entry.path.endsWith('-gen')) { - entry.entryAttributes['ignore_optional_problems'] = true - } - } - } - - jdt.file.withProperties { properties -> - // Allow @SupperessWarnings to suppress SonarLint warnings - properties['org.eclipse.jdt.core.compiler.problem.unhandledWarningToken'] = 'ignore' - } -} diff --git a/gradle/jmh.gradle b/gradle/jmh.gradle deleted file mode 100644 index aa58c2b7..00000000 --- a/gradle/jmh.gradle +++ /dev/null @@ -1,53 +0,0 @@ -configurations { - jmh { - extendsFrom implementation - } -} - -sourceSets { - jmh { - java.srcDirs = ['src/jmh/java'] - resources.srcDirs = ['src/jmh/resources'] - compileClasspath += sourceSets.main.runtimeClasspath - compileClasspath += sourceSets.test.runtimeClasspath - } -} - -dependencies { - jmhImplementation libs.jmh.core - jmhAnnotationProcessor libs.jmh.annprocess -} - -tasks.register('jmh', JavaExec) { - dependsOn tasks.named('jmhClasses') - main = 'org.openjdk.jmh.Main' - classpath = sourceSets.jmh.compileClasspath + sourceSets.jmh.runtimeClasspath -} - -eclipse.classpath { - plusConfigurations += [configurations.jmhCompileClasspath, configurations.jmhRuntimeClasspath] - - file.whenMerged { classpath -> - for (entry in classpath.entries) { - // Workaround from https://github.com/gradle/gradle/issues/4802#issuecomment-407902081 - if (entry in org.gradle.plugins.ide.eclipse.model.AbstractClasspathEntry) { - def usedBy = (entry.entryAttributes['gradle_used_by_scope'] ?: '').split(',') - if (usedBy == ['jmh']) { - // Allow test helper classes to be used in benchmarks from Eclipse - // and do not expose JMH dependencies to the main source code. - entry.entryAttributes['test'] = true - } else if ((usedBy.contains('main') || usedBy.contains('test')) && !usedBy.contains('jmh')) { - // main and test sources are also used by jmh sources. - usedBy += 'jmh' - entry.entryAttributes['gradle_used_by_scope'] = usedBy.join(',') - } - } - } - } -} - -sonarqube.properties { - properties['sonar.tests'] += [ - 'src/jmh/java', - ] -} diff --git a/gradle/junit.gradle b/gradle/junit.gradle deleted file mode 100644 index c5b60e47..00000000 --- a/gradle/junit.gradle +++ /dev/null @@ -1,30 +0,0 @@ -apply plugin: 'jacoco' - -dependencies { - testImplementation libs.hamcrest - testImplementation libs.junit.api - testRuntimeOnly libs.junit.engine - testImplementation libs.junit.params - testImplementation libs.mockito.core - testImplementation libs.mockito.junit -} - -def jacocoTestReport = tasks.named('jacocoTestReport') -jacocoTestReport.configure { - dependsOn test - reports { - xml.required = true - } -} - -tasks.named('test') { - useJUnitPlatform { - excludeTags 'slow' - } - finalizedBy jacocoTestReport -} - -tasks.register('slowTest', Test) { - useJUnitPlatform() - finalizedBy jacocoTestReport -} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0e711cad..3f08c9ab 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -28,8 +28,10 @@ mwe2-launch = { group = "org.eclipse.emf", name = "org.eclipse.emf.mwe2.launch", mwe2-lib = { group = "org.eclipse.emf", name = "org.eclipse.emf.mwe2.lib", version.ref = "mwe2" } slf4j-simple = { group = "org.slf4j", name = "slf4j-simple", version.ref = "slf4j" } slf4j-log4j = { group = "org.slf4j", name = "log4j-over-slf4j", version.ref = "slf4j" } +sonarqubeGradle = { group = "org.sonarsource.scanner.gradle", name = "sonarqube-gradle-plugin", version = "3.3" } viatra = { group = "org.eclipse.viatra", name = "viatra-query-runtime", version = "2.6.0" } xtend-lib = { group = "org.eclipse.xtend", name = "org.eclipse.xtend.lib", version.ref = "xtext" } +xtendGradle = { group = "org.xtext", name = "xtext-gradle-plugin", version = "3.0.0" } xtext-bom = { group = "org.eclipse.xtext", name = "xtext-dev-bom", version.ref = "xtext" } xtext-core = { group = "org.eclipse.xtext", name = "org.eclipse.xtext", version.ref = "xtext" } xtext-generator-antlr = { group = "org.eclipse.xtext", name = "xtext-antlr-generator", version = "2.1.1" } @@ -43,5 +45,3 @@ xtext-xbase-ide = { group = "org.eclipse.xtext", name = "org.eclipse.xtext.xbase [plugins] shadow = { id = "com.github.johnrengelman.shadow", version = "7.1.0" } frontend = { id = "org.siouan.frontend-jdk11", version = "5.3.0" } -sonarqube = { id = "org.sonarqube", version = "3.3" } -xtend = { id = "org.xtext.xtend", version = "3.0.0-M1" } diff --git a/gradle/mwe2.gradle b/gradle/mwe2.gradle deleted file mode 100644 index 6dc3ef67..00000000 --- a/gradle/mwe2.gradle +++ /dev/null @@ -1,11 +0,0 @@ -configurations { - mwe2 { - extendsFrom implementation - } -} - -dependencies { - mwe2 libs.mwe2.launch -} - -eclipse.classpath.plusConfigurations += [configurations.mwe2] diff --git a/gradle/xtend.gradle b/gradle/xtend.gradle deleted file mode 100644 index 94cd7dc7..00000000 --- a/gradle/xtend.gradle +++ /dev/null @@ -1,33 +0,0 @@ -apply plugin: libs.plugins.xtend.get().pluginId - -sourceSets { - main { - xtendOutputDir = 'src/main/xtend-gen' - } - test { - xtendOutputDir = 'src/test/xtend-gen' - } -} - -xtend.generator { - // As of Xtext 2.26.0.M2, the Xbase compiler doesn't know how to handle Java 12 and up - // and the build fails with a NullPointerException if such Java version is specified. - javaSourceLevel = '11' -} - -tasks.named('clean') { - delete 'src/main/xtend-gen' - delete 'src/test/xtend-gen' -} - -sonarqube.properties { - properties['sonar.exclusions'] += [ - 'src/main/xtend-gen/**', - 'src/test/xtend-gen/**', - ] -} - -tasks.named('generateEclipseSourceFolders') { - dependsOn tasks.named('generateXtext') - dependsOn tasks.named('generateTestXtext') -} diff --git a/gradle/xtext-common.gradle b/gradle/xtext-common.gradle deleted file mode 100644 index 09980a90..00000000 --- a/gradle/xtext-common.gradle +++ /dev/null @@ -1,18 +0,0 @@ -apply from: "${rootDir}/gradle/java-common.gradle" - -sourceSets { - main { - java.srcDirs += ['src/main/xtext-gen'] - resources.srcDirs += ['src/main/xtext-gen'] - } -} - -tasks.named('clean') { - delete 'src/main/xtext-gen' -} - -sonarqube.properties { - properties['sonar.exclusions'] += [ - 'src/main/xtext-gen/**', - ] -} diff --git a/language-ide/build.gradle b/language-ide/build.gradle index 65b4b786..91f21109 100644 --- a/language-ide/build.gradle +++ b/language-ide/build.gradle @@ -1,5 +1,7 @@ -apply plugin: 'java-library' -apply from: "${rootDir}/gradle/xtext-common.gradle" +plugins { + id 'java-library' + id 'tools.refinery.xtext-conventions' +} dependencies { api project(':refinery-language') diff --git a/language-model/build.gradle b/language-model/build.gradle index 666b3e7d..0add85d9 100644 --- a/language-model/build.gradle +++ b/language-model/build.gradle @@ -1,7 +1,9 @@ -apply plugin: 'java-library' -apply plugin: 'java-test-fixtures' -apply from: "${rootDir}/gradle/java-common.gradle" -apply from: "${rootDir}/gradle/mwe2.gradle" +plugins { + id 'java-library' + id 'java-test-fixtures' + id 'tools.refinery.java-conventions' + id 'tools.refinery.mwe2-conventions' +} dependencies { api libs.ecore diff --git a/language-to-store/build.gradle b/language-to-store/build.gradle index e0fd8212..ea7969b1 100644 --- a/language-to-store/build.gradle +++ b/language-to-store/build.gradle @@ -1,7 +1,9 @@ -apply plugin: 'java-library' -apply from: "${rootDir}/gradle/java-common.gradle" -apply from: "${rootDir}/gradle/junit.gradle" -apply from: "${rootDir}/gradle/xtend.gradle" +plugins { + id 'java-library' + id 'tools.refinery.java-conventions' + id 'tools.refinery.junit-conventions' + id 'tools.refinery.xtend-conventions' +} dependencies { api project(':refinery-language-model') diff --git a/language-web/build.gradle b/language-web/build.gradle index 12f2f3a0..1bacd35c 100644 --- a/language-web/build.gradle +++ b/language-web/build.gradle @@ -1,6 +1,13 @@ -apply plugin: 'java' -apply from: "${rootDir}/gradle/xtext-common.gradle" -apply from: "${rootDir}/gradle/junit.gradle" +plugins { + id 'java' + id 'application' + alias libs.plugins.frontend + alias libs.plugins.shadow + id 'tools.refinery.xtext-conventions' + id 'tools.refinery.junit-conventions' +} + +import org.siouan.frontendgradleplugin.infrastructure.gradle.RunNpmYarn dependencies { implementation project(':refinery-language') @@ -27,10 +34,6 @@ for (taskName in ['compileJava', 'processResources']) { def webpackOutputDir = "${buildDir}/webpack" def productionResources = "${webpackOutputDir}/production" def serverMainClass = 'tools.refinery.language.web.ServerLauncher' - -apply plugin: libs.plugins.frontend.get().pluginId -import org.siouan.frontendgradleplugin.infrastructure.gradle.RunNpmYarn - def nodeDirectory = "${rootDir}/.gradle/node" frontend { @@ -104,12 +107,10 @@ tasks.named('jar') { } } -apply plugin: 'application' mainClassName = serverMainClass distTar.enabled = false distZip.enabled = false -apply plugin: libs.plugins.shadow.get().pluginId shadowDistTar.enabled = false shadowDistZip.enabled = false diff --git a/language/build.gradle b/language/build.gradle index df71a85d..5eb5484d 100644 --- a/language/build.gradle +++ b/language/build.gradle @@ -1,9 +1,11 @@ -apply plugin: 'java-library' -apply plugin: 'java-test-fixtures' -apply from: "${rootDir}/gradle/xtext-common.gradle" -apply from: "${rootDir}/gradle/junit.gradle" -apply from: "${rootDir}/gradle/mwe2.gradle" -apply from: "${rootDir}/gradle/xtend.gradle" +plugins { + id 'java-library' + id 'java-test-fixtures' + id 'tools.refinery.xtext-conventions' + id 'tools.refinery.junit-conventions' + id 'tools.refinery.mwe2-conventions' + id 'tools.refinery.xtend-conventions' +} dependencies { api platform(libs.xtext.bom) diff --git a/store/build.gradle b/store/build.gradle index 0a5ba549..555c57be 100644 --- a/store/build.gradle +++ b/store/build.gradle @@ -1,7 +1,9 @@ -apply plugin: 'java-library' -apply from: "${rootDir}/gradle/java-common.gradle" -apply from: "${rootDir}/gradle/junit.gradle" -apply from: "${rootDir}/gradle/jmh.gradle" +plugins { + id 'java-library' + id 'tools.refinery.java-conventions' + id 'tools.refinery.junit-conventions' + id 'tools.refinery.jmh-conventions' +} dependencies { implementation libs.ecore -- cgit v1.2.3-70-g09d2