Am 12. Juni 2025 05:46:03 UTC schrieb Paolo Bonzini <pbonz...@redhat.com>:
>On 6/12/25 07:12, Paolo Bonzini wrote:
>> I'll send a patch to the upstream dtc project and you can add it to QEMU via
>> diff_files (see commit 64644bc4eab2f for an example).
>This is the patch, backported to QEMU's version of the dtc subproject:
>
>diff --git a/libfdt/meson.build b/libfdt/meson.build
>index 0307ffb..6581965 100644
>--- a/libfdt/meson.build
>+++ b/libfdt/meson.build
>@@ -30,6 +30,7 @@ libfdt_dep = declare_dependency(
> include_directories: libfdt_inc,
> link_with: libfdt,
> )
>+meson.override_dependency('libfdt', libfdt_dep)
> install_headers(
> files(
>diff --git a/meson.build b/meson.build
>index b23ea1b..7def0a6 100644
>--- a/meson.build
>+++ b/meson.build
>@@ -54,6 +54,7 @@ version_gen_h = vcs_tag(
> subdir('libfdt')
> +dtc_tools = []
> if get_option('tools')
> flex = find_program('flex', required: true)
> bison = find_program('bison', required: true)
>@@ -77,7 +78,7 @@ if get_option('tools')
> )
> if cc.check_header('fnmatch.h')
>- executable(
>+ dtc_tools += executable(
> 'convert-dtsv0',
> [
> lgen.process('convert-dtsv0-lexer.l'),
>@@ -88,7 +89,7 @@ if get_option('tools')
> )
> endif
> - executable(
>+ dtc_tools += executable(
> 'dtc',
> [
> lgen.process('dtc-lexer.l'),
>@@ -108,7 +109,7 @@ if get_option('tools')
> )
> foreach e: ['fdtdump', 'fdtget', 'fdtput', 'fdtoverlay']
>- executable(e, files(e + '.c'), dependencies: util_dep, install: true)
>+ dtc_tools += executable(e, files(e + '.c'), dependencies: util_dep,
>install: true)
> endforeach
> install_data(
>@@ -118,6 +119,10 @@ if get_option('tools')
> )
> endif
> +foreach e: dtc_tools
>+ meson.override_find_program(e.name(), e)
>+endforeach
>+
> if not meson.is_cross_build()
> if py.found() and swig.found()
> subdir('pylibfdt')
>
>
>and this is how you can then find dtc in QEMU's meson.build:
>
>diff --git a/meson.build b/meson.build
>index 61595015802..831678b4580 100644
>--- a/meson.build
>+++ b/meson.build
>@@ -2121,13 +2121,15 @@ if numa.found() and not cc.links('''
> endif
> fdt = not_found
>+dtc = not_found
> fdt_opt = get_option('fdt')
> if fdt_opt == 'enabled' and get_option('wrap_mode') == 'nodownload'
> fdt_opt = 'system'
> endif
> if fdt_opt in ['enabled', 'system'] or (fdt_opt == 'auto' and have_system)
> fdt = cc.find_library('fdt', required: fdt_opt == 'system')
>- if fdt.found() and cc.links('''
>+ dtc = find_program('dtc', required: fdt_opt == 'system')
>+ if dtc.found() and fdt.found() and cc.links('''
> #include <libfdt.h>
> #include <libfdt_env.h>
> int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
>@@ -2136,8 +2138,12 @@ if fdt_opt in ['enabled', 'system'] or (fdt_opt ==
>'auto' and have_system)
> elif fdt_opt != 'system'
> fdt_opt = get_option('wrap_mode') == 'nodownload' ? 'disabled' :
> 'internal'
> fdt = not_found
>+ dtc = not_found
> else
>- error('system libfdt is too old (1.5.1 or newer required)')
>+ if dtc.found()
>+ error('system libfdt is too old (1.5.1 or newer required)')
>+ else
>+ error('device tree compiler not found')
> endif
> endif
> if fdt_opt == 'internal'
>@@ -2145,7 +2148,8 @@ if fdt_opt == 'internal'
> libfdt_proj = subproject('dtc', required: true,
> default_options: ['tools=false', 'yaml=disabled',
> 'python=disabled',
> 'default_library=static'])
>- fdt = libfdt_proj.get_variable('libfdt_dep')
>+ fdt = dependency('libfdt', required: true)
>+ dtc = find_program('dtc', required: true)
> endif
> rdma = not_found
>
Thanks Paolo, I'll send a v2.
Best regards,
Bernhard