diff --git a/build-busybox.sh b/build-busybox.sh new file mode 100755 index 0000000..d3d8454 --- /dev/null +++ b/build-busybox.sh @@ -0,0 +1,93 @@ +#!/bin/sh +# +# Copyright (c) 2025 Martin Storsjo +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +set -e + +: ${BUSYBOX_VERSION:=90c68f18dc24fb3919811199f849fa2dc7a75294} + +BUILDDIR=build + +while [ $# -gt 0 ]; do + case "$1" in + --host=*) + HOST="${1#*=}" + BUILDDIR=$BUILDDIR-$HOST + ;; + *) + PREFIX="$1" + ;; + esac + shift +done + +if [ -z "$CHECKOUT_ONLY" ]; then + if [ -z "$PREFIX" ]; then + echo $0 [--host=triple] dest + exit 1 + fi + + mkdir -p "$PREFIX" + PREFIX="$(cd "$PREFIX" && pwd)" +fi + +MAKE=make +if command -v gmake >/dev/null; then + MAKE=gmake +fi + +: ${CORES:=$(nproc 2>/dev/null)} +: ${CORES:=$(sysctl -n hw.ncpu 2>/dev/null)} +: ${CORES:=4} + +if [ ! -d busybox-w32 ]; then + git clone https://github.com/rmyorston/busybox-w32 + CHECKOUT=1 +fi + +SRC=$(pwd) + +cd busybox-w32 + +if [ -n "$SYNC" ] || [ -n "$CHECKOUT" ]; then + [ -z "$SYNC" ] || git fetch + git checkout $BUSYBOX_VERSION +fi + +[ -z "$CHECKOUT_ONLY" ] || exit 0 + +[ -z "$CLEAN" ] || rm -rf $BUILDDIR +mkdir -p $BUILDDIR +make mingw64a_defconfig O=$BUILDDIR -j$CORES +cd $BUILDDIR +$MAKE -j$CORES CROSS_COMPILE=${HOST+$HOST-} +cp ../LICENSE $PREFIX/LICENSE.txt +mkdir -p $PREFIX/bin +cp busybox.exe $PREFIX/bin + +WRAPPER_FLAGS="$WRAPPER_FLAGS -municode -D__USE_MINGW_ANSI_STDIO=0" + +${HOST+$HOST-}gcc $SRC/wrappers/busybox-wrapper.c -o $PREFIX/bin/busybox-wrapper.exe -O2 -Wl,-s $WRAPPER_FLAGS + +cc $SRC/wrappers/busybox-list-applets.c -I. -o busybox-list-applets +./busybox-list-applets > applets.txt +for i in $(cat applets.txt); do + case $i in + busybox|[*) + continue + ;; + esac + ln -s busybox-wrapper.exe $PREFIX/bin/$i.exe +done diff --git a/wrappers/busybox-list-applets.c b/wrappers/busybox-list-applets.c new file mode 100644 index 0000000..ae94497 --- /dev/null +++ b/wrappers/busybox-list-applets.c @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Martin Storsjo + * + * This file is part of llvm-mingw. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#define ALIGN1 +#define ALIGN2 +#define SKIP_applet_main +#include "include/applet_tables.h" + +#include +#include + +int main(int argc, char **argv) { + int offset = 0; + for (int i = 0; i < NUM_APPLETS; i++) { + printf("%s\n", &applet_names[offset]); + offset += strlen(&applet_names[offset]) + 1; + } + return 0; +} diff --git a/wrappers/busybox-wrapper.c b/wrappers/busybox-wrapper.c new file mode 100644 index 0000000..89b80a8 --- /dev/null +++ b/wrappers/busybox-wrapper.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018 Martin Storsjo + * + * This file is part of llvm-mingw. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "native-wrapper.h" + +int _tmain(int argc, TCHAR* argv[]) { + const TCHAR *dir; + const TCHAR *exe; + const TCHAR *basename, *target; + split_argv(argv[0], &dir, &basename, &target, &exe); + TCHAR *exe_path = concat(dir, _T("busybox.exe")); + + return run_final(exe_path, (const TCHAR *const *) argv); +}