9bc89b821c
If one wants to run tests the non-installed gnome-shell, that currently fails as gnome-shell the executable attempts to link against ./build/src/libgnome-shell.so, but when GObject introspection tries to find what library to link to for Shell, it goes to the installed libgnome-shell.so, causing two different versions of libgnome-shell.so to be loaded. This, however, can be avoided thanks to meson adding $ORIGIN paths to relevant libraries before installing an executable. What this means in practice is that we can inspect ourself upon startup, discover whether the RPATH/RUNPATH header contains $ORIGIN, and if so, expand it to the directory containing the executable, and prepend the introspection search paths with said directory. This effectively means that the introspection machinery now finds the same library that the linker linked the gnome-shell executable with, making it run successfully. It's not possible to use $GI_TYPELIB_PATH since g_irepository_prepend_library_path() takes precedence. There is no "append" variant of that API. Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1349>
335 lines
9.7 KiB
Meson
335 lines
9.7 KiB
Meson
project('gnome-shell', 'c',
|
|
version: '43.1',
|
|
meson_version: '>= 0.58.0',
|
|
license: 'GPLv2+'
|
|
)
|
|
|
|
split_version = meson.project_version().split('.')
|
|
|
|
# We depend on a specific version of the libmutter API. The mutter variants of
|
|
# the Cogl and Clutter libraries also use this API version.
|
|
# The API version is increased each development cycle,
|
|
# starting with 0 in 3.23.x
|
|
mutter_api_version = '11'
|
|
|
|
clutter_pc = 'mutter-clutter-' + mutter_api_version
|
|
cogl_pc = 'mutter-cogl-' + mutter_api_version
|
|
cogl_pango_pc = 'mutter-cogl-pango-' + mutter_api_version
|
|
libmutter_pc = 'libmutter-' + mutter_api_version
|
|
libmutter_test_pc = 'libmutter-test-' + mutter_api_version
|
|
|
|
ecal_req = '>= 3.33.1'
|
|
eds_req = '>= 3.33.1'
|
|
gcr_req = '>= 3.90.0'
|
|
gio_req = '>= 2.56.0'
|
|
gi_req = '>= 1.49.1'
|
|
gjs_req = '>= 1.73.1'
|
|
gtk_req = '>= 3.15.0'
|
|
mutter_req = '>= 43.0'
|
|
polkit_req = '>= 0.100'
|
|
schemas_req = '>= 42.beta'
|
|
startup_req = '>= 0.11'
|
|
ibus_req = '>= 1.5.19'
|
|
gnome_desktop_req = '>= 3.35.90'
|
|
|
|
nm_req = '>= 1.10.4'
|
|
secret_req = '>= 0.18'
|
|
|
|
fs = import('fs')
|
|
gnome = import('gnome')
|
|
i18n = import('i18n')
|
|
|
|
prefix = get_option('prefix')
|
|
|
|
bindir = join_paths(prefix, get_option('bindir'))
|
|
datadir = join_paths(prefix, get_option('datadir'))
|
|
libdir = join_paths(prefix, get_option('libdir'))
|
|
libexecdir = join_paths(prefix, get_option('libexecdir'))
|
|
mandir = join_paths(prefix, get_option('mandir'))
|
|
sysconfdir = join_paths(prefix, get_option('sysconfdir'))
|
|
|
|
pkgdatadir = join_paths(datadir, meson.project_name())
|
|
pkglibdir = join_paths(libdir, meson.project_name())
|
|
|
|
autostartdir = join_paths(sysconfdir, 'xdg', 'autostart')
|
|
desktopdir = join_paths(datadir, 'applications')
|
|
icondir = join_paths(datadir, 'icons')
|
|
ifacedir = join_paths(datadir, 'dbus-1', 'interfaces')
|
|
localedir = join_paths(datadir, 'locale')
|
|
metainfodir = join_paths(datadir, 'metainfo')
|
|
portaldir = join_paths(datadir, 'xdg-desktop-portal', 'portals')
|
|
schemadir = join_paths(datadir, 'glib-2.0', 'schemas')
|
|
servicedir = join_paths(datadir, 'dbus-1', 'services')
|
|
|
|
keybindings_dep = dependency('gnome-keybindings', required: false)
|
|
if keybindings_dep.found()
|
|
keysdir = keybindings_dep.get_variable('keysdir', pkgconfig_define: ['datadir', datadir])
|
|
else
|
|
keysdir = join_paths(datadir, 'gnome-control-center', 'keybindings')
|
|
endif
|
|
|
|
atk_bridge_dep = dependency('atk-bridge-2.0')
|
|
ecal_dep = dependency('libecal-2.0', version: ecal_req)
|
|
eds_dep = dependency('libedataserver-1.2', version: eds_req)
|
|
gcr_dep = dependency('gcr-4', version: gcr_req)
|
|
gdk_x11_dep = dependency('gdk-x11-3.0')
|
|
gdk_pixbuf_dep = dependency('gdk-pixbuf-2.0')
|
|
gi_dep = dependency('gobject-introspection-1.0', version: gi_req)
|
|
gio_dep = dependency('gio-2.0', version: gio_req)
|
|
gio_unix_dep = dependency('gio-unix-2.0', version: gio_req)
|
|
gjs_dep = dependency('gjs-1.0', version: gjs_req)
|
|
gtk_dep = dependency('gtk+-3.0', version: gtk_req)
|
|
libxml_dep = dependency('libxml-2.0')
|
|
clutter_dep = dependency(clutter_pc, version: mutter_req)
|
|
cogl_dep = dependency(cogl_pc, version: mutter_req)
|
|
cogl_pango_dep = dependency(cogl_pango_pc, version: mutter_req)
|
|
mutter_dep = dependency(libmutter_pc, version: mutter_req)
|
|
polkit_dep = dependency('polkit-agent-1', version: polkit_req)
|
|
startup_dep = dependency('libstartup-notification-1.0', version: startup_req)
|
|
ibus_dep = dependency('ibus-1.0', version: ibus_req)
|
|
x11_dep = dependency('x11')
|
|
schemas_dep = dependency('gsettings-desktop-schemas', version: schemas_req)
|
|
gnome_desktop_dep = dependency('gnome-desktop-3.0', version: gnome_desktop_req)
|
|
|
|
nm_deps = []
|
|
if get_option('networkmanager')
|
|
nm_deps += dependency('libnm', version: nm_req)
|
|
nm_deps += dependency('libsecret-1', version: secret_req)
|
|
|
|
have_networkmanager = true
|
|
else
|
|
have_networkmanager = false
|
|
endif
|
|
|
|
if get_option('systemd')
|
|
libsystemd_dep = dependency('libsystemd')
|
|
systemd_dep = dependency('systemd')
|
|
systemduserunitdir = systemd_dep.get_variable('systemduserunitdir',
|
|
pkgconfig_define: ['prefix', prefix])
|
|
have_systemd = true
|
|
else
|
|
libsystemd_dep = []
|
|
have_systemd = false
|
|
endif
|
|
|
|
have_soup2 = get_option('soup2')
|
|
|
|
if get_option('man')
|
|
if fs.exists('man/gnome-shell.1')
|
|
install_man('man/gnome-shell.1')
|
|
else
|
|
a2x = find_program('a2x')
|
|
subdir('man')
|
|
endif
|
|
endif
|
|
|
|
mutter_typelibdir = mutter_dep.get_variable('typelibdir')
|
|
python = find_program('python3')
|
|
gjs = find_program('gjs')
|
|
|
|
cc = meson.get_compiler('c')
|
|
|
|
m_dep = cc.find_library('m', required: false)
|
|
|
|
cdata = configuration_data()
|
|
cdata.set_quoted('GETTEXT_PACKAGE', meson.project_name())
|
|
cdata.set_quoted('VERSION', meson.project_version())
|
|
cdata.set_quoted('PACKAGE_VERSION', meson.project_version())
|
|
|
|
cdata.set('HAVE_NETWORKMANAGER', have_networkmanager)
|
|
cdata.set('HAVE_SYSTEMD', have_systemd)
|
|
|
|
# New API added in glib-2.57.2
|
|
cdata.set('HAVE_GIO_DESKTOP_LAUNCH_URIS_WITH_FDS',
|
|
cc.has_function('g_desktop_app_info_launch_uris_as_manager_with_fds',
|
|
dependencies : gio_dep)
|
|
)
|
|
cdata.set('HAVE_FDWALK', cc.has_function('fdwalk'))
|
|
cdata.set('HAVE_MALLINFO', cc.has_function('mallinfo'))
|
|
cdata.set('HAVE_MALLINFO2', cc.has_function('mallinfo2'))
|
|
cdata.set('HAVE_SYS_RESOURCE_H', cc.has_header('sys/resource.h'))
|
|
cdata.set('HAVE_EXE_INTROSPECTION',
|
|
cc.has_header('elf.h') and cc.has_header('link.h'))
|
|
cdata.set('HAVE__NL_TIME_FIRST_WEEKDAY',
|
|
cc.has_header_symbol('langinfo.h', '_NL_TIME_FIRST_WEEKDAY')
|
|
)
|
|
|
|
cdata.set('HAVE_FDWALK',
|
|
cc.has_function('fdwalk')
|
|
)
|
|
|
|
polkit_has_autocleanup = cc.compiles(
|
|
'''
|
|
#define POLKIT_AGENT_I_KNOW_API_IS_SUBJECT_TO_CHANGE
|
|
#include <polkitagent/polkitagent.h>
|
|
void main(void) { g_autoptr(PolkitAgentListener) agent = NULL; }
|
|
''',
|
|
dependencies: polkit_dep)
|
|
cdata.set('HAVE_POLKIT_AUTOCLEANUP', polkit_has_autocleanup)
|
|
|
|
buildtype = get_option('buildtype')
|
|
if buildtype != 'plain'
|
|
all_warnings = [
|
|
'-fno-strict-aliasing',
|
|
'-Wpointer-arith',
|
|
'-Wmissing-declarations',
|
|
'-Wimplicit-function-declaration',
|
|
'-Wformat=2',
|
|
'-Wformat-nonliteral',
|
|
'-Wformat-security',
|
|
'-Wstrict-prototypes',
|
|
'-Wmissing-prototypes',
|
|
'-Wnested-externs',
|
|
'-Wold-style-definition',
|
|
'-Wundef',
|
|
'-Wunused',
|
|
'-Wcast-align',
|
|
'-Wmissing-noreturn',
|
|
'-Wmissing-format-attribute',
|
|
'-Wmissing-include-dirs',
|
|
'-Wlogical-op',
|
|
'-Wignored-qualifiers',
|
|
'-Werror=redundant-decls',
|
|
'-Werror=implicit',
|
|
'-Werror=nonnull',
|
|
'-Werror=init-self',
|
|
'-Werror=main',
|
|
'-Werror=missing-braces',
|
|
'-Werror=sequence-point',
|
|
'-Werror=return-type',
|
|
'-Werror=trigraphs',
|
|
'-Werror=array-bounds',
|
|
'-Werror=write-strings',
|
|
'-Werror=address',
|
|
'-Werror=int-to-pointer-cast',
|
|
'-Werror=pointer-to-int-cast',
|
|
'-Werror=empty-body',
|
|
'-Werror=write-strings',
|
|
]
|
|
supported_warnings = cc.get_supported_arguments(all_warnings)
|
|
add_project_arguments(supported_warnings, language: 'c')
|
|
endif
|
|
|
|
if get_option('debug')
|
|
debug_c_args = [
|
|
'-DG_ENABLE_DEBUG',
|
|
'-fno-omit-frame-pointer'
|
|
]
|
|
supported_debug_c_args = cc.get_supported_arguments(debug_c_args)
|
|
add_project_arguments(supported_debug_c_args, language: 'c')
|
|
endif
|
|
|
|
config_h = configure_file(
|
|
input: 'config.h.meson',
|
|
output: 'config.h',
|
|
configuration: cdata
|
|
)
|
|
|
|
conf_inc = include_directories('.')
|
|
|
|
libgvc = subproject('gvc',
|
|
default_options: [
|
|
'package_name=' + meson.project_name(),
|
|
'package_version=' + meson.project_version(),
|
|
'pkgdatadir=' + pkgdatadir,
|
|
'pkglibdir=' + pkglibdir,
|
|
'static=false',
|
|
'introspection=true',
|
|
'alsa=false'
|
|
]
|
|
)
|
|
libgvc_gir = libgvc.get_variable('libgvc_gir')
|
|
|
|
libshew = subproject('shew',
|
|
default_options: [
|
|
'package_name=@0@'.format(meson.project_name()),
|
|
]
|
|
)
|
|
|
|
libshew_version = libshew.get_variable('package_version')
|
|
assert(libshew_version == meson.project_version(),
|
|
'shew version does not match project version')
|
|
|
|
if get_option('extensions_tool')
|
|
extension_tool = subproject('extensions-tool',
|
|
default_options: [
|
|
'package_name=@0@'.format(meson.project_name()),
|
|
]
|
|
)
|
|
|
|
extension_tool_version = extension_tool.get_variable('package_version')
|
|
assert(extension_tool_version == meson.project_version(),
|
|
'extension-tool version does not match project version'
|
|
)
|
|
endif
|
|
|
|
if get_option('extensions_app')
|
|
extensions_app = subproject('extensions-app',
|
|
default_options: [
|
|
'package_name=@0@'.format(meson.project_name()),
|
|
]
|
|
)
|
|
|
|
extensions_app_version = extensions_app.get_variable('package_version')
|
|
assert(extensions_app_version == meson.project_version(),
|
|
'Extensions app version does not match project version'
|
|
)
|
|
endif
|
|
|
|
|
|
po_dir = join_paths(meson.current_source_dir(), 'po')
|
|
|
|
subdir('js')
|
|
subdir('src')
|
|
subdir('po')
|
|
subdir('data')
|
|
subdir('tools')
|
|
|
|
if get_option('tests')
|
|
subdir('tests')
|
|
endif
|
|
|
|
if get_option('gtk_doc')
|
|
subdir('docs/reference')
|
|
endif
|
|
|
|
gnome.post_install(
|
|
glib_compile_schemas: true,
|
|
gtk_update_icon_cache: true
|
|
)
|
|
|
|
meson.add_dist_script('meson/generate-manpages.py')
|
|
meson.add_dist_script('meson/generate-stylesheets.py')
|
|
meson.add_dist_script('meson/check-version.py', meson.project_version(), 'NEWS')
|
|
|
|
summary_options = {
|
|
'networkmanager': get_option('networkmanager'),
|
|
'systemd': get_option('systemd'),
|
|
'extensions_app': get_option('extensions_app'),
|
|
'extensions_tool': get_option('extensions_tool'),
|
|
'man': get_option('man'),
|
|
'gtk_doc': get_option('gtk_doc'),
|
|
}
|
|
|
|
summary_build = {
|
|
'buildtype': get_option('buildtype'),
|
|
'debug': get_option('debug'),
|
|
}
|
|
|
|
summary_dirs = {
|
|
'prefix': get_option('prefix'),
|
|
'bindir': get_option('bindir'),
|
|
'libdir': get_option('libdir'),
|
|
'libexecdir': get_option('libexecdir'),
|
|
'datadir': get_option('datadir'),
|
|
'sysconfdir': get_option('sysconfdir'),
|
|
}
|
|
|
|
if get_option('man')
|
|
summary_dirs += { 'mandir': get_option('mandir') }
|
|
endif
|
|
|
|
summary(summary_dirs, section: 'Directories')
|
|
summary(summary_build, section: 'Build Configuration')
|
|
summary(summary_options, section: 'Build Options')
|