Skip to content

Commit

Permalink
WASM and WASI (#90)
Browse files Browse the repository at this point in the history
  • Loading branch information
cyberjunk authored Nov 11, 2024
1 parent 2749026 commit 4aa3009
Show file tree
Hide file tree
Showing 53 changed files with 2,883 additions and 25 deletions.
168 changes: 165 additions & 3 deletions .github/workflows/build-wasi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,178 @@ jobs:
MODE: release
TARGET_OS: wasi
TARGET_ARCH: ${{ matrix.arch }}
TARGET_CPUREV: ${{ matrix.cpurev }}
JOBS: 4
strategy:
fail-fast: false
matrix:
os: [macos-13,macos-14]
os: [windows-2019,windows-2022,ubuntu-20.04,ubuntu-22.04,ubuntu-24.04,macos-13,macos-14,macos-15]
arch: [wasm32]
cpurev: [default]
sdk: [24]
steps:

# Checkout
- name: Checkout
uses: actions/checkout@v4

# Setup ENV
- name: Setup ENV
shell: bash
run: |
echo Running on: $ImageOS
if [ $ImageOS == macos12 ] || [ $ImageOS == macos13 ]; then \
WASI_OS=macos; \
WASI_ARCH=x86_64; \
WASMER_OS=darwin; \
WASMER_ARCH=amd64; \
WABT_OS=macos-12; \
elif [ $ImageOS == macos14 ] || [ $ImageOS == macos15 ]; then \
WASI_OS=macos; \
WASI_ARCH=arm64; \
WASMER_OS=darwin; \
WASMER_ARCH=arm64; \
WABT_OS=macos-14; \
elif [ $ImageOS == ubuntu20 ] || [ $ImageOS == ubuntu22 ] || [ $ImageOS == ubuntu24 ]; then \
WASI_OS=linux; \
WASI_ARCH=x86_64; \
WASMER_OS=linux; \
WASMER_ARCH=amd64; \
WABT_OS=ubuntu-20.04; \
elif [ $ImageOS == win19 ] || [ $ImageOS == win22 ]; then \
WASI_OS=windows; \
WASI_ARCH=x86_64; \
WASMER_OS=windows; \
WASMER_ARCH=amd64; \
WABT_OS=windows; \
else \
echo UNKNOWN OPERATING SYSTEM; \
exit 1; \
fi
echo WASI_OS=$WASI_OS >> "$GITHUB_ENV"
echo WASI_ARCH=$WASI_ARCH >> "$GITHUB_ENV"
echo WASMER_OS=$WASMER_OS >> "$GITHUB_ENV"
echo WASMER_ARCH=$WASMER_ARCH >> "$GITHUB_ENV"
echo WABT_OS=$WABT_OS >> "$GITHUB_ENV"
# Install WASI SDK
- name: Install WASI SDK
shell: bash
env:
REPOSITORY: https://github.com/WebAssembly/wasi-sdk
VERSIONMAJOR: ${{ matrix.sdk }}
VERSIONMINOR: 0
EXT: tar.gz
run: |
FILENAME=wasi-sdk-$VERSIONMAJOR.$VERSIONMINOR-$WASI_ARCH-$WASI_OS
URL=$REPOSITORY/releases/download/wasi-sdk-$VERSIONMAJOR/$FILENAME.$EXT
curl -L -O $URL
tar xfz $FILENAME.$EXT
rm -f $FILENAME.$EXT
echo WASI_SDK_PATH=$(pwd)/$FILENAME >> "$GITHUB_ENV"
# Install Wasmer
- name: Install Wasmer
shell: bash
env:
REPOSITORY: https://github.com/wasmerio/wasmer
VERSIONMAJOR: 4
VERSIONMINOR: 4
VERSIONPATCH: 0
EXT: tar.gz
run: |
FILENAME=wasmer-$WASMER_OS-$WASMER_ARCH
URL=$REPOSITORY/releases/download/v$VERSIONMAJOR.$VERSIONMINOR.$VERSIONPATCH/$FILENAME.$EXT
curl -L -O $URL
mkdir $FILENAME
tar xfz $FILENAME.$EXT -C ./$FILENAME
rm -f $FILENAME.$EXT
echo WASMER_DIR=$(pwd)/$FILENAME >> "$GITHUB_ENV"
# Install WABT
- name: Install WABT
shell: bash
env:
REPOSITORY: https://github.com/WebAssembly/wabt
VERSIONMAJOR: 1
VERSIONMINOR: 0
VERSIONPATCH: 36
EXT: tar.gz
run: |
FILENAME=wabt-$VERSIONMAJOR.$VERSIONMINOR.$VERSIONPATCH-$WABT_OS
URL=$REPOSITORY/releases/download/$VERSIONMAJOR.$VERSIONMINOR.$VERSIONPATCH/$FILENAME.$EXT
curl -L -O $URL
tar xfz $FILENAME.$EXT
rm -f $FILENAME.$EXT
echo WABT_DIR=$(pwd)/wabt-$VERSIONMAJOR.$VERSIONMINOR.$VERSIONPATCH >> "$GITHUB_ENV"
# Clang Version
- name: Clang Version
shell: bash
run: $WASI_SDK_PATH/bin/clang --version

# Wasmer Version
- name: Wasmer Version
shell: bash
run: $WASMER_DIR/bin/wasmer --version

# Build
- name: Build
run: make -j${{ env.JOBS }}

# Binary Info (CppCore.Interface.C)
- name: Binary Info (CppCore.Interface.C)
shell: bash
run: |
echo $WABT_DIR
$WABT_DIR/bin/wasm-objdump -x build/make/lib/wasi-$TARGET_ARCH/libcppcore.wasm
# Binary Info (CppCore.Test)
- name: Binary Info (CppCore.Test)
shell: bash
run: |
$WABT_DIR/bin/wasm-objdump -x build/make/bin/wasi-$TARGET_ARCH/CppCore.Test.wasm
# Binary Info (CppCore.Debug)
- name: Binary Info (CppCore.Debug)
shell: bash
run: |
$WABT_DIR/bin/wasm-objdump -x build/make/bin/wasi-$TARGET_ARCH/CppCore.Debug.wasm
# Test
- name: Test
run: make test

# Dist
- name: Dist
run: make dist

# Upload Binaries
- name: Upload Binaries
uses: actions/upload-artifact@v4
if: ${{ matrix.os == 'ubuntu-24.04' }}
with:
name: Binaries (wasi-${{ matrix.arch }})
path: ./build/make/bin/wasi-${{ matrix.arch }}/*.wasm

# Upload Libraries
- name: Upload Libraries
uses: actions/upload-artifact@v4
if: ${{ matrix.os == 'ubuntu-24.04' }}
with:
name: Libraries (wasi-${{ matrix.arch }})
path: ./build/make/lib/wasi-${{ matrix.arch }}/*.wasm

# Install uglify-js
- name: Install uglify-js
run: npm install uglify-js -g

# Build JS
- name: Build JS
run: make CppCore.Interface.JS

# Upload JS
- name: Upload JS
uses: actions/upload-artifact@v4
if: ${{ matrix.os == 'ubuntu-24.04' }}
with:
name: Browser (wasi-${{ matrix.arch }})
path: ./dist/browser/CppCore.Interface.JS/*
25 changes: 20 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ CppCore.Interface.Python:
@echo [BLD] CppCore.Interface.Python
+@make -s -C ./build/make/ -f CppCore.Interface.Python.mk

CppCore.Interface.JS:
@echo [BLD] CppCore.Interface.JS
+@make -s -C ./build/make/ -f CppCore.Interface.JS.mk

CppCore.Debug:
@echo [BLD] CppCore.Debug
+@make -s -C ./build/make/ -f CppCore.Debug.mk
Expand All @@ -79,30 +83,41 @@ CppCore.Debug-clean:

##################################################################################

ifneq ($(TARGET_OS),wasi)
all: \
CppCore.Example.Server \
CppCore.Example.Client \
CppCore.Example.UI \
CppCore.Interface.C \
CppCore.Test \
CppCore.Debug

clean: \
CppCore.Example.Server-clean \
CppCore.Example.Client-clean \
CppCore.Example.UI-clean \
CppCore.Interface.C-clean \
CppCore.Test-clean \
CppCore.Debug-clean

test: \
CppCore.Test-run

dist: \
CppCore.Example.Server-dist \
CppCore.Example.Client-dist \
CppCore.Example.UI-dist \
CppCore.Interface.C-dist
else
all: \
CppCore.Interface.C \
CppCore.Test \
CppCore.Debug
clean: \
CppCore.Interface.C-clean \
CppCore.Test-clean \
CppCore.Debug-clean
dist: \
CppCore.Interface.C-dist
endif

test: \
CppCore.Test-run

##################################################################################

Expand Down
10 changes: 10 additions & 0 deletions build/make/CppCore.Debug.mk
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,16 @@ LINKLIBS := $(LINKLIBS) -framework Foundation
RESO := $(RESO)
endif

ifeq ($(TARGET_OS),wasi)
OUTDIST := $(DISTDIR)/$(NAME)$(EXTBIN)
DEFINES := $(DEFINES)
CXXFLAGS := $(CXXFLAGS)
CFLAGS := $(CFLAGS)
LINKFLAGS := $(LINKFLAGS) -Wl,-z,stack-size=0x00100000
LINKLIBS := $(LINKLIBS)
RESO := $(RESO)
endif

################################################################################################

OBJS := $(patsubst %,$(OBJDIR)/%,$(OBJS))
Expand Down
38 changes: 36 additions & 2 deletions build/make/CppCore.Interface.C.mk
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ CXXFLAGS := $(CXXFLAGS) \
-mno-stack-arg-probe \
-fno-stack-protector \
-fno-stack-check
LINKFLAGS := $(LINKFLAGS) -shared -fno-builtin
LINKFLAGS := $(LINKFLAGS) -fno-builtin
LINKPATH := $(LINKPATH)
LINKLIBS := $(LINKLIBS)
OBJS = cppcore.o
Expand Down Expand Up @@ -62,6 +62,7 @@ DEFINES := $(DEFINES)
INCLUDES := $(INCLUDES)
CXXFLAGS := $(CXXFLAGS)
LINKFLAGS := $(LINKFLAGS) \
-shared \
-nostdlib \
-Xlinker /SAFESEH:NO \
-Xlinker /ENTRY:DllMain \
Expand Down Expand Up @@ -89,6 +90,7 @@ DEFINES := $(DEFINES)
INCLUDES := $(INCLUDES)
CXXFLAGS := $(CXXFLAGS)
LINKFLAGS := $(LINKFLAGS) \
-shared \
-dynamiclib \
-nostdlib \
-current_version $(VERSION3) \
Expand Down Expand Up @@ -121,6 +123,7 @@ DEFINES := $(DEFINES)
INCLUDES := $(INCLUDES)
CXXFLAGS := $(CXXFLAGS)
LINKFLAGS := $(LINKFLAGS) \
-shared \
-nostdlib \
-Wl,--no-eh-frame-hdr
LINKLIBS := $(LINKLIBS) -lc
Expand All @@ -142,7 +145,7 @@ endif
ifeq ($(TARGET_OS),android)
DEFINES := $(DEFINES)
CXXFLAGS := $(CXXFLAGS)
LINKFLAGS := $(LINKFLAGS)
LINKFLAGS := $(LINKFLAGS) -shared
LINKLIBS := $(LINKLIBS)
RESO := $(RESO)
ifeq ($(TARGET_ARCH),x86)
Expand All @@ -163,6 +166,7 @@ ifeq ($(TARGET_OS),ios)
DEFINES := $(DEFINES)
CXXFLAGS := $(CXXFLAGS)
LINKFLAGS := $(LINKFLAGS) \
-shared \
-dynamiclib \
-nostdlib \
-install_name @rpath/$(LIBNAME)$(EXTDLL) \
Expand All @@ -187,6 +191,36 @@ DEFINES := $(DEFINES)
endif
endif

ifeq ($(TARGET_OS),wasi)
OUTDIST := $(DISTDIR)/$(NAME)$(EXTBIN)
DEFINES := $(DEFINES)
CXXFLAGS := $(CXXFLAGS)
CFLAGS := $(CFLAGS)
DEC1MB := 1048576
DEC8MB := 8388608
HEX1MB := 0x00100000
LINKFLAGS := $(LINKFLAGS) \
-mexec-model=reactor \
-Wl,-z,stack-size=$(HEX1MB) \
-Wl,--initial-memory=$(DEC8MB) \
-Wl,--max-memory=$(DEC8MB) \
-Wl,--export-dynamic \
-Wl,--no-entry
LINKLIBS := $(LINKLIBS)
RESO := $(RESO)
#-Wl,--import-memory \
#-Wl,--global-base=2048 \
#-Wl,-z,stack-size=0x00100000 \
#-Wl,--max-memory=8388608 \
#-Wl,--initial-memory=1179648 \
#-Wl,--initial-heap=1048576 \
#-Wl,--export-all \
#-Wl,--export,__data_end
#-Wl,--export,__heap_base
#-Wl,--export,__tls_base
#-Wl,--export,__stack_pointer
endif

################################################################################################

OBJS := $(patsubst %,$(OBJDIR)/%,$(OBJS))
Expand Down
34 changes: 34 additions & 0 deletions build/make/CppCore.Interface.JS.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@

include platforms/detect-host.mk

NAME = CppCore.Interface.JS
NATIVENAME = CppCore.Interface.C
LIBNAME = libcppcore
INCDIR = ../../include/
SRCDIR = ../../src/$(NAME)
BROWSERDIR = ../../dist/browser
WASIDIR = ../../dist/wasi

################################################################################################

VERSIONFILE = $(INCDIR)/CppCore/Version.h
VERSIONMACROMAJOR = CPPCORE_VERSION_MAJOR
VERSIONMACROMINOR = CPPCORE_VERSION_MINOR
VERSIONMACROPATCH = CPPCORE_VERSION_PATCH

include platforms/extract-version.mk

################################################################################################

.DEFAULT_GOAL := build
.PHONY: clean
.EXPORT_ALL_VARIABLES:

build:
$(eval CPPCORE_VERSION=$(VERSION3))
echo [VER] $(CPPCORE_VERSION)
-$(call rmdir,$(BROWSERDIR)/$(NAME))
$(call mkdir,$(BROWSERDIR)/$(NAME))
$(call copyfiles,$(WASIDIR)/$(NATIVENAME)/wasm32/$(LIBNAME).wasm,$(BROWSERDIR)/$(NAME)/$(LIBNAME).wasm)
cd $(SRCDIR) && uglifyjs --compress --mangle --module --source-map --output $(BROWSERDIR)/$(NAME)/$(LIBNAME).js -- $(LIBNAME).js
jq ".version = \"$(VERSION3)\"" $(SRCDIR)/package.json > $(BROWSERDIR)/$(NAME)/package.json
Loading

0 comments on commit 4aa3009

Please sign in to comment.