clfs.sh (2461B)
1 #!/bin/sh 2 3 ROOT="$(realpath $(dirname $0))" 4 5 TARGETS="$ROOT/targets" 6 TARGET="${TARGET:-aarch64-linux-musl}" 7 8 # clfs directory definitions 9 SOURCES="$ROOT/sources" 10 CROSSTOOLS="$ROOT/crosstools" 11 CLFS="$ROOT/clfs" 12 13 WORK="$CLFS/work" 14 SYSROOT="$CLFS/sysroot" 15 INITRAMFS="$CLFS/initramfs" 16 BOOTROOT="$CLFS/bootroot" 17 18 KERNEL="linuxstub.efi" 19 INITRD="initrd.cpio" 20 ROOTFS="sysroot.tar" 21 22 . "$TARGETS/$TARGET-config.sh" 23 24 set -e 25 26 # clean old clfs build 27 rm -rf $CLFS 28 29 # fetch sources 30 mkdir -p $SOURCES 31 32 # package definitions 33 LLVM_VER_MAJOR="18" 34 LLVM_VER="18.1.0" 35 LLVM_DIR="llvm-project-$LLVM_VER.src" 36 LLVM_PKG="$LLVM_DIR.tar.xz" 37 LLVM_SRC="https://github.com/llvm/llvm-project/releases/download/llvmorg-$LLVM_VER/$LLVM_PKG" 38 39 LINUX_VER="6.7.8" 40 LINUX_DIR="linux-$LINUX_VER" 41 LINUX_PKG="$LINUX_DIR.tar.xz" 42 LINUX_SRC="https://www.kernel.org/pub/linux/kernel/v6.x/$LINUX_PKG" 43 44 MUSL_VER="1.2.5" 45 MUSL_DIR="musl-$MUSL_VER" 46 MUSL_PKG="$MUSL_DIR.tar.gz" 47 MUSL_SRC="https://musl.libc.org/releases/$MUSL_PKG" 48 49 TOYBOX_VER="0.8.9" 50 TOYBOX_DIR="toybox-$TOYBOX_VER" 51 TOYBOX_PKG="$TOYBOX_DIR.tar.gz" 52 TOYBOX_SRC="https://landley.net/toybox/downloads/$TOYBOX_PKG" 53 54 IANA_ETC_VER="20240305" 55 IANA_ETC_DIR="iana-etc-$IANA_ETC_VER" 56 IANA_ETC_PKG="$IANA_ETC_DIR.tar.gz" 57 IANA_ETC_SRC="https://github.com/Mic92/iana-etc/releases/download/$IANA_ETC_VER/$IANA_ETC_PKG" 58 59 # usage: FETCH <src> <pkg> <dir> 60 FETCH() { 61 echo "Fetching $1..." 62 [ -f $SOURCES/$2 ] || curl -Lo $SOURCES/$2 $1 63 echo "Unpacking $2..." 64 [ -d $SOURCES/$3 ] || tar xf $SOURCES/$2 -C $SOURCES 65 echo "Unpacked into $SOURCES/$3!" 66 } 67 68 FETCH $LLVM_SRC $LLVM_PKG $LLVM_DIR 69 FETCH $LINUX_SRC $LINUX_PKG $LINUX_DIR 70 FETCH $MUSL_SRC $MUSL_PKG $MUSL_DIR 71 FETCH $TOYBOX_SRC $TOYBOX_PKG $TOYBOX_DIR 72 FETCH $IANA_ETC_SRC $IANA_ETC_PKG $IANA_ETC_DIR 73 74 # TODO: do we necessarily want this much noise when running clfs.sh? 75 # set -x 76 77 # start clfs build proper 78 mkdir -p $CLFS $WORK $SYSROOT $INITRAMFS $BOOTROOT 79 80 CLEAN_WORKDIR() { 81 rm -rf "$WORK" 82 mkdir -p "$WORK" 83 } 84 85 # build our cross-compilation tools (clang + lld) 86 cd "$ROOT" 87 . ./stage1.sh 88 89 CLEAN_WORKDIR 90 91 # build necessary sysroot to cross-compile c and c++ programs for target 92 cd "$ROOT" 93 . ./stage2.sh 94 95 CLEAN_WORKDIR 96 97 # cross-compile userland for target 98 cd "$ROOT" 99 . ./stage3.sh 100 101 CLEAN_WORKDIR 102 103 # cross-compile initramfs and kernel for target 104 cd "$ROOT" 105 . ./stage4.sh 106 107 echo "Done!" 108 109 # optionally run qemu virtual machine of freshly built target 110 [ -f "$TARGETS/$TARGET-qemu.sh" ] && \ 111 . "$TARGETS/$TARGET-qemu.sh"