Hi
On Wed, Sep 24, 2025 at 4:08 PM <[email protected]> wrote:
>
> From: Marc-André Lureau <[email protected]>
>
> Implement a bash version of rust-bindgen rust_to_clang_target() to
> convert from rust target to clang target.
>
> Signed-off-by: Marc-André Lureau <[email protected]>
Paolo, ack?
> ---
> configure | 7 ++++
> scripts/rust-to-clang-target-test.sh | 43 +++++++++++++++++++
> scripts/rust-to-clang-target.sh | 62 ++++++++++++++++++++++++++++
> 3 files changed, 112 insertions(+)
> create mode 100755 scripts/rust-to-clang-target-test.sh
> create mode 100644 scripts/rust-to-clang-target.sh
>
> diff --git a/configure b/configure
> index 66613f3f4c..bf964947b8 100755
> --- a/configure
> +++ b/configure
> @@ -1878,6 +1878,13 @@ if test "$skip_meson" = no; then
> eval "c=\$devices_${a}"
> echo "${a}-softmmu = '$c'" >> $cross
> done
> + if test "$rust" != disabled; then
> + if test "$cross_compile" = "yes"; then
> + . "$source_path/scripts/rust-to-clang-target.sh"
> + clang_target=$(rust_to_clang_target "$rust_target_triple")
> + echo "bindgen_clang_arguments = [$(meson_quote
> --target="$clang_target")]" >> $cross
> + fi
> + fi
>
> echo "[built-in options]" >> $cross
> echo "c_args = [$(meson_quote $CFLAGS $EXTRA_CFLAGS)]" >> $cross
> diff --git a/scripts/rust-to-clang-target-test.sh
> b/scripts/rust-to-clang-target-test.sh
> new file mode 100755
> index 0000000000..ff6f8fcdc5
> --- /dev/null
> +++ b/scripts/rust-to-clang-target-test.sh
> @@ -0,0 +1,43 @@
> +#!/usr/bin/env sh
> +#
> +# Copyright (C) 2025 Red Hat, Inc.
> +#
> +# Based on rust_to_clang_target() tests from rust-bindgen.
> +#
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +
> +scripts_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
> +. "$scripts_dir/rust-to-clang-target.sh"
> +
> +test_case() {
> + input="$1"
> + expected="$2"
> + result=$(rust_to_clang_target "$input")
> +
> + if [ "$result" = "$expected" ]; then
> + echo " OK: '$input' -> '$result'"
> + else
> + echo " FAILED: '$input'"
> + echo " Expected: '$expected'"
> + echo " Got: '$result'"
> + exit 1
> + fi
> +}
> +
> +echo "Running tests..."
> +
> +test_case "aarch64-apple-ios" "arm64-apple-ios"
> +test_case "riscv64gc-unknown-linux-gnu" "riscv64-unknown-linux-gnu"
> +test_case "riscv64imac-unknown-none-elf" "riscv64-unknown-none-elf"
> +test_case "riscv32imc-unknown-none-elf" "riscv32-unknown-none-elf"
> +test_case "riscv32imac-unknown-none-elf" "riscv32-unknown-none-elf"
> +test_case "riscv32imafc-unknown-none-elf" "riscv32-unknown-none-elf"
> +test_case "riscv32i-unknown-none-elf" "riscv32-unknown-none-elf"
> +test_case "riscv32imc-esp-espidf" "riscv32-esp-elf"
> +test_case "xtensa-esp32-espidf" "xtensa-esp32-elf"
> +test_case "aarch64-apple-ios-sim" "arm64-apple-ios-simulator"
> +test_case "aarch64-apple-tvos-sim" "arm64-apple-tvos-simulator"
> +test_case "aarch64-apple-watchos-sim" "arm64-apple-watchos-simulator"
> +
> +echo ""
> +echo "All tests passed!"
> diff --git a/scripts/rust-to-clang-target.sh b/scripts/rust-to-clang-target.sh
> new file mode 100644
> index 0000000000..5451807888
> --- /dev/null
> +++ b/scripts/rust-to-clang-target.sh
> @@ -0,0 +1,62 @@
> +#!/usr/bin/env sh
> +#
> +# Copyright (C) 2025 Red Hat, Inc.
> +#
> +# Based on rust_to_clang_target() from rust-bindgen.
> +#
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +
> +rust_to_clang_target() {
> + rust_target="$1"
> +
> + # Split the string by hyphens
> + triple_parts=""
> + old_IFS="$IFS"
> + IFS='-'
> + for part in $rust_target; do
> + triple_parts="$triple_parts $part"
> + done
> + IFS="$old_IFS"
> + set -- $triple_parts
> +
> + # RISC-V
> + case "$1" in
> + riscv32*)
> + set -- "riscv32" "${2}" "${3}" "${4}"
> + ;;
> + riscv64*)
> + set -- "riscv64" "${2}" "${3}" "${4}"
> + ;;
> + esac
> +
> + # Apple
> + if [ "$2" = "apple" ]; then
> + if [ "$1" = "aarch64" ]; then
> + set -- "arm64" "${2}" "${3}" "${4}"
> + fi
> + if [ "$4" = "sim" ]; then
> + set -- "${1}" "${2}" "${3}" "simulator"
> + fi
> + fi
> +
> + # ESP-IDF
> + if [ "$3" = "espidf" ]; then
> + set -- "${1}" "${2}" "elf" "${4}"
> + fi
> +
> + # Reassemble the string
> + new_triple=""
> + first=1
> + for part in "$@"; do
> + if [ -n "$part" ]; then
> + if [ "$first" -eq 1 ]; then
> + new_triple="$part"
> + first=0
> + else
> + new_triple="$new_triple-$part"
> + fi
> + fi
> + done
> +
> + echo "$new_triple"
> +}
> --
> 2.51.0
>
>
--
Marc-André Lureau