[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PoCv2 03/15] build-sys: add --with-rust{-target} & basic build infrastr
From: |
marcandre . lureau |
Subject: |
[PoCv2 03/15] build-sys: add --with-rust{-target} & basic build infrastructure |
Date: |
Mon, 12 Oct 2020 00:35:01 +0400 |
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Add the build-sys infrastructure to build Rust code. Introduce a
top-level workspace, so various sub-projects (libraries, executables
etc) can be developed together, sharing the dependencies and output
directory.
If not Tier 1, many of the platforms QEMU supports are considered Tier
2: https://doc.rust-lang.org/nightly/rustc/platform-support.html
Rust is generally available on various distributions (thanks to Firefox,
I suppose). If not, it can usually be installed with rustup by
developpers.
configure will enable Rust support automatically if cargo is present.
Rust support can be disabled --without-rust. When detecting windows
cross building, it will use the $cpu-pc-windows-gnu target by
default (more default mappings could be added over time). This can be
changed with --with-rust-target=RTT.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
Cargo.toml | 2 ++
configure | 18 ++++++++++++++++++
meson.build | 23 +++++++++++++++++++++++
3 files changed, 43 insertions(+)
create mode 100644 Cargo.toml
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000000..c4b464ff15
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,2 @@
+[workspace]
+members = []
diff --git a/configure b/configure
index b553288c5e..7945ceac63 100755
--- a/configure
+++ b/configure
@@ -446,6 +446,8 @@ meson=""
ninja=""
skip_meson=no
gettext=""
+with_rust="auto"
+with_rust_target=""
bogus_os="no"
malloc_trim="auto"
@@ -1519,6 +1521,12 @@ for opt do
;;
--disable-libdaxctl) libdaxctl=no
;;
+ --with-rust) with_rust=yes
+ ;;
+ --without-rust) with_rust=no
+ ;;
+ --with-rust-target=*) with_rust_target="$optarg"
+ ;;
*)
echo "ERROR: unknown option $opt"
echo "Try '$0 --help' for more information"
@@ -1666,6 +1674,8 @@ Advanced options (experts only):
--extra-ldflags=LDFLAGS append extra linker flags LDFLAGS
--cross-cc-ARCH=CC use compiler when building ARCH guest test cases
--cross-cc-flags-ARCH= use compiler flags when building ARCH guest tests
+ --with-rust enable Rust compilation
+ --with-rust-target=RTT use the given Rust target triple
--make=MAKE use specified make [$make]
--python=PYTHON use specified python [$python]
--sphinx-build=SPHINX use specified sphinx-build [$sphinx_build]
@@ -1918,6 +1928,10 @@ if test -z "$ninja"; then
done
fi
+if test "$with_rust" = auto && has cargo; then
+ with_rust=yes
+fi
+
# Check that the C compiler works. Doing this here before testing
# the host CPU ensures that we had a valid CC to autodetect the
# $cpu var (and we should bail right here if that's not the case).
@@ -7046,6 +7060,10 @@ fi
if test "$safe_stack" = "yes"; then
echo "CONFIG_SAFESTACK=y" >> $config_host_mak
fi
+if test "$with_rust" = "yes" ; then
+ echo "CONFIG_WITH_RUST=y" >> $config_host_mak
+ echo "CONFIG_WITH_RUST_TARGET=$with_rust_target" >> $config_host_mak
+fi
# If we're using a separate build tree, set it up now.
# DIRS are directories which we simply mkdir in the build tree;
diff --git a/meson.build b/meson.build
index 17c89c87c6..d8526dc999 100644
--- a/meson.build
+++ b/meson.build
@@ -73,6 +73,28 @@ if cpu in ['x86', 'x86_64']
}
endif
+with_rust = 'CONFIG_WITH_RUST' in config_host
+cargo = find_program('cargo', required: with_rust)
+
+if with_rust
+ rs_target_triple = config_host['CONFIG_WITH_RUST_TARGET']
+ if meson.is_cross_build()
+ # more default target mappings may be added over time
+ if rs_target_triple == '' and targetos == 'windows'
+ rs_target_triple = host_machine.cpu() + '-pc-windows-gnu'
+ endif
+ if rs_target_triple == ''
+ error('cross-compiling, but no Rust target-triple defined.')
+ endif
+ endif
+endif
+
+if get_option('optimization') in ['0', '1', 'g']
+ rs_build_type = 'debug'
+else
+ rs_build_type = 'release'
+endif
+
##################
# Compiler flags #
##################
@@ -1770,6 +1792,7 @@ endif
if targetos == 'darwin'
summary_info += {'Objective-C compiler':
meson.get_compiler('objc').cmd_array()[0]}
endif
+summary_info += {'Rust support': with_rust}
summary_info += {'ARFLAGS': config_host['ARFLAGS']}
summary_info += {'CFLAGS': ' '.join(get_option('c_args')
+ ['-O' +
get_option('optimization')]
--
2.28.0
- [PoCv2 00/15] Rust binding for QAPI (qemu-ga only, for now), marcandre . lureau, 2020/10/11
- [PoCv2 01/15] mingw: fix error __USE_MINGW_ANSI_STDIO redefined, marcandre . lureau, 2020/10/11
- [PoCv2 02/15] scripts/qapi: teach c_param_type() to return const argument type, marcandre . lureau, 2020/10/11
- [PoCv2 03/15] build-sys: add --with-rust{-target} & basic build infrastructure,
marcandre . lureau <=
- [PoCv2 04/15] build-sys: add a cargo-wrapper script, marcandre . lureau, 2020/10/11
- [PoCv2 05/15] qga/rust: build and link an empty static library, marcandre . lureau, 2020/10/11
- [PoCv2 06/15] rust: provide a common crate for QEMU, marcandre . lureau, 2020/10/11
- [PoCv2 07/15] scripts/qapi: add Rust sys bindings generation, marcandre . lureau, 2020/10/11
- [PoCv2 08/15] qga/rust: generate QGA QAPI sys bindings, marcandre . lureau, 2020/10/11
- [PoCv2 09/15] scripts/qapi: add generation of Rust bindings for types, marcandre . lureau, 2020/10/11
- [PoCv2 10/15] qga/rust: build Rust types, marcandre . lureau, 2020/10/11
- [PoCv2 11/15] qga: add qmp! macro helper, marcandre . lureau, 2020/10/11
- [PoCv2 12/15] qga: implement get-host-name in Rust, marcandre . lureau, 2020/10/11
- [PoCv2 13/15] qga: implement {get,set}-vcpus in Rust, marcandre . lureau, 2020/10/11