diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 1575429b..00000000 --- a/build.gradle +++ /dev/null @@ -1,437 +0,0 @@ -import de.itemis.mps.gradle.* -import de.itemis.mps.gradle.downloadJBR.* -import de.itemis.mps.gradle.tasks.* - -plugins { - id 'de.itemis.mps.gradle.common' version '1.29.1.+' - id 'download-jbr' version '1.29.1.+' - id 'base' - id 'maven-publish' - id 'co.riiid.gradle' version '0.4.2' - - id 'de.itemis.mps.gradle.launcher' version '2.5.2.+' - - id 'org.cyclonedx.bom' version '2.2.0' -} - -ext.jbrVers = '21.0.6-b895.109' - -downloadJbr { - jbrVersion = jbrVers -} - -// detect if we are in a CI build -if (System.env.CI != null && System.env.CI.toBoolean()) { - // is this github - ext.ciBuild = true -} else { - // on teamcity we are in a CI build - ext.ciBuild = project.hasProperty("teamcity") -} - -ext.major = '2025' -ext.minor = '1' -ext.bugfix = '' -ext.mpsVersion = ext.major + '.' + ext.minor + (ext.bugfix ? '.' + ext.bugfix : '') - -if (ciBuild) { - String branch = GitBasedVersioning.gitBranch - def buildNumber = System.env.GITHUB_RUN_NUMBER != null ? System.env.GITHUB_RUN_NUMBER.toInteger() : System.env.BUILD_NUMBER.toInteger() - if (branch.startsWith("maintenance") || branch.startsWith("mps")) { - version = "$major.$minor.$buildNumber.${GitBasedVersioning.gitShortCommitHash}" - } else { - version = GitBasedVersioning.getVersionWithCount(major, minor, buildNumber) - } - - println "##teamcity[buildNumber '${version}']" -} else { - println "Local build detected, version will be SNAPSHOT" - version = "$major.$minor-SNAPSHOT" -} - -group = 'org.mpsqa' - -configurations { - mps - // includes also junit tasks support - antLib - - plantuml { transitive = false } - baseLib { transitive = false } - treemap { transitive = false } - jacoco { transitive = false } -} - -dependencies { - mps "com.jetbrains:mps:$mpsVersion" - - antLib "org.apache.ant:ant-junit:1.10.15" - antLib "org.jacoco:org.jacoco.ant:0.8.13" - - plantuml "net.sourceforge.plantuml:plantuml-asl:1.2025.2" - - baseLib "org.apache.commons:commons-lang3:3.17.0" - baseLib "commons-cli:commons-cli:1.5.0" - baseLib "commons-io:commons-io:2.18.0" - - treemap "net.sf.jtreemap:jtreemap:1.1.3" - treemap "net.sf.jtreemap:ktreemap:1.1.0-atlassian-01" - - def asmVersion = "9.2" - def jacocoVersion = "0.8.13" - - jacoco "org.ow2.asm:asm:$asmVersion" - jacoco "org.ow2.asm:asm-commons:$asmVersion" - jacoco "org.ow2.asm:asm-tree:$asmVersion" - jacoco "org.jacoco:org.jacoco.agent:$jacocoVersion" - jacoco "org.jacoco:org.jacoco.ant:$jacocoVersion" - jacoco "org.jacoco:org.jacoco.core:$jacocoVersion" - jacoco "org.jacoco:org.jacoco.report:$jacocoVersion" -} - -repositories { - maven { - url 'https://maven.pkg.github.com/mbeddr/*' - credentials { - username = project.findProperty("github_username") ?: System.getenv("GITHUB_ACTOR") - password = project.findProperty("github_token") ?: System.getenv("GITHUB_TOKEN") - } - } - maven { - url 'https://artifacts.itemis.cloud/repository/maven-mps/' - } - maven { - url 'https://packages.atlassian.com/maven-public/' - } - mavenCentral() -} - -ext.skipResolveMps = project.hasProperty('mpsHomeDir') -ext.mpsHomeDir = rootProject.file(project.findProperty('mpsHomeDir') ?: "$buildDir/mps") - -if (project.skipResolveMps) { - task resolveMps { - doLast { - logger.info "MPS resolution skipped" - logger.info "MPS home: " + mpsHomeDir.getAbsolutePath() - } - } -} else { - task resolveMps(type: Sync) { - dependsOn configurations.mps - from { - configurations.mps.resolve().collect { zipTree(it) } - } - into mpsHomeDir - } -} - -// tools needed for compiler support in ant calls -ext.buildScriptClasspath = project.configurations.antLib - -def artifactsDir = file("$buildDir/artifacts") -def reportsDir = file("$buildDir/reports") -def dependenciesDir = file("$buildDir/dependencies") - - -// ___________________ utilities ___________________ - -def defaultScriptArgs = [ - 'mps.home' : mpsHomeDir, - 'mps_home' : mpsHomeDir, - 'build.jna.library.path' : new File(mpsHomeDir, "lib/jna/${System.getProperty('os.arch')}"), - 'mpsqa.home' : rootDir, - 'build.dir' : buildDir, - 'version' : version, - 'build.date' : new Date(), -] - -// enables https://github.com/mbeddr/mps-gradle-plugin#providing-global-defaults -task configureJava { - dependsOn "downloadJbr" - doLast { - project.ext["itemis.mps.gradle.ant.defaultScriptArgs"] = defaultScriptArgs.collect { "-D$it.key=$it.value".toString() } - project.ext["itemis.mps.gradle.ant.defaultScriptClasspath"] = buildScriptClasspath - project.ext["itemis.mps.gradle.ant.defaultJavaExecutable"] = tasks.getByName("downloadJbr").javaExecutable - println project.findProperty("itemis.mps.gradle.ant.defaultJavaExecutable") - } -} - -// All MPS tasks depend on configureJava and resolveMps -tasks.withType(RunAntScript).configureEach { - dependsOn(configureJava, resolveMps) -} - -File scriptFile(String name) { - file("$buildDir/scripts/$name") -} - -def createResolveTask(taskName, configurationName, outputDir) { - tasks.register(taskName, Sync) { - from configurations."${configurationName}" - into file(outputDir) - // Strip version numbers from file names - rename { filename -> - def ra = configurations."${configurationName}".resolvedConfiguration.resolvedArtifacts.find { ResolvedArtifact ra -> ra.file.name == filename } - String finalName - if (ra.classifier != null) { - finalName = "${ra.name}-${ra.classifier}.${ra.extension}" - } else { - finalName = "${ra.name}.${ra.extension}" - } - return finalName - } - } -} - -// Define tasks using the reusable function -createResolveTask('resolvePlantUML', 'plantuml', 'code/languages/org.mpsqa.arch/solutions/org.mpsqa.arch.pluginSolution/lib') -createResolveTask('resolveBaseLibs', 'baseLib', 'code/languages/org.mpsqa.base/solutions/org.mpsqa.base.lib/lib') -createResolveTask('resolveTreeMap', 'treemap', 'code/languages/org.mpsqa.base/solutions/org.mpsqa.treemap.lib/lib') -createResolveTask('resolveJacoco', 'jacoco', 'code/languages/org.mpsqa.testing/solutions/org.mpsqa.testcov.jacoco.rt/lib/lib') - -task resolveDependencies(dependsOn: [resolvePlantUML, resolveBaseLibs, resolveTreeMap, resolveJacoco]) - - -def build_allScripts = tasks.register('build_allScripts', BuildLanguages) { - dependsOn resolveDependencies - script scriptFile('build_all_scripts.xml') -} - -// All other MPS tasks depend on build_allScripts -tasks.withType(RunAntScript).configureEach { - if (it.name != build_allScripts.name) { - it.dependsOn(build_allScripts) - } -} - -task build_base_languages(type: BuildLanguages) { - script scriptFile('build-base-languages.xml') -} - -task build_testing_languages(type: BuildLanguages, dependsOn: [build_base_languages]) { - script scriptFile('build-testing-languages.xml') -} - -task test_testing(type: TestLanguages, dependsOn: [build_testing_languages]) { - // MPS build language generator is confused about the basedir of the generated script so we set it manually - scriptArgs = ["-Dbasedir=${file('code/languages/org.mpsqa.testing')}"] - script scriptFile("test-testing.xml") -} - -task build_clones_languages(type: BuildLanguages, dependsOn: [build_base_languages]) { - script scriptFile("build-clones-languages.xml") -} - -task build_mutant_languages(type: BuildLanguages, dependsOn: [build_base_languages]) { - script scriptFile("build-mutant-languages.xml") -} - -task build_unused_languages(type: BuildLanguages, dependsOn: [build_base_languages]) { - script scriptFile("build-unused-languages-analysis.xml") -} - -task build_arch_languages(type: BuildLanguages, dependsOn: [build_base_languages]) { - script scriptFile("build-arch-analysis-languages.xml") -} - -task build_deprecation_analysis_languages(type: BuildLanguages, dependsOn: [build_base_languages]) { - script scriptFile("build-deprecated-analysis-languages.xml") -} - -task build_lint_analysis_languages(type: BuildLanguages, dependsOn: [build_base_languages]) { - script scriptFile("build-lint-analysis-languages.xml") -} - -task build_profile_languages(type: BuildLanguages, dependsOn: [build_base_languages]) { - script scriptFile("build-profile-languages.xml") -} - -task build_sandboxes(type: BuildLanguages) { - dependsOn 'build_base_languages' - dependsOn 'build_unused_languages' - dependsOn 'build_unused_languages' - dependsOn ':testing:sandbox:assemble' - - script "$buildDir/scripts/build-sandboxes.xml" -} - -tasks.register('build_main_languages') { - dependsOn 'build_base_languages' - dependsOn 'build_testing_languages' - dependsOn 'build_clones_languages' - dependsOn 'build_mutant_languages' - dependsOn 'build_unused_languages' - dependsOn 'build_arch_languages' - dependsOn 'build_deprecation_analysis_languages' - dependsOn 'build_lint_analysis_languages' - dependsOn 'build_profile_languages' -} - -tasks.register('build_all_languages') { - dependsOn 'build_main_languages' - - dependsOn 'build_sandboxes' -} - -task build_allInOne_package(type: BuildLanguages, dependsOn: [build_allScripts]) { - dependsOn 'build_main_languages' - script scriptFile("build-allInOne-package.xml") -} - -task package_mpsqa(type: Zip, dependsOn: [build_allInOne_package, cyclonedxBom]) { - archiveBaseName = 'org.mpsqa' - from(artifactsDir) { - include 'org.mpsqa.allInOne/**' - } - from(reportsDir) { - include 'sbom.json' - into 'org.mpsqa.allInOne' - } -} - -task test_clones(type: TestLanguages, dependsOn: build_clones_languages) { - description "Will execute clones tests from command line" - script scriptFile("test-clones.xml") -} - -task test_lint(type: TestLanguages, dependsOn: build_lint_analysis_languages) { - description "Will execute lint tests from command line" - script scriptFile("build-lint-tests.xml") -} - -tasks.register('check_lint', MpsCheck) { - dependsOn(resolveMps) - - dependsOn(build_lint_analysis_languages) - projectLocation = file('code/languages/org.mpsqa.lint') - mpsHome = mpsHomeDir - - folderMacros.put('mpsqa.home', rootProject.layout.projectDirectory) - - pluginRoots.add(layout.dir(provider { new File(mpsHomeDir, 'plugins/mps-console') })) - pluginRoots.add(layout.dir(provider { new File(mpsHomeDir, 'plugins/mps-modelchecker') })) -} - -cyclonedxBom { - destination = reportsDir - outputName = "sbom" - outputFormat = "json" - includeLicenseText = false - includeConfigs = ["plantuml","baseLib","treemap","jacoco"] -} - -check.dependsOn(tasks.withType(TestLanguages)) - -assemble.dependsOn(tasks.withType(BuildLanguages)) - -publishing { - repositories { - maven { - name = "GitHubPackages" - url = uri("https://maven.pkg.github.com/mbeddr/mps-qa") - credentials { - username = project.findProperty("github_username") ?: System.getenv("GITHUB_ACTOR") - password = project.findProperty("github_token") ?: System.getenv("GITHUB_TOKEN") - } - } - if (project.hasProperty("artifacts.itemis.cloud.user") && project.hasProperty("artifacts.itemis.cloud.pw")) { - maven { - name = "ItemisNexus" - url = uri("https://artifacts.itemis.cloud/repository/maven-mps-releases") - credentials { - username = project.findProperty("artifacts.itemis.cloud.user") - password = project.findProperty("artifacts.itemis.cloud.pw") - } - } - } - } - publications { - MPSQA(MavenPublication) { - groupId 'org.mpsqa' - artifactId 'all-in-one' - artifact package_mpsqa - pom.withXml { - def dependenciesNode = asNode().appendNode('dependencies') - def languageLibs = ['plantuml', 'baseLib', 'treemap', 'jacoco'] - languageLibs.each { configName -> - def configuration = configurations.findByName(configName) - - configuration.resolvedConfiguration.firstLevelModuleDependencies.each { - def dependencyNode = dependenciesNode.appendNode('dependency') - dependencyNode.appendNode('groupId', it.moduleGroup) - dependencyNode.appendNode('artifactId', it.moduleName) - dependencyNode.appendNode('version', it.moduleVersion) - dependencyNode.appendNode('type', it.moduleArtifacts[0].type) - dependencyNode.appendNode('scope', 'provided') - } - } - - configurations.mps.resolvedConfiguration.firstLevelModuleDependencies.each { - def dependencyNode = dependenciesNode.appendNode('dependency') - dependencyNode.appendNode('groupId', it.moduleGroup) - dependencyNode.appendNode('artifactId', it.moduleName) - dependencyNode.appendNode('version', it.moduleVersion) - dependencyNode.appendNode('type', it.moduleArtifacts[0].type) - dependencyNode.appendNode('scope', 'provided') - } - } - } - } -} - -task cleanMps(type: Delete) { - delete fileTree(dir: projectDir, include: ["**/classes_gen/**", "**/source_gen/**", "**/source_gen.caches/**", "tmp/**"]) -} - -clean.dependsOn cleanMps - -defaultTasks 'build' - -task rebuild(dependsOn:[clean, build_allInOne_package]) - -ext.allProjectDirectoriesInDependencyOrder = [ - 'org.mpsqa.base', - 'org.mpsqa.testing', - 'org.mpsqa.build', - - 'org.mpsqa.arch', - 'org.mpsqa.clones', - 'org.mpsqa.deprecated', - 'org.mpsqa.lint', - 'org.mpsqa.mutant', - 'org.mpsqa.profile', - 'org.mpsqa.testing', - 'org.mpsqa.unused' -].collect { file("code/languages/$it") } -ext.mpsPluginRoots = ['mps-build', 'mps-console', 'mps-trove', 'mps-modelchecker', 'mps-tooltips', 'mps-testing'] - .collect { new File(mpsHomeDir, "plugins/$it") } -ext.jbrJavaLauncher = tasks.named('downloadJbr', DownloadJbrForPlatform).flatMap { it.javaLauncher } - -tasks.register('migrate', MpsMigrate) { - dependsOn(resolveMps, 'downloadJbr', 'build_all_languages') - - javaLauncher = jbrJavaLauncher - mpsHome = mpsHomeDir - folderMacros.put('mpsqa.home', layout.projectDirectory) - projectDirectories.from(allProjectDirectoriesInDependencyOrder) - pluginRoots.from(mpsPluginRoots) - - haltOnPrecheckFailure = true - haltOnDependencyError = true -} - -tasks.register('remigrate', Remigrate) { - dependsOn(resolveMps, 'downloadJbr') - mustRunAfter('migrate') - - // Technically we don't need to _depend_ on build_all_languages because we can opt to rerun only migrations that - // come from MPS. - mustRunAfter('build_all_languages') - - javaLauncher = jbrJavaLauncher - mpsHome = mpsHomeDir - folderMacros.put('mpsqa.home', layout.projectDirectory) - projectDirectories.from(allProjectDirectoriesInDependencyOrder) - pluginRoots.from(mpsPluginRoots) -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 00000000..a8ff6c2e --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,448 @@ +import de.itemis.mps.gradle.* +import de.itemis.mps.gradle.downloadJBR.* +import de.itemis.mps.gradle.tasks.* +import org.gradle.api.artifacts.ResolvedArtifact +import java.util.* + +plugins { + id("de.itemis.mps.gradle.common") version "1.29.3.+" + id("download-jbr") version "1.29.3.+" + id("base") + id("maven-publish") + id("co.riiid.gradle") version "0.4.2" + + id("de.itemis.mps.gradle.launcher") version "2.7.0.+" + + id("org.cyclonedx.bom") version "2.2.0" +} + +val jbrVers = "21.0.6-b895.109" + +downloadJbr { + jbrVersion = jbrVers +} + +// detect if we are in a CI build +val ciBuild = if (System.getenv("CI") != null && System.getenv("CI").toBoolean()) { + // is this github + true +} else { + // on teamcity we are in a CI build + project.hasProperty("teamcity") +} + +val mpsVersion = "2025.1" + +// Project versions +val major = mpsVersion.substring(0, 4) +val minor = mpsVersion.substring(5, 6) + +version = if (ciBuild) { + val branch = GitBasedVersioning.getGitBranch() + val buildNumber = System.getenv("GITHUB_RUN_NUMBER")?.toInt() ?: System.getenv("BUILD_NUMBER")?.toInt() ?: 0 + if (branch.startsWith("maintenance") || branch.startsWith("mps")) { + "$major.$minor.$buildNumber.${GitBasedVersioning.getGitShortCommitHash()}" + } else { + GitBasedVersioning.getVersionWithCount(major, minor, buildNumber) + } + .also { println("##teamcity[buildNumber '$it']") } +} else { + println("Local build detected, version will be SNAPSHOT") + "$major.$minor-SNAPSHOT" +} + +group = "org.mpsqa" + +val mps by configurations.creating +val antLib by configurations.creating +val plantuml by configurations.creating { isTransitive = false } +val baseLib by configurations.creating { isTransitive = false } +val treemap by configurations.creating { isTransitive = false } +val jacoco by configurations.creating { isTransitive = false } + +dependencies { + mps("com.jetbrains:mps:$mpsVersion") + + plantuml("net.sourceforge.plantuml:plantuml-asl:1.2025.2") + + baseLib("org.apache.commons:commons-lang3:3.17.0") + baseLib("commons-cli:commons-cli:1.5.0") + baseLib("commons-io:commons-io:2.18.0") + + treemap("net.sf.jtreemap:jtreemap:1.1.3") + treemap("net.sf.jtreemap:ktreemap:1.1.0-atlassian-01") + + val asmVersion = "9.2" + val jacocoVersion = "0.8.13" + + jacoco("org.ow2.asm:asm:$asmVersion") + jacoco("org.ow2.asm:asm-commons:$asmVersion") + jacoco("org.ow2.asm:asm-tree:$asmVersion") + jacoco("org.jacoco:org.jacoco.agent:$jacocoVersion") + jacoco("org.jacoco:org.jacoco.ant:$jacocoVersion") + jacoco("org.jacoco:org.jacoco.core:$jacocoVersion") + jacoco("org.jacoco:org.jacoco.report:$jacocoVersion") + + antLib("org.apache.ant:ant-junit:1.10.15") + antLib("org.jacoco:org.jacoco.ant:0.8.13") +} + +repositories { + maven("https://maven.pkg.github.com/mbeddr/*") { + credentials { + username = project.findProperty("github_username") as String? ?: System.getenv("GITHUB_ACTOR") + password = project.findProperty("github_token") as String? ?: System.getenv("GITHUB_TOKEN") + } + } + maven("https://artifacts.itemis.cloud/repository/maven-mps/") + maven("https://packages.atlassian.com/maven-public/") + mavenCentral() +} + +val skipResolveMps = project.hasProperty("mpsHomeDir") +val mpsHomeDir = rootProject.file(project.findProperty("mpsHomeDir") ?: "$buildDir/mps") + +val resolveMps = if (skipResolveMps) { + tasks.register("resolveMps") { + doLast { + logger.info("MPS resolution skipped") + logger.info("MPS home: ${mpsHomeDir.absolutePath}") + } + } +} else { + tasks.register("resolveMps", Sync::class) { + dependsOn(configurations["mps"]) + from({ + configurations["mps"].resolve().map { zipTree(it) } + }) + into(mpsHomeDir) + } +} + +// tools needed for compiler support in ant calls +val buildScriptClasspath = project.configurations.getByName("antLib") + +val artifactsDir = file("$buildDir/artifacts") +val reportsDir = file("$buildDir/reports") +val dependenciesDir = file("$buildDir/dependencies") + +// ___________________ utilities ___________________ + +val defaultScriptArgs = mapOf( + "mps.home" to mpsHomeDir, + "mps_home" to mpsHomeDir, + "build.jna.library.path" to File(mpsHomeDir, "lib/jna/${System.getProperty("os.arch")}"), + "mpsqa.home" to rootDir, + "build.dir" to buildDir, + "version" to version, + "build.date" to Date() +) + +// enables https://github.com/mbeddr/mps-gradle-plugin#providing-global-defaults +val configureJava = tasks.register("configureJava") { + dependsOn("downloadJbr") + doLast { + project.extra["itemis.mps.gradle.ant.defaultScriptArgs"] = defaultScriptArgs.map { "-D${it.key}=${it.value}" } + project.extra["itemis.mps.gradle.ant.defaultScriptClasspath"] = buildScriptClasspath + project.extra["itemis.mps.gradle.ant.defaultJavaExecutable"] = tasks.getByName("downloadJbr").property("javaExecutable") + println(project.findProperty("itemis.mps.gradle.ant.defaultJavaExecutable")) + } +} + +// All MPS tasks depend on configureJava and resolveMps +tasks.withType { + dependsOn(configureJava, resolveMps) +} + +fun scriptFile(name: String): File = file("$buildDir/scripts/$name") + +fun createResolveTask(taskName: String, configurationName: String, outputDir: String) { + tasks.register(taskName, Sync::class) { + from(configurations[configurationName]) + into(file(outputDir)) + // Strip version numbers from file names + rename { filename -> + val ra = configurations[configurationName].resolvedConfiguration.resolvedArtifacts.find { ra: ResolvedArtifact -> ra.file.name == filename } + val finalName = if (ra?.classifier != null) { + "${ra.name}-${ra.classifier}.${ra.extension}" + } else { + "${ra?.name}.${ra?.extension}" + } + finalName + } + } +} + +// Define tasks using the reusable function +createResolveTask("resolvePlantUML", "plantuml", "code/languages/org.mpsqa.arch/solutions/org.mpsqa.arch.pluginSolution/lib") +createResolveTask("resolveBaseLibs", "baseLib", "code/languages/org.mpsqa.base/solutions/org.mpsqa.base.lib/lib") +createResolveTask("resolveTreeMap", "treemap", "code/languages/org.mpsqa.base/solutions/org.mpsqa.treemap.lib/lib") +createResolveTask("resolveJacoco", "jacoco", "code/languages/org.mpsqa.testing/solutions/org.mpsqa.testcov.jacoco.rt/lib/lib") + +val resolveDependencies = tasks.register("resolveDependencies") { + dependsOn("resolvePlantUML", "resolveBaseLibs", "resolveTreeMap", "resolveJacoco") +} + +val build_allScripts = tasks.register("build_allScripts", BuildLanguages::class) { + dependsOn(resolveDependencies) + script = scriptFile("build_all_scripts.xml") +} + +// All other MPS tasks depend on build_allScripts +tasks.withType { + if (name != build_allScripts.name) { + dependsOn(build_allScripts) + } +} + +val build_base_languages = tasks.register("build_base_languages", BuildLanguages::class) { + script = scriptFile("build-base-languages.xml") +} + +val build_testing_languages = tasks.register("build_testing_languages", BuildLanguages::class) { + dependsOn(build_base_languages) + script = scriptFile("build-testing-languages.xml") +} + +val test_testing = tasks.register("test_testing", TestLanguages::class) { + dependsOn(build_testing_languages) + // MPS build language generator is confused about the basedir of the generated script so we set it manually + scriptArgs = listOf("-Dbasedir=${file("code/languages/org.mpsqa.testing")}") + script = scriptFile("test-testing.xml") +} + +val build_clones_languages = tasks.register("build_clones_languages", BuildLanguages::class) { + dependsOn(build_base_languages) + script = scriptFile("build-clones-languages.xml") +} + +val build_mutant_languages = tasks.register("build_mutant_languages", BuildLanguages::class) { + dependsOn(build_base_languages) + script = scriptFile("build-mutant-languages.xml") +} + +val build_unused_languages = tasks.register("build_unused_languages", BuildLanguages::class) { + dependsOn(build_base_languages) + script = scriptFile("build-unused-languages-analysis.xml") +} + +val build_arch_languages = tasks.register("build_arch_languages", BuildLanguages::class) { + dependsOn(build_base_languages) + script = scriptFile("build-arch-analysis-languages.xml") +} + +val build_deprecation_analysis_languages = tasks.register("build_deprecation_analysis_languages", BuildLanguages::class) { + dependsOn(build_base_languages) + script = scriptFile("build-deprecated-analysis-languages.xml") +} + +val build_lint_analysis_languages = tasks.register("build_lint_analysis_languages", BuildLanguages::class) { + dependsOn(build_base_languages) + script = scriptFile("build-lint-analysis-languages.xml") +} + +val build_profile_languages = tasks.register("build_profile_languages", BuildLanguages::class) { + dependsOn(build_base_languages) + script = scriptFile("build-profile-languages.xml") +} + +val build_sandboxes = tasks.register("build_sandboxes", BuildLanguages::class) { + dependsOn("build_base_languages") + dependsOn("build_unused_languages") + dependsOn("build_unused_languages") + dependsOn(":testing:sandbox:assemble") + + script = file("$buildDir/scripts/build-sandboxes.xml") +} + +tasks.register("build_main_languages") { + dependsOn("build_base_languages") + dependsOn("build_testing_languages") + dependsOn("build_clones_languages") + dependsOn("build_mutant_languages") + dependsOn("build_unused_languages") + dependsOn("build_arch_languages") + dependsOn("build_deprecation_analysis_languages") + dependsOn("build_lint_analysis_languages") + dependsOn("build_profile_languages") +} + +tasks.register("build_all_languages") { + dependsOn("build_main_languages") + dependsOn("build_sandboxes") +} + +val build_allInOne_package = tasks.register("build_allInOne_package", BuildLanguages::class) { + dependsOn(build_allScripts) + dependsOn("build_main_languages") + script = scriptFile("build-allInOne-package.xml") +} + +val package_mpsqa = tasks.register("package_mpsqa", Zip::class) { + dependsOn(build_allInOne_package, "cyclonedxBom") + archiveBaseName.set("org.mpsqa") + from(artifactsDir) { + include("org.mpsqa.allInOne/**") + } + from(reportsDir) { + include("sbom.json") + into("org.mpsqa.allInOne") + } +} + +val test_clones = tasks.register("test_clones", TestLanguages::class) { + dependsOn(build_clones_languages) + description = "Will execute clones tests from command line" + script = scriptFile("test-clones.xml") +} + +val test_lint = tasks.register("test_lint", TestLanguages::class) { + dependsOn(build_lint_analysis_languages) + description = "Will execute lint tests from command line" + script = scriptFile("build-lint-tests.xml") +} + +tasks.register("check_lint", MpsCheck::class) { + dependsOn(resolveMps) + dependsOn(build_lint_analysis_languages) + projectLocation = file("code/languages/org.mpsqa.lint") + mpsHome = mpsHomeDir + + folderMacros.put("mpsqa.home", rootProject.layout.projectDirectory) + + pluginRoots.add(layout.dir(provider { File(mpsHomeDir, "plugins/mps-console") })) + pluginRoots.add(layout.dir(provider { File(mpsHomeDir, "plugins/mps-modelchecker") })) +} + +tasks.cyclonedxBom { + destination = reportsDir + outputName = "sbom" + outputFormat = "json" + includeLicenseText = false + includeConfigs = listOf("plantuml", "baseLib", "treemap", "jacoco") +} + +tasks.named("check") { + dependsOn(tasks.withType()) +} + +tasks.named("assemble") { + dependsOn(tasks.withType()) +} + +publishing { + repositories { + maven("https://maven.pkg.github.com/mbeddr/mps-qa") { + name = "GitHubPackages" + credentials { + username = project.findProperty("github_username") as String? ?: System.getenv("GITHUB_ACTOR") + password = project.findProperty("github_token") as String? ?: System.getenv("GITHUB_TOKEN") + } + } + if (project.hasProperty("artifacts.itemis.cloud.user") && project.hasProperty("artifacts.itemis.cloud.pw")) { + maven("https://artifacts.itemis.cloud/repository/maven-mps-releases") { + name = "ItemisNexus" + credentials { + username = project.findProperty("artifacts.itemis.cloud.user") as String? + password = project.findProperty("artifacts.itemis.cloud.pw") as String? + } + } + } + } + publications { + register("MPSQA") { + groupId = "org.mpsqa" + artifactId = "all-in-one" + artifact(package_mpsqa) + pom.withXml { + val dependenciesNode = asNode().appendNode("dependencies") + val languageLibs = listOf("plantuml", "baseLib", "treemap", "jacoco") + languageLibs.forEach { configName -> + val configuration = configurations.findByName(configName) + + configuration?.resolvedConfiguration?.firstLevelModuleDependencies?.forEach { + val dependencyNode = dependenciesNode.appendNode("dependency") + dependencyNode.appendNode("groupId", it.moduleGroup) + dependencyNode.appendNode("artifactId", it.moduleName) + dependencyNode.appendNode("version", it.moduleVersion) + dependencyNode.appendNode("type", it.moduleArtifacts.first().type) + dependencyNode.appendNode("scope", "provided") + } + } + + configurations["mps"].resolvedConfiguration.firstLevelModuleDependencies.forEach { + val dependencyNode = dependenciesNode.appendNode("dependency") + dependencyNode.appendNode("groupId", it.moduleGroup) + dependencyNode.appendNode("artifactId", it.moduleName) + dependencyNode.appendNode("version", it.moduleVersion) + dependencyNode.appendNode("type", it.moduleArtifacts.first().type) + dependencyNode.appendNode("scope", "provided") + } + } + } + } +} + +val cleanMps = tasks.register("cleanMps", Delete::class) { + delete(fileTree(projectDir) { + include("**/classes_gen/**", "**/source_gen/**", "**/source_gen.caches/**", "tmp/**") + }) +} + +tasks.named("clean") { + dependsOn(cleanMps) +} + +defaultTasks("build") + +val rebuild = tasks.register("rebuild") { + dependsOn("clean", build_allInOne_package) +} + +val allProjectDirectoriesInDependencyOrder = listOf( + "org.mpsqa.base", + "org.mpsqa.testing", + "org.mpsqa.build", + + "org.mpsqa.arch", + "org.mpsqa.clones", + "org.mpsqa.deprecated", + "org.mpsqa.lint", + "org.mpsqa.mutant", + "org.mpsqa.profile", + "org.mpsqa.testing", + "org.mpsqa.unused" +).map { file("code/languages/$it") } + +val mpsPluginRoots = listOf("mps-build", "mps-console", "mps-trove", "mps-modelchecker", "mps-tooltips", "mps-testing") + .map { File(mpsHomeDir, "plugins/$it") } + +val jbrJavaLauncher = tasks.named("downloadJbr").flatMap { it.javaLauncher } + +tasks.register("migrate") { + dependsOn(resolveMps, "downloadJbr", "build_all_languages") + + javaLauncher = jbrJavaLauncher + mpsHome = mpsHomeDir + folderMacros.put("mpsqa.home", layout.projectDirectory) + projectDirectories.from(allProjectDirectoriesInDependencyOrder) + pluginRoots.from(mpsPluginRoots) + + haltOnPrecheckFailure = true + haltOnDependencyError = true +} + +tasks.register("remigrate") { + dependsOn(resolveMps, "downloadJbr") + mustRunAfter("migrate") + + // Technically we don't need to _depend_ on build_all_languages because we can opt to rerun only migrations that + // come from MPS. + mustRunAfter("build_all_languages") + + javaLauncher = jbrJavaLauncher + mpsHome = mpsHomeDir + folderMacros.put("mpsqa.home", layout.projectDirectory) + projectDirectories.from(allProjectDirectoriesInDependencyOrder) + pluginRoots.from(mpsPluginRoots) +} diff --git a/code/languages/org.mpsqa.build/solutions/org.mpsqa.build/models/org.mpsqa.build._040_mutant_build.mps b/code/languages/org.mpsqa.build/solutions/org.mpsqa.build/models/org.mpsqa.build._040_mutant_build.mps index 0ade8b80..bc0677ac 100644 --- a/code/languages/org.mpsqa.build/solutions/org.mpsqa.build/models/org.mpsqa.build._040_mutant_build.mps +++ b/code/languages/org.mpsqa.build/solutions/org.mpsqa.build/models/org.mpsqa.build._040_mutant_build.mps @@ -211,6 +211,9 @@ + + + diff --git a/code/languages/org.mpsqa.build/solutions/org.mpsqa.build/models/org.mpsqa.build._050_unused_build.mps b/code/languages/org.mpsqa.build/solutions/org.mpsqa.build/models/org.mpsqa.build._050_unused_build.mps index 6955d751..14e1dd92 100644 --- a/code/languages/org.mpsqa.build/solutions/org.mpsqa.build/models/org.mpsqa.build._050_unused_build.mps +++ b/code/languages/org.mpsqa.build/solutions/org.mpsqa.build/models/org.mpsqa.build._050_unused_build.mps @@ -211,6 +211,12 @@ + + + + + + diff --git a/code/languages/org.mpsqa.build/solutions/org.mpsqa.build/models/org.mpsqa.build._060_arch_build.mps b/code/languages/org.mpsqa.build/solutions/org.mpsqa.build/models/org.mpsqa.build._060_arch_build.mps index c3f2a68c..a6c0a2d7 100644 --- a/code/languages/org.mpsqa.build/solutions/org.mpsqa.build/models/org.mpsqa.build._060_arch_build.mps +++ b/code/languages/org.mpsqa.build/solutions/org.mpsqa.build/models/org.mpsqa.build._060_arch_build.mps @@ -249,7 +249,10 @@ - + + + + diff --git a/code/languages/org.mpsqa.build/solutions/org.mpsqa.build/models/org.mpsqa.build._090_profile_build.mps b/code/languages/org.mpsqa.build/solutions/org.mpsqa.build/models/org.mpsqa.build._090_profile_build.mps index 74ccd7df..1cc4788f 100644 --- a/code/languages/org.mpsqa.build/solutions/org.mpsqa.build/models/org.mpsqa.build._090_profile_build.mps +++ b/code/languages/org.mpsqa.build/solutions/org.mpsqa.build/models/org.mpsqa.build._090_profile_build.mps @@ -228,6 +228,9 @@ + + + diff --git a/code/languages/org.mpsqa.lint/solutions/org.mpsqa.lint.generic.linters_library/models/org.mpsqa.lint.generic.linters_library.meta.mps b/code/languages/org.mpsqa.lint/solutions/org.mpsqa.lint.generic.linters_library/models/org.mpsqa.lint.generic.linters_library.meta.mps index d3c31380..0359623e 100644 --- a/code/languages/org.mpsqa.lint/solutions/org.mpsqa.lint.generic.linters_library/models/org.mpsqa.lint.generic.linters_library.meta.mps +++ b/code/languages/org.mpsqa.lint/solutions/org.mpsqa.lint.generic.linters_library/models/org.mpsqa.lint.generic.linters_library.meta.mps @@ -14,9 +14,12 @@ + + + @@ -45,6 +48,7 @@ + @@ -52,6 +56,10 @@ + + + + @@ -118,6 +126,7 @@ + @@ -136,6 +145,7 @@ + @@ -145,6 +155,9 @@ + + + @@ -195,6 +208,8 @@ + + @@ -921,5 +936,239 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/languages/org.mpsqa.lint/solutions/org.mpsqa.lint.generic.linters_library/models/org.mpsqa.lint.generic.linters_library.models.mps b/code/languages/org.mpsqa.lint/solutions/org.mpsqa.lint.generic.linters_library/models/org.mpsqa.lint.generic.linters_library.models.mps index dfeaba26..90819ae6 100644 --- a/code/languages/org.mpsqa.lint/solutions/org.mpsqa.lint.generic.linters_library/models/org.mpsqa.lint.generic.linters_library.models.mps +++ b/code/languages/org.mpsqa.lint/solutions/org.mpsqa.lint.generic.linters_library/models/org.mpsqa.lint.generic.linters_library.models.mps @@ -1867,6 +1867,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1888,8 +2047,19 @@ - - + + + + + + + + + + + + + @@ -1901,18 +2071,19 @@ - - - - + + + + + + + + - - + + - - - diff --git a/code/languages/org.mpsqa.lint/solutions/org.mpsqa.lint.mps_lang.linters_library/models/org.mpsqa.lint.mps_lang.linters_library.libraries_use.mps b/code/languages/org.mpsqa.lint/solutions/org.mpsqa.lint.mps_lang.linters_library/models/org.mpsqa.lint.mps_lang.linters_library.libraries_use.mps new file mode 100644 index 00000000..0cc6c804 --- /dev/null +++ b/code/languages/org.mpsqa.lint/solutions/org.mpsqa.lint.mps_lang.linters_library/models/org.mpsqa.lint.mps_lang.linters_library.libraries_use.mps @@ -0,0 +1,823 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/languages/org.mpsqa.lint/solutions/org.mpsqa.lint.mps_lang.linters_library/models/org.mpsqa.lint.mps_lang.linters_library.performance_constraints.mps b/code/languages/org.mpsqa.lint/solutions/org.mpsqa.lint.mps_lang.linters_library/models/org.mpsqa.lint.mps_lang.linters_library.performance_constraints.mps index 785cd658..9586fb25 100644 --- a/code/languages/org.mpsqa.lint/solutions/org.mpsqa.lint.mps_lang.linters_library/models/org.mpsqa.lint.mps_lang.linters_library.performance_constraints.mps +++ b/code/languages/org.mpsqa.lint/solutions/org.mpsqa.lint.mps_lang.linters_library/models/org.mpsqa.lint.mps_lang.linters_library.performance_constraints.mps @@ -15,8 +15,6 @@ - - diff --git a/code/languages/org.mpsqa.testing/solutions/org.mpsqa.testing.build/models/org.mpsqa.testing.build.mps b/code/languages/org.mpsqa.testing/solutions/org.mpsqa.testing.build/models/org.mpsqa.testing.build.mps index 80fdb031..c3b9e48a 100644 --- a/code/languages/org.mpsqa.testing/solutions/org.mpsqa.testing.build/models/org.mpsqa.testing.build.mps +++ b/code/languages/org.mpsqa.testing/solutions/org.mpsqa.testing.build/models/org.mpsqa.testing.build.mps @@ -393,14 +393,17 @@ - - - + + + + + + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 9bbc975c..1b33c55b 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 36e4933e..78cb6e16 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionSha256Sum=bd71102213493060956ec229d946beee57158dbd89d0e62b91bca0fa2c5f3531 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index faf93008..23d15a93 100755 --- a/gradlew +++ b/gradlew @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9d21a218..db3a6ac2 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell