Commit f180fc7c authored by Iñigo Martínez's avatar Iñigo Martínez Committed by Bastien Nocera

build: Port to meson build system

meson is a build system focused on speed an ease of use, which
helps speeding up the software development. This patch adds meson
support along autotools.

https://bugzilla.gnome.org/show_bug.cgi?id=793087
parent 8351ff4d
data_inc = include_directories('.')
schemas = [
'org.gnome.settings-daemon.peripherals.gschema.xml',
'org.gnome.settings-daemon.peripherals.wacom.gschema.xml',
'org.gnome.settings-daemon.plugins.gschema.xml',
'org.gnome.settings-daemon.plugins.color.gschema.xml',
'org.gnome.settings-daemon.plugins.housekeeping.gschema.xml',
'org.gnome.settings-daemon.plugins.media-keys.gschema.xml',
'org.gnome.settings-daemon.plugins.power.gschema.xml',
'org.gnome.settings-daemon.plugins.sharing.gschema.xml',
'org.gnome.settings-daemon.plugins.xsettings.gschema.xml'
]
schema_conf = configuration_data()
schema_conf.set('GETTEXT_PACKAGE', meson.project_name())
foreach schema: schemas
schema_in = configure_file(
input: schema + '.in.in',
output: schema + '.in',
configuration: schema_conf
)
custom_target(
schema,
input: schema_in,
output: schema,
command: [intltool_merge, '-x', '-u', '--no-translations', '@INPUT@', '@OUTPUT@'],
install: true,
install_dir: gsd_schemadir
)
endforeach
enums_header = files('gsd-enums.h')
gnome.mkenums(
'org.gnome.settings-daemon.enums.xml',
sources: enums_header,
comments: '<!-- @comment@ -->',
fhead: '<schemalist>',
vhead: ' <@type@ id="org.gnome.settings-daemon.@EnumName@">',
vprod: ' <value nick="@valuenick@" value="@valuenum@"/>',
vtail: ' </@type@>',
ftail: '</schemalist>',
install_header: true,
install_dir: gsd_schemadir
)
install_data(
enums_header,
install_dir: join_paths(gsd_pkgincludedir, meson.project_name())
)
install_data(
'gnome-settings-daemon.convert',
install_dir: join_paths(gsd_datadir, 'GConf', 'gsettings')
)
pkg.generate(
version: gsd_version,
name: meson.project_name(),
description: meson.project_name() + ' specific enumerations',
filebase: meson.project_name(),
subdirs: gsd_api_name
)
sources = files(
'gnome-settings-bus.c',
'gnome-settings-profile.c'
)
dbus_ifaces = [
['SessionManager', 'gsd-session-manager-glue'],
['ScreenSaver', 'gsd-screen-saver-glue'],
['Shell', 'gsd-shell-glue']
]
foreach iface: dbus_ifaces
name = 'org.gnome.' + iface[0]
sources += gnome.gdbus_codegen(
iface[1],
name + '.xml',
interface_prefix: name + '.',
namespace: 'Gsd',
annotations: [name, 'org.gtk.GDBus.C.Name', iface[0]]
)
endforeach
deps = [gio_unix_dep]
if enable_wayland
deps += wayland_client_dep
endif
libgsd = shared_library(
'gsd',
sources: sources,
include_directories: top_inc,
dependencies: deps,
install: true,
install_dir: gsd_pkglibdir
)
libgsd_dep = declare_dependency(
include_directories: include_directories('.'),
link_with: libgsd
)
project(
'gnome-settings-daemon', 'c',
version: '3.27.3',
license: [ 'GPL2+', 'LGPLv2+' ],
meson_version: '>= 0.44.0'
)
gsd_version = meson.project_version()
version_array = gsd_version.split('.')
gsd_major_version = version_array[0].to_int()
gsd_api_version_minor = 0
gsd_api_version = '@0@.@1@'.format(gsd_major_version, gsd_api_version_minor)
gsd_api_name = '@0@-@1@'.format(meson.project_name(), gsd_api_version)
gsd_prefix = get_option('prefix')
gsd_bindir = join_paths(gsd_prefix, get_option('bindir'))
gsd_datadir = join_paths(gsd_prefix, get_option('datadir'))
gsd_includedir = join_paths(gsd_prefix, get_option('includedir'))
gsd_libdir = join_paths(gsd_prefix, get_option('libdir'))
gsd_libexecdir = join_paths(gsd_prefix, get_option('libexecdir'))
gsd_localedir = join_paths(gsd_prefix, get_option('localedir'))
gsd_sysconfdir = join_paths(gsd_prefix, get_option('sysconfdir'))
gsd_pkgdatadir = join_paths(gsd_datadir, meson.project_name())
gsd_pkgincludedir = join_paths(gsd_includedir, gsd_api_name)
gsd_pkglibdir = join_paths(gsd_libdir, gsd_api_name)
gsd_schemadir = join_paths(gsd_datadir, 'glib-2.0', 'schemas')
gsd_xdg_autostart = join_paths(gsd_sysconfdir, 'xdg', 'autostart')
host_is_darwin = host_machine.system().contains('darwin')
host_is_linux = host_machine.system().contains('linux')
host_is_linux_not_s390 = host_is_linux and not host_machine.cpu().contains('s390')
cc = meson.get_compiler('c')
config_h = configuration_data()
# defines
set_defines = [
['PACKAGE_NAME', meson.project_name()],
['PACKAGE_VERSION', gsd_version],
# i18n
['GETTEXT_PACKAGE', meson.project_name()]
]
foreach define: set_defines
config_h.set_quoted(define[0], define[1])
endforeach
# compiler flags
common_flags = ['-DHAVE_CONFIG_H']
if get_option('buildtype').contains('debug')
common_flags += ['-DG_ENABLE_DEBUG']
test_cflags = [
'-Wcast-align',
'-Wmissing-declarations',
'-Wmissing-prototypes',
'-Wnested-externs',
'-Wno-strict-aliasing',
'-Wno-sign-compare',
'-Wpointer-arith'
]
compiler_flags = cc.get_supported_arguments(test_cflags)
else
common_flags += ['-DG_DISABLE_CHECKS']
endif
# Workaround for meson's bug
# https://github.com/mesonbuild/meson/pull/1896
if get_option('b_ndebug') == false
common_flags += ['-DG_DISABLE_ASSERT']
endif
add_project_arguments(common_flags + compiler_flags, language: 'c')
colord_dep = dependency('colord', version: '>= 1.0.2')
geocode_glib_dep = dependency('geocode-glib-1.0', version: '>= 3.10.0')
gio_dep = dependency('gio-2.0', version: '>= 2.53.0')
gio_unix_dep = dependency('gio-unix-2.0')
gnome_desktop_dep = dependency('gnome-desktop-3.0', version: '>= 3.11.1')
gsettings_desktop_dep = dependency('gsettings-desktop-schemas', version: '>= 3.23.3')
gtk_dep = dependency('gtk+-3.0', version: '>= 3.15.3')
gtk_x11_dep = dependency('gtk+-x11-3.0')
gweather_dep = dependency('gweather-3.0', version: '>= 3.9.5')
lcms_dep = dependency('lcms2', version: '>= 2.2')
libcanberra_gtk_dep = dependency('libcanberra-gtk3')
libgeoclue_dep = dependency('libgeoclue-2.0', version: '>= 2.3.1')
libnotify_dep = dependency('libnotify', version: '>= 0.7.3')
libpulse_mainloop_glib_dep = dependency('libpulse-mainloop-glib', version: '>= 2.0')
pango_dep = dependency('pango', version: '>= 1.20.0')
polkit_gobject_dep = dependency('polkit-gobject-1', version: '>= 0.103')
upower_glib_dep = dependency('upower-glib', version: '>= 0.99.0')
x11_dep = dependency('x11')
xtst_dep = dependency('xtst')
m_dep = cc.find_library('m')
# ALSA integration (default enabled)
enable_alsa = get_option('alsa')
assert(enable_alsa or not host_is_linux, 'ALSA is not optional on Linux platforms')
libgvc = subproject(
'gvc',
default_options: [
'static=true',
'alsa=' + enable_alsa.to_string()
]
)
libgvc_dep = libgvc.get_variable('libgvc_dep')
# GUdev integration (default enabled)
enable_gudev = get_option('gudev')
if enable_gudev
assert(enable_gudev, 'GUdev is not optional on Linux platforms')
gudev_dep = dependency('gudev-1.0')
endif
config_h.set('HAVE_GUDEV', enable_gudev)
# Check for libwayland-client
enable_wayland = get_option('wayland')
if enable_wayland
assert(enable_gudev, 'GUDev support is required for wayland support.')
wayland_client_dep = dependency('wayland-client')
endif
config_h.set10('HAVE_WAYLAND', enable_wayland)
# wacom (disabled for s390/s390x and non Linux platforms)
enable_wacom = host_is_linux_not_s390
if enable_wacom
assert(enable_gudev, 'GUDev support is required for wacom support.')
libwacom_dep = dependency('libwacom', version: '>= 0.7')
endif
config_h.set10('HAVE_WACOM', enable_wacom)
# smartcard section
enable_smartcard = get_option('smartcard')
if enable_smartcard
nss_dep = dependency('nss', version: '>= 3.11.2')
system_nssdb_dir = get_option('nssdb_dir')
if system_nssdb_dir == ''
system_nssdb_dir = join_paths(gsd_sysconfdir, 'pki', 'nssdb')
endif
endif
# CUPS
enable_cups = get_option('cups')
if enable_cups
cups_dep = dependency('cups', version : '>= 1.4', required: false)
assert(cups_dep.found(), 'CUPS 1.4 or newer not found')
# FIXME: 1.6 cflags generate a lot of errors
'''
cups_cflags = []
if cups_dep.version().version_compare('>= 1.6')
cups_cflags += '-D_PPD_DEPRECATED=""'
endif
cups_dep = declare_dependency(
dependencies: cups_dep,
compile_args: cups_cflags
)
'''
endif
# Rfkill
enable_rfkill = get_option('rfkill')
assert(enable_rfkill or not host_is_linux, 'rfkill is not optional on Linux platforms')
if enable_rfkill
assert(cc.has_header('linux/rfkill.h'), 'rfkill support requested but RFKill headers not found')
udev_dir = get_option('udev_dir')
if udev_dir == ''
udev_dir = dependency('udev').get_pkgconfig_variable('udevdir')
endif
endif
# Sharing plugin
enable_network_manager = get_option('network_manager')
assert(enable_network_manager or not host_is_linux, 'NetworkManager support is not optional on Linux platforms')
if enable_network_manager
# network manager
libnm_dep = dependency('libnm', version: '>= 1.0')
endif
config_h.set('HAVE_NETWORK_MANAGER', enable_network_manager)
gnome = import('gnome')
i18n = import('i18n')
pkg = import('pkgconfig')
po_dir = join_paths(meson.source_root(), 'po')
intltool_merge = find_program('intltool-merge')
intltool_cache = join_paths(po_dir, '.intltool-merge-cache')
intltool_desktop_cmd = [intltool_merge, '-d', '-u', '-c', intltool_cache, po_dir, '@INPUT@', '@OUTPUT@']
intltool_xml_cmd = [intltool_merge, '-x', '-u', '-c', intltool_cache, po_dir, '@INPUT@', '@OUTPUT@']
top_inc = include_directories('.')
subdir('tests')
subdir('gnome-settings-daemon')
subdir('data')
subdir('plugins')
subdir('po')
configure_file(
output: 'config.h',
configuration: config_h
)
meson.add_install_script(
'meson_post_install.py',
gsd_datadir
)
output = '\n ' + meson.project_name() + ' ' + meson.project_version() +'\n'
output += ' =============================\n\n'
output += ' prefix: ' + gsd_prefix + '\n'
output += ' exec_prefix: ' + gsd_prefix + '\n'
output += ' libdir: ' + gsd_libdir + '\n'
output += ' libexecdir: ' + gsd_libexecdir + '\n'
output += ' bindir: ' + gsd_bindir + '\n'
output += ' sysconfdir: ' + gsd_sysconfdir + '\n'
output += ' datadir: ' + gsd_datadir + '\n\n'
output += ' source code location: ' + meson.source_root() + '\n'
output += ' compiler: ' + cc.get_id() + '\n'
output += ' cflags: ' + ' '.join(compiler_flags) + '\n\n'
output += ' ALSA support: ' + enable_alsa.to_string() + '\n'
output += ' NetworkManager support: ' + enable_network_manager.to_string() + '\n'
output += ' Smartcard support: ' + enable_smartcard.to_string() + '\n'
output += ' Cups support: ' + enable_cups.to_string() + '\n'
output += ' Wayland support: ' + enable_wayland.to_string() + '\n'
output += ' Wacom support: ' + enable_wacom.to_string() + '\n'
output += ' RFKill support: ' + enable_rfkill.to_string() + '\n'
if enable_smartcard
output += ' System nssdb: ' + system_nssdb_dir + '\n'
endif
if enable_rfkill
output += ' udev dir: ' + udev_dir + '\n'
endif
message(output)
option('nssdb_dir', type: 'string', value: '', description: 'Absolute path to the system NSS database directory')
option('udev_dir', type: 'string', value: '', description: 'Absolute path of the udev base directory')
option('alsa', type: 'boolean', value: true, description: 'build with ALSA support (not optional on Linux platforms)')
option('gudev', type: 'boolean', value: true, description: 'build with gudev device support (not optional on Linux platforms)')
option('cups', type: 'boolean', value: true, description: 'build with CUPS support')
option('network_manager', type: 'boolean', value: true, description: 'build with NetworkManager support (not optional on Linux platforms)')
option('rfkill', type: 'boolean', value: true, description: 'build with rfkill support (not optional on Linux platforms)')
option('smartcard', type: 'boolean', value: true, description: 'build with smartcard support')
option('wayland', type: 'boolean', value: true, description: 'build with Wayland support')
#!/usr/bin/env python3
import os
import subprocess
import sys
if not os.environ.get('DESTDIR'):
schemadir = os.path.join(sys.argv[1], 'glib-2.0', 'schemas')
print('Compiling gsettings schemas...')
subprocess.call(['glib-compile-schemas', schemadir])
desktop = 'org.gnome.SettingsDaemon.A11ySettings.desktop'
configure_file(
input: desktop + '.in',
output: desktop,
configuration: plugins_conf,
install: true,
install_dir: gsd_xdg_autostart
)
sources = files(
'gsd-a11y-settings-manager.c',
'main.c'
)
deps = plugins_deps + [
gio_dep,
gsettings_desktop_dep
]
executable(
'gsd-' + plugin_name,
sources,
include_directories: [top_inc, common_inc],
dependencies: deps,
c_args: cflags,
install: true,
install_dir: gsd_libexecdir
)
desktop = 'org.gnome.SettingsDaemon.Clipboard.desktop'
configure_file(
input: desktop + '.in',
output: desktop,
configuration: plugins_conf,
install: true,
install_dir: gsd_xdg_autostart
)
sources = files(
'gsd-clipboard-manager.c',
'list.c',
'main.c',
'xutils.c'
)
deps = plugins_deps + [
gtk_x11_dep,
x11_dep
]
executable(
'gsd-' + plugin_name,
sources,
include_directories: [top_inc, common_inc],
dependencies: deps,
c_args: cflags,
install: true,
install_dir: gsd_libexecdir
)
desktop = 'org.gnome.SettingsDaemon.Color.desktop'
configure_file(
input: desktop + '.in',
output: desktop,
configuration: plugins_conf,
install: true,
install_dir: gsd_xdg_autostart
)
sources = files(
'gcm-edid.c',
'gnome-datetime-source.c',
'gsd-color-calibrate.c',
'gsd-color-manager.c',
'gsd-color-profiles.c',
'gsd-color-state.c',
'gsd-night-light.c',
'gsd-night-light-common.c',
'main.c'
)
deps = plugins_deps + [
colord_dep,
gnome_desktop_dep,
lcms_dep,
libcanberra_gtk_dep,
libgeoclue_dep,
libnotify_dep,
m_dep,
]
cflags += ['-DBINDIR="@0@"'.format(gsd_bindir)]
executable(
'gsd-' + plugin_name,
sources,
include_directories: [top_inc, common_inc],
dependencies: deps,
c_args: cflags,
install: true,
install_dir: gsd_libexecdir
)
sources = files(
'gcm-edid.c',
'gcm-self-test.c',
'gnome-datetime-source.c',
'gsd-night-light.c',
'gsd-night-light-common.c'
)
test_unit = 'gcm-self-test'
exe = executable(
test_unit,
sources,
include_directories: top_inc,
dependencies: deps,
c_args: '-DTESTDATADIR="@0@"'.format(join_paths(meson.current_source_dir(), 'test-data'))
)
test(test_unit, exe)
common_inc = include_directories('.')
sources = files(
'gsd-device-manager.c',
'gsd-device-manager-x11.c',
'gsd-device-mapper.c',
'gsd-input-helper.c',
'gsd-settings-migrate.c',
'gsd-shell-helper.c'
)
enums_header = 'gsd-device-manager.h'
enums = 'gsd-common-enums'
sources += gnome.mkenums(
enums + '.h',
sources: enums_header,
fhead: '#ifndef GSD_COMMON_ENUMS_H\n#define GSD_COMMON_ENUMS_H\n\n#include <glib-object.h>\n\nG_BEGIN_DECLS\n',
fprod: '/* enumerations from "@filename@" */\n',
vhead: 'GType @enum_name@_get_type (void) G_GNUC_CONST;\n#define GSD_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n',
ftail: 'G_END_DECLS\n\n#endif /* !GSD_COMMON_ENUMS_H */'
)
sources += gnome.mkenums(
enums + '.c',
sources: enums_header,
fhead: '#include "gsd-device-manager.h"\n#include "gsd-common-enums.h"\n',
fprod: '\n/* enumerations from "@filename@" */',
vhead: 'GType\n@enum_name@_get_type (void)\n{\n static GType etype = 0;\n if (etype == 0) {\n static const G@Type@Value values[] = {',
vprod: ' { @VALUENAME@, "@VALUENAME@", "@valuenick@" },',
vtail: ' { 0, NULL, NULL }\n };\n etype = g_@type@_register_static ("@EnumName@", values);\n }\n return etype;\n}\n'
)
resource_data = files('gtk.css')
sources += gnome.compile_resources(
'gsd-resources',
'gsd.gresources.xml',
c_name: 'gsd',
dependencies: resource_data
)
deps = plugins_deps + [
gnome_desktop_dep,
gtk_x11_dep,
x11_dep,
dependency('kbproto'),
dependency('xi')
]
ldflags = []
if host_is_darwin
ldflags += ['-Wl,-bundle_loader,@0@'.format(join_paths(), meson.build_root(), meson.project_name(), meson.project_name())]
endif
if enable_gudev
sources += files('gsd-device-manager-udev.c')
deps += gudev_dep
endif
if enable_wacom
deps += libwacom_dep
endif
libcommon = shared_module(
plugin_name,
sources: sources,
include_directories: [top_inc, data_inc],
dependencies: deps,
c_args: cflags,
link_args: ldflags
)
libcommon_dep = declare_dependency(
include_directories: common_inc,
link_with: libcommon
)
executable(
'gsd-test-input-helper',
'test-input-helper.c',
include_directories: top_inc,
dependencies: gtk_dep,
link_with: libcommon,
install: true,
install_dir: gsd_libexecdir
)
desktop = 'org.gnome.SettingsDaemon.Datetime.desktop'
configure_file(
input: desktop + '.in',
output: desktop,
configuration: plugins_conf,
install: true,
install_dir: gsd_xdg_autostart
)
install_data(
'backward',
install_dir: join_paths(gsd_pkgdatadir, 'datetime')
)
sources = files(
'gsd-datetime-manager.c',
'gsd-timezone-monitor.c',
'main.c',
'tz.c',
'weather-tz.c'
)
sources += gnome.gdbus_codegen(
'timedated',
'timedated1-interface.xml',
interface_prefix: 'org.freedesktop.'
)
deps = plugins_deps + [
geocode_glib_dep,
gweather_dep,
libgeoclue_dep,
libnotify_dep,
m_dep,
polkit_gobject_dep
]
cflags += ['-DGNOMECC_DATA_DIR="@0@"'.format(gsd_pkgdatadir)]
executable(
'gsd-' + plugin_name,
sources,
include_directories: [top_inc, common_inc],
dependencies: deps,
c_args: cflags,
install: true,
install_dir: gsd_libexecdir
)
desktops = []
if not enable_smartcard
desktops += ['org.gnome.SettingsDaemon.Smartcard']
endif
if not enable_cups
desktops += ['org.gnome.SettingsDaemon.PrintNotifications']
endif
if not enable_rfkill
desktops += ['org.gnome.SettingsDaemon.Rfkill']
endif
if not enable_wacom
desktops += ['org.gnome.SettingsDaemon.Wacom']
endif
foreach desktop: desktops
dummy_conf = configuration_data()
dummy_conf.set('libexecdir', gsd_libexecdir)
dummy_conf.set('pluginname', desktop)
configure_file(
input: 'org.gnome.SettingsDaemon.Dummy.desktop.in',