summaryrefslogtreecommitdiff
path: root/meson.build
diff options
context:
space:
mode:
authorJan Rybar <jrybar@redhat.com>2020-10-26 17:00:27 +0000
committerJan Rybar <jrybar@redhat.com>2020-10-26 17:00:27 +0000
commit957a015157fd359d9679540f664183e4b9492896 (patch)
tree41e7f5541d01e479e588cd3dd5a1769e1af0127a /meson.build
parentff4c2144f0fb1325275887d9e254117fcd8a1b52 (diff)
downloadpolkit-957a015157fd359d9679540f664183e4b9492896.tar.gz
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.
Diffstat (limited to 'meson.build')
-rw-r--r--meson.build363
1 files changed, 363 insertions, 0 deletions
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000..c7b07ba
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,363 @@
+project(
+ 'polkit', ['c', 'cpp'],
+ version: '0.117',
+ license: 'LGPL2+',
+ default_options: [
+ 'buildtype=debugoptimized',
+ 'cpp_std=c++17',
+ ],
+ meson_version: '>= 0.50.0',
+)
+
+pk_version = meson.project_version()
+
+pk_api_version = '1'
+pk_api_name = '@0@-@1@'.format(meson.project_name(), pk_api_version)
+
+pk_gir_ns = 'Polkit'
+pk_gir_version = '1.0'
+
+pk_prefix = get_option('prefix')
+pk_datadir = get_option('datadir')
+pk_includedir = get_option('includedir')
+pk_libdir = get_option('libdir')
+pk_mandir = get_option('mandir')
+pk_sysconfdir = get_option('sysconfdir')
+
+pk_pkgdatadir = pk_datadir / pk_api_name
+pk_pkgincludedir = pk_includedir / pk_api_name
+pk_pkglibdir = pk_libdir / pk_api_name
+pk_pkgsysconfdir = pk_sysconfdir / pk_api_name
+
+pk_actiondir = pk_api_name / 'actions'
+pk_pkgactiondir = pk_datadir / pk_actiondir
+
+soversion = 0
+current = 0
+revision = 0
+libversion = '@0@.@1@.@2@'.format(soversion, current, revision)
+
+gnome = import('gnome')
+i18n = import('i18n')
+pkg = import('pkgconfig')
+
+source_root = meson.current_source_dir()
+build_root = meson.current_build_dir()
+
+data_dir = source_root / 'data'
+po_dir = source_root / 'po'
+
+intltool_merge = find_program('intltool-merge')
+intltool_cache = 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('.')
+
+cc = meson.get_compiler('c')
+
+config_h = configuration_data()
+
+# defines
+set_defines = [
+ # package
+ ['PACKAGE_BUGREPORT', 'http://lists.freedesktop.org/mailman/listinfo/polkit-devel'],
+ ['PACKAGE_NAME', meson.project_name()],
+ ['PACKAGE_URL', 'http://www.freedesktop.org/wiki/Software/polkit'],
+ ['PACKAGE_VERSION', pk_version],
+ ['VERSION', pk_version],
+ # i18n
+ ['GETTEXT_PACKAGE', pk_api_name],
+]
+
+foreach define: set_defines
+ config_h.set_quoted(define[0], define[1])
+endforeach
+
+# Globally define_GNU_SOURCE and therefore enable the GNU extensions
+config_h.set('_GNU_SOURCE', true)
+
+# functions
+check_functions = [
+ 'clearenv',
+ 'fdatasync',
+]
+
+foreach func: check_functions
+ config_h.set('HAVE_' + func.to_upper(), cc.has_function(func))
+endforeach
+
+# compiler flags
+common_c_flags = [
+ # FIXME: this should go as 'c_std=c99' in project's default_options.
+ # https://github.com/mesonbuild/meson/issues/1889
+ # https://github.com/mesonbuild/meson/pull/6729
+ '-std=c99',
+ '-DHAVE_CONFIG_H',
+]
+compiler_flags = []
+compiler_c_flags = []
+
+if get_option('buildtype').contains('debug')
+ compiler_c_flags += cc.get_supported_arguments([
+ '-Waggregate-return',
+ '-Wdeclaration-after-statement',
+ '-Wformat=2',
+ '-Wimplicit-function-declaration',
+ '-Winit-self',
+ '-Wmissing-declarations',
+ '-Wmissing-include-dirs',
+ '-Wmissing-prototypes',
+ '-Wstrict-prototypes',
+ ])
+endif
+
+add_project_arguments(common_c_flags + compiler_c_flags, language: 'c')
+
+glib_req_version = '>= 2.30.0'
+
+gio_dep = dependency('gio-2.0', version: glib_req_version)
+gio_unix_dep = dependency('gio-unix-2.0', version: glib_req_version)
+glib_dep = dependency('glib-2.0', version: glib_req_version)
+gobject_dep = dependency('gobject-2.0', version: glib_req_version)
+
+expat_dep = dependency('expat')
+assert(cc.has_header('expat.h', dependencies: expat_dep), 'Can\'t find expat.h. Please install expat.')
+assert(cc.has_function('XML_ParserCreate', dependencies: expat_dep), 'Can\'t find expat library. Please install expat.')
+
+mozjs_dep = dependency('mozjs-78')
+
+dbus_dep = dependency('dbus-1')
+dbus_sysconfdir = dbus_dep.get_pkgconfig_variable('sysconfdir', define_variable: ['sysconfdir', pk_prefix / pk_sysconfdir])
+dbus_policydir = dbus_sysconfdir / 'dbus-1/system.d'
+dbus_system_bus_services_dir = dbus_dep.get_pkgconfig_variable('system_bus_services_dir', define_variable: ['datadir', pk_prefix / pk_datadir])
+
+# check OS
+host_system = host_machine.system()
+config_h.set('HAVE_' + host_system.to_upper(), true)
+
+# Check whether setnetgrent has a return value
+config_h.set('HAVE_NETGROUP_H', cc.has_header('netgroup.h'))
+
+setnetgrent_return_src = '''
+ #include <stddef.h>
+ #ifdef HAVE_NETGROUP_H
+ #include <netgroup.h>
+ #else
+ #include <netdb.h>
+ #endif
+ int main() {
+ int r = setnetgrent (NULL);
+ };
+'''
+
+config_h.set('HAVE_SETNETGRENT_RETURN', cc.compiles(setnetgrent_return_src, name: 'setnetgrent return support'))
+
+# Select wether to use libsystemd-login, libelogind or ConsoleKit for session tracking
+session_tracking = get_option('session_tracking')
+enable_logind = (session_tracking != 'ConsoleKit')
+if enable_logind
+ if session_tracking == 'libsystemd-login'
+ logind_dep = dependency('libsystemd', required: false)
+ if not logind_dep.found()
+ logind_dep = dependency('libsystemd-login', not_found_message: 'libsystemd support requested but libsystemd or libsystemd-login library not found')
+ endif
+ else
+ logind_dep = dependency('libelogind', not_found_message: 'libelogind support requested but libelogind library not found')
+ endif
+
+ func = 'sd_uid_get_display'
+ config_h.set10('HAVE_' + func.to_upper(), cc.has_function(func, dependencies: logind_dep))
+
+ # systemd unit / service files
+ systemd_systemdsystemunitdir = get_option('systemdsystemunitdir')
+ if systemd_systemdsystemunitdir == ''
+ systemd_dep = dependency('systemd', not_found_message: 'systemd required but not found, please provide a valid systemd user unit dir or disable it')
+ # FIXME: systemd.pc file does not use variables with relative paths, so `define_variable` cannot be used
+ systemd_systemdsystemunitdir = systemd_dep.get_pkgconfig_variable('systemdsystemunitdir')
+ endif
+endif
+config_h.set('HAVE_LIBSYSTEMD', enable_logind)
+
+# User for running polkitd
+polkitd_user = get_option('polkitd_user')
+config_h.set_quoted('POLKITD_USER', polkitd_user)
+
+# Select which authentication framework to use
+auth_deps = []
+
+auth_fw = get_option('authfw')
+enable_pam = (auth_fw == 'pam')
+if enable_pam
+ # Check for PAM
+ pam_dep = cc.find_library('pam')
+ assert(pam_dep.found() and cc.has_function('pam_start', dependencies: pam_dep), 'Could not find pam/pam-devel, please install the needed packages.')
+
+ # how to call pam_strerror
+ pam_strerror_src = '''
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <security/pam_appl.h>
+ #endif
+ int main() {
+ @0@
+ };
+ '''
+
+ # FIXME: Not necessary anymore?
+ if cc.compiles(pam_strerror_src.format('pam_handle_t *pamh = 0; char *s = pam_strerror(pamh, PAM_SUCCESS);'))
+ # FIXME: unused?
+ config_h.set('PAM_STRERROR_TWO_ARGS', true)
+ else
+ message('how to call pam_strerror: ' + cc.compiles(pam_strerror_src.format('char *s = pam_strerror(PAM_SUCCESS);')).to_string('1', 'unknown'))
+ endif
+
+ pam_prefix = get_option('pam_prefix')
+ if pam_prefix == ''
+ pam_prefix = pk_sysconfdir
+ else
+ message('PAM files will be installed in prefix ' + pam_prefix)
+ endif
+
+ pam_module_dir = get_option('pam_module_dir')
+ if pam_module_dir == ''
+ pam_module_dir = pk_libdir / 'security'
+ endif
+
+ auth_deps += pam_dep
+elif auth_fw == 'shadow'
+ auth_deps += cc.find_library('crypt')
+endif
+config_h.set('POLKIT_AUTHFW_' + auth_fw.to_upper(), true)
+
+# FIXME: sigtimedwait is not used anywhere?
+'''
+if host_system == 'solaris'
+ rt_dep = cc.find_library('rt')
+ cc.has_function('sigtimedwait', dependencies: rt_dep)
+else
+ cc.has_function('sigtimedwait')
+endif
+'''
+
+os_type = get_option('os_type')
+if os_type == ''
+ os_paths = [
+ ['redhat', '/etc/sysconfig/network-scripts'],
+ ['suse', '/etc/SuSE-release'],
+ ['debian', '/etc/debian_version'],
+ ['gentoo', '/etc/gentoo-release'],
+ ['pardus', '/etc/pardus-release'],
+ ]
+
+ foreach os_path: os_paths
+ if run_command('test', '-e', os_path[1]).returncode() == 0
+ os_type = os_path[0]
+ break
+ endif
+ endforeach
+
+ if os_type == ''
+ message('Linux distribution autodetection failed, specify the distribution to target using -Dos_type=')
+ endif
+endif
+
+pam_include = get_option('pam_include')
+if pam_include == ''
+ if ['suse', 'solaris'].contains(os_type)
+ pam_conf = {
+ 'PAM_FILE_INCLUDE_AUTH': 'common-auth',
+ 'PAM_FILE_INCLUDE_ACCOUNT': 'common-account',
+ 'PAM_FILE_INCLUDE_PASSWORD': 'common-password',
+ 'PAM_FILE_INCLUDE_SESSION': 'common-session',
+ }
+ elif os_type.contains('bsd')
+ pam_conf = {
+ 'PAM_FILE_INCLUDE_AUTH': 'system',
+ 'PAM_FILE_INCLUDE_ACCOUNT': 'system',
+ 'PAM_FILE_INCLUDE_PASSWORD': 'system',
+ 'PAM_FILE_INCLUDE_SESSION': 'system',
+ }
+ #if ['redhat', 'gentoo', 'pardus'].contains(os_type)
+ else
+ pam_conf = {
+ 'PAM_FILE_INCLUDE_AUTH': 'system-auth',
+ 'PAM_FILE_INCLUDE_ACCOUNT': 'system-auth',
+ 'PAM_FILE_INCLUDE_PASSWORD': 'system-auth',
+ 'PAM_FILE_INCLUDE_SESSION': 'system-auth',
+ }
+ endif
+else
+ pam_conf = {
+ 'PAM_FILE_INCLUDE_AUTH': pam_include,
+ 'PAM_FILE_INCLUDE_ACCOUNT': pam_include,
+ 'PAM_FILE_INCLUDE_PASSWORD': pam_include,
+ 'PAM_FILE_INCLUDE_SESSION': pam_include,
+ }
+endif
+
+enable_introspection = get_option('introspection')
+if enable_introspection
+ dependency('gobject-introspection-1.0', version: '>= 0.6.2')
+endif
+
+content_files = files('COPYING')
+
+subdir('actions')
+subdir('data')
+subdir('src')
+subdir('docs')
+subdir('po')
+
+enable_tests = get_option('tests')
+if enable_tests
+ subdir('test')
+endif
+
+configure_file(
+ output: 'config.h',
+ configuration: config_h,
+)
+
+meson.add_install_script(
+ 'meson_post_install.py',
+ get_option('bindir'),
+ pk_pkgdatadir,
+ pk_pkglibdir,
+ pk_pkgsysconfdir,
+ polkitd_user,
+)
+
+output = '\n ' + meson.project_name() + ' ' + meson.project_version() + '\n'
+output += ' ============\n\n'
+output += ' prefix: ' + pk_prefix + '\n'
+output += ' datadir: ' + pk_datadir + '\n\n'
+output += ' includedir: ' + pk_includedir + '\n'
+output += ' libdir: ' + pk_libdir + '\n'
+output += ' sysconfdir: ' + pk_sysconfdir + '\n'
+output += ' source code location: ' + source_root + '\n'
+output += ' compiler: ' + cc.get_id() + '\n'
+output += ' c_flags: ' + ' '.join(compiler_c_flags) + '\n\n'
+if enable_man
+ output += ' xsltproc: ' + xsltproc.path() + '\n'
+endif
+output += ' introspection: ' + enable_introspection.to_string() + '\n'
+output += ' Distribution/OS: ' + os_type + '\n'
+output += ' Authentication framework: ' + auth_fw + '\n'
+output += ' Session tracking: ' + session_tracking + '\n'
+if enable_logind
+ output += ' systemdsystemunitdir: ' + systemd_systemdsystemunitdir + '\n'
+endif
+output += ' polkitd user: ' + polkitd_user + ' \n'
+output += ' PAM support: ' + enable_pam.to_string() + '\n\n'
+if enable_pam
+ output += ' PAM file auth: ' + pam_conf['PAM_FILE_INCLUDE_AUTH'] + '\n'
+ output += ' PAM file acount: ' + pam_conf['PAM_FILE_INCLUDE_ACCOUNT'] + '\n'
+ output += ' PAM file password: ' + pam_conf['PAM_FILE_INCLUDE_PASSWORD'] + '\n'
+ output += ' PAM file session: ' + pam_conf['PAM_FILE_INCLUDE_SESSION'] + '\n\n'
+endif
+output += ' Building api docs: ' + enable_gtk_doc.to_string() + '\n'
+output += ' Building man pages: ' + enable_man.to_string() + '\n'
+output += ' Building examples: ' + enable_examples.to_string() + '\n'
+output += ' Building tests: ' + enable_tests.to_string()
+message(output)