On 8/12/2026 12:37 PM, Alex Bennée wrote:
> Pierrick Bouvier <[email protected]> writes:
> 
>> On 8/12/2026 9:03 AM, Alex Bennée wrote:
>>> Alex Bennée <[email protected]> writes:
>>>
>>>> Pierrick Bouvier <[email protected]> writes:
>>>>
>>>>> When a user set explicit cross cc, we ensure it's available and working.
>>>>> When a user set explicit cross cflags, we ensure they work with default
>>>>> or overriden cross_cc.
>>>>>
>>>>> Made the first implementation with a single meson option (array), which
>>>>> proved to be absolutely unreadable.
>>>>> By having one option per target, we directly detect issue at configure
>>>>> time, either for user, or when iterating on all our targets. This
>>>>> ensures user can't mispell any target name, and that we can't forget any
>>>>> new one in the future.
>>>>> Also, it shows them in the configuration summary, which is a bonus.
>>>>>
>>>>> Since we now only need to know compiler to write tcg tests, we can
>>>>> simply alias -cross-prefix-* options to compiler override.
>>>>>
>>>>> Examples
>>>>> --------
>>>>>
>>>>> wrong architecture:
>>>>> $ ./configure --cross-cc-bad='cc'
>>>>> ../meson.build:1:0: ERROR: Unknown option: "tcg_tests_cross_cc_bad"
>>>>>
>>>>> wrong option:
>>>>> $ ./configure --cross-cc-cflags-aarch64='-bad-option'
>>>>> ../tests/tcg/meson.build:228:10: ERROR: Command 
>>>>> `/usr/bin/aarch64-linux-gnu-gcc 
>>>>> /home/pbouvier/.work/qemu/tests/tcg/test_cc.c -bad-option -static 
>>>>> -nostdlib -r -o /dev/null` failed with status 1.
>>>>> A full log can be found at /qemu/build/meson-logs/meson-log.txt
>>>>>
>>>>> cross compile with clang (fails at the moment, since some tests have
>>>>> compilation errors with it):
>>>>> $ ./configure --target-list=aarch64-linux-user --cross-cc-aarch64='clang' 
>>>>> --cross-cc-cflags-aarch64='-target aarch64-linux-gnu'
>>>>>   User defined options
>>>>>   ...
>>>>>     tcg_tests_cross_cc_aarch64      : clang
>>>>>     tcg_tests_cross_cflags_aarch64  : -target aarch64-linux-gnu
>>>>>
>>>>> Signed-off-by: Pierrick Bouvier <[email protected]>
>>>>> ---
>>>>>  configure             | 27 ++++++-------
>>>>>  meson_options.txt     | 89 +++++++++++++++++++++++++++++++++++++++++++
>>>>>  tests/tcg/meson.build | 30 ++++++++++++---
>>>>>  3 files changed, 126 insertions(+), 20 deletions(-)
>>>>>
>>>>> diff --git a/configure b/configure
>>>>> index 568de41dadd..c9e2cdcce5f 100755
>>>>> --- a/configure
>>>>> +++ b/configure
>>>>> @@ -227,19 +227,6 @@ for opt do
>>>>>    ;;
>>>>>    --extra-ldflags=*) EXTRA_LDFLAGS="$EXTRA_LDFLAGS $optarg"
>>>>>    ;;
>>>>> -  --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO 
>>>>> option"
>>>>> -  ;;
>>>>> -  --cross-cc-cflags-*) cc_arch=${opt#--cross-cc-cflags-}; 
>>>>> cc_arch=${cc_arch%%=*}
>>>>> -                      eval "cross_cc_cflags_${cc_arch}=\$optarg"
>>>>> -  ;;
>>>>> -  --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}
>>>>> -                eval "cross_cc_${cc_arch}=\$optarg"
>>>>> -  ;;
>>>>> -  --cross-prefix-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad 
>>>>> --cross-prefix-FOO option"
>>>>> -  ;;
>>>>> -  --cross-prefix-*) cc_arch=${opt#--cross-prefix-}; 
>>>>> cc_arch=${cc_arch%%=*}
>>>>> -                    eval "cross_prefix_${cc_arch}=\$optarg"
>>>>> -  ;;
>>>>>    --without-default-features) default_feature="no"
>>>>>    ;;
>>>>>    --wasm64-32bit-address-limit) wasm64_memory64="2"
>>>>> @@ -632,9 +619,19 @@ for opt do
>>>>>    ;;
>>>>>    --extra-ldflags=*)
>>>>>    ;;
>>>>> -  --cross-cc-*)
>>>>> +  --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO 
>>>>> option"
>>>>>    ;;
>>>>> -  --cross-prefix-*)
>>>>> +  --cross-cc-cflags-*) arch=${opt#--cross-cc-cflags-}; arch=${arch%%=*}
>>>>> +                       meson_option_add 
>>>>> "-Dtcg_tests_cross_cflags_${arch}=${optarg}"
>>>>> +  ;;
>>>>> +  --cross-cc-*) arch=${opt#--cross-cc-}; arch=${arch%%=*}
>>>>> +                meson_option_add "-Dtcg_tests_cross_cc_${arch}=${optarg}"
>>>>> +  ;;
>>>>> +  --cross-prefix-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad 
>>>>> --cross-prefix-FOO option"
>>>>> +  ;;
>>>>> +  # cross-prefix is just used as a syntactic sugar for -cross-cc.
>>>>> +  --cross-prefix-*) arch=${opt#--cross-prefix-}; arch=${arch%%=*}
>>>>> +                    meson_option_add 
>>>>> "-Dtcg_tests_cross_cc_${arch}=${optarg}gcc"
>>>>>    ;;
>>>>>    --enable-docs) docs=enabled
>>>>>    ;;
>>>>> diff --git a/meson_options.txt b/meson_options.txt
>>>>> index 5e91969414a..fd9ff0df893 100644
>>>>> --- a/meson_options.txt
>>>>> +++ b/meson_options.txt
>>>>> @@ -389,3 +389,92 @@ option('containers', type: 'boolean', value: true,
>>>>>         description: 'use containers to cross compile tcg tests')
>>>>>  option('container_command', type: 'string',
>>>>>         description: 'command to build/run containers')
>>>>> +
>>>>> +option('tcg_tests_cross_cc_aarch64', type: 'string',
>>>>> +       description: 'cc for aarch64 tcg tests')
>>>>> +option('tcg_tests_cross_cflags_aarch64', type: 'string',
>>>>> +       description: 'cflags for aarch64 tcg tests')
>>>>> +option('tcg_tests_cross_cc_aarch64_be', type: 'string',
>>>>> +       description: 'cc for aarch64_be tcg tests')
>>>>> +option('tcg_tests_cross_cflags_aarch64_be', type: 'string',
>>>>> +       description: 'cflags for aarch64_be tcg tests')
>>>>> +option('tcg_tests_cross_cc_alpha', type: 'string',
>>>>> +       description: 'cc for alpha tcg tests')
>>>>> +option('tcg_tests_cross_cflags_alpha', type: 'string',
>>>>> +       description: 'cflags for alpha tcg tests')
>>>>> +option('tcg_tests_cross_cc_arm', type: 'string',
>>>>> +       description: 'cc for arm tcg tests')
>>>>> +option('tcg_tests_cross_cflags_arm', type: 'string',
>>>>> +       description: 'cflags for arm tcg tests')
>>>>> +option('tcg_tests_cross_cc_hexagon', type: 'string',
>>>>> +       description: 'cc for hexagon tcg tests')
>>>>> +option('tcg_tests_cross_cflags_hexagon', type: 'string',
>>>>> +       description: 'cflags for hexagon tcg tests')
>>>>> +option('tcg_tests_cross_cc_hppa', type: 'string',
>>>>> +       description: 'cc for hppa tcg tests')
>>>>> +option('tcg_tests_cross_cflags_hppa', type: 'string',
>>>>> +       description: 'cflags for hppa tcg tests')
>>>>> +option('tcg_tests_cross_cc_i386', type: 'string',
>>>>> +       description: 'cc for i386 tcg tests')
>>>>> +option('tcg_tests_cross_cflags_i386', type: 'string',
>>>>> +       description: 'cflags for i386 tcg tests')
>>>>> +option('tcg_tests_cross_cc_loongarch64', type: 'string',
>>>>> +       description: 'cc for loongarch64 tcg tests')
>>>>> +option('tcg_tests_cross_cflags_loongarch64', type: 'string',
>>>>> +       description: 'cflags for loongarch64 tcg tests')
>>>>> +option('tcg_tests_cross_cc_m68k', type: 'string',
>>>>> +       description: 'cc for m68k tcg tests')
>>>>> +option('tcg_tests_cross_cflags_m68k', type: 'string',
>>>>> +       description: 'cflags for m68k tcg tests')
>>>>> +option('tcg_tests_cross_cc_mips', type: 'string',
>>>>> +       description: 'cc for mips tcg tests')
>>>>> +option('tcg_tests_cross_cflags_mips', type: 'string',
>>>>> +       description: 'cflags for mips tcg tests')
>>>>> +option('tcg_tests_cross_cc_mips64', type: 'string',
>>>>> +       description: 'cc for mips64 tcg tests')
>>>>> +option('tcg_tests_cross_cflags_mips64', type: 'string',
>>>>> +       description: 'cflags for mips64 tcg tests')
>>>>> +option('tcg_tests_cross_cc_mips64el', type: 'string',
>>>>> +       description: 'cc for mips64el tcg tests')
>>>>> +option('tcg_tests_cross_cflags_mips64el', type: 'string',
>>>>> +       description: 'cflags for mips64el tcg tests')
>>>>> +option('tcg_tests_cross_cc_or1k', type: 'string',
>>>>> +       description: 'cc for or1k tcg tests')
>>>>> +option('tcg_tests_cross_cflags_or1k', type: 'string',
>>>>> +       description: 'cflags for or1k tcg tests')
>>>>> +option('tcg_tests_cross_cc_ppc64', type: 'string',
>>>>> +       description: 'cc for ppc64 tcg tests')
>>>>> +option('tcg_tests_cross_cflags_ppc64', type: 'string',
>>>>> +       description: 'cflags for ppc64 tcg tests')
>>>>> +option('tcg_tests_cross_cc_ppc64le', type: 'string',
>>>>> +       description: 'cc for ppc64le tcg tests')
>>>>> +option('tcg_tests_cross_cflags_ppc64le', type: 'string',
>>>>> +       description: 'cflags for ppc64le tcg tests')
>>>>> +option('tcg_tests_cross_cc_riscv64', type: 'string',
>>>>> +       description: 'cc for riscv64 tcg tests')
>>>>> +option('tcg_tests_cross_cflags_riscv64', type: 'string',
>>>>> +       description: 'cflags for riscv64 tcg tests')
>>>>> +option('tcg_tests_cross_cc_s390x', type: 'string',
>>>>> +       description: 'cc for s390x tcg tests')
>>>>> +option('tcg_tests_cross_cflags_s390x', type: 'string',
>>>>> +       description: 'cflags for s390x tcg tests')
>>>>> +option('tcg_tests_cross_cc_sh4', type: 'string',
>>>>> +       description: 'cc for sh4 tcg tests')
>>>>> +option('tcg_tests_cross_cflags_sh4', type: 'string',
>>>>> +       description: 'cflags for sh4 tcg tests')
>>>>> +option('tcg_tests_cross_cc_tricore', type: 'string',
>>>>> +       description: 'cc for tricore tcg tests')
>>>>> +option('tcg_tests_cross_cflags_tricore', type: 'string',
>>>>> +       description: 'cflags for tricore tcg tests')
>>>>> +option('tcg_tests_cross_cc_x86_64', type: 'string',
>>>>> +       description: 'cc for x86_64 tcg tests')
>>>>> +option('tcg_tests_cross_cflags_x86_64', type: 'string',
>>>>> +       description: 'cflags for x86_64 tcg tests')
>>>>> +option('tcg_tests_cross_cc_xtensa', type: 'string',
>>>>> +       description: 'cc for xtensa tcg tests')
>>>>> +option('tcg_tests_cross_cflags_xtensa', type: 'string',
>>>>> +       description: 'cflags for xtensa tcg tests')
>>>>> +option('tcg_tests_cross_cc_xtensaeb', type: 'string',
>>>>> +       description: 'cc for xtensaeb tcg tests')
>>>>> +option('tcg_tests_cross_cflags_xtensaeb', type: 'string',
>>>>> +       description: 'cflags for xtensaeb tcg tests')
>>>>> diff --git a/tests/tcg/meson.build b/tests/tcg/meson.build
>>>>> index ba73eecf1c9..8dd6623ad1d 100644
>>>>> --- a/tests/tcg/meson.build
>>>>> +++ b/tests/tcg/meson.build
>>>>> @@ -180,6 +180,8 @@ foreach target, plan: tcg_tests
>>>>>      continue
>>>>>    endif
>>>>>  
>>>>> +  cc_arch = target.replace('-linux-user', '').replace('-softmmu', '')
>>>>> +
>>>>>    # Detect duplicated executables/tests, and report an error to force 
>>>>> user to
>>>>>    # choose how to deal with it.
>>>>>    built_tests = {}
>>>>> @@ -197,16 +199,34 @@ foreach target, plan: tcg_tests
>>>>>    endforeach
>>>>>  
>>>>>    cc = find_program(plan['cc'], required : false)
>>>>> +  cc_cflags = []
>>>>> +
>>>>> +  check_flags = []
>>>>> +  check_required = false
>>>>> +  cross_cc = get_option('tcg_tests_cross_cc_' + cc_arch)
>>>>> +  if cross_cc != ''
>>>>> +    # we make sure cross cc exists
>>>>> +    cc = find_program(cross_cc, required: true)
>>>>> +    check_required = true
>>>>> +  endif
>>>>> +  cross_cflags = get_option('tcg_tests_cross_cflags_' + cc_arch)
>>>>> +  if cross_cflags != ''
>>>>> +    cc_cflags = cross_cflags.split()
>>>>> +    # and that cross cc can compile programs
>>>>> +    check_flags = cc_cflags
>>>>> +    check_required = true
>>>>> +  endif
>>>>> +
>>>>>    cc_from_system = cc.found()
>>>>>    has_cc = cc.found()
>>>>>    if has_cc
>>>>> -    check_flags = ['-static']
>>>>> +    check_flags += ['-static']
>>>>>      if target.endswith('softmmu')
>>>>> -      check_flags = ['-nostdlib', '-r']
>>>>> +      check_flags += ['-nostdlib', '-r']
>>>>>      endif
>>>
>>> What it needs is -ffreestanding - it gets away with it on linux as the
>>> compilers are mostly userspace compilers and it can fallback to those
>>> headers. On macOS or if you install a pure bare metal compiler it would
>>> fail.
>>>
>>
>> Makes sense, that's a good reason for having this flag setup by default.
>> Does it solve the issue to find stdint.h on the mac setup you have?
> 
> For softmmu yes, for linux-user we shouldn't ever try to build a target
> on macOS (although I don't know if the bsd-user would work?).
>

Ok. I don't think *-user would work on MacOS, since it's the same
situation than windows where syscall interface is not stable across
versions.

>>> <snip>
>>>
> 


Reply via email to