Manos Pitsidianakis <manos.pitsidiana...@linaro.org> writes: > Add mechanism to generate rust hw targets that depend on a custom > bindgen target for rust bindings to C. > > This way bindings will be created before the rust crate is compiled. > > The bindings will end up in BUILDDIR/{target}-generated.rs and have the same > name > as a target: > > ninja aarch64-softmmu-generated.rs > <snip> > + > + > +rust_targets = {} > + > +cargo_wrapper = [ > + find_program(meson.global_source_root() / 'scripts/cargo_wrapper.py'), > + '--config-headers', meson.project_build_root() / 'config-host.h', > + '--meson-build-root', meson.project_build_root(), > + '--meson-build-dir', meson.current_build_dir(), > + '--meson-source-dir', meson.current_source_dir(), > +]
I'm unclear what the difference between meson-build-root and meson-build-dir is? We also end up defining crate-dir and outdir. Aren't these all derivable from whatever module we are building? > + > +if get_option('b_colorout') != 'never' > + cargo_wrapper += ['--color', 'always'] > +endif > + > +if get_option('optimization') in ['0', '1', 'g'] > + rs_build_type = 'debug' > +else > + rs_build_type = 'release' > +endif > + > +# Collect metadata for each (crate,qemu-target,compiler-target) combination. > +# Rust meson targets cannot be defined a priori because they depend on > bindgen > +# generation that is created for each emulation target separately. Thus Rust > +# meson targets will be defined for each target after the target-specific > +# bindgen dependency is declared. > +rust_hw_target_list = {} > + > +foreach rust_hw_target, rust_hws: rust_hw_target_list > + foreach rust_hw_dev: rust_hws > + output = meson.current_build_dir() / rust_target_triple / rs_build_type > / rust_hw_dev['output'] > + crate_metadata = { > + 'name': rust_hw_dev['name'], > + 'output': [rust_hw_dev['output']], > + 'output-path': output, > + 'command': [cargo_wrapper, > + '--crate-dir', meson.current_source_dir() / rust_hw_dev['dirname'], > + '--profile', rs_build_type, > + '--target-triple', rust_target_triple, > + '--outdir', '@OUTDIR@', > + 'build-lib' > + ] > + } > + rust_targets += { rust_hw_target: [crate_metadata] } > + endforeach > +endforeach > diff --git a/rust/wrapper.h b/rust/wrapper.h > new file mode 100644 > index 0000000000..bcf808c8d7 > --- /dev/null > +++ b/rust/wrapper.h > @@ -0,0 +1,39 @@ > +/* > + * QEMU System Emulator > + * > + * Copyright (c) 2003-2020 Fabrice Bellard > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > copy > + * of this software and associated documentation files (the "Software"), to > deal > + * in the Software without restriction, including without limitation the > rights > + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell > + * copies of the Software, and to permit persons to whom the Software is > + * furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice shall be included in > + * all copies or substantial portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > FROM, > + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN > + * THE SOFTWARE. > + */ > + > +#include "qemu/osdep.h" > +#include "qemu/module.h" > +#include "qemu-io.h" > +#include "sysemu/sysemu.h" > +#include "hw/sysbus.h" > +#include "exec/memory.h" > +#include "chardev/char-fe.h" > +#include "hw/clock.h" > +#include "hw/qdev-clock.h" > +#include "hw/qdev-properties.h" > +#include "hw/qdev-properties-system.h" > +#include "hw/irq.h" > +#include "qapi/error.h" > +#include "migration/vmstate.h" > +#include "chardev/char-serial.h" > diff --git a/scripts/cargo_wrapper.py b/scripts/cargo_wrapper.py > index 927336f80e..833e0e55f8 100644 > --- a/scripts/cargo_wrapper.py > +++ b/scripts/cargo_wrapper.py > @@ -111,6 +111,8 @@ def get_cargo_rustc(args: argparse.Namespace) -> > tuple[Dict[str, Any], List[str] > > env = os.environ > env["CARGO_ENCODED_RUSTFLAGS"] = cfg > + env["MESON_BUILD_DIR"] = str(target_dir) > + env["MESON_BUILD_ROOT"] = str(args.meson_build_root) > > return (env, cargo_cmd) > > @@ -234,6 +236,14 @@ def main() -> None: > required=True, > ) > parser.add_argument( > + "--meson-build-root", > + metavar="BUILD_ROOT", > + help="meson.project_build_root()", > + type=Path, > + dest="meson_build_root", > + required=True, > + ) > + parser.add_argument( > "--meson-source-dir", > metavar="SOURCE_DIR", > help="meson.current_source_dir()", -- Alex Bennée Virtualisation Tech Lead @ Linaro