On 6/19/24 22:13, Manos Pitsidianakis wrote:
Add options for Rust in meson_options.txt, meson.build, configure to
prepare for adding Rust code in the followup commits.
`rust` is a reserved meson name, so we have to use an alternative.
`with_rust` was chosen.
A cargo_wrapper.py script is added that is heavily based on the work of
Marc-André Lureau from 2021.
https://patchew.org/QEMU/20210907121943.3498701-1-marcandre.lureau@redhat.com/
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
The cargo_wrapper.py script is not used yet, so it should be
delayed until it's used.
For the detection of the toolchain, I'd rather do everything in
configure since that's where the cross file is built. Something like:
diff --git a/configure b/configure
index 8b6a2f16ceb..6412a1021c3 100755
--- a/configure
+++ b/configure
@@ -173,6 +173,8 @@ fi
# default parameters
container_engine="auto"
+rust_target_triple=""
+with_rust="no"
cpu=""
cross_compile="no"
cross_prefix=""
@@ -201,6 +202,8 @@ for opt do
--cross-prefix=*) cross_prefix="$optarg"
cross_compile="yes"
;;
+ --cargo=*) CARGO="$optarg"
+ ;;
--cc=*) CC="$optarg"
;;
--cxx=*) CXX="$optarg"
@@ -317,6 +322,8 @@ windmc="${WINDMC-${cross_prefix}windmc}"
pkg_config="${PKG_CONFIG-${cross_prefix}pkg-config}"
sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
+cargo="${CARGO-cargo}"
+
check_define() {
cat > $TMPC <<EOF
#if !defined($1)
@@ -628,6 +635,8 @@ for opt do
;;
--cross-prefix=*)
;;
+ --cargo=*)
+ ;;
--cc=*)
;;
--host-cc=*) host_cc="$optarg"
@@ -755,8 +764,14 @@ for opt do
;;
--container-engine=*) container_engine="$optarg"
;;
+ --rust-target-triple=*) rust_target_triple="$optarg"
+ ;;
--gdb=*) gdb_bin="$optarg"
;;
+ --with-rust) with_rust=yes
+ ;;
+ --without-rust) with_rust=no
+ ;;
# everything else has the same name in configure and meson
--*) meson_option_parse "$opt" "$optarg"
;;
@@ -854,6 +869,7 @@ $(echo Available targets: $default_target_list | \
Advanced options (experts only):
-Dmesonoptname=val passthrough option to meson unmodified
--cross-prefix=PREFIX use PREFIX for compile tools, PREFIX can be blank
[$cross_prefix]
+ --cargo=CARGO use Cargo binary CARGO [$cargo]
--cc=CC use C compiler CC [$cc]
--host-cc=CC when cross compiling, use C compiler CC for code run
at build time [$host_cc]
@@ -869,11 +885,13 @@ Advanced options (experts only):
--python=PYTHON use specified python [$python]
--ninja=NINJA use specified ninja [$ninja]
--static enable static build [$static]
- --without-default-features default all --enable-* options to "disabled"
- --without-default-devices do not include any device that is not needed to
+ --rust-target-triple=TRIPLE target for Rust cross compilation
+ --without-default-features default all --enable-* options to "disabled"
+ --without-default-devices do not include any device that is not needed to
start the emulator (only use if you are including
desired devices in configs/devices/)
--with-devices-ARCH=NAME override default configs/devices
+ --with-rust enable experimental Rust code
--enable-debug enable common debug build options
--cpu=CPU Build for host CPU [$cpu]
--disable-containers don't use containers for cross-building
@@ -1138,6 +1159,20 @@ EOF
fi
fi
+##########################################
+# detect rust triples
+
+if test "$with_rust" = yes; then
+ $CARGO -vV > "${TMPDIR1}/${TMPB}.out"
+ if test $? != 0; then
+ error_exit "could not execute cargo binary \"$CARGO\""
+ fi
+ rust_host_triple=$(sed -n 's/^host: //p' "${TMPDIR1}/${TMPB}.out")
+ if test "$rust_target_triple" = ""; then
+ rust_target_triple=$rust_host_triple
+ fi
+fi
+
##########################################
# functions to probe cross compilers
@@ -1604,6 +1639,10 @@ if test "$container" != no; then
echo "RUNC=$runc" >> $config_host_mak
fi
echo "SUBDIRS=$subdirs" >> $config_host_mak
+if test "$with_rust" = yes; then
+ echo "RUST_HOST_TRIPLE=$rust_host_triple" >> $config_host_mak
+ echo "RUST_TARGET_TRIPLE=$rust_target_triple" >> $config_host_mak
+fi
echo "PYTHON=$python" >> $config_host_mak
echo "MKVENV_ENSUREGROUP=$mkvenv ensuregroup $mkvenv_online_flag" >>
$config_host_mak
echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
@@ -1731,6 +1770,13 @@ if test "$skip_meson" = no; then
echo "c = [$(meson_quote $cc $CPU_CFLAGS)]" >> $cross
test -n "$cxx" && echo "cpp = [$(meson_quote $cxx $CPU_CFLAGS)]" >> $cross
test -n "$objcc" && echo "objc = [$(meson_quote $objcc $CPU_CFLAGS)]" >>
$cross
+ if test "$with_rust" = yes; then
+ if test "$rust_host_triple" != "$rust_target_triple"; then
+ echo "cargo = [$(meson_quote $cargo --target "$rust_target_triple")]" >>
$cross
+ else
+ echo "cargo = [$(meson_quote $cargo)]" >> $cross
+ fi
+ fi
echo "ar = [$(meson_quote $ar)]" >> $cross
echo "dlltool = [$(meson_quote $dlltool)]" >> $cross
echo "nm = [$(meson_quote $nm)]" >> $cross
diff --git a/meson.build b/meson.build
index c5360fbd299..ad7dbc0d641 100644
--- a/meson.build
+++ b/meson.build
@@ -290,6 +290,11 @@ foreach lang : all_languages
endif
endforeach
+cargo = not_found
+if 'RUST_TARGET_TRIPLE' in config_host
+ cargo = find_program('cargo', required: true)
+endif
+
# default flags for all hosts
# We use -fwrapv to tell the compiler that we require a C dialect where
# left shift of signed integers is well defined and has the expected
@@ -4239,6 +4244,10 @@ if 'objc' in all_languages
else
summary_info += {'Objective-C compiler': false}
endif
+summary_info += {'Rust support': cargo.found()}
+if cargo.found() and config_host['RUST_TARGET_TRIPLE']) !=
config_host['RUST_HOST_TRIPLE']
+ summary_info += {'Rust target': config_host['RUST_TARGET_TRIPLE']}
+endif
option_cflags = (get_option('debug') ? ['-g'] : [])
if get_option('optimization') != 'plain'
option_cflags += ['-O' + get_option('optimization')]