blob: af5bed904e12bb650aedf99d1c92ebeb02ea7019 [file] [log] [blame]
import static org.apache.tools.ant.taskdefs.condition.Os.*
apply from: "$rootDir/gradle/etGenerator.gradle"
apply from: "$rootDir/gradle/etUnitConverter.gradle"
def outputDir = 'log'
def srcGenDir = 'src-gen'
clean.delete srcGenDir, outputDir
def getMainClass(String genDir) {
// search for SubSystemRunner java file
def mainFile = fileTree(genDir, { include '**/*Runner.java' }).getSingleFile()
// relativize path to generation directory
def relPath = file(genDir).toPath().relativize(mainFile.toPath()).normalize().toString()
// remove '.java' at the end
def path = relPath.substring(0, relPath.length() - 5)
// replace all separators with '.'
def mainClass = path.replace(File.separatorChar, '.' as char)
return mainClass
}
/**
* Creates all needed tasks for one test execution
* @param lang: The eTrice generator type ('c', 'cpp', 'java')
* @param name: The test name starting with a lower case letter
* @param models: Models that are passed to the eTrice generator
* @param options: Options that are passed to the eTrice generator
*/
ext.createTest = { lang, name, models, options = [] ->
def nameCap = name.capitalize()
def langCap = lang.capitalize()
def testName = "$name$langCap"
def testNameCap = testName.capitalize()
def suiteName = "${project.name}.$testNameCap"
def genDir = "$srcGenDir/$testName"
def workingDir = "$outputDir/$testName"
def etuFile = "$workingDir/log/${nameCap}.etu"
def generateTask = createGeneratorTask("generate$testNameCap", lang, models, genDir, options)
def runTask
if(lang == 'c' || lang == 'cpp') {
model {
components {
"$testName"(NativeExecutableSpec) {
sources."$lang" {
builtBy generateTask
source {
srcDirs = [genDir]
include "**/*.$lang"
}
exportedHeaders {
srcDirs = [genDir]
}
lib project: ":runtime:org.eclipse.etrice.modellib.$lang", library: "etrice_modellib_$lang", linkage: 'static'
if(lang == 'cpp') lib project: ':runtime:org.eclipse.etrice.runtime.cpp', library: 'etrice_runtime_cpp', linkage: 'static'
lib project: ':runtime:org.eclipse.etrice.runtime.c', library: 'etrice_runtime_c', linkage: 'static'
}
binaries.all {
cCompiler.args '-g3', '-std=c99'
cppCompiler.args '-g3', '-std=c99'
if(isFamily(FAMILY_UNIX)) { linker.args '-lpthread', '-lrt', '-lm' }
}
}
}
}
def exeFile = "$buildDir/exe/$testName/$testName"
runTask = tasks.create(name: "run$testNameCap", type: Exec) {
dependsOn "${testName}Executable"
executable = exeFile
args '-run_as_test'
it.workingDir = workingDir
}
}
else if(lang == 'java') {
def testSourceSet = sourceSets.create(name) {
java.srcDirs = [genDir]
}
dependencies {
add "${name}Compile", project(':runtime:org.eclipse.etrice.modellib.java')
add "${name}Compile", project(':runtime:org.eclipse.etrice.runtime.java')
}
tasks.getByName("compile${nameCap}Java").dependsOn generateTask
runTask = tasks.create(name: "run$testNameCap", type: JavaExec) {
dependsOn "${name}Classes"
classpath = testSourceSet.runtimeClasspath
args '-run_as_test'
it.workingDir = workingDir
doFirst { main = getMainClass(genDir) }
}
}
runTask.doFirst { file("$workingDir/log").mkdirs() }
def convertTask = createEtUnitConverterTask("convert$testNameCap", [etuFile], ['-suite', suiteName])
convertTask.dependsOn runTask
check.dependsOn tasks.create(name: testName, dependsOn: convertTask, group: 'verification')
}