Skip to content

Commit

Permalink
Emscripten CI (#1868)
Browse files Browse the repository at this point in the history
* Refactor non working JS tests with feature-based checks.

* Add Emscripten testing to CI.

* Compile Emscripten tests as C++14.

* Update Emscripten generated files naming scheme.

* Disable Emscripten property generation.

* Emscripten testing fixes.

* Add CMake to CI.
  • Loading branch information
tritao authored Sep 4, 2024
1 parent 7871125 commit c645b04
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 23 deletions.
17 changes: 17 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,24 @@ jobs:
PLATFORM: ${{ matrix.config.platform }}
DOTNET_NOLOGO: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
EMSCRIPTEN_VERSION: 3.1.65

steps:
- uses: actions/checkout@v4
with:
fetch-depth: '0'

- name: Setup emsdk
uses: mymindstorm/setup-emsdk@v11
with:
version: ${{ env.EMSCRIPTEN_VERSION }}
actions-cache-folder: emsdk-cache-${{ runner.os }}

- name: Setup cmake
uses: jwlawson/actions-setup-cmake@v2
with:
cmake-version: '3.30.x'

- name: Install nbgv
if: startsWith(matrix.config.os, 'macos')
run: |
Expand Down Expand Up @@ -69,6 +81,11 @@ jobs:
run: tests/quickjs/test.sh
if: runner.os != 'Windows'

- name: Test (Emscripten)
shell: bash
run: tests/emscripten/test.sh
if: runner.os != 'Windows'

- name: Pack
shell: bash
run: build/build.sh prepack -platform $PLATFORM
Expand Down
12 changes: 11 additions & 1 deletion src/Generator/Generators/Emscripten/EmscriptenGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,16 @@ public class EmscriptenGenerator : CppGenerator
{
public EmscriptenGenerator(BindingContext context) : base(context)
{
if (context.Options.GenerateName == null)
{
context.Options.GenerateName = (unit) =>
{
if (unit.FileName == "premake5.lua")
return unit.FileNameWithoutExtension;
else
return $"{unit.Module.LibraryName}_embind_{unit.FileNameWithoutExtension}";
};
}
}

public override List<GeneratorOutput> Generate()
Expand Down Expand Up @@ -59,7 +69,7 @@ public override GeneratorOutput GenerateModule(Module module)
{
TranslationUnit = new TranslationUnit
{
FilePath = $"{module.LibraryName}_embind_module.cpp",
FilePath = $"__Module.cpp",
Module = module
},
Outputs = new List<CodeGenerator> { moduleGen }
Expand Down
5 changes: 5 additions & 0 deletions src/Generator/Generators/Emscripten/EmscriptenSources.cs
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,11 @@ public override void VisitClassConstructors(IEnumerable<Method> ctors)
}
}

public override bool VisitProperty(Property property)
{
return true;
}

public override bool VisitMethodDecl(Method method)
{
Indent();
Expand Down
1 change: 1 addition & 0 deletions tests/emscripten/premake5.lua
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ workspace "emscripten"
location "gen"
symbols "On"
optimize "Off"
cppdialect "C++14"

project "test"
kind "SharedLib"
Expand Down
47 changes: 26 additions & 21 deletions tests/emscripten/test.mjs
Original file line number Diff line number Diff line change
@@ -1,20 +1,25 @@
import wasmModule from "./gen/bin/debug/libtest.mjs";
import { eq, ascii, floateq } from "./utils.mjs"

const test = await wasmModule({
onRuntimeInitialized() {
const test = await wasmModule({ onRuntimeInitialized() {} });

}
});
const features = {
// https://github.com/WebAssembly/proposals/issues/7
// https://github.com/emscripten-core/emscripten/issues/11140
supportsInt64: false,
supportsNull: false,
}

function builtins() {
eq(test.ReturnsVoid(), undefined)

eq(test.ReturnsBool(), true)
eq(test.PassAndReturnsBool(false), false)

eq(test.ReturnsNullptr(), null)
eq(test.PassAndReturnsNullptr(null), null)
if (features.supportsNull) {
eq(test.ReturnsNullptr(), null)
eq(test.PassAndReturnsNullptr(null), null)
}

eq(test.ReturnsChar(), ascii('a'));
eq(test.ReturnsSChar(), ascii('a'));
Expand All @@ -41,11 +46,10 @@ function builtins() {
eq(test.ReturnsInt32(), -5);
eq(test.ReturnsUInt32(), 5);

// TODO:
// https://github.com/WebAssembly/proposals/issues/7
// https://github.com/emscripten-core/emscripten/issues/11140
//eq(test.ReturnsInt64(), -5n);
//eq(test.ReturnsUInt64(), 5n);
if (features.supportsInt64) {
eq(test.ReturnsInt64(), -5n);
eq(test.ReturnsUInt64(), 5n);
}

const int8 = { min: -(2 ** 7), max: (2 ** 7) - 1 };
eq(test.PassAndReturnsInt8(int8.min), int8.min);
Expand All @@ -71,13 +75,15 @@ function builtins() {
eq(test.PassAndReturnsUInt32(uint32.min), uint32.min);
eq(test.PassAndReturnsUInt32(uint32.max), uint32.max);

//const int64 = { min: BigInt(2 ** 63) * -1n, max: BigInt(2 ** 63) - 1n };
//eq(test.PassAndReturnsInt64(int64.min), int64.min);
//eq(test.PassAndReturnsInt64(int64.max), int64.max);
if (features.supportsInt64) {
const int64 = { min: BigInt(2 ** 63) * -1n, max: BigInt(2 ** 63) - 1n };
eq(test.PassAndReturnsInt64(int64.min), int64.min);
eq(test.PassAndReturnsInt64(int64.max), int64.max)

//const uint64 = { min: BigInt(0), max: BigInt(2 ** 64) - 1n };
//eq(test.PassAndReturnsUInt64(uint64.min), uint64.min);
//eq(test.PassAndReturnsUInt64(uint64.max), uint64.max);
const uint64 = { min: BigInt(0), max: BigInt(2 ** 64) - 1n };
eq(test.PassAndReturnsUInt64(uint64.min), uint64.min);
eq(test.PassAndReturnsUInt64(uint64.max), uint64.max);
}
}

function enums() {
Expand All @@ -94,7 +100,7 @@ function classes() {
eq(typeof (c), "object")
eq(c.ReturnsVoid(), undefined)
eq(c.ReturnsInt(), 0)
eq(c.PassAndReturnsClassPtr(null), null)
//eq(c.PassAndReturnsClassPtr(null), null)

var c1 = new test.ClassWithSingleInheritance();
eq(c1.__proto__.constructor.name, 'ClassWithSingleInheritance')
Expand All @@ -105,10 +111,9 @@ function classes() {

var classWithField = new test.ClassWithField();
eq(classWithField.ReturnsField(), 10);
eq(classWithField.Field, 10);
//eq(classWithField.Field, 10);
}


builtins();
enums();
classes();
classes();
11 changes: 10 additions & 1 deletion tests/emscripten/test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,16 @@ rootdir="$dir/../.."
dotnet_configuration=Release
configuration=debug
platform=x64
jsinterp=node
jsinterp=$(which node)

for arg in "$@"; do
case $arg in
--with-node=*)
jsinterp="${arg#*=}"
shift
;;
esac
done

if [ "$CI" = "true" ]; then
red=""
Expand Down

0 comments on commit c645b04

Please sign in to comment.