On Wed, Oct 7, 2026 at 12:03 PM Pierrick Bouvier
<[email protected]> wrote:
>
> For now, TARGET_ARCH only contains 32 vs 64 bit arch. The variants,
> based on endianness, are accessible through TARGET_NAME. However,
> TARGET_NAME is a string, and thus can't be concatenated to generate code
> and retrieve matching SYS_EMU_TARGET enum entry.
> Thus, export this information in TARGET_ARCH_VARIANT as an unquoted
> identifier.
>
> There is one more subtlety, user binaries have extra targets that are
> not present in SYS_EMU_TARGET, like armeb.
> Thus, for user binaries, simply export TARGET_ARCH.


>
> Signed-off-by: Pierrick Bouvier <[email protected]>
> ---
>  meson.build | 11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/meson.build b/meson.build
> index cae1591cd28..9bcfe84daba 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -3288,7 +3288,14 @@ default_targets = 'CONFIG_DEFAULT_TARGETS' in 
> config_host
>  actual_target_dirs = []
>  fdt_required = []
>  foreach target : target_dirs
> -  config_target = { 'TARGET_NAME': target.split('-')[0] }
> +  target_name = target.split('-')[0]
> +  config_target = { 'TARGET_NAME': target_name }
> +  if target.endswith('linux-user')
> +    config_target += { 'TARGET_ARCH_VARIANT': 'TARGET_ARCH' }

If TARGET_ARCH_VARIANT or just called (TARGET_NAME_ENUM) is just a
direct mapping of target_name regardless linux-user/bsd-user/softmmu,
the logic would
be simpler. That would need add more enum to SYS_EMU_TARGET, the
current form is:
##
# @SysEmuTarget:
#     The comprehensive enumeration of QEMU system emulation
#     ("softmmu") targets.  Run "./configure --help" in the project
#     root directory, and look for the \*-softmmu targets near the
#     "--target-list" option.  The individual target constants are not
#     documented here, for the time being.
#
# @rx: since 5.0
#
# @avr: since 5.1
#
# @loongarch64: since 7.1
#
# @hexagon: since 11.0
#
# .. note:: The resulting QMP strings can be appended to the
#    "qemu-system-" prefix to produce the corresponding QEMU
#    executable name.  This is true even for "qemu-system-x86_64".
#
# Since: 3.0
##
{ 'enum' : 'SysEmuTarget',
  'data' : [ 'aarch64', 'alpha', 'arm', 'avr', 'hexagon', 'hppa', 'i386',
             'loongarch64', 'm68k', 'microblaze', 'mips', 'mips64',
             'mips64el', 'mipsel', 'or1k', 'ppc',
             'ppc64', 'riscv32', 'riscv64', 'rx', 's390x', 'sh4',
             'sh4eb', 'sparc', 'sparc64', 'tricore',
             'x86_64', 'xtensa', 'xtensaeb' ] }


The list target names that missing from SysEmuTarget:

Comparing the target-name prefixes of `configs/targets/*.mak` with the
`SysEmuTarget` enum in `qapi/machine.json`, the following seven names are
missing. All are Linux-user-only targets.

| Target name | Config |
|---|---|
| `aarch64_be` | `configs/targets/aarch64_be-linux-user.mak` |
| `armeb` | `configs/targets/armeb-linux-user.mak` |
| `microblazeel` | `configs/targets/microblazeel-linux-user.mak` |
| `mipsn32` | `configs/targets/mipsn32-linux-user.mak` |
| `mipsn32el` | `configs/targets/mipsn32el-linux-user.mak` |
| `ppc64le` | `configs/targets/ppc64le-linux-user.mak` |
| `sparc32plus` | `configs/targets/sparc32plus-linux-user.mak` |

All `*-softmmu` and `*-bsd-user` target names match enum entries.

This comparison uses names derived from config filenames, not the
`TARGET_ARCH` values inside those configs.

By doing this I think it would be more consistent.
If these target names are removed in future, then just remove it from
SysEmuTarget
along with. So SysEmuTarget is just a direct mapping of TARGET_NAME. Though
The comment of SysEmuTarget needs updated, it's not just about softmmu, but also
for linux-user and bsd-user. But the fact is, with the current
changes. *-user also
used SysEmuTarget as an enum.


And TARGET_ARCH should also be exported by TargetInfo for other usage.
And it's enums is the subset
of enum SysEmuTarget



> +  else
> +    config_target += { 'TARGET_ARCH_VARIANT': target_name.to_upper() }
> +  endif
> +
>    if target.endswith('linux-user')
>      if host_os != 'linux'
>        if default_targets
> @@ -3372,7 +3379,7 @@ foreach target : target_dirs
>        # do nothing
>      elif ignored.contains(k)
>        # do nothing
> -    elif k == 'TARGET_ARCH'
> +    elif k == 'TARGET_ARCH' or k == 'TARGET_ARCH_VARIANT'
>        config_target_data.set(k, v.to_upper())
>      elif k == 'TARGET_BASE_ARCH'
>        # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
> --
> 2.43.0
>
>


--
         此致
礼
罗勇刚
Yours
    sincerely,
Yonggang Luo

Reply via email to