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
+ }
0 commit comments