summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am18
-rwxr-xr-xbuild-aux/find-x-server.sh34
-rw-r--r--build-aux/meson_post_install.py11
-rw-r--r--chooser/meson.build50
-rw-r--r--common/meson.build43
-rw-r--r--daemon/meson.build206
-rw-r--r--data/Makefile.am8
-rw-r--r--data/applications/meson.build16
-rw-r--r--data/autostart/meson.build12
-rw-r--r--data/dconf/meson.build25
-rw-r--r--data/gdm.service.in14
-rw-r--r--data/meson.build172
-rw-r--r--docs/LINGUAS22
-rw-r--r--docs/Makefile.am2
-rw-r--r--docs/meson.build6
-rw-r--r--libgdm/libgdm.map6
-rw-r--r--libgdm/meson.build104
-rw-r--r--meson.build263
-rw-r--r--meson_options.txt39
-rw-r--r--pam-extensions/meson.build14
-rw-r--r--pam_gdm/meson.build16
-rw-r--r--po/meson.build3
-rw-r--r--tests/meson.build17
-rw-r--r--utils/meson.build41
24 files changed, 1129 insertions, 13 deletions
diff --git a/Makefile.am b/Makefile.am
index 7896f59d..adba1e80 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -25,6 +25,24 @@ ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
EXTRA_DIST = \
MAINTAINERS \
README.md \
+ meson.build \
+ meson_options.txt \
+ chooser/meson.build \
+ common/meson.build \
+ daemon/meson.build \
+ data/applications/meson.build \
+ data/autostart/meson.build \
+ data/dconf/meson.build \
+ data/meson.build \
+ docs/meson.build \
+ libgdm/meson.build \
+ pam-extensions/meson.build \
+ pam_gdm/meson.build \
+ po/meson.build \
+ tests/meson.build \
+ utils/meson.build \
+ build-aux/find-x-server.sh \
+ build-aux/meson_post_install.py \
$(NULL)
DISTCLEANFILES = \
diff --git a/build-aux/find-x-server.sh b/build-aux/find-x-server.sh
new file mode 100755
index 00000000..b5a80750
--- /dev/null
+++ b/build-aux/find-x-server.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+#
+# First check with "! -h" for /usr/X11R6 and /usr/X11 since they often
+# symlink to each other, and configure should use the more stable
+# location (the real directory) if possible.
+#
+# On Solaris, the /usr/bin/Xserver script is used to decide whether to
+# use Xsun or Xorg, so this is used on Solaris.
+#
+# When testing for /usr/X11R6, first check with "! -h" for /usr/X11R6
+# and /usr/X11 since they often symlink to each other, and configure
+# should use the more stable location (the real directory) if possible.
+#
+if test -x /usr/bin/X; then
+ echo "/usr/bin/X"
+elif test -x /usr/X11/bin/Xserver; then
+ echo "/usr/X11/bin/Xserver"
+elif test ! -h /usr/X11R6 -a -x /usr/X11R6/bin/X; then
+ echo "/usr/X11R6/bin/X"
+elif test ! -h /usr/X11 -a -x /usr/X11/bin/X; then
+ echo "/usr/X11/bin/X"
+elif test -x /usr/X11R6/bin/X; then
+ echo "/usr/X11R6/bin/X"
+elif test -x /usr/bin/Xorg; then
+ echo "/usr/bin/Xorg"
+elif test -x /usr/X11/bin/X; then
+ echo "/usr/X11/bin/X"
+elif test -x /usr/openwin/bin/Xsun; then
+ echo "/usr/openwin/bin/Xsun"
+elif test -x /opt/X11R6/bin/X; then
+ echo "/opt/X11R6/bin/X"
+else
+ echo ""
+fi
diff --git a/build-aux/meson_post_install.py b/build-aux/meson_post_install.py
new file mode 100644
index 00000000..4debe816
--- /dev/null
+++ b/build-aux/meson_post_install.py
@@ -0,0 +1,11 @@
+#!/usr/bin/env python3
+
+import os
+import subprocess
+
+install_prefix = os.environ['MESON_INSTALL_PREFIX']
+schemadir = os.path.join(install_prefix, 'share', 'glib-2.0', 'schemas')
+
+if not os.environ.get('DESTDIR'):
+ print('Compiling gsettings schemas...')
+ subprocess.call(['glib-compile-schemas', schemadir])
diff --git a/chooser/meson.build b/chooser/meson.build
new file mode 100644
index 00000000..f3b948d7
--- /dev/null
+++ b/chooser/meson.build
@@ -0,0 +1,50 @@
+# Simple chooser
+gdm_simple_chooser_src = [
+ 'chooser-main.c',
+ 'gdm-chooser-host.c',
+ 'gdm-chooser-session.c',
+ 'gdm-host-chooser-dialog.c',
+ 'gdm-host-chooser-widget.c',
+]
+
+gdm_simple_chooser_deps = [
+ glib_dep,
+ gtk_dep,
+ libgdmcommon_dep,
+ libgdm_dep,
+ x_deps,
+ xdmcp_dep,
+]
+
+gdm_simple_chooser = executable('gdm-simple-chooser',
+ gdm_simple_chooser_src,
+ dependencies: gdm_simple_chooser_deps,
+ include_directories: config_h_dir,
+ install: true,
+ install_dir: get_option('libexecdir'),
+)
+
+# Host chooser
+gdm_host_chooser_src = [
+ 'gdm-host-chooser.c',
+ 'gdm-chooser-host.c',
+ 'gdm-host-chooser-dialog.c',
+ 'gdm-host-chooser-widget.c',
+]
+
+gdm_host_chooser_deps = [
+ glib_dep,
+ gtk_dep,
+ libgdmcommon_dep,
+ libgdm_dep,
+ x_deps,
+ xdmcp_dep,
+]
+
+gdm_host_chooser = executable('gdm-host-chooser',
+ gdm_host_chooser_src,
+ dependencies: gdm_host_chooser_deps,
+ include_directories: config_h_dir,
+ install: true,
+ install_dir: get_option('libexecdir'),
+)
diff --git a/common/meson.build b/common/meson.build
new file mode 100644
index 00000000..074dd92e
--- /dev/null
+++ b/common/meson.build
@@ -0,0 +1,43 @@
+libgdmcommon_src = files(
+ 'gdm-address.c',
+ 'gdm-common.c',
+ 'gdm-log.c',
+ 'gdm-profile.c',
+ 'gdm-settings-backend.c',
+ 'gdm-settings-desktop-backend.c',
+ 'gdm-settings-direct.c',
+ 'gdm-settings-utils.c',
+ 'gdm-settings.c',
+)
+
+libgdmcommon_deps = [
+ libsystemd_dep,
+ gobject_dep,
+ gio_dep,
+ gio_unix_dep,
+]
+
+if libselinux_dep.found()
+ libgdmcommon_deps += libselinux_dep
+endif
+
+libgdmcommon_lib = static_library('gdmcommon',
+ libgdmcommon_src,
+ dependencies: libgdmcommon_deps,
+ include_directories: config_h_dir,
+)
+
+libgdmcommon_dep = declare_dependency(
+ link_with: libgdmcommon_lib,
+ dependencies: libgdmcommon_deps,
+ include_directories: include_directories('.'),
+)
+
+install_data('gdb-cmd')
+
+# test-log exectuable
+test_log = executable('test-log',
+ 'test-log.c',
+ dependencies: libgdmcommon_dep,
+ include_directories: config_h_dir,
+)
diff --git a/daemon/meson.build b/daemon/meson.build
new file mode 100644
index 00000000..72c7c3c1
--- /dev/null
+++ b/daemon/meson.build
@@ -0,0 +1,206 @@
+# D-Bus interfaces
+display_dbus_gen = gnome.gdbus_codegen('gdm-display-glue',
+ 'gdm-display.xml',
+ namespace: 'GdmDBus',
+ interface_prefix: 'org.gnome.DisplayManager',
+ autocleanup: 'all',
+)
+local_display_dbus_gen = gnome.gdbus_codegen('gdm-local-display-glue',
+ 'gdm-local-display.xml',
+ namespace: 'GdmDBus',
+ interface_prefix: 'org.gnome.DisplayManager',
+ autocleanup: 'all',
+)
+local_display_factory_dbus_gen = gnome.gdbus_codegen('gdm-local-display-factory-glue',
+ 'gdm-local-display-factory.xml',
+ namespace: 'GdmDBus',
+ interface_prefix: 'org.gnome.DisplayManager',
+ autocleanup: 'all',
+)
+manager_dbus_gen = gnome.gdbus_codegen('gdm-manager-glue',
+ 'gdm-manager.xml',
+ namespace: 'GdmDBus',
+ interface_prefix: 'org.gnome.DisplayManager',
+ autocleanup: 'all',
+)
+session_dbus_gen = gnome.gdbus_codegen('gdm-session-glue',
+ 'gdm-session.xml',
+ namespace: 'GdmDBus',
+ interface_prefix: 'org.gnome.DisplayManager',
+ autocleanup: 'all',
+)
+session_worker_dbus_gen = gnome.gdbus_codegen('gdm-session-worker-glue',
+ 'gdm-session-worker.xml',
+ namespace: 'GdmDBus',
+ interface_prefix: 'org.gnome.DisplayManager',
+ autocleanup: 'all',
+)
+
+gdm_session_enums = gnome.mkenums('gdm-session-enum-types',
+ h_template: 'gdm-session-enum-types.h.in',
+ c_template: 'gdm-session-enum-types.c.in',
+ sources: 'gdm-session.h',
+)
+gdm_session_worker_enums = gnome.mkenums('gdm-session-worker-enum-types',
+ h_template: 'gdm-session-worker-enum-types.h.in',
+ c_template: 'gdm-session-worker-enum-types.c.in',
+ sources: 'gdm-session-worker.h',
+)
+
+# Daemons deps
+gdm_daemon_deps = [
+ libgdmcommon_dep,
+ accountsservice_dep,
+ gobject_dep,
+ gio_dep,
+ gio_unix_dep,
+ libpam_dep,
+ x_deps,
+ xcb_dep,
+]
+
+if xdmcp_dep.found() and get_option('tcp-wrappers')
+ gdm_daemon_deps += libwrap_dep
+endif
+
+# test-session-client
+test_session_client_src = [
+ 'test-session-client.c',
+ session_dbus_gen,
+ manager_dbus_gen,
+]
+
+test_session_client = executable('test-session-client',
+ test_session_client_src,
+ dependencies: gdm_daemon_deps,
+ include_directories: config_h_dir,
+)
+
+# Session worker
+gdm_session_worker_src = [
+ 'session-worker-main.c',
+ 'gdm-session.c',
+ 'gdm-session-settings.c',
+ 'gdm-session-auditor.c',
+ 'gdm-session-record.c',
+ 'gdm-session-worker.c',
+ 'gdm-session-worker-job.c',
+ 'gdm-session-worker-common.c',
+ 'gdm-dbus-util.c',
+ session_dbus_gen,
+ session_worker_dbus_gen,
+ gdm_session_enums,
+ gdm_session_worker_enums,
+]
+
+gdm_session_worker_deps = [
+ gdm_daemon_deps,
+]
+
+gdm_session_worker_includes = [
+ config_h_dir,
+]
+
+if pam_extensions_supported
+ gdm_session_worker_src += '../pam-extensions/gdm-pam-extensions.h'
+ gdm_session_worker_includes += pam_extensions_inc
+endif
+
+if libaudit_dep.found()
+ gdm_session_worker_deps += libaudit_dep
+
+ gdm_session_worker_src += [
+ 'gdm-session-linux-auditor.c',
+ ]
+endif
+
+if have_adt
+ gdm_session_worker_src += 'gdm-session-solaris-auditor.c'
+endif
+
+gdm_session_worker = executable('gdm-session-worker',
+ gdm_session_worker_src,
+ dependencies: gdm_session_worker_deps,
+ include_directories: gdm_session_worker_includes,
+ install: true,
+ install_dir: get_option('libexecdir'),
+)
+
+# Wayland session
+gdm_wayland_session_src = [
+ 'gdm-wayland-session.c',
+ manager_dbus_gen,
+]
+
+gdm_wayland_session = executable('gdm-wayland-session',
+ gdm_wayland_session_src,
+ dependencies: gdm_daemon_deps,
+ include_directories: gdm_session_worker_includes,
+ install: true,
+ install_dir: get_option('libexecdir'),
+)
+
+# X session
+gdm_x_session_src = [
+ 'gdm-x-session.c',
+ manager_dbus_gen,
+]
+
+gdm_x_session = executable('gdm-x-session',
+ gdm_x_session_src,
+ dependencies: gdm_daemon_deps,
+ include_directories: gdm_session_worker_includes,
+ install: true,
+ install_dir: get_option('libexecdir'),
+)
+
+# GDM daemon
+gdm_daemon_sources = files(
+ 'gdm-dbus-util.c',
+ 'gdm-display-access-file.c',
+ 'gdm-display-factory.c',
+ 'gdm-display-store.c',
+ 'gdm-display.c',
+ 'gdm-launch-environment.c',
+ 'gdm-legacy-display.c',
+ 'gdm-local-display-factory.c',
+ 'gdm-local-display.c',
+ 'gdm-manager.c',
+ 'gdm-server.c',
+ 'gdm-session-record.c',
+ 'gdm-session-worker-common.c',
+ 'gdm-session-worker-job.c',
+ 'gdm-session.c',
+ 'main.c',
+)
+
+gdm_daemon_gen_sources = [
+ display_dbus_gen,
+ local_display_factory_dbus_gen,
+ manager_dbus_gen,
+ local_display_dbus_gen,
+ session_dbus_gen,
+ session_worker_dbus_gen,
+ gdm_session_enums,
+]
+
+if xdmcp_dep.found()
+ gdm_daemon_deps += xdmcp_dep
+
+ gdm_daemon_sources = [
+ gdm_daemon_sources,
+ files(
+ 'gdm-xdmcp-display-factory.c',
+ 'gdm-xdmcp-display.c',
+ 'gdm-xdmcp-chooser-display.c',
+ ),
+ ]
+endif
+
+gdm_daemon = executable('gdm',
+ [ gdm_daemon_sources, gdm_daemon_gen_sources ],
+ dependencies: gdm_daemon_deps,
+ include_directories: config_h_dir,
+ install: true,
+ install_dir: get_option('sbindir')
+)
diff --git a/data/Makefile.am b/data/Makefile.am
index bda91604..d55f3e6b 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -200,10 +200,10 @@ systemdsystemunit =
gdm.service: $(srcdir)/gdm.service.in
$(AM_V_GEN)sed \
- -e 's,[@]sbindir[@],$(sbindir),g' \
- -e 's,[@]GDM_INITIAL_VT[@],$(GDM_INITIAL_VT),g' \
- -e 's,[@]LANG_CONFIG_FILE[@],$(LANG_CONFIG_FILE),g' \
- -e 's,[@]PLYMOUTH_QUIT_SERVICE[@],$(PLYMOUTH_QUIT_SERVICE),g' \
+ -e 's,[$$]{sbindir},$(sbindir),g' \
+ -e 's,[$$]{GDM_INITIAL_VT},$(GDM_INITIAL_VT),g' \
+ -e 's,[$$]{LANG_CONFIG_FILE},$(LANG_CONFIG_FILE),g' \
+ -e 's,[$$]{PLYMOUTH_QUIT_SERVICE},$(PLYMOUTH_QUIT_SERVICE),g' \
-e 's, *$$,,g' \
< $< > $@
systemdsystemunit += gdm.service
diff --git a/data/applications/meson.build b/data/applications/meson.build
new file mode 100644
index 00000000..48a2f099
--- /dev/null
+++ b/data/applications/meson.build
@@ -0,0 +1,16 @@
+desktop_conf = {
+ 'LIBDIR': gdm_prefix / get_option('libdir'),
+ 'LIBEXECDIR': gdm_prefix / get_option('libexecdir'),
+ 'LOCALSTATEDIR': gdm_prefix / get_option('localstatedir'),
+ 'SBINDIR': gdm_prefix / get_option('sbindir'),
+ 'SYSCONFDIR': gdm_prefix / get_option('sysconfdir'),
+}
+
+foreach desktop_file : [ 'mime-dummy-handler.desktop', 'mimeapps.list' ]
+ configure_file(
+ input: desktop_file,
+ output: desktop_file,
+ configuration: desktop_conf,
+ install_dir: get_option('datadir') / 'gdm' / 'greeter' / 'applications',
+ )
+endforeach
diff --git a/data/autostart/meson.build b/data/autostart/meson.build
new file mode 100644
index 00000000..348a6c69
--- /dev/null
+++ b/data/autostart/meson.build
@@ -0,0 +1,12 @@
+autostart_files_conf = {
+ 'LIBEXECDIR': gdm_prefix / get_option('libexecdir'),
+}
+
+foreach autostart_file : [ 'orca-autostart.desktop' ]
+ configure_file(
+ input: autostart_file,
+ output: autostart_file,
+ configuration: autostart_files_conf,
+ install_dir: get_option('datadir') / 'gdm' / 'greeter' / 'autostart',
+ )
+endforeach
diff --git a/data/dconf/meson.build b/data/dconf/meson.build
new file mode 100644
index 00000000..8ce18d69
--- /dev/null
+++ b/data/dconf/meson.build
@@ -0,0 +1,25 @@
+gdm_dconf = configure_file(
+ input: 'gdm.in',
+ output: '@BASENAME@',
+ configuration: {
+ 'DATADIR': gdm_prefix / get_option('datadir'),
+ 'PACKAGE': meson.project_name(),
+ },
+ install_dir: get_option('datadir') / 'dconf' / 'profile',
+)
+
+greeter_dconf_defaults = custom_target('greeter-dconf-defaults',
+ output: 'greeter-dconf-defaults',
+ input: files(
+ 'defaults/00-upstream-settings',
+ 'defaults/locks/00-upstream-settings-locks',
+ ),
+ command: [
+ find_program('dconf'),
+ 'compile',
+ '@OUTPUT@',
+ meson.current_source_dir() / 'defaults',
+ ],
+ install: true,
+ install_dir: get_option('datadir') / meson.project_name(),
+)
diff --git a/data/gdm.service.in b/data/gdm.service.in
index 57d60ada..fbbfb529 100644
--- a/data/gdm.service.in
+++ b/data/gdm.service.in
@@ -2,15 +2,15 @@
Description=GNOME Display Manager
# replaces the getty
-Conflicts=getty@tty@GDM_INITIAL_VT@.service
-After=getty@tty@GDM_INITIAL_VT@.service
+Conflicts=getty@tty${GDM_INITIAL_VT}.service
+After=getty@tty${GDM_INITIAL_VT}.service
# replaces plymouth-quit since it quits plymouth on its own
-Conflicts=@PLYMOUTH_QUIT_SERVICE@
-After=@PLYMOUTH_QUIT_SERVICE@
+Conflicts=${PLYMOUTH_QUIT_SERVICE}
+After=${PLYMOUTH_QUIT_SERVICE}
# Needs all the dependencies of the services it's replacing
-# pulled from getty@.service and @PLYMOUTH_QUIT_SERVICE@
+# pulled from getty@.service and ${PLYMOUTH_QUIT_SERVICE}
# (except for plymouth-quit-wait.service since it waits until
# plymouth is quit, which we do)
After=rc-local.service plymouth-start.service systemd-user-sessions.service
@@ -20,14 +20,14 @@ After=rc-local.service plymouth-start.service systemd-user-sessions.service
OnFailure=plymouth-quit.service
[Service]
-ExecStart=@sbindir@/gdm
+ExecStart=${sbindir}/gdm
KillMode=mixed
Restart=always
IgnoreSIGPIPE=no
BusName=org.gnome.DisplayManager
StandardOutput=syslog
StandardError=inherit
-EnvironmentFile=-@LANG_CONFIG_FILE@
+EnvironmentFile=-${LANG_CONFIG_FILE}
ExecReload=/bin/kill -SIGHUP $MAINPID
KeyringMode=shared
diff --git a/data/meson.build b/data/meson.build
new file mode 100644
index 00000000..02353422
--- /dev/null
+++ b/data/meson.build
@@ -0,0 +1,172 @@
+subdir('applications')
+subdir('autostart')
+subdir('dconf')
+
+# XPath configs
+foreach file : [ 'Init', 'PreSession', 'PostSession' ]
+ generated_file = configure_file(
+ input: '@0@.in'.format(file),
+ output: file,
+ configuration: { 'X_PATH': x_path },
+ )
+
+ install_data(generated_file,
+ install_dir: gdmconfdir / file,
+ install_mode: 'rwxr-xr-x',
+ rename: 'Default'
+ )
+endforeach
+
+install_data('PostLogin',
+ rename: 'Default.sample',
+ install_mode: 'rwxr-xr-x',
+ install_dir: gdmconfdir / 'PostLogin',
+)
+
+# gdm.conf
+configure_file(
+ input: 'gdm.conf.in',
+ output: '@BASENAME@',
+ configuration: {
+ 'GDM_USERNAME': get_option('user')
+ },
+ install_dir: dbus_sys_dir,
+)
+configure_file(
+ input: 'gdm.conf-custom.in',
+ output: 'custom.conf',
+ copy: true,
+ install_mode: 'rw-r--r--',
+ install_dir: gdmconfdir,
+)
+
+# GSettings schema
+install_data('org.gnome.login-screen.gschema.xml',
+ install_dir: get_option('datadir') / 'glib-2.0' / 'schemas',
+)
+compiled_gschema = gnome.compile_schemas()
+
+# gdm.schema
+gdm_schema = configure_file(
+ input: 'gdm.schemas.in',
+ output: '@BASENAME@',
+ configuration: {
+ 'GDM_USERNAME': get_option('user'),
+ 'GDM_GROUPNAME': get_option('group'),
+ 'gdmconfdir': gdmconfdir,
+ },
+ install_dir: get_option('datadir') / 'gdm',
+)
+
+install_data('locale.alias',
+ install_dir: get_option('datadir') / 'gdm',
+)
+configure_file(
+ input: 'gnome-login.session.in',
+ output: '@BASENAME@',
+ configuration: {
+ 'libexecdir': gdm_prefix / get_option('libexecdir'),
+ 'check_accelerated_dir': check_accelerated_dir,
+ },
+ install_dir: get_option('datadir') / 'gnome-session' / 'sessions',
+)
+
+# PAM
+pam_data_files_map = {
+ 'redhat': [
+ 'gdm-autologin',
+ 'gdm-launch-environment',
+ 'gdm-fingerprint',
+ 'gdm-smartcard',
+ 'gdm-password',
+ 'gdm-pin',
+ ],
+ 'openembedded': [
+ 'gdm-autologin',
+ 'gdm-launch-environment',
+ 'gdm-password',
+ 'gdm-pin',
+ ],
+ 'exherbo': [
+ 'gdm-autologin',
+ 'gdm-launch-environment',
+ 'gdm-fingerprint',
+ 'gdm-smartcard',
+ 'gdm-password',
+ 'gdm-pin',
+ ],
+ 'lfs': [
+ 'gdm-autologin',
+ 'gdm-launch-environment',
+ 'gdm-fingerprint',
+ 'gdm-smartcard',
+ 'gdm-password',
+ 'gdm-pin',
+ ],
+ 'arch': [
+ 'gdm-autologin',
+ 'gdm-launch-environment',
+ 'gdm-fingerprint',
+ 'gdm-smartcard',
+ 'gdm-password',
+ 'gdm-pin',
+ ],
+ 'none': [],
+ # We should no longer have 'autodetect' at this point
+}
+
+pam_data_files = pam_data_files_map[default_pam_config]
+pam_prefix = (get_option('pam-prefix') != '')? get_option('pam-prefix') : get_option('sysconfdir')
+foreach _pam_filename : pam_data_files
+ install_data('pam-@0@/@1@.pam'.format(default_pam_config, _pam_filename),
+ rename: _pam_filename,
+ install_dir: pam_prefix / 'pam.d',
+ )
+endforeach
+
+gdm_rules = configure_file(
+ input: '61-gdm.rules.in',
+ output: '@BASENAME@',
+ configuration: {
+ 'libexecdir': gdm_prefix / get_option('libexecdir'),
+ },
+ install_dir: udev_dir,
+)
+
+# DBus service files
+service_config = configuration_data()
+service_config.set('sbindir', gdm_prefix / get_option('sbindir'))
+service_config.set('GDM_INITIAL_VT', get_option('initial-vt'))
+service_config.set('LANG_CONFIG_FILE', lang_config_file)
+if plymouth_dep.found()
+ service_config.set('PLYMOUTH_QUIT_SERVICE', 'plymouth-quit.service')
+else
+ service_config.set('PLYMOUTH_QUIT_SERVICE', '')
+endif
+
+if get_option('systemdsystemunitdir') != ''
+ systemd_systemunitdir = get_option('systemdsystemunitdir')
+else
+ systemd_systemunitdir = systemd_dep.get_pkgconfig_variable('systemdsystemunitdir')
+endif
+
+configure_file(
+ input: 'gdm.service.in',
+ output: '@BASENAME@',
+ configuration: service_config,
+ install_dir: systemd_systemunitdir,
+ format: 'cmake'
+)
+
+# XSession
+if get_option('gdm-xsession')
+ configure_file(
+ input: 'XSession.in',
+ output: '@BASENAME@',
+ configuration: {
+ 'libexecdir': gdm_prefix / get_option('libexecdir'),
+ 'XSESSION_SHELL': get_option('solaris')? '/bin/ksh' : '/bin/sh',
+ },
+ install_dir: gdmconfdir,
+ )
+endif
diff --git a/docs/LINGUAS b/docs/LINGUAS
new file mode 100644
index 00000000..c7897364
--- /dev/null
+++ b/docs/LINGUAS
@@ -0,0 +1,22 @@
+ca
+cs
+de
+el
+en_GB
+es
+fr
+gl
+hu
+id
+it
+ko
+oc
+pt_BR
+ro
+ru
+sl
+sv
+te
+tr
+uk
+zh_CN
diff --git a/docs/Makefile.am b/docs/Makefile.am
index 7e7fac64..ed20a002 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -5,5 +5,3 @@ HELP_ID = gdm
HELP_FILES = \
index.docbook \
legal.xml
-
-HELP_LINGUAS = ca cs de el en_GB es fr gl hu id it ko oc pt_BR ro ru sl sv te tr uk zh_CN
diff --git a/docs/meson.build b/docs/meson.build
new file mode 100644
index 00000000..52bac4ca
--- /dev/null
+++ b/docs/meson.build
@@ -0,0 +1,6 @@
+gnome.yelp(meson.project_name(),
+ sources: [
+ 'index.docbook',
+ 'legal.xml',
+ ],
+)
diff --git a/libgdm/libgdm.map b/libgdm/libgdm.map
new file mode 100644
index 00000000..6a1c7fa1
--- /dev/null
+++ b/libgdm/libgdm.map
@@ -0,0 +1,6 @@
+{
+global:
+ *;
+local:
+ _*;
+};
diff --git a/libgdm/meson.build b/libgdm/meson.build
new file mode 100644
index 00000000..3f8cafbb
--- /dev/null
+++ b/libgdm/meson.build
@@ -0,0 +1,104 @@
+libgdm_manager_dbus_gen = gnome.gdbus_codegen('gdm-manager-glue',
+ sources: '..' / 'daemon' / 'gdm-manager.xml',
+ namespace: 'Gdm',
+ interface_prefix: 'org.gnome.DisplayManager',
+ autocleanup: 'all',
+ annotations: [
+ [ 'org.gnome.DisplayManager.Manager', 'org.gtk.GDBus.C.Name', 'Manager' ],
+ ],
+ build_by_default: true,
+)
+libgdm_client_dbus_gen = gnome.gdbus_codegen('gdm-client-glue',
+ sources: '..' / 'daemon' / 'gdm-session.xml',
+ namespace: 'Gdm',
+ interface_prefix: 'org.gnome.DisplayManager',
+ autocleanup: 'all',
+ annotations: [
+ [ 'org.gnome.DisplayManager.UserVerifier', 'org.gtk.GDBus.C.Name', 'UserVerifier' ],
+ [ 'org.gnome.DisplayManager.Greeter', 'org.gtk.GDBus.C.Name', 'Greeter' ],
+ [ 'org.gnome.DisplayManager.RemoteGreeter', 'org.gtk.GDBus.C.Name', 'RemoteGreeter' ],
+ [ 'org.gnome.DisplayManager.Chooser', 'org.gtk.GDBus.C.Name', 'Chooser' ],
+ ],
+ build_by_default: true,
+ install_header: true,
+ install_dir: get_option('includedir') / meson.project_name()
+)
+
+libgdm_built_sources = [
+ libgdm_manager_dbus_gen,
+ libgdm_client_dbus_gen,
+]
+
+libgdm_sources = files(
+ 'gdm-client.c',
+ 'gdm-sessions.c',
+ 'gdm-user-switching.c',
+)
+
+libgdm_public_headers = [
+ 'gdm-client.h',
+ 'gdm-sessions.h',
+ 'gdm-user-switching.h',
+ # gdm-client-glue.h is automatically installed
+]
+
+install_headers(libgdm_public_headers,
+ subdir: meson.project_name(),
+)
+
+libgdm_headers = [
+ libgdm_public_headers,
+ libgdm_client_dbus_gen[1],
+ libgdm_manager_dbus_gen[1],
+]
+
+libgdm_deps = [
+ glib_dep,
+ gio_dep,
+ gio_unix_dep,
+ libsystemd_dep,
+ libgdmcommon_dep,
+]
+
+libgdm_link_flags = [
+ '-Wl,--version-script,@0@/libgdm.map'.format(meson.current_source_dir()),
+]
+
+libgdm = library('gdm',
+ libgdm_sources + libgdm_built_sources,
+ version: '1.0.0',
+ dependencies: libgdm_deps,
+ include_directories: config_h_dir,
+ link_args: libgdm_link_flags,
+ install: true,
+)
+
+libgdm_gir_includes = [
+ 'GLib-2.0',
+ 'GObject-2.0',
+ 'Gio-2.0',
+]
+
+libgdm_dep = declare_dependency(
+ link_with: libgdm,
+ dependencies: libgdm_deps,
+ include_directories: include_directories('.'),
+ sources: libgdm_built_sources,
+)
+
+libgdm_gir = gnome.generate_gir(libgdm,
+ sources: libgdm_headers + libgdm_sources,
+ namespace: 'Gdm',
+ nsversion: '1.0',
+ identifier_prefix: 'Gdm',
+ includes: libgdm_gir_includes,
+ install: true,
+)
+
+# Pkg-config file
+pkgconfig.generate(libgdm,
+ name: 'GDM Client Library',
+ description: 'Client Library for communicating with GDM daemon',
+ filebase: meson.project_name(),
+ requires: gobject_dep,
+)
diff --git a/meson.build b/meson.build
new file mode 100644
index 00000000..23d66f59
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,263 @@
+project('gdm', 'c',
+ version: '3.35.1',
+ license: 'GPL2+',
+ meson_version: '>= 0.50',
+)
+
+# Modules
+gnome = import('gnome')
+pkgconfig = import('pkgconfig')
+i18n = import('i18n')
+
+# Compiler
+cc = meson.get_compiler('c')
+
+# Options
+gdm_prefix = get_option('prefix')
+
+gdmconfdir = (get_option('sysconfsubdir') == '')? gdm_prefix / get_option('sysconfdir') : gdm_prefix / get_option('sysconfdir') / get_option('sysconfsubdir')
+dmconfdir = (get_option('dmconfdir') != '')? get_option('dmconfdir') : gdm_prefix / get_option('sysconfdir') / 'dm'
+udev_dir = get_option('udev-dir')
+at_spi_registryd_dir = (get_option('at-spi-registryd-dir') != '')? get_option('at-spi-registryd-dir') : gdm_prefix / get_option('libexecdir')
+lang_config_file = (get_option('lang-file') != '')? get_option('lang-file') : gdm_prefix / get_option('sysconfdir') / 'locale.conf'
+pam_mod_dir = (get_option('pam-mod-dir') != '')? get_option('pam-mod-dir') : gdm_prefix / get_option('libdir') / 'security'
+dbus_sys_dir = (get_option('dbus-sys') != '')? get_option('dbus-sys') : get_option('sysconfdir') / 'dbus-1' / 'system.d'
+gdm_defaults_conf = (get_option('defaults-conf') != '')? get_option('defaults-conf') : gdm_prefix / get_option('datadir') / 'gdm' / 'defaults.conf'
+gdm_custom_conf = (get_option('custom-conf') != '')? get_option('custom-conf') : gdmconfdir / 'custom.conf'
+gdm_runtime_conf = (get_option('runtime-conf') != '')? get_option('runtime-conf') : gdm_custom_conf
+gnome_settings_daemon_dir = (get_option('gnome-settings-daemon-dir') != '')? get_option('gnome-settings-daemon-dir') : gdm_prefix / get_option('libexecdir')
+check_accelerated_dir = (get_option('check-accelerated-dir') != '')? get_option('check-accelerated-dir') : gdm_prefix / get_option('libexecdir')
+gdm_run_dir = (get_option('run-dir') != '')? get_option('run-dir') : gdm_prefix / get_option('localstatedir') / 'run' / 'gdm'
+gdm_pid_file = (get_option('pid-file') != '')? get_option('pid-file') : gdm_run_dir / 'gdm.pid'
+ran_once_marker_dir = (get_option('ran-once-marker-dir') != '')? get_option('ran-once-marker-dir') : gdm_run_dir
+working_dir = (get_option('working-dir') != '')? get_option('working-dir') : gdm_prefix / get_option('localstatedir') / 'lib' / 'gdm'
+gdm_xauth_dir = (get_option('xauth-dir') != '')? get_option('xauth-dir') : gdm_run_dir
+gdm_screenshot_dir = (get_option('screenshot-dir') != '')? get_option('screenshot-dir') : gdm_run_dir / 'greeter'
+
+# Common variables
+config_h_dir = include_directories('.')
+
+# Dependencies
+udev_dep = dependency('udev')
+
+glib_min_version = '2.44.0'
+
+glib_dep = dependency('glib-2.0', version: '>=' + glib_min_version)
+gobject_dep = dependency('gobject-2.0', version: '>=' + glib_min_version)
+gio_dep = dependency('gio-2.0', version: '>=' + glib_min_version)
+gio_unix_dep = dependency('gio-unix-2.0', version: '>=' + glib_min_version)
+gtk_dep = dependency('gtk+-3.0', version: '>= 2.91.1')
+libcanberra_gtk_dep = dependency('libcanberra-gtk3', version: '>= 0.4')
+accountsservice_dep = dependency('accountsservice', version: '>= 0.6.35')
+xcb_dep = dependency('xcb')
+keyutils_dep = dependency('keyutils', required: false)
+libselinux_dep = dependency('libselinux', required: get_option('selinux'))
+
+# udev
+if udev_dir == ''
+ if udev_dep.found()
+ udev_dir = udev_dep.get_pkgconfig_variable('udevdir')
+ else
+ udev_dir = gdm_prefix / 'lib' / 'udev' / 'rules.d'
+ endif
+endif
+
+# X11
+x_deps = declare_dependency(
+ dependencies: [
+ dependency('x11'),
+ dependency('xau'),
+ ],
+)
+find_x_server_script = find_program('build-aux/find-x-server.sh', native: true)
+find_x_server_out = run_command(find_x_server_script).stdout().strip()
+if find_x_server_out != ''
+ x_bin = find_x_server_out
+ x_bin_path_split = x_bin.split('/')
+ i = 0
+ x_path = '/'
+ foreach dir : x_bin_path_split
+ if i < x_bin_path_split.length() - 1
+ x_path = x_path / dir
+ endif
+ i = i + 1
+ endforeach
+else
+ # what to do, what to do, this is wrong, but this just sets the
+ # defaults, perhaps this user is cross compiling or some such
+ x_path = '/usr/bin/X11:/usr/X11R6/bin:/opt/X11R6/bin'
+ x_bin = '/usr/bin/X'
+endif
+xdmcp_dep = cc.find_library('Xdmcp', required: get_option('xdmcp'))
+if xdmcp_dep.found() and get_option('tcp-wrappers')
+ libwrap_dep = cc.find_library('libwrap')
+endif
+# systemd
+systemd_dep = dependency('systemd')
+libsystemd_dep = dependency('libsystemd')
+journald_dep = dependency('journald', required: get_option('systemd-journal'))
+systemd_multiseat_x = find_program('systemd-multi-seat-x', required: false)
+systemd_x_server = systemd_multiseat_x.found()? systemd_multiseat_x.path() : '/lib/systemd/systemd-multi-seat-x'
+# Plymouth
+plymouth_dep = dependency('ply-boot-client', required: get_option('plymouth'))
+# Check for Solaris auditing API (ADT)
+# Note, Solaris auditing not supported for Solaris 9 or earlier and
+# should not be used on these versions of Solaris if auditing is
+# required. Solaris auditing is only supported on systems that
+# support the ADT_USER enumeration value.
+have_adt = cc.has_header_symbol('bsm/adt.h', 'ADT_USER')
+# libaudit
+libaudit_dep = dependency('audit', required: get_option('libaudit'))
+# unit testsheadername
+libcheck_dep = dependency('check', version: '>= 0.9.4')
+
+cc.has_header('security/pam_modutil.h')
+cc.has_header('security/pam_ext.h')
+have_pam_syslog = cc.has_function('pam_syslog', args: 'pam')
+
+# UTMP
+have_utmpx_header = cc.has_header('utmpx.h')
+have_utmp_header = cc.has_header('utmp.h')
+utmp_struct = have_utmpx_header? 'struct utmpx' : 'struct utmp'
+utmp_include = have_utmpx_header? '#include <utmpx.h>' : '#include <utmp.h>'
+utmp_has_host_field = cc.has_member(utmp_struct, 'ut_host', prefix: utmp_include)
+utmp_has_pid_field = cc.has_member(utmp_struct, 'ut_pid', prefix: utmp_include)
+utmp_has_id_field = cc.has_member(utmp_struct, 'ut_id', prefix: utmp_include)
+utmp_has_name_field = cc.has_member(utmp_struct, 'ut_name', prefix: utmp_include)
+utmp_has_type_field = cc.has_member(utmp_struct, 'ut_type', prefix: utmp_include)
+utmp_has_exit_e_termination_field = cc.has_member(utmp_struct, 'ut_exit.e_termination', prefix: utmp_include)
+utmp_has_user_field = cc.has_member(utmp_struct, 'ut_user', prefix: utmp_include)
+utmp_has_time_field = cc.has_member(utmp_struct, 'ut_time', prefix: utmp_include)
+utmp_has_tv_field = cc.has_member(utmp_struct, 'ut_tv', prefix: utmp_include)
+utmp_has_syslen_field = cc.has_member(utmp_struct, 'ut_syslen', prefix: utmp_include)
+
+# Check for POSIX getpwnam_r
+have_posix_getpwnam_r = cc.compiles('''
+#define _POSIX_PTHREAD_SEMANTICS
+#include <errno.h>
+#include <pwd.h>
+
+int main(int argc, char **argv) {
+ char buffer[10000];
+ struct passwd pwd, *pwptr = &pwd;
+ int error;
+ errno = 0;
+ error = getpwnam_r ("", &pwd, buffer,
+ sizeof (buffer), &pwptr);
+ return (error < 0 && errno == ENOSYS)
+ || error == ENOSYS;
+}
+''')
+
+# PAM
+libpam_dep = cc.find_library('pam')
+pam_extensions_supported = cc.has_header_symbol('security/pam_appl.h', 'PAM_BINARY_PROMPT')
+
+default_pam_config = get_option('default-pam-config')
+# If requested, try autodetecting from release files (see NetworkManager source)
+if default_pam_config == 'autodetect'
+ pam_autodetect_map = {
+ '/etc/redhat-release': 'redhat',
+ '/etc/fedora-release': 'redhat',
+ '/etc/exherbo-release': 'exherbo',
+ '/etc/arch-release': 'arch',
+ '/etc/lfs-release': 'lfs',
+ }
+
+ foreach _file, _pam_conf : pam_autodetect_map
+ pam_file_check = run_command('test', '-f', _file)
+ if pam_file_check.returncode() == 0
+ default_pam_config = _pam_conf
+ endif
+ endforeach
+
+ # If still not detected, default to none
+ if default_pam_config == 'autodetect'
+ default_pam_config = 'none'
+ endif
+endif
+
+# Configuration
+conf = configuration_data()
+conf.set_quoted('G_LOG_DOMAIN', 'Gdm')
+conf.set_quoted('VERSION', meson.project_version())
+conf.set_quoted('PACKAGE_VERSION', meson.project_version())
+conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
+conf.set_quoted('DATADIR', gdm_prefix / get_option('datadir'))
+conf.set_quoted('SYSCONFDIR', gdm_prefix / get_option('sysconfdir'))
+conf.set_quoted('BINDIR', gdm_prefix / get_option('bindir'))
+conf.set_quoted('LIBDIR', gdm_prefix / get_option('libdir'))
+conf.set_quoted('LIBEXECDIR', gdm_prefix / get_option('libexecdir'))
+conf.set_quoted('LOGDIR', get_option('log-dir'))
+conf.set_quoted('DMCONFDIR', dmconfdir)
+conf.set_quoted('GDMCONFDIR', gdmconfdir)
+conf.set_quoted('GDM_SCREENSHOT_DIR', gdm_screenshot_dir)
+conf.set_quoted('GDM_XAUTH_DIR', gdm_xauth_dir)
+conf.set_quoted('GDM_RAN_ONCE_MARKER_DIR', ran_once_marker_dir)
+conf.set_quoted('GDM_RUN_DIR', gdm_run_dir)
+conf.set_quoted('GNOMELOCALEDIR', gdm_prefix / get_option('datadir') / get_option('localedir'))
+conf.set_quoted('AT_SPI_REGISTRYD_DIR', at_spi_registryd_dir)
+conf.set_quoted('GDM_PID_FILE', gdm_pid_file)
+conf.set_quoted('GNOME_SETTINGS_DAEMON_DIR', gnome_settings_daemon_dir)
+conf.set_quoted('CHECK_ACCELRATED_DIR', check_accelerated_dir)
+conf.set_quoted('LANG_CONFIG_FILE', lang_config_file)
+conf.set('HAVE_ADT', have_adt)
+conf.set('HAVE_UTMP_H', have_utmp_header)
+conf.set('HAVE_UTMPX_H', have_utmpx_header)
+conf.set('HAVE_POSIX_GETPWNAM_R', have_posix_getpwnam_r)
+conf.set('UTMP', utmp_struct)
+conf.set('HAVE_GETUTXENT', cc.has_function('getutxent'))
+conf.set('HAVE_UPDWTMP', cc.has_function('updwtmp'))
+conf.set('HAVE_UPDWTMPX', cc.has_function('updwtmpx'))
+conf.set('HAVE_LOGIN', cc.has_function('login', args: '-lutil'))
+conf.set('HAVE_LOGOUT', cc.has_function('logout', args: '-lutil'))
+conf.set('HAVE_LOGWTMP', cc.has_function('logwtmp', args: '-lutil'))
+conf.set('HAVE_PAM_SYSLOG', have_pam_syslog)
+conf.set('HAVE_KEYUTILS', keyutils_dep.found())
+conf.set('SUPPORTS_PAM_EXTENSIONS', pam_extensions_supported)
+conf.set('HAVE_SELINUX', libselinux_dep.found())
+conf.set('ENABLE_USER_DISPLAY_SERVER', get_option('user-display-server'))
+conf.set('ENABLE_SYSTEMD_JOURNAL', journald_dep.found())
+conf.set('ENABLE_WAYLAND_SUPPORT', get_option('wayland-support'))
+conf.set('ENABLE_PROFILING', get_option('profiling'))
+conf.set('GDM_INITIAL_VT', get_option('initial-vt'))
+conf.set_quoted('GDM_DEFAULTS_CONF', gdm_defaults_conf)
+conf.set_quoted('GDM_CUSTOM_CONF', gdm_custom_conf)
+conf.set_quoted('GDM_RUNTIME_CONF', gdm_runtime_conf)
+conf.set_quoted('GDM_SESSION_DEFAULT_PATH', get_option('default-path'))
+conf.set_quoted('GDM_USERNAME', get_option('user'))
+conf.set_quoted('GDM_GROUPNAME', get_option('group'))
+conf.set('HAVE_LIBXDMCP', xdmcp_dep.found())
+conf.set_quoted('SYSTEMD_X_SERVER', systemd_x_server)
+conf.set('WITH_PLYMOUTH', plymouth_dep.found())
+conf.set_quoted('X_SERVER', x_bin)
+conf.set_quoted('X_PATH', x_path)
+conf.set('HAVE_UT_UT_HOST', utmp_has_host_field)
+conf.set('HAVE_UT_UT_PID', utmp_has_pid_field)
+conf.set('HAVE_UT_UT_ID', utmp_has_id_field)
+conf.set('HAVE_UT_UT_NAME', utmp_has_name_field)
+conf.set('HAVE_UT_UT_TYPE', utmp_has_type_field)
+conf.set('HAVE_UT_UT_EXIT_E_TERMINATION', utmp_has_exit_e_termination_field)
+conf.set('HAVE_UT_UT_USER', utmp_has_user_field)
+conf.set('HAVE_UT_UT_TIME', utmp_has_time_field)
+conf.set('HAVE_UT_UT_TV', utmp_has_tv_field)
+conf.set('HAVE_UT_UT_SYSLEN', utmp_has_syslen_field)
+conf.set('ENABLE_IPV6', get_option('ipv6'))
+configure_file(output: 'config.h', configuration: conf)
+
+# Subdirs
+subdir('data')
+subdir('common')
+if pam_extensions_supported
+ subdir('pam-extensions')
+endif
+subdir('daemon')
+subdir('libgdm')
+subdir('utils')
+subdir('pam_gdm')
+subdir('po')
+subdir('tests')
+if xdmcp_dep.found()
+ subdir('chooser')
+endif
+subdir('docs')
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 00000000..2de7ca52
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,39 @@
+option('at-spi-registryd-dir', type: 'string', value: '', description: 'Specify the directory of at-spi-registryd.')
+option('check-accelerated-dir', type: 'string', value: '', description: 'Specify the directory of gnome-session-check-accelerated.')
+option('custom-conf', type: 'string', value: '', description: 'Filename to give to custom configuration file.')
+option('dbus-sys', type: 'string', value: '', description: 'Where D-Bus systemd directory is.')
+option('default-pam-config', type: 'combo', choices: [ 'autodetect', 'redhat', 'openembedded', 'exherbo', 'lfs', 'arch', 'none'], value: 'autodetect', description: '')
+option('default-path', type: 'string', value: '/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin', description: 'Path GDM will use as the user\'s default PATH.')
+option('defaults-conf', type: 'string', value: '', description: 'Filename to give to defaults file.')
+option('dmconfdir', type: 'string', value: '', description: 'Directory where sessions are stored.')
+option('gdm-xsession', type: 'boolean', value: false, description: 'Enable installing the gdm Xsession file.')
+option('gnome-settings-daemon-dir', type: 'string', value: '', description: 'Specify the directory of gnome-settings-daemon used by the chooser.')
+option('group', type: 'string', value: 'gdm', description: 'GDM\'s group.')
+option('initial-vt', type: 'integer', value: 1, description: 'Initial virtual terminal to use.')
+option('ipv6', type: 'boolean', value: false, description: 'Enables compilation of IPv6 code.')
+option('lang-file', type: 'string', value: '', description: 'File containing default language settings.')
+option('libaudit', type: 'feature', value: 'auto', description: 'Add Linux audit support.')
+option('log-dir', type: 'string', value: '/var/log/gdm', description: 'Log directory.')
+option('pam-mod-dir', type: 'string', value: '', description: 'Directory to install PAM modules in.')
+option('pam-prefix', type: 'string', value: '', description: 'Specify where PAM files go.')
+option('pid-file', type: 'string', value: '', description: 'Pid file.')
+option('plymouth', type: 'feature', value: 'auto', description: 'Add plymouth support.')
+option('profiling', type: 'boolean', value: false, description: 'Enable profiling.')
+option('ran-once-marker-dir', type: 'string', value: '', description: 'Ran once marker directory.')
+option('run-dir', type: 'string', value: '', description: 'Runtime directory.')
+option('runtime-conf', type: 'string', value: '', description: 'Filename to give to runtime configuration file.')
+option('screenshot-dir', type: 'string', value: '', description: 'Directory to store greeter screenshot.')
+option('selinux', type: 'feature', value: 'auto', description: 'Add SELinux support.')
+option('solaris', type: 'boolean', value: false, description: 'Build for Solaris')
+option('split-authentication', type: 'boolean', value: true, description: 'Enable multiple simultaneous PAM conversations during login.')
+option('sysconfsubdir', type: 'string', value: 'gdm', description: 'Directory name used under sysconfdir.')
+option('systemd-journal', type: 'boolean', value: false, description: 'Add journald support.')
+option('systemdsystemunitdir', type: 'string', value: '', description: 'Directory for systemd service files.')
+option('tcp-wrappers', type: 'boolean', value: false, description: 'Use TCP wrappers.')
+option('udev-dir', type: 'string', value: '', description: 'Directory for udev rules file.')
+option('user', type: 'string', value: 'gdm', description: 'GDM\'s username.')
+option('user-display-server', type: 'boolean', value: true, description: 'Enable running X server as user.')
+option('wayland-support', type: 'boolean', value: true, description: 'Enable support for wayland sessions.')
+option('working-dir', type: 'string', value: '', description: 'Working directory.')
+option('xauth-dir', type: 'string', value: '', description: 'XAuth cookie directory.')
+option('xdmcp', type: 'feature', value: 'auto', description: 'Add XDMCP (remote login) support.')
diff --git a/pam-extensions/meson.build b/pam-extensions/meson.build
new file mode 100644
index 00000000..4e7bc2e1
--- /dev/null
+++ b/pam-extensions/meson.build
@@ -0,0 +1,14 @@
+if pam_extensions_supported
+ pkgconfig.generate(
+ name: 'GDM PAM Extensions',
+ description: 'Macros for custom protocols over PAM',
+ filebase: 'gdm-pam-extensions',
+ version: meson.project_version(),
+ subdirs: meson.project_name(),
+ )
+
+ pam_extensions_inc = include_directories('.')
+ install_headers('gdm-pam-extensions.h',
+ subdir: meson.project_name()
+ )
+endif
diff --git a/pam_gdm/meson.build b/pam_gdm/meson.build
new file mode 100644
index 00000000..f47d8e6a
--- /dev/null
+++ b/pam_gdm/meson.build
@@ -0,0 +1,16 @@
+pam_gdm_deps = [
+ libpam_dep,
+]
+
+if keyutils_dep.found()
+ pam_gdm_deps += keyutils_dep
+endif
+
+pam_gdm = library('pam_gdm',
+ 'pam_gdm.c',
+ dependencies: pam_gdm_deps,
+ include_directories: config_h_dir,
+ name_prefix: '',
+ install: true,
+ install_dir: pam_mod_dir,
+)
diff --git a/po/meson.build b/po/meson.build
new file mode 100644
index 00000000..f904cde4
--- /dev/null
+++ b/po/meson.build
@@ -0,0 +1,3 @@
+i18n.gettext(meson.project_name(),
+ preset: 'glib'
+)
diff --git a/tests/meson.build b/tests/meson.build
new file mode 100644
index 00000000..128b5d2e
--- /dev/null
+++ b/tests/meson.build
@@ -0,0 +1,17 @@
+m_common_test_src = [
+ 'm-common.c',
+ 's-common-address.c',
+ 's-common.c',
+]
+
+m_common_test_deps = [
+ libgdmcommon_dep,
+ libcheck_dep,
+]
+
+m_common_test = executable('m-common',
+ m_common_test_src,
+ dependencies: m_common_test_deps,
+)
+
+test('m-common', m_common_test)
diff --git a/utils/meson.build b/utils/meson.build
new file mode 100644
index 00000000..f719c49d
--- /dev/null
+++ b/utils/meson.build
@@ -0,0 +1,41 @@
+# gdm-flexiserver
+gdm_flexiserver_deps = [
+ glib_dep,
+ libgdmcommon_dep,
+]
+
+gdm_flexiserver = executable('gdmflexiserver',
+ 'gdmflexiserver.c',
+ dependencies: gdm_flexiserver_deps,
+ include_directories: config_h_dir,
+ install: true,
+)
+
+# gdm-screenshot
+gdm_screenshot_deps = [
+ glib_dep,
+ gtk_dep,
+ x_deps,
+ libcanberra_gtk_dep,
+]
+
+gdm_screenshot = executable('gdm-screenshot',
+ 'gdm-screenshot.c',
+ dependencies: gdm_screenshot_deps,
+ include_directories: config_h_dir,
+ install: true,
+)
+
+# gdm-disable-wayland
+gdm_disable_wayland_deps = [
+ glib_dep,
+]
+
+gdm_disable_wayland = executable('gdm-disable-wayland',
+ 'gdm-disable-wayland.c',
+ dependencies: gdm_disable_wayland_deps,
+ include_directories: config_h_dir,
+ install: true,
+ install_dir: get_option('libexecdir'),
+)
+