Commit eeefdc8e 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=787806
parent 6bf47ad8
......@@ -7,9 +7,13 @@ SUBDIRS = \
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
EXTRA_DIST = \
HACKING \
MAINTAINERS
EXTRA_DIST = \
HACKING \
MAINTAINERS \
meson.build \
meson_options.txt \
meson_post_install.py \
po/meson.build
MAINTAINERCLEANFILES = \
$(srcdir)/INSTALL \
......
......@@ -50,7 +50,8 @@ EXTRA_DIST = \
session-selector.ui \
gnome-custom-session.desktop.in \
$(ui_DATA) \
$(hwcompat_DATA)
$(hwcompat_DATA) \
meson.build
CLEANFILES = \
$(gsettings_SCHEMAS) \
......
desktop = 'gnome.desktop'
# FIXME: The same target can not be copied into two directories.
# There is a workaround in meson_post_install.py until proper solution arises:
# https://groups.google.com/forum/#!topic/mesonbuild/3iIoYPrN4P0
custom_target(
desktop,
input: desktop + '.in',
output: desktop,
command: intltool_desktop_cmd,
install: true,
#install_dir: [
# join_paths(session_datadir, 'xsessions'),
# join_paths(session_datadir, 'wayland-sessions')
#]
install_dir: join_paths(session_datadir, 'xsessions')
)
desktop = 'gnome-xorg.desktop'
custom_target(
desktop,
input: desktop + '.in',
output: desktop,
command: intltool_desktop_cmd,
install: true,
install_dir: join_paths(session_datadir, 'xsessions')
)
sessions = [
'gnome.session',
'gnome-dummy.session'
]
foreach session: sessions
desktop_conf = configuration_data()
desktop_conf.set('libexecdir', session_libexecdir)
desktop = session + '.desktop'
desktop_in = configure_file(
input: desktop + '.in.in',
output: desktop + '.in',
configuration: desktop_conf
)
custom_target(
session,
input: desktop_in,
output: session,
command: intltool_desktop_cmd,
install: true,
install_dir: join_paths(session_pkgdatadir, 'sessions')
)
endforeach
schema_conf = configuration_data()
schema = 'org.gnome.SessionManager.gschema.xml'
configure_file(
input: schema + '.in',
output: schema,
install: true,
install_dir: join_paths(session_datadir, 'glib-2.0', 'schemas'),
configuration: schema_conf
)
install_data(
'gnome-session.convert',
install_dir: join_paths(session_datadir, 'GConf', 'gsettings')
)
data = files('hardware-compatibility')
if enable_session_selector
data += files('session-selector.ui')
desktop = 'gnome-custom-session.desktop'
custom_target(
desktop,
input: desktop + '.in',
output: desktop,
command: intltool_desktop_cmd,
install: true,
install_dir: join_paths(session_datadir, 'xsessions')
)
endif
install_data(
data,
install_dir: session_pkgdatadir
)
......@@ -4,4 +4,6 @@ if ENABLE_MAN
SUBDIRS += man
endif
EXTRA_DIST = meson.build
-include $(top_srcdir)/git.mk
......@@ -43,6 +43,7 @@ EXTRA_DIST = \
config.xsl \
docbook.css \
dbus-introspect-docs.dtd \
spec-to-docbook.xsl
spec-to-docbook.xsl \
meson.build
-include $(top_srcdir)/git.mk
ifaces_refs = []
ifaces = [
'org.gnome.SessionManager',
'org.gnome.SessionManager.Client',
'org.gnome.SessionManager.ClientPrivate',
'org.gnome.SessionManager.Inhibitor',
'org.gnome.SessionManager.Presence'
]
gnome_session_dir = join_paths(meson.source_root(), 'gnome-session')
spec_to_docbook = files('spec-to-docbook.xsl')
foreach iface: ifaces
iface_ref = iface + '.ref.xml'
ifaces_refs += custom_target(
iface_ref,
input: files(join_paths(gnome_session_dir, iface + '.xml')),
output: iface_ref,
command: [xsltproc, '--output', '@OUTPUT@', spec_to_docbook, '@INPUT@']
)
endforeach
session_conf = configuration_data()
session_conf.set('VERSION', session_version)
session = meson.project_name()
xml_in = configure_file(
input: session + '.xml.in',
output: session + '.xml',
configuration: session_conf
)
config_xsl = files('config.xsl')
custom_target(
session,
input: xml_in,
output: session + '.html',
command: [find_program('xmlto'), 'xhtml-nochunks', '-o', meson.current_build_dir(), '-m', config_xsl, '@INPUT@'],
depends: ifaces_refs,
install: true,
install_dir: join_paths(session_datadir, 'doc', meson.project_name(), 'dbus')
)
......@@ -19,6 +19,7 @@ man_MANS += gnome-session-selector.1
endif
EXTRA_DIST = \
meson.build \
gnome-session-inhibit.xml \
gnome-session-selector.xml \
$(man_MANS)
......
man1_dir = join_paths(session_mandir, 'man1')
xsltproc_cmd = [
xsltproc,
'--output', '@OUTPUT@',
'--nonet',
'--stringparam', 'man.output.quietly', '1',
'--stringparam', 'funcsynopsis.style', 'ansi',
'--stringparam', 'man.th.extra1.suppress', '1',
'--stringparam', 'man.authors.section.enabled', '0',
'--stringparam', 'man.copyright.section.enabled', '0',
'http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl',
'@INPUT@'
]
mans = ['gnome-session-inhibit']
if enable_session_selector
mans += 'gnome-session-selector'
endif
foreach man: mans
output = man + '.1'
custom_target(
output,
input: man + '.xml',
output: output,
command: xsltproc_cmd,
install: true,
install_dir: man1_dir
)
endforeach
man_data = files(
'gnome-session.1',
'gnome-session-quit.1'
)
install_data(
man_data,
install_dir: man1_dir
)
xsltproc = find_program('xsltproc')
if enable_docbook
subdir('dbus')
endif
if enable_man
subdir('man')
endif
......@@ -205,6 +205,7 @@ BUILT_SOURCES = \
org.gnome.SessionManager.Presence.c
EXTRA_DIST += \
meson.build \
README \
org.gnome.SessionManager.xml \
org.gnome.SessionManager.App.xml \
......
File mode changed from 100644 to 100755
script_conf = configuration_data()
script_conf.set('libexecdir', session_libexecdir)
script = 'gnome-session'
configure_file(
input: script + '.in',
output: script,
install: true,
install_dir: session_bindir,
configuration: script_conf
)
libgsmutil = static_library(
'gsmutil',
sources: 'gsm-util.c',
include_directories: top_inc,
dependencies: session_deps
)
sources = files(
'gsm-app.c',
'gsm-autostart-app.c',
'gsm-client.c',
'gsm-dbus-client.c',
'gsm-fail-whale.c',
'gsm-inhibitor.c',
'gdm-log.c',
'gsm-manager.c',
'gsm-presence.c',
'gsm-process-helper.c',
'gsm-session-fill.c',
'gsm-session-save.c',
'gsm-shell-extensions.c',
'gsm-shell.c',
'gsm-store.c',
'gsm-system.c',
'gsm-systemd.c',
'gsm-xsmp-client.c',
'gsm-xsmp-server.c',
'main.c'
)
dbus_ifaces = [
['org.gnome.SessionManager', 'ExportedManager'],
['org.gnome.SessionManager.Client', 'ExportedClient'],
['org.gnome.SessionManager.ClientPrivate', 'ExportedClientPrivate'],
['org.gnome.SessionManager.App', 'ExportedApp'],
['org.gnome.SessionManager.Inhibitor', 'ExportedInhibitor'],
['org.gnome.SessionManager.Presence', 'ExportedPresence']
]
foreach iface: dbus_ifaces
sources += gnome.gdbus_codegen(
iface[0],
iface[0] + '.xml',
interface_prefix: iface[0] + '.',
namespace: 'Gsm',
annotations: [iface[0], 'org.gtk.GDBus.C.Name', iface[1]]
)
endforeach
if enable_consolekit
sources += files('gsm-consolekit.c')
endif
cflags = [
'-DLOCALE_DIR="@0@"'.format(session_localedir),
'-DDATA_DIR="@0@"'.format(session_pkgdatadir),
'-DLIBEXECDIR="@0@"'.format(session_libexecdir)
]
executable(
meson.project_name() + '-binary',
sources,
include_directories: top_inc,
dependencies: session_bin_deps,
c_args: cflags,
link_with: libgsmutil,
install: true,
install_dir: session_libexecdir
)
sources = files('gsm-fail-whale-dialog.c')
cflags = '-DLOCALE_DIR="@0@"'.format(session_localedir)
executable(
meson.project_name() + '-failed',
sources,
include_directories: top_inc,
dependencies: gtk_dep,
c_args: cflags,
install: true,
install_dir: session_libexecdir
)
units = [
['test-inhibit', [], session_deps + [gtk_dep]],
['test-client-dbus', [], [gio_dep]],
['test-process-helper', files('gsm-process-helper.c'), [gio_dep]]
]
foreach unit: units
executable(
unit[0],
[unit[0] + '.c'] + unit[1],
include_directories: top_inc,
dependencies: unit[2]
)
endforeach
project(
'gnome-session', 'c',
version: '3.26.0',
license: 'GPL2+',
default_options: [
'buildtype=debugoptimized',
'warning_level=1'
],
meson_version: '>= 0.43.0'
)
session_version = meson.project_version()
version_array = session_version.split('.')
session_major_version = version_array[0].to_int()
session_minor_version = version_array[1].to_int()
session_micro_version = version_array[2].to_int()
session_api_version = '@0@.0'.format(session_major_version)
session_api_name = '@0@-@1@'.format(meson.project_name(), session_api_version)
session_prefix = get_option('prefix')
session_bindir = join_paths(session_prefix, get_option('bindir'))
session_datadir = join_paths(session_prefix, get_option('datadir'))
session_libdir = join_paths(session_prefix, get_option('libdir'))
session_libexecdir = join_paths(session_prefix, get_option('libexecdir'))
session_localedir = join_paths(session_prefix, get_option('localedir'))
session_localstatedir = join_paths(session_prefix, get_option('localstatedir'))
session_mandir = join_paths(session_prefix, get_option('mandir'))
session_sbindir = join_paths(session_prefix, get_option('sbindir'))
session_sysconfdir = join_paths(session_prefix, get_option('sysconfdir'))
session_pkgdatadir = join_paths(session_datadir, meson.project_name())
session_debug = get_option('buildtype').contains('debug')
cc = meson.get_compiler('c')
config_h = configuration_data()
# defines
set_defines = [
# package
['PACKAGE', meson.project_name()],
['PACKAGE_BUGREPORT', 'http://bugzilla.gnome.org/enter_bug.cgi?product=' + meson.project_name()],
['PACKAGE_NAME', meson.project_name()],
['PACKAGE_STRING', '@0@ @1@'.format(meson.project_name(), session_version)],
['PACKAGE_TARNAME', meson.project_name()],
['PACKAGE_URL', ''],
['PACKAGE_VERSION', session_version],
['VERSION', session_version],
# i18n
['GETTEXT_PACKAGE', session_api_name]
]
foreach define: set_defines
config_h.set_quoted(define[0], define[1])
endforeach
# headers
check_headers = [
['HAVE_DLFCN_H', 'dlfcn.h'],
['HAVE_INTTYPES_H', 'inttypes.h'],
['HAVE_LOCALE_H', 'locale.h'],
['HAVE_MEMORY_H', 'memory.h'],
['HAVE_STDINT_H', 'stdint.h'],
['HAVE_STDLIB_H', 'stdlib.h'],
['HAVE_STRINGS_H', 'strings.h'],
['HAVE_STRING_H', 'string.h'],
['HAVE_SYS_PARAM_H', 'sys/param.h'],
['HAVE_SYS_STAT_H', 'sys/stat.h'],
['HAVE_SYS_TYPES_H', 'sys/types.h'],
['HAVE_SYSLOG_H', 'syslog.h'],
['HAVE_UNISTD_H', 'unistd.h']
]
foreach header: check_headers
config_h.set(header[0], cc.has_header(header[1]))
endforeach
# functions
check_functions = [
# i18n
['HAVE_DCGETTEXT', 'dcgettext'],
['HAVE_GETTEXT', 'gettext'],
['HAVE_ICONV', 'iconv']
]
if host_machine.system().contains('darwin')
check_functions += [
['HAVE_CFLOCALECOPYCURRENT', 'CFLocaleCopyCurrent'],
['HAVE_CFPREFERENCESCOPYAPPVALUE', 'CFPreferencesCopyAppValue']
]
endif
foreach func: check_functions
config_h.set(func[0], cc.has_function(func[1]))
endforeach
# symbols
check_symbols = [
# i18n
['HAVE_LC_MESSAGES', 'locale.h', 'LC_MESSAGES'],
['HAVE_BIND_TEXTDOMAIN_CODESET', 'libintl.h', 'bind_textdomain_codeset']
]
# compiler flags
common_flags = ['-DHAVE_CONFIG_H']
enable_deprecation_flags = get_option('enable-deprecation-flags')
if enable_deprecation_flags
common_flags += [
'-DGCONF_DISABLE_DEPRECATED',
'-DGCONF_DISABLE_SINGLE_INCLUDES',
'-DBONOBO_DISABLE_DEPRECATED',
'-DBONOBO_DISABLE_SINGLE_INCLUDES',
'-DBONOBO_UI_DISABLE_DEPRECATED',
'-DBONOBO_UI_DISABLE_SINGLE_INCLUDES',
'-DGNOME_DISABLE_DEPRECATED',
'-DGNOME_DISABLE_SINGLE_INCLUDES',
'-DLIBGLADE_DISABLE_DEPRECATED',
'-DLIBGLADE_DISABLE_SINGLE_INCLUDES',
'-DGNOME_VFS_DISABLE_DEPRECATED',
'-DGNOME_VFS_DISABLE_SINGLE_INCLUDES',
'-DWNCK_DISABLE_DEPRECATED',
'-DWNCK_DISABLE_SINGLE_INCLUDES',
'-DLIBSOUP_DISABLE_DEPRECATED',
'-DLIBSOUP_DISABLE_SINGLE_INCLUDES'
]
endif
compiler_flags = []
if session_debug
test_cflags = [
'-Werror=format=2',
'-Werror=implicit-function-declaration',
'-Werror=init-self',
'-Werror=missing-include-dirs',
'-Werror=missing-prototypes',
'-Werror=pointer-arith',
'-Werror=return-type',
'-Wnested-externs',
'-Wstrict-prototypes'
]
foreach cflag: test_cflags
if cc.has_argument(cflag)
compiler_flags += [cflag]
endif
endforeach
endif
add_project_arguments(common_flags + compiler_flags, language: 'c')
glib_req_version = '>= 2.46.0'
gio_dep = dependency('gio-2.0', version: glib_req_version)
glib_dep = dependency('glib-2.0', version: glib_req_version)
gtk_dep = dependency('gtk+-3.0', version: '>= 3.18.0')
ice_dep = dependency('ice')
sm_dep = dependency('sm')
x11_dep = dependency('x11')
session_deps = [
gio_dep,
glib_dep,
dependency('gnome-desktop-3.0', version: '>= 3.18.0'),
dependency('json-glib-1.0', version: '>= 0.10')
]
session_bin_deps = session_deps + [
ice_dep,
sm_dep,
x11_dep,
dependency('gio-unix-2.0', version: glib_req_version),
dependency('xau'),
dependency('xext')
]
enable_session_selector = get_option('enable-session-selector')
# FIXME: We can only support old upower
# https://bugzilla.gnome.org/show_bug.cgi?id=710383
upower_glib_dep = dependency('upower-glib', version: '< 0.99.0', required: false)
session_bin_deps += upower_glib_dep
have_old_power = upower_glib_dep.found()
config_h.set('HAVE_OLD_UPOWER', have_old_power)
# Check for gconf
enable_gconf = get_option('enable-gconf')
if enable_gconf
gconf_dep = dependency('gconf-2.0', required: false)
assert(gconf_dep.found(), 'GConf support explicitly required, but gconf not found')
session_bin_deps += gconf_dep
endif
config_h.set('HAVE_GCONF', enable_gconf)
# Check for systemd
session_tracking = 'null backend'
enable_systemd = get_option('enable-systemd')
if enable_systemd
libsystemd_dep = dependency('libsystemd', version: '>= 209', required: false)
session_bin_deps += libsystemd_dep
if not libsystemd_dep.found()
libsystemd_login_dep = dependency('libsystemd-login', version: '>= 183', required: false)
libsystemd_daemon_dep = dependency('libsystemd-daemon', required: false)
libsystemd_journal_dep = dependency('libsystemd-journal', required: false)
assert(libsystemd_login_dep.found() and libsystemd_daemon_dep.found() and libsystemd_journal_dep.found(),
'Systemd support explicitly required, but systemd not found')
session_bin_deps += [
libsystemd_login_dep,
libsystemd_daemon_dep,
libsystemd_journal_dep
]
endif
session_tracking = 'systemd'
endif
config_h.set('HAVE_SYSTEMD', enable_systemd)
# Check for ConsoleKit
enable_consolekit = get_option('enable-consolekit')
if enable_consolekit
dbus_glib_dep = dependency('dbus-glib-1', version: '>= 0.76')
assert(dbus_glib_dep.found(), 'ConsoleKit support explicitly required, but dbus-glib not found')
session_bin_deps += dbus_glib_dep
if enable_systemd
session_tracking += ' (with fallback to ConsoleKit)'
else
session_tracking = 'ConsoleKit'
endif
endif
config_h.set('HAVE_CONSOLEKIT', enable_consolekit)
# Check for XSync extension
have_xsync = cc.has_header('X11/extensions/sync.h')
config_h.set('HAVE_XSYNC', have_xsync,
description: 'Have the SYNC extension library')
# Check for XTest extension
xtest_dep = dependency('xtst', required: false)
session_bin_deps += xtest_dep
have_xtest = xtest_dep.found()
config_h.set('HAVE_XTEST', have_xtest,
description: 'Have the XTest extension library')
# XRender checks
xrender_dep = dependency('xrender', required: false)
session_bin_deps += xrender_dep
have_xrender = xrender_dep.found()
config_h.set('HAVE_XRENDER', have_xrender,
description: 'Have the Render X extension')
# Check for X transport interface - allows to disable ICE Transports
# See also https://bugzilla.gnome.org/show_bug.cgi?id=725100
enable_xtrans = get_option('enable-xtrans')
have_xtrans = false
if enable_xtrans
xtrans_dep = dependency('xtrans')
have_xtrans = xtrans_dep.found()
endif
config_h.set10('HAVE_XTRANS', have_xtrans,
description: 'Have the X Transport library')
# Code for checking whether IPv6 is enabled on the system....
enable_ipv6 = get_option('enable-ipv6')
have_ipv6 = false
if enable_ipv6
# Code for checking presence of AF_INET6 on the system....
ipv6_src = '''
#include <sys/types.h>
#include <sys/socket.h>
int main () {
socket(AF_INET6, SOCK_STREAM, 0);
};
'''
have_ipv6 = cc.compiles(ipv6_src)
# Now we would check for specific function like getaddrinfo.
if cc.compiles(ipv6_src)
have_ipv6 = cc.has_function('getaddrinfo')
if not have_ipv6
foreach lib: ['bsd', 'socket', 'inet']
# FIXME: this condition is due to not able to break the loop
if not have_ipv6
dep = dependency(lib, required: false)
have_ipv6 = dep.found() and cc.has_function('getaddrinfo', dependencies: dep)
if have_ipv6
session_bin_deps += dep
endif
endif
endforeach
endif
endif
endif
config_h.set('ENABLE_IPV6', have_ipv6,
description: 'Define IPV6 is supported')
configure_file(
output: 'config.h',
configuration: config_h
)
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@']
top_inc = include_directories('.')
subdir('gnome-session')
subdir('tools')
subdir('data')
enable_docbook = get_option('enable-docbook')
enable_man = get_option('enable-man')
if enable_docbook or enable_man
subdir('doc')
endif
subdir('po')
meson.add_install_script(
'meson_post_install.py',
session_datadir
)
output = '\n gnome-session ' + session_version + '\n'
output += ' ====================\n\n'
output += ' prefix: ' + session_prefix + '\n'
output += ' exec_prefix: ' + session_libexecdir + '\n'
output += ' libdir: ' + session_libdir + '\n'
output += ' bindir: ' + session_bindir + '\n'
output += ' sbindir: ' + session_sbindir + '\n'
output += ' sysconfdir: ' + session_sysconfdir + '\n'
output += ' localstatedir: ' + session_localstatedir + '\n'
output += ' datadir: ' + session_datadir + '\n'
output += ' source code location: ' + meson.source_root() + '\n'
output += ' compiler: ' + cc.get_id() + '\n'
output += ' cflags: ' + ' '.join(compiler_flags) + '\n'
output += ' Debug mode: ' + session_debug.to_string() + '\n'
output += ' Use *_DISABLE_DEPRECATED: ' + enable_deprecation_flags.to_string() + '\n\n'
output += ' GConf support: ' + enable_gconf.to_string() + '\n'
output += ' Session tracking: ' + session_tracking + ' \n'
output += ' IPv6 support: ' + have_ipv6.to_string() + '\n'
output += ' XRender support: ' + have_xrender.to_string() + '\n'
output += ' XSync support: ' + have_xsync.to_string() + '\n'
output += ' XTest support: ' + have_xtest.to_string() + '\n'
output += ' Legacy UPower backend: ' + have_old_power.to_string() + '\n'
output += ' Build Docbook: ' + enable_docbook.to_string() + '\n'
output += ' Build manpages: ' + enable_man.to_string()
message(output)
option('enable-deprecation-flags', type: 'boolean', value: false, description: 'use *_DISABLE_DEPRECATED flags')
option('enable-session-selector', type: 'boolean', value: false, description: 'enable building a custom session selector dialog')
option('enable-gconf', type: 'boolean', value: false, description: 'Support gconf-based autostart')
option('enable-systemd', type: 'boolean', value: false, description: 'Use systemd')
option('enable-consolekit', type: 'boolean', value: false, description: 'Use consolekit')
option('enable-docbook', type: 'boolean', value: false, description: 'build documentation')
option('enable-man', type: 'boolean', value: false, description: 'build documentation (requires xmlto)')
option('enable-ipv6', type: 'boolean', value: false, description: 'enable IPv6 extensions')
option('enable-xtrans', type: 'boolean', value: true, description: 'Build without xtrans support (results in ICE listening on remote TCP ports)')
#!/usr/bin/env python3
import os
import shutil
import subprocess
import sys
if not os.environ.get('DESTDIR'):
schemadir = os.path.join(sys.argv[1], 'glib-2.0', 'schemas')
print('Compile gsettings schemas...')
subprocess.call(['glib-compile-schemas', schemadir])
# FIXME: this is due to unable to copy a generated target file:
# https://groups.google.com/forum/#!topic/mesonbuild/3iIoYPrN4P0
dst_dir = os.path.join(sys.argv[1], 'wayland-sessions')
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
src = os.path.join(sys.argv[1], 'xsessions', 'gnome.desktop')
dst = os.path.join(dst_dir, 'gnome.desktop')
shutil.copyfile(src, dst)
i18n.gettext(session_api_name, preset: 'glib')
......@@ -101,4 +101,6 @@ gnome_session_selector_SOURCES = \
gnome-session-selector.c
endif
EXTRA_DIST = meson.build
-include $(top_srcdir)/git.mk
File mode changed from 100644 to 100755
install_data(
'gnome-session-custom-session',