Add wasm build
This commit is contained in:
parent
e78bde556b
commit
881330e49e
|
@ -0,0 +1,66 @@
|
|||
FROM alpine:3.7
|
||||
|
||||
RUN apk update \
|
||||
&& apk upgrade \
|
||||
&& apk add --no-cache g++ musl-dev make cmake git subversion python
|
||||
|
||||
RUN mkdir /mono-wasm \
|
||||
&& cd /mono-wasm \
|
||||
&& git clone --depth 1 https://github.com/lrz/mono-wasm.git build
|
||||
|
||||
# RUN cd /mono-wasm \
|
||||
# && svn co --quiet http://llvm.org/svn/llvm-project/llvm/trunk llvm \
|
||||
# && cd llvm/tools \
|
||||
# && svn co --quiet http://llvm.org/svn/llvm-project/cfe/trunk clang \
|
||||
# && svn co --quiet http://llvm.org/svn/llvm-project/lld/trunk lld
|
||||
|
||||
RUN cd /mono-wasm \
|
||||
&& wget http://releases.llvm.org/5.0.1/llvm-5.0.1.src.tar.xz \
|
||||
&& unxz llvm-5.0.1.src.tar.xz \
|
||||
&& tar xf llvm-5.0.1.src.tar \
|
||||
&& rm llvm-5.0.1.src.tar \
|
||||
&& mv llvm-5.0.1.src llvm \
|
||||
&& cd llvm/tools \
|
||||
&& wget http://releases.llvm.org/5.0.1/cfe-5.0.1.src.tar.xz \
|
||||
&& unxz cfe-5.0.1.src.tar.xz \
|
||||
&& tar xf cfe-5.0.1.src.tar \
|
||||
&& rm cfe-5.0.1.src.tar \
|
||||
&& mv cfe-5.0.1.src clang \
|
||||
&& wget http://releases.llvm.org/5.0.1/lld-5.0.1.src.tar.xz \
|
||||
&& unxz lld-5.0.1.src.tar.xz \
|
||||
&& tar xf lld-5.0.1.src.tar \
|
||||
&& rm lld-5.0.1.src.tar \
|
||||
&& mv lld-5.0.1.src lld
|
||||
|
||||
RUN mkdir /mono-wasm/llvm-build \
|
||||
&& cd /mono-wasm/llvm-build \
|
||||
&& cmake -G "Unix Makefiles" -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly -DCMAKE_BUILD_TYPE=Release ../llvm \
|
||||
&& make -j7
|
||||
|
||||
RUN cd /mono-wasm \
|
||||
&& git clone --depth 1 https://github.com/mono/llvm.git llvm-mono
|
||||
|
||||
ENV CXXFLAGS="-fpermissive"
|
||||
|
||||
RUN mkdir /mono-wasm/llvm-mono-build \
|
||||
&& cd /mono-wasm/llvm-mono-build \
|
||||
&& cmake -G "Unix Makefiles" -DCMAKE_OSX_ARCHITECTURES="i386;x86_64" -DLLVM_TARGETS_TO_BUILD=X86 ../llvm-mono \
|
||||
&& cp -R ../llvm-mono/include/* include/ \
|
||||
&& sed -i "s/#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)/#if 0/" /usr/include/stdio.h \
|
||||
&& sed -i "s/#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)/#if 0/" /usr/include/sys/stat.h \
|
||||
# && sed -i "s/namespace llvm/#undef fopen\n#undef fopen64\n#undef fseeko\n#undef fseeko64\n#undef fstat\n#undef fstat64\n#undef ftello\n#undef ftello64\n#undef lstat\n#undef lstat64\n#undef stat\n#undef stat64\n#undef tmpfile\n#undef tmpfile64\n\nnamespace llvm/" /mono-wasm/llvm-mono-build/include/llvm/Target/TargetLibraryInfo.h
|
||||
&& make -j7
|
||||
|
||||
ENV CXXFLAGS=""
|
||||
|
||||
RUN cd /mono-wasm \
|
||||
&& git clone --depth 1 https://github.com/lrz/mono-wasm-mono.git mono-compiler
|
||||
|
||||
RUN apk add --no-cache bash autoconf automake libtool linux-headers \
|
||||
&& cd /mono-wasm/mono-compiler \
|
||||
&& ./autogen.sh --with-cross-offsets=offsets-wasm32.h CFLAGS="-DCOMPILE_WASM32 -DMONO_CROSS_COMPILE" CXXFLAGS="-DCOMPILE_WASM32 -DMONO_CROSS_COMPILE" --disable-boehm --with-sigaltstack=no --enable-llvm --enable-llvm-runtime --with-llvm=../llvm-mono-build --disable-btls --with-runtime_preset=testing_aot_full
|
||||
|
||||
# RUN cd /mono-wasm/mono-compiler/eglib \
|
||||
# && make -j7 \
|
||||
# && cd ../mono \
|
||||
# && make -j7
|
|
@ -0,0 +1,18 @@
|
|||
OOUI_SRCS=$(wildcard ../Ooui/*.cs)
|
||||
|
||||
all: hello.exe output/index.wasm output/index.html
|
||||
|
||||
hello.exe: hello.cs Ooui.dll Makefile
|
||||
mcs -nostdlib -noconfig -r:mono-wasm-macos/dist/lib/mscorlib.dll -r:Ooui.dll hello.cs -out:hello.exe
|
||||
|
||||
Ooui.dll: $(OOUI_SRCS) System.Core.cs Makefile
|
||||
mcs -nostdlib -noconfig -r:mono-wasm-macos/dist/lib/mscorlib.dll -define:NO_PROCESS,NO_SERVER,NO_XML System.Core.cs $(OOUI_SRCS) -out:Ooui.dll
|
||||
|
||||
output/index.wasm: hello.exe Makefile
|
||||
mono-wasm-macos/dist/bin/mono-wasm -i hello.exe -o output
|
||||
|
||||
output/index.html: index.html
|
||||
cp index.html output
|
||||
|
||||
clean:
|
||||
rm -rf build output hello.exe
|
|
@ -0,0 +1,16 @@
|
|||
using System;
|
||||
|
||||
namespace System.ComponentModel
|
||||
{
|
||||
public interface INotifyPropertyChanged
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class PropertyChangedEventArgs : EventArgs
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public delegate void PropertyChangedEventHandler (object sender, PropertyChangedEventArgs e);
|
||||
}
|
|
@ -0,0 +1,77 @@
|
|||
using Mono.WebAssembly;
|
||||
using System;
|
||||
|
||||
class Hello
|
||||
{
|
||||
static int Factorial(int n)
|
||||
{
|
||||
if (n == 0) {
|
||||
return 1;
|
||||
}
|
||||
return n * Factorial(n - 1);
|
||||
}
|
||||
|
||||
// This function is called from the browser by JavaScript.
|
||||
// Here we calculate the factorial of the given number then use the
|
||||
// Mono.WebAssembly API to retrieve the element from the DOM and set its
|
||||
// innerText property to the factorial result.
|
||||
static void FactorialInElement(int n, string element_id)
|
||||
{
|
||||
Console.WriteLine(
|
||||
"Calculating factorial of {0} into DOM element {1}",
|
||||
n, element_id);
|
||||
|
||||
int f = Factorial(n);
|
||||
|
||||
var elem = HtmlPage.Document.GetElementById(element_id);
|
||||
elem.InnerText = f.ToString();
|
||||
}
|
||||
|
||||
static void PrintHtmlElements(HtmlElement elem, int level)
|
||||
{
|
||||
string str = "";
|
||||
for (int i = 0; i < level; i++) {
|
||||
str += " ";
|
||||
}
|
||||
|
||||
str += $"<{elem.TagName}";
|
||||
|
||||
foreach (var name in elem.AttributeNames) {
|
||||
var value = elem.GetAttribute(name);
|
||||
str += $" {name}='{value}'";
|
||||
}
|
||||
|
||||
str += ">";
|
||||
|
||||
Console.WriteLine(str);
|
||||
|
||||
var list = elem.Children;
|
||||
for (int i = 0; i < list.Count; i++) {
|
||||
var child = list[i];
|
||||
PrintHtmlElements(child, level + 1);
|
||||
}
|
||||
}
|
||||
|
||||
static int Main(string[] args)
|
||||
{
|
||||
Ooui.Div odiv = new Ooui.Div ();
|
||||
int f = Factorial(6);
|
||||
HtmlPage.Window.Alert($"Hello world! factorial(6) -> {odiv}");
|
||||
|
||||
var bi = HtmlPage.BrowserInformation;
|
||||
Console.WriteLine($"BrowserInformation: Name {bi.Name} BrowserVersion {bi.BrowserVersion} UserAgent {bi.UserAgent} Platform {bi.Platform} CookiesEnabled {bi.CookiesEnabled} ProductName {bi.ProductName}");
|
||||
|
||||
var d = HtmlPage.Document;
|
||||
Console.WriteLine($"Document Location: {d.Location}");
|
||||
|
||||
PrintHtmlElements(d.DocumentElement, 0);
|
||||
|
||||
var p = d.CreateElement("p");
|
||||
p.InnerText = "This text was added at runtime.";
|
||||
d.Body.AppendChild(p);
|
||||
|
||||
if (args.Length > 0) FactorialInElement(0, ""); // this is a hack so that the linker does not remove the FactorialInElement() method
|
||||
|
||||
return f;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
<!DOCTYPE html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<title>WebAssembly Example</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
<form name="factorial_form" onSubmit="return factorial_submit()">
|
||||
Number: <input type="text" name="input" value="6"/>
|
||||
<br/><br/>
|
||||
Result: <span id="factorial_result">...</span>
|
||||
<br/><br/>
|
||||
<input name="Submit" type="submit" value="Calculate"/>
|
||||
</form>
|
||||
</p>
|
||||
<script src="index.js"></script>
|
||||
<script>
|
||||
function factorial_submit() {
|
||||
// This function is called by the form. We now call into the
|
||||
// Hello.FactorialInElement() C# method, passing the input (a number)
|
||||
// and the element ID which should be set with the result (here, the
|
||||
// <span> element defined above.
|
||||
var input = document.forms["factorial_form"]["input"].value;
|
||||
var klass = MonoClass("", "Hello");
|
||||
if (klass) {
|
||||
var method = MonoMethod(klass, "FactorialInElement", true);
|
||||
if (method) {
|
||||
MonoInvoke(0, method, [parseInt(input), "factorial_result"]);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
document.addEventListener('WebAssemblyContentLoaded', function() {
|
||||
// Calculate the initial form value.
|
||||
factorial_submit();
|
||||
}, false);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
Loading…
Reference in New Issue