# =================================================================================================================== # # Build WASM module recipes # =================================================================================================================== # WASI_CC := f"{{WASI_ROOT}}/bin/clang" WASI_CFLAGS := "\ --target=wasm32 \ --sysroot={{WASI_ROOT}}/share/wasi-sysroot \ -z stack-size=4096 \ -O0 \ -nostdlib \ -Wl,--no-entry \ -Wl,--export-all \ -Wl,--no-gc-sections \ -Wl,--initial-memory=65536 \ -Wl,--export=__heap_base \ -Wl,--export=__data_end \ " CROSS_CFLAGS_NOWASM := "\ -m32 \ -ffunction-sections \ -fdata-sections \ -ffreestanding \ -fomit-frame-pointer \ -ggdb \ " CROSS_LDFLAGS_NOWASM := f"\ -Wl,--build-id=none \ -static \ -nostdlib \ -m32 \ -lc \ -lgcc \ -lm \ " LINUX_CFLAGS_NOWASM := "\ -O0 \ -m32 \ -ffunction-sections \ -fdata-sections \ -ggdb \ " LINUX_LDFLAGS_NOWASM := f"\ -Wl,--build-id=none \ -m32 \ -lm \ " WAMRC := "wamrc" WAMRCFLAGS := "\ --target=i386 \ --cpu=generic \ --opt-level=0 \ " XXD := "xxd" [doc("C -> WASM: Compile a C function to a WASM module using WASI-SDK")] [group("1: build module")] build-wasm-module module: {{ WASI_CC }} {{ WASI_CFLAGS }} targets/wasm-module/{{ module }}.c -o {{ BUILD_DIR }}-{{ module }}/wasm_module.wasm [doc("WASM -> AOT: Compile a WASM module ahead-of-time using WAMR")] [group("1: build module")] build-wasm-aot module: {{ WAMRC }} {{ WAMRCFLAGS }} -o {{ BUILD_DIR }}-{{ module }}/wasm_module.aot {{ BUILD_DIR }}-{{ module }}/wasm_module.wasm [doc("AOT -> C-Array: Dump a WASM module compiled ahead-of-time to a binary array")] [group("1: build module")] build-wasm-aot-array module: {{ XXD }} -i {{ BUILD_DIR }}-{{ module }}/wasm_module.aot > {{ BUILD_DIR }}-{{ module }}/wasm_aot_array.c [doc("WASM -> C-Array: Dump a WASM module to a binary array")] [group("1: build module")] build-wasm-interp-array module: {{ XXD }} -i {{ BUILD_DIR }}-{{ module }}/wasm_module.wasm > {{ BUILD_DIR }}-{{ module }}/wasm_interp_array.c [private] build-c-module-fail module: {{ CROSS_CC }} {{ CROSS_CFLAGS_NOWASM }} \ -c targets/wasm-module/{{ module }}.c \ -o {{ BUILD_DIR }}-{{ module }}/c_module.o [private] build-c-module-linux module: {{ LINUX_CC }} {{ LINUX_CFLAGS_NOWASM }} \ -c targets/wasm-module/{{ module }}.c \ -o {{ BUILD_DIR }}-{{ module }}/c_module.o [doc("C -> Object: Compile a C function (no WASM)")] [group("1: build module")] build-c-module module target="fail": #!/usr/bin/env sh if [ "{{ target }}" = "fail" ]; then just build-c-module-fail "{{ module }}" elif [ "{{ target }}" = "linux" ]; then just build-c-module-linux "{{ module }}" else echo "unknown target: {{ target }}" >&2 exit 1 fi # =================================================================================================================== # # Host program recipes # =================================================================================================================== # # FAIL* CROSS_CFLAGS := f"-I./targets/wasm-host {{CROSS_CFLAGS_NOWASM}} -O2" CROSS_LDFLAGS := f"{{CROSS_LDFLAGS_NOWASM}} -L{{LIBIWASM_RELEASE}} -liwasm" CROSS_INCLUDES := f"\ -I{{WAMR_ROOT}}/core/iwasm/include \ -I{{WAMR_ROOT}}/core/shared/utils \ -I{{WAMR_ROOT}}/core/shared/platform/baremetal \ " # LINUX-POSIX LINUX_CFLAGS := f"-I./targets/wasm-host {{ LINUX_CFLAGS_NOWASM }}" LINUX_LDFLAGS := f"{{LINUX_LDFLAGS_NOWASM}} -Wl,-rpath,{{LIBIWASM_LINUX_DEBUG}} -L{{LIBIWASM_LINUX_DEBUG}} -liwasm" LINUX_INCLUDES := f"\ -I{{WAMR_ROOT}}/core/iwasm/include \ -I{{WAMR_ROOT}}/core/shared/utils \ -I{{WAMR_ROOT}}/core/shared/platform/linux \ " # LINUX-Baremetal LINUX_BAREMETAL_CFLAGS := "\ -I./targets/wasm-host \ -O0 \ -m32 \ -ffunction-sections \ -fdata-sections \ -ffreestanding \ -ggdb \ " LINUX_BAREMETAL_LDFLAGS := f"\ -Wl,--build-id=none \ -static \ -nostdlib \ -m32 \ -L{{LIBIWASM_DEBUG}} \ -liwasm \ -lc \ -lgcc \ -lm \ --entry main \ " LINUX_BAREMETAL_INCLUDES := f"\ -I{{WAMR_ROOT}}/core/iwasm/include \ -I{{WAMR_ROOT}}/core/shared/utils \ -I{{WAMR_ROOT}}/core/shared/platform/baremetal \ " [doc("Insert the AOT array into the host program")] [group("2: build host")] prepare-aot-host module target="fail": cp targets/wasm-host/{{ target }}.c {{ BUILD_DIR }}-{{ module }}/module_host.c sed -i \ -e "s/__WASM_ARRAY_FILE__/wasm_aot_array.c/g" \ -e "s/__WASM_ARRAY__/build_{{ module }}_wasm_module_aot/g" \ -e "s/__WASM_ARRAY_LEN__/build_{{ module }}_wasm_module_aot_len/g" \ {{ BUILD_DIR }}-{{ module }}/module_host.c [doc("Insert the WASM array into the host program")] [group("2: build host")] prepare-interp-host module target="fail": cp targets/wasm-host/{{ target }}.c {{ BUILD_DIR }}-{{ module }}/module_host.c sed -i \ -e "s/__WASM_ARRAY_FILE__/wasm_interp_array.c/g" \ -e "s/__WASM_ARRAY__/build_{{ module }}_wasm_module_wasm/g" \ -e "s/__WASM_ARRAY_LEN__/build_{{ module }}_wasm_module_wasm_len/g" \ {{ BUILD_DIR }}-{{ module }}/module_host.c [private] build-wasm-host-fail module: {{ CROSS_CC }} {{ CROSS_CFLAGS }} {{ CROSS_INCLUDES }} \ -c {{ BUILD_DIR }}-{{ module }}/module_host.c \ -o {{ BUILD_DIR }}-{{ module }}/system.o [private] build-wasm-host-linux module: {{ LINUX_CC }} {{ LINUX_CFLAGS }} {{ LINUX_INCLUDES }} \ -c {{ BUILD_DIR }}-{{ module }}/module_host.c \ -o {{ BUILD_DIR }}-{{ module }}/system.o [private] build-wasm-host-linux-baremetal module: {{ CROSS_CC }} {{ LINUX_BAREMETAL_CFLAGS }} {{ LINUX_BAREMETAL_INCLUDES }} \ -c {{ BUILD_DIR }}-{{ module }}/module_host.c \ -o {{ BUILD_DIR }}-{{ module }}/system.o [doc("Compile C-Host: The host uses WAMR to load the WASM/AOT module")] [group("2: build host")] build-wasm-host module target="fail": #!/usr/bin/env sh if [ "{{ target }}" = "fail" ]; then just build-wasm-host-fail "{{ module }}" elif [ "{{ target }}" = "linux" ]; then just build-wasm-host-linux "{{ module }}" elif [ "{{ target }}" = "linux-baremetal" ]; then just build-wasm-host-linux-baremetal "{{ module }}" else echo "unknown target: {{ target }}" >&2 exit 1 fi [private] build-c-host-fail module: {{ CROSS_CC }} {{ CROSS_CFLAGS_NOWASM }} \ -c targets/c-host/fail.c \ -o {{ BUILD_DIR }}-{{ module }}/c_host.o [private] build-c-host-linux module: {{ LINUX_CC }} {{ LINUX_CFLAGS_NOWASM }} \ -c targets/c-host/linux.c \ -o {{ BUILD_DIR }}-{{ module }}/c_host.o [doc("Insert the C function into the host program (no WASM)")] [group("2: build host")] build-c-host module target="fail": #!/usr/bin/env sh if [ "{{ target }}" = "fail" ]; then just build-c-host-fail "{{ module }}" elif [ "{{ target }}" = "linux" ]; then just build-c-host-linux "{{ module }}" else echo "unknown target: {{ target }}" >&2 exit 1 fi [private] build-system-startup-fail module: {{ CROSS_CC }} targets/startup.s {{ CROSS_CFLAGS }} -c -o {{ BUILD_DIR }}-{{ module }}/startup.o [doc("Compile bootloader")] [group("2: build host")] build-system-startup module target="fail": #!/usr/bin/env sh if [ "{{ target }}" = "fail" ]; then just build-system-startup-fail "{{ module }}" else echo "{{ target }} doesn't need bootloader" fi [private] build-system-syscalls-fail module: {{ CROSS_CC }} targets/syscalls.c {{ CROSS_CFLAGS }} -c -o {{ BUILD_DIR }}-{{ module }}/syscalls.o [private] build-system-syscalls-linux-baremetal module: {{ CROSS_CC }} targets/syscalls.c {{ LINUX_BAREMETAL_CFLAGS }} -c -o {{ BUILD_DIR }}-{{ module }}/syscalls.o [doc("Compile newlib syscall stubs")] [group("2: build host")] build-system-syscalls module target="fail": #!/usr/bin/env sh if [ "{{ target }}" = "fail" ]; then just build-system-syscalls-fail "{{ module }}" elif [ "{{ target }}" = "linux-baremetal" ]; then just build-system-syscalls-linux-baremetal "{{ module }}" else echo "{{ target }} doesn't require syscall stubs" fi [private] link-system-fail module: {{ CROSS_CC }} \ -Wl,-T targets/linker.ld \ {{ BUILD_DIR }}-{{ module }}/system.o \ {{ BUILD_DIR }}-{{ module }}/startup.o \ {{ BUILD_DIR }}-{{ module }}/syscalls.o \ {{ CROSS_LDFLAGS }} \ -o {{ BUILD_DIR }}-{{ module }}/system.elf [private] link-system-linux module: {{ LINUX_CC }} \ {{ BUILD_DIR }}-{{ module }}/system.o \ {{ LINUX_LDFLAGS }} \ -o {{ BUILD_DIR }}-{{ module }}/system.elf [private] link-system-linux-baremetal module: {{ CROSS_CC }} \ {{ BUILD_DIR }}-{{ module }}/system.o \ {{ BUILD_DIR }}-{{ module }}/syscalls.o \ {{ LINUX_BAREMETAL_LDFLAGS }} \ -o {{ BUILD_DIR }}-{{ module }}/system.elf [doc("Link C-Host, syscall stubs and bootloader")] [group("2: build host")] link-system module target="fail": #!/usr/bin/env sh if [ "{{ target }}" = "fail" ]; then just link-system-fail "{{ module }}" elif [ "{{ target }}" = "linux" ]; then just link-system-linux "{{ module }}" elif [ "{{ target }}" = "linux-baremetal" ]; then just link-system-linux-baremetal "{{ module }}" else echo "unknown target: {{ target }}" >&2 exit 1 fi [private] link-c-system-fail module: {{ CROSS_CC }} \ -Wl,-T targets/linker.ld \ {{ BUILD_DIR }}-{{ module }}/c_host.o \ {{ BUILD_DIR }}-{{ module }}/startup.o \ {{ BUILD_DIR }}-{{ module }}/c_module.o \ {{ CROSS_LDFLAGS_NOWASM }} \ -o {{ BUILD_DIR }}-{{ module }}/system.elf [private] link-c-system-linux module: {{ LINUX_CC }} \ {{ BUILD_DIR }}-{{ module }}/c_host.o \ {{ BUILD_DIR }}-{{ module }}/c_module.o \ {{ LINUX_LDFLAGS_NOWASM }} \ -o {{ BUILD_DIR }}-{{ module }}/system.elf [doc("Link C-Host, C-function and bootloader")] [group("2: build host")] link-c-system module target="fail": #!/usr/bin/env sh if [ "{{ target }}" = "fail" ]; then just link-c-system-fail "{{ module }}" elif [ "{{ target }}" = "linux" ]; then just link-c-system-linux "{{ module }}" else echo "unknown target: {{ target }}" >&2 exit 1 fi [doc("Create bootdisk")] [group("2: build host")] build-iso module: mkdir -p {{ BUILD_DIR }}-{{ module }}/grub/boot/grub cp targets/grub.cfg {{ BUILD_DIR }}-{{ module }}/grub/boot/grub/ cp {{ BUILD_DIR }}-{{ module }}/system.elf {{ BUILD_DIR }}-{{ module }}/grub/boot/ grub-mkrescue -o {{ BUILD_DIR }}-{{ module }}/system.iso {{ BUILD_DIR }}-{{ module }}/grub