Untitled

 avatar
unknown
plain_text
a month ago
8.7 kB
3
Indexable
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