Lines Matching +full:- +full:- +full:build +full:- +full:root
3 # ------------------------------ Part 1: Setup -------------------------------
6 [ -z "$NOCLEAR" ] && exec env -i NOCLEAR=1 HOME="$HOME" PATH="$PATH" \
9 ! [ -d mkroot ] && echo "Run mkroot/mkroot.sh from toybox source dir." && exit 1
13 [ "${i/=/}" != "$i" ] && export "$i" || { [ "$i" != -- ] && PKG="$PKG $i"; }
17 : ${TOP:=$PWD/root} ${BUILD:=$TOP/build} ${LOG:=$BUILD/log}
18 : ${AIRLOCK:=$BUILD/airlock} ${CCC:=$PWD/ccc} ${PKGDIR:=$PWD/mkroot/packages}
23 # ----- Are we cross compiling (via CROSS_COMPILE= or CROSS=)
25 if [ -n "$CROSS_COMPILE" ]; then
27 [ -z "${X:=$(command -v "$CROSS_COMPILE"cc)}" ] && die "no ${CROSS_COMPILE}cc"
28 CROSS_COMPILE="$(realpath -s "${X%cc}")"
29 [ -z "$CROSS" ] && CROSS=${CROSS_COMPILE/*\//} CROSS=${CROSS/-*/}
31 elif [ -n "$CROSS" ]; then # CROSS=all/allnonstop/$ARCH else list known $ARCHes
32 [ ! -d "$CCC" ] && die "No ccc symlink to compiler directory."
33 TARGETS="$(ls "$CCC" | sed -n 's/-.*//p' | sort -u)"
41 CROSS_COMPILE="$(echo "$CCC/$CROSS"-*cross/bin/"$CROSS"*-cc)" # wildcard
42 [ ! -e "$CROSS_COMPILE" ] && echo $TARGETS && exit # list available targets
47 # Set per-target output directory (using "host" if not cross-compiling)
51 ${CROSS_COMPILE}cc --static -xc - -o /dev/null <<< "int main(void){return 0;}"||
54 # ----- Create hermetic build environment
56 rm -rf generated
57 if [ -z "$NOAIRLOCK"] && [ -n "$CROSS_COMPILE" ]; then
59 # - building a host toybox later builds use as their command line
60 # - cherry-picking specific commands from old path via symlink
61 if [ ! -e "$AIRLOCK/toybox" ]; then
70 # Create per-target work directories
71 TEMP="$BUILD/${CROSS}-tmp" && rm -rf "$TEMP" &&
72 mkdir -p "$TEMP" "$OUTPUT" "$LOG" || exit 1
73 [ -z "$ROOT" ] && ROOT="$OUTPUT/fs" && rm -rf "$ROOT"
76 # ----- log build output
79 if [ -z "$NOLOGPATH" ]; then
81 [ -n "$CROSS_COMPILE" ] && PATH="${CROSS_COMPILE%/*}:$PATH" &&
83 export WRAPDIR="$BUILD/record-commands" LOGPATH="$LOG"-commands.txt
84 rm -rf "$WRAPDIR" "$LOGPATH" generated/obj &&
85 eval "$(WRAPDIR="$WRAPDIR" CROSS_COMPILE= NOSTRIP=1 mkroot/record-commands)"||
90 rm -f "$LOG".{n,y} || exit 1
91 [ -z "$NOLOG" ] && exec > >(tee "$LOG".n) 2>&1
94 # ---------------------- Part 2: Create root filesystem -----------------------
96 # ----- Create new root filesystem's directory layout.
99 mkdir -p "$ROOT"/{dev,etc/rc,home,mnt,proc,root,sys,tmp/run,usr/{bin,sbin,lib},var} &&
100 chmod a+rwxt "$ROOT"/tmp && ln -s usr/{bin,sbin,lib} tmp/run "$ROOT" || exit 1
103 cat > "$ROOT"/init << 'EOF' &&
108 if ! mountpoint -q dev; then
109 mount -t devtmpfs dev dev
110 [ $$ -eq 1 ] && ! 2>/dev/null <0 && exec 0<>/dev/console 1>&0 2>&1
112 do ln -sf /proc/self/fd${i/,*/} dev/${i/*,/}; done
113 mkdir -p dev/shm
116 mountpoint -q dev/pts || { mkdir -p dev/pts && mount -t devpts dev/pts dev/pts;}
117 mountpoint -q proc || mount -t proc proc proc
118 mountpoint -q sys || mount -t sysfs sys sys
121 if [ $$ -eq 1 ]; then
122 mountpoint -q mnt || [ -e /dev/?da ] && mount /dev/?da /mnt
128 [ "$(date +%s)" -lt 1000 ] && timeout 2 sntp -sq 10.0.2.2 # Ask host
129 [ "$(date +%s)" -lt 10000000 ] && sntp -sq time.google.com
132 for i in $(ls -1 /etc/rc 2>/dev/null | sort); do . /etc/rc/"$i"; done
135 [ -z "$HANDOFF" ] && [ -e /mnt/init ] && HANDOFF=/mnt/init
136 [ -z "$HANDOFF" ] && HANDOFF=/bin/sh && echo -e '\e[?7hType exit when done.'
138 setsid -c <>/dev/$(sed '$s@.*[ /]@@' /sys/class/tty/console/active) >&0 2>&1 \
140 reboot -f &
147 chmod +x "$ROOT"/init &&
149 # Google's nameserver, passwd+group with special (root/nobody) accounts + guest
150 echo "nameserver 8.8.8.8" > "$ROOT"/etc/resolv.conf &&
151 cat > "$ROOT"/etc/passwd << 'EOF' &&
152 root:x:0:0:root:/root:/bin/sh
156 echo -e 'root:x:0:\nguest:x:500:\nnobody:x:65534:' > "$ROOT"/etc/group &&
158 : ${VERSION:=$(git describe --tags --abbrev=12 2>/dev/null)} &&
159 : ${VERSION:=$(sed -n 's/.*TOYBOX_VERSION "\([^"]*\)".*/\1/p' toys.h)} &&
161 …ERSION="'${VERSION#* }$'"\nHOME_URL="https://landley.net/toybox"' > "$ROOT"/etc/os-release || exit…
163 # Build any packages listed on command line
170 # Build static toybox with existing .config if there is one, else defconfig+sh
171 if [ -z "$NOTOYBOX" ]; then
173 [ -n "$PENDING" ] && rm -f .config
174 grep -q CONFIG_SH=y .config 2>/dev/null && CONF=silentoldconfig || unset CONF
176 [ -e "$ROOT"/lib/libc.so ] || export LDFLAGS=--static
177 PREFIX="$ROOT" make clean \
178 ${CONF:-defconfig KCONFIG_ALLCONFIG=<(echo "$XX")} toybox install || exit 1
182 # ------------------ Part 3: Build + package bootable system ------------------
185 csv2cfg() { sed -E '/^$/d;s/([^,]*)($|,)/CONFIG_\1\n/g' <<< "$1" | sed '/^$/!{/=/!s/.*/&='"$2/}";}
189 # BUILTIN - if set, statically link initramfs into kernel image
190 # DTB - device tree binary file in build dir (qemu -dtb $DTB)
191 # KARCH - linux ARCH= build argument (selects arch/$ARCH directory in source)
192 # KARGS - linux kernel command line arguments (qemu -append "console=$KARGS")
193 # KCONF - kernel config options for target (expanded by csv2cfg above)
194 # VMLINUX - linux bootable kernel file in build dir (qemu -kernel $VMLINUX)
195 # QEMU - emulator name (qemu-system-$QEMU) and arguments
198 # Target-specific info in an (alphabetical order) if/else staircase
206 QEMU="arm -M versatilepb -net nic,model=rtl8139 -net user"
212 DTB=versatile-pb.dtb
215 QEMU="aarch64 -M virt -cpu cortex-a57"
218 QEMU="arm -M virt" KARCH=arm VMLINUX=arch/arm/boot/zImage
227 QEMU="hexagon -M comet"
232 QEMU="i386 -cpu 486 -global fw_cfg.dma_enabled=false" KCONF=M486
234 QEMU="i386 -cpu pentium3" KCONF=MPENTIUMII
243 QEMU="m68k -M q800" KARCH=m68k
248 QEMU="microblaze -M petalogix-s3adsp1800" KARCH=microblaze KARGS=ttyUL0
252 QEMU="$CROSS -M malta" KARCH=mips
259 KARCH=openrisc QEMU="or1k -M or1k-sim" KARGS=FIXME BUILTIN=1
263 KARCH=powerpc QEMU="ppc -M g3beige"
268 KARCH=powerpc QEMU="ppc64 -M pseries -vga none" KARGS=hvc0
286 QEMU="$CROSS -M r2d -serial null -serial mon:stdio" KARCH=sh
306 # ----- Build kernel for target
309 if [ -z "$LINUX" ] || [ ! -d "$LINUX/kernel" ]; then
310 echo 'No $LINUX directory, kernel build skipped.'
314 [ "$CROSS" == host ] && CROSS="$(uname -m)"
318 if [ -n "$QEMU" ]; then
319 [ -z "$BUILTIN" ] && INITRD='-initrd "$DIR"/'"$INITRAMFS"
320 { echo DIR='"$(dirname $0)";' qemu-system-"$QEMU" -m 256 '"$@"' $QEMU_MORE \
321 -nographic -no-reboot -kernel '"$DIR"'/linux-kernel $INITRD \
322 ${DTB:+-dtb '"$DIR"'/linux.dtb} \
323 "-append \"HOST=$CROSS console=$KARGS \$KARGS\"" &&
324 echo "echo -e '\\e[?7h'"
325 } > "$OUTPUT"/run-qemu.sh &&
326 chmod +x "$OUTPUT"/run-qemu.sh || exit 1
329 announce "linux-$KARCH"
331 cp -sfR "$LINUX" "$TEMP/linux" && pushd "$TEMP/linux" &&
334 mkdir -p "$OUTDOC" &&
336 do echo "$i"; done > "$OUTDOC"/linux-microconfig &&
340 echo "# make ARCH=$KARCH allnoconfig KCONFIG_ALLCONFIG=linux-miniconfig"
341 echo "# make ARCH=$KARCH -j \$(nproc)"
345 echo "# architecture ${X:-independent}"
347 X=${X:+extra} X=${X:-specific}
348 done < "$OUTDOC"/linux-microconfig
349 [ -n "$BUILTIN" ] && echo -e CONFIG_INITRAMFS_SOURCE="\"$OUTPUT/fs\""
351 } > "$OUTDOC/linux-miniconfig" &&
354 make ARCH=$KARCH allnoconfig KCONFIG_ALLCONFIG="$OUTDOC/linux-miniconfig" &&
355 cp .config "$OUTDOC/linux-fullconfig" &&
357 # Build kernel. Copy config, device tree binary, and kernel binary to output
358 make ARCH=$KARCH CROSS_COMPILE="$CROSS_COMPILE" -j $(nproc) all || exit 1
359 [ -n "$DTB" ] && { cp "$(find -name $DTB)" "$OUTPUT/linux.dtb" || exit 1 ;}
360 if [ -n "$MODULES" ]; then
362 (cd modz && find lib/modules | cpio -o -H newc -R +0:+0 ) | gzip \
365 cp "$VMLINUX" "$OUTPUT"/linux-kernel && cd .. && rm -rf linux && popd ||exit 1
368 # clean up and package root filesystem for initramfs.
370 [ -z "$BUILTIN" ] && DIR="$OUTPUT" || DIR="$OUTDOC"
371 { (cd "$ROOT" && find . -printf '%P\n' | cpio -o -H newc -R +0:+0 ) || exit 1
372 ! test -e "$OUTDOC/modules.cpio.gz" || zcat $_;} | gzip \