Untitled
project( 'wayfire', 'c', 'cpp', version: '0.10.0', license: 'MIT', meson_version: '>=0.63.0', default_options: [ 'cpp_std=c++17', 'c_std=c11', 'warning_level=2', 'werror=false', ], ) version = '"@0@"'.format(meson.project_version()) add_project_arguments('-DWAYFIRE_VERSION=@0@'.format(version), language: 'cpp') wayfire_api_inc = include_directories('src/api') # Primary Dependencies wayland_server = dependency('wayland-server') wayland_client = dependency('wayland-client') wayland_cursor = dependency('wayland-cursor') wayland_protos = dependency('wayland-protocols', version: '>=1.12') cairo = dependency('cairo') pango = dependency('pango') pangocairo = dependency('pangocairo') drm = dependency('libdrm') egl = dependency('egl') glesv2 = dependency('glesv2') glm = dependency('glm', required: false) libinput = dependency('libinput', version: '>=1.7.0') pixman = dependency('pixman-1') xkbcommon = dependency('xkbcommon') libdl = meson.get_compiler('cpp').find_library('dl') json = dependency('nlohmann_json', version: '>= 3.11.2') # Additional Dependencies dep_freerdp_server = dependency('freerdp-server2', required: false) dep_freerdp = dependency('freerdp2', required: false) dep_winpr = dependency('winpr2', required: false) dep_wayland_server = dependency('wayland-server', required: false) dep_pixman = dependency('pixman-1', required: false) if not dep_freerdp_server.found() or not dep_freerdp.found() or not dep_winpr.found() # Instead of error, just don't build the backend subdir_done() endif # Include directories for FreeRDP and WinPR winpr_includes = include_directories('/usr/include/winpr2') freerdp_includes = include_directories('/usr/include/freerdp2') # We're not to use system wlroots: So we'll use the subproject if get_option('use_system_wlroots').disabled() use_system_wlroots = false wlroots = subproject('wlroots', default_options : ['examples=false']).get_variable('wlroots') elif get_option('use_system_wlroots').enabled() use_system_wlroots = true wlroots = dependency('wlroots-0.18', version: ['>=0.18.0', '<0.19.0'], required: true) elif get_option('use_system_wlroots').auto() message( 'SEARCHING FOR WLROOTS' ) wlroots = dependency('wlroots-0.18', version: ['>=0.18.0', '<0.19.0'], required: false) use_system_wlroots = true if not wlroots.found() use_system_wlroots = false wlroots = subproject('wlroots', default_options : ['examples=false']).get_variable('wlroots') endif endif wlroots_features = { 'xwayland': false, 'drm_backend': false, 'gles2_renderer': false, 'libinput_backend': false, 'session': false, 'RDP_backend': false, } foreach name, _ : wlroots_features var_name = 'have_' + name.underscorify() wlroots_features += { name: wlroots.get_variable(pkgconfig: var_name, internal: var_name) == 'true' } endforeach required_wlroots_features = [ 'drm_backend', 'gles2_renderer', 'session', 'libinput_backend', ] missing_wlroots_features = [] # Required features based on currently exposed public api foreach required_feature : required_wlroots_features if not wlroots_features[required_feature] missing_wlroots_features += required_feature endif endforeach if missing_wlroots_features.length() > 0 error('wlroots is missing the following required features: @0@'.format(' '.join(missing_wlroots_features))) endif # We're not to use system wfconfig: So we'll use the subproject if get_option('use_system_wfconfig').disabled() use_system_wfconfig = false wfconfig = subproject('wf-config').get_variable('wfconfig') elif get_option('use_system_wfconfig').enabled() use_system_wfconfig = true wfconfig = dependency('wf-config', version: ['>=0.10.0', '<0.11.0'], required: true) elif get_option('use_system_wfconfig').auto() wfconfig = dependency('wf-config', version: ['>=0.10.0', '<0.11.0'], required: false) use_system_wfconfig = true if not wfconfig.found() use_system_wfconfig = false wfconfig = subproject('wf-config').get_variable('wfconfig') endif endif if not glm.found() and not meson.get_compiler('cpp').check_header('glm/glm.hpp') error('GLM not found, and directly using the header \'glm/glm.hpp\' is not possible.') endif backtrace = meson.get_compiler('cpp').find_library('execinfo', required: false) wfutils = subproject('wf-utils').get_variable('wfutils') wftouch = subproject('wf-touch').get_variable('wftouch') needs_libinotify = ['freebsd', 'dragonfly'].contains(host_machine.system()) libinotify = dependency('libinotify', required: needs_libinotify) jpeg = dependency('libjpeg', required: false) png = dependency('libpng', required: false) # backtrace() is in a separate library on FreeBSD and Linux with musl backtrace = meson.get_compiler('cpp').find_library('execinfo', required: false) conf_data = configuration_data() conf_data.set('INSTALL_PREFIX', get_option('prefix')) conf_data.set('PLUGIN_PATH', join_paths(get_option('prefix'), get_option('libdir'), 'wayfire')) metadata_dir_suffix = 'share/wayfire/metadata' conf_data.set('PLUGIN_XML_DIR', join_paths(get_option('prefix'), metadata_dir_suffix)) sysconfdir = join_paths(get_option('prefix'), get_option('sysconfdir')) conf_data.set('SYSCONFDIR', sysconfdir) pkgdatadir = join_paths(get_option('prefix'), 'share', 'wayfire', 'protocols') if get_option('default_config_backend') == 'default' conf_data.set('DEFAULT_CONFIG_BACKEND', join_paths(conf_data.get('PLUGIN_PATH'), 'libdefault-config-backend.so')) else conf_data.set('DEFAULT_CONFIG_BACKEND', get_option('default_config_backend')) endif cpp = meson.get_compiler('cpp') # needed to dlopen() plugins # -E is for RTTI/dynamic_cast across plugins add_project_link_arguments(['-rdynamic', '-Wl,-E'], language: 'cpp') project_args = ['-DWLR_USE_UNSTABLE'] # Needed for dlclose to actually free plugin memory on gcc+glibc if cpp.has_argument('-fno-gnu-unique') project_args += '-fno-gnu-unique' endif add_project_arguments(project_args, language: ['cpp', 'c']) # Needed on some older compilers if cpp.has_link_argument('-lc++fs') add_project_link_arguments(['-lc++fs'], language: 'cpp') elif cpp.has_link_argument('-lc++experimental') add_project_link_arguments(['-lc++experimental'], language: 'cpp') elif cpp.has_link_argument('-lstdc++fs') add_project_link_arguments(['-lstdc++fs'], language: 'cpp') endif if get_option('enable_gles32') cpp.check_header('GLES3/gl32.h', dependencies: glesv2, required: true) conf_data.set('USE_GLES32', true) else conf_data.set('USE_GLES32', false) endif if png.found() and jpeg.found() conf_data.set('BUILD_WITH_IMAGEIO', true) else conf_data.set('BUILD_WITH_IMAGEIO', false) endif wayfire_conf_inc = include_directories(['.']) add_project_arguments(['-Wno-unused-parameter'], language: 'cpp') if get_option('xwayland').enabled() and not wlroots_features['xwayland'] error('Cannot enable Xwayland in wayfire: wlroots has been built without Xwayland support') endif if get_option('xwayland').enabled() or (get_option('xwayland').auto() and wlroots_features['xwayland']) xcb = dependency('xcb') conf_data.set('WF_HAS_XWAYLAND', 1) else xcb = declare_dependency() # dummy dep conf_data.set('WF_HAS_XWAYLAND', 0) endif if get_option('print_trace') print_trace = true else print_trace = false endif add_project_arguments(['-DWF_USE_CONFIG_H'], language: ['cpp', 'c']) configure_file(input: 'config.h.in', output: 'config.h', install: true, install_dir: join_paths('include', 'wayfire'), configuration: conf_data) subdir('proto') subdir('src') subdir('man') subdir('metadata') subdir('plugins') # Unit tests doctest = dependency('doctest', required: get_option('tests')) if doctest.found() subdir('test') endif install_data('wayfire.desktop', install_dir : join_paths(get_option('prefix'), 'share/wayland-sessions')) summary = [ '', '----------------', 'wayfire @0@'.format(meson.project_version()), '', 'system wfconfig: @0@'.format(use_system_wfconfig), ' system wlroots: @0@'.format(use_system_wlroots), ' xwayland: @0@'.format(wlroots_features['xwayland']), ' RDP-backend: @0@'.format(wlroots_features['RDP_backend']), ' imageio: @0@'.format(conf_data.get('BUILD_WITH_IMAGEIO')), ' gles32: @0@'.format(conf_data.get('USE_GLES32')), ' print trace: @0@'.format(print_trace), ' unit tests: @0@'.format(doctest.found()), '----------------', '' ] message('\n'.join(summary))
Leave a Comment