Hello all,

I tried to build a cross toolchain environment from official debian
sources (via the appended script). Everything works fine, except for
one annoyance/strangeness:

When converting the target libc package, dpkg-cross adds dependencies
to tzdata-$ARCH-cross and tzdata-$ARCH-dcv1. But tzdata is arch:all,
and of course dpkg-cross refuses to convert it. I worked around the
problem by using equivs and ignoring it otherwise.

I haven't found documentation what the -dcv1 are meant for (probably
I looked in the wrong place). Any pointers?


Thiemo


#! /bin/bash
#
set -e

# target architecture
DEBARCH=mips

# mirror for both binary and source packages
#MIRROR=http://ftp.nl.debian.org/debian
MIRROR=http://hattusa/debian

#----------------------------------------------------------------------

# host architecture
HOSTARCH=$(dpkg-architecture -qDEB_HOST_ARCH)

#----------------------------------------------------------------------
# Useful shell functions

# check build-deps
checkinstalled () {
        while [ -n "$1" ]; do
                dpkg -l "$1" |grep -q "^ii" || {
                        echo "$1 is not installed."
                        exit 1
                }
                shift
        done
}

# find full version string: version <binarypackage>
# XXX: What about epochs?
version () {
        grep-status -PX $1 -s Version: -n
}

# find upstream version string: upstreamversion <binarypackage>
upstreamversion () {
        echo $(version $1 |sed 's/\(.*\)\(-[0-9]*$\)/\1/')
}

# find debian revision string: debianrevision <binarypackage>
debianrevision () {
        echo $(version $1 |sed 's/\(.*-\)\([0-9]*$\)/\2/')
}

# find soucepackage: sourcepackage <binarypackage>
sourcepackage () {
        local x=$(grep-status -PX $1 -s Source: -n)
        local y=$1
        echo ${x:=$y}
}

# make cross all package: make-cross-package <binarypackage>
make-cross-package () {
        local _version=$(version $1)
        local _sourcepkg=$(sourcepackage $1)
        local _hashdir=$(echo ${_sourcepkg} |sed 's/^\(lib.\|.\)\(.*\)/\1/')
        local _mirror="${MIRROR}/pool/main/${_hashdir}/${_sourcepkg}"
        local _origfile="${1}_${_version}_all.deb"
        local _crossfile="${1}-${DEBARCH}-cross_${_version}_all.deb"

        [ -f ${_origfile} ] || wget -nv -r -nd -N ${_mirror}/${_origfile}
        [ -f ${_crossfile} ] || dpkg-cross -a ${DEBARCH} -b ${_origfile}
        sudo dpkg -i ${_crossfile}
}

# make cross $arch package: make-cross-arch-package <binarypackage>
make-cross-arch-package () {
        local _version=$(version $1)
        local _sourcepkg=$(sourcepackage $1)
        local _hashdir=$(echo ${_sourcepkg} |sed 's/^\(lib.\|.\)\(.*\)/\1/')
        local _mirror="${MIRROR}/pool/main/${_hashdir}/${_sourcepkg}"
        local _origfile="${1}_${_version}_${DEBARCH}.deb"
        local _crossfile="${1}-${DEBARCH}-cross_${_version}_all.deb"

        [ -f ${_origfile} ] || wget -nv -r -nd -N ${_mirror}/${_origfile}
        [ -f ${_crossfile} ] || dpkg-cross -a ${DEBARCH} -b ${_origfile}
        sudo dpkg --force-depends -i ${_crossfile}
}


# build and install libraries needed to build the cross toolchain
build-libs () {
        make-cross-arch-package linux-kernel-headers
#       make-cross-package tzdata
#       make-cross-package tzdata-mips-dcv1
        make-cross-arch-package libc6
        make-cross-arch-package libc6-dev
}


# build and install cross binutils
build-binutils () {
        local _upver=$(upstreamversion binutils)
        local _version=$(version binutils)

        if [ ! -d binutils-${_version} ]; then
                rm -rf binutils-${_upver}
                apt-get source binutils
                pushd binutils-${_upver}
                echo "${DEBARCH}" > debian/target
                popd
                mv binutils-${_upver} binutils-${_version}
        fi
        pushd binutils-${_version}
        dpkg-buildpackage -us -uc -B -rfakeroot
        popd

        sudo dpkg -i \
                binutils-${DEBARCH}-linux-gnu_${_version}_${HOSTARCH}.deb
}


# build cross gcc versions: build-gcc <majorversion>
build-gcc () {
        local _upver=$(upstreamversion gcc-$1)
        local _version=$(version gcc-$1)

        if [ ! -d gcc-$1-${_version} ]; then
                rm -rf gcc-$1-${_upver}
                apt-get source gcc-$1
                pushd gcc-$1-${_upver}
                echo "${DEBARCH}" > debian/target
                fakeroot debian/rules control
                popd
                mv gcc-$1-${_upver} gcc-$1-${_version}
        fi
        pushd gcc-$1-${_version}
        dpkg-buildpackage -us -uc -B -rfakeroot
        popd
}

# install cross gcc versions: install-gcc <majorversion>
install-gcc () {
        local _version=$(version gcc-4.0)

        sudo dpkg -i \
                cpp-$1-mips-linux-gnu_${_version}_${HOSTARCH}.deb \
                g++-$1-mips-linux-gnu_${_version}_${HOSTARCH}.deb \
                gcc-$1-mips-linux-gnu_${_version}_${HOSTARCH}.deb \
                libgcc1-mips-cross_${_version}_all.deb \
                libstdc++6-$1-dbg-mips-cross_${_version}_all.deb \
                libstdc++6-$1-dev-mips-cross_${_version}_all.deb \
                libstdc++6-$1-pic-mips-cross_${_version}_all.deb \
                libstdc++6-mips-cross_${_version}_all.deb
}

# build and install cross gcc-4.0
build-gcc-4.0 () {
        build-gcc 4.0
        install-gcc 4.0
}

# build cross gcc-4.1
build-gcc-4.1 () {
        build-gcc 4.1
#       install-gcc 4.1
}

# build cross gcc-snapshot
build-gcc-snapshot () {
        # Hack, hack.
        pushd /usr/lib
        sudo ln -sf /usr gcc-snapshot
        popd

        build-gcc snapshot
#       install-gcc snapshot
}

#----------------------------------------------------------------------
# Finally, do the work.

# sanity check build environment

checkinstalled dpkg-cross

# dpkg-cross version check
if [[ "1.17" > $(dpkg-cross --help 2>&1 |awk '{print $3; exit;}') ]]; then
        echo "dpkg-cross is too old."
        exit 1
fi

# make everything

build-libs
build-binutils
build-gcc-4.0
#build-gcc-4.1
#build-gcc-snapshot


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to