Re: [PATCH v6 100/103] tests/tcg/meson.build: implement ./configure -cross-cc-* options

Pierrick Bouvier <[email protected]>
Newsgroups org.nongnu.qemu-devel
Message-ID <[email protected]>
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>
>>>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.