It will work for PL011 but there are other devices using the same method for selecting rust or c++ file like HPET in timer. You can check this:- https://github.com/qemu/qemu/blob/master/hw/timer/Kconfig Wouldn’t it create inconsistencies in code if we change only for PL011?
On Wed, 19 Mar 2025 at 7:19 PM, Philippe Mathieu-Daudé <phi...@linaro.org> wrote: > On 19/3/25 14:44, Peter Maydell wrote: > > On Wed, 19 Mar 2025 at 12:53, Tanish Desai <tanishdesa...@gmail.com> > wrote: > >> > >> The issue started after commit > https://github.com/qemu/qemu/commit/59f4d65584bd3372070e2484876436c8d02505e4 > >> > >> Reproduction: > >> 1. In the build directory on MacOS (haven't tried on other OS), run: > >> ../configure --enable-rust --target-list=aarch64-softmmu > >> 2. Then run either: > >> ninja -C . > >> OR > >> make > >> 3. At the end, you will encounter the error: > >> duplicate symbol '_pl011_create' in: > >> > > /Users/tanishdesai37/Downloads/qemu-master/build/libcommon.a.p/hw_char_pl011.c.o > >> > librust_aarch64_softmmu.a[5](pl011.pl011.390d424367e209af-cgu.1.rcgu.o) > >> ld: 1 duplicate symbols > >> > >> Root cause: > >> Both CONFIG_PL011 and X_PL011_RUST are selected, causing C++ and > Rust to produce the same object. > >> This is due to the commit above where 'select PL011' forces a true > condition instead of checking if HAVE_RUST is true. > >> If HAVE_RUST is true, X_PL011_RUST should be selected instead of > CONFIG_PL011. > >> > >> Signed-off-by: Tanish Desai <tanishdesa...@gmail.com> > >> --- > >> hw/vmapple/Kconfig | 3 ++- > >> 1 file changed, 2 insertions(+), 1 deletion(-) > >> > >> diff --git a/hw/vmapple/Kconfig b/hw/vmapple/Kconfig > >> index 2382b297672..01bcbf40e00 100644 > >> --- a/hw/vmapple/Kconfig > >> +++ b/hw/vmapple/Kconfig > >> @@ -22,7 +22,8 @@ config VMAPPLE > >> select PLATFORM_BUS > >> select PCI_EXPRESS > >> select PCI_EXPRESS_GENERIC_BRIDGE > >> - select PL011 # UART > >> + select PL011 if !HAVE_RUST # UART > >> + select X_PL011_RUST if HAVE_RUST # UART > >> select PL031 # RTC > >> select PL061 # GPIO > >> select GPIO_PWR > > > > Paolo: we seem to have quite a lot of this > > > > select PL011 if !HAVE_RUST # UART > > select X_PL011_RUST if HAVE_RUST # UART > > > > duplicated for every PL011-using machine. Can we factor this out > > in Kconfig? e.g. > > > > config PL011 > > select X_PL011_RUST if HAVE_RUST > > select PL011_C if !HAVE_RUST > > > > (and update hw/char/meson.build to use CONFIG_PL011_C for pl011.c). > > Then all the machines can go back to plain "select PL011" and > > don't need to care whether it's the Rust or C version. > > > > Or does that not work? > > This should work. > >