diff mbox series

[v3,03/46] configure: add support for --cross-cc-FOO

Message ID 20180424152405.10304-4-alex.bennee@linaro.org
State New
Headers show
Series fix building of tests/tcg | expand

Commit Message

Alex Bennée April 24, 2018, 3:23 p.m. UTC
This allows us to specify cross compilers for our guests. This is
useful for building test images/programs. Currently we re-run the
compile test for each target. I couldn't think of a way to cache the
value for a given arch without getting messier configure code.

The cross compiler for the guest is visible to each target as
CROSS_CC_GUEST in config-target.mak.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>


---
v3
  - --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit...
  - --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}
  - add remaining target_compiler definitions
---
 configure | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 79 insertions(+)

-- 
2.17.0

Comments

Richard Henderson April 25, 2018, 12:10 a.m. UTC | #1
On 04/24/2018 05:23 AM, Alex Bennée wrote:
> @@ -675,10 +687,12 @@ case "$cpu" in

>    i386|i486|i586|i686|i86pc|BePC)

>      cpu="i386"

>      supported_cpu="yes"

> +    cross_cc_i386=gcc

>    ;;

>    x86_64|amd64)

>      cpu="x86_64"

>      supported_cpu="yes"

> +    cross_cc_x86_64=gcc

>    ;;

>    armv*b|armv*l|arm)

>      cpu="arm"


Isn't this hunk taken care of in the next patch, where you set these to $cc?
And if not, surely bare "gcc" isn't correct...

Otherwise,
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>



r~
Alex Bennée April 25, 2018, 9:10 a.m. UTC | #2
Richard Henderson <richard.henderson@linaro.org> writes:

> On 04/24/2018 05:23 AM, Alex Bennée wrote:

>> @@ -675,10 +687,12 @@ case "$cpu" in

>>    i386|i486|i586|i686|i86pc|BePC)

>>      cpu="i386"

>>      supported_cpu="yes"

>> +    cross_cc_i386=gcc

>>    ;;

>>    x86_64|amd64)

>>      cpu="x86_64"

>>      supported_cpu="yes"

>> +    cross_cc_x86_64=gcc

>>    ;;

>>    armv*b|armv*l|arm)

>>      cpu="arm"

>

> Isn't this hunk taken care of in the next patch, where you set these to $cc?

> And if not, surely bare "gcc" isn't correct...


Woops, I'll fix that.

>

> Otherwise,

> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

>

>

> r~



--
Alex Bennée
Murilo Opsfelder Araujo April 25, 2018, 4:27 p.m. UTC | #3
On 04/24/2018 12:23 PM, Alex Bennée wrote:
> This allows us to specify cross compilers for our guests. This is

> useful for building test images/programs. Currently we re-run the

> compile test for each target. I couldn't think of a way to cache the

> value for a given arch without getting messier configure code.

> 

> The cross compiler for the guest is visible to each target as

> CROSS_CC_GUEST in config-target.mak.

> 

> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

> 

> ---

> v3

>   - --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit...

>   - --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}

>   - add remaining target_compiler definitions

> ---

>  configure | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++

>  1 file changed, 79 insertions(+)

> 

> diff --git a/configure b/configure

> index b0ae632ee4..caa838a0d0 100755

> --- a/configure

> +++ b/configure

> @@ -453,6 +453,13 @@ vxhs=""

>  libxml2=""

>  docker="no"

>  

> +# cross compilers defaults, can be overridden with --cross-cc-ARCH

> +cross_cc_aarch64="aarch64-linux-gnu-gcc"

> +cross_cc_arm="arm-linux-gnueabihf-gcc"

> +cross_cc_powerpc="powerpc-linux-gnu-gcc"


Do we need to have default values for all targets?

> +

> +enabled_cross_compilers=""

> +

>  supported_cpu="no"

>  supported_os="no"

>  bogus_os="no"

> @@ -483,6 +490,11 @@ for opt do

>    ;;

>    --disable-debug-info) debug_info="no"

>    ;;

> +  --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"

> +  ;;

> +  --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}

> +                eval "cross_cc_${cc_arch}=\$optarg"

> +  ;;


Do we need to verify if a valid --cross-cc-FOO was passed, in case of a
typo?

>    esac

>  done

>  # OS specific

> @@ -675,10 +687,12 @@ case "$cpu" in

>    i386|i486|i586|i686|i86pc|BePC)

>      cpu="i386"

>      supported_cpu="yes"

> +    cross_cc_i386=gcc

>    ;;

>    x86_64|amd64)

>      cpu="x86_64"

>      supported_cpu="yes"

> +    cross_cc_x86_64=gcc

>    ;;

>    armv*b|armv*l|arm)

>      cpu="arm"

> @@ -912,6 +926,8 @@ for opt do

>    ;;

>    --disable-debug-info)

>    ;;

> +  --cross-cc-*)

> +  ;;

>    --enable-modules)

>        modules="yes"

>    ;;

> @@ -6777,6 +6793,8 @@ case "$target" in

>      ;;

>  esac

>  

> +target_compiler=""

> +

>  mkdir -p $target_dir

>  echo "# Automatically generated by configure - do not modify" > $config_target_mak

>  

> @@ -6792,19 +6810,23 @@ TARGET_ABI_DIR=""

>  case "$target_name" in

>    i386)

>      gdb_xml_files="i386-32bit.xml i386-32bit-core.xml i386-32bit-sse.xml"

> +    target_compiler=$cross_cc_i386

>    ;;

>    x86_64)

>      TARGET_BASE_ARCH=i386

>      gdb_xml_files="i386-64bit.xml i386-64bit-core.xml i386-64bit-sse.xml"

> +    target_compiler=$cross_cc_x86_64

>    ;;

>    alpha)

>      mttcg="yes"

> +    target_compiler=$cross_cc_alpha

>    ;;

>    arm|armeb)

>      TARGET_ARCH=arm

>      bflt="yes"

>      mttcg="yes"

>      gdb_xml_files="arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"

> +    target_compiler=$cross_cc_arm

>    ;;

>    aarch64|aarch64_be)

>      TARGET_ARCH=aarch64

> @@ -6812,58 +6834,73 @@ case "$target_name" in

>      bflt="yes"

>      mttcg="yes"

>      gdb_xml_files="aarch64-core.xml aarch64-fpu.xml arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"

> +    target_compiler=$cross_cc_aarch64

>    ;;

>    cris)

> +    target_compiler=$cross_cc_cris

>    ;;

>    hppa)

>      mttcg="yes"

> +    target_compiler=$cross_cc_hppa

>    ;;

>    lm32)

> +    target_compiler=$cross_cc_lm32

>    ;;

>    m68k)

>      bflt="yes"

>      gdb_xml_files="cf-core.xml cf-fp.xml m68k-fp.xml"

> +    target_compiler=$cross_cc_m68k

>    ;;

>    microblaze|microblazeel)

>      TARGET_ARCH=microblaze

>      bflt="yes"

> +    target_compiler=$cross_cc_microblaze

>    ;;

>    mips|mipsel)

>      TARGET_ARCH=mips

> +    target_compiler=$cross_cc_mips

>      echo "TARGET_ABI_MIPSO32=y" >> $config_target_mak

>    ;;

>    mipsn32|mipsn32el)

>      TARGET_ARCH=mips64

>      TARGET_BASE_ARCH=mips

> +    target_compiler=$cross_cc_mipsn32

>      echo "TARGET_ABI_MIPSN32=y" >> $config_target_mak

>      echo "TARGET_ABI32=y" >> $config_target_mak

>    ;;

>    mips64|mips64el)

>      TARGET_ARCH=mips64

>      TARGET_BASE_ARCH=mips

> +    target_compiler=$cross_cc_mips64

>      echo "TARGET_ABI_MIPSN64=y" >> $config_target_mak

>    ;;

>    moxie)

> +    target_compiler=$cross_cc_moxie

>    ;;

>    nios2)

> +    target_compiler=$cross_cc_nios2

>    ;;

>    or1k)

> +    target_compiler=$cross_cc_or1k

>      TARGET_ARCH=openrisc

>      TARGET_BASE_ARCH=openrisc

>    ;;

>    ppc)

>      gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml"

> +    target_compiler=$cross_cc_powerpc

>    ;;

>    ppcemb)

>      TARGET_BASE_ARCH=ppc

>      TARGET_ABI_DIR=ppc

>      gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml"

> +    target_compiler=$cross_cc_ppcemb

>    ;;

>    ppc64)

>      TARGET_BASE_ARCH=ppc

>      TARGET_ABI_DIR=ppc

>      mttcg=yes

>      gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"

> +    target_compiler=$cross_cc_ppc64

>    ;;

>    ppc64le)

>      TARGET_ARCH=ppc64

> @@ -6871,6 +6908,7 @@ case "$target_name" in

>      TARGET_ABI_DIR=ppc

>      mttcg=yes

>      gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"

> +    target_compiler=$cross_cc_ppc64le

>    ;;

>    ppc64abi32)

>      TARGET_ARCH=ppc64

> @@ -6878,45 +6916,57 @@ case "$target_name" in

>      TARGET_ABI_DIR=ppc

>      echo "TARGET_ABI32=y" >> $config_target_mak

>      gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"

> +    target_compiler=$cross_cc_ppc64abi32

>    ;;

>    riscv32)

>      TARGET_BASE_ARCH=riscv

>      TARGET_ABI_DIR=riscv

>      mttcg=yes

> +    target_compiler=$cross_cc_riscv32

>    ;;

>    riscv64)

>      TARGET_BASE_ARCH=riscv

>      TARGET_ABI_DIR=riscv

>      mttcg=yes

> +    target_compiler=$cross_cc_riscv64

>    ;;

>    sh4|sh4eb)

>      TARGET_ARCH=sh4

>      bflt="yes"

> +    target_compiler=$cross_cc_sh4

>    ;;

>    sparc)

> +    target_compiler=$cross_cc_sparc

>    ;;

>    sparc64)

>      TARGET_BASE_ARCH=sparc

> +    target_compiler=$cross_cc_sparc64

>    ;;

>    sparc32plus)

>      TARGET_ARCH=sparc64

>      TARGET_BASE_ARCH=sparc

>      TARGET_ABI_DIR=sparc

> +    target_compiler=$cross_cc_sparc32plus

>      echo "TARGET_ABI32=y" >> $config_target_mak

>    ;;

>    s390x)

>      mttcg=yes

>      gdb_xml_files="s390x-core64.xml s390-acr.xml s390-fpr.xml s390-vx.xml s390-cr.xml s390-virt.xml s390-gs.xml"

> +    target_compiler=$cross_cc_s390x

>    ;;

>    tilegx)

> +    target_compiler=$cross_cc_tilegx

>    ;;

>    tricore)

> +    target_compiler=$cross_cc_tricore

>    ;;

>    unicore32)

> +    target_compiler=$cross_cc_unicore32

>    ;;

>    xtensa|xtensaeb)

>      TARGET_ARCH=xtensa

>      mttcg="yes"

> +    target_compiler=$cross_cc_xtensa

>    ;;

>    *)

>      error_exit "Unsupported target CPU"

> @@ -6927,6 +6977,25 @@ if [ "$TARGET_BASE_ARCH" = "" ]; then

>    TARGET_BASE_ARCH=$TARGET_ARCH

>  fi

>  

> +# Do we have a cross compiler for this target?

> +if has $target_compiler; then

> +

> +    cat > $TMPC << EOF

> +#include <stdio.h>

> +int main(void) {

> +    printf("Hello World!\n");

> +}

> +EOF


Can this be replaced by write_c_skeleton?

> +

> +    if ! do_compiler $target_compiler -o $TMPE $TMPC -static ; then

> +        target_compiler=""

> +    else

> +        enabled_cross_compilers="${enabled_cross_compilers} ${target_compiler}"

> +    fi

> +else

> +    target_compiler=""

> +fi

> +

>  symlink "$source_path/Makefile.target" "$target_dir/Makefile"

>  

>  upper() {

> @@ -7000,6 +7069,10 @@ if test "$target_bsd_user" = "yes" ; then

>    echo "CONFIG_BSD_USER=y" >> $config_target_mak

>  fi

>  

> +if test -n "$target_compiler"; then

> +  echo "CROSS_CC_GUEST=$target_compiler" >> $config_target_mak

> +fi

> +

>  # generate QEMU_CFLAGS/LDFLAGS for targets

>  

>  cflags=""

> @@ -7122,6 +7195,12 @@ echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak

>  

>  done # for target in $targets

>  

> +if test -n "$enabled_cross_compilers"; then

> +    echo

> +    echo "NOTE: cross-compilers enabled:"

> +    printf '%s\n' $enabled_cross_compilers | sort -u

> +fi

> +

>  if [ "$dtc_internal" = "yes" ]; then

>    echo "config-host.h: subdir-dtc" >> $config_host_mak

>  fi

>
Peter Maydell April 25, 2018, 5:03 p.m. UTC | #4
On 24 April 2018 at 16:23, Alex Bennée <alex.bennee@linaro.org> wrote:
> This allows us to specify cross compilers for our guests. This is

> useful for building test images/programs. Currently we re-run the

> compile test for each target. I couldn't think of a way to cache the

> value for a given arch without getting messier configure code.

>

> The cross compiler for the guest is visible to each target as

> CROSS_CC_GUEST in config-target.mak.

>

> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

>

> ---

> v3

>   - --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit...

>   - --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}

>   - add remaining target_compiler definitions

> ---

>  configure | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++

>  1 file changed, 79 insertions(+)

>

> diff --git a/configure b/configure

> index b0ae632ee4..caa838a0d0 100755

> --- a/configure

> +++ b/configure

> @@ -453,6 +453,13 @@ vxhs=""

>  libxml2=""

>  docker="no"

>

> +# cross compilers defaults, can be overridden with --cross-cc-ARCH

> +cross_cc_aarch64="aarch64-linux-gnu-gcc"

> +cross_cc_arm="arm-linux-gnueabihf-gcc"

> +cross_cc_powerpc="powerpc-linux-gnu-gcc"

> +

> +enabled_cross_compilers=""

> +

>  supported_cpu="no"

>  supported_os="no"

>  bogus_os="no"

> @@ -483,6 +490,11 @@ for opt do

>    ;;

>    --disable-debug-info) debug_info="no"

>    ;;

> +  --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"

> +  ;;

> +  --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}

> +                eval "cross_cc_${cc_arch}=\$optarg"

> +  ;;


Could we have --help text for the new configure options,
please?

thanks
-- PMM
Alex Bennée May 16, 2018, 3:18 p.m. UTC | #5
Murilo Opsfelder Araujo <muriloo@linux.ibm.com> writes:

> On 04/24/2018 12:23 PM, Alex Bennée wrote:

>> This allows us to specify cross compilers for our guests. This is

>> useful for building test images/programs. Currently we re-run the

>> compile test for each target. I couldn't think of a way to cache the

>> value for a given arch without getting messier configure code.

>>

>> The cross compiler for the guest is visible to each target as

>> CROSS_CC_GUEST in config-target.mak.

>>

>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

>>

>> ---

>> v3

>>   - --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit...

>>   - --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}

>>   - add remaining target_compiler definitions

>> ---

>>  configure | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++

>>  1 file changed, 79 insertions(+)

>>

>> diff --git a/configure b/configure

>> index b0ae632ee4..caa838a0d0 100755

>> --- a/configure

>> +++ b/configure

>> @@ -453,6 +453,13 @@ vxhs=""

>>  libxml2=""

>>  docker="no"

>>

>> +# cross compilers defaults, can be overridden with --cross-cc-ARCH

>> +cross_cc_aarch64="aarch64-linux-gnu-gcc"

>> +cross_cc_arm="arm-linux-gnueabihf-gcc"

>> +cross_cc_powerpc="powerpc-linux-gnu-gcc"

>

> Do we need to have default values for all targets?

>

>> +

>> +enabled_cross_compilers=""

>> +

>>  supported_cpu="no"

>>  supported_os="no"

>>  bogus_os="no"

>> @@ -483,6 +490,11 @@ for opt do

>>    ;;

>>    --disable-debug-info) debug_info="no"

>>    ;;

>> +  --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"

>> +  ;;

>> +  --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}

>> +                eval "cross_cc_${cc_arch}=\$optarg"

>> +  ;;

>

> Do we need to verify if a valid --cross-cc-FOO was passed, in case of a

> typo?


How so? We do attempt to build with these options later.

>>

>> +# Do we have a cross compiler for this target?

>> +if has $target_compiler; then

>> +

>> +    cat > $TMPC << EOF

>> +#include <stdio.h>

>> +int main(void) {

>> +    printf("Hello World!\n");

>> +}

>> +EOF

>

> Can this be replaced by write_c_skeleton?


Sure. Thanks.

--
Alex Bennée
Murilo Opsfelder Araujo May 16, 2018, 5:36 p.m. UTC | #6
On Wed, May 16, 2018 at 04:18:56PM +0100, Alex Bennée wrote:
> 

> Murilo Opsfelder Araujo <muriloo@linux.ibm.com> writes:

> 

> > On 04/24/2018 12:23 PM, Alex Bennée wrote:

> >> This allows us to specify cross compilers for our guests. This is

> >> useful for building test images/programs. Currently we re-run the

> >> compile test for each target. I couldn't think of a way to cache the

> >> value for a given arch without getting messier configure code.

> >>

> >> The cross compiler for the guest is visible to each target as

> >> CROSS_CC_GUEST in config-target.mak.

> >>

> >> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

> >>

> >> ---

> >> v3

> >>   - --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit...

> >>   - --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}

> >>   - add remaining target_compiler definitions

> >> ---

> >>  configure | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++

> >>  1 file changed, 79 insertions(+)

> >>

> >> diff --git a/configure b/configure

> >> index b0ae632ee4..caa838a0d0 100755

> >> --- a/configure

> >> +++ b/configure

> >> @@ -453,6 +453,13 @@ vxhs=""

> >>  libxml2=""

> >>  docker="no"

> >>

> >> +# cross compilers defaults, can be overridden with --cross-cc-ARCH

> >> +cross_cc_aarch64="aarch64-linux-gnu-gcc"

> >> +cross_cc_arm="arm-linux-gnueabihf-gcc"

> >> +cross_cc_powerpc="powerpc-linux-gnu-gcc"

> >

> > Do we need to have default values for all targets?

> >

> >> +

> >> +enabled_cross_compilers=""

> >> +

> >>  supported_cpu="no"

> >>  supported_os="no"

> >>  bogus_os="no"

> >> @@ -483,6 +490,11 @@ for opt do

> >>    ;;

> >>    --disable-debug-info) debug_info="no"

> >>    ;;

> >> +  --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"

> >> +  ;;

> >> +  --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}

> >> +                eval "cross_cc_${cc_arch}=\$optarg"

> >> +  ;;

> >

> > Do we need to verify if a valid --cross-cc-FOO was passed, in case of a

> > typo?

> 

> How so? We do attempt to build with these options later.


Hi, Alex.

User can mistakenly pass, for example, --cross-cc-ppc64el= instead of the
expected --cross-cc-ppc64le=. I was wondering if we need to validate this kind
of input (inexistent $cross_cc_* variable) and consider --cross-cc-ppc64el= an
invalid option, in this example.

By the way, are you updating the --help text explaining these new --cross-cc-*
options?

-- 
Murilo
Alex Bennée May 16, 2018, 8:37 p.m. UTC | #7
Murilo Opsfelder Araujo <muriloo@linux.ibm.com> writes:

> On Wed, May 16, 2018 at 04:18:56PM +0100, Alex Bennée wrote:

>>

>> Murilo Opsfelder Araujo <muriloo@linux.ibm.com> writes:

>>

>> > On 04/24/2018 12:23 PM, Alex Bennée wrote:

>> >> This allows us to specify cross compilers for our guests. This is

>> >> useful for building test images/programs. Currently we re-run the

>> >> compile test for each target. I couldn't think of a way to cache the

>> >> value for a given arch without getting messier configure code.

>> >>

>> >> The cross compiler for the guest is visible to each target as

>> >> CROSS_CC_GUEST in config-target.mak.

>> >>

>> >> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

>> >>

>> >> ---

>> >> v3

>> >>   - --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit...

>> >>   - --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}

>> >>   - add remaining target_compiler definitions

>> >> ---

>> >>  configure | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++

>> >>  1 file changed, 79 insertions(+)

>> >>

>> >> diff --git a/configure b/configure

>> >> index b0ae632ee4..caa838a0d0 100755

>> >> --- a/configure

>> >> +++ b/configure

>> >> @@ -453,6 +453,13 @@ vxhs=""

>> >>  libxml2=""

>> >>  docker="no"

>> >>

>> >> +# cross compilers defaults, can be overridden with --cross-cc-ARCH

>> >> +cross_cc_aarch64="aarch64-linux-gnu-gcc"

>> >> +cross_cc_arm="arm-linux-gnueabihf-gcc"

>> >> +cross_cc_powerpc="powerpc-linux-gnu-gcc"

>> >

>> > Do we need to have default values for all targets?

>> >

>> >> +

>> >> +enabled_cross_compilers=""

>> >> +

>> >>  supported_cpu="no"

>> >>  supported_os="no"

>> >>  bogus_os="no"

>> >> @@ -483,6 +490,11 @@ for opt do

>> >>    ;;

>> >>    --disable-debug-info) debug_info="no"

>> >>    ;;

>> >> +  --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"

>> >> +  ;;

>> >> +  --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}

>> >> +                eval "cross_cc_${cc_arch}=\$optarg"

>> >> +  ;;

>> >

>> > Do we need to verify if a valid --cross-cc-FOO was passed, in case of a

>> > typo?

>>

>> How so? We do attempt to build with these options later.

>

> Hi, Alex.

>

> User can mistakenly pass, for example, --cross-cc-ppc64el= instead of the

> expected --cross-cc-ppc64le=. I was wondering if we need to validate this kind

> of input (inexistent $cross_cc_* variable) and consider --cross-cc-ppc64el= an

> invalid option, in this example.


OK I understand. I'm not sure how to do this without having a whole bunch of
additional boilerplate code though. I guess there is likely to be churn
each time a new guest architecture is added though.

We do currently dump the list of enabled compilers at the end of
configure so that at least should give the user some indication of what
didn't work?

> By the way, are you updating the --help text explaining these new --cross-cc-*

> options?


Yes.

--
Alex Bennée
diff mbox series

Patch

diff --git a/configure b/configure
index b0ae632ee4..caa838a0d0 100755
--- a/configure
+++ b/configure
@@ -453,6 +453,13 @@  vxhs=""
 libxml2=""
 docker="no"
 
+# cross compilers defaults, can be overridden with --cross-cc-ARCH
+cross_cc_aarch64="aarch64-linux-gnu-gcc"
+cross_cc_arm="arm-linux-gnueabihf-gcc"
+cross_cc_powerpc="powerpc-linux-gnu-gcc"
+
+enabled_cross_compilers=""
+
 supported_cpu="no"
 supported_os="no"
 bogus_os="no"
@@ -483,6 +490,11 @@  for opt do
   ;;
   --disable-debug-info) debug_info="no"
   ;;
+  --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"
+  ;;
+  --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}
+                eval "cross_cc_${cc_arch}=\$optarg"
+  ;;
   esac
 done
 # OS specific
@@ -675,10 +687,12 @@  case "$cpu" in
   i386|i486|i586|i686|i86pc|BePC)
     cpu="i386"
     supported_cpu="yes"
+    cross_cc_i386=gcc
   ;;
   x86_64|amd64)
     cpu="x86_64"
     supported_cpu="yes"
+    cross_cc_x86_64=gcc
   ;;
   armv*b|armv*l|arm)
     cpu="arm"
@@ -912,6 +926,8 @@  for opt do
   ;;
   --disable-debug-info)
   ;;
+  --cross-cc-*)
+  ;;
   --enable-modules)
       modules="yes"
   ;;
@@ -6777,6 +6793,8 @@  case "$target" in
     ;;
 esac
 
+target_compiler=""
+
 mkdir -p $target_dir
 echo "# Automatically generated by configure - do not modify" > $config_target_mak
 
@@ -6792,19 +6810,23 @@  TARGET_ABI_DIR=""
 case "$target_name" in
   i386)
     gdb_xml_files="i386-32bit.xml i386-32bit-core.xml i386-32bit-sse.xml"
+    target_compiler=$cross_cc_i386
   ;;
   x86_64)
     TARGET_BASE_ARCH=i386
     gdb_xml_files="i386-64bit.xml i386-64bit-core.xml i386-64bit-sse.xml"
+    target_compiler=$cross_cc_x86_64
   ;;
   alpha)
     mttcg="yes"
+    target_compiler=$cross_cc_alpha
   ;;
   arm|armeb)
     TARGET_ARCH=arm
     bflt="yes"
     mttcg="yes"
     gdb_xml_files="arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
+    target_compiler=$cross_cc_arm
   ;;
   aarch64|aarch64_be)
     TARGET_ARCH=aarch64
@@ -6812,58 +6834,73 @@  case "$target_name" in
     bflt="yes"
     mttcg="yes"
     gdb_xml_files="aarch64-core.xml aarch64-fpu.xml arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
+    target_compiler=$cross_cc_aarch64
   ;;
   cris)
+    target_compiler=$cross_cc_cris
   ;;
   hppa)
     mttcg="yes"
+    target_compiler=$cross_cc_hppa
   ;;
   lm32)
+    target_compiler=$cross_cc_lm32
   ;;
   m68k)
     bflt="yes"
     gdb_xml_files="cf-core.xml cf-fp.xml m68k-fp.xml"
+    target_compiler=$cross_cc_m68k
   ;;
   microblaze|microblazeel)
     TARGET_ARCH=microblaze
     bflt="yes"
+    target_compiler=$cross_cc_microblaze
   ;;
   mips|mipsel)
     TARGET_ARCH=mips
+    target_compiler=$cross_cc_mips
     echo "TARGET_ABI_MIPSO32=y" >> $config_target_mak
   ;;
   mipsn32|mipsn32el)
     TARGET_ARCH=mips64
     TARGET_BASE_ARCH=mips
+    target_compiler=$cross_cc_mipsn32
     echo "TARGET_ABI_MIPSN32=y" >> $config_target_mak
     echo "TARGET_ABI32=y" >> $config_target_mak
   ;;
   mips64|mips64el)
     TARGET_ARCH=mips64
     TARGET_BASE_ARCH=mips
+    target_compiler=$cross_cc_mips64
     echo "TARGET_ABI_MIPSN64=y" >> $config_target_mak
   ;;
   moxie)
+    target_compiler=$cross_cc_moxie
   ;;
   nios2)
+    target_compiler=$cross_cc_nios2
   ;;
   or1k)
+    target_compiler=$cross_cc_or1k
     TARGET_ARCH=openrisc
     TARGET_BASE_ARCH=openrisc
   ;;
   ppc)
     gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml"
+    target_compiler=$cross_cc_powerpc
   ;;
   ppcemb)
     TARGET_BASE_ARCH=ppc
     TARGET_ABI_DIR=ppc
     gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml"
+    target_compiler=$cross_cc_ppcemb
   ;;
   ppc64)
     TARGET_BASE_ARCH=ppc
     TARGET_ABI_DIR=ppc
     mttcg=yes
     gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
+    target_compiler=$cross_cc_ppc64
   ;;
   ppc64le)
     TARGET_ARCH=ppc64
@@ -6871,6 +6908,7 @@  case "$target_name" in
     TARGET_ABI_DIR=ppc
     mttcg=yes
     gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
+    target_compiler=$cross_cc_ppc64le
   ;;
   ppc64abi32)
     TARGET_ARCH=ppc64
@@ -6878,45 +6916,57 @@  case "$target_name" in
     TARGET_ABI_DIR=ppc
     echo "TARGET_ABI32=y" >> $config_target_mak
     gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
+    target_compiler=$cross_cc_ppc64abi32
   ;;
   riscv32)
     TARGET_BASE_ARCH=riscv
     TARGET_ABI_DIR=riscv
     mttcg=yes
+    target_compiler=$cross_cc_riscv32
   ;;
   riscv64)
     TARGET_BASE_ARCH=riscv
     TARGET_ABI_DIR=riscv
     mttcg=yes
+    target_compiler=$cross_cc_riscv64
   ;;
   sh4|sh4eb)
     TARGET_ARCH=sh4
     bflt="yes"
+    target_compiler=$cross_cc_sh4
   ;;
   sparc)
+    target_compiler=$cross_cc_sparc
   ;;
   sparc64)
     TARGET_BASE_ARCH=sparc
+    target_compiler=$cross_cc_sparc64
   ;;
   sparc32plus)
     TARGET_ARCH=sparc64
     TARGET_BASE_ARCH=sparc
     TARGET_ABI_DIR=sparc
+    target_compiler=$cross_cc_sparc32plus
     echo "TARGET_ABI32=y" >> $config_target_mak
   ;;
   s390x)
     mttcg=yes
     gdb_xml_files="s390x-core64.xml s390-acr.xml s390-fpr.xml s390-vx.xml s390-cr.xml s390-virt.xml s390-gs.xml"
+    target_compiler=$cross_cc_s390x
   ;;
   tilegx)
+    target_compiler=$cross_cc_tilegx
   ;;
   tricore)
+    target_compiler=$cross_cc_tricore
   ;;
   unicore32)
+    target_compiler=$cross_cc_unicore32
   ;;
   xtensa|xtensaeb)
     TARGET_ARCH=xtensa
     mttcg="yes"
+    target_compiler=$cross_cc_xtensa
   ;;
   *)
     error_exit "Unsupported target CPU"
@@ -6927,6 +6977,25 @@  if [ "$TARGET_BASE_ARCH" = "" ]; then
   TARGET_BASE_ARCH=$TARGET_ARCH
 fi
 
+# Do we have a cross compiler for this target?
+if has $target_compiler; then
+
+    cat > $TMPC << EOF
+#include <stdio.h>
+int main(void) {
+    printf("Hello World!\n");
+}
+EOF
+
+    if ! do_compiler $target_compiler -o $TMPE $TMPC -static ; then
+        target_compiler=""
+    else
+        enabled_cross_compilers="${enabled_cross_compilers} ${target_compiler}"
+    fi
+else
+    target_compiler=""
+fi
+
 symlink "$source_path/Makefile.target" "$target_dir/Makefile"
 
 upper() {
@@ -7000,6 +7069,10 @@  if test "$target_bsd_user" = "yes" ; then
   echo "CONFIG_BSD_USER=y" >> $config_target_mak
 fi
 
+if test -n "$target_compiler"; then
+  echo "CROSS_CC_GUEST=$target_compiler" >> $config_target_mak
+fi
+
 # generate QEMU_CFLAGS/LDFLAGS for targets
 
 cflags=""
@@ -7122,6 +7195,12 @@  echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak
 
 done # for target in $targets
 
+if test -n "$enabled_cross_compilers"; then
+    echo
+    echo "NOTE: cross-compilers enabled:"
+    printf '%s\n' $enabled_cross_compilers | sort -u
+fi
+
 if [ "$dtc_internal" = "yes" ]; then
   echo "config-host.h: subdir-dtc" >> $config_host_mak
 fi