Return C example and skip it by default

This commit is contained in:
C.Solovev 2018-11-09 10:18:49 +04:00
parent 765d8b4dba
commit 21b023f1c6
5 changed files with 96 additions and 8 deletions

View File

@ -24,7 +24,7 @@ allprojects {
version '0.4.1-fl' version '0.4.1-fl'
// skips building and running for the specified examples // skips building and running for the specified examples
ext.skipExamples = ['go-simple', 'rust-regex'] ext.skipExamples = ['c-simple', 'go-simple', 'rust-regex']
// todo disabling Rust regex is temporary because some strings in wasm code exceed the size in 65353 bytes. // todo disabling Rust regex is temporary because some strings in wasm code exceed the size in 65353 bytes.
repositories { repositories {
@ -71,6 +71,38 @@ project(':examples') {
dependencies { dependencies {
compileOnly project(':compiler') 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
}
}
// Go example helpers // Go example helpers
@ -146,10 +178,31 @@ project(':examples') {
} }
} }
project(':examples:c-simple') {
if (project.name in skipExamples) {
println("[Note!] Building and runnig for ${project.name} was skipped")
test.onlyIf { false } // explicit skipping tests
compileJava.onlyIf { false } // explicit skipping compile
return
}
apply plugin: 'application'
ext.wasmCompiledClassName = 'asmble.generated.CSimple'
dependencies {
compile files('build/wasm-classes')
}
compileJava {
dependsOn compileCWasm
}
mainClassName = 'asmble.examples.csimple.Main'
}
project(':examples:go-simple') { project(':examples:go-simple') {
if (project.name in skipExamples) { if (project.name in skipExamples) {
println("[Note!] Building and runnig for ${project.name} was skipped") println("[Note!] Building and runnig for ${project.name} was skipped")
test.onlyIf { false } // explicit skipping tests
compileJava.onlyIf { false } // explicit skipping compile
return return
} }
apply plugin: 'application' apply plugin: 'application'
@ -164,6 +217,13 @@ project(':examples:go-simple') {
} }
project(':examples:rust-regex') { project(':examples:rust-regex') {
if (project.name in skipExamples) {
println("[Note!] Building and runnig for ${project.name} was skipped")
test.onlyIf { false } // explicit skipping tests
compileJava.onlyIf { false } // explicit skipping compile
compileTestJava.onlyIf { false } // explicit skipping compile
return
}
apply plugin: 'application' apply plugin: 'application'
apply plugin: 'me.champeau.gradle.jmh' apply plugin: 'me.champeau.gradle.jmh'
ext.wasmCompiledClassName = 'asmble.generated.RustRegex' ext.wasmCompiledClassName = 'asmble.generated.RustRegex'
@ -176,13 +236,6 @@ project(':examples:go-simple') {
} }
mainClassName = 'asmble.examples.rustregex.Main' mainClassName = 'asmble.examples.rustregex.Main'
// the building will run but no test and benchmarks will run
if (project.name in skipExamples) {
println("[Note!] Building and runnig for ${project.name} was skipped")
test.onlyIf { false } // explicit skipping tests
return
}
test { test {
testLogging.showStandardStreams = true testLogging.showStandardStreams = true
testLogging.events 'PASSED', 'SKIPPED' testLogging.events 'PASSED', 'SKIPPED'
@ -197,6 +250,8 @@ project(':examples:go-simple') {
project(':examples:rust-simple') { project(':examples:rust-simple') {
if (project.name in skipExamples) { if (project.name in skipExamples) {
println("[Note!] Building and runnig for ${project.name} was skipped") println("[Note!] Building and runnig for ${project.name} was skipped")
test.onlyIf { false } // explicit skipping tests
compileJava.onlyIf { false } // explicit skipping compile
return return
} }
apply plugin: 'application' apply plugin: 'application'
@ -213,6 +268,8 @@ project(':examples:rust-simple') {
project(':examples:rust-string') { project(':examples:rust-string') {
if (project.name in skipExamples) { if (project.name in skipExamples) {
println("[Note!] Building and runnig for ${project.name} was skipped") println("[Note!] Building and runnig for ${project.name} was skipped")
test.onlyIf { false } // explicit skipping tests
compileJava.onlyIf { false } // explicit skipping compile
return return
} }
apply plugin: 'application' apply plugin: 'application'

View File

@ -0,0 +1,14 @@
### Example: C Simple
This shows a simple example of compiling C to WASM and then to the JVM. This is the C version of
[rust-simple](../rust-simple).
In order to run the C or C++ examples, the latest LLVM binaries must be on the `PATH`, built with the experimental
WebAssembly target. This can be built by passing `-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly` to `cmake` when
building WebAssembly. Or it can be downloaded from a nightly build site
([this one](http://gsdview.appspot.com/wasm-llvm/builds/) was used for these examples at the time of writing).
Everything else is basically the same as [rust-simple](../rust-simple) except with C code and using `clang`. To run
execute the following from the root `asmble` dir:
gradlew --no-daemon :examples:c-simple:run

View File

@ -0,0 +1,3 @@
int addOne(int x) {
return x + 1;
}

View File

@ -0,0 +1,13 @@
package asmble.examples.csimple;
import java.lang.invoke.MethodHandle;
import asmble.generated.CSimple;
class Main {
public static void main(String[] args) {
// Doesn't need memory or method table
CSimple simple = new CSimple(0, new MethodHandle[0]);
System.out.println("25 + 1 = " + simple.addOne(25));
}
}

View File

@ -1,6 +1,7 @@
rootProject.name = 'asmble' rootProject.name = 'asmble'
include 'annotations', include 'annotations',
'compiler', 'compiler',
'examples:c-simple',
'examples:go-simple', 'examples:go-simple',
'examples:rust-regex', 'examples:rust-regex',
'examples:rust-simple', 'examples:rust-simple',