export TARGET="${1}" export PREFIX="`pwd`/rel-bin/${TARGET}" export PATH="${PREFIX}/bin:${PATH}" export OUT="`pwd`/out" #### ZMIEŃ, JEŻELI CHCESZ INNE WERSJE, DOMYŚLNE "master", CZYLI "BLEEDING EDGE" export binutils_version="master" export libc_version="master" export linux_version="master" export gcc_version="master" #### TU NIE ZMIENIAJ vvv export nproc="$(( `grep -c "processor" /proc/cpuinfo` * 2 ))" export ARGS="--enable-multilib --enable-multiarch --enable-targets=all --disable-werror" #### TU NIE ZMIENIAJ ^^^ echo "${libc_version}" >.tmp if grep -q "/" .tmp; then export _libc_version="`echo ${libc_version} | tr '/' '-'`" else export _libc_version="${libc_version}" fi rm -rf .tmp case "${2}" in 64) export CC="cc -m64" export CXX="c++ -m64" ;; 32) export CC="cc -m32" export CXX="c++ -m32" ;; esac mkdir -pv out download() { if [ ! -d gcc-${gcc_version} ]; then git clone --depth=1 -b ${gcc_version} "git://github.com/gcc-mirror/gcc" gcc-${gcc_version} || return ${?} fi if [ ! -d glibc-${_libc_version} ]; then git clone --depth=1 -b ${libc_version} "git://github.com/bminor/glibc" glibc-${_libc_version} || return ${?} fi if [ ! -d linux-${linux_version} ]; then git clone --depth=1 -b ${linux_version} "git://github.com/torvalds/linux" linux-${linux_version} || return ${?} fi if [ ! -d binutils-gdb-${binutils_version} ]; then git clone --depth=1 -b ${binutils_version} "git://github.com/bminor/binutils-gdb" binutils-gdb-${binutils_version} || return ${?} fi } build() { make -C linux-${linux_version} ARCH="`echo ${TARGET} | cut -f 1 -d '-' | sed -e s/i.86/x86/ -e s/x86_64/x86/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/ -e s/s390x/s390/ -e s/parisc64/parisc/ -e s/ppc.*/powerpc/ -e s/mips.*/mips/ -e s/sh[234].*/sh/ -e s/aarch64.*/arm64/ -e s/riscv.*/riscv/`" INSTALL_HDR_PATH="${PREFIX}/${TARGET}" headers_install || return ${?} find ${PREFIX}/${TARGET} -name "..install.cmd" | xargs rm -rf || return ${?} find ${PREFIX}/${TARGET} -name ".install" | xargs rm -rf || return ${?} mkdir -pv build-binutils || return ${?} (cd build-binutils; ../binutils-gdb-${binutils_version}/configure --target="${TARGET}" --prefix="${PREFIX}" --disable-nls --enable-obsolete --disable-debug ${ARGS}) || return ${?} make -C build-binutils -j${nproc} || return ${?} make -C build-binutils -j${nproc} install || return ${?} if [ ! -e .dl_ok ]; then (cd gcc-${gcc_version}; contrib/download_prerequisites) || return ${?} touch .dl_ok || return ${?} fi mkdir -pv build-gcc || return ${?} (cd build-gcc; ../gcc-${gcc_version}/configure --target="${TARGET}" --prefix="${PREFIX}" --enable-languages="c,c++" --with-pkgversion="*DANiO* T00LCHAIN" ${ARGS} --disable-libgomp) || return ${?} make -C build-gcc -j${nproc} all-gcc || return ${?} make -C build-gcc -j${nproc} install-gcc || return ${?} mkdir -pv build-glibc || return ${?} env CC="${TARGET}-gcc" CXX="${TARGET}-g++" sh -c '(cd build-glibc; ../glibc-${_libc_version}/configure --prefix="${PREFIX}/${TARGET}" --host="${TARGET}" --with-headers="${PREFIX}/${TARGET}/include" --with-pkgversion="*DANiO* T00LCHAIN" --enable-add-ons ${ARGS})' make -C build-glibc -j${nproc} install-bootstrap-headers=yes install-headers || return ${?} make -C build-glibc -j${nproc} csu/subdir_lib || return ${?} mkdir -pv ${PREFIX}/${TARGET}/lib || return ${?} cp -ravf build-glibc/csu/crt1.o build-glibc/csu/crti.o build-glibc/csu/crtn.o ${PREFIX}/${TARGET}/lib || return ${?} ${TARGET}-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o ${PREFIX}/${TARGET}/lib/libc.so || return ${?} touch ${PREFIX}/${TARGET}/include/gnu/stubs.h || return ${?} make -C build-gcc -j${nproc} all-target-libgcc || return ${?} make -C build-gcc -j${nproc} install-target-libgcc || return ${?} make -C build-glibc -j${nproc} || return ${?} make -C build-glibc -j${nproc} install || return ${?} make -C build-gcc -j${nproc} all-target-libstdc++-v3 || return ${?} make -C build-gcc -j${nproc} install-target-libstdc++-v3 || return ${?} } strip_n_pack() { find ${PREFIX} | xargs file | grep "ELF" | cut -f 1 -d ":" | xargs strip -S --strip-unneeded #for host find ${PREFIX}/${TARGET} | xargs file | grep "ELF" | cut -f 1 -d ":" | xargs ${TARGET}-strip -S --strip-unneeded #for sysroot if [ "${1}" == "64" ]; then (cd rel-bin; tar -cJvf "${OUT}/${TARGET}-GCC_${gcc_version}-`date +"%d-%m-%Y"`-`uname -s`_x86-64.txz" ${TARGET}) #|| return ${?} else (cd rel-bin; tar -cJvf "${OUT}/${TARGET}-GCC_${gcc_version}-`date +"%d-%m-%Y"`-`uname -s`_x86-32.txz" ${TARGET}) #|| return ${?} fi } test_gcc() { echo -n "int main(){return 0;}" >test.cpp if ${TARGET}-g++ test.cpp -o test; then echo "${TARGET}-g++ TEST PASSED" rm -rf test{.cpp,} return 0 else echo "${TARGET}-g++ TEST FAILED" rm -rf test{.cpp,} return 1 fi } if [ -n "${clean}" ]; then rm -rf build-* fi if ! download; then echo "STAGE=${TARGET} MSG='at \"download_n_extract\" section'" >.error exit 1 fi if ! build; then echo "STAGE=${TARGET} MSG='at \"build\" section'" >.error exit 1 fi if ! test_gcc; then echo "STAGE=${TARGET} MSG='at \"test_gcc\" section'" >.error exit 1 fi if ! strip_n_pack ${2}; then echo "STAGE=${TARGET} MSG='at \"strip_n_pack ${2}\" section'" >.error exit 1 fi