Skip to content

Commit c5fdf00

Browse files
committed
fixed support for incremental builds
1 parent 3f1765c commit c5fdf00

File tree

3 files changed

+237
-160
lines changed

3 files changed

+237
-160
lines changed
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package org.modelix.metamodel.gradle
2+
3+
import org.gradle.api.DefaultTask
4+
import org.gradle.api.file.DirectoryProperty
5+
import org.gradle.api.file.RegularFileProperty
6+
import org.gradle.api.model.ObjectFactory
7+
import org.gradle.api.provider.ListProperty
8+
import org.gradle.api.provider.Property
9+
import org.gradle.api.tasks.InputDirectory
10+
import org.gradle.api.tasks.InputFiles
11+
import org.gradle.api.tasks.OutputFile
12+
import org.gradle.api.tasks.TaskAction
13+
import java.util.*
14+
import javax.inject.Inject
15+
16+
abstract class GenerateAntScriptForMpsMetaModelExport @Inject constructor(of: ObjectFactory) : DefaultTask() {
17+
@get:InputDirectory
18+
val mpsHome: DirectoryProperty = of.directoryProperty()
19+
@get:OutputFile
20+
val antScriptFile: RegularFileProperty = of.fileProperty()
21+
@InputDirectory
22+
val exporterDir: Property<String> = of.property(String::class.java)
23+
@InputFiles
24+
val moduleFolders: ListProperty<String> = of.listProperty(String::class.java)
25+
26+
@TaskAction
27+
fun generate() {
28+
val mpsVersion = getMpsVersion()
29+
val antLibs = if (mpsVersion < "2021.2") {
30+
listOf("lib/ant/lib/ant-mps.jar", "lib/log4j.jar", "lib/jdom.jar")
31+
} else if (mpsVersion < "2021.3") {
32+
listOf("lib/ant/lib/ant-mps.jar", "lib/util.jar")
33+
} else {
34+
listOf("lib/ant/lib/ant-mps.jar", "lib/util.jar", "lib/3rd-party-rt.jar")
35+
}
36+
antScriptFile.get().asFile.parentFile.mkdirs()
37+
antScriptFile.get().asFile.writeText("""
38+
<project name="export-languages" default="build">
39+
<property name="build.dir" location="build" />
40+
<property name="build.mps.config.path" location="${"$"}{build.dir}/config" />
41+
<property name="build.mps.system.path" location="${"$"}{build.dir}/system" />
42+
<property name="mps.home" location="build/mps" />
43+
<property name="artifacts.mps" location="${"$"}{mps.home}" />
44+
<property name="environment" value="env" />
45+
<property name="env.JAVA_HOME" value="${"$"}{java.home}/.." />
46+
<property name="jdk.home" value="${"$"}{env.JAVA_HOME}" />
47+
48+
<path id="path.mps.ant.path">
49+
${antLibs.joinToString("\n ") {
50+
"""<pathelement location="${"$"}{artifacts.mps}/$it" />"""
51+
}}
52+
</path>
53+
54+
<target name="build" depends="export-languages" />
55+
56+
<target name="clean">
57+
<delete dir="${"$"}{build.mps.config.path}" />
58+
<delete dir="${"$"}{build.mps.system.path}" />
59+
<delete dir="exported-languages" />
60+
</target>
61+
62+
<target name="declare-mps-tasks">
63+
<taskdef resource="jetbrains/mps/build/ant/antlib.xml" classpathref="path.mps.ant.path" />
64+
</target>
65+
66+
<target name="export-languages" depends="declare-mps-tasks">
67+
<echo message="Running export of languages" />
68+
<runMPS solution="e52a4421-48a2-4de1-8327-d9414e799c67(org.modelix.metamodel.export)" startClass="org.modelix.metamodel.export.CommandlineExporter" startMethod="exportLanguages">
69+
<library file="${getMpsLanguagesDir().absolutePath}" />
70+
<library file="${exporterDir.get()}" />
71+
${moduleFolders.get().joinToString("\n ") {
72+
"""<library file="$it" />"""
73+
}}
74+
75+
<jvmargs>
76+
<arg value="-Didea.config.path=${"$"}{build.mps.config.path}" />
77+
<arg value="-Didea.system.path=${"$"}{build.mps.system.path}" />
78+
<arg value="-ea" />
79+
<arg value="-Xmx1024m" />
80+
</jvmargs>
81+
</runMPS>
82+
</target>
83+
</project>
84+
""".trimIndent())
85+
}
86+
87+
private fun getMpsBuildPropertiesFile() = mpsHome.get().asFile.resolve("build.properties")
88+
private fun getMpsLanguagesDir() = mpsHome.get().asFile.resolve("languages")
89+
90+
private fun getMpsVersion(): String {
91+
val buildPropertiesFile = getMpsBuildPropertiesFile()
92+
require(buildPropertiesFile.exists()) { "MPS build.properties file not found: ${buildPropertiesFile.absolutePath}" }
93+
val buildProperties = Properties()
94+
buildPropertiesFile.inputStream().use { buildProperties.load(it) }
95+
96+
return listOfNotNull(
97+
buildProperties["mpsBootstrapCore.version.major"],
98+
buildProperties["mpsBootstrapCore.version.minor"],
99+
//buildProperties["mpsBootstrapCore.version.bugfixNr"],
100+
buildProperties["mpsBootstrapCore.version.eap"],
101+
)
102+
.map { it.toString().trim('.') }
103+
.filter { it.isNotEmpty() }
104+
.joinToString(".")
105+
106+
// mpsBootstrapCore.version.major=2020
107+
// mpsBootstrapCore.version.minor=3
108+
// mpsBootstrapCore.version.bugfixNr=.6
109+
// mpsBootstrapCore.version.eap=
110+
// mpsBootstrapCore.version=2020.3
111+
}
112+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package org.modelix.metamodel.gradle
2+
3+
import org.gradle.api.DefaultTask
4+
import org.gradle.api.file.DirectoryProperty
5+
import org.gradle.api.file.RegularFileProperty
6+
import org.gradle.api.model.ObjectFactory
7+
import org.gradle.api.provider.ListProperty
8+
import org.gradle.api.provider.Property
9+
import org.gradle.api.tasks.Input
10+
import org.gradle.api.tasks.InputDirectory
11+
import org.gradle.api.tasks.InputFile
12+
import org.gradle.api.tasks.InputFiles
13+
import org.gradle.api.tasks.Optional
14+
import org.gradle.api.tasks.OutputDirectory
15+
import org.gradle.api.tasks.TaskAction
16+
import org.modelix.metamodel.generator.LanguageData
17+
import org.modelix.metamodel.generator.LanguageSet
18+
import org.modelix.metamodel.generator.MetaModelGenerator
19+
import org.modelix.metamodel.generator.TypescriptMMGenerator
20+
import java.io.File
21+
import java.util.*
22+
import javax.inject.Inject
23+
24+
abstract class GenerateMetaModelSources @Inject constructor(of: ObjectFactory) : DefaultTask() {
25+
@get:InputDirectory
26+
val exportedLanguagesDir: DirectoryProperty = of.directoryProperty()
27+
@get:OutputDirectory
28+
@Optional
29+
val kotlinOutputDir: DirectoryProperty = of.directoryProperty()
30+
@get:OutputDirectory
31+
@Optional
32+
val typescriptOutputDir: DirectoryProperty = of.directoryProperty()
33+
@get:Input
34+
val includedNamespaces: ListProperty<String> = of.listProperty(String::class.java)
35+
@get:Input
36+
val includedLanguages: ListProperty<String> = of.listProperty(String::class.java)
37+
@get:Input
38+
val includedConcepts: ListProperty<String> = of.listProperty(String::class.java)
39+
@get:Input
40+
@Optional
41+
val registrationHelperName: Property<String> = of.property(String::class.java)
42+
43+
@TaskAction
44+
fun generate() {
45+
var languages: LanguageSet = LanguageSet(exportedLanguagesDir.get().asFile.walk()
46+
.filter { it.extension.lowercase() == "json" }
47+
.map { LanguageData.fromFile(it) }
48+
.toList())
49+
val previousLanguageCount = languages.getLanguages().size
50+
51+
val includedNamespaces = this.includedNamespaces.get().map { it.trimEnd('.') }
52+
val includedLanguages = this.includedLanguages.get() + includedNamespaces
53+
val namespacePrefixes = includedNamespaces.map { it + "." }
54+
val includedConcepts = this.includedConcepts.get()
55+
56+
languages = languages.filter {
57+
languages.getLanguages().filter { lang ->
58+
includedLanguages.contains(lang.name)
59+
|| namespacePrefixes.any { lang.name.startsWith(it) }
60+
}.forEach { lang ->
61+
lang.getConceptsInLanguage().forEach { concept ->
62+
includeConcept(concept.fqName)
63+
}
64+
}
65+
includedConcepts.forEach { includeConcept(it) }
66+
}
67+
println("${languages.getLanguages().size} of $previousLanguageCount languages included")
68+
69+
val kotlinOutputDir = this.kotlinOutputDir.orNull?.asFile
70+
if (kotlinOutputDir != null) {
71+
val generator = MetaModelGenerator(kotlinOutputDir.toPath())
72+
generator.generate(languages)
73+
registrationHelperName.orNull?.let {
74+
generator.generateRegistrationHelper(it, languages)
75+
}
76+
}
77+
78+
val typescriptOutputDir = this.typescriptOutputDir.orNull?.asFile
79+
if (typescriptOutputDir != null) {
80+
val tsGenerator = TypescriptMMGenerator(typescriptOutputDir.toPath())
81+
tsGenerator.generate(languages)
82+
}
83+
}
84+
}

0 commit comments

Comments
 (0)