UNPKG

wasmux

Version:

WebAssembly toolchain for compiling libc and kernel into system-level WASM modules

278 lines (261 loc) 7.66 kB
/* * * Copyright (C) 2025-2026 Yurii Yakubin (yurii.yakubin@gmail.com) * */ export default (mk) => { const headers = [ "include/arpa/inet.h", "include/bits/thread_data.h", "include/bits/waitstatus.h", "include/net/ethernet.h", "include/net/route.h", "include/net/if.h", "include/netinet/in.h", "include/netinet/ip.h", "include/netinet/tcp.h", "include/netpacket/packet.h", "include/sys/epoll.h", "include/sys/eventfd.h", "include/sys/file.h", "include/sys/inotify.h", "include/sys/ioctl.h", "include/sys/ipc.h", "include/sys/klog.h", "include/sys/mman.h", "include/sys/mount.h", "include/sys/param.h", "include/sys/poll.h", "include/sys/prctl.h", "include/sys/random.h", "include/sys/reboot.h", "include/sys/resource.h", "include/sys/select.h", "include/sys/sendfile.h", "include/sys/socket.h", "include/sys/stat.h", "include/sys/statfs.h", "include/sys/statvfs.h", "include/sys/sysinfo.h", "include/sys/syslog.h", "include/sys/sysmacros.h", "include/sys/time.h", "include/sys/timerfd.h", "include/sys/times.h", "include/sys/ttydefaults.h", "include/sys/types.h", "include/sys/uio.h", "include/sys/un.h", "include/sys/utsname.h", "include/sys/vfs.h", "include/sys/wait.h", "include/sys/xattr.h", "include/ar.h", "include/assert.h", "include/byteswap.h", "include/endian.h", "include/err.h", "include/errno.h", "include/float.h", "include/ifaddrs.h", "include/inttypes.h", "include/limits.h", "include/memory.h", "include/paths.h", "include/poll.h", "include/sched.h", "include/setjmp.h", "include/spawn.h", "include/stdarg.h", "include/stddef.h", "include/stdint.h", "include/syscall.h", "include/sysexits.h", "include/syslog.h", "include/ucontext.h", "include/utime.h", ]; const sources = [ "stub/apra/inet.c", "stub/net/if_indextoname.c", "stub/net/if_nametoindex.c", "stub/sys/epoll.c", "stub/sys/eventfd.c", "stub/sys/inotify.c", "stub/sys/mman.c", "stub/sys/prctl.c", "stub/sys/random.c", "stub/sys/resource.c", "stub/sys/select.c", "stub/sys/sendfile.c", "stub/sys/socket.c", "stub/sys/stat.c", "stub/sys/statfs.c", "stub/sys/statvfs.c", "stub/sys/sysinfo.c", "stub/sys/time.c", "stub/sys/timerfd.c", "stub/sys/wait.c", "stub/sys/xattr.c", "stub/access.c", "stub/assert.c", "stub/atexit.c", "stub/err.c", "stub/getifaddrs.c", "stub/pipe.c", "stub/poll.c", "stub/progname.c", "stub/qsort.c", "stub/read.c", "stub/sched_getaffinity.c", "stub/sched_getcpu.c", "stub/sched_setscheduler.c", "stub/sched_yield.c", "stub/setjmp.c", "stub/stack_chk_fail.c", "stub/stdlib.c", "stub/strtol.c", "stub/syslog.c", "stub/time.c", "stub/ucontext.c", "stub/unistd.c", "stub/utime.c", "syscalls/_exit.c", "syscalls/brk.c", "syscalls/chdir.c", "syscalls/close.c", "syscalls/dup2.c", "syscalls/execve.c", "syscalls/fdatasync.c", "syscalls/fstatat.c", "syscalls/getcwd.c", "syscalls/getegid.c", "syscalls/geteuid.c", "syscalls/getgid.c", "syscalls/getpid.c", "syscalls/getppid.c", "syscalls/gettid.c", "syscalls/gettimeofday.c", "syscalls/getuid.c", "syscalls/ioctl.c", "syscalls/klogctl.c", "syscalls/lseek.c", "syscalls/mknod.c", "syscalls/mount.c", "syscalls/read.c", "syscalls/readv.c", "syscalls/reboot.c", "syscalls/sched_get_priority_max.c", "syscalls/sched_get_priority_min.c", "syscalls/sethostname.c", "syscalls/statx.c", "syscalls/sync.c", "syscalls/syscall.c", "syscalls/umount.c", "syscalls/umount2.c", "syscalls/uname.c", "syscalls/vhangup.c", "syscalls/waitpid.c", "syscalls/write.c", "syscalls/writev.c", "src/netinet/in6addr_any.c", "src/netinet/in6addr_loopback.c", "src/sys/futimens.c", "src/sys/stat.c", "src/sys/unistd/getpgrp.c", "src/abort.c", "src/exit.c", "src/gethostname.c", "src/posix_openpt.c", "src/sbrk.c", "src/thread_data.c", "src/usleep.c", ]; const includes = [ mk.BINARY_DIR.join("include"), mk.SOURCE_DIR.join("include"), ]; const syscall_h = mk.BINARY_DIR.join("include/sys/syscall.h"); mk.addCustomScript("src/sys/syscall.h.js", { SCRIPT_NAME: "<sys/syscall.h>", SCRIPT_INPUT: mk.PROJECT_SOURCE_DIR.join("data/syscall.js"), SCRIPT_OUTPUT: syscall_h, }); const ctype_h = mk.BINARY_DIR.join("include/ctype.h"); mk.addCustomScript("configure_file", { SCRIPT_NAME: "<ctype.h>", SCRIPT_INPUT: mk.SOURCE_DIR.join("include/ctype.h.in"), SCRIPT_OUTPUT: ctype_h, SCRIPT_INCLUDES: [], }); const wctype_h = mk.BINARY_DIR.join("include/wctype.h"); mk.addCustomScript("configure_file", { SCRIPT_NAME: "<wctype.h>", SCRIPT_INPUT: mk.SOURCE_DIR.join("include/wctype.h.in"), SCRIPT_OUTPUT: wctype_h, SCRIPT_INCLUDES: [], }); const gnu_versions_h = mk.BINARY_DIR.join("include/gnu-versions.h"); mk.addCustomScript("configure_file", { SCRIPT_NAME: "<gnu-versions.h>", SCRIPT_INPUT: mk.SOURCE_DIR.join("include/gnu-versions.h.in"), SCRIPT_OUTPUT: gnu_versions_h, SCRIPT_DEFINES: [], }); const stdlib_h = mk.BINARY_DIR.join("include/stdlib.h"); mk.addCustomScript("configure_file", { SCRIPT_NAME: "<stdlib.h>", SCRIPT_INPUT: mk.SOURCE_DIR.join("include/stdlib.h.in"), SCRIPT_OUTPUT: stdlib_h, SCRIPT_INCLUDES: [], }); const unistd_h = mk.BINARY_DIR.join("include/unistd.h"); mk.addCustomScript("configure_file", { SCRIPT_NAME: "<unistd.h>", SCRIPT_INPUT: mk.SOURCE_DIR.join("include/unistd.h.in"), SCRIPT_OUTPUT: unistd_h, SCRIPT_INCLUDES: [], }); const time_h = mk.BINARY_DIR.join("include/time.h"); mk.addCustomScript("configure_file", { SCRIPT_NAME: "<time.h>", SCRIPT_INPUT: mk.SOURCE_DIR.join("include/time.h.in"), SCRIPT_OUTPUT: time_h, SCRIPT_INCLUDES: [], }); const wchar_h = mk.BINARY_DIR.join("include/wchar.h"); mk.addCustomScript("configure_file", { SCRIPT_NAME: "<wchar.h>", SCRIPT_INPUT: mk.SOURCE_DIR.join("include/wchar.h.in"), SCRIPT_OUTPUT: wchar_h, SCRIPT_INCLUDES: [], }); const features_h = mk.BINARY_DIR.join("include/features.h"); mk.addCustomScript("configure_file", { SCRIPT_NAME: "<features.h>", SCRIPT_INPUT: mk.SOURCE_DIR.join(`features/${mk.WASMUX_LIBC_FEATURES}-features.h`), SCRIPT_OUTPUT: features_h, }); if (mk.WASMUX_LIBC_FEATURES === "glibc") { headers.push("include/gnu/libc-version.h"); sources.push("src/gnu/libc-version.c"); } mk.script("<wasmux/thread_data.h>").mergeVariables({ SCRIPT_ENTITIES: [ "int errcode;", "char buffer[256];" ], }); const libc = mk.addStaticLibrary("libc", headers, sources); libc.addSources(syscall_h, ctype_h, wctype_h, gnu_versions_h, stdlib_h, unistd_h, time_h, wchar_h, features_h); libc.addSources(mk.target("wasmux").objects); libc.addPublicLibraries(mk.target("wasmux")); libc.addPublicIncludes(includes); libc.setPrefix(""); mk.install(headers, { destination: mk.INSTALL_INCLUDEDIR, baseDir: "include", }); mk.install([ syscall_h, ctype_h, wctype_h, gnu_versions_h, stdlib_h, unistd_h, time_h, wchar_h, features_h ], { destination: mk.INSTALL_INCLUDEDIR, baseDir: mk.BINARY_DIR.join("include"), }); mk.install(libc, mk.INSTALL_LIBDIR); }