# This builds the dash shell. include ../build/Makefile-vars # See https://github.com/sagemathinc/dash/releases which is a mirror of # https://git.kernel.org/pub/scm/utils/dash/dash.git without the autotools dependency. VERSION = 0.6.0 URL = https://github.com/sagemathinc/dash/archive/refs/tags/${VERSION}.tar.gz TARBALL = ${UPSTREAM}/dash-${VERSION}.tar.gz LIBEDIT_WASM = $(shell cowasm-package-path @cowasm/libedit) TERMCAP_WASM = $(shell cowasm-package-path @cowasm/termcap) POSIX_WASM = $(shell cowasm-package-path @cowasm/posix-wasm) all: deps wasm ${BIN}/dash-wasm-raw include ../build/Makefile-rules ${BUILD_WASM}/.patched: ${BUILD_WASM}/.build cp ${SRC}/extra.h ${BUILD_WASM}/src/setjmp.h mkdir -p ${BUILD_WASM}/src/bits cp ${SRC}/extra.h ${BUILD_WASM}/src/bits/setjmp.h ln -s ${SRC}/rebuild.sh ${BUILD_WASM}/rebuild.sh ln -s ${SRC}/update.sh ${BUILD_WASM}/update.sh # for developing upstream echo "ac_cv_func_sigsetmask=no" > ${BUILD_WASM}/config.site cd ${BUILD_WASM} \ && cat ${SRC}/patches/01-jobs-extra-include.patch | patch -p1 \ && cat ${SRC}/patches/02-nodes-extra-include.patch | patch -p1 \ && cat ${SRC}/patches/03-emacs-default.patch | patch -p1 \ && cat ${SRC}/patches/04-vforkexec.patch | patch -p1 touch ${BUILD_WASM}/.patched # NOTES: # - -DJOBS=0 is to completely disable job control, which isn't supported for WASM yet. # Right now the first place this fails is in savefd(int from, int ofd), where it uses # a fcntl argument that is simply not implemented in WASI yet. We will probably have # to rewrite savefd to use a non-wasi fcntl that we implement. # - TODO: I'll probably move libedit and libtermcap to the core (OR their own shared library!) # so they don't have to be included here, which will make dash much smaller. But for now this is fine. # They add about 120KB. ${DIST_WASM}/.built: node_modules ${BUILD_WASM}/.patched cd ../build && make zig rm -rf ${DIST_WASM} cd ${BUILD_WASM} \ && CONFIG_SITE=${BUILD_WASM}/config.site \ CC="cowasm-cc" \ CC_FOR_BUILD="zig cc ${ZIG_NATIVE_CFLAGS_GNU}" \ CFLAGS="-O0 -fvisibility-main -DJOBS=0 -I${LIBEDIT_WASM}/include -I${POSIX_WASM}" \ LDFLAGS="-L${LIBEDIT_WASM}/lib -ledit -L${TERMCAP_WASM}/lib -ltermcap" \ ./configure \ --with-libedit \ --prefix=${DIST_WASM} \ --host=none \ && make -j8 install ln -sf ${DIST_WASM}/bin/dash ${DIST_WASM}/bin/sh touch ${DIST_WASM}/.built ${BIN}/dash-wasm-raw: ${DIST_WASM}/.built ${CWD}/bin/dash-wasm ln -sf ${CWD}/bin/dash-wasm ${BIN}/dash-wasm-raw test: node_modules ${DIST_WASM}/.built # test doing a little arithmetic echo "echo \$$((389*5077))" | cowasm ${DIST_WASM}/bin/dash | grep 1974953 # test that a syntax error doesn't terminate the shell (i.e., no longjmp exception handling) echo "); echo 'I am still alive'" | cowasm ${DIST_WASM}/bin/dash | grep alive