meson: move libfdt together with other dependencies

Move the libfdt detection code together with other dependencies instead
of keeping it with subprojects.  This has the disadvantage of performing
the detection even if no target requires libfdt; but it has the advantage
that Kconfig will be able to observe the availability of the library.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2024-01-25 12:22:57 +01:00
parent 727bb5b477
commit 7a6f3343b6
1 changed files with 38 additions and 41 deletions

View File

@ -1858,6 +1858,34 @@ if numa.found() and not cc.links('''
endif endif
endif endif
fdt = 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('''
#include <libfdt.h>
#include <libfdt_env.h>
int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
dependencies: fdt)
fdt_opt = 'system'
elif fdt_opt != 'system'
fdt_opt = get_option('wrap_mode') == 'nodownload' ? 'disabled' : 'internal'
fdt = not_found
else
error('system libfdt is too old (1.5.1 or newer required)')
endif
endif
if fdt_opt == 'internal'
assert(not fdt.found())
libfdt_proj = subproject('dtc', required: true,
default_options: ['tools=false', 'yaml=disabled',
'python=disabled', 'default_library=static'])
fdt = libfdt_proj.get_variable('libfdt_dep')
endif
rdma = not_found rdma = not_found
if not get_option('rdma').auto() or have_system if not get_option('rdma').auto() or have_system
libumad = cc.find_library('ibumad', required: get_option('rdma')) libumad = cc.find_library('ibumad', required: get_option('rdma'))
@ -2199,6 +2227,7 @@ config_host_data.set('CONFIG_BSD', host_os in bsd_oses)
config_host_data.set('CONFIG_CAPSTONE', capstone.found()) config_host_data.set('CONFIG_CAPSTONE', capstone.found())
config_host_data.set('CONFIG_COCOA', cocoa.found()) config_host_data.set('CONFIG_COCOA', cocoa.found())
config_host_data.set('CONFIG_DARWIN', host_os == 'darwin') config_host_data.set('CONFIG_DARWIN', host_os == 'darwin')
config_host_data.set('CONFIG_FDT', fdt.found())
config_host_data.set('CONFIG_FUZZ', get_option('fuzzing')) config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
config_host_data.set('CONFIG_GCOV', get_option('b_coverage')) config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
config_host_data.set('CONFIG_LIBUDEV', libudev.found()) config_host_data.set('CONFIG_LIBUDEV', libudev.found())
@ -3024,14 +3053,16 @@ foreach target : target_dirs
error('No accelerator available for target @0@'.format(target)) error('No accelerator available for target @0@'.format(target))
endif endif
actual_target_dirs += target
config_target += keyval.load('configs/targets' / target + '.mak') config_target += keyval.load('configs/targets' / target + '.mak')
config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' } config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
if 'TARGET_NEED_FDT' in config_target if 'TARGET_NEED_FDT' in config_target and not fdt.found()
fdt_required += target fdt_required += target
continue
endif endif
actual_target_dirs += target
# Add default keys # Add default keys
if 'TARGET_BASE_ARCH' not in config_target if 'TARGET_BASE_ARCH' not in config_target
config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']} config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
@ -3119,6 +3150,10 @@ genh += custom_target('config-poison.h',
command: [find_program('scripts/make-config-poison.sh'), command: [find_program('scripts/make-config-poison.sh'),
target_configs_h]) target_configs_h])
if fdt_required.length() > 0
error('fdt disabled but required by targets ' + ', '.join(fdt_required))
endif
############### ###############
# Subprojects # # Subprojects #
############### ###############
@ -3129,44 +3164,6 @@ if have_system and vfio_user_server_allowed
libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep') libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep')
endif endif
fdt = not_found
fdt_opt = get_option('fdt')
if fdt_required.length() > 0 or fdt_opt == 'enabled'
if fdt_opt == 'disabled'
error('fdt disabled but required by targets ' + ', '.join(fdt_required))
endif
if fdt_opt in ['enabled', 'auto', 'system']
if get_option('wrap_mode') == 'nodownload'
fdt_opt = 'system'
endif
fdt = cc.find_library('fdt', required: fdt_opt == 'system')
if fdt.found() and cc.links('''
#include <libfdt.h>
#include <libfdt_env.h>
int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
dependencies: fdt)
fdt_opt = 'system'
elif fdt_opt == 'system'
error('system libfdt requested, but it is too old (1.5.1 or newer required)')
else
fdt_opt = 'internal'
fdt = not_found
endif
endif
if not fdt.found()
assert(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')
endif
else
fdt_opt = 'disabled'
endif
config_host_data.set('CONFIG_FDT', fdt.found())
vhost_user = not_found vhost_user = not_found
if host_os == 'linux' and have_vhost_user if host_os == 'linux' and have_vhost_user
libvhost_user = subproject('libvhost-user') libvhost_user = subproject('libvhost-user')
@ -4417,7 +4414,7 @@ summary_info += {'Linux AIO support': libaio}
summary_info += {'Linux io_uring support': linux_io_uring} summary_info += {'Linux io_uring support': linux_io_uring}
summary_info += {'ATTR/XATTR support': libattr} summary_info += {'ATTR/XATTR support': libattr}
summary_info += {'RDMA support': rdma} summary_info += {'RDMA support': rdma}
summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt} summary_info += {'fdt support': fdt_opt == 'internal' ? 'internal' : fdt}
summary_info += {'libcap-ng support': libcap_ng} summary_info += {'libcap-ng support': libcap_ng}
summary_info += {'bpf support': libbpf} summary_info += {'bpf support': libbpf}
summary_info += {'rbd support': rbd} summary_info += {'rbd support': rbd}