Skip to content
Snippets Groups Projects
Select Git revision
  • main default protected
1 result

build.gradle

Blame
  • build.gradle 6.91 KiB
    // --- Plugin definitions ---
    plugins {
        id 'com.github.ben-manes.versions' version '0.42.0'
        id 'java'
        id 'application'
        id 'maven-publish'
        id 'idea'
        id 'org.jastadd' version "${jastaddgradle_version}"
    }
    
    // --- Dependencies ---
    repositories {
        mavenCentral()
        maven {
            name 'gitlab-maven'
            url 'https://git-st.inf.tu-dresden.de/api/v4/groups/jastadd/-/packages/maven'
        }
    }
    
    configurations {
        // add a configuration to store the dependencies of grammar printing and relast preprocessor library in
        grammar2uml
        relast
    }
    
    dependencies {
        // uncomment if dumpAst should be used; this requires graphviz in CI and on system
        // implementation group: 'de.tudresden.inf.st', name: 'dumpAst', version: "${dumpAst_version}"
        grammar2uml group: 'de.tudresden.inf.st', name: 'grammar2uml', version: "${grammar2uml_version}"
        relast group: 'org.jastadd', name: 'relast', version: "${relast_version}"
        jastadd2 group: 'org.jastadd', name: 'jastadd2', version: "${jastadd_version}"
    
        testImplementation group: 'org.assertj', name: 'assertj-core', version: "${assertj_version}"
        testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: "${jupyter_version}"
        testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: "${jupyter_version}"
    }
    
    // --- Preprocessors ---
    def genJastaddDir = './src/gen/jastadd'
    File genSrc = file("./src/gen/java")
    idea.module.generatedSourceDirs += genSrc
    sourceSets.main.java.srcDir genSrc
    
    def relastFiles = ['./src/main/jastadd/{{cookiecutter.grammar_name}}.relast']
    def grammarPrefix = "${genJastaddDir}/{{cookiecutter.grammar_name}}"
    def grammarDiagramFile = './src/gen/resources/{{cookiecutter.grammar_name}}Grammar.png'
    def jastAddListName = 'JastAddList'
    
    task generateGrammarDiagrams(type: JavaExec) {
        group = 'Documentation'
        classpath = configurations.grammar2uml
        mainClass = 'de.tudresden.inf.st.jastadd.grammar2uml.compiler.Compiler'
    
        args "--output=${grammarDiagramFile}", '--defaultFolders'
        // TODO uncomment if using multiple grammar files
        // args '--separateGrammarDiagrams=./src/gen/resources/*.png'
        args relastFiles
    
        inputs.files relastFiles
        outputs.files file(grammarDiagramFile)
    }
    
    task relastToJastAdd(type: JavaExec) {
        group = 'Build'
        classpath = configurations.relast
        //noinspection GroovyAssignabilityCheck, GroovyAccessibility
        mainClass = 'org.jastadd.relast.compiler.Compiler'
    
        doFirst {
            mkdir "${genJastaddDir}"
        }
    
        args "--grammarName=${grammarPrefix}",
                '--useJastAddNames',
                '--listClass=java.util.ArrayList',
                "--jastAddList=${jastAddListName}",
                '--file'
        args relastFiles
    
        inputs.files relastFiles
        outputs.files file("${grammarPrefix}.ast"), file("${grammarPrefix}.jadd")
    }
    
    // --- JastAdd ---
    jastadd {
        configureModuleBuild()
        modules {
            //noinspection GroovyAssignabilityCheck
            module('relast-module') {
                jastadd {
                    basedir 'src/'
                    include 'main/jastadd/**/*.ast'
                    include 'main/jastadd/**/*.jadd'
                    include 'main/jastadd/**/*.jrag'
                    include 'gen/jastadd/**/*.ast'
                    include 'gen/jastadd/**/*.jadd'
                    include 'gen/jastadd/**/*.jrag'
                }
    
                scanner {
                    // TODO add scanner here
                    // include 'src/main/jastadd/scanner/Scanner.flex'
                }
    
                parser {
                    // TODO add parser here
                    // include 'src/main/jastadd/parser/Parser.parser'
                }
            }
        }
    
        cleanGen.doFirst {
            delete 'src/gen/'
            delete 'src/gen-res/'
        }
    
        // TODO uncomment of parser is used
        // parser.name = '{{cookiecutter.grammar_name}}Parser'
        // scanner.genDir = 'src/gen/java/de/tudresden/inf/st/{{cookiecutter.repo_name}}/scanner'
        // parser.genDir = 'src/gen/java/de/tudresden/inf/st/{{cookiecutter.repo_name}}/parser'
    
        module = 'relast-module'
        astPackage = 'de.tudresden.inf.st.{{cookiecutter.repo_name}}.ast'
        genDir = genSrc
        buildInfoDir = 'src/gen-res'
    
        // default options are: '--rewrite=cnta', '--safeLazy', '--visitCheck=false', '--cacheCycle=false'
        extraJastAddOptions = ["--List=${jastAddListName}"]
    }
    
    // --- Tests ---
    test {
        testLogging.showStandardStreams = true
        useJUnitPlatform()
    }
    
    // --- Versioning and Publishing ---
    group 'de.tudresden.inf.st'
    
    java.toolchain.languageVersion = JavaLanguageVersion.of(11)
    
    ext {
        mainClassName = 'de.tudresden.inf.st.{{cookiecutter.repo_name}}.Main'
    }
    
    jar.manifest {
        attributes 'Main-Class': "${mainClassName}"
    }
    
    task fatJar(type: Jar) {
        dependsOn jar
        group = "build"
        archiveAppendix = "fatjar"
    
        manifest {
            attributes 'Main-Class': '${mainClassName}'
        }
    
        // include classes of this project
        from sourceSets.main.output
        // include classes of dependencies
        from {
            configurations.runtimeClasspath.collect { return (it.isDirectory() ? it : zipTree(it)) }
        }
    }
    
    def versionFile = 'src/main/resources/{{cookiecutter.repo_name}}Version.properties'
    def oldProps = new Properties()
    
    try {
        file(versionFile).withInputStream { stream -> oldProps.load(stream) }
        version = oldProps['version']
    } catch (e) {
        // this happens, if either the properties file is not present, or cannot be read from
        throw new GradleException("File ${versionFile} not found or unreadable. Aborting.", e)
    }
    
    task printVersion() {
        doLast {
            println(version)
        }
    }
    
    task newVersion() {
        doFirst {
            def props = new Properties()
            props['version'] = value
            props.store(file(versionFile).newWriter(), null)
        }
    }
    
    // set the main class name for `gradle run`
    application.mainClass = "${mainClassName}"
    
    // publish gitlab project
    publishing {
        publications {
            maven(MavenPublication) {
                artifactId = '{{cookiecutter.repo_name}}'
                // from components.java
                artifact("build/libs/{{cookiecutter.repo_name}}-${version}.jar") {
                    extension 'jar'
                }
            }
        }
        repositories {
            maven {
                url "https://git-st.inf.tu-dresden.de/api/v4/projects/$System.env.CI_PROJECT_ID/packages/maven"
                // Uncomment the following lines to publish manually (and comment out the other credentials section)
    //            credentials(HttpHeaderCredentials) {
    //                name = "Private-Token"
    //                value = gitLabPrivateToken // the variable resides in ~/.gradle/gradle.properties
    //            }
                credentials(HttpHeaderCredentials) {
                    name = 'Job-Token'
                    value = System.getenv("CI_JOB_TOKEN")
                }
                authentication {
                    header(HttpHeaderAuthentication)
                }
            }
    
        }
    }
    
    // --- Task order ---
    clean.dependsOn cleanGen
    generateAst.dependsOn relastToJastAdd
    publish.dependsOn jar
    
    // --- Misc ---