1#!/bin/bash 2 3# Script to build all cross and native compilers supported by musl-libc. 4# This isn't directly used by toybox, but is useful for testing. 5 6if [ ! -d litecross ] 7then 8 echo Run this script in musl-cross-make directory to make "ccc" directory. 9 echo 10 echo " "git clone https://github.com/richfelker/musl-cross-make 11 echo " "cd musl-cross-make 12 echo ' ~/toybox/scripts/mcm-buildall.sh' 13 exit 1 14fi 15 16# All toolchains after the first are themselves cross compiled (so they 17# can be statically linked against musl on the host, for binary portability.) 18# static i686 binaries are basically "poor man's x32". 19BOOTSTRAP=i686-linux-musl 20 21[ -z "$OUTPUT" ] && OUTPUT="$PWD/ccc" 22 23if [ "$1" == clean ] 24then 25 rm -rf "$OUTPUT" host-* *.log 26 make clean 27 exit 28fi 29 30make_toolchain() 31{ 32 # Set cross compiler path 33 LP="$PATH" 34 if [ -z "$TYPE" ] 35 then 36 OUTPUT="$PWD/host-$TARGET" 37 EXTRASUB=y 38 else 39 if [ "$TYPE" == static ] 40 then 41 HOST=$BOOTSTRAP 42 [ "$TARGET" = "$HOST" ] && LP="$PWD/host-$HOST/bin:$LP" 43 TYPE=cross 44 EXTRASUB=y 45 LP="$OUTPUT/$HOST-cross/bin:$LP" 46 else 47 HOST="$TARGET" 48 export NATIVE=y 49 LP="$OUTPUT/${RENAME:-$TARGET}-cross/bin:$LP" 50 fi 51 COMMON_CONFIG="CC=\"$HOST-gcc -static --static\" CXX=\"$HOST-g++ -static --static\"" 52 export -n HOST 53 OUTPUT="$OUTPUT/${RENAME:-$TARGET}-$TYPE" 54 fi 55 56 if [ -e "$OUTPUT.sqf" ] || [ -e "$OUTPUT/bin/$TARGET-ld" ] || 57 [ -e "$OUTPUT/bin/ld" ] 58 then 59 return 60 fi 61 62 # Change title bar to say what we're currently building 63 64 echo === building $TARGET-$TYPE 65 echo -en "\033]2;$TARGET-$TYPE\007" 66 67 rm -rf build/"$TARGET" "$OUTPUT" && 68 if [ -z "$CPUS" ] 69 then 70 CPUS="$(nproc)" 71 [ "$CPUS" != 1 ] && CPUS=$(($CPUS+1)) 72 fi 73 set -x && 74 PATH="$LP" make OUTPUT="$OUTPUT" TARGET="$TARGET" \ 75 GCC_CONFIG="--disable-nls --disable-libquadmath --disable-decimal-float --disable-multilib --enable-languages=c,c++ $GCC_CONFIG" \ 76 COMMON_CONFIG="CFLAGS=\"$CFLAGS -g0 -Os\" CXXFLAGS=\"$CXXFLAGS -g0 -Os\" LDFLAGS=\"$LDFLAGS -s\" $COMMON_CONFIG" \ 77 install -j$CPUS || exit 1 78 set +x 79 echo -e '#ifndef __MUSL__\n#define __MUSL__ 1\n#endif' \ 80 >> "$OUTPUT/${EXTRASUB:+$TARGET/}include/features.h" 81 82 if [ ! -z "$RENAME" ] && [ "$TYPE" == cross ] 83 then 84 CONTEXT="output/$RENAME-cross/bin" 85 for i in "$CONTEXT/$TARGET-"* 86 do 87 X="$(echo $i | sed "s@.*/$TARGET-\([^-]*\)@\1@")" 88 ln -sf "$TARGET-$X" "$CONTEXT/$RENAME-$X" 89 done 90 fi 91 92 # Prevent cross compiler reusing dynamically linked host build files for 93 # $BOOTSTRAP arch 94 [ -z "$TYPE" ] && make clean 95 96 if [ "$TYPE" == native ] 97 then 98 # gcc looks in "../usr/include" but not "/bin/../include" (relative to the 99 # executable). That means /usr/bin/gcc looks in /usr/usr/include, so that's 100 # not a fix either. So add a NOP symlink as a workaround for The Crazy. 101 ln -s . "$OUTPUT/usr" || exit 1 102 [ ! -z "$(which mksquashfs 2>/dev/null)" ] && 103 mksquashfs "$OUTPUT" "$OUTPUT.sqf" -all-root && 104 [ -z "$CLEANUP" ] && rm -rf "$OUTPUT" 105 fi 106} 107 108# Expand compressed target into binutils/gcc "tuple" and call make_toolchain 109make_tuple() 110{ 111 PART1=${1/:*/} 112 PART3=${1/*:/} 113 PART2=${1:$((${#PART1}+1)):$((${#1}-${#PART3}-${#PART1}-2))} 114 115 # Do we need to rename this toolchain after building it? 116 RENAME=${PART1/*@/} 117 [ "$RENAME" == "$PART1" ] && RENAME= 118 PART1=${PART1/@*/} 119 TARGET=${PART1}-linux-musl${PART2} 120 121 [ -z "$NOCLEAN" ] && rm -rf build 122 123 for TYPE in static native 124 do 125 TYPE=$TYPE TARGET=$TARGET GCC_CONFIG="$PART3" RENAME="$RENAME" \ 126 make_toolchain 2>&1 | tee "$OUTPUT"/log/${RENAME:-$PART1}-${TYPE}.log 127 done 128} 129 130mkdir -p "$OUTPUT"/log 131 132# Make bootstrap compiler (no $TYPE, dynamically linked against host libc) 133# We build the rest of the cross compilers with this so they're linked against 134# musl-libc, because glibc doesn't fully support static linking and dynamic 135# binaries aren't really portable between distributions 136TARGET=$BOOTSTRAP make_toolchain 2>&1 | tee -a "$OUTPUT/log/$BOOTSTRAP"-host.log 137 138if [ $# -gt 0 ] 139then 140 for i in "$@" 141 do 142 make_tuple "$i" 143 done 144else 145 # Here's the list of cross compilers supported by this build script. 146 147 # First target builds a proper version of the $BOOTSTRAP compiler above, 148 # which is used to build the rest (in alphabetical order) 149 for i in i686:: \ 150 aarch64:eabi: armv4l:eabihf:"--with-arch=armv5t --with-float=soft" \ 151 armv5l:eabihf:--with-arch=armv5t armv7l:eabihf:--with-arch=armv7-a \ 152 "armv7m:eabi:--with-arch=armv7-m --with-mode=thumb --disable-libatomic --enable-default-pie" \ 153 armv7r:eabihf:"--with-arch=armv7-r --enable-default-pie" \ 154 i486:: m68k:: microblaze:: mips:: mips64:: mipsel:: powerpc:: \ 155 powerpc64:: powerpc64le:: s390x:: sh2eb:fdpic:--with-cpu=mj2 \ 156 sh4::--enable-incomplete-targets x86_64:: x86_64@x32:x32: 157 do 158 make_tuple "$i" 159 done 160fi 161