Il gio 20 giu 2024, 20:13 Manos Pitsidianakis < manos.pitsidiana...@linaro.org> ha scritto:
> On Thu, 20 Jun 2024 16:21, Paolo Bonzini <pbonz...@redhat.com> wrote: > >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.lur...@redhat.com/ > >> > >> Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> > >> Signed-off-by: Manos Pitsidianakis <manos.pitsidiana...@linaro.org> > > > >The cargo_wrapper.py script is not used yet, so it should be > >delayed until it's used. > > That's true, I just wanted to make review easier by splitting it out. > Can we squash them later or do you think I should I do it for the next > series version? > I guess it depends on what the next version looks like. If you start working on the workspace/build tree/Kconfig parts, it might not have a lot of cargo_wrapper.py code surviving. Feel free to take this patch and add Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> Paolo >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 > > > Hm that looks better indeed, thanks! > > > > 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')] > > > > > >