Re: [PATCH] Add cross compile to top level configuration file

Anthony Liguori
2007-10-15T20:13:09Z

> This patch is an improved version of patches sent last week to enable
> the top level configuration file for cross compile. This currently
> allows x86 & x86-64 to cross compile. But will soon be sending patches
> for powerpc embedded once this is accepted. This patches to latest git
> and is in git format ;-)
>
> Signed-off-by: Jerone Young <jyoung5-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
>
> ------------------------------------------------------------------------

> diff --git a/configure b/configure
> --- a/configure
> +++ b/configure
> @@ -3,32 +3,30 @@ prefix=/usr/local
> prefix=/usr/local
> kerneldir=/lib/modules/$(uname -r)/build
> want_module=1
> -qemu_cc=$(ls /usr/bin/gcc3* /usr/bin/gcc-3* 2>/dev/null | tail -n1)
> +cc=gcc
> +qemu_cc=
> disable_gcc_check=
> +cross_prefix=
> +arch=`uname -m`
> +target_exec=
>
> usage() {
> cat <<-EOF
> Usage: $0 [options]
>
> Options include:
> -
> + --arch=ARCH architecture to compile for ($arch)
> + --cross-prefix=PREFIX prefix for cross compiler
> --prefix=PREFIX where to install things ($prefix)
> --with-patched-kernel don't use external module
> --kerneldir=DIR kernel build directory ($kerneldir)
> - --qemu-cc="$qemu_cc" compiler for qemu (needs gcc3.x) ($qemu_cc)
> + --qemu-cc=CC compiler for qemu (needs to be gcc 3.x)
> + Not valid if used with --cross-prefix
> --disable-gcc-check don't insist on gcc-3.x
> - - this will break running without kvm
> + CAUTION: using this option may break build
> EOF
> exit 1
> }
> -
> -
> -# prefer gcc if its version is 3.* ( over a compat-gcc )
> -# do it before parsing command line arguments to enable the user
> -# to specify a specific gcc he/she likes.
> -if gcc -v 2>&1 | grep -q 'gcc *version *3\.[2-4]\.[0-9]'; then
> - qemu_cc=gcc
> -fi
>
> while [[ "$1" = -* ]]; do
> opt="$1"; shift
> @@ -53,6 +51,12 @@ while [[ "$1" = -* ]]; do
> --disable-gcc-check)
> disable_gcc_check=1
> ;;
> + --arch)
> + arch="$arg"
> + ;;
> + --cross-prefix)
> + cross_prefix="$arg"
> + ;;
> --help)
> usage
> ;;
> @@ -62,39 +66,71 @@ while [[ "$1" = -* ]]; do
> esac
> done
>
> -if [[ -z "$qemu_cc" ]]; then
> - echo "$0: cannot locate gcc 3.x. please install it or specify with --qemu-cc"
> - exit 1
> +
> +# if cc is not specified on the command line
> +# look for gcc version 3.x
> +if [[ -z "$qemu_cc" ]] && [[ -z "$cross_prefix" ]]; then
> + #check for a gcc 3.x version on the system
> + cc_check=$(ls /usr/bin/gcc3* /usr/bin/gcc-3* 2>/dev/null | tail -n1)
> + #prefer gcc if its version is 3.* ( over a compat-gcc )
> + gcc_check=$(gcc -v 2>&1 | grep -q 'gcc *version *3\.[2-4]\.[0-9]')
> + if [[ -n "$cc_check" ]] && [[ -z "$gcc_check" ]] ; then
> + cc=$cc_check
> + fi
> fi
>
>

The QEMU that's in git automatically finds the right GCC version so this
whole check isn't necessary anymore.

Regards,

Anthony Liguori

> +#if qemu_cc is specfied on the command line, set cc=$qemu_cc
> +if [[ -n "$qemu_cc" ]] && [[ -z "$cross_prefix" ]]; then
> + cc=$qemu_cc
> +fi
> +
> +#set kenel directory
> libkvm_kerneldir="$kerneldir"
> if (( want_module )); then
> libkvm_kerneldir=$(readlink -f kernel)
> fi
>
> -target_cpu() {
> - if [[ $(uname -m) = i?86 ]]; then
> - echo x86_64
> - else
> - uname -m
> - fi
> -}
> +#if arch is an x86 arch set to i386
> +if [[ $arch = i?86 ]]; then
> + arch="i386"
> +fi
>
> -(cd user; ./configure --prefix="$prefix" --kerneldir="$libkvm_kerneldir")
> -(cd qemu; ./configure --target-list=$(target_cpu)-softmmu --cc="$qemu_cc" \
> +#see if using a cross compiler or not
> +qemu_opts=
> +user_opts=
> +if [[ -z $cross_prefix ]]; then
> + qemu_opts+=" --cc=$cc"
> + user_opts+=" --cc=$cc"
> +else
> + qemu_opts+=" --cross-prefix=$cross_prefix"
> + user_opts+=" --cross-prefix=$cross_prefix"
> +fi
> +
> +#set parameters compiling
> +if [ "$arch" = "i386" -o "$arch" = "x86_64" ]; then
> + target_exec="x86_64-softmmu"
> + qemu_opts+=" --enable-alsa"
>

Why are you only passing --enable-alsa only x86?

> +fi
> +
> +qemudir=`pwd`/qemu
> +
> +#configure user dir
> +(cd user; ./configure --prefix="$prefix" --kerneldir="$libkvm_kerneldir" \
> + $user_opts --arch="$arch")
> +(cd qemu; ./configure --target-list=$target_exec \
> --disable-kqemu --extra-cflags="-I $PWD/../user" \
> --extra-ldflags="-L $PWD/../user" \
> --enable-kvm --kernel-path="$libkvm_kerneldir" \
> - --enable-alsa \
> ${disable_gcc_check:+"--disable-gcc-check"} \
> - --prefix="$prefix"
> + --prefix="$prefix" \
> + $qemu_opts --cpu="$arch"
>

I don't think this is right. You're using two different --cpu options
for i386 and x86_64. There really shouldn't be a --cpu option at all
for x86.

Regards,

Anthony Liguori

> )
>
>
> -
> cat <<EOF > config.mak
> +ARCH=$arch
> PREFIX=$prefix
> KERNELDIR=$kerneldir
> WANT_MODULE=$want_module
> +CC=$cross_prefix$cc
> EOF
> -

> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Splunk Inc.
> Still grepping through log files to find problems? Stop.
> Now Search log events and configuration files using AJAX and a browser.
> Download your FREE copy of Splunk now >> http://get.splunk.com/
> ------------------------------------------------------------------------
>
> _______________________________________________
> kvm-devel mailing list
> kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
> https://lists.sourceforge.net/lists/listinfo/kvm-devel