From: Marc-André Lureau <marcandre.lureau@redhat.com>
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 <marcandre.lureau@redhat.com>
---
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
On 9/24/25 14:04, marcandre.lureau@redhat.com wrote: > From: Marc-André Lureau <marcandre.lureau@redhat.com> > > 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 <marcandre.lureau@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> > --- > 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" > +}
On 9/24/25 14:04, marcandre.lureau@redhat.com wrote: > 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 No shebang is needed, since the file is sourced into the configure script. Otherwise, Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Paolo > +# > +# 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" > +}
Hi On Wed, Sep 24, 2025 at 4:08 PM <marcandre.lureau@redhat.com> wrote: > > From: Marc-André Lureau <marcandre.lureau@redhat.com> > > 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 <marcandre.lureau@redhat.com> 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
© 2016 - 2025 Red Hat, Inc.