Commit ba77f340 authored by Jan Rybar's avatar Jan Rybar

Merge branch 'inigomartinez/polkit-meson' into 'master'

port to meson build system

See merge request !67
parents ff4c2144 957a0151
Pipeline #218638 passed with stage
in 2 minutes and 31 seconds
image: fedora:rawhide
image: fedora:latest
variables:
DEPENDENCIES: gcc
......@@ -18,27 +18,34 @@ variables:
pkgconfig(systemd)
pam-devel
python3-dbusmock
meson
git
dbus-devel
build_stable:
before_script:
- dnf upgrade -y --nogpgcheck fedora-release fedora-repos*
- dnf update -y && dnf install -y $DEPENDENCIES
- getent group polkitd >/dev/null || groupadd -r polkitd
- getent passwd polkitd >/dev/null || useradd -r -g polkitd -d / -s /sbin/nologin -c "User for polkitd" polkitd
script:
- mkdir _build
- cd _build
- CPPFLAGS='-D_FORTIFY_SOURCE=2' ../autogen.sh
--disable-dependency-tracking
--enable-ansi
--enable-man-pages
--enable-test
--enable-libsystemd-login=yes
--enable-libelogind=no
- make
- make check
- make install
- meson setup
-D authfw=pam
-D examples=true
-D gtk_doc=true
-D introspection=true
-D man=true
-D session_tracking=libsystemd-login
-D tests=true
-D cpp_args="-D_FORTIFY_SOURCE=2"
builddir
- meson compile -C builddir
- meson test -C builddir
- meson install -C builddir
artifacts:
name: 'test logs'
when: 'always'
paths:
- '_build/test/*/*.log'
- 'builddir/meson-logs/*.txt'
......@@ -10,6 +10,10 @@ NULL =
EXTRA_DIST = \
HACKING \
meson.build \
meson_options.txt \
meson_post_install.py \
po/meson.build \
$(NULL)
# xsltproc barfs on 'make distcheck'; disable for now
......
......@@ -13,6 +13,9 @@ clean-local :
DISTCLEANFILES = org.freedesktop.policykit.policy
EXTRA_DIST = org.freedesktop.policykit.policy.in
EXTRA_DIST = \
org.freedesktop.policykit.policy.in \
meson.build \
$(NULL)
-include $(top_srcdir)/git.mk
policy = 'org.freedesktop.policykit.policy'
custom_target(
policy,
input: policy + '.in',
output: '@BASENAME@',
command: intltool_xml_cmd,
install: true,
install_dir: pk_pkgactiondir,
)
......@@ -57,6 +57,7 @@ CLEANFILES = $(BUILT_SOURCES)
EXTRA_DIST = \
org.freedesktop.PolicyKit1.Authority.xml \
org.freedesktop.PolicyKit1.AuthenticationAgent.xml \
meson.build \
$(service_in_files) \
$(dbusconf_in_files) \
$(systemdservice_in_files) \
......
service_conf = {'libprivdir': pk_prefix / pk_pkglibdir}
configure_file(
input: 'org.freedesktop.PolicyKit1.service.in',
output: '@BASENAME@',
configuration: service_conf,
install: true,
install_dir: dbus_system_bus_services_dir,
)
configure_file(
input: 'org.freedesktop.PolicyKit1.conf.in',
output: '@BASENAME@',
configuration: {'polkitd_user': polkitd_user},
install: true,
install_dir: dbus_policydir,
)
if enable_pam
configure_file(
input: 'polkit-1.in',
output: '@BASENAME@',
configuration: pam_conf,
install: true,
install_dir: pk_sysconfdir / 'pam.d',
)
endif
its_data = files(
'polkit.its',
'polkit.loc',
)
install_data(
its_data,
install_dir: pk_datadir / 'gettext/its',
)
if enable_logind
configure_file(
input: 'polkit.service.in',
output: '@BASENAME@',
configuration: service_conf,
install: true,
install_dir: systemd_systemdsystemunitdir,
)
endif
SUBDIRS = man polkit
EXTRA_DIST = version.xml.in
EXTRA_DIST = \
version.xml.in \
meson.build \
$(NULL)
-include $(top_srcdir)/git.mk
......@@ -24,6 +24,7 @@ EXTRA_DIST = \
pkcheck.xml \
pkaction.xml \
pkttyagent.xml \
meson.build \
$(NULL)
clean-local:
......
xsltproc = find_program('xsltproc', required: false)
assert(xsltproc.found(), 'xsltproc is required for man pages generation')
xsltproc_cmd = [
xsltproc,
'--output', '@OUTPUT@',
'--nonet',
'--stringparam', 'man.base.url.for.relative.links', pk_api_docpath + '/',
'http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl',
'@INPUT@',
]
mans = [
['polkit', '8'],
['polkitd', '8'],
['pkexec', '1'],
['pkcheck', '1'],
['pkaction', '1'],
['pkttyagent', '1'],
]
foreach man: mans
xml = files(man[0] + '.xml')
content_files += xml
output = '@0@.@1@'.format(man[0], man[1])
custom_target(
output,
input: xml,
output: output,
command: xsltproc_cmd,
install: true,
install_dir: pk_mandir / ('man' + man[1]),
)
endforeach
pk_api_docpath = pk_prefix / gnome.gtkdoc_html_dir(pk_api_name)
enable_man = get_option('man')
if enable_man
subdir('man')
endif
enable_gtk_doc = get_option('gtk_doc')
if enable_gtk_doc
content_files += configure_file(
input: 'extensiondir.xml.in',
output: '@BASENAME@',
configuration: {'libdir': pk_prefix / pk_libdir},
)
content_files += configure_file(
input: 'version.xml.in',
output: '@BASENAME@',
configuration: {'VERSION': pk_version},
)
html_images = files(
'polkit-architecture.png',
'polkit-authentication-agent-example.png',
'polkit-authentication-agent-example-wheel.png',
)
subdir('polkit')
endif
......@@ -86,6 +86,8 @@ else
CLEANFILES =
endif
EXTRA_DIST = meson.build
CLEANFILES += *~ \
polkit-1-scan.* \
polkit-1.args \
......
doc_module = pk_api_name
src_dirs = [
source_root / 'src/polkit',
source_root / 'src/polkitagent',
]
private_headers = [
'polkitagenthelperprivate.h',
'polkitprivate.h',
]
content_files += files(
'docbook-interface-org.freedesktop.PolicyKit1.AuthenticationAgent.xml',
'docbook-interface-org.freedesktop.PolicyKit1.Authority.xml',
)
gnome.gtkdoc(
doc_module,
main_xml: doc_module + '-docs.xml',
src_dir: src_dirs,
ignore_headers: private_headers,
dependencies: libpolkit_agent_dep,
namespace: meson.project_name(),
html_assets: html_images,
fixxref_args: '--html-dir=' + pk_api_docpath,
gobject_typesfile: files(doc_module + '.types'),
content_files: content_files,
install: true,
)
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)
option('session_tracking', type: 'combo', choices: ['libsystemd-login', 'libelogind', 'ConsoleKit'], value: 'ConsoleKit', description: 'session tracking (libsystemd-login/libelogind/ConsoleKit)')
option('systemdsystemunitdir', type: 'string', value: '', description: 'custom directory for systemd system units')
option('polkitd_user', type: 'string', value: 'polkitd', description: 'User for running polkitd (polkitd)')
option('authfw', type: 'combo', choices: ['pam', 'shadow', 'bsdauth'], value: 'pam', description: 'Authentication framework (pam/shadow)')
option('os_type', type: 'combo', choices: ['redhat', 'suse', 'gentoo', 'pardus', 'solaris', 'netbsd', ''], value: '', description: 'distribution or OS')
option('pam_include', type: 'string', value: '', description: 'pam file to include')