group 'asmble' version '0.1.0' buildscript { ext.kotlin_version = '1.2.30' ext.asm_version = '5.2' repositories { mavenCentral() maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'me.champeau.gradle:jmh-gradle-plugin:0.4.5' } } allprojects { apply plugin: 'java' repositories { mavenCentral() } } project(':compiler') { apply plugin: 'kotlin' apply plugin: 'application' applicationName = "asmble" mainClassName = "asmble.cli.MainKt" distTar.archiveName = 'asmble.tar' distZip.archiveName = 'asmble.zip' dependencies { compile project(':annotations') compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" compile "org.ow2.asm:asm-tree:$asm_version" compile "org.ow2.asm:asm-util:$asm_version" testCompile 'junit:junit:4.12' testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" testCompile "org.ow2.asm:asm-debug-all:$asm_version" } } project(':examples') { subprojects { dependencies { compileOnly project(':compiler') } // C/C++ example helpers task cToWasm { doFirst { mkdir 'build' exec { def cFileName = fileTree(dir: 'src', includes: ['*.c']).files.iterator().next() commandLine 'clang', '--target=wasm32-unknown-unknown-wasm', '-O3', cFileName, '-c', '-o', 'build/lib.wasm' } } } task showCWast(type: JavaExec) { dependsOn cToWasm classpath configurations.compileClasspath main = 'asmble.cli.MainKt' doFirst { args 'translate', 'build/lib.wasm' } } task compileCWasm(type: JavaExec) { dependsOn cToWasm classpath configurations.compileClasspath main = 'asmble.cli.MainKt' doFirst { def outFile = 'build/wasm-classes/' + wasmCompiledClassName.replace('.', '/') + '.class' file(outFile).parentFile.mkdirs() args 'compile', 'build/lib.wasm', wasmCompiledClassName, '-out', outFile } } // Rust example helpers ext.rustBuildRelease = true task rustToWasm(type: Exec) { if (rustBuildRelease) { commandLine 'cargo', 'build', '--release' } else { commandLine 'cargo', 'build' } } ext.rustWasmFileName = { -> def buildType = rustBuildRelease ? 'release' : 'debug' def wasmFiles = fileTree(dir: "target/wasm32-unknown-unknown/$buildType", includes: ['*.wasm']).files if (wasmFiles.size() != 1) throw new GradleException('Expected single WASM file, got ' + wasmFiles.size()) return wasmFiles.iterator().next() } task rustWasmFile() { dependsOn rustToWasm doFirst { println 'File: ' + rustWasmFileName() } } task showRustWast(type: JavaExec) { dependsOn rustToWasm classpath configurations.compileClasspath main = 'asmble.cli.MainKt' doFirst { args 'translate', rustWasmFileName() } } task compileRustWasm(type: JavaExec) { dependsOn rustToWasm classpath configurations.compileClasspath main = 'asmble.cli.MainKt' doFirst { // args 'help', 'compile' def outFile = 'build/wasm-classes/' + wasmCompiledClassName.replace('.', '/') + '.class' file(outFile).parentFile.mkdirs() args 'compile', rustWasmFileName(), wasmCompiledClassName, '-out', outFile } } } } project(':examples:c-simple') { apply plugin: 'application' ext.wasmCompiledClassName = 'asmble.generated.CSimple' dependencies { compile files('build/wasm-classes') } compileJava { dependsOn compileCWasm } mainClassName = 'asmble.examples.csimple.Main' } project(':examples:rust-regex') { apply plugin: 'application' apply plugin: 'me.champeau.gradle.jmh' ext.wasmCompiledClassName = 'asmble.generated.RustRegex' dependencies { compile files('build/wasm-classes') testCompile 'junit:junit:4.12' } compileJava { dependsOn compileRustWasm } mainClassName = 'asmble.examples.rustregex.Main' test { testLogging.showStandardStreams = true testLogging.events 'PASSED', 'SKIPPED' } jmh { iterations = 5 warmupIterations = 5 fork = 3 } } project(':examples:rust-simple') { apply plugin: 'application' ext.wasmCompiledClassName = 'asmble.generated.RustSimple' dependencies { compile files('build/wasm-classes') } compileJava { dependsOn compileRustWasm } mainClassName = 'asmble.examples.rustsimple.Main' } project(':examples:rust-string') { apply plugin: 'application' ext.wasmCompiledClassName = 'asmble.generated.RustString' dependencies { compile files('build/wasm-classes') } compileJava { dependsOn compileRustWasm } mainClassName = 'asmble.examples.ruststring.Main' }