Index: crossdev =================================================================== RCS file: /var/cvsroot/gentoo/users/kumba/crossdev/crossdev,v retrieving revision 1.10 diff -u -b -B -w -p -r1.10 crossdev --- crossdev 22 Jul 2004 06:27:30 -0000 1.10 +++ crossdev 2 Aug 2004 07:08:24 -0000 @@ -52,6 +52,9 @@ ReadConfiguration() { #// below to "no" (yes/no) USE_COPY="yes" + #// Select gnu libc by default. + LIBC=gnu + #// Read configuration (If this file exists, the above vars are overwritten) if [ -f "${DEFAULT_CONF_LOC}" ]; then source ${DEFAULT_CONF_LOC} @@ -66,6 +69,7 @@ ReadConfiguration() { BINUTILS_LOC="sys-devel/binutils" GCC_LOC="sys-devel/gcc" GLIBC_LOC="sys-libs/glibc" + UCLIBC_LOC="dev-libs/uclibc" #// My Version MYVERSION="0.5" @@ -170,7 +173,7 @@ ParseCommandLine() { --clean|-C) CMDCLEAN="yes" ;; --help|-h) displayHelp; exit 0; ;; --kernel|-k) CMDKERNEL="yes" ;; - --nptl|-n) CMDNPTL="yes" ;; + --nptl|-n) [ "${LIBC}" = "gnu" ] && CMDNPTL="yes" ;; --overwrite|-O) CMDOVERWRITE="yes" ;; --pcflags|-f) CMDPCFLAGS="yes" ;; --pretend|-p) CMDPRETEND="yes" ;; @@ -180,7 +183,8 @@ ParseCommandLine() { --vbinutils=*) CMDBINUTILSVER="$(echo ${CMDLINE} | cut -d\= -f2)" ;; --vheaders=*) CMDHEADERSVER="$(echo ${CMDLINE} | cut -d\= -f2)" ;; --vgcc=*) CMDGCCVER="$(echo ${CMDLINE} | cut -d\= -f2)" ;; - --vglibc=*) CMDGLIBCVER="$(echo ${CMDLINE} | cut -d\= -f2)" ;; + --vglibc=*) CMDGLIBCVER="$(echo ${CMDLINE} | cut -d\= -f2)" ; LIBC=gnu ;; + --vuclibc=*) CMDUCLIBCVER="$(echo ${CMDLINE} | cut -d\= -f2)" ; LIBC=uclibc ; CMDNPTL=0 ;; --xtralang|-x) CMDXTRALANG="yes" ;; *) displayHelp exit 1; ;; esac @@ -413,7 +417,7 @@ displayHelp() { echo -e "" echo -e " ${GREEN}--kernel${XX} (${GREEN}-k${XX} short option)" echo -e " Causes crossdev to build only a kernel compiler. This will skip the" - echo -e " building and installation of a cross-compiled glibc and full-gcc. The" + echo -e " building and installation of a cross-compiled libc and full-gcc. The" echo -e " resulting toolchain will only compile kernels, and will not be capable" echo -e " of building anything else." @@ -465,8 +469,9 @@ displayHelp() { echo -e " ${GREEN}--vbinutils${XX}=${CYAN}x.y.z[-rXX]${XX}" echo -e " ${GREEN}--vgcc${XX}=${CYAN}x.y.z[-rXX]${XX}" echo -e " ${GREEN}--vglibc${XX}=${CYAN}x.y.z[-rXX]${XX}" + echo -e " ${GREEN}--vuclibc${XX}=${CYAN}x.y.z[-rXX]${XX}" echo -e " ${GREEN}--vheaders${XX}=${CYAN}x.y.z[-rXX]${XX}" - echo -e " Force a specific version of binutils/gcc/glibc/headers from portage to" + echo -e " Force a specific version of binutils/gcc/libc/headers from portage to" echo -e " use. This will be the exact version string of any of the available packages" echo -e " in portage. The version string expected is -." echo -e " If the revision of the package is zero, omit it." @@ -592,17 +597,17 @@ GetInfo() { case "${TARGETARCH}" in alpha) CROSS_CFLAGS="" - CROSS_CHOST="alpha-unknown-linux-gnu" + CROSS_CHOST="alpha-unknown-linux-${LIBC}" CROSS_KEYW="alpha" ;; amd64) CROSS_CFLAGS="-fomit-frame-pointer" - CROSS_CHOST="x86_64-unknown-linux-gnu" + CROSS_CHOST="x86_64-unknown-linux-${LIBC}" CROSS_KEYW="amd64" ;; arm|armv4l) CROSS_CFLAGS="" - CROSS_CHOST="${TARGETARCH}-unknown-linux-gnu" + CROSS_CHOST="${TARGETARCH}-unknown-linux-${LIBC}" CROSS_KEYW="arm" ;; avr) @@ -616,46 +621,49 @@ GetInfo() { ;; cris) CROSS_CFLAGS="-mcpu=v10 -march=v10 -mtune=v10" - CROSS_CHOST="cris-axis-linux-gnu" + CROSS_CHOST="cris-axis-linux-${LIBC}" #// cris isn't supported on Gentoo, so use x86 for keyword CROSS_KEYW="x86" ;; hppa|hppa2.0) CROSS_CFLAGS="" - CROSS_CHOST="${TARGETARCH}-unknown-linux-gnu" + CROSS_CHOST="${TARGETARCH}-unknown-linux-${LIBC}" CROSS_KEYW="hppa" ;; i486|i586|i686) CROSS_CFLAGS="-march=${TARGETARCH} -fomit-frame-pointer" - CROSS_CHOST="${TARGETARCH}-pc-linux-gnu" + CROSS_CHOST="${TARGETARCH}-pc-linux-${LIBC}" CROSS_KEYW="x86" ;; ia64) CROSS_CFLAGS="" - CROSS_CHOST="ia64-unknown-linux-gnu" + CROSS_CHOST="ia64-unknown-linux-${LIBC}" CROSS_KEYW="ia64" ;; m68k) CROSS_CFLAGS="" - CROSS_CHOST="m68k-unknown-linux-gnu" + CROSS_CHOST="m68k-unknown-linux-${LIBC}" #// m68k isn't supported on Gentoo, so use x86 for keyword CROSS_KEYW="x86" ;; mips|mipsel|mips64|mips64el) CROSS_CFLAGS="${MIPSISA} -mabi=${MIPSABI}" - CROSS_CHOST="${TARGETARCH}-unknown-linux-gnu" + CROSS_CHOST="${TARGETARCH}-unknown-linux-${LIBC}" + [ "${LIBC}" = "gnu" ] \ + && CROSS_CHOST="${TARGETARCH}-unknown-linux-${LIBC}" \ + || CROSS_CHOST="${TARGETARCH}-linux-${LIBC}" CROSS_KEYW="mips" ;; ppc) CROSS_CFLAGS="-mcpu=powerpc -mtune=powerpc" - CROSS_CHOST="powerpc-unknown-linux-gnu" + CROSS_CHOST="powerpc-unknown-linux-${LIBC}" CROSS_KEYW="ppc" ;; ppc64) CROSS_CFLAGS="-mcpu=powerpc -mtune=powerpc" - CROSS_CHOST="powerpc64-unknown-linux-gnu" + CROSS_CHOST="powerpc64-unknown-linux-${LIBC}" CROSS_KEYW="ppc64" ;; ppc-eabi) @@ -667,25 +675,25 @@ GetInfo() { ;; s390) CROSS_CFLAGS="" - CROSS_CHOST="s390-ibm-linux-gnu" + CROSS_CHOST="s390-ibm-linux-${LIBC}" CROSS_KEYW="s390" ;; sh4) CROSS_CFLAGS="-m4" - CROSS_CHOST="sh4-unknown-linux-gnu" + CROSS_CHOST="sh4-unknown-linux-${LIBC}" #// sh4 isn't supported on Gentoo, so use x86 for keyword CROSS_KEYW="x86" ;; sparc) CROSS_CFLAGS="-mcpu=${SPARCABI} -mtune=${SPARCABI}" - CROSS_CHOST="sparc-unknown-linux-gnu" + CROSS_CHOST="sparc-unknown-linux-${LIBC}" CROSS_KEYW="sparc" ;; sparc64) #// sparc64 only has one abi, so just default CROSS_CFLAGS="-mcpu=ultrasparc -mtune=ultrasparc" - CROSS_CHOST="sparc64-unknown-linux-gnu" + CROSS_CHOST="sparc64-unknown-linux-${LIBC}" CROSS_KEYW="sparc" ;; *) @@ -848,9 +856,12 @@ GetInfo() { || doportageq GCC_VER "best_visible" "/ ${GCC_LOC}" "-* ${CROSS_KEYW_TMP}" if [ "${CMDKERNEL}" != "yes" ]; then - [ ! -z "${CMDGLIBCVER}" ] \ + [ ! -z "${CMDGLIBCVER}" -a "${LIBC}" = "gnu" ] \ && GLIBC_VER="${GLIBC_LOC}-${CMDGLIBCVER}" \ || doportageq GLIBC_VER "best_visible" "/ ${GLIBC_LOC}" "-* ${CROSS_KEYW_TMP}" + [ ! -z "${CMDUCLIBCVER}" ] \ + && UCLIBC_VER="${UCLIBC_LOC}-${CMDUCLIBCVER}" \ + || doportageq UCLIBC_VER "best_visible" "/ ${UCLIBC_LOC}" "-* ${CROSS_KEYW_TMP}" fi @@ -971,9 +982,11 @@ DisplayInfo() { [ "${USE_HEADERS}" = "yes" ] && echo -e "\t${DARKGREEN}${HEADERS_VER}${XX}" echo -e "\t${DARKGREEN}${BINUTILS_VER}${XX}" echo -e "\t${DARKGREEN}${GCC_VER}${XX}" - [ "${CMDKERNEL}" != "yes" ] && echo -e "\t${DARKGREEN}${GLIBC_VER}${XX}" - echo -e "" - + if [ "${CMDKERNEL}" != "yes" ]; then + [ "${LIBC}" = "gnu" ] && echo -e "\t${DARKGREEN}${GLIBC_VER}${XX}" + [ "${LIBC}" = "uclibc" ] && echo -e "\t${DARKGREEN}${UCLIBC_VER}${XX}" + fi + echo -e "${XX}" #// Are we only pretending? if [ "${CMDPRETEND}" = "yes" ]; then @@ -1026,6 +1039,10 @@ UnpackSource() { GLIBC_CAT="$(echo ${GLIBC_VER} | cut -d\/ -f1)" GLIBC_PDIR="$(echo ${GLIBC_VER} | cut -d\/ -f2)" GLIBC_NAME="$(echo ${GLIBC_PDIR} | cut -d- -f1)" + + UCLIBC_CAT="$(echo ${UCLIBC_VER} | cut -d\/ -f1)" + UCLIBC_PDIR="$(echo ${UCLIBC_VER} | cut -d\/ -f2)" + UCLIBC_NAME="$(echo ${UCLIBC_PDIR} | cut -d- -f1)" fi @@ -1064,19 +1081,26 @@ UnpackSource() { "-${GENTOO_KEYW} ${CROSS_KEYW}" "${CROSS_KEYW}" "${FUNCNAME}" "${LINENO}" if [ "${CMDKERNEL}" != "yes" ]; then - #// Check in glibc ebuild tries to avoid a glibc downgrade, but since we're cross-compiling + #// Check in libc ebuild tries to avoid a libc downgrade, but since we're cross-compiling #// we need to skirt around this export FORCE_DOWNGRADE=1 + case "${LIBC}" in + gnu) showInfo "Unpacking ${CROSS_PORTDIR}/${GLIBC_CAT}/${GLIBC_NAME}/${GLIBC_PDIR}.ebuild..." doebuild "${CROSS_PORTDIR}/${GLIBC_CAT}/${GLIBC_NAME}/${GLIBC_PDIR}.ebuild" "unpack" \ - "-${GENTOO_KEYW} ${CROSS_KEYW} ${tmp_use_nptl}" "${CROSS_KEYW}" "${FUNCNAME}" "${LINENO}" - + "-${GENTOO_KEYW} ${CROSS_KEYW} ${tmp_use_nptl}" "${CROSS_KEYW}" "${FUNCNAME}" "${LINENO}";; + uclibc) + showInfo "Unpacking ${CROSS_PORTDIR}/${UCLIBC_CAT}/${UCLIBC_NAME}/${UCLIBC_PDIR}.ebuild..." + doebuild "${CROSS_PORTDIR}/${UCLIBC_CAT}/${UCLIBC_NAME}/${UCLIBC_PDIR}.ebuild" "unpack" \ + "-${GENTOO_KEYW} ${CROSS_KEYW}" "${CROSS_KEYW}" "${FUNCNAME}" "${LINENO}";; + *) echo "Unknown libc type" ; exit 1;; + esac export -n FORCE_DOWNGRADE fi - #// Find the directories for headers and glibc (sometimes the names aren't standard) + #// Find the directories for headers and libc (sometimes the names aren't standard) if [ "${USE_HEADERS}" = "yes" ]; then if [ "${CROSS_KEYW}" = "mips" ]; then #// We need this because mips-headers unpack to a slightly different name than expected @@ -1089,6 +1113,8 @@ UnpackSource() { if [ "${CMDKERNEL}" != "yes" ]; then GLIBC_DIR="$(find ${CROSS_PTMPDIR}/${GLIBC_PDIR}/work -type d -name 'glibc-*' \ -mindepth 1 -maxdepth 1 |head -1 |sed 's:.*/::')" + UCLIBC_DIR="$(find ${CROSS_PTMPDIR}/${UCLIBC_PDIR}/work -type d -name 'uClibc-*' \ + -mindepth 1 -maxdepth 1 |head -1 |sed 's:.*/::')" fi @@ -1157,6 +1183,15 @@ UnpackSource() { "${CROSS_PTMPDIR}/${GLIBC_PDIR}/work/${GLIBC_DIR} to " \ "${CROSS_PTMPDIR}/${CROSS_BUILDIR}!" fi + if [ ! -d "${CROSS_PTMPDIR}/${CROSS_BUILDIR}/${UCLIBC_DIR}" ]; then + showInfo "${tmp_cpmv_msg1} ${CROSS_PTMPDIR}/${UCLIBC_PDIR}/work/${UCLIBC_DIR} " \ + "-> ${CROSS_PTMPDIR}/${CROSS_BUILDIR}..." + ${tmp_cpmv_cmd} ${CROSS_PTMPDIR}/${UCLIBC_PDIR}/work/${UCLIBC_DIR} \ + ${CROSS_PTMPDIR}/${CROSS_BUILDIR} \ + || showError "${FUNCNAME}" "${LINENO}" "Failed to ${tmp_cpmv_msg2} " \ + "${CROSS_PTMPDIR}/${GLIBC_PDIR}/work/${GLIBC_DIR} to " \ + "${CROSS_PTMPDIR}/${CROSS_BUILDIR}!" + fi fi @@ -1635,7 +1670,106 @@ InstallGlibcCore() { #//------------------------------------------------------------------------------------------------ +InstalluClibcCore() { + + local myconf + local tmp_uclibc_chost + + #// Stage 5 + if [ ! -f ".complete" ]; then + stage "Configure, Build, & Install uclibc-core" + sleep 5 + fi + + [ -d "${CROSS_PTMPDIR}/${CROSS_BUILDIR}/${UCLIBC_DIR}" ] \ + && cd ${CROSS_PTMPDIR}/${CROSS_BUILDIR}/${UCLIBC_DIR} \ + || showError "${FUNCNAME}" "${LINENO}" "Directory ${CROSS_PTMPDIR}/${CROSS_BUILDIR}/${UCLIBC_DIR} doesn't exist!" + + + #// Build uClibc + if [ ! -z "${CMDOVERWRITE}" ] && [ -d "buildhere-${TARGETARCH}" ]; then + rm -Rf buildhere-${TARGETARCH} + fi + + if [ ! -d "buildhere-${TARGETARCH}" ]; then + mkdir buildhere-${TARGETARCH} \ + || showError "${FUNCNAME}" "${LINENO}" "Failed to create directory buildhere-${TARGETARCH}!" + fi + cd buildhere-${TARGETARCH} + + + tmp_uclibc_chost="${CROSS_CHOST}" + + + #// if .compiled exists, skip, otherwise configure & build + if [ ! -f ".compiled" ]; then + showInfo "Configuring ${UCLIBC_VER} (full)..." + #// configure will not create config-name.h if this variable isn't set for some targets + case "${TARGETARCH}" in + amd64) export uname="sysdeps/x86_64" ;; + ia64) export uname="sysdeps/ia64" ;; + esac + + BUILD_CC="gcc" \ + CC="${CROSS_CHOST}-gcc -O2 -nostdlib -nostartfiles ${CROSS_CFLAGS}" \ + AR="${CROSS_CHOST}-ar" \ + RANLIB="${CROSS_CHOST}-ranlib" \ + ../configure \ + --prefix=${CROSS_INSTALL} \ + --host=${tmp_uclibc_chost} \ + --build=${MY_CHOST} \ + --without-tls \ + --without-__thread \ + --enable-add-ons=linuxthreads \ + --enable-clocale=gnu \ + --enable-kernel=${MIN_KV} \ + --without-gd \ + --without-cvs \ + --disable-profile \ + --disable-debug \ + --with-headers="${CROSS_INSTALL}/include" \ + ${myconf} \ + || showError "${FUNCNAME}" "${LINENO}" "Failed to configure!" + + + #// This fixes a *really* annoying issue that pops up in glibc + #// http://sources.redhat.com/ml/crossgcc/2003-05/msg00190.html + make sysdeps/gnu/errlist.c || showError "${FUNCNAME}" "${LINENO}" "Failed to run 'sysdeps/gnu/errlist.c'" + mkdir -p stdio-common + touch stdio-common/errlist-compat.c + + + #// Build + showInfo "Compiling ${UCLIBC_VER} (full)..." + make PARALLELMFLAGS="${CROSS_MAKEOPTS}" \ + || showError "${FUNCNAME}" "${LINENO}" "Failed to compile!" + + + #// If build was sucessful, leave a marker behind + touch .compiled + fi + + + #// if .installed exists, skip, otherwise install + if [ ! -f ".installed" ]; then + showInfo "Installing ${UCLIBC_VER} (full)..." + make PARALLELMFLAGS="${CROSS_MAKEOPTS}" install \ + || showError "${FUNCNAME}" "${LINENO}" "Failed to run 'make install'!" + touch .installed + fi + + + #// Complete? + if [ -f ".compiled" ] && [ -f ".installed" ]; then + export -n uname + touch .complete + fi + + return 0 +} + +#//------------------------------------------------------------------------------------------------ #// Configure & Compile & Install gcc-full (C,C++) @@ -1834,7 +1968,8 @@ InstallGccBootstrap #// If we are only building a kernel-compiler, skip these parts if [ "${CMDKERNEL}" != "yes" ]; then - InstallGlibcCore + [ "${LIBC}" = "gnu" ] && InstallGlibcCore + [ "${LIBC}" = "uclibc" ] && InstalluClibcCore InstallGccFull fi