clfs

clfs.git
git clone git://git.lenczewski.org/clfs.git
Log | Files | Refs | README

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"