2020-01-23 13:12:15 +01:00
# Copyright © 2019-2020 Salamandar <felix@piedallu.me>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
project ( 'dbus' ,
'c' , 'cpp' ,
version : '1.14.99' ,
meson_version : '>=0.56' ,
)
project_url = 'https://gitlab.freedesktop.org/dbus/dbus'
cc = meson . get_compiler ( 'c' )
cpp = meson . get_compiler ( 'cpp' )
windows = import ( 'windows' )
pkgconfig = import ( 'pkgconfig' )
config = configuration_data ( )
# Used for dbus-arch-deps.h, separated from config.h
arch_config = configuration_data ( )
# Non-quoted variables
data_config = configuration_data ( )
# Those will be checked for compiler compatibility and added at the end
compile_args = [ ]
link_args = [ ]
###############################################################################
# Project configuration
not_found = dependency ( '' , required : false )
version = meson . project_version ( )
config . set_quoted ( 'VERSION' , version )
data_config . set ( 'VERSION' , version )
data_config . set ( 'DBUS_VERSION' , version )
ver_array = version . split ( '.' )
arch_config . set ( 'DBUS_VERSION' , version )
arch_config . set ( 'DBUS_MAJOR_VERSION' , ver_array [ 0 ] )
arch_config . set ( 'DBUS_MINOR_VERSION' , ver_array [ 1 ] )
arch_config . set ( 'DBUS_MICRO_VERSION' , ver_array [ 2 ] )
config . set_quoted ( 'DBUS_DAEMON_NAME' , 'dbus-daemon' )
###############################################################################
# libtool versioning - this applies to libdbus
# http://sources.redhat.com/autobook/autobook/autobook_91.html#SEC91
## increment if the interface has additions, changes, removals.
lt_current = 36
## increment any time the source changes;
## set to 0 if you increment CURRENT
lt_revision = 0
## increment if any interfaces have been added;
## set to 0 if any interfaces have been changed or removed.
## removal has precedence over adding, so set to 0 if both happened.
lt_age = 33
soversion = ( lt_current - lt_age )
version_info = '@0@.@1@.@2@' . format ( soversion , lt_age , lt_revision )
data_config . set ( 'SOVERSION' , soversion )
###############################################################################
# System detection
python = find_program ( 'python3' )
host_os = host_machine . system ( )
platform_windows = host_os . contains ( 'windows' )
platform_cygwin = host_os . contains ( 'cygwin' )
# TODO: meson doesn't actually have WinCE support
platform_win32ce = host_os . contains ( 'mingw32ce' )
platform_unix = not platform_windows
config . set ( 'DBUS_UNIX' , platform_unix )
config . set ( 'DBUS_CYGWIN' , platform_cygwin )
config . set ( 'DBUS_WIN' , platform_windows )
config . set ( 'DBUS_WINCE' , platform_win32ce )
if platform_unix
platform = 'Unix'
elif platform_cygwin
platform = 'cygwin'
elif platform_win32ce
platform = 'win32ce'
elif platform_windows
platform = 'windows'
else
platform = 'unknown'
endif
message ( 'Detected platform : @0@ (@1@)' . format ( platform , host_os ) )
if platform_windows
config . set ( 'FD_SETSIZE' , 8192 ,
description : 'The maximum number of connections that can be handled at once'
)
if platform_win32ce
config . set ( '_WIN32_WCE' , '0x0502' , description : 'Get newer W32 CE APIs' )
else
config . set ( '_WIN32_WINNT' , '0x0600' ,
description : 'Define to the minimum supported Windows version (Vista)'
)
endif
build_timestamp = run_command (
find_program ( 'tools/build-timestamp.py' ) ,
check : true ,
) . stdout ( ) . strip ( )
data_config . set ( 'BUILD_TIMESTAMP' , build_timestamp )
data_config . set ( 'BUILD_FILEVERSION' , ',' . join ( version . split ( '.' ) ) )
data_config . set ( 'DBUS_VER_FILE_TYPE' , 'VFT_DLL' )
data_config . set ( 'DBUS_VER_INTERNAL_NAME' , 'libdbus-1-@0@' . format ( soversion ) )
data_config . set ( 'DBUS_VER_ORIGINAL_NAME' , 'libdbus-1-@0@.dll' . format ( soversion ) )
endif
if platform_windows
conf_maybe_external = '<!--<auth>EXTERNAL</auth>-->'
else
conf_maybe_external = '<auth>EXTERNAL</auth>'
endif
data_config . set ( 'DBUS_SESSION_CONF_MAYBE_AUTH_EXTERNAL' , conf_maybe_external )
if host_os . contains ( 'solaris' )
compile_args + = [
# Solaris' C library apparently needs these runes to be threadsafe...
'-D_POSIX_PTHREAD_SEMANTICS' ,
# ... this opt-in to get sockaddr_in6 and sockaddr_storage...
'-D__EXTENSIONS__' ,
# ... and this opt-in to get file descriptor passing support
' -D_XOPEN_SOURCE=500' ,
]
endif
if host_machine . endian ( ) == 'big'
config . set ( 'WORDS_BIGENDIAN' , 1 )
endif
# Integer sizes
int_types = [
{
'type' : 'short' ,
'size' : cc . sizeof ( 'short' ) ,
} , {
'type' : 'int' ,
'size' : cc . sizeof ( 'int' ) ,
'type_c' : '(val)' ,
'type_u_c' : '(val)' ,
'type_m' : '' ,
} , {
'type' : 'long' ,
'size' : cc . sizeof ( 'long' ) ,
'type_c' : '(val##L)' ,
'type_u_c' : '(val##UL)' ,
'type_m' : 'l' ,
} , {
'type' : 'long long' ,
'size' : cc . sizeof ( 'long long' ) ,
'type_c' : '(val##LL)' ,
'type_u_c' : '(val##ULL)' ,
'type_m' : 'll' ,
} , {
'type' : '__int64' ,
'size' : cc . sizeof ( '__int64' ) ,
'type_c' : '(val##i64)' ,
'type_u_c' : '(val##ui64)' ,
'type_m' : 'I64' ,
} , {
'type' : 'err'
} ,
]
foreach type : int_types
if type . get ( 'type' ) == 'err'
error ( 'Could not find a 64-bit integer type.' )
endif
if type . get ( 'size' ) == 8
arch_config . set ( 'DBUS_INT64_TYPE' , type . get ( 'type' ) )
arch_config . set ( 'DBUS_INT64_CONSTANT' , type . get ( 'type_c' ) )
arch_config . set ( 'DBUS_UINT64_CONSTANT' , type . get ( 'type_u_c' ) )
if platform_windows
arch_config . set ( 'DBUS_INT64_MODIFIER' , 'I64' )
else
arch_config . set ( 'DBUS_INT64_MODIFIER' , type . get ( 'type_m' ) )
endif
break
endif
endforeach
foreach type : int_types
if type . get ( 'type' ) == 'err'
error ( 'Could not find a 32-bit integer type.' )
endif
if type . get ( 'size' ) == 4
arch_config . set ( 'DBUS_INT32_TYPE' , type . get ( 'type' ) )
break
endif
endforeach
foreach type : int_types
if type . get ( 'type' ) == 'err'
error ( 'Could not find a 16-bit integer type.' )
endif
if type . get ( 'size' ) == 2
arch_config . set ( 'DBUS_INT16_TYPE' , type . get ( 'type' ) )
break
endif
endforeach
###############################################################################
# Dependencies
xsltproc = find_program ( 'xsltproc' , required : get_option ( 'xml_docs' ) )
build_xml_docs = false
if xsltproc . found ( )
build_xml_docs = true
foreach fmt : [ 'html' , 'manpages' ]
xsl = 'http://docbook.sourceforge.net/release/xsl/current/@0@/docbook.xsl' . format ( fmt )
if run_command ( [ xsltproc , '--nonet' , xsl ] , check : false ) . returncode ( ) == 0
continue
endif
build_xml_docs = false
if get_option ( 'xml_docs' ) . enabled ( )
error ( 'Docbook XSL "@0@" not found' . format ( fmt ) )
else
message ( 'Docbook XSL "@0@" not found, disabled automatically' . format ( fmt ) )
endif
endforeach
endif
# For doxygen
doxygen = find_program ( 'doxygen' , required : get_option ( 'doxygen_docs' ) )
ducktype = find_program ( 'ducktype' , required : get_option ( 'ducktype_docs' ) )
yelpbuild = find_program ( 'yelp-build' , required : get_option ( 'doxygen_docs' ) )
can_upload_docs = doxygen . found ( ) and xsltproc . found ( ) and ducktype . found ( )
qhelpgen = find_program ( 'qhelpgenerator' , 'qhelpgenerator-qt5' , required : get_option ( 'qt_help' ) )
qt_help_generate = doxygen . found ( ) and qhelpgen . found ( )
data_config . set ( 'DBUS_GENERATE_MAN' , platform_windows ? 'NO' : 'YES' )
data_config . set ( 'DOXYGEN_QCH_FILE' , meson . current_build_dir ( )
/ 'doc' / 'api' / 'qch' / 'dbus-@0@.qch' . format ( version ) )
if qhelpgen . found ( )
data_config . set ( 'DOXYGEN_QHG_LOCATION' , qhelpgen . full_path ( ) )
data_config . set ( 'DOXYGEN_GENERATE_QHP' , 'YES' )
else
data_config . set ( 'DOXYGEN_QHG_LOCATION' , '' )
data_config . set ( 'DOXYGEN_GENERATE_QHP' , 'NO' )
endif
data_config . set ( 'top_srcdir' , meson . project_source_root ( ) )
data_config . set ( 'top_builddir' , meson . project_build_root ( ) )
threads = dependency ( 'threads' )
config . set ( 'HAVE_MONOTONIC_CLOCK' , cc . has_header_symbol ( 'pthread.h' , 'CLOCK_MONOTONIC' ) )
2022-06-23 20:03:47 +01:00
glib = dependency (
'glib-2.0' , version : '>=2.40' , required : get_option ( 'modular_tests' ) ,
)
2020-01-23 13:12:15 +01:00
if platform_windows
2022-06-23 20:03:47 +01:00
gio = dependency ( 'gio-windows-2.0' , required : glib . found ( ) )
2020-01-23 13:12:15 +01:00
else
2022-06-23 20:03:47 +01:00
gio = dependency ( 'gio-unix-2.0' , required : glib . found ( ) )
2020-01-23 13:12:15 +01:00
endif
use_glib = glib . found ( ) and gio . found ( )
config . set ( 'DBUS_WITH_GLIB' , use_glib )
expat = dependency ( 'expat' )
config . set ( 'HAVE_XML_SETHASHSALT' , cc . has_function ( 'XML_SetHashSalt' , dependencies : expat ) )
selinux = dependency ( 'libselinux' , version : '>=2.0.86' , required : get_option ( 'selinux' ) )
# the selinux code creates threads which requires libpthread even on linux
# TODO: smcv: actually we've stopped doing that. We still include <pthread.h> in
# selinux.c (but probably shouldn't), and we don't actually create the thread;
# so this can probably be simplified.
config . set ( 'HAVE_SELINUX' , selinux . found ( ) and threads . found ( ) )
apparmor = dependency ( 'libapparmor' , version : '>=2.8.95' , required : get_option ( 'apparmor' ) )
config . set ( 'HAVE_APPARMOR' , apparmor . found ( ) )
config . set ( 'HAVE_APPARMOR_2_10' , apparmor . version ( ) . version_compare ( '>=2.10' ) )
if get_option ( 'inotify' ) . disabled ( )
use_inotify = false
else
use_inotify = cc . has_header ( 'sys/inotify.h' )
if get_option ( 'inotify' ) . enabled ( ) and not use_inotify
error ( 'inotify support requested but not found' )
endif
endif
if get_option ( 'epoll' ) . disabled ( )
use_linux_epoll = false
else
use_linux_epoll = (
cc . has_header ( 'sys/epoll.h' ) and
cc . has_function ( 'epoll_create1' , prefix : '#include <sys/epoll.h>' )
)
if get_option ( 'epoll' ) . enabled ( ) and not use_linux_epoll
error ( 'epoll support requested but not found' )
endif
endif
config . set ( 'DBUS_HAVE_LINUX_EPOLL' , use_linux_epoll )
if get_option ( 'kqueue' ) . disabled ( )
use_kqueue = false
else
use_kqueue = (
cc . has_header ( 'sys/event.h' ) and
cc . has_function ( 'kqueue' , prefix : '#include <sys/event.h>' )
)
if get_option ( 'kqueue' ) . enabled ( ) and not use_kqueue
error ( 'kqueue support requested but not found' )
endif
endif
config . set ( 'DBUS_BUS_ENABLE_KQUEUE' , use_kqueue )
if get_option ( 'launchd' ) . disabled ( )
use_launchd = false
else
launchctl = find_program ( 'launchctl' , required : get_option ( 'launchd' ) )
use_launchd = cc . has_header ( 'launch.h' ) and launchctl . found ( )
if get_option ( 'launchd' ) . enabled ( ) and not use_launchd
error ( 'launchd support requested but not found' )
endif
endif
config . set ( 'DBUS_BUS_ENABLE_LAUNCHD' , use_launchd )
if use_launchd
launchd_agent_dir = get_option ( 'launchd_agent_dir' )
if launchd_agent_dir == ''
launchd_agent_dir = '/Library/LaunchAgents'
endif
endif
systemd = dependency ( 'libsystemd' , version : '>=209' , required : get_option ( 'systemd' ) )
use_systemd = systemd . found ( )
config . set ( 'HAVE_SYSTEMD' , use_systemd )
if use_systemd
# If not found in $PATH, we might still have systemd and systemctl at runtime
# (perhaps dbus is being compiled in a minimal chroot with no systemd).
# Assume the upstream-recommended location. Distributors with split /usr
# can override this with --native-file (see https://mesonbuild.com/Machine-files.html)
systemctl = find_program ( 'systemctl' , required : false )
if systemctl . found ( )
systemctl = systemctl . full_path ( )
else
systemctl = '/usr/bin/systemctl'
endif
systemd_system_unitdir = get_option ( 'systemd_system_unitdir' )
systemd_user_unitdir = get_option ( 'systemd_user_unitdir' )
systemd_dirs = dependency ( 'systemd' , required : false )
if systemd_system_unitdir == ''
systemd_system_unitdir = ( systemd_dirs . found ( )
? systemd_dirs . get_variable ( pkgconfig : 'systemdsystemunitdir' )
: '/lib/systemd/system'
)
endif
if systemd_user_unitdir == ''
systemd_user_unitdir = ( systemd_dirs . found ( )
? systemd_dirs . get_variable ( pkgconfig : 'systemduserunitdir' )
: '/usr/lib/systemd/user'
)
endif
else
systemctl = ''
endif
data_config . set ( 'SYSTEMCTL' , systemctl )
use_traditional_activation = get_option ( 'traditional_activation' )
config . set ( 'ENABLE_TRADITIONAL_ACTIVATION' , use_traditional_activation )
if not ( use_systemd or use_traditional_activation )
warning ( 'Traditional activation and systemd activation are both disabled, '
+ 'so service activation (automatically starting services that '
+ 'receive messages) will not work' )
endif
have_console_owner_file = false
console_owner_file = get_option ( 'solaris_console_owner_file' )
if console_owner_file != ''
if not host_os . contains ( 'solaris' )
error ( 'solaris_console_owner_file is only supported on Solaris)' )
endif
have_console_owner_file = true
if console_owner_file == 'auto'
console_owner_file = '/dev/console'
else
endif
endif
config . set ( 'HAVE_CONSOLE_OWNER_FILE' , have_console_owner_file )
config . set_quoted ( 'DBUS_CONSOLE_OWNER_FILE' , console_owner_file )
if get_option ( 'libaudit' ) . disabled ( )
have_libaudit = false
else
libaudit = cc . find_library ( 'audit' , required : false )
libaudit_ok = cc . has_function ( 'audit_log_user_avc_message' , dependencies : libaudit )
cap_ng = cc . find_library ( 'cap-ng' , required : false )
cap_ng_ok = cc . has_function ( 'capng_clear' , dependencies : cap_ng )
have_libaudit = libaudit_ok and cap_ng_ok
if get_option ( 'libaudit' ) . enabled ( ) and not have_libaudit
error ( 'libaudit support requested but not found' )
endif
endif
config . set ( 'HAVE_LIBAUDIT' , have_libaudit )
if have_libaudit
selinux = [ selinux , libaudit , cap_ng ]
endif
# Check for ADT API (Solaris Basic Security Mode auditing)
adt_api_check = cc . compiles ( '' '
#include <bsm/adt.h>
int main ( ) {
adt_user_context = ADT_USER ;
return 0 ;
}
'' ' )
config . set ( 'HAVE_ADT' , adt_api_check )
if adt_api_check
adt_libs = cc . find_library ( 'bsm' )
else
adt_libs = dependency ( '' , required : false )
endif
# Check for SCM_RIGHTS
has_scm_rights = cc . compiles ( '' '
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
int main ( ) {
static int x = SCM_RIGHTS ;
return 0 ;
}
'' ' )
config . set ( 'HAVE_UNIX_FD_PASSING' , has_scm_rights )
valgrind = dependency ( 'valgrind' , version : '>=3.6' , required : false )
config . set ( 'WITH_VALGRIND' , valgrind . found ( ) )
if platform_win32ce
network_libs = [
cc . find_library ( 'ws2' ) ,
]
elif platform_windows
network_libs = [
cc . find_library ( 'ws2_32' ) ,
cc . find_library ( 'iphlpapi' ) ,
cc . find_library ( 'dbghelp' ) ,
]
else
network_libs = [ ]
endif
if get_option ( 'x11_autolaunch' ) . disabled ( )
use_x11_autolaunch = false
else
if get_option ( 'x11_autolaunch' ) . enabled ( ) and platform_windows
error ( 'X11 autolaunch is not supported on Windows' )
endif
x11 = dependency ( 'x11' , required : false )
use_x11_autolaunch = x11 . found ( )
if get_option ( 'x11_autolaunch' ) . enabled ( ) and not use_x11_autolaunch
error ( 'X11 autolaunch support requested but not found' )
endif
endif
config . set ( 'DBUS_BUILD_X11' , use_x11_autolaunch )
config . set ( 'DBUS_ENABLE_X11_AUTOLAUNCH' , use_x11_autolaunch )
check_functions = [
'accept4' ,
'clearenv' ,
'closefrom' ,
'close_range' ,
'dirfd' ,
'fpathconf' ,
'getgrouplist' ,
'getpeereid' ,
'getpeerucred' ,
'getpwnam_r' ,
'getrandom' ,
'getresuid' ,
'getrlimit' ,
'inotify_init1' ,
'issetugid' ,
'localeconv' ,
'nanosleep' ,
'pipe2' ,
'poll' ,
'prctl' ,
'prlimit' ,
'raise' ,
'setenv' ,
'setlocale' ,
'setresuid' ,
'setrlimit' ,
'socketpair' ,
'strtoll' ,
'strtoull' ,
'unsetenv' ,
'usleep' ,
]
foreach function : check_functions
macro = 'HAVE_' + function . underscorify ( ) . to_upper ( )
config . set ( macro , cc . has_function ( function ) ? 1 : false )
endforeach
check_headers = [
'alloca.h' ,
'byteswap.h' ,
'crt_externs.h' ,
'dirent.h' ,
'errno.h' ,
'inttypes.h' ,
'linux/close_range.h' ,
'locale.h' ,
'signal.h' ,
'stdint.h' ,
'syslog.h' ,
'sys/prctl.h' ,
'sys/random.h' ,
'sys/resource.h' ,
'sys/syscall.h' ,
'sys/syslimits.h' ,
'sys/time.h' ,
'unistd.h' ,
'ws2tcpip.h' ,
]
foreach header : check_headers
macro = 'HAVE_' + header . underscorify ( ) . to_upper ( )
config . set ( macro , cc . has_header ( header ) ? 1 : false )
endforeach
execinfo = cc . find_library ( 'execinfo' , required : false )
have_backtrace = ( cc . has_header ( 'execinfo.h' )
and cc . has_function ( 'backtrace' , dependencies : execinfo )
)
config . set ( 'HAVE_BACKTRACE' , have_backtrace )
# **********************************
# *** va_copy checks (from GLib) ***
# **********************************
# we currently check for all three va_copy possibilities, so we get
# all results in config.log for bug reports.
has_va_copy = cc . has_function ( 'va_copy' )
has___va_copy = cc . has_function ( '__va_copy' )
if has_va_copy
va_copy = 'va_copy'
elif has___va_copy
va_copy = '__va_copy'
elif cc . get_id ( ) == 'msvc'
va_copy = '_DBUS_VA_COPY_ASSIGN'
config . set ( '_DBUS_VA_COPY_ASSIGN(a1,a2)' , '{ a1 = a2; }' )
else
error ( 'dbus requires an ISO C99-compatible va_copy() macro, '
+ 'or a compatible __va_copy()' )
endif
config . set ( 'DBUS_VA_COPY' , va_copy )
#### Atomic integers
config . set10 ( 'DBUS_USE_SYNC' , cc . has_function ( '__sync_sub_and_fetch' ) ? 1 : false )
config . set ( 'HAVE_DECL_MSG_NOSIGNAL' ,
cc . has_header_symbol ( 'sys/socket.h' , 'MSG_NOSIGNAL' ) ? 1 : false
)
config . set ( 'HAVE_SOCKLEN_T' ,
cc . has_type ( 'socklen_t' , prefix : '#include <sys/socket.h>' )
)
config . set ( 'HAVE_CMSGCRED' ,
cc . has_type ( 'struct cmsgcred' , prefix : '#include <sys/socket.h>' )
)
config . set ( 'HAVE_WRITEV' ,
cc . has_header_symbol ( 'sys/uio.h' , 'writev' )
)
config . set ( 'HAVE_UNPCBID' ,
cc . has_member ( 'struct unpcbid' , 'unp_pid' , prefix : '#include <sys/un.h>' )
)
###############################################################################
# Project options
# Verbose mode
verbose_mode = get_option ( 'verbose_mode' )
config . set ( 'DBUS_ENABLE_VERBOSE_MODE' , verbose_mode )
# Asserts defaults to developer mode
asserts = get_option ( 'asserts' )
config . set ( 'DBUS_ENABLE_ASSERTS' , asserts )
config . set ( 'DBUS_ENABLE_ASSERT' , asserts ? 1 : false )
config . set ( 'DBUS_DISABLE_ASSERT' , not asserts ? 1 : false )
# -rdynamic is needed for glibc's backtrace_symbols to work.
# No clue how much overhead this adds, but it's useful
# to do this on any assertion failure,
# so for now it's enabled anytime asserts are (currently not
# in production builds).
# To get -rdynamic you pass -export-dynamic to libtool.
config . set ( 'DBUS_BUILT_R_DYNAMIC' , asserts ? 1 : false )
if asserts
link_args + = '-export-dynamic'
endif
if not asserts
compile_args + = [
'-Wno-unused-but-set-variable' ,
'-Wno-unused-variable' ,
'-Wno-unused-function' ,
]
endif
checks = get_option ( 'checks' )
config . set ( 'DBUS_ENABLE_CHECKS' , checks ? 1 : false )
config . set ( 'DBUS_DISABLE_CHECKS' , not checks ? 1 : false )
config . set ( 'G_DISABLE_CHECKS' , not checks ? 1 : false )
dbus_static_flags = ( get_option ( 'default_library' ) == 'static'
? '-DDBUS_STATIC_BUILD'
: [ ]
)
compile_args + = dbus_static_flags
# DBUS_ENABLE_EMBEDDED_TESTS controls unit tests built in to .c files
# and some stuff in the test/ subdir.
embedded_tests = get_option ( 'embedded_tests' )
config . set ( 'DBUS_ENABLE_EMBEDDED_TESTS' , embedded_tests )
# DBUS_ENABLE_MODULAR_TESTS controls tests that work based on public API.
# These use GTest, from GLib, because life's too short. They're enabled by
# default (unless you don't have GLib), because they don't bloat the library
# or binaries.
dbus_enable_modular_tests = (
2022-06-23 20:03:47 +01:00
not get_option ( 'modular_tests' ) . disabled ( )
2020-01-23 13:12:15 +01:00
and glib . version ( ) . version_compare ( '>=2.40' )
and gio . found ( )
)
###############################################################################
# Paths and directories
docs_dir = get_option ( 'datadir' ) / 'doc' / 'dbus'
data_config . set ( 'EXPANDED_LOCALSTATEDIR' , '/' / get_option ( 'localstatedir' ) )
data_config . set ( 'EXPANDED_SYSCONFDIR' , '/' / get_option ( 'sysconfdir' ) )
data_config . set ( 'EXPANDED_RUNSTATEDIR' , '/' / 'run' )
data_config . set ( 'EXPANDED_BINDIR' , get_option ( 'prefix' ) / get_option ( 'bindir' ) )
data_config . set ( 'EXPANDED_DATADIR' , get_option ( 'prefix' ) / get_option ( 'datadir' ) )
data_config . set ( 'DBUS_PREFIX' , get_option ( 'prefix' ) )
config . set_quoted ( 'DBUS_PREFIX' , get_option ( 'prefix' ) )
config . set_quoted ( 'DBUS_BINDIR' , get_option ( 'prefix' ) / get_option ( 'bindir' ) )
config . set_quoted ( 'DBUS_DATADIR' , get_option ( 'prefix' ) / get_option ( 'datadir' ) )
data_config . set ( 'DBUS_LIBEXECDIR' , get_option ( 'prefix' ) / get_option ( 'libexecdir' ) )
config . set_quoted ( 'DBUS_RUNSTATEDIR' ,
get_option ( 'localstatedir' )
)
config . set_quoted ( 'DBUS_MACHINE_UUID_FILE' ,
get_option ( 'localstatedir' ) / 'lib' / 'dbus' / 'machine-id'
)
config . set_quoted ( 'DBUS_SYSTEM_CONFIG_FILE' ,
get_option ( 'prefix' ) / get_option ( 'datadir' ) / 'dbus-1' / 'system.conf'
)
config . set_quoted ( 'DBUS_SESSION_CONFIG_FILE' ,
get_option ( 'prefix' ) / get_option ( 'datadir' ) / 'dbus-1' / 'session.conf'
)
system_socket = get_option ( 'system_socket' )
if system_socket == ''
# We don't use runstatedir for this (yet?), because /var/run has been the
# interoperable system bus socket for 10+ years.
# See https://bugs.freedesktop.org/show_bug.cgi?id=101628
system_socket = '/' / get_option ( 'localstatedir' ) / 'run' / 'dbus' / 'system_bus_socket'
endif
data_config . set ( 'DBUS_SYSTEM_SOCKET' , system_socket )
## System bus only listens on local domain sockets, and never
## on an abstract socket (so only root can create the socket).
##
## This won't work on Windows. It's not meant to - the system bus is
## meaningless on Windows anyway.
##
## This has to be suitable for hard-coding in client libraries as well as
## in the dbus-daemon's configuration, so it has to be valid to listen on
## and also to connect to. If this ever changes, it'll need to be split into
## two variables, one for the listening address and one for the connecting
## address.
system_bus_default_address = 'unix:path=@0@' . format ( system_socket )
data_config . set ( 'DBUS_SYSTEM_BUS_DEFAULT_ADDRESS' , system_bus_default_address )
config . set_quoted ( 'DBUS_SYSTEM_BUS_DEFAULT_ADDRESS' , system_bus_default_address )
system_pid_file = get_option ( 'system_pid_file' )
if system_pid_file == ''
system_pid_file = '/run' / 'dbus' / 'pid'
endif
data_config . set ( 'DBUS_SYSTEM_PID_FILE' , system_pid_file )
dbus_user = get_option ( 'dbus_user' )
data_config . set ( 'DBUS_USER' , dbus_user )
config . set_quoted ( 'DBUS_USER' , dbus_user )
test_user = get_option ( 'test_user' )
config . set_quoted ( 'DBUS_TEST_USER' , test_user )
daemon_dir = get_option ( 'dbus_daemondir' )
if daemon_dir == ''
daemon_dir = get_option ( 'prefix' ) / get_option ( 'bindir' )
endif
data_config . set ( 'DBUS_DAEMONDIR' , daemon_dir )
config . set_quoted ( 'DBUS_DAEMONDIR' , daemon_dir )
# Relocation is disabled by default, let's check if we need to enable it
relocation = false
if get_option ( 'relocation' ) . enabled ( )
# Manually forced at true
relocation = true
endif
if get_option ( 'relocation' ) . auto ( ) and platform_windows
# By default, on Windows we are relocatable if possible
relocation = true
endif
# Now check if it's not possible
# Meson does not separate exec_prefix and prefix (hopefully)
if relocation and not ( get_option ( 'libdir' ) in [ 'lib' , 'lib64' , ] )
message = (
'Relocatable pkg-config metadata requires default libdir, '
+ 'not @0@' . format ( get_option ( 'libdir' ) )
)
if get_option ( 'relocation' ) . enabled ( )
error ( message )
else
warning ( message )
endif
endif
#### Directory to source sysconfdir configuration from
# On Windows this is relative to where we put the bus setup, in
# ${datadir}/dbus-1. For simplicity, we only do this if
# ${sysconfdir} = ${prefix}/etc and ${datadir} = ${prefix}/share.
#
# On Unix, or on Windows with weird install layouts, it's the absolute path.
if ( platform_windows
and data_config . get ( 'EXPANDED_SYSCONFDIR' ) == get_option ( 'prefix' ) / 'etc'
and data_config . get ( 'EXPANDED_DATADIR' ) == get_option ( 'prefix' ) / 'share'
)
sysconfdir_from_pkgdatadir = '../../etc'
datadir_from_pkgsysconfdir = '../../share'
else
sysconfdir_from_pkgdatadir = data_config . get ( 'EXPANDED_SYSCONFDIR' )
datadir_from_pkgsysconfdir = data_config . get ( 'EXPANDED_DATADIR' )
endif
data_config . set ( 'SYSCONFDIR_FROM_PKGDATADIR' , sysconfdir_from_pkgdatadir )
data_config . set ( 'DATADIR_FROM_PKGSYSCONFDIR' , datadir_from_pkgsysconfdir )
#### Find socket directories
values = run_command ( python , '-c' ,
'import os; [print(os.getenv(e, "")) for e in ["TMPDIR", "TEMP", "TMP"]]' ,
check : true ,
) . stdout ( )
values + = '/tmp'
default_socket_dir = values . strip ( ) . split ( '\n' ) [ 0 ]
test_socket_dir = get_option ( 'test_socket_dir' )
if test_socket_dir == ''
test_socket_dir = default_socket_dir
endif
test_listen = platform_unix ? 'unix:tmpdir=' + test_socket_dir : 'tcp:host=localhost'
config . set_quoted ( 'TEST_LISTEN' , test_listen )
data_config . set ( 'TEST_LISTEN' , test_listen )
session_socket_dir = get_option ( 'session_socket_dir' )
if session_socket_dir == ''
session_socket_dir = default_socket_dir
endif
config . set_quoted ( 'DBUS_SESSION_SOCKET_DIR' , session_socket_dir )
session_bus_listen_address = get_option ( 'dbus_session_bus_listen_address' )
if session_bus_listen_address == ''
if platform_windows
session_bus_listen_address = 'autolaunch:'
elif use_launchd
session_bus_listen_address = 'launchd:env=DBUS_LAUNCHD_SESSION_BUS_SOCKET'
else
session_bus_listen_address = 'unix:tmpdir=@0@' . format ( session_socket_dir )
endif
endif
data_config . set ( 'DBUS_SESSION_BUS_LISTEN_ADDRESS' , session_bus_listen_address )
session_bus_connect_address = get_option ( 'dbus_session_bus_connect_address' )
if session_bus_connect_address == ''
session_bus_connect_address = 'autolaunch:'
endif
config . set_quoted ( 'DBUS_SESSION_BUS_CONNECT_ADDRESS' , session_bus_connect_address )
config . set ( 'DBUS_ENABLE_STATS' , get_option ( 'stats' ) )
config . set ( 'DBUS_ENABLE_CONTAINERS' , get_option ( 'containers' ) )
enable_user_session = get_option ( 'user_session' )
# Add this only for the correct targets
config . set ( 'DBUS_COMPILATION' , true )
exe_ext = platform_windows ? '.exe' : ''
config . set_quoted ( 'DBUS_EXEEXT' , exe_ext )
compile_args_c = [ ]
compile_args + = [
'-D_GNU_SOURCE' ,
]
if cc . get_id ( ) == 'msvc'
compile_args + = [
# once
'/wo4018' , # 'expression' : signed/unsigned mismatch
# disabled
'/wd4090' , # 'operation' : different 'modifier' qualifiers
'/wd4101' , # 'identifier' : unreferenced local variable
'/wd4127' , # conditional expression is constant
'/wd4244' , # 'argument' : conversion from 'type1' to 'type2', possible loss of data
# error
'/we4002' , # too many actual parameters for macro 'identifier'
'/we4003' , # not enough actual parameters for macro 'identifier'
'/we4013' , # 'function' undefined; assuming extern returning int
'/we4028' , # formal parameter 'number' different from declaration
'/we4031' , # second formal parameter list longer than the first list
'/we4047' , # operator' : 'identifier1' differs in levels of indirection from 'identifier2'
'/we4114' , # same type qualifier used more than once
'/we4133' , # 'type' : incompatible types - from 'type1' to 'type2'
]
else
compile_args + = [
'-Wno-missing-field-initializers' ,
'-Wno-unused-parameter' ,
'-Wchar-subscripts' ,
'-Wfloat-equal' ,
'-D__USE_MINGW_ANSI_STDIO=0' ,
]
compile_args_c + = [
'-Wpointer-sign' ,
]
endif
compile_args_c = cc . get_supported_arguments ( compile_args + compile_args_c )
compile_args_cpp = cpp . get_supported_arguments ( compile_args )
link_args = cc . get_supported_link_arguments ( link_args )
add_project_arguments ( compile_args_c , language : 'c' )
add_project_arguments ( compile_args_cpp , language : 'cpp' )
add_project_link_arguments ( link_args , language : [ 'c' , 'cpp' ] )
root_include = include_directories ( '.' )
configure_file (
output : 'config.h' ,
configuration : config ,
)
bonus_files = files (
'AUTHORS' ,
'CONTRIBUTING.md' ,
'COPYING' ,
'NEWS' ,
'README' ,
)
subdir ( 'dbus' )
subdir ( 'bus' )
subdir ( 'tools' )
subdir ( 'test' )
subdir ( 'doc' )
subdir ( 'cmake' )
meson . add_install_script ( 'meson_post_install.py' ,
'@0@' . format ( platform_unix ) ,
'@0@' . format ( relocation ) ,
'@0@' . format ( use_systemd ) ,
)
if use_systemd
meson . add_install_script ( 'meson_post_install_systemd.py' ,
systemd_system_unitdir ,
systemd_user_unitdir ,
)
endif
pkgconfig . generate (
libdbus ,
name : 'dbus' ,
filebase : 'dbus-1' ,
description : 'Free desktop message bus' ,
subdirs : [ 'dbus-1.0' ] ,
extra_cflags : [
'-I${libdir}/dbus-1.0/include' ,
] + dbus_static_flags ,
variables : {
'original_prefix' : get_option ( 'prefix' ) ,
'exec_prefix' : '${prefix}' ,
'bindir' : '${prefix}' / get_option ( 'bindir' ) ,
'datadir' : '${prefix}' / get_option ( 'datadir' ) ,
'datarootdir' : '${prefix}' / get_option ( 'datadir' ) ,
'sysconfdir' : '/' / get_option ( 'sysconfdir' ) ,
'daemondir' : '${bindir}' ,
'system_bus_default_address' : system_bus_default_address ,
'session_bus_services_dir' : '${datadir}/dbus-1/services' ,
'system_bus_services_dir' : '${datadir}/dbus-1/system-services' ,
'interfaces_dir' : '${datadir}/dbus-1/interfaces' ,
}
)
summary_dict = {
'prefix' : get_option ( 'prefix' ) ,
'exec_prefix' : get_option ( 'prefix' ) ,
'libdir' : get_option ( 'prefix' ) / get_option ( 'libdir' ) ,
'libexecdir' : get_option ( 'prefix' ) / get_option ( 'libexecdir' ) ,
'bindir' : get_option ( 'prefix' ) / get_option ( 'bindir' ) ,
'sysconfdir' : data_config . get ( 'EXPANDED_SYSCONFDIR' ) ,
'localstatedir' : data_config . get ( 'EXPANDED_LOCALSTATEDIR' ) ,
'runstatedir' : data_config . get ( 'EXPANDED_RUNSTATEDIR' ) ,
'datadir' : data_config . get ( 'EXPANDED_DATADIR' ) ,
'source code location' : meson . project_source_root ( ) ,
'compiler' : cc . get_id ( ) ,
'cflags' : compile_args_c ,
'cxxflags' : compile_args_cpp ,
'ldflags' : ( link_args . length ( ) == 0 ) ? '[]' : link_args ,
'64-bit int' : arch_config . get ( 'DBUS_INT64_TYPE' ) ,
'32-bit int' : arch_config . get ( 'DBUS_INT32_TYPE' ) ,
'16-bit int' : arch_config . get ( 'DBUS_INT16_TYPE' ) ,
'xsltproc' : xsltproc . found ( ) ? xsltproc . full_path ( ) : '' ,
'Doxygen' : doxygen . found ( ) ? doxygen . full_path ( ) : '' ,
'ducktype' : ducktype . found ( ) ? ducktype . full_path ( ) : '' ,
'yelp-build' : yelpbuild . found ( ) ? yelpbuild . full_path ( ) : '' ,
'gcc coverage' : get_option ( 'b_coverage' ) ,
'gcc profiling' : get_option ( 'b_pgo' ) ,
'Building embedded tests' : embedded_tests ,
'Building modular tests' : dbus_enable_modular_tests ,
'- with GLib' : use_glib ,
'Installing tests' : get_option ( 'installed_tests' ) ,
'Building verbose mode' : verbose_mode ,
'Building assertions' : asserts ,
'Building checks' : checks ,
'Building bus stats API' : get_option ( 'stats' ) ,
'Building container API' : get_option ( 'containers' ) ,
'Building SELinux support' : config . get ( 'HAVE_SELINUX' ) ,
'Building AppArmor support' : apparmor . found ( ) ,
'Building inotify support' : use_inotify ,
'Building kqueue support' : use_kqueue ,
'Building systemd support' : use_systemd ,
'Traditional activation' : use_traditional_activation ,
'Building X11 code' : config . get ( 'DBUS_BUILD_X11' ) ,
'Building Doxygen docs' : doxygen . found ( ) ,
'Building Qt help file' : qt_help_generate ,
'Building Ducktype docs' : ducktype . found ( ) ,
'Building XML docs' : build_xml_docs ,
'Building launchd support' : use_launchd ,
'System bus socket' : data_config . get ( 'DBUS_SYSTEM_SOCKET' ) ,
'System bus address' : config . get ( 'DBUS_SYSTEM_BUS_DEFAULT_ADDRESS' ) ,
'System bus PID file' : data_config . get ( 'DBUS_SYSTEM_PID_FILE' ) ,
'Session bus listens on' : data_config . get ( 'DBUS_SESSION_BUS_LISTEN_ADDRESS' ) ,
'Session clients connect to' : config . get ( 'DBUS_SESSION_BUS_CONNECT_ADDRESS' ) ,
'System bus user' : dbus_user ,
'Session bus services dir' :
get_option ( 'prefix' ) / get_option ( 'datadir' ) / 'dbus-1' / 'services' ,
'Tests socket dir' : test_socket_dir ,
}
if host_os . contains ( 'solaris' )
summary_dict + = {
'Console owner file' : console_owner_file ,
}
endif
summary ( summary_dict , bool_yn : true )
if embedded_tests
warning ( 'building with unit tests increases the size of the installed library and renders it insecure.' )
if not asserts
warning ( 'building with embedded tests but without assertions means tests may not properly report failures (this configuration is only useful when doing something like profiling the tests)' )
endif
endif
if get_option ( 'b_coverage' )
warning ( 'Building with coverage profiling is definitely for developers only.' )
endif
if verbose_mode
warning ( 'building with verbose mode increases library size, may slightly increase security risk, and decreases performance.' )
endif
if asserts
warning ( 'building with assertions increases library size and decreases performance.' )
endif
if not checks
warning ( 'building without checks for arguments passed to public API makes it harder to debug apps using D-Bus, but will slightly decrease D-Bus library size and _very_ slightly improve performance.' )
endif