project('cthulhu', version: '2025.08.11', meson_version: '>= 1.0.0', ) python = import('python') gnome = import('gnome') i18n = import('i18n') python_minimum_version = '3.3' python3 = python.find_installation('python3', required: true) if not python3.language_version().version_compare(f'>= @python_minimum_version@') error(f'Python @python_minimum_version@ or newer is required.') endif # Hard dependencies (checked via pkg-config) dependency('atspi-2', version: '>= 2.48.0') dependency('atk-bridge-2.0', version: '>= 2.26.0') dependency('pygobject-3.0', version: '>= 3.18') # Hard Python module dependencies gi_result = python.find_installation('python3', modules:['gi'], required: false) if not gi_result.found() error('gi (PyGObject) is required') endif json_result = python.find_installation('python3', modules:['json'], required: false) if not json_result.found() error('json module is required') endif # End users might not have the Gtk development libraries installed, making pkg-config fail. # Therefore, check this dependency via python. gtk_major_version = '3' gtk_minor_version = '0' gtk_command = ' '.join([ 'import gi; gi.require_version("Gtk", "3.0"); from gi.repository import Gtk;', 'print(f"{Gtk.get_major_version()}.{Gtk.get_minor_version()}.{Gtk.get_micro_version()}");', f'failed = Gtk.get_major_version() != @gtk_major_version@;', 'exit(failed)' ]) gtk_test = run_command(python3, '-c', gtk_command, check: false) description = f'GTK @gtk_major_version@.@gtk_minor_version@' version = gtk_test.stdout().strip() if gtk_test.returncode() != 0 error(f'@description@ failed (found @version@)') endif # Optional python modules with their descriptions optional_modules = { 'brlapi': 'braille output', 'louis': 'contracted braille', 'speechd': 'speech output', 'pluggy': 'plugin system', 'dasbus': 'D-Bus remote controller', 'psutil': 'system information commands', 'gi.repository.Wnck': 'mouse review', } summary = {} foreach module, description : optional_modules result = python.find_installation('python3', modules:[module], required: false) if result.found() summary += {description: f'yes (found @module@)'} else summary += {description: f'no (missing @module@)'} endif endforeach # Optional synthesizer services speech_output = [] if python.find_installation('python3', modules:['speechd'], required: false).found() speech_output += ['speechd'] endif if speech_output.length() > 0 summary += {'speech output': 'yes (found @0@)'.format(', '.join(speech_output))} else summary += {'speech output': 'no (missing speechd)'} endif # Check for GStreamer gstreamer_dep = dependency('gstreamer-1.0', required: false) if gstreamer_dep.found() summary += {'sound support': 'yes (found gstreamer)'} else summary += {'sound support': 'no (missing gstreamer)'} endif # Check for libpeas libpeas_dep = dependency('libpeas-1.0', required: false) if libpeas_dep.found() summary += {'plugin loading': 'yes (found libpeas)'} else summary += {'plugin loading': 'no (missing libpeas)'} endif # Integration with session startup i18n.merge_file( input: 'cthulhu-autostart.desktop.in', output: '@BASENAME@', type: 'desktop', po_dir: meson.project_source_root() / 'po', install: true, install_dir: get_option('sysconfdir') / 'xdg' / 'autostart', ) gnome.post_install( gtk_update_icon_cache: true, ) summary += {'Install dir': python.find_installation('python3').get_install_dir()} subdir('docs') if get_option('help') subdir('help') endif subdir('icons') subdir('po') subdir('src') summary(summary)