2022-07-15 08:23:37 +02:00
project ( 'glib' , 'c' ,
2024-01-22 15:30:24 +01:00
version : '2.79.1' ,
2022-05-05 20:08:19 +02:00
# NOTE: See the policy in docs/meson-version.md before changing the Meson dependency
2023-10-24 17:46:36 +02:00
meson_version : '>= 1.2.0' ,
2016-12-09 20:30:22 +01:00
default_options : [
2018-03-29 03:37:38 +02:00
'buildtype=debugoptimized' ,
2021-09-27 14:43:00 +02:00
'warning_level=3' ,
2019-08-13 18:34:04 +02:00
'c_std=gnu99'
2016-12-09 20:30:22 +01:00
]
)
2013-08-07 22:41:12 +02:00
2023-04-05 17:07:58 +02:00
fs = import ( 'fs' )
2013-08-07 22:41:12 +02:00
cc = meson . get_compiler ( 'c' )
2022-09-14 04:15:58 +02:00
c_standards = { }
foreach std : [ '90' , '99' , '11' , '17' ]
arg = ( cc . get_id ( ) == 'msvc' ? '/std:' : '-std=' ) + 'c' + std
if cc . has_argument ( arg )
c_standards + = { std : arg }
endif
endforeach
2022-07-15 08:23:37 +02:00
have_cxx = add_languages ( 'cpp' , native : false , required : get_option ( 'oss_fuzz' ) . enabled ( ) )
if have_cxx
cxx = meson . get_compiler ( 'cpp' )
2022-09-13 18:26:40 +02:00
cxx_standards = { }
foreach std : [ '98' , '03' , '11' , '14' , '17' , '20' , '2b' , 'latest' ]
arg = ( cxx . get_id ( ) == 'msvc' ? '/std:' : '-std=' ) + 'c++' + std
if cxx . has_argument ( arg )
cxx_standards + = { std : arg }
endif
endforeach
2022-07-15 08:23:37 +02:00
endif
2013-08-07 22:41:12 +02:00
2022-03-08 15:48:36 +01:00
cc_can_run = meson . can_run_host_binaries ( )
2018-04-03 05:01:25 +02:00
2021-03-20 03:15:02 +01:00
if cc . get_argument_syntax ( ) == 'msvc'
2016-12-20 23:37:24 +01:00
# Ignore several spurious warnings for things glib does very commonly
2021-03-20 03:15:02 +01:00
# (also for clang-cl)
2023-03-21 15:21:18 +01:00
add_project_arguments ( '/FIglib/msvc_recommended_pragmas.h' , language : 'c' )
2021-03-20 03:15:02 +01:00
endif
if cc . get_id ( ) == 'msvc'
# Set the input and exec encoding to utf-8, like is the default with GCC
add_project_arguments ( cc . get_supported_arguments ( [ '/utf-8' ] ) , language : 'c' )
2016-12-20 23:37:24 +01:00
# Disable SAFESEH with MSVC for plugins and libs that use external deps that
# are built with MinGW
noseh_link_args = [ '/SAFESEH:NO' ]
else
noseh_link_args = [ ]
Revert "build-sys: drop -mms-bitfields GCC flag"
This reverts commit 252bbcd2078aadc67a49bacd5b2cd4fd348a8dd7.
After further discussion in !3511, we’ve decided that there are risks
associated with this change, and it’s not the best way of addressing the
original problem.
The original motivation for the change turned out to be that
`-mms-bitfields` was not handled by `windres`, which was receiving it
from `pkg-config --cflags glib-2.0` in some projects. However, if
`windres` is claiming to accept CFLAGS then it should accept (and
ignore) `-mms-bitfields`, since the `-m` family of options are defined
in `man gcc`, just like `-I`, `-D`, etc.
There is some question that there might still be third party projects
which are built with an old enough compiler that `-mms-bitfields` is not
the compiler default. For that reason, we should either still continue
to specify `-mms-bitfields` in the `.pc` file, or add a test to assert
that third party projects are always compiled with `-mms-bitfields` set.
But adding a new test for all third-party compilations is risky (if we
get it wrong, things will break; and it’s a test which may behave
differently on different platforms), so it seems safer to just keep
`-mms-bitfields` in `.pc` for now.
Once all compilers which we require specify `-mms-bitfields` by default,
we can finally drop this flag (without adding a test for third-party
compilations).
See: https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3511
2023-07-29 10:54:22 +02:00
# -mms-bitfields vs -fnative-struct ?
2016-12-20 23:37:24 +01:00
endif
2013-08-07 22:41:12 +02:00
2016-12-20 23:37:24 +01:00
host_system = host_machine . system ( )
2016-03-07 12:13:24 +01:00
2020-05-28 21:01:35 +02:00
if host_system == 'darwin'
ios_test_code = '' ' #include <TargetConditionals.h>
#if ! TARGET_OS_IPHONE
#error "Not iOS/tvOS/watchOS/iPhoneSimulator"
#endif'''
if cc . compiles ( ios_test_code , name : 'building for iOS' )
host_system = 'ios'
endif
endif
2023-08-10 20:10:01 +02:00
linux_libc = ''
if host_system == 'linux'
musl_test_code = '' ' #include <stdlib.h>
#if defined __GLIBC__ || defined __UCLIBC__
#error "Not in glibc or uclibc"
#endif'''
if cc . compiles ( musl_test_code , name : 'building for musl libc' )
linux_libc = 'musl'
endif
endif
2016-12-20 23:37:24 +01:00
glib_version = meson . project_version ( )
2016-12-07 11:28:33 +01:00
glib_api_version = '2.0'
2016-12-20 23:37:24 +01:00
version_arr = glib_version . split ( '.' )
2017-07-14 14:56:02 +02:00
major_version = version_arr [ 0 ] . to_int ( )
minor_version = version_arr [ 1 ] . to_int ( )
micro_version = version_arr [ 2 ] . to_int ( )
interface_age = minor_version . is_odd ( ) ? 0 : micro_version
binary_age = 100 * minor_version + micro_version
2016-12-20 23:37:24 +01:00
soversion = 0
# Maintain compatibility with previous libtool versioning
# current = minor * 100 + micro
2018-08-29 12:06:23 +02:00
current = binary_age - interface_age
library_version = '@0@.@1@.@2@' . format ( soversion , current , interface_age )
darwin_versions = [ current + 1 , '@0@.@1@' . format ( current + 1 , interface_age ) ]
2016-12-20 23:37:24 +01:00
configinc = include_directories ( '.' )
glibinc = include_directories ( 'glib' )
gobjectinc = include_directories ( 'gobject' )
gmoduleinc = include_directories ( 'gmodule' )
gioinc = include_directories ( 'gio' )
2023-10-16 16:24:08 +02:00
girepoinc = include_directories ( 'girepository' )
2016-12-20 23:37:24 +01:00
glib_prefix = get_option ( 'prefix' )
2017-07-17 11:54:28 +02:00
glib_bindir = join_paths ( glib_prefix , get_option ( 'bindir' ) )
2016-12-09 20:30:22 +01:00
glib_libdir = join_paths ( glib_prefix , get_option ( 'libdir' ) )
2018-07-16 19:39:44 +02:00
glib_libexecdir = join_paths ( glib_prefix , get_option ( 'libexecdir' ) )
2016-12-09 20:30:22 +01:00
glib_datadir = join_paths ( glib_prefix , get_option ( 'datadir' ) )
glib_pkgdatadir = join_paths ( glib_datadir , 'glib-2.0' )
2022-10-24 14:13:04 +02:00
glib_includedir = join_paths ( glib_prefix , get_option ( 'includedir' ) , 'glib-2.0' )
2020-02-07 17:34:13 +01:00
if get_option ( 'gio_module_dir' ) != ''
glib_giomodulesdir = join_paths ( glib_prefix , get_option ( 'gio_module_dir' ) )
else
2017-11-28 16:44:04 +01:00
glib_giomodulesdir = join_paths ( glib_libdir , 'gio' , 'modules' )
endif
2016-12-20 23:37:24 +01:00
gio: Optionally install trigger executables to architecture-specific paths
In Debian-style multiarch (libdir = lib/x86_64-linux-gnu or similar),
Red-Hat-style multilib (libdir = lib64 or lib) and Arch-style multilib
(libdir = lib or lib32), we have to run a separate version of
gio-querymodules to discover 32- or 64-bit modules on x86. Installing
modules in the directory used for each word size needs to trigger
recompilation of the correct modules list.
Debian, Fedora and Arch currently all have patches to facilitate this:
Debian moves gio-querymodules into ${libdir}/glib-2.0 and provides a
compat symlink in ${bindir}, while Fedora and Arch rename one or both
of the gio-querymodules executables to give it a -32 or -64 suffix.
We can avoid the need for these patches by making this a build option.
Doing this upstream has the advantage that the pkg-config metadata for
each architecture points to the correct executable and is in sync with
reality.
I'm using Debian's installation scheme with a separate directory here,
because the word-size suffix used in Fedora and Arch only works for the
common case of 32- and 64-bit multilib, and does not cover scenarios
where there can be more than one ABI with the same word size, such as
multiarch cross-compilation or alternative ABIs like x32.
Now that we have this infrastructure, it's also convenient to use it for
glib-compile-schemas. This works with /usr/share, so it only needs to
be run for one architecture (typically the system's primary
architecture), but using /usr/bin/glib-compile-schemas for the trigger
would result in either primary and secondary architectures trying to
overwrite each other's /usr/bin/glib-compile-schemas binaries, or a
circular dependency (the GLib library would have to depend on a
common package that contains glib-compile-schemas, but
glib-compile-schemas depends on the GLib library). Installing a
glib-compile-schemas binary in an architecture-specific location
alongside each GLib library bypasses this problem.
Signed-off-by: Simon McVittie <smcv@collabora.com>
2022-07-14 15:24:33 +02:00
if get_option ( 'multiarch' )
# For multiarch/multilib distributions, install each architecture's
# build of executables used in packaging triggers (like gio-querymodules)
# to an architecture-dependent location, with a compatibility symlink
# in the PATH.
multiarch_bindir = get_option ( 'libdir' ) / 'glib-2.0'
2022-07-14 15:28:11 +02:00
multiarch_libexecdir = multiarch_bindir
gio: Optionally install trigger executables to architecture-specific paths
In Debian-style multiarch (libdir = lib/x86_64-linux-gnu or similar),
Red-Hat-style multilib (libdir = lib64 or lib) and Arch-style multilib
(libdir = lib or lib32), we have to run a separate version of
gio-querymodules to discover 32- or 64-bit modules on x86. Installing
modules in the directory used for each word size needs to trigger
recompilation of the correct modules list.
Debian, Fedora and Arch currently all have patches to facilitate this:
Debian moves gio-querymodules into ${libdir}/glib-2.0 and provides a
compat symlink in ${bindir}, while Fedora and Arch rename one or both
of the gio-querymodules executables to give it a -32 or -64 suffix.
We can avoid the need for these patches by making this a build option.
Doing this upstream has the advantage that the pkg-config metadata for
each architecture points to the correct executable and is in sync with
reality.
I'm using Debian's installation scheme with a separate directory here,
because the word-size suffix used in Fedora and Arch only works for the
common case of 32- and 64-bit multilib, and does not cover scenarios
where there can be more than one ABI with the same word size, such as
multiarch cross-compilation or alternative ABIs like x32.
Now that we have this infrastructure, it's also convenient to use it for
glib-compile-schemas. This works with /usr/share, so it only needs to
be run for one architecture (typically the system's primary
architecture), but using /usr/bin/glib-compile-schemas for the trigger
would result in either primary and secondary architectures trying to
overwrite each other's /usr/bin/glib-compile-schemas binaries, or a
circular dependency (the GLib library would have to depend on a
common package that contains glib-compile-schemas, but
glib-compile-schemas depends on the GLib library). Installing a
glib-compile-schemas binary in an architecture-specific location
alongside each GLib library bypasses this problem.
Signed-off-by: Simon McVittie <smcv@collabora.com>
2022-07-14 15:24:33 +02:00
pkgconfig_multiarch_bindir = '${libdir}/glib-2.0'
else
# For single-architecture distributions, just install them into the PATH
# as was traditionally done.
multiarch_bindir = get_option ( 'bindir' )
2022-07-14 15:28:11 +02:00
multiarch_libexecdir = get_option ( 'libexecdir' )
gio: Optionally install trigger executables to architecture-specific paths
In Debian-style multiarch (libdir = lib/x86_64-linux-gnu or similar),
Red-Hat-style multilib (libdir = lib64 or lib) and Arch-style multilib
(libdir = lib or lib32), we have to run a separate version of
gio-querymodules to discover 32- or 64-bit modules on x86. Installing
modules in the directory used for each word size needs to trigger
recompilation of the correct modules list.
Debian, Fedora and Arch currently all have patches to facilitate this:
Debian moves gio-querymodules into ${libdir}/glib-2.0 and provides a
compat symlink in ${bindir}, while Fedora and Arch rename one or both
of the gio-querymodules executables to give it a -32 or -64 suffix.
We can avoid the need for these patches by making this a build option.
Doing this upstream has the advantage that the pkg-config metadata for
each architecture points to the correct executable and is in sync with
reality.
I'm using Debian's installation scheme with a separate directory here,
because the word-size suffix used in Fedora and Arch only works for the
common case of 32- and 64-bit multilib, and does not cover scenarios
where there can be more than one ABI with the same word size, such as
multiarch cross-compilation or alternative ABIs like x32.
Now that we have this infrastructure, it's also convenient to use it for
glib-compile-schemas. This works with /usr/share, so it only needs to
be run for one architecture (typically the system's primary
architecture), but using /usr/bin/glib-compile-schemas for the trigger
would result in either primary and secondary architectures trying to
overwrite each other's /usr/bin/glib-compile-schemas binaries, or a
circular dependency (the GLib library would have to depend on a
common package that contains glib-compile-schemas, but
glib-compile-schemas depends on the GLib library). Installing a
glib-compile-schemas binary in an architecture-specific location
alongside each GLib library bypasses this problem.
Signed-off-by: Simon McVittie <smcv@collabora.com>
2022-07-14 15:24:33 +02:00
pkgconfig_multiarch_bindir = '${bindir}'
endif
2017-07-14 14:56:47 +02:00
glib_pkgconfigreldir = join_paths ( glib_libdir , 'pkgconfig' )
2016-12-20 23:37:24 +01:00
2020-02-07 17:34:13 +01:00
if get_option ( 'charsetalias_dir' ) != ''
glib_charsetaliasdir = join_paths ( glib_prefix , get_option ( 'charsetalias_dir' ) )
else
glib_charsetaliasdir = glib_libdir
endif
2022-11-30 14:22:02 +01:00
glib_localstatedir = glib_prefix / get_option ( 'localstatedir' )
2021-02-24 12:58:49 +01:00
2022-11-30 14:45:34 +01:00
if get_option ( 'runtime_dir' ) != ''
glib_runstatedir = glib_prefix / get_option ( 'runtime_dir' )
else
# While we’ d normally prefix directories like this with, for example,
# glib_localstatedir, `/run` is a bit different in that it’ s for runtime state
# rather than data files, so it’ s typically functionally useless to use a
# prefixed version. No other processes will be using it. So we default to the
# unprefixed system `/run` directory.
glib_runstatedir = '/run'
endif
2023-07-19 15:14:14 +02:00
# When building glib and gobject-introspection with subprojects, gobject-introspection
# requires to know the path of the sources and the build directory for the subproject.
# We provide it here with a variable.
glib_source_dir = meson . current_source_dir ( )
glib_build_dir = meson . current_build_dir ( )
2018-07-16 19:39:44 +02:00
installed_tests_metadir = join_paths ( glib_datadir , 'installed-tests' , meson . project_name ( ) )
installed_tests_execdir = join_paths ( glib_libexecdir , 'installed-tests' , meson . project_name ( ) )
installed_tests_enabled = get_option ( 'installed_tests' )
2022-05-11 14:12:20 +02:00
installed_tests_template = files ( 'tests/template.test.in' )
installed_tests_template_tap = files ( 'tests/template-tap.test.in' )
2018-07-16 19:39:44 +02:00
2019-10-01 20:51:48 +02:00
# Don’ t build the tests unless we can run them (either natively, in an exe wrapper, or by installing them for later use)
2022-03-08 15:48:36 +01:00
build_tests = get_option ( 'tests' ) and ( meson . can_run_host_binaries ( ) or installed_tests_enabled )
2019-10-01 20:51:48 +02:00
2022-10-20 02:24:04 +02:00
common_test_env = [
'G_DEBUG=gc-friendly' ,
'G_ENABLE_DIAGNOSTIC=1' ,
'MALLOC_CHECK_=2' ,
]
2022-12-15 21:40:35 +01:00
# Note: this may cause the tests output not to be printed when running in
# verbose mode, see https://github.com/mesonbuild/meson/issues/11185
# Can be changed it to 'exitcode' if required during development.
test_protocol = 'tap'
2022-10-20 03:16:30 +02:00
test_timeout = 30
test_timeout_slow = 90
2022-10-20 02:24:04 +02:00
2022-10-19 20:08:15 +02:00
add_test_setup ( 'default' ,
is_default : true ,
exclude_suites : [ 'flaky' , 'failing' ] ,
2022-10-20 02:24:04 +02:00
env : common_test_env ,
2022-10-20 03:16:30 +02:00
timeout_multiplier : 2 ,
2022-10-19 20:08:15 +02:00
)
add_test_setup ( 'unstable_tests' ,
2022-10-20 02:24:04 +02:00
env : common_test_env ,
2022-10-20 03:16:30 +02:00
timeout_multiplier : 2 ,
2022-10-19 20:08:15 +02:00
# Empty test setup, used for having different results set for flaky tests
# Sadly we can't use (https://github.com/mesonbuild/meson/issues/10934):
#suites: ['flaky', 'unstable']
)
2022-06-16 12:01:04 +02:00
# Allow the tests to be easily run under valgrind using --setup=valgrind
valgrind = find_program ( 'valgrind' , required : false )
2023-04-05 17:07:58 +02:00
valgrind_suppression_file = files ( 'tools' / 'glib.supp' ) [ 0 ]
valgrind_suppression_file_install_subdir = 'glib-2.0' / 'valgrind'
2022-06-16 12:01:04 +02:00
2023-04-05 17:07:58 +02:00
if valgrind . found ( )
2022-06-16 12:01:04 +02:00
add_test_setup ( 'valgrind' ,
2022-10-19 20:08:15 +02:00
exclude_suites : [ 'no-valgrind' , 'flaky' ] ,
2022-06-16 12:01:04 +02:00
exe_wrapper : [
valgrind ,
'--tool=memcheck' ,
'--error-exitcode=1' ,
'--track-origins=yes' ,
'--leak-check=full' ,
'--leak-resolution=high' ,
'--num-callers=50' ,
'--show-leak-kinds=definite,possible' ,
'--show-error-list=yes' ,
'--suppressions=@0@' . format ( meson . project_source_root ( ) /
2023-04-05 17:07:58 +02:00
'@0@' . format ( valgrind_suppression_file ) ) ,
2022-06-16 12:01:04 +02:00
] ,
2022-10-20 02:24:04 +02:00
env : common_test_env ,
2022-10-20 03:16:30 +02:00
timeout_multiplier : 20 ,
2022-06-16 12:01:04 +02:00
)
endif
2017-08-09 22:29:13 +02:00
add_project_arguments ( '-D_GNU_SOURCE' , language : 'c' )
2021-01-19 23:17:11 +01:00
if host_system == 'qnx'
add_project_arguments ( '-D_QNX_SOURCE' , language : 'c' )
endif
2023-10-05 09:21:08 +02:00
if host_system == 'windows'
add_project_arguments ( [ '-DUNICODE' , '-D_UNICODE' ] , language : 'c' )
endif
2017-12-21 18:49:05 +01:00
# Disable strict aliasing;
# see https://bugzilla.gnome.org/show_bug.cgi?id=791622
2018-01-10 17:59:46 +01:00
if cc . has_argument ( '-fno-strict-aliasing' )
add_project_arguments ( '-fno-strict-aliasing' , language : 'c' )
endif
2017-12-21 18:49:05 +01:00
2022-04-08 14:50:57 +02:00
# dummy/empty dependency() object to declare fallbacks and simpler dependencies
not_found = dependency ( '' , required : false )
2016-12-20 23:37:24 +01:00
########################
# Configuration begins #
########################
2013-08-07 22:41:12 +02:00
glib_conf = configuration_data ( )
glibconfig_conf = configuration_data ( )
2016-03-07 12:13:24 +01:00
# accumulated list of defines as we check for them, so we can easily
# use them later in test programs (autoconf does this automatically)
glib_conf_prefix = ''
2013-08-07 22:41:12 +02:00
glib_conf . set ( 'GLIB_MAJOR_VERSION' , major_version )
glib_conf . set ( 'GLIB_MINOR_VERSION' , minor_version )
glib_conf . set ( 'GLIB_MICRO_VERSION' , micro_version )
2017-07-14 14:56:02 +02:00
glib_conf . set ( 'GLIB_INTERFACE_AGE' , interface_age )
glib_conf . set ( 'GLIB_BINARY_AGE' , binary_age )
2016-12-09 20:30:22 +01:00
glib_conf . set_quoted ( 'GETTEXT_PACKAGE' , 'glib20' )
2018-05-31 23:44:02 +02:00
glib_conf . set_quoted ( 'PACKAGE_BUGREPORT' , 'https://gitlab.gnome.org/GNOME/glib/issues/new' )
2016-12-09 20:30:22 +01:00
glib_conf . set_quoted ( 'PACKAGE_NAME' , 'glib' )
glib_conf . set_quoted ( 'PACKAGE_STRING' , 'glib @0@' . format ( meson . project_version ( ) ) )
glib_conf . set_quoted ( 'PACKAGE_TARNAME' , 'glib' )
glib_conf . set_quoted ( 'PACKAGE_URL' , '' )
glib_conf . set_quoted ( 'PACKAGE_VERSION' , meson . project_version ( ) )
2013-08-07 22:41:12 +02:00
glib_conf . set ( 'ENABLE_NLS' , 1 )
2016-03-07 12:13:24 +01:00
2018-05-27 21:21:15 +02:00
# used by the .rc.in files
glibconfig_conf . set ( 'LT_CURRENT_MINUS_AGE' , soversion )
2016-03-07 12:13:24 +01:00
glib_conf . set ( '_GNU_SOURCE' , 1 )
2013-08-07 22:41:12 +02:00
2022-03-28 13:59:59 +02:00
if host_system in [ 'windows' , 'darwin' ]
# Poll doesn't work on devices on Windows, and macOS's poll() implementation is known to be broken
2016-12-20 23:37:24 +01:00
glib_conf . set ( 'BROKEN_POLL' , true )
endif
2019-07-09 18:22:51 +02:00
if host_system == 'windows' and cc . get_id ( ) != 'msvc' and cc . get_id ( ) != 'clang-cl'
2018-08-05 21:56:38 +02:00
# FIXME: Ideally we shouldn't depend on this on Windows and should use
# 64 bit capable Windows API that also works with MSVC.
# The autotools build did set this for mingw and while meson sets it
# for gcc/clang by default, it doesn't do so on Windows.
glib_conf . set ( '_FILE_OFFSET_BITS' , 64 )
endif
2022-10-20 00:51:34 +02:00
glib_build_shared = false
glib_build_static = false
if get_option ( 'default_library' ) == 'both'
glib_build_static = true
glib_build_shared = true
elif get_option ( 'default_library' ) == 'static'
glib_build_static = true
elif get_option ( 'default_library' ) == 'shared'
glib_build_shared = true
endif
glib_build_both = glib_build_static and glib_build_shared
glib_build_static_only = glib_build_static and not glib_build_shared
glib_build_shared_only = glib_build_shared and not glib_build_static
if glib_build_shared and glib_build_static and (
host_system == 'windows' or host_system == 'cygwin' )
2022-10-03 16:36:04 +02:00
error ( 'On Windows default_library must be "shared" or "static" but not "both"' )
2016-12-20 23:37:24 +01:00
endif
2022-10-20 00:51:34 +02:00
if glib_build_static_only
2022-01-19 14:19:05 +01:00
glibconfig_conf . set ( 'GLIB_STATIC_COMPILATION' , '1' )
glibconfig_conf . set ( 'GOBJECT_STATIC_COMPILATION' , '1' )
2022-10-03 16:36:04 +02:00
glibconfig_conf . set ( 'GIO_STATIC_COMPILATION' , '1' )
glibconfig_conf . set ( 'GMODULE_STATIC_COMPILATION' , '1' )
2022-01-19 14:19:05 +01:00
glibconfig_conf . set ( 'G_INTL_STATIC_COMPILATION' , '1' )
glibconfig_conf . set ( 'FFI_STATIC_BUILD' , '1' )
2017-07-16 16:41:02 +02:00
endif
2019-03-20 20:05:19 +01:00
# Cygwin glib port maintainers made it clear
# (via the patches they apply) that they want no
# part of glib W32 code, therefore we do not define
# G_PLATFORM_WIN32 for host_system == 'cygwin'.
# This makes G_PLATFORM_WIN32 a synonym for
# G_OS_WIN32.
2016-12-20 23:37:24 +01:00
if host_system == 'windows'
2013-08-07 22:41:12 +02:00
glib_os = '' ' #define G_OS_WIN32
2016-12-20 23:37:24 +01:00
#define G_PLATFORM_WIN32'''
2019-03-20 20:05:19 +01:00
elif host_system == 'cygwin'
2019-05-21 18:54:34 +02:00
glib_os = '' ' #define G_OS_UNIX
2019-03-20 20:05:19 +01:00
#define G_WITH_CYGWIN'''
2013-08-07 22:41:12 +02:00
else
glib_os = '#define G_OS_UNIX'
endif
glibconfig_conf . set ( 'glib_os' , glib_os )
2020-03-12 13:12:27 +01:00
# We need to know the CRT being used to determine what .lib files we need on
# Visual Studio for dependencies that don't normally come with pkg-config files
vs_crt = 'release'
vs_crt_opt = get_option ( 'b_vscrt' )
if vs_crt_opt in [ 'mdd' , 'mtd' ]
vs_crt = 'debug'
elif vs_crt_opt == 'from_buildtype'
if get_option ( 'buildtype' ) == 'debug'
vs_crt = 'debug'
endif
endif
2017-08-15 11:08:47 +02:00
2020-03-04 20:06:50 +01:00
# Use debug/optimization flags to determine whether to enable debug or disable
Improve default value of glib_debug option
glib_debug is an auto option. This is clever because it allows us to
guess the best default based on the build type, while also allowing an
easy way to override if the guess is not good. Sadly, the attempt to
guess based on the build type does not work well. For example, it
considers debugoptimized builds to be debug builds, but despite the
name, it is definitely a release build type (except on Windows, which
we'll ignore here). The minsize build type has the exact same problem.
The debug option is true for both build types, but this only controls
whether debuginfo is enabled, not whether debug extras are enabled.
The plain build type has a different problem: debug is off, but the
optimization option is off too, even though plain builds are distro
builds are will almost always use optimization.
I've outlined an argument for why we should make these changes here:
https://blogs.gnome.org/mcatanzaro/2022/07/15/best-practices-for-build-options/
Specifically, Rule 4 shows all the build types and whether they
correspond to release builds or debug builds. Rule 6 argues that we
should provide good defaults for plain builds.
2022-08-03 23:58:42 +02:00
# cast checks. We have a non-production (debug) build if debug is true and if
# optimization is 0 or g; otherwise, we have a production build.
2018-03-29 03:37:38 +02:00
glib_debug_cflags = [ ]
2021-01-20 00:37:22 +01:00
glib_debug = get_option ( 'glib_debug' )
2022-10-14 17:34:22 +02:00
if ( glib_debug . enabled ( ) or (
glib_debug . auto ( ) and get_option ( 'debug' ) and get_option ( 'optimization' ) in [ '0' , 'g' ] ) )
2018-03-29 03:37:38 +02:00
glib_debug_cflags + = [ '-DG_ENABLE_DEBUG' ]
2020-03-04 20:06:50 +01:00
message ( 'Enabling various debug infrastructure' )
2022-10-14 17:34:22 +02:00
else
2018-03-29 03:37:38 +02:00
glib_debug_cflags + = [ '-DG_DISABLE_CAST_CHECKS' ]
2020-03-04 20:06:50 +01:00
message ( 'Disabling cast checks' )
2018-03-29 03:37:38 +02:00
endif
2020-04-08 21:14:31 +02:00
if not get_option ( 'glib_assert' )
glib_debug_cflags + = [ '-DG_DISABLE_ASSERT' ]
message ( 'Disabling GLib asserts' )
endif
if not get_option ( 'glib_checks' )
glib_debug_cflags + = [ '-DG_DISABLE_CHECKS' ]
message ( 'Disabling GLib checks' )
endif
2018-03-29 03:37:38 +02:00
add_project_arguments ( glib_debug_cflags , language : 'c' )
2016-03-07 12:13:24 +01:00
# check for header files
headers = [
2016-12-21 04:20:30 +01:00
'alloca.h' ,
2022-01-18 21:00:00 +01:00
'afunix.h' ,
2018-05-28 13:03:32 +02:00
'crt_externs.h' ,
'dirent.h' , # MSC does not come with this by default
2016-12-21 04:20:30 +01:00
'float.h' ,
2018-05-28 13:03:32 +02:00
'fstab.h' ,
2016-12-21 04:20:30 +01:00
'grp.h' ,
2018-05-28 13:03:32 +02:00
'inttypes.h' ,
2023-11-06 15:46:52 +01:00
'libproc.h' ,
2018-05-28 13:03:32 +02:00
'limits.h' ,
'locale.h' ,
'mach/mach_time.h' ,
'memory.h' ,
'mntent.h' ,
2016-12-21 04:20:30 +01:00
'poll.h' ,
2018-05-28 13:03:32 +02:00
'pwd.h' ,
'sched.h' ,
2018-09-24 08:36:35 +02:00
'spawn.h' ,
2017-07-21 19:40:48 +02:00
'stdatomic.h' ,
2018-05-28 13:03:32 +02:00
'stdint.h' ,
'stdlib.h' ,
'string.h' ,
'strings.h' ,
2018-05-31 11:31:23 +02:00
'sys/auxv.h' ,
2018-05-28 13:03:32 +02:00
'sys/event.h' ,
'sys/filio.h' ,
'sys/inotify.h' ,
'sys/mkdev.h' ,
'sys/mntctl.h' ,
'sys/mnttab.h' ,
'sys/mount.h' ,
2016-12-21 04:20:30 +01:00
'sys/param.h' ,
2023-07-24 18:08:25 +02:00
'sys/prctl.h' ,
2016-12-21 04:20:30 +01:00
'sys/resource.h' ,
'sys/select.h' ,
'sys/statfs.h' ,
2018-05-28 13:03:32 +02:00
'sys/stat.h' ,
2016-12-21 04:20:30 +01:00
'sys/statvfs.h' ,
2018-05-28 13:03:32 +02:00
'sys/sysctl.h' ,
2017-07-17 06:49:24 +02:00
'sys/time.h' , # MSC does not come with this by default
2016-12-21 04:20:30 +01:00
'sys/times.h' ,
2018-05-28 13:03:32 +02:00
'sys/types.h' ,
'sys/uio.h' ,
'sys/vfs.h' ,
'sys/vfstab.h' ,
'sys/vmount.h' ,
2016-12-21 04:20:30 +01:00
'sys/wait.h' ,
2023-12-22 09:54:43 +01:00
'syslog.h' ,
2018-05-28 13:03:32 +02:00
'termios.h' ,
2016-12-21 04:20:30 +01:00
'unistd.h' ,
'values.h' ,
2019-05-22 19:26:41 +02:00
'wchar.h' ,
2018-05-28 13:03:32 +02:00
'xlocale.h' ,
2016-03-07 12:13:24 +01:00
]
foreach h : headers
2016-12-21 04:20:30 +01:00
if cc . has_header ( h )
define = 'HAVE_' + h . underscorify ( ) . to_upper ( )
glib_conf . set ( define , 1 )
glib_conf_prefix = glib_conf_prefix + '#define @0@ 1\n' . format ( define )
2016-03-07 12:13:24 +01:00
endif
endforeach
2022-05-12 12:18:42 +02:00
# FreeBSD includes a malloc.h which always throws compilation error, so we have
# to use check_header() rather than has_header().
if cc . check_header ( 'malloc.h' )
2018-05-26 06:14:35 +02:00
glib_conf . set ( 'HAVE_MALLOC_H' , 1 )
glib_conf_prefix = glib_conf_prefix + '#define HAVE_MALLOC_H 1\n'
endif
2023-05-07 23:45:00 +02:00
if cc . check_header ( 'linux/netlink.h' )
2016-12-21 04:20:30 +01:00
glib_conf . set ( 'HAVE_NETLINK' , 1 )
endif
2020-08-14 17:04:37 +02:00
# Is statx() supported? Android systems don’ t reliably support it as of August 2020.
statx_code = '' '
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <sys/stat.h>
#include <fcntl.h>
int main ( void )
{
struct statx stat_buf ;
return statx ( AT_FDCWD , " / " , AT_SYMLINK_NOFOLLOW , STATX_BASIC_STATS | STATX_BTIME , & stat_buf ) ;
}
'' '
if host_system != 'android' and cc . compiles ( statx_code , name : 'statx() test' )
glib_conf . set ( 'HAVE_STATX' , 1 )
endif
2016-03-07 12:13:24 +01:00
if glib_conf . has ( 'HAVE_LOCALE_H' )
2016-12-20 23:37:24 +01:00
if cc . has_header_symbol ( 'locale.h' , 'LC_MESSAGES' )
2016-03-07 12:13:24 +01:00
glib_conf . set ( 'HAVE_LC_MESSAGES' , 1 )
endif
2013-08-07 22:41:12 +02:00
endif
2016-03-07 12:13:24 +01:00
struct_stat_blkprefix = '' '
#include <sys/types.h>
#include <sys/stat.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_SYS_STATFS_H
#include <sys/statfs.h>
#endif
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
#ifdef HAVE_SYS_MOUNT_H
#include <sys/mount.h>
#endif
'' '
struct_members = [
2016-12-21 04:20:30 +01:00
[ 'stat' , 'st_mtimensec' ] ,
[ 'stat' , 'st_mtim.tv_nsec' ] ,
[ 'stat' , 'st_atimensec' ] ,
[ 'stat' , 'st_atim.tv_nsec' ] ,
[ 'stat' , 'st_ctimensec' ] ,
[ 'stat' , 'st_ctim.tv_nsec' ] ,
[ 'stat' , 'st_birthtime' ] ,
[ 'stat' , 'st_birthtimensec' ] ,
[ 'stat' , 'st_birthtim' ] ,
[ 'stat' , 'st_birthtim.tv_nsec' ] ,
[ 'stat' , 'st_blksize' , struct_stat_blkprefix ] ,
[ 'stat' , 'st_blocks' , struct_stat_blkprefix ] ,
[ 'statfs' , 'f_fstypename' , struct_stat_blkprefix ] ,
[ 'statfs' , 'f_bavail' , struct_stat_blkprefix ] ,
[ 'dirent' , 'd_type' , '' ' #include <sys/types.h>
#include <dirent.h>''' ],
2018-06-14 20:32:49 +02:00
[ 'statvfs' , 'f_basetype' , '#include <sys/statvfs.h>' ] ,
[ 'statvfs' , 'f_fstypename' , '#include <sys/statvfs.h>' ] ,
[ 'tm' , 'tm_gmtoff' , '#include <time.h>' ] ,
[ 'tm' , '__tm_gmtoff' , '#include <time.h>' ] ,
2016-03-07 12:13:24 +01:00
]
foreach m : struct_members
header_check_prefix = glib_conf_prefix
2016-12-21 04:20:30 +01:00
if m . length ( ) == 3
header_check_prefix = header_check_prefix + m [ 2 ]
2016-03-07 12:13:24 +01:00
else
header_check_prefix = header_check_prefix + '#include <sys/stat.h>'
endif
if cc . has_member ( 'struct ' + m [ 0 ] , m [ 1 ] , prefix : header_check_prefix )
2016-12-21 04:20:30 +01:00
define = 'HAVE_STRUCT_@0@_@1@' . format ( m [ 0 ] . to_upper ( ) , m [ 1 ] . underscorify ( ) . to_upper ( ) )
glib_conf . set ( define , 1 )
glib_conf_prefix = glib_conf_prefix + '#define @0@ 1\n' . format ( define )
2016-03-07 12:13:24 +01:00
else
endif
endforeach
2018-02-16 18:14:08 +01:00
# Compiler flags
if cc . get_id ( ) == 'gcc' or cc . get_id ( ) == 'clang'
2021-11-18 14:53:45 +01:00
warning_common_args = [
2018-02-16 18:14:08 +01:00
'-Wduplicated-branches' ,
2018-09-02 20:47:48 +02:00
'-Wimplicit-fallthrough' ,
2018-05-30 11:12:01 +02:00
'-Wmisleading-indentation' ,
2022-11-16 11:42:29 +01:00
'-Wmissing-field-initializers' ,
2022-11-18 14:33:20 +01:00
'-Wnonnull' ,
2018-05-25 14:38:29 +02:00
'-Wunused' ,
2019-02-07 13:01:16 +01:00
# Due to maintained deprecated code, we do not want to see unused parameters
'-Wno-unused-parameter' ,
2018-07-10 17:44:22 +02:00
# Due to pervasive use of things like GPOINTER_TO_UINT(), we do not support
# building with -Wbad-function-cast.
2019-01-27 12:11:09 +01:00
'-Wno-cast-function-type' ,
2019-01-23 14:38:40 +01:00
# Due to function casts through (void*) we cannot support -Wpedantic:
2023-05-02 15:26:52 +02:00
# ./docs/toolchain-requirements.md#Function_pointer_conversions.
2019-01-23 14:38:40 +01:00
'-Wno-pedantic' ,
2020-04-27 15:19:35 +02:00
# A zero-length format string shouldn't be considered an issue.
'-Wno-format-zero-length' ,
2021-11-18 12:58:18 +01:00
# We explicitly require variadic macros
'-Wno-variadic-macros' ,
2018-02-16 18:14:08 +01:00
'-Werror=format=2' ,
'-Werror=init-self' ,
'-Werror=missing-include-dirs' ,
'-Werror=pointer-arith' ,
2022-07-06 16:07:43 +02:00
'-Werror=unused-result' ,
2018-02-16 18:14:08 +01:00
]
2021-11-18 14:53:45 +01:00
warning_c_args = warning_common_args + [
'-Wstrict-prototypes' ,
# Due to pervasive use of things like GPOINTER_TO_UINT(), we do not support
# building with -Wbad-function-cast.
'-Wno-bad-function-cast' ,
'-Werror=implicit-function-declaration' ,
'-Werror=missing-prototypes' ,
2022-07-12 15:17:41 +02:00
'-Werror=pointer-sign' ,
2022-10-29 14:23:40 +02:00
'-Wno-string-plus-int' ,
2021-11-18 14:53:45 +01:00
]
warning_cxx_args = warning_common_args
warning_objc_args = warning_c_args
2018-11-14 15:38:33 +01:00
warning_c_link_args = [
2018-04-24 22:36:50 +02:00
'-Wl,-z,nodelete' ,
]
if get_option ( 'bsymbolic_functions' )
2018-11-14 15:38:33 +01:00
warning_c_link_args + = [ '-Wl,-Bsymbolic-functions' ]
2018-04-24 22:36:50 +02:00
endif
2022-04-04 19:05:25 +02:00
elif cc . get_id ( ) == 'msvc'
warning_c_args = [
# If a warning is completely useless and spammy, use '/wdXXXX' to suppress it
# If a warning is harmless but hard to fix, use '/woXXXX' so it's shown once
# NOTE: Only add warnings here if you are sure they're spurious
'/wo4057' , # 'operator': 'identifier1' differs in indirection to slightly different base types from 'identifier2'
'/wd4068' , # unknown pragma
'/wo4090' , # 'operation': different 'modifier' qualifiers
'/wd4100' , # 'identifier': unreferenced formal parameter
'/wd4116' , # unnamed type definition in parentheses
'/wo4125' , # decimal digit terminates octal escape sequence
'/wd4127' , # conditional expression is constant
'/wd4146' , # unary minus operator applied to unsigned type, result still unsigned
'/wd4152' , # nonstandard extension, function/data pointer conversion in expression
'/wd4201' , # nonstandard extension used: nameless struct/union
'/wd4232' , # nonstandard extension used: 'identifier': address of dllimport 'dllimport' is not static, identity not guaranteed
'/wo4245' , # 'conversion_type': conversion from 'type1' to 'type2', signed/unsigned mismatch
'/wo4267' , # 'variable': conversion from 'size_t' to 'type', possible loss of data
'/wd4334' , # 'shift_operator': result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?)
'/wo4389' , # 'operator': signed/unsigned mismatch
'/wo4702' , # unreachable code
'/wd4706' , # assignment within conditional expression
]
warning_cxx_args = [ ]
warning_objc_args = [ ]
warning_c_link_args = [ ]
2018-02-16 18:14:08 +01:00
else
2018-11-14 15:38:33 +01:00
warning_c_args = [ ]
2021-11-18 14:53:45 +01:00
warning_cxx_args = [ ]
warning_objc_args = [ ]
2018-11-14 15:38:33 +01:00
warning_c_link_args = [ ]
2018-02-16 18:14:08 +01:00
endif
2018-11-14 15:38:33 +01:00
add_project_arguments ( cc . get_supported_arguments ( warning_c_args ) , language : 'c' )
2022-07-15 08:23:37 +02:00
if have_cxx
add_project_arguments ( cxx . get_supported_arguments ( warning_cxx_args ) , language : 'cpp' )
endif
2018-05-01 15:44:19 +02:00
# FIXME: We cannot build some of the GResource tests with -z nodelete, which
# means we cannot use that flag in add_project_link_arguments(), and must add
# it to the relevant targets manually. We do the same with -Bsymbolic-functions
# because that is what the autotools build did.
# See https://github.com/mesonbuild/meson/pull/3520 for a way to eventually
# improve this.
2018-11-14 15:38:33 +01:00
glib_link_flags = cc . get_supported_link_arguments ( warning_c_link_args )
2018-02-16 18:14:08 +01:00
2019-08-14 07:13:49 +02:00
# Windows SDK requirements and checks
2017-07-18 16:19:54 +02:00
if host_system == 'windows'
2019-08-14 07:13:49 +02:00
# Check whether we're building for UWP apps
code = '' '
#include <windows.h>
#if !(WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP))
#error "Not building for UWP"
#endif'''
if cc . compiles ( code , name : 'building for UWP' )
glib_conf . set ( 'G_WINAPI_ONLY_APP' , true )
# We require Windows 10+ on WinRT
glib_conf . set ( '_WIN32_WINNT' , '0x0A00' )
2020-06-04 17:13:33 +02:00
uwp_gio_deps = [ cc . find_library ( 'shcore' ) ,
cc . find_library ( 'runtimeobject' ) ]
2019-08-14 07:13:49 +02:00
else
# We require Windows 7+ on Win32
glib_conf . set ( '_WIN32_WINNT' , '0x0601' )
2020-06-04 17:13:33 +02:00
uwp_gio_deps = [ ]
2019-08-14 07:13:49 +02:00
endif
2017-07-18 16:19:54 +02:00
endif
2016-03-07 12:13:24 +01:00
functions = [
2023-02-19 14:19:37 +01:00
'accept4' ,
2020-10-12 19:10:45 +02:00
'close_range' ,
2023-03-17 14:17:40 +01:00
'copy_file_range' ,
2018-05-28 13:03:32 +02:00
'endmntent' ,
'endservent' ,
2021-01-19 22:14:41 +01:00
'epoll_create' ,
2018-05-28 13:03:32 +02:00
'fallocate' ,
2016-12-21 04:20:30 +01:00
'fchmod' ,
'fchown' ,
2018-05-28 13:03:32 +02:00
'fdwalk' ,
2023-01-25 15:12:20 +01:00
'free_aligned_sized' ,
'free_sized' ,
2018-05-28 13:03:32 +02:00
'fsync' ,
2023-11-26 23:08:46 +01:00
'ftruncate64' ,
2018-10-27 19:37:39 +02:00
'getauxval' ,
2018-05-28 13:03:32 +02:00
'getc_unlocked' ,
2016-12-21 04:20:30 +01:00
'getfsstat' ,
2018-05-28 13:03:32 +02:00
'getgrgid_r' ,
'getmntent_r' ,
'getpwuid_r' ,
'getresuid' ,
2016-12-21 04:20:30 +01:00
'getvfsstat' ,
'gmtime_r' ,
2018-05-28 13:03:32 +02:00
'hasmntopt' ,
'inotify_init1' ,
'issetugid' ,
'kevent' ,
'kqueue' ,
'lchmod' ,
'lchown' ,
'link' ,
'localtime_r' ,
'lstat' ,
2016-12-21 04:20:30 +01:00
'mbrtowc' ,
2018-05-28 13:03:32 +02:00
'memalign' ,
'mmap' ,
2016-12-21 04:20:30 +01:00
'newlocale' ,
2018-05-28 13:03:32 +02:00
'pipe2' ,
'poll' ,
'prlimit' ,
'readlink' ,
'recvmmsg' ,
'sendmmsg' ,
'setenv' ,
'setmntent' ,
'strerror_r' ,
'strnlen' ,
'strsignal' ,
2016-12-21 04:20:30 +01:00
'strtod_l' ,
'strtoll_l' ,
'strtoull_l' ,
2018-05-28 13:03:32 +02:00
'symlink' ,
'timegm' ,
'unsetenv' ,
'uselocale' ,
'utimes' ,
2021-07-02 15:10:44 +02:00
'utimensat' ,
2018-05-28 13:03:32 +02:00
'valloc' ,
'vasprintf' ,
'vsnprintf' ,
'wcrtomb' ,
'wcslen' ,
'wcsnlen' ,
2018-06-14 20:51:08 +02:00
'sysctlbyname' ,
2016-03-07 12:13:24 +01:00
]
2020-05-28 21:01:35 +02:00
# _NSGetEnviron is available on iOS too, but its usage gets apps rejected from
# the app store since it's considered 'private API'
if host_system == 'darwin'
functions + = [ '_NSGetEnviron' ]
endif
2016-03-07 12:13:24 +01:00
if glib_conf . has ( 'HAVE_SYS_STATVFS_H' )
2016-12-21 04:20:30 +01:00
functions + = [ 'statvfs' ]
2016-12-20 23:37:24 +01:00
else
have_func_statvfs = false
2013-08-07 22:41:12 +02:00
endif
2016-03-07 12:13:24 +01:00
if glib_conf . has ( 'HAVE_SYS_STATFS_H' ) or glib_conf . has ( 'HAVE_SYS_MOUNT_H' )
2016-12-21 04:20:30 +01:00
functions + = [ 'statfs' ]
2016-12-20 23:37:24 +01:00
else
have_func_statfs = false
2013-08-07 22:41:12 +02:00
endif
2023-07-24 18:08:25 +02:00
if glib_conf . has ( 'HAVE_SYS_PRCTL_H' )
functions + = [ 'prctl' ]
else
have_func_prctl = false
endif
2016-03-07 12:13:24 +01:00
2017-07-18 16:19:54 +02:00
if host_system == 'windows'
iphlpapi_dep = cc . find_library ( 'iphlpapi' )
iphlpapi_funcs = [ 'if_nametoindex' , 'if_indextoname' ]
foreach ifunc : iphlpapi_funcs
2018-05-29 13:40:09 +02:00
iphl_prefix = '' ' #define _WIN32_WINNT @0@
#include <winsock2.h>
#include <iphlpapi.h>'''.format(glib_conf.get('_WIN32_WINNT'))
2017-07-18 16:19:54 +02:00
if cc . has_function ( ifunc ,
2018-05-29 13:40:09 +02:00
prefix : iphl_prefix ,
2017-07-18 16:19:54 +02:00
dependencies : iphlpapi_dep )
idefine = 'HAVE_' + ifunc . underscorify ( ) . to_upper ( )
glib_conf . set ( idefine , 1 )
glib_conf_prefix = glib_conf_prefix + '#define @0@ 1\n' . format ( idefine )
set_variable ( 'have_func_' + ifunc , true )
else
set_variable ( 'have_func_' + ifunc , false )
endif
endforeach
else
functions + = [ 'if_indextoname' , 'if_nametoindex' ]
endif
2016-03-07 12:13:24 +01:00
# AIX splice is something else
2016-12-20 23:37:24 +01:00
if host_system != 'aix'
2016-12-21 04:20:30 +01:00
functions + = [ 'splice' ]
2013-08-07 22:41:12 +02:00
endif
2016-03-07 12:13:24 +01:00
foreach f : functions
2016-12-21 04:20:30 +01:00
if cc . has_function ( f )
define = 'HAVE_' + f . underscorify ( ) . to_upper ( )
glib_conf . set ( define , 1 )
glib_conf_prefix = glib_conf_prefix + '#define @0@ 1\n' . format ( define )
set_variable ( 'have_func_' + f , true )
2016-03-07 12:13:24 +01:00
else
2016-12-21 04:20:30 +01:00
set_variable ( 'have_func_' + f , false )
2016-03-07 12:13:24 +01:00
endif
endforeach
2023-05-30 14:43:38 +02:00
# Export the information about free_sized() so we can correctly define a macro
# wrapper around g_free()/g_free_sized() depending on whether it’ s available
glibconfig_conf . set ( 'G_HAVE_FREE_SIZED' , have_func_free_sized )
2020-03-31 22:54:17 +02:00
# Check that stpcpy() is usable; must use header.
2022-10-24 20:43:03 +02:00
# See:
2020-03-31 22:54:17 +02:00
# https://github.com/mesonbuild/meson/issues/5628.
2022-10-24 20:43:03 +02:00
if cc . has_function ( 'stpcpy' , prefix : '#include <string.h>' )
2018-03-21 10:52:10 +01:00
glib_conf . set ( 'HAVE_STPCPY' , 1 )
endif
2022-01-06 19:03:16 +01:00
if cc . has_function ( 'memalign' , prefix : '#include <stdlib.h>\n#include <malloc.h>' )
glib_conf . set ( 'HAVE_MEMALIGN' , 1 )
endif
2023-08-11 12:08:42 +02:00
# For example on Openbsd, getservbyname_r() has a different signature.
# https://man.openbsd.org/getservbyname.3
if cc . compiles ( '' ' #include <netdb.h>
int main ( int argc , char * * argv ) {
int ( * fcn ) ( const char * ,
const char * ,
struct servent * ,
char * ,
size_t ,
struct servent * * ) = getservbyname_r ;
( void ) fcn ;
return 0 ;
} '' ' ,
name : 'getservbyname_r()' ,
args : '-Werror=incompatible-pointer-types' )
glib_conf . set ( 'HAVE_GETSERVBYNAME_R' , 1 )
endif
2022-01-06 19:03:16 +01:00
if cc . has_function ( '_aligned_malloc' , prefix : '#include <malloc.h>' )
glib_conf . set ( 'HAVE__ALIGNED_MALLOC' , 1 )
endif
if host_system != 'windows' and cc . has_function ( 'aligned_alloc' , prefix : '#include <stdlib.h>' )
glib_conf . set ( 'HAVE_ALIGNED_ALLOC' , 1 )
endif
if host_system != 'windows' and cc . has_function ( 'posix_memalign' , prefix : '#include <stdlib.h>' )
2018-03-21 10:52:10 +01:00
glib_conf . set ( 'HAVE_POSIX_MEMALIGN' , 1 )
endif
gspawn: Optimize with posix_spawn codepath
When the amount of free memory on the system is somewhat low, gnome-shell
will sometimes fail to launch apps, reporting the error:
fork(): Cannot allocate memory
fork() is failing here because while cloning the process virtual address
space, Linux worries that the thread being forked may end up COWing the
entire address space of the parent process (gnome-shell, which is
memory-hungry), and there is not enough free memory to permit that to
happen.
In this case we are simply calling fork() in order to quickly call exec(),
which will throw away the entirity of the duplicated VM, so we should
look for ways to avoid the overcommit check.
The well known solution to this is to use clone(CLONE_VM) or vfork(), which
completely avoids creating a new memory address space for the child.
However, that comes with a bunch of caveats and complications:
https://gist.github.com/nicowilliams/a8a07b0fc75df05f684c23c18d7db234
https://ewontfix.com/7/
In 2016, glibc's posix_spawn() was rewritten to use this approach
while also resolving the concerns.
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=9ff72da471a509a8c19791efe469f47fa6977410
I experimented with a similar approach in glib, but it was not practical
because glibc has several items of important internal knowledge (such as
knowing which signals should be given special treatment because they are
NPTL implementation details) that are not cleanly exposed elsewhere.
Instead, this patch adapts the gspawn code to use posix_spawn() where
possible, which will reap the benefits of that implementation.
The posix_spawn API is more limited than the gspawn API though,
partly due to natural limitations of using CLONE_VM, so the posix_spawn
path is added as a separate codepath which is only executed when the
conditions are right. Callers such as gnome-shell will have to be modified
to meet these conditions, such as not having a child_setup function.
In addition to allowing for the gnome-shell "Cannot allocate memory"
failure to be avoided, this should result in a general speedup in this
area, because fork()'s behaviour of cloning the entire VM space
has a cost which is now avoided. posix_spawn() has also recently
been optimized on OpenSolaris as the most performant way to spawn
a child process.
2018-05-28 22:45:45 +02:00
# Check that posix_spawn() is usable; must use header
if cc . has_function ( 'posix_spawn' , prefix : '#include <spawn.h>' )
glib_conf . set ( 'HAVE_POSIX_SPAWN' , 1 )
endif
2017-07-19 11:34:45 +02:00
# Check whether strerror_r returns char *
if have_func_strerror_r
if cc . compiles ( '' ' #define _GNU_SOURCE
#include <string.h>
int func ( void ) {
char error_string [ 256 ] ;
char * ptr = strerror_r ( - 2 , error_string , 256 ) ;
char c = * strerror_r ( - 2 , error_string , 256 ) ;
return c != 0 & & ptr != ( void * ) 0 L ;
}
'' ' ,
name : 'strerror_r() returns char *' )
glib_conf . set ( 'STRERROR_R_CHAR_P' , 1 ,
description : 'Defined if strerror_r returns char *' )
endif
endif
2016-12-20 23:37:24 +01:00
# Special-case these functions that have alternative names on Windows/MSVC
if cc . has_function ( 'snprintf' ) or cc . has_header_symbol ( 'stdio.h' , 'snprintf' )
glib_conf . set ( 'HAVE_SNPRINTF' , 1 )
glib_conf_prefix = glib_conf_prefix + '#define HAVE_SNPRINTF 1\n'
elif cc . has_function ( '_snprintf' ) or cc . has_header_symbol ( 'stdio.h' , '_snprintf' )
hack_define = '1\n#define snprintf _snprintf'
glib_conf . set ( 'HAVE_SNPRINTF' , hack_define )
glib_conf_prefix = glib_conf_prefix + '#define HAVE_SNPRINTF ' + hack_define
endif
2021-02-27 21:27:13 +01:00
if cc . has_function ( 'strcasecmp' , prefix : '#include <strings.h>' )
2016-12-20 23:37:24 +01:00
glib_conf . set ( 'HAVE_STRCASECMP' , 1 )
glib_conf_prefix = glib_conf_prefix + '#define HAVE_STRCASECMP 1\n'
elif cc . has_function ( '_stricmp' )
hack_define = '1\n#define strcasecmp _stricmp'
glib_conf . set ( 'HAVE_STRCASECMP' , hack_define )
glib_conf_prefix = glib_conf_prefix + '#define HAVE_STRCASECMP ' + hack_define
endif
2021-02-27 21:27:13 +01:00
if cc . has_function ( 'strncasecmp' , prefix : '#include <strings.h>' )
2016-12-20 23:37:24 +01:00
glib_conf . set ( 'HAVE_STRNCASECMP' , 1 )
glib_conf_prefix = glib_conf_prefix + '#define HAVE_STRNCASECMP 1\n'
elif cc . has_function ( '_strnicmp' )
hack_define = '1\n#define strncasecmp _strnicmp'
glib_conf . set ( 'HAVE_STRNCASECMP' , hack_define )
glib_conf_prefix = glib_conf_prefix + '#define HAVE_STRNCASECMP ' + hack_define
endif
2017-06-23 17:58:51 +02:00
if cc . has_header_symbol ( 'sys/sysmacros.h' , 'major' )
glib_conf . set ( 'MAJOR_IN_SYSMACROS' , 1 )
elif cc . has_header_symbol ( 'sys/mkdev.h' , 'major' )
glib_conf . set ( 'MAJOR_IN_MKDEV' , 1 )
2018-06-02 20:17:51 +02:00
elif cc . has_header_symbol ( 'sys/types.h' , 'major' )
glib_conf . set ( 'MAJOR_IN_TYPES' , 1 )
2017-06-23 17:58:51 +02:00
endif
2017-06-23 18:36:38 +02:00
if cc . has_header_symbol ( 'dlfcn.h' , 'RTLD_LAZY' )
glib_conf . set ( 'HAVE_RTLD_LAZY' , 1 )
endif
if cc . has_header_symbol ( 'dlfcn.h' , 'RTLD_NOW' )
glib_conf . set ( 'HAVE_RTLD_NOW' , 1 )
endif
if cc . has_header_symbol ( 'dlfcn.h' , 'RTLD_GLOBAL' )
glib_conf . set ( 'HAVE_RTLD_GLOBAL' , 1 )
endif
2019-03-20 19:52:48 +01:00
have_rtld_next = false
2019-04-16 18:22:11 +02:00
if cc . has_header_symbol ( 'dlfcn.h' , 'RTLD_NEXT' , args : '-D_GNU_SOURCE' )
2019-03-20 19:52:48 +01:00
have_rtld_next = true
glib_conf . set ( 'HAVE_RTLD_NEXT' , 1 )
endif
2023-05-15 17:22:35 +02:00
if cc . has_type ( 'loff_t' , prefix : '#include <sys/types.h>' )
glib_conf . set ( 'HAVE_LOFF_T' , 1 )
endif
2016-03-07 12:13:24 +01:00
# Check whether to use statfs or statvfs
# Some systems have both statfs and statvfs, pick the most "native" for these
if have_func_statfs and have_func_statvfs
# on solaris and irix, statfs doesn't even have the f_bavail field
if not glib_conf . has ( 'HAVE_STRUCT_STATFS_F_BAVAIL' )
have_func_statfs = false
else
# at least on linux, statfs is the actual syscall
have_func_statvfs = false
endif
2013-08-07 22:41:12 +02:00
endif
2016-03-07 12:13:24 +01:00
if have_func_statfs
glib_conf . set ( 'USE_STATFS' , 1 )
stat_func_to_use = 'statfs'
elif have_func_statvfs
glib_conf . set ( 'USE_STATVFS' , 1 )
stat_func_to_use = 'statvfs'
2013-08-07 22:41:12 +02:00
else
2016-03-07 12:13:24 +01:00
stat_func_to_use = 'neither'
2013-08-07 22:41:12 +02:00
endif
2016-03-07 12:13:24 +01:00
message ( 'Checking whether to use statfs or statvfs .. ' + stat_func_to_use )
2017-10-09 12:46:48 +02:00
if host_system == 'linux'
if cc . has_function ( 'mkostemp' ,
prefix : '' ' #define _GNU_SOURCE
#include <stdlib.h>''')
glib_conf . set ( 'HAVE_MKOSTEMP' , 1 )
endif
endif
2023-06-29 03:10:03 +02:00
osx_ldflags = [ ]
2017-05-13 12:10:52 +02:00
glib_have_os_x_9_or_later = false
2018-05-23 15:16:35 +02:00
glib_have_carbon = false
glib_have_cocoa = false
if host_system == 'darwin'
2022-05-27 15:23:09 +02:00
add_languages ( 'objc' , native : false , required : true )
2018-05-23 15:16:35 +02:00
objcc = meson . get_compiler ( 'objc' )
2021-11-18 14:53:45 +01:00
add_project_arguments ( objcc . get_supported_arguments ( warning_objc_args ) , language : 'objc' )
2018-05-23 15:16:35 +02:00
# Mac OS X Carbon support
glib_have_carbon = objcc . compiles ( '' ' #include <Carbon/Carbon.h>
#include <CoreServices/CoreServices.h>''',
name : 'Mac OS X Carbon support' )
if glib_have_carbon
glib_conf . set ( 'HAVE_CARBON' , true )
glib_have_os_x_9_or_later = objcc . compiles ( '' ' #include <AvailabilityMacros.h>
#if MAC_OS_X_VERSION_MIN_REQUIRED < 1090
#error Compiling for minimum OS X version before 10.9
#endif''',
name : 'OS X 9 or later' )
endif
2017-05-13 12:10:52 +02:00
2018-05-23 15:16:35 +02:00
# Mac OS X Cocoa support
glib_have_cocoa = objcc . compiles ( '' ' #include <Cocoa/Cocoa.h>
#ifdef GNUSTEP_BASE_VERSION
#error "Detected GNUstep, not Cocoa"
#endif''',
name : 'Mac OS X Cocoa support' )
2016-03-07 12:13:24 +01:00
2018-05-23 15:16:35 +02:00
if glib_have_cocoa
glib_conf . set ( 'HAVE_COCOA' , true )
2023-06-29 03:10:03 +02:00
osx_ldflags + = [ '-Wl,-framework,Foundation' , '-Wl,-framework,AppKit' ]
2018-05-23 15:16:35 +02:00
endif
2017-05-13 12:10:52 +02:00
endif
2015-03-25 16:54:03 +01:00
if host_system == 'qnx'
glib_conf . set ( 'HAVE_QNX' , 1 )
endif
2016-03-07 12:13:24 +01:00
# Check for futex(2)
2022-12-13 14:05:06 +01:00
if cc . compiles ( '' ' #include <linux/futex.h>
2016-03-07 12:13:24 +01:00
#include <sys/syscall.h>
#include <unistd.h>
int main ( int argc , char * * argv ) {
syscall ( __NR_futex , NULL , FUTEX_WAKE , FUTEX_WAIT ) ;
return 0 ;
} '' ', name : ' futex ( 2 ) system call ' )
glib_conf . set ( 'HAVE_FUTEX' , 1 )
2013-08-07 22:41:12 +02:00
endif
2022-12-12 18:58:21 +01:00
if cc . compiles ( '' ' #include <linux/futex.h>
#include <sys/syscall.h>
#include <unistd.h>
int main ( int argc , char * * argv ) {
syscall ( __NR_futex_time64 , NULL , FUTEX_WAKE , FUTEX_WAIT ) ;
return 0 ;
} '' ', name : ' futex ( 2 ) system call ' )
glib_conf . set ( 'HAVE_FUTEX_TIME64' , 1 )
endif
2016-03-07 12:13:24 +01:00
# Check for eventfd(2)
if cc . links ( '' ' #include <sys/eventfd.h>
#include <unistd.h>
int main ( int argc , char * * argv ) {
eventfd ( 0 , EFD_CLOEXEC ) ;
return 0 ;
} '' ', name : ' eventfd ( 2 ) system call ' )
glib_conf . set ( 'HAVE_EVENTFD' , 1 )
2013-08-07 22:41:12 +02:00
endif
2016-03-07 12:13:24 +01:00
2021-12-23 18:45:51 +01:00
# Check for pidfd_open(2)
if cc . links ( '' ' #include <sys/syscall.h>
#include <sys/wait.h>
#include <linux/wait.h>
#include <unistd.h>
int main ( int argc , char * * argv ) {
siginfo_t child_info = { 0 , } ;
syscall ( SYS_pidfd_open , 0 , 0 ) ;
waitid ( P_PIDFD , 0 , & child_info , WEXITED | WNOHANG ) ;
return 0 ;
} '' ', name : ' pidfd_open ( 2 ) system call ' )
glib_conf . set ( 'HAVE_PIDFD' , 1 )
endif
2020-07-07 02:13:12 +02:00
# Check for __uint128_t (gcc) by checking for 128-bit division
uint128_t_src = '' ' int main ( ) {
static __uint128_t v1 = 100 ;
static __uint128_t v2 = 10 ;
static __uint128_t u ;
u = v1 / v2 ;
} '' '
if cc . compiles ( uint128_t_src , name : '__uint128_t available' )
glib_conf . set ( 'HAVE_UINT128_T' , 1 )
endif
2016-03-07 12:13:24 +01:00
clock_gettime_test_code = '' '
#include <time.h>
struct timespec t ;
int main ( int argc , char * * argv ) {
return clock_gettime ( CLOCK_REALTIME , & t ) ;
} '' '
2016-12-20 23:37:24 +01:00
librt = [ ]
2016-03-07 12:13:24 +01:00
if cc . links ( clock_gettime_test_code , name : 'clock_gettime' )
glib_conf . set ( 'HAVE_CLOCK_GETTIME' , 1 )
elif cc . links ( clock_gettime_test_code , args : '-lrt' , name : 'clock_gettime in librt' )
glib_conf . set ( 'HAVE_CLOCK_GETTIME' , 1 )
2016-12-20 23:37:24 +01:00
librt = cc . find_library ( 'rt' )
2013-08-07 22:41:12 +02:00
endif
2016-03-07 12:13:24 +01:00
2019-08-29 17:19:08 +02:00
dlopen_dlsym_test_code = '' '
#include <dlfcn.h>
2022-10-24 20:36:26 +02:00
#include <stdio.h>
int r ;
2019-08-29 17:19:08 +02:00
int glib_underscore_test ( void ) { return 42 ; }
int main ( int argc , char * * argv ) {
void * f1 = ( void * ) 0 , * f2 = ( void * ) 0 , * handle ;
handle = dlopen ( ( void * ) 0 , 0 ) ;
if ( handle ) {
f1 = dlsym ( handle , " glib_underscore_test " ) ;
f2 = dlsym ( handle , " _glib_underscore_test " ) ;
}
2022-10-24 20:36:26 +02:00
r = ( ! f2 | | f1 ) ? puts ( " 1 " ) : puts ( " 0 " ) ;
return r > 0 ? 0 : r ;
2019-08-29 17:19:08 +02:00
} '' '
libdl_dep = [ ]
if cc . links ( dlopen_dlsym_test_code , name : 'dlopen() and dlsym() in system libraries' )
have_dlopen_dlsym = true
elif cc . links ( dlopen_dlsym_test_code , args : '-ldl' , name : 'dlopen() and dlsym() in libdl' )
have_dlopen_dlsym = true
libdl_dep = cc . find_library ( 'dl' )
else
have_dlopen_dlsym = false
endif
2016-03-07 12:13:24 +01:00
# if statfs() takes 2 arguments (Posix) or 4 (Solaris)
if have_func_statfs
if cc . compiles ( glib_conf_prefix + '' '
#include <unistd.h>
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
#ifdef HAVE_SYS_VFS_H
#include <sys/vfs.h>
#endif
#ifdef HAVE_SYS_MOUNT_H
#include <sys/mount.h>
#endif
#ifdef HAVE_SYS_STATFS_H
#include <sys/statfs.h>
#endif
void some_func ( void ) {
struct statfs st ;
2016-12-21 02:04:47 +01:00
statfs ( " / " , & st ) ;
2016-03-07 12:13:24 +01:00
} '' ', name : ' number of arguments to statfs ( ) ( n = 2 ) ' )
glib_conf . set ( 'STATFS_ARGS' , 2 )
elif cc . compiles ( glib_conf_prefix + '' '
#include <unistd.h>
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
#ifdef HAVE_SYS_VFS_H
#include <sys/vfs.h>
#endif
#ifdef HAVE_SYS_MOUNT_H
#include <sys/mount.h>
#endif
#ifdef HAVE_SYS_STATFS_H
#include <sys/statfs.h>
#endif
void some_func ( void ) {
struct statfs st ;
2016-12-21 02:04:47 +01:00
statfs ( " / " , & st , sizeof ( st ) , 0 ) ;
2016-03-07 12:13:24 +01:00
} '' ', name : ' number of arguments to statfs ( ) ( n = 4 ) ' )
glib_conf . set ( 'STATFS_ARGS' , 4 )
else
error ( 'Unable to determine number of arguments to statfs()' )
endif
2013-08-07 22:41:12 +02:00
endif
2016-03-07 12:13:24 +01:00
# open takes O_DIRECTORY as an option
#AC_MSG_CHECKING([])
if cc . compiles ( '' ' #include <fcntl.h>
#include <sys/types.h>
2020-05-13 01:12:22 +02:00
#include <sys/stat.h>
2016-03-07 12:13:24 +01:00
void some_func ( void ) {
open ( 0 , O_DIRECTORY , 0 ) ;
} '' ', name : ' open ( ) option O_DIRECTORY ' )
glib_conf . set ( 'HAVE_OPEN_O_DIRECTORY' , 1 )
2013-08-07 22:41:12 +02:00
endif
2020-05-27 19:54:12 +02:00
# fcntl takes F_FULLFSYNC as an option
# See https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/fsync.2.html
if cc . compiles ( '' ' #include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
void some_func ( void ) {
fcntl ( 0 , F_FULLFSYNC , 0 ) ;
} '' ', name : ' fcntl ( ) option F_FULLFSYNC ' )
glib_conf . set ( 'HAVE_FCNTL_F_FULLFSYNC' , 1 )
endif
2016-03-07 12:13:24 +01:00
# Check whether there is a vsnprintf() function with C99 semantics installed.
2018-08-29 12:57:44 +02:00
# (similar tests to AC_FUNC_VSNPRINTF_C99)
2016-03-07 12:13:24 +01:00
# Check whether there is a snprintf() function with C99 semantics installed.
2018-08-29 12:57:44 +02:00
# (similar tests to AC_FUNC_SNPRINTF_C99)
# Check whether there is a printf() function with Unix98 semantics installed.
# (similar tests to AC_FUNC_PRINTF_UNIX98)
2017-07-17 09:51:54 +02:00
have_good_vsnprintf = false
have_good_snprintf = false
2018-08-29 12:57:44 +02:00
have_good_printf = false
2017-07-17 09:51:54 +02:00
2019-07-09 18:22:51 +02:00
if host_system == 'windows' and ( cc . get_id ( ) == 'msvc' or cc . get_id ( ) == 'clang-cl' )
2018-05-10 16:04:01 +02:00
# Unfortunately the Visual Studio 2015+ implementations of C99-style
# snprintf and vsnprintf don't seem to be quite good enough.
# (Sorry, I don't know exactly what is the problem,
2017-07-17 09:51:54 +02:00
# but it is related to floating point formatting and decimal point vs. comma.)
2016-03-07 12:13:24 +01:00
# The simple tests in AC_FUNC_VSNPRINTF_C99 and AC_FUNC_SNPRINTF_C99 aren't
# rigorous enough to notice, though.
glib_conf . set ( 'HAVE_C99_SNPRINTF' , false )
glib_conf . set ( 'HAVE_C99_VSNPRINTF' , false )
2018-08-29 12:57:44 +02:00
glib_conf . set ( 'HAVE_UNIX98_PRINTF' , false )
2020-08-06 01:32:59 +02:00
elif not cc_can_run and host_system in [ 'ios' , 'darwin' ]
# All these are true when compiling natively on macOS, so we should use good
# defaults when building for iOS and tvOS.
glib_conf . set ( 'HAVE_C99_SNPRINTF' , true )
glib_conf . set ( 'HAVE_C99_VSNPRINTF' , true )
glib_conf . set ( 'HAVE_UNIX98_PRINTF' , true )
have_good_vsnprintf = true
have_good_snprintf = true
have_good_printf = true
2016-03-07 12:13:24 +01:00
else
vsnprintf_c99_test_code = '' '
#include <stdio.h>
#include <stdarg.h>
2021-08-14 12:20:11 +02:00
#include <stdlib.h>
2013-08-07 22:41:12 +02:00
2016-03-07 12:13:24 +01:00
int
doit ( char * s , . . . )
{
char buffer [ 32 ] ;
va_list args ;
int r ;
2013-08-07 22:41:12 +02:00
2016-03-07 12:13:24 +01:00
va_start ( args , s ) ;
r = vsnprintf ( buffer , 5 , s , args ) ;
va_end ( args ) ;
2013-08-07 22:41:12 +02:00
2016-03-07 12:13:24 +01:00
if ( r != 7 )
exit ( 1 ) ;
2013-08-07 22:41:12 +02:00
2016-03-07 12:13:24 +01:00
/ * AIX 5 . 1 and Solaris seems to have a half - baked vsnprintf ( )
implementation . The above will return 7 but if you replace
the size of the buffer with 0 , it borks ! * /
va_start ( args , s ) ;
r = vsnprintf ( buffer , 0 , s , args ) ;
va_end ( args ) ;
if ( r != 7 )
exit ( 1 ) ;
exit ( 0 ) ;
}
int
main ( void )
{
doit ( " 1234567 " ) ;
exit ( 1 ) ;
} '' '
2018-04-03 05:01:25 +02:00
if cc_can_run
rres = cc . run ( vsnprintf_c99_test_code , name : 'C99 vsnprintf' )
if rres . compiled ( ) and rres . returncode ( ) == 0
glib_conf . set ( 'HAVE_C99_VSNPRINTF' , 1 )
have_good_vsnprintf = true
endif
else
2022-05-06 14:16:26 +02:00
have_good_vsnprintf = meson . get_external_property ( 'have_c99_vsnprintf' , false )
2018-04-03 05:01:25 +02:00
glib_conf . set ( 'HAVE_C99_VSNPRINTF' , have_good_vsnprintf )
2016-03-07 12:13:24 +01:00
endif
snprintf_c99_test_code = '' '
#include <stdio.h>
#include <stdarg.h>
2021-08-14 12:20:11 +02:00
#include <stdlib.h>
2016-03-07 12:13:24 +01:00
int
doit ( )
{
char buffer [ 32 ] ;
va_list args ;
int r ;
r = snprintf ( buffer , 5 , " 1234567 " ) ;
if ( r != 7 )
exit ( 1 ) ;
r = snprintf ( buffer , 0 , " 1234567 " ) ;
if ( r != 7 )
exit ( 1 ) ;
r = snprintf ( NULL , 0 , " 1234567 " ) ;
if ( r != 7 )
exit ( 1 ) ;
exit ( 0 ) ;
}
2013-08-07 22:41:12 +02:00
2016-03-07 12:13:24 +01:00
int
main ( void )
{
doit ( ) ;
exit ( 1 ) ;
} '' '
2018-04-03 05:01:25 +02:00
if cc_can_run
rres = cc . run ( snprintf_c99_test_code , name : 'C99 snprintf' )
if rres . compiled ( ) and rres . returncode ( ) == 0
glib_conf . set ( 'HAVE_C99_SNPRINTF' , 1 )
have_good_snprintf = true
endif
else
2022-05-06 14:16:26 +02:00
have_good_snprintf = meson . get_external_property ( 'have_c99_snprintf' , false )
2018-04-03 05:01:25 +02:00
glib_conf . set ( 'HAVE_C99_SNPRINTF' , have_good_snprintf )
2016-03-07 12:13:24 +01:00
endif
2018-08-29 12:57:44 +02:00
printf_unix98_test_code = '' '
#include <stdio.h>
2021-08-14 12:20:11 +02:00
#include <stdlib.h>
#include <string.h>
2018-08-29 12:57:44 +02:00
int
main ( void )
{
char buffer [ 128 ] ;
sprintf ( buffer , " % 2 \ $ d % 3 \ $ d % 1 \ $ d " , 1 , 2 , 3 ) ;
if ( strcmp ( " 2 3 1 " , buffer ) == 0 )
exit ( 0 ) ;
exit ( 1 ) ;
} '' '
if cc_can_run
rres = cc . run ( printf_unix98_test_code , name : 'Unix98 printf positional parameters' )
if rres . compiled ( ) and rres . returncode ( ) == 0
glib_conf . set ( 'HAVE_UNIX98_PRINTF' , 1 )
have_good_printf = true
endif
else
2022-05-06 14:16:26 +02:00
have_good_printf = meson . get_external_property ( 'have_unix98_printf' , false )
2018-08-29 12:57:44 +02:00
glib_conf . set ( 'HAVE_UNIX98_PRINTF' , have_good_printf )
endif
2013-08-07 22:41:12 +02:00
endif
2016-12-20 23:37:24 +01:00
if host_system == 'windows'
2017-07-17 21:31:39 +02:00
glib_conf . set_quoted ( 'EXEEXT' , '.exe' )
2016-03-07 12:13:24 +01:00
else
2017-07-17 21:31:39 +02:00
glib_conf . set ( 'EXEEXT' , '' )
2013-08-07 22:41:12 +02:00
endif
2019-08-10 16:45:31 +02:00
# Our printf is 'good' only if vsnpintf()/snprintf()/printf() supports C99 well enough
use_system_printf = have_good_vsnprintf and have_good_snprintf and have_good_printf
glib_conf . set ( 'USE_SYSTEM_PRINTF' , use_system_printf )
glibconfig_conf . set ( 'GLIB_USING_SYSTEM_PRINTF' , use_system_printf )
if not use_system_printf
# gnulib has vasprintf so override the previous check
2017-07-17 09:51:54 +02:00
glib_conf . set ( 'HAVE_VASPRINTF' , 1 )
endif
2016-03-07 12:13:24 +01:00
# Check for nl_langinfo and CODESET
if cc . links ( '' ' #include <langinfo.h>
int main ( int argc , char * * argv ) {
char * codeset = nl_langinfo ( CODESET ) ;
return 0 ;
2016-12-20 23:37:24 +01:00
} '' ', name : ' nl_langinfo and CODESET ' )
glib_conf . set ( 'HAVE_LANGINFO_CODESET' , 1 )
2016-03-07 12:13:24 +01:00
glib_conf . set ( 'HAVE_CODESET' , 1 )
2013-08-07 22:41:12 +02:00
endif
2016-03-07 12:13:24 +01:00
# Check for nl_langinfo and LC_TIME parts that are needed in gdatetime.c
2023-11-07 12:05:17 +01:00
have_langinfo_time = false
2016-03-07 12:13:24 +01:00
if cc . links ( '' ' #include <langinfo.h>
int main ( int argc , char * * argv ) {
char * str ;
str = nl_langinfo ( PM_STR ) ;
str = nl_langinfo ( D_T_FMT ) ;
str = nl_langinfo ( D_FMT ) ;
str = nl_langinfo ( T_FMT ) ;
str = nl_langinfo ( T_FMT_AMPM ) ;
str = nl_langinfo ( MON_1 ) ;
str = nl_langinfo ( ABMON_12 ) ;
str = nl_langinfo ( DAY_1 ) ;
str = nl_langinfo ( ABDAY_7 ) ;
2023-11-29 00:16:26 +01:00
return 0 ;
} '' ', name : ' nl_langinfo ( PM_STR ) ' )
2023-11-07 12:05:17 +01:00
have_langinfo_time = true
2023-11-29 00:16:26 +01:00
glib_conf . set ( 'HAVE_LANGINFO_TIME' , 1 )
endif
# Linux glibc supports ERA, but FreeBSD and macOS don’ t
if cc . links ( '' ' #include <langinfo.h>
int main ( int argc , char * * argv ) {
char * str ;
2023-10-18 16:50:57 +02:00
str = nl_langinfo ( ERA ) ;
str = nl_langinfo ( ERA_D_T_FMT ) ;
str = nl_langinfo ( ERA_D_FMT ) ;
str = nl_langinfo ( ERA_T_FMT ) ;
str = nl_langinfo ( _NL_TIME_ERA_NUM_ENTRIES ) ;
2016-03-07 12:13:24 +01:00
return 0 ;
2023-11-29 00:16:26 +01:00
} '' ', name : ' nl_langinfo ( ERA ) ' )
glib_conf . set ( 'HAVE_LANGINFO_ERA' , 1 )
2023-11-07 12:05:17 +01:00
if not have_langinfo_time
error ( 'nl_langinfo(ERA) is supported but more basic nl_langinfo() functionality like PM_STR is not' )
endif
2016-03-07 12:13:24 +01:00
endif
2023-11-29 00:16:26 +01:00
2016-03-07 12:13:24 +01:00
if cc . links ( '' ' #include <langinfo.h>
int main ( int argc , char * * argv ) {
char * str ;
str = nl_langinfo ( _NL_CTYPE_OUTDIGIT0_MB ) ;
str = nl_langinfo ( _NL_CTYPE_OUTDIGIT1_MB ) ;
str = nl_langinfo ( _NL_CTYPE_OUTDIGIT2_MB ) ;
str = nl_langinfo ( _NL_CTYPE_OUTDIGIT3_MB ) ;
str = nl_langinfo ( _NL_CTYPE_OUTDIGIT4_MB ) ;
str = nl_langinfo ( _NL_CTYPE_OUTDIGIT5_MB ) ;
str = nl_langinfo ( _NL_CTYPE_OUTDIGIT6_MB ) ;
str = nl_langinfo ( _NL_CTYPE_OUTDIGIT7_MB ) ;
str = nl_langinfo ( _NL_CTYPE_OUTDIGIT8_MB ) ;
str = nl_langinfo ( _NL_CTYPE_OUTDIGIT9_MB ) ;
return 0 ;
} '' ', name : ' nl_langinfo ( _NL_CTYPE_OUTDIGITn_MB ) ' )
glib_conf . set ( 'HAVE_LANGINFO_OUTDIGIT' , 1 )
2023-11-07 12:05:17 +01:00
if not have_langinfo_time
error ( 'nl_langinfo(_NL_CTYPE_OUTDIGITn_MB) is supported but more basic nl_langinfo() functionality like PM_STR is not' )
endif
2013-08-07 22:41:12 +02:00
endif
2017-03-24 11:19:13 +01:00
# Check for nl_langinfo and alternative month names
if cc . links ( '' ' #ifndef _GNU_SOURCE
# define _GNU_SOURCE
#endif
#include <langinfo.h>
int main ( int argc , char * * argv ) {
char * str ;
str = nl_langinfo ( ALTMON_1 ) ;
str = nl_langinfo ( ALTMON_2 ) ;
str = nl_langinfo ( ALTMON_3 ) ;
str = nl_langinfo ( ALTMON_4 ) ;
str = nl_langinfo ( ALTMON_5 ) ;
str = nl_langinfo ( ALTMON_6 ) ;
str = nl_langinfo ( ALTMON_7 ) ;
str = nl_langinfo ( ALTMON_8 ) ;
str = nl_langinfo ( ALTMON_9 ) ;
str = nl_langinfo ( ALTMON_10 ) ;
str = nl_langinfo ( ALTMON_11 ) ;
str = nl_langinfo ( ALTMON_12 ) ;
return 0 ;
} '' ', name : ' nl_langinfo ( ALTMON_n ) ' )
glib_conf . set ( 'HAVE_LANGINFO_ALTMON' , 1 )
2023-11-07 12:05:17 +01:00
if not have_langinfo_time
error ( 'nl_langinfo(ALTMON_n) is supported but more basic nl_langinfo() functionality like PM_STR is not' )
endif
2017-03-24 11:19:13 +01:00
endif
# Check for nl_langinfo and abbreviated alternative month names
if cc . links ( '' ' #ifndef _GNU_SOURCE
# define _GNU_SOURCE
#endif
#include <langinfo.h>
int main ( int argc , char * * argv ) {
char * str ;
2019-05-10 00:40:27 +02:00
str = nl_langinfo ( _NL_ABALTMON_1 ) ;
str = nl_langinfo ( _NL_ABALTMON_2 ) ;
str = nl_langinfo ( _NL_ABALTMON_3 ) ;
str = nl_langinfo ( _NL_ABALTMON_4 ) ;
str = nl_langinfo ( _NL_ABALTMON_5 ) ;
str = nl_langinfo ( _NL_ABALTMON_6 ) ;
str = nl_langinfo ( _NL_ABALTMON_7 ) ;
str = nl_langinfo ( _NL_ABALTMON_8 ) ;
str = nl_langinfo ( _NL_ABALTMON_9 ) ;
str = nl_langinfo ( _NL_ABALTMON_10 ) ;
str = nl_langinfo ( _NL_ABALTMON_11 ) ;
str = nl_langinfo ( _NL_ABALTMON_12 ) ;
2017-03-24 11:19:13 +01:00
return 0 ;
2019-05-10 00:40:27 +02:00
} '' ', name : ' nl_langinfo ( _NL_ABALTMON_n ) ' )
2017-03-24 11:19:13 +01:00
glib_conf . set ( 'HAVE_LANGINFO_ABALTMON' , 1 )
2023-11-07 12:05:17 +01:00
if not have_langinfo_time
error ( 'nl_langinfo(_NL_ABALTMON_n) is supported but more basic nl_langinfo() functionality like PM_STR is not' )
endif
2017-03-24 11:19:13 +01:00
endif
2020-12-01 12:47:27 +01:00
# Check for nl_langinfo and _NL_TIME_CODESET
if cc . links ( '' ' #include <langinfo.h>
int main ( int argc , char * * argv ) {
char * codeset = nl_langinfo ( _NL_TIME_CODESET ) ;
return 0 ;
} '' ', name : ' nl_langinfo and _NL_TIME_CODESET ' )
glib_conf . set ( 'HAVE_LANGINFO_TIME_CODESET' , 1 )
2023-11-07 12:05:17 +01:00
if not have_langinfo_time
error ( 'nl_langinfo(_NL_TIME_CODESET) is supported but more basic nl_langinfo() functionality like PM_STR is not' )
endif
2020-12-01 12:47:27 +01:00
endif
2016-03-07 12:13:24 +01:00
# Check if C compiler supports the 'signed' keyword
if not cc . compiles ( '''signed char x;''' , name : 'signed' )
glib_conf . set ( 'signed' , '/* NOOP */' )
2013-08-07 22:41:12 +02:00
endif
2016-03-07 12:13:24 +01:00
# Check if the ptrdiff_t type exists
2016-12-20 23:37:24 +01:00
if cc . has_header_symbol ( 'stddef.h' , 'ptrdiff_t' )
2016-03-07 12:13:24 +01:00
glib_conf . set ( 'HAVE_PTRDIFF_T' , 1 )
2013-08-07 22:41:12 +02:00
endif
2016-03-07 12:13:24 +01:00
# Check for sig_atomic_t type
if cc . links ( '' ' #include <signal.h>
#include <sys/types.h>
sig_atomic_t val = 42 ;
int main ( int argc , char * * argv ) {
return val == 42 ? 0 : 1 ;
} '' ', name : ' sig_atomic_t ' )
glib_conf . set ( 'HAVE_SIG_ATOMIC_T' , 1 )
2013-08-07 22:41:12 +02:00
endif
2018-06-05 22:23:02 +02:00
# Check if 'long long' works
2016-03-07 12:13:24 +01:00
# jm_AC_TYPE_LONG_LONG
if cc . compiles ( '' ' long long ll = 1 LL ;
int i = 63 ;
int some_func ( void ) {
long long llmax = ( long long ) - 1 ;
return ll < < i | ll > > i | llmax / ll | llmax % ll ;
} '' ', name : ' long long ' )
glib_conf . set ( 'HAVE_LONG_LONG' , 1 )
have_long_long = true
else
have_long_long = false
2013-08-07 22:41:12 +02:00
endif
2016-03-07 12:13:24 +01:00
# Test whether the compiler supports the 'long double' type.
if cc . compiles ( '' ' / * The Stardent Vistra knows sizeof ( long double ) , but does not support it . * /
long double foo = 0 . 0 ;
/ * On Ultrix 4 . 3 cc , long double is 4 and double is 8 . * /
int array [ 2 * ( sizeof ( long double ) > = sizeof ( double ) ) - 1 ] ; '' ' ,
name : 'long double' )
glib_conf . set ( 'HAVE_LONG_DOUBLE' , 1 )
2013-08-07 22:41:12 +02:00
endif
2018-05-22 10:48:42 +02:00
# Test whether <stddef.h> has the 'wchar_t' type.
2016-12-20 23:37:24 +01:00
if cc . has_header_symbol ( 'stddef.h' , 'wchar_t' )
2016-03-07 12:13:24 +01:00
glib_conf . set ( 'HAVE_WCHAR_T' , 1 )
2013-08-07 22:41:12 +02:00
endif
2016-03-07 12:13:24 +01:00
# Test whether <wchar.h> has the 'wint_t' type.
2016-12-20 23:37:24 +01:00
if cc . has_header_symbol ( 'wchar.h' , 'wint_t' )
2016-03-07 12:13:24 +01:00
glib_conf . set ( 'HAVE_WINT_T' , 1 )
2013-08-07 22:41:12 +02:00
endif
2016-03-07 12:13:24 +01:00
found_uintmax_t = false
2013-08-07 22:41:12 +02:00
2016-03-07 12:13:24 +01:00
# Define HAVE_INTTYPES_H_WITH_UINTMAX if <inttypes.h> exists,
# doesn't clash with <sys/types.h>, and declares uintmax_t.
# jm_AC_HEADER_INTTYPES_H
if cc . compiles ( '' ' #include <sys/types.h>
#include <inttypes.h>
void some_func ( void ) {
uintmax_t i = ( uintmax_t ) - 1 ;
} '' ', name : ' uintmax_t in inttypes . h ' )
glib_conf . set ( 'HAVE_INTTYPES_H_WITH_UINTMAX' , 1 )
found_uintmax_t = true
2013-08-07 22:41:12 +02:00
endif
2016-03-07 12:13:24 +01:00
# Define HAVE_STDINT_H_WITH_UINTMAX if <stdint.h> exists,
# doesn't clash with <sys/types.h>, and declares uintmax_t.
# jm_AC_HEADER_STDINT_H
if cc . compiles ( '' ' #include <sys/types.h>
#include <stdint.h>
void some_func ( void ) {
uintmax_t i = ( uintmax_t ) - 1 ;
} '' ', name : ' uintmax_t in stdint . h ' )
glib_conf . set ( 'HAVE_STDINT_H_WITH_UINTMAX' , 1 )
found_uintmax_t = true
2013-08-07 22:41:12 +02:00
endif
2016-03-07 12:13:24 +01:00
# Define intmax_t to 'long' or 'long long'
# if it is not already defined in <stdint.h> or <inttypes.h>.
# For simplicity, we assume that a header file defines 'intmax_t' if and
# only if it defines 'uintmax_t'.
if found_uintmax_t
glib_conf . set ( 'HAVE_INTMAX_T' , 1 )
elif have_long_long
glib_conf . set ( 'intmax_t' , 'long long' )
else
glib_conf . set ( 'intmax_t' , 'long' )
2013-08-07 22:41:12 +02:00
endif
char_size = cc . sizeof ( 'char' )
short_size = cc . sizeof ( 'short' )
int_size = cc . sizeof ( 'int' )
voidp_size = cc . sizeof ( 'void*' )
long_size = cc . sizeof ( 'long' )
2016-03-07 12:13:24 +01:00
if have_long_long
long_long_size = cc . sizeof ( 'long long' )
else
long_long_size = 0
endif
2013-08-07 22:41:12 +02:00
sizet_size = cc . sizeof ( 'size_t' )
2019-07-09 18:22:51 +02:00
if cc . get_id ( ) == 'msvc' or cc . get_id ( ) == 'clang-cl'
2016-12-20 23:37:24 +01:00
ssizet_size = cc . sizeof ( 'SSIZE_T' , prefix : '#include <BaseTsd.h>' )
else
2020-11-15 01:37:19 +01:00
ssizet_size = cc . sizeof ( 'ssize_t' , prefix : '#include <unistd.h>' )
2016-12-20 23:37:24 +01:00
endif
2014-12-14 01:38:51 +01:00
# Some platforms (Apple) hard-code int64_t to long long instead of
# using long on 64-bit architectures. This can cause type mismatch
# warnings when trying to interface with code using the standard
# library type. Test for the warnings and set gint64 to whichever
# works.
if long_long_size == long_size
if cc . compiles ( '' ' #if defined(_AIX) && !defined(__GNUC__)
#pragma options langlvl=stdc99
#endif
#pragma GCC diagnostic error "-Wincompatible-pointer-types"
#include <stdint.h>
#include <stdio.h>
int main ( ) {
int64_t i1 = 1 ;
long * i2 = & i1 ;
return 1 ;
} '' ', name : ' int64_t is long ' )
int64_t_typedef = 'long'
elif cc . compiles ( '' ' #if defined(_AIX) && !defined(__GNUC__)
#pragma options langlvl=stdc99
#endif
#pragma GCC diagnostic error "-Wincompatible-pointer-types"
#include <stdint.h>
#include <stdio.h>
int main ( ) {
int64_t i1 = 1 ;
long long * i2 = & i1 ;
return 1 ;
} '' ', name : ' int64_t is long long ' )
int64_t_typedef = 'long long'
endif
endif
2018-05-05 18:33:47 +02:00
int64_m = 'll'
2013-08-07 22:41:12 +02:00
char_align = cc . alignment ( 'char' )
short_align = cc . alignment ( 'short' )
int_align = cc . alignment ( 'int' )
voidp_align = cc . alignment ( 'void*' )
long_align = cc . alignment ( 'long' )
2016-12-20 23:37:24 +01:00
long_long_align = cc . alignment ( 'long long' )
# NOTE: We don't check for size of __int64 because long long is guaranteed to
# be 64-bit in C99, and it is available on all supported compilers
2013-08-07 22:41:12 +02:00
sizet_align = cc . alignment ( 'size_t' )
glib_conf . set ( 'SIZEOF_CHAR' , char_size )
glib_conf . set ( 'SIZEOF_INT' , int_size )
glib_conf . set ( 'SIZEOF_SHORT' , short_size )
glib_conf . set ( 'SIZEOF_LONG' , long_size )
glib_conf . set ( 'SIZEOF_LONG_LONG' , long_long_size )
glib_conf . set ( 'SIZEOF_SIZE_T' , sizet_size )
2016-03-07 12:13:24 +01:00
glib_conf . set ( 'SIZEOF_SSIZE_T' , ssizet_size )
2013-08-07 22:41:12 +02:00
glib_conf . set ( 'SIZEOF_VOID_P' , voidp_size )
2019-05-22 19:26:41 +02:00
glib_conf . set ( 'SIZEOF_WCHAR_T' , cc . sizeof ( 'wchar_t' , prefix : '#include <stddef.h>' ) )
2013-08-07 22:41:12 +02:00
if short_size == 2
gint16 = 'short'
2017-07-17 21:31:39 +02:00
gint16_modifier = 'h'
gint16_format = 'hi'
guint16_format = 'hu'
2016-12-20 23:37:24 +01:00
elif int_size == 2
gint16 = 'int'
2017-07-17 21:31:39 +02:00
gint16_modifier = ''
gint16_format = 'i'
guint16_format = 'u'
2016-12-20 23:37:24 +01:00
else
error ( 'Compiler provides no native 16-bit integer type' )
2013-08-07 22:41:12 +02:00
endif
glibconfig_conf . set ( 'gint16' , gint16 )
2017-07-17 21:31:39 +02:00
glibconfig_conf . set_quoted ( 'gint16_modifier' , gint16_modifier )
glibconfig_conf . set_quoted ( 'gint16_format' , gint16_format )
glibconfig_conf . set_quoted ( 'guint16_format' , guint16_format )
2013-08-07 22:41:12 +02:00
if short_size == 4
gint32 = 'short'
2017-07-17 21:31:39 +02:00
gint32_modifier = 'h'
gint32_format = 'hi'
guint32_format = 'hu'
2013-08-07 22:41:12 +02:00
guint32_align = short_align
2016-12-20 23:37:24 +01:00
elif int_size == 4
gint32 = 'int'
2017-07-17 21:31:39 +02:00
gint32_modifier = ''
gint32_format = 'i'
guint32_format = 'u'
2016-12-20 23:37:24 +01:00
guint32_align = int_align
elif long_size == 4
gint32 = 'long'
2017-07-17 21:31:39 +02:00
gint32_modifier = 'l'
gint32_format = 'li'
guint32_format = 'lu'
2016-12-20 23:37:24 +01:00
guint32_align = long_align
else
error ( 'Compiler provides no native 32-bit integer type' )
2013-08-07 22:41:12 +02:00
endif
glibconfig_conf . set ( 'gint32' , gint32 )
2017-07-17 21:31:39 +02:00
glibconfig_conf . set_quoted ( 'gint32_modifier' , gint32_modifier )
glibconfig_conf . set_quoted ( 'gint32_format' , gint32_format )
glibconfig_conf . set_quoted ( 'guint32_format' , guint32_format )
2013-08-07 22:41:12 +02:00
if int_size == 8
gint64 = 'int'
2017-07-17 21:31:39 +02:00
gint64_modifier = ''
gint64_format = 'i'
guint64_format = 'u'
2013-08-07 22:41:12 +02:00
glib_extension = ''
gint64_constant = '(val)'
guint64_constant = '(val)'
guint64_align = int_align
2014-12-14 01:38:51 +01:00
elif long_size == 8 and ( long_long_size != long_size or int64_t_typedef == 'long' )
2016-12-20 23:37:24 +01:00
gint64 = 'long'
glib_extension = ''
2017-07-17 21:31:39 +02:00
gint64_modifier = 'l'
gint64_format = 'li'
guint64_format = 'lu'
2016-12-20 23:37:24 +01:00
gint64_constant = '(val##L)'
guint64_constant = '(val##UL)'
guint64_align = long_align
2014-12-14 01:38:51 +01:00
elif long_long_size == 8 and ( long_long_size != long_size or int64_t_typedef == 'long long' )
2016-12-20 23:37:24 +01:00
gint64 = 'long long'
2017-07-17 21:39:31 +02:00
glib_extension = 'G_GNUC_EXTENSION '
2017-07-17 21:31:39 +02:00
gint64_modifier = int64_m
gint64_format = int64_m + 'i'
guint64_format = int64_m + 'u'
2017-07-17 21:39:31 +02:00
gint64_constant = '(G_GNUC_EXTENSION (val##LL))'
guint64_constant = '(G_GNUC_EXTENSION (val##ULL))'
2016-12-20 23:37:24 +01:00
guint64_align = long_long_align
else
error ( 'Compiler provides no native 64-bit integer type' )
2013-08-07 22:41:12 +02:00
endif
2017-07-17 21:39:31 +02:00
glibconfig_conf . set ( 'glib_extension' , glib_extension )
2013-08-07 22:41:12 +02:00
glibconfig_conf . set ( 'gint64' , gint64 )
2017-07-17 21:31:39 +02:00
glibconfig_conf . set_quoted ( 'gint64_modifier' , gint64_modifier )
glibconfig_conf . set_quoted ( 'gint64_format' , gint64_format )
glibconfig_conf . set_quoted ( 'guint64_format' , guint64_format )
2013-08-07 22:41:12 +02:00
glibconfig_conf . set ( 'gint64_constant' , gint64_constant )
glibconfig_conf . set ( 'guint64_constant' , guint64_constant )
2016-12-20 23:37:24 +01:00
if host_system == 'windows'
2013-08-07 22:41:12 +02:00
glibconfig_conf . set ( 'g_pid_type' , 'void*' )
2017-07-17 21:31:39 +02:00
glibconfig_conf . set_quoted ( 'g_pid_format' , 'p' )
2016-03-07 12:13:24 +01:00
if host_machine . cpu_family ( ) == 'x86_64'
2018-05-05 18:33:47 +02:00
glibconfig_conf . set_quoted ( 'g_pollfd_format' , '%#' + int64_m + 'x' )
2016-03-07 12:13:24 +01:00
else
2017-07-17 21:31:39 +02:00
glibconfig_conf . set_quoted ( 'g_pollfd_format' , '%#x' )
2016-03-07 12:13:24 +01:00
endif
2018-01-10 16:57:46 +01:00
glibconfig_conf . set ( 'g_dir_separator' , '\\\\' )
2015-10-29 07:53:00 +01:00
glibconfig_conf . set ( 'g_searchpath_separator' , ';' )
2013-08-07 22:41:12 +02:00
else
glibconfig_conf . set ( 'g_pid_type' , 'int' )
2017-07-17 21:31:39 +02:00
glibconfig_conf . set_quoted ( 'g_pid_format' , 'i' )
glibconfig_conf . set_quoted ( 'g_pollfd_format' , '%d' )
2015-10-29 07:53:00 +01:00
glibconfig_conf . set ( 'g_dir_separator' , '/' )
glibconfig_conf . set ( 'g_searchpath_separator' , ':' )
2013-08-07 22:41:12 +02:00
endif
2019-10-28 18:05:46 +01:00
g_sizet_compatibility = {
'short' : sizet_size == short_size ,
'int' : sizet_size == int_size ,
'long' : sizet_size == long_size ,
'long long' : sizet_size == long_long_size ,
}
# Do separate checks for gcc/clang (and ignore other compilers for now), since
# we need to explicitly pass -Werror to the compilers.
# FIXME: https://github.com/mesonbuild/meson/issues/5399
if cc . get_id ( ) == 'gcc' or cc . get_id ( ) == 'clang'
2022-05-12 12:19:15 +02:00
foreach type_name , size_compatibility : g_sizet_compatibility
g_sizet_compatibility + = { type_name : size_compatibility and
cc . compiles (
2019-10-28 18:05:46 +01:00
'' ' #include <stddef.h>
2023-12-19 11:29:39 +01:00
static size_t f ( size_t * i ) { return * i + 1 ; }
2019-10-28 18:05:46 +01:00
int main ( void ) {
2022-05-12 12:19:15 +02:00
unsigned ''' + type_name + ''' i = 0 ;
2019-10-28 18:05:46 +01:00
f ( & i ) ;
return 0 ;
} '' ' ,
args : [ '-Werror' ] ,
2022-05-12 12:19:15 +02:00
name : 'GCC size_t typedef is ' + type_name ) , }
endforeach
2019-10-28 18:05:46 +01:00
endif
if g_sizet_compatibility [ 'short' ]
2013-08-07 22:41:12 +02:00
glibconfig_conf . set ( 'glib_size_type_define' , 'short' )
2017-07-17 21:31:39 +02:00
glibconfig_conf . set_quoted ( 'gsize_modifier' , 'h' )
glibconfig_conf . set_quoted ( 'gssize_modifier' , 'h' )
glibconfig_conf . set_quoted ( 'gsize_format' , 'hu' )
glibconfig_conf . set_quoted ( 'gssize_format' , 'hi' )
2013-08-07 22:41:12 +02:00
glibconfig_conf . set ( 'glib_msize_type' , 'SHRT' )
2019-10-28 18:05:46 +01:00
elif g_sizet_compatibility [ 'int' ]
2013-08-07 22:41:12 +02:00
glibconfig_conf . set ( 'glib_size_type_define' , 'int' )
2017-07-17 21:31:39 +02:00
glibconfig_conf . set_quoted ( 'gsize_modifier' , '' )
glibconfig_conf . set_quoted ( 'gssize_modifier' , '' )
glibconfig_conf . set_quoted ( 'gsize_format' , 'u' )
glibconfig_conf . set_quoted ( 'gssize_format' , 'i' )
2013-08-07 22:41:12 +02:00
glibconfig_conf . set ( 'glib_msize_type' , 'INT' )
2019-10-28 18:05:46 +01:00
elif g_sizet_compatibility [ 'long' ]
2013-08-07 22:41:12 +02:00
glibconfig_conf . set ( 'glib_size_type_define' , 'long' )
2017-07-17 21:31:39 +02:00
glibconfig_conf . set_quoted ( 'gsize_modifier' , 'l' )
glibconfig_conf . set_quoted ( 'gssize_modifier' , 'l' )
glibconfig_conf . set_quoted ( 'gsize_format' , 'lu' )
glibconfig_conf . set_quoted ( 'gssize_format' , 'li' )
2013-08-07 22:41:12 +02:00
glibconfig_conf . set ( 'glib_msize_type' , 'LONG' )
2019-10-28 18:05:46 +01:00
elif g_sizet_compatibility [ 'long long' ]
2013-08-07 22:41:12 +02:00
glibconfig_conf . set ( 'glib_size_type_define' , 'long long' )
2017-07-17 21:31:39 +02:00
glibconfig_conf . set_quoted ( 'gsize_modifier' , int64_m )
glibconfig_conf . set_quoted ( 'gssize_modifier' , int64_m )
glibconfig_conf . set_quoted ( 'gsize_format' , int64_m + 'u' )
glibconfig_conf . set_quoted ( 'gssize_format' , int64_m + 'i' )
2013-08-07 22:41:12 +02:00
glibconfig_conf . set ( 'glib_msize_type' , 'INT64' )
else
error ( 'Could not determine size of size_t.' )
endif
2016-03-07 12:13:24 +01:00
if voidp_size == int_size
glibconfig_conf . set ( 'glib_intptr_type_define' , 'int' )
2017-07-17 21:31:39 +02:00
glibconfig_conf . set_quoted ( 'gintptr_modifier' , '' )
glibconfig_conf . set_quoted ( 'gintptr_format' , 'i' )
glibconfig_conf . set_quoted ( 'guintptr_format' , 'u' )
2016-03-07 12:13:24 +01:00
glibconfig_conf . set ( 'glib_gpi_cast' , '(gint)' )
glibconfig_conf . set ( 'glib_gpui_cast' , '(guint)' )
elif voidp_size == long_size
glibconfig_conf . set ( 'glib_intptr_type_define' , 'long' )
2017-07-17 21:31:39 +02:00
glibconfig_conf . set_quoted ( 'gintptr_modifier' , 'l' )
glibconfig_conf . set_quoted ( 'gintptr_format' , 'li' )
glibconfig_conf . set_quoted ( 'guintptr_format' , 'lu' )
2016-03-07 12:13:24 +01:00
glibconfig_conf . set ( 'glib_gpi_cast' , '(glong)' )
glibconfig_conf . set ( 'glib_gpui_cast' , '(gulong)' )
elif voidp_size == long_long_size
glibconfig_conf . set ( 'glib_intptr_type_define' , 'long long' )
2017-07-17 21:31:39 +02:00
glibconfig_conf . set_quoted ( 'gintptr_modifier' , int64_m )
glibconfig_conf . set_quoted ( 'gintptr_format' , int64_m + 'i' )
glibconfig_conf . set_quoted ( 'guintptr_format' , int64_m + 'u' )
2016-03-07 12:13:24 +01:00
glibconfig_conf . set ( 'glib_gpi_cast' , '(gint64)' )
glibconfig_conf . set ( 'glib_gpui_cast' , '(guint64)' )
else
error ( 'Could not determine size of void *' )
endif
2016-12-20 23:37:24 +01:00
if long_size != 8 and long_long_size != 8 and int_size != 8
error ( 'GLib requires a 64-bit type. You might want to consider using the GNU C compiler.' )
endif
2016-03-07 12:13:24 +01:00
glibconfig_conf . set ( 'gintbits' , int_size * 8 )
glibconfig_conf . set ( 'glongbits' , long_size * 8 )
glibconfig_conf . set ( 'gsizebits' , sizet_size * 8 )
glibconfig_conf . set ( 'gssizebits' , ssizet_size * 8 )
2018-06-11 03:32:08 +02:00
# XXX: https://gitlab.gnome.org/GNOME/glib/issues/1413
2016-12-20 23:37:24 +01:00
if host_system == 'windows'
2016-03-07 12:13:24 +01:00
g_module_suffix = 'dll'
else
g_module_suffix = 'so'
endif
glibconfig_conf . set ( 'g_module_suffix' , g_module_suffix )
glibconfig_conf . set ( 'GLIB_MAJOR_VERSION' , major_version )
glibconfig_conf . set ( 'GLIB_MINOR_VERSION' , minor_version )
glibconfig_conf . set ( 'GLIB_MICRO_VERSION' , micro_version )
2017-12-14 13:32:56 +01:00
glibconfig_conf . set ( 'GLIB_VERSION' , glib_version )
2016-03-07 12:13:24 +01:00
2013-08-07 22:41:12 +02:00
glibconfig_conf . set ( 'glib_void_p' , voidp_size )
glibconfig_conf . set ( 'glib_long' , long_size )
glibconfig_conf . set ( 'glib_size_t' , sizet_size )
2016-03-07 12:13:24 +01:00
glibconfig_conf . set ( 'glib_ssize_t' , ssizet_size )
if host_machine . endian ( ) == 'big'
2013-08-07 22:41:12 +02:00
glibconfig_conf . set ( 'g_byte_order' , 'G_BIG_ENDIAN' )
glibconfig_conf . set ( 'g_bs_native' , 'BE' )
glibconfig_conf . set ( 'g_bs_alien' , 'LE' )
else
glibconfig_conf . set ( 'g_byte_order' , 'G_LITTLE_ENDIAN' )
glibconfig_conf . set ( 'g_bs_native' , 'LE' )
glibconfig_conf . set ( 'g_bs_alien' , 'BE' )
endif
2016-03-07 12:13:24 +01:00
# === va_copy checks ===
2022-10-21 15:48:26 +02:00
glib_vacopy = ''
# We check for G_VA_COPY_AS_ARRAY for historical reasons, but we no longer
# use it: use Standard C va_copy() instead.
2016-03-07 12:13:24 +01:00
va_list_val_copy_prog = '' '
#include <stdarg.h>
#include <stdlib.h>
void f ( int i , . . . ) {
va_list args1 , args2 ;
va_start ( args1 , i ) ;
args2 = args1 ;
if ( va_arg ( args2 , int ) != 42 | | va_arg ( args1 , int ) != 42 )
exit ( 1 ) ;
va_end ( args1 ) ; va_end ( args2 ) ;
}
int main ( ) {
f ( 0 , 42 ) ;
return 0 ;
} '' '
2018-04-03 05:01:25 +02:00
if cc_can_run
rres = cc . run ( va_list_val_copy_prog , name : 'va_lists can be copied as values' )
2022-05-06 22:27:03 +02:00
glib_va_val_copy = rres . compiled ( ) and rres . returncode ( ) == 0
2018-04-03 05:01:25 +02:00
else
2022-05-06 14:16:26 +02:00
glib_va_val_copy = meson . get_external_property ( 'va_val_copy' , true )
2016-03-07 12:13:24 +01:00
endif
if not glib_va_val_copy
glib_vacopy = glib_vacopy + '\n#define G_VA_COPY_AS_ARRAY 1'
glib_conf . set ( 'G_VA_COPY_AS_ARRAY' , 1 )
2013-08-07 22:41:12 +02:00
endif
2016-03-07 12:13:24 +01:00
glibconfig_conf . set ( 'glib_vacopy' , glib_vacopy )
2013-08-07 22:41:12 +02:00
2016-03-07 12:13:24 +01:00
# check for flavours of varargs macros
g_have_iso_c_varargs = cc . compiles ( '' '
void some_func ( void ) {
int a ( int p1 , int p2 , int p3 ) ;
#define call_a(...) a(1,__VA_ARGS__)
call_a ( 2 , 3 ) ;
} '' ', name : ' ISO C99 varargs macros in C ' )
2013-08-07 22:41:12 +02:00
2022-06-29 19:12:55 +02:00
if not g_have_iso_c_varargs
error ( 'GLib requires a C compiler with support for C99 __VA_ARG__ in macros.' )
2016-03-07 12:13:24 +01:00
endif
2022-07-15 08:23:37 +02:00
if have_cxx
g_have_iso_cxx_varargs = cxx . compiles ( '' '
void some_func ( void ) {
int a ( int p1 , int p2 , int p3 ) ;
#define call_a(...) a(1,__VA_ARGS__)
call_a ( 2 , 3 ) ;
} '' ', name : ' ISO C99 varargs macros in C + + ' )
2013-08-07 22:41:12 +02:00
2022-07-15 08:23:37 +02:00
if not g_have_iso_cxx_varargs
error ( 'GLib requires a C++ compiler with support for C99 __VA_ARG__ in macros.' )
endif
2013-08-07 22:41:12 +02:00
endif
2016-03-07 12:13:24 +01:00
g_have_gnuc_varargs = cc . compiles ( '' '
void some_func ( void ) {
int a ( int p1 , int p2 , int p3 ) ;
#define call_a(params...) a(1,params)
call_a ( 2 , 3 ) ;
} '' ', name : ' GNUC varargs macros ' )
2013-08-07 22:41:12 +02:00
if cc . has_header ( 'alloca.h' )
glibconfig_conf . set ( 'GLIB_HAVE_ALLOCA_H' , true )
endif
has_syspoll = cc . has_header ( 'sys/poll.h' )
has_systypes = cc . has_header ( 'sys/types.h' )
if has_syspoll
glibconfig_conf . set ( 'GLIB_HAVE_SYS_POLL_H' , true )
endif
2016-12-20 23:37:24 +01:00
has_winsock2 = cc . has_header ( 'winsock2.h' )
2013-08-07 22:41:12 +02:00
if has_syspoll and has_systypes
2018-04-06 19:46:15 +02:00
poll_includes = '' '
#include<sys/poll.h>
#include<sys/types.h>'''
2016-12-20 23:37:24 +01:00
elif has_winsock2
2018-04-06 19:46:15 +02:00
poll_includes = '' '
2018-05-29 13:40:09 +02:00
#define _WIN32_WINNT @0@
#include <winsock2.h>'''.format(glib_conf.get('_WIN32_WINNT'))
2013-08-07 22:41:12 +02:00
else
2016-03-07 12:13:24 +01:00
# FIXME?
error ( 'FIX POLL* defines' )
2013-08-07 22:41:12 +02:00
endif
2018-04-06 19:46:15 +02:00
poll_defines = [
2018-03-31 15:59:55 +02:00
[ 'POLLIN' , 'g_pollin' , 1 ] ,
[ 'POLLOUT' , 'g_pollout' , 4 ] ,
[ 'POLLPRI' , 'g_pollpri' , 2 ] ,
[ 'POLLERR' , 'g_pollerr' , 8 ] ,
[ 'POLLHUP' , 'g_pollhup' , 16 ] ,
[ 'POLLNVAL' , 'g_pollnval' , 32 ] ,
2018-04-06 19:46:15 +02:00
]
2018-03-31 15:59:55 +02:00
if has_syspoll and has_systypes
foreach d : poll_defines
val = cc . compute_int ( d [ 0 ] , prefix : poll_includes )
glibconfig_conf . set ( d [ 1 ] , val )
endforeach
elif has_winsock2
# Due to a missed bug in configure.ac the poll test
# never succeeded on Windows and used some pre-defined
# values as a fallback. Keep using them to maintain
# ABI compatibility with autotools builds of glibs
# and with *any* glib-using code compiled against them,
# since these values end up in a public header glibconfig.h.
foreach d : poll_defines
glibconfig_conf . set ( d [ 1 ] , d [ 2 ] )
endforeach
endif
2013-08-07 22:41:12 +02:00
2016-03-07 12:13:24 +01:00
# Internet address families
# FIXME: what about Cygwin (G_WITH_CYGWIN)
2016-12-20 23:37:24 +01:00
if host_system == 'windows'
2018-04-06 19:46:15 +02:00
inet_includes = '' '
#include <winsock2.h>'''
2016-03-07 12:13:24 +01:00
else
2018-04-06 19:46:15 +02:00
inet_includes = '' '
#include <sys/types.h>
#include <sys/socket.h>'''
2016-03-07 12:13:24 +01:00
endif
2018-04-06 19:46:15 +02:00
inet_defines = [
2016-03-07 12:13:24 +01:00
[ 'AF_UNIX' , 'g_af_unix' ] ,
[ 'AF_INET' , 'g_af_inet' ] ,
[ 'AF_INET6' , 'g_af_inet6' ] ,
[ 'MSG_OOB' , 'g_msg_oob' ] ,
[ 'MSG_PEEK' , 'g_msg_peek' ] ,
[ 'MSG_DONTROUTE' , 'g_msg_dontroute' ] ,
]
2018-04-06 19:46:15 +02:00
foreach d : inet_defines
val = cc . compute_int ( d [ 0 ] , prefix : inet_includes )
2016-03-07 12:13:24 +01:00
glibconfig_conf . set ( d [ 1 ] , val )
endforeach
2021-01-06 00:16:36 +01:00
if host_system == 'windows'
have_ipv6 = true
else
have_ipv6 = cc . has_type ( 'struct in6_addr' , prefix : '#include <netinet/in.h>' )
endif
glib_conf . set ( 'HAVE_IPV6' , have_ipv6 )
2018-05-22 10:48:04 +02:00
# We need to decide at configure time if GLib will use real atomic
# operations ("lock free") or emulated ones with a mutex. This is
# because we must put this information in glibconfig.h so we know if
# it is safe or not to inline using compiler intrinsics directly from
# the header.
#
# We also publish the information via G_ATOMIC_LOCK_FREE in case the
# user is interested in knowing if they can use the atomic ops across
# processes.
#
# We can currently support the atomic ops natively when building GLib
# with recent versions of GCC or MSVC.
#
2017-06-15 00:57:11 +02:00
# Note that the atomic ops are only available with GCC on x86 when
# using -march=i486 or higher. If we detect that the atomic ops are
# not available but would be available given the right flags, we want
# to abort and advise the user to fix their CFLAGS. It's better to do
# that then to silently fall back on emulated atomic ops just because
# the user had the wrong build environment.
2018-05-16 13:16:17 +02:00
atomictest = '' ' int main ( ) {
2020-11-11 20:23:18 +01:00
int atomic = 2 ;
2013-08-07 22:41:12 +02:00
__sync_bool_compare_and_swap ( & atomic , 2 , 3 ) ;
2018-05-16 13:16:17 +02:00
return 0 ;
2013-08-07 22:41:12 +02:00
}
'' '
2018-05-17 22:19:59 +02:00
2018-05-22 08:15:37 +02:00
atomicdefine = '' '
#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
#error "compiler has atomic ops, but doesn't define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4"
#endif
'' '
2018-05-17 22:19:59 +02:00
# We know that we can always use real ("lock free") atomic operations with MSVC
2019-07-09 18:22:51 +02:00
if cc . get_id ( ) == 'msvc' or cc . get_id ( ) == 'clang-cl' or cc . links ( atomictest , name : 'atomic ops' )
2018-05-22 08:15:37 +02:00
have_atomic_lock_free = true
2019-07-14 19:25:28 +02:00
if cc . get_id ( ) == 'gcc' and not cc . compiles ( atomicdefine , name : 'atomic ops define' )
# Old gcc release may provide
2018-05-22 08:15:37 +02:00
# __sync_bool_compare_and_swap but doesn't define
# __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
glib_conf . set ( '__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4' , true )
endif
2022-06-06 21:30:41 +02:00
if cc . get_id ( ) == 'gcc' or cc . get_id ( ) == 'clang'
sync_swap_test = '' '
int main ( ) {
int atomic = 2 ;
__sync_swap ( & atomic , 2 ) ;
return 0 ;
}
'' '
2022-06-22 22:54:03 +02:00
glib_conf . set ( '_GLIB_GCC_HAVE_SYNC_SWAP' , cc . links ( sync_swap_test , name : 'sync swap' ) )
2022-06-06 21:30:41 +02:00
endif
2013-08-07 22:41:12 +02:00
else
2018-05-22 08:15:37 +02:00
have_atomic_lock_free = false
2018-05-07 11:38:51 +02:00
if host_machine . cpu_family ( ) == 'x86' and cc . links ( atomictest , args : '-march=i486' )
2017-06-15 00:57:11 +02:00
error ( 'GLib must be built with -march=i486 or later.' )
endif
2013-08-07 22:41:12 +02:00
endif
2018-05-22 08:15:37 +02:00
glibconfig_conf . set ( 'G_ATOMIC_LOCK_FREE' , have_atomic_lock_free )
2013-08-07 22:41:12 +02:00
2016-03-07 12:13:24 +01:00
# === Threads ===
2013-08-07 22:41:12 +02:00
2022-02-08 14:15:33 +01:00
if get_option ( 'force_posix_threads' )
warning ( 'DEPRECATION: Option \'force_posix_threads\' is deprecated and will be removed after GLib 2.72; please file an issue with your use case if you still require it' )
endif
2016-03-07 12:13:24 +01:00
# Determination of thread implementation
2018-05-15 20:05:50 +02:00
if host_system == 'windows' and not get_option ( 'force_posix_threads' )
thread_dep = [ ]
threads_implementation = 'win32'
2016-03-07 12:13:24 +01:00
glibconfig_conf . set ( 'g_threads_impl_def' , 'WIN32' )
glib_conf . set ( 'THREADS_WIN32' , 1 )
else
2018-05-15 20:05:50 +02:00
thread_dep = dependency ( 'threads' )
threads_implementation = 'posix'
2018-04-23 16:33:44 +02:00
pthread_prefix = '' '
#ifndef _GNU_SOURCE
# define _GNU_SOURCE
#endif
#include <pthread.h>'''
2016-03-07 12:13:24 +01:00
glibconfig_conf . set ( 'g_threads_impl_def' , 'POSIX' )
glib_conf . set ( 'THREADS_POSIX' , 1 )
2016-12-20 23:37:24 +01:00
if cc . has_header_symbol ( 'pthread.h' , 'pthread_attr_setstacksize' )
glib_conf . set ( 'HAVE_PTHREAD_ATTR_SETSTACKSIZE' , 1 )
endif
2019-12-24 14:33:30 +01:00
if cc . has_header_symbol ( 'pthread.h' , 'pthread_attr_setinheritsched' )
glib_conf . set ( 'HAVE_PTHREAD_ATTR_SETINHERITSCHED' , 1 )
endif
2016-12-20 23:37:24 +01:00
if cc . has_header_symbol ( 'pthread.h' , 'pthread_condattr_setclock' )
glib_conf . set ( 'HAVE_PTHREAD_CONDATTR_SETCLOCK' , 1 )
endif
if cc . has_header_symbol ( 'pthread.h' , 'pthread_cond_timedwait_relative_np' )
glib_conf . set ( 'HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE_NP' , 1 )
endif
2018-04-23 16:33:44 +02:00
if cc . has_header_symbol ( 'pthread.h' , 'pthread_getname_np' , prefix : pthread_prefix )
glib_conf . set ( 'HAVE_PTHREAD_GETNAME_NP' , 1 )
endif
2023-12-22 17:11:45 +01:00
if cc . has_header_symbol ( 'pthread.h' , 'pthread_getaffinity_np' , prefix : pthread_prefix )
glib_conf . set ( 'HAVE_PTHREAD_GETAFFINITY_NP' , 1 )
endif
2020-01-16 15:02:39 +01:00
2017-08-13 20:35:52 +02:00
# Assume that pthread_setname_np is available in some form; same as configure
2018-04-23 16:33:44 +02:00
if cc . links ( pthread_prefix + '' '
2017-08-09 22:31:59 +02:00
int main ( ) {
pthread_setname_np ( " example " ) ;
2018-05-17 16:10:50 +02:00
return 0 ;
2017-08-09 22:31:59 +02:00
} '' ' ,
name : 'pthread_setname_np(const char*)' ,
dependencies : thread_dep )
2017-08-13 20:35:52 +02:00
# macOS and iOS
2016-12-20 23:37:24 +01:00
glib_conf . set ( 'HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID' , 1 )
2018-04-23 16:33:44 +02:00
elif cc . links ( pthread_prefix + '' '
2017-08-09 22:31:59 +02:00
int main ( ) {
pthread_setname_np ( pthread_self ( ) , " example " ) ;
2018-05-17 16:10:50 +02:00
return 0 ;
2017-08-09 22:31:59 +02:00
} '' ' ,
name : 'pthread_setname_np(pthread_t, const char*)' ,
dependencies : thread_dep )
2017-08-13 20:35:52 +02:00
# Linux, Solaris, etc.
2016-12-20 23:37:24 +01:00
glib_conf . set ( 'HAVE_PTHREAD_SETNAME_NP_WITH_TID' , 1 )
2019-08-29 19:24:08 +02:00
elif cc . links ( pthread_prefix + '' '
int main ( ) {
pthread_setname_np ( pthread_self ( ) , " % s " , " example " ) ;
return 0 ;
} '' ' ,
name : 'pthread_setname_np(pthread_t, const char*, void*)' ,
dependencies : thread_dep )
# NetBSD
glib_conf . set ( 'HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG' , 1 )
elif cc . links ( pthread_prefix + '' '
#include <pthread_np.h>
int main ( ) {
pthread_set_name_np ( pthread_self ( ) , " example " ) ;
return 0 ;
} '' ' ,
name : 'pthread_set_name_np(pthread_t, const char*)' ,
dependencies : thread_dep )
# FreeBSD, DragonFlyBSD, OpenBSD, etc.
glib_conf . set ( 'HAVE_PTHREAD_SET_NAME_NP' , 1 )
2016-12-20 23:37:24 +01:00
endif
2016-03-07 12:13:24 +01:00
endif
# FIXME: we should make it print the result and always return 0, so that
# the output in meson shows up as green
2020-11-11 20:23:18 +01:00
# volatile is needed here to avoid optimisations in the test
2016-03-07 12:13:24 +01:00
stack_grows_check_prog = '' '
volatile int * a = 0 , * b = 0 ;
void f ( int i ) {
volatile int x = 5 ;
if ( i == 0 )
b = & x ;
else
f ( i - 1 ) ;
}
int main ( ) {
volatile int y = 7 ;
a = & y ;
f ( 100 ) ;
return b > a ? 0 : 1 ;
} '' '
2018-04-03 05:01:25 +02:00
if cc_can_run
rres = cc . run ( stack_grows_check_prog , name : 'stack grows check' )
2022-05-06 22:27:03 +02:00
growing_stack = rres . compiled ( ) and rres . returncode ( ) == 0
2016-03-07 12:13:24 +01:00
else
2022-05-06 14:16:26 +02:00
growing_stack = meson . get_external_property ( 'growing_stack' , false )
2016-03-07 12:13:24 +01:00
endif
2018-09-23 18:59:40 +02:00
glibconfig_conf . set10 ( 'G_HAVE_GROWING_STACK' , growing_stack )
2018-04-03 05:01:25 +02:00
2016-03-07 12:13:24 +01:00
# Tests for iconv
2016-12-20 23:37:24 +01:00
#
2019-03-29 13:31:47 +01:00
# We should never use the MinGW C library's iconv because it may not be
# available in the actual runtime environment. On Windows, we always use
# the built-in implementation
2016-12-20 23:37:24 +01:00
if host_system == 'windows'
2019-03-29 13:31:47 +01:00
# We have a #include "win_iconv.c" in gconvert.c on Windows, so we don't need
# any external library for it
meson: simplify iconv lookups using Meson's builtin dependency lookup
iconv is complicated to look up. That complexity now resides in
Meson, since 0.60.0, via a `dependency('iconv')` lookup, so use that
instead.
No effort is made to support the old option for which type of iconv to
use. It was a false choice, because if only one was available, then
that's the only one you can use, and if both are available, the external
iconv shadows the builtin one and renders the builtin one unusable,
so there is still only one you can use.
This meant that when configuring glib with -Diconv=libc on systems that
had an external iconv, the configure check would detect a valid libc
iconv, try to use it, and then fail during the build because iconv.h
belongs to the external iconv and generates machine code using the
external iconv ABI, but fails to link to the iconv `find_library()`.
Meson handles this transparently.
2022-06-07 22:14:04 +02:00
libiconv = [ ]
2016-03-07 12:13:24 +01:00
else
meson: simplify iconv lookups using Meson's builtin dependency lookup
iconv is complicated to look up. That complexity now resides in
Meson, since 0.60.0, via a `dependency('iconv')` lookup, so use that
instead.
No effort is made to support the old option for which type of iconv to
use. It was a false choice, because if only one was available, then
that's the only one you can use, and if both are available, the external
iconv shadows the builtin one and renders the builtin one unusable,
so there is still only one you can use.
This meant that when configuring glib with -Diconv=libc on systems that
had an external iconv, the configure check would detect a valid libc
iconv, try to use it, and then fail during the build because iconv.h
belongs to the external iconv and generates machine code using the
external iconv ABI, but fails to link to the iconv `find_library()`.
Meson handles this transparently.
2022-06-07 22:14:04 +02:00
libiconv = dependency ( 'iconv' )
2016-03-07 12:13:24 +01:00
endif
2022-12-30 12:14:36 +01:00
pcre2_req = '>=10.32'
2023-06-28 16:38:36 +02:00
# Pick up pcre from the system, or if "--force-fallback-for libpcre2-8" was specified
pcre2 = dependency ( 'libpcre2-8' , version : pcre2_req , required : false , default_options : [ 'default_library=static' ] )
2022-07-12 13:46:34 +02:00
if not pcre2 . found ( )
2021-06-09 13:26:30 +02:00
if cc . get_id ( ) == 'msvc' or cc . get_id ( ) == 'clang-cl'
2022-07-12 13:46:34 +02:00
# MSVC: Search for the PCRE2 library by the configuration, which corresponds
# to the output of CMake builds of PCRE2. Note that debugoptimized
2021-06-09 13:26:30 +02:00
# is really a Release build with .PDB files.
if vs_crt == 'debug'
2022-07-12 13:46:34 +02:00
pcre2 = cc . find_library ( 'pcre2d-8' , required : false )
2021-06-09 13:26:30 +02:00
else
2022-07-12 13:46:34 +02:00
pcre2 = cc . find_library ( 'pcre2-8' , required : false )
2017-08-15 11:08:47 +02:00
endif
endif
2017-07-21 15:03:05 +02:00
endif
2016-03-07 12:13:24 +01:00
2021-06-09 13:26:30 +02:00
# Try again with the fallback
2022-07-12 13:46:34 +02:00
if not pcre2 . found ( )
2023-06-28 16:38:36 +02:00
pcre2 = dependency ( 'libpcre2-8' , version : pcre2_req , allow_fallback : true , default_options : [ 'default_library=static' ] )
2022-12-30 12:23:10 +01:00
assert ( pcre2 . type_name ( ) == 'internal' )
# static flags are automatically enabled by the subproject if it's built
# with default_library=static
use_pcre2_static_flag = false
2023-10-02 01:26:02 +02:00
elif host_system == 'windows' and pcre2 . type_name ( ) != 'internal'
2022-07-12 13:46:34 +02:00
pcre2_static = cc . links ( '' ' #define PCRE2_STATIC
#define PCRE2_CODE_UNIT_WIDTH 8
#include <pcre2.h>
int main ( ) {
void * p = NULL ;
pcre2_code_free ( p ) ;
return 0 ;
} '' ' ,
dependencies : pcre2 ,
name : 'Windows system PCRE2 is a static build' )
use_pcre2_static_flag = pcre2_static
2021-06-09 13:26:30 +02:00
else
2022-07-12 13:46:34 +02:00
use_pcre2_static_flag = false
2017-07-25 10:28:29 +02:00
endif
2022-06-07 19:11:32 +02:00
# Import the gvdb sources as a subproject to avoid having the copylib in-tree
2022-06-23 10:26:21 +02:00
subproject ( 'gvdb' )
2022-06-07 19:11:32 +02:00
gvdb_dep = dependency ( 'gvdb' )
2016-12-20 23:37:24 +01:00
libm = cc . find_library ( 'm' , required : false )
2022-12-30 12:16:12 +01:00
libffi_dep = dependency ( 'libffi' , version : '>= 3.0.0' )
2017-08-15 11:08:47 +02:00
2022-05-24 21:22:34 +02:00
libz_dep = dependency ( 'zlib' )
2018-10-09 16:59:21 +02:00
2018-05-20 06:08:19 +02:00
# First check in libc, fallback to libintl, and as last chance build
# proxy-libintl subproject.
# FIXME: glib-gettext.m4 has much more checks to detect broken/uncompatible
# implementations. This could be extended if issues are found in some platforms.
2020-04-13 15:54:15 +02:00
libintl_deps = [ ]
2022-09-07 23:06:33 +02:00
libintl_prefix = '#include <libintl.h>'
2023-07-11 22:59:37 +02:00
libintl = dependency ( 'intl' , required : false )
if libintl . found ( ) and libintl . type_name ( ) != 'internal'
meson: simplify intl lookups using Meson's builtin dependency lookup
intl is complicated to look up. Some of that complexity now resides in
Meson, since 0.59.0, via a `dependency('intl')` lookup, so use that
instead.
The Meson lookup doesn't include all the checks here, but likewise this
meson.build doesn't include all the checks in Meson. Particularly, the
following are different:
- Meson accurately detects support built into libc, even if that
conflicts with an external library version (which should be detected as
broken and thus not-found, but glib does not do so).
The problem here is that depending on which libintl.h header is first
in the search path, the *gettext symbols may be the libc ABI, or they
may be renamed to libintl_*gettext, then additionally take over the
*gettext names via a macro, in order to invoke the external library
version even on systems where there is a libc builtin. This means that
checking for `cc.has_function()` correctly reports that there is such
a function in libc, but that unfortunately does not mean it is usable,
because source code referencing `ngettext` etc. will expect to be
linked to `libintl_ngettext`.
- glib checks whether the found intl requires pthread, rather than
simply trusting the result of `cc.find_library()` for the external
library case.
Do the heavy lifting by using Meson to check for intl, and select the
correct implementation, but do a post-discovery check if the symbol is
linkable both with/without pthread.
The logic is still a bit hairy, and eventually more of the logic could
be moved into Meson. But it's better than before.
Fixes incorrect detection of intl on musl-based systems (which have a
less capable libc intl), when GNU libintl is installed as an external
library.
2022-05-24 21:26:04 +02:00
# libintl supports different threading APIs, which may not
# require additional flags, but it defaults to using pthreads if
# found. Meson's "threads" dependency does not allow you to
# prefer pthreads. We may not be using pthreads for glib itself
# either so just link the library to satisfy libintl rather than
# also defining the macros with the -pthread flag.
#
# Meson's builtin dependency lookup as of 0.60.0 doesn't check for
# pthread, so we do this manually here.
2022-09-07 23:06:33 +02:00
if cc . has_function ( 'ngettext' , dependencies : libintl , prefix : libintl_prefix )
meson: simplify intl lookups using Meson's builtin dependency lookup
intl is complicated to look up. Some of that complexity now resides in
Meson, since 0.59.0, via a `dependency('intl')` lookup, so use that
instead.
The Meson lookup doesn't include all the checks here, but likewise this
meson.build doesn't include all the checks in Meson. Particularly, the
following are different:
- Meson accurately detects support built into libc, even if that
conflicts with an external library version (which should be detected as
broken and thus not-found, but glib does not do so).
The problem here is that depending on which libintl.h header is first
in the search path, the *gettext symbols may be the libc ABI, or they
may be renamed to libintl_*gettext, then additionally take over the
*gettext names via a macro, in order to invoke the external library
version even on systems where there is a libc builtin. This means that
checking for `cc.has_function()` correctly reports that there is such
a function in libc, but that unfortunately does not mean it is usable,
because source code referencing `ngettext` etc. will expect to be
linked to `libintl_ngettext`.
- glib checks whether the found intl requires pthread, rather than
simply trusting the result of `cc.find_library()` for the external
library case.
Do the heavy lifting by using Meson to check for intl, and select the
correct implementation, but do a post-discovery check if the symbol is
linkable both with/without pthread.
The logic is still a bit hairy, and eventually more of the logic could
be moved into Meson. But it's better than before.
Fixes incorrect detection of intl on musl-based systems (which have a
less capable libc intl), when GNU libintl is installed as an external
library.
2022-05-24 21:26:04 +02:00
libintl_deps + = [ libintl ]
2018-08-29 12:59:47 +02:00
else
2023-05-23 23:42:37 +02:00
libintl_iconv = cc . find_library ( 'iconv' , required : false )
2023-06-29 03:10:03 +02:00
if libintl_iconv . found ( ) and cc . has_function ( 'ngettext' , args : osx_ldflags , dependencies : [ libintl , libintl_iconv ] )
2023-05-23 23:42:37 +02:00
libintl_deps + = [ libintl , libintl_iconv ]
meson: simplify intl lookups using Meson's builtin dependency lookup
intl is complicated to look up. Some of that complexity now resides in
Meson, since 0.59.0, via a `dependency('intl')` lookup, so use that
instead.
The Meson lookup doesn't include all the checks here, but likewise this
meson.build doesn't include all the checks in Meson. Particularly, the
following are different:
- Meson accurately detects support built into libc, even if that
conflicts with an external library version (which should be detected as
broken and thus not-found, but glib does not do so).
The problem here is that depending on which libintl.h header is first
in the search path, the *gettext symbols may be the libc ABI, or they
may be renamed to libintl_*gettext, then additionally take over the
*gettext names via a macro, in order to invoke the external library
version even on systems where there is a libc builtin. This means that
checking for `cc.has_function()` correctly reports that there is such
a function in libc, but that unfortunately does not mean it is usable,
because source code referencing `ngettext` etc. will expect to be
linked to `libintl_ngettext`.
- glib checks whether the found intl requires pthread, rather than
simply trusting the result of `cc.find_library()` for the external
library case.
Do the heavy lifting by using Meson to check for intl, and select the
correct implementation, but do a post-discovery check if the symbol is
linkable both with/without pthread.
The logic is still a bit hairy, and eventually more of the logic could
be moved into Meson. But it's better than before.
Fixes incorrect detection of intl on musl-based systems (which have a
less capable libc intl), when GNU libintl is installed as an external
library.
2022-05-24 21:26:04 +02:00
else
2023-05-23 23:42:37 +02:00
libintl_pthread = cc . find_library ( 'pthread' , required : false )
if libintl_pthread . found ( ) and cc . has_function ( 'ngettext' , dependencies : [ libintl , libintl_pthread ] , prefix : libintl_prefix )
libintl_deps + = [ libintl , libintl_pthread ]
else
libintl = disabler ( )
endif
meson: simplify intl lookups using Meson's builtin dependency lookup
intl is complicated to look up. Some of that complexity now resides in
Meson, since 0.59.0, via a `dependency('intl')` lookup, so use that
instead.
The Meson lookup doesn't include all the checks here, but likewise this
meson.build doesn't include all the checks in Meson. Particularly, the
following are different:
- Meson accurately detects support built into libc, even if that
conflicts with an external library version (which should be detected as
broken and thus not-found, but glib does not do so).
The problem here is that depending on which libintl.h header is first
in the search path, the *gettext symbols may be the libc ABI, or they
may be renamed to libintl_*gettext, then additionally take over the
*gettext names via a macro, in order to invoke the external library
version even on systems where there is a libc builtin. This means that
checking for `cc.has_function()` correctly reports that there is such
a function in libc, but that unfortunately does not mean it is usable,
because source code referencing `ngettext` etc. will expect to be
linked to `libintl_ngettext`.
- glib checks whether the found intl requires pthread, rather than
simply trusting the result of `cc.find_library()` for the external
library case.
Do the heavy lifting by using Meson to check for intl, and select the
correct implementation, but do a post-discovery check if the symbol is
linkable both with/without pthread.
The logic is still a bit hairy, and eventually more of the logic could
be moved into Meson. But it's better than before.
Fixes incorrect detection of intl on musl-based systems (which have a
less capable libc intl), when GNU libintl is installed as an external
library.
2022-05-24 21:26:04 +02:00
endif
2018-05-20 06:08:19 +02:00
endif
2017-03-21 17:36:22 +01:00
endif
2018-05-20 06:08:19 +02:00
2023-07-11 22:59:37 +02:00
if libintl . found ( ) and libintl . type_name ( ) != 'internal'
2022-09-07 23:06:33 +02:00
have_bind_textdomain_codeset = cc . has_function ( 'bind_textdomain_codeset' , dependencies : libintl_deps , prefix : libintl_prefix )
meson: simplify intl lookups using Meson's builtin dependency lookup
intl is complicated to look up. Some of that complexity now resides in
Meson, since 0.59.0, via a `dependency('intl')` lookup, so use that
instead.
The Meson lookup doesn't include all the checks here, but likewise this
meson.build doesn't include all the checks in Meson. Particularly, the
following are different:
- Meson accurately detects support built into libc, even if that
conflicts with an external library version (which should be detected as
broken and thus not-found, but glib does not do so).
The problem here is that depending on which libintl.h header is first
in the search path, the *gettext symbols may be the libc ABI, or they
may be renamed to libintl_*gettext, then additionally take over the
*gettext names via a macro, in order to invoke the external library
version even on systems where there is a libc builtin. This means that
checking for `cc.has_function()` correctly reports that there is such
a function in libc, but that unfortunately does not mean it is usable,
because source code referencing `ngettext` etc. will expect to be
linked to `libintl_ngettext`.
- glib checks whether the found intl requires pthread, rather than
simply trusting the result of `cc.find_library()` for the external
library case.
Do the heavy lifting by using Meson to check for intl, and select the
correct implementation, but do a post-discovery check if the symbol is
linkable both with/without pthread.
The logic is still a bit hairy, and eventually more of the logic could
be moved into Meson. But it's better than before.
Fixes incorrect detection of intl on musl-based systems (which have a
less capable libc intl), when GNU libintl is installed as an external
library.
2022-05-24 21:26:04 +02:00
else
2023-07-11 22:59:37 +02:00
# using proxy-libintl fallback
2022-12-30 12:25:47 +01:00
libintl = dependency ( 'intl' , allow_fallback : true )
assert ( libintl . type_name ( ) == 'internal' )
meson: simplify intl lookups using Meson's builtin dependency lookup
intl is complicated to look up. Some of that complexity now resides in
Meson, since 0.59.0, via a `dependency('intl')` lookup, so use that
instead.
The Meson lookup doesn't include all the checks here, but likewise this
meson.build doesn't include all the checks in Meson. Particularly, the
following are different:
- Meson accurately detects support built into libc, even if that
conflicts with an external library version (which should be detected as
broken and thus not-found, but glib does not do so).
The problem here is that depending on which libintl.h header is first
in the search path, the *gettext symbols may be the libc ABI, or they
may be renamed to libintl_*gettext, then additionally take over the
*gettext names via a macro, in order to invoke the external library
version even on systems where there is a libc builtin. This means that
checking for `cc.has_function()` correctly reports that there is such
a function in libc, but that unfortunately does not mean it is usable,
because source code referencing `ngettext` etc. will expect to be
linked to `libintl_ngettext`.
- glib checks whether the found intl requires pthread, rather than
simply trusting the result of `cc.find_library()` for the external
library case.
Do the heavy lifting by using Meson to check for intl, and select the
correct implementation, but do a post-discovery check if the symbol is
linkable both with/without pthread.
The logic is still a bit hairy, and eventually more of the logic could
be moved into Meson. But it's better than before.
Fixes incorrect detection of intl on musl-based systems (which have a
less capable libc intl), when GNU libintl is installed as an external
library.
2022-05-24 21:26:04 +02:00
libintl_deps = [ libintl ]
have_bind_textdomain_codeset = true # proxy-libintl supports it
endif
2018-08-29 12:59:47 +02:00
glib_conf . set ( 'HAVE_BIND_TEXTDOMAIN_CODESET' , have_bind_textdomain_codeset )
2017-03-21 17:36:22 +01:00
# We require gettext to always be present
2018-05-20 06:08:19 +02:00
glib_conf . set ( 'HAVE_DCGETTEXT' , 1 )
2017-03-21 17:36:22 +01:00
glib_conf . set ( 'HAVE_GETTEXT' , 1 )
2018-05-20 06:08:19 +02:00
2017-03-21 17:36:22 +01:00
glib_conf . set_quoted ( 'GLIB_LOCALE_DIR' , join_paths ( glib_datadir , 'locale' ) )
2016-12-20 23:37:24 +01:00
2022-11-28 16:55:32 +01:00
glib_conf . set_quoted ( 'GLIB_LOCALSTATEDIR' , glib_localstatedir )
2022-11-30 14:45:34 +01:00
glib_conf . set_quoted ( 'GLIB_RUNSTATEDIR' , glib_runstatedir )
2022-11-28 16:55:32 +01:00
2016-12-21 02:04:47 +01:00
# libmount is only used by gio, but we need to fetch the libs to generate the
# pkg-config file below
libmount_dep = [ ]
2020-01-29 12:15:47 +01:00
if host_system == 'linux'
libmount_dep = dependency ( 'mount' , version : '>=2.23' , required : get_option ( 'libmount' ) )
glib_conf . set ( 'HAVE_LIBMOUNT' , libmount_dep . found ( ) )
2016-12-21 02:04:47 +01:00
endif
2016-12-20 23:37:24 +01:00
if host_system == 'windows'
winsock2 = cc . find_library ( 'ws2_32' )
2022-04-08 14:50:57 +02:00
else
winsock2 = not_found
2016-12-20 23:37:24 +01:00
endif
2017-11-28 16:44:04 +01:00
selinux_dep = [ ]
2018-11-20 12:55:26 +01:00
if host_system == 'linux'
2020-12-01 10:08:30 +01:00
selinux_dep = dependency ( 'libselinux' , version : '>=2.2' , required : get_option ( 'selinux' ) )
2018-11-20 12:55:26 +01:00
glib_conf . set ( 'HAVE_SELINUX' , selinux_dep . found ( ) )
2017-11-28 16:44:04 +01:00
endif
xattr_dep = [ ]
2017-12-25 22:17:49 +01:00
if host_system != 'windows' and get_option ( 'xattr' )
2017-11-28 16:44:04 +01:00
# either glibc or libattr can provide xattr support
# for both of them, we check for getxattr being in
# the library and a valid xattr header.
# try glibc
if cc . has_function ( 'getxattr' ) and cc . has_header ( 'sys/xattr.h' )
glib_conf . set ( 'HAVE_SYS_XATTR_H' , 1 )
glib_conf_prefix = glib_conf_prefix + '#define @0@ 1\n' . format ( 'HAVE_SYS_XATTR_H' )
#failure. try libattr
elif cc . has_header_symbol ( 'attr/xattr.h' , 'getxattr' )
glib_conf . set ( 'HAVE_ATTR_XATTR_H' , 1 )
glib_conf_prefix = glib_conf_prefix + '#define @0@ 1\n' . format ( 'HAVE_ATTR_XATTR_H' )
xattr_dep = [ cc . find_library ( 'xattr' ) ]
else
error ( 'No getxattr implementation found in C library or libxattr' )
endif
glib_conf . set ( 'HAVE_XATTR' , 1 )
if cc . compiles ( glib_conf_prefix + '' '
#include <stdio.h>
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_XATTR_H
#include <sys/xattr.h>
#elif HAVE_ATTR_XATTR_H
#include <attr/xattr.h>
#endif
int main ( void ) {
ssize_t len = getxattr ( " " , " " , NULL , 0 , 0 , XATTR_NOFOLLOW ) ;
2018-05-17 16:10:50 +02:00
return len ;
2017-11-28 16:44:04 +01:00
} '' ' ,
name : 'XATTR_NOFOLLOW' )
glib_conf . set ( 'HAVE_XATTR_NOFOLLOW' , 1 )
endif
endif
2019-03-13 17:22:09 +01:00
# If strlcpy is present (BSD and similar), check that it conforms to the BSD
# specification. Specifically Solaris 8's strlcpy() does not, see
# https://bugzilla.gnome.org/show_bug.cgi?id=53933 for further context.
if cc . has_function ( 'strlcpy' )
if cc_can_run
rres = cc . run ( '' ' #include <stdlib.h>
#include <string.h>
int main ( ) {
char p [ 10 ] ;
( void ) strlcpy ( p , " hi " , 10 ) ;
if ( strlcat ( p , " bye " , 0 ) != 3 )
return 1 ;
return 0 ;
} '' ' ,
name : 'OpenBSD strlcpy/strlcat' )
if rres . compiled ( ) and rres . returncode ( ) == 0
glib_conf . set ( 'HAVE_STRLCPY' , 1 )
endif
2022-05-06 14:16:26 +02:00
elif meson . get_external_property ( 'have_strlcpy' , false )
2018-06-14 20:00:43 +02:00
glib_conf . set ( 'HAVE_STRLCPY' , 1 )
endif
endif
2019-03-20 22:19:29 +01:00
cmdline_test_code = '' '
#include <fcntl.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
2021-08-14 12:20:11 +02:00
#include <unistd.h>
2019-03-20 22:19:29 +01:00
static int
__getcmdline ( void )
{
/ * This code is a dumbed - down version of g_file_get_contents ( ) * /
2019-04-07 20:41:39 +02:00
#ifndef O_BINARY
#define O_BINARY 0
#endif
2019-03-20 22:19:29 +01:00
#define BUFSIZE 1024
char result [ BUFSIZE ] ;
struct stat stat_buf ;
int fd = open ( " / proc / self / cmdline " , O_RDONLY | O_BINARY ) ;
2020-03-08 07:39:23 +01:00
if ( fd < 0 )
exit ( 1 ) ;
if ( fstat ( fd , & stat_buf ) )
exit ( 1 ) ;
2019-03-20 22:19:29 +01:00
if ( stat_buf . st_size > 0 & & S_ISREG ( stat_buf . st_mode ) )
2020-03-08 07:39:23 +01:00
{
if ( read ( fd , result , BUFSIZE ) < = 0 )
exit ( 1 ) ;
}
2019-03-20 22:19:29 +01:00
else
{
FILE * f = fdopen ( fd , " r " ) ;
2020-03-08 07:39:23 +01:00
if ( f == NULL )
exit ( 1 ) ;
if ( fread ( result , 1 , BUFSIZE , f ) < = 0 )
exit ( 1 ) ;
2019-03-20 22:19:29 +01:00
}
return 0 ;
}
int
main ( void )
{
exit ( __getcmdline ( ) ) ;
} '' '
if cc_can_run
rres = cc . run ( cmdline_test_code , name : '/proc/self/cmdline' )
have_proc_self_cmdline = rres . compiled ( ) and rres . returncode ( ) == 0
else
2022-05-06 14:16:26 +02:00
have_proc_self_cmdline = meson . get_external_property ( 'have_proc_self_cmdline' , false )
2019-03-20 22:19:29 +01:00
endif
glib_conf . set ( 'HAVE_PROC_SELF_CMDLINE' , have_proc_self_cmdline )
2023-12-10 22:57:09 +01:00
python = import ( 'python' ) . find_installation ( modules : [ 'packaging' ] )
2018-07-18 17:03:22 +02:00
# used for '#!/usr/bin/env <name>'
python_name = 'python3'
2016-03-07 12:13:24 +01:00
2022-03-21 14:17:32 +01:00
python_version = python . language_version ( )
2023-12-01 16:51:15 +01:00
python_version_req = '>=3.7'
2022-03-21 14:17:32 +01:00
if not python_version . version_compare ( python_version_req )
error ( 'Requires Python @0@, @1@ found.' . format ( python_version_req , python_version ) )
endif
2017-07-27 10:48:11 +02:00
# Determine which user environment-dependent files that we want to install
2023-04-14 19:56:32 +02:00
bash = find_program ( 'bash' , required : false )
have_bash = bash . found ( ) # For completion scripts
2021-01-24 15:54:18 +01:00
bash_comp_dep = dependency ( 'bash-completion' , version : '>=2.0' , required : false )
2017-07-27 10:48:11 +02:00
have_sh = find_program ( 'sh' , required : false ) . found ( ) # For glib-gettextize
2023-04-14 19:56:32 +02:00
have_pkg_config = find_program ( 'pkg-config' , required : false ) . found ( )
2017-07-27 10:48:11 +02:00
2019-02-12 12:29:10 +01:00
# Some installed tests require a custom environment
env_program = find_program ( 'env' , required : installed_tests_enabled )
2018-06-05 22:30:04 +02:00
# FIXME: How to detect Solaris? https://github.com/mesonbuild/meson/issues/1578
if host_system == 'sunos'
glib_conf . set ( '_XOPEN_SOURCE_EXTENDED' , 1 )
glib_conf . set ( '_XOPEN_SOURCE' , 2 )
glib_conf . set ( '__EXTENSIONS__' , 1 )
endif
2018-01-03 17:13:40 +01:00
# Sadly Meson does not expose this value:
# https://github.com/mesonbuild/meson/pull/3460
if host_system == 'windows'
# Autotools explicitly removed --Wl,--export-all-symbols from windows builds,
# with no explanation. Do the same here for now but this could be revisited if
# if causes issues.
2023-07-18 19:26:43 +02:00
export_dynamic_ldflags = [ ]
2018-01-03 17:13:40 +01:00
elif host_system == 'cygwin'
2023-07-18 19:26:43 +02:00
export_dynamic_ldflags = [ '-Wl,--export-all-symbols' ]
2020-05-28 21:01:35 +02:00
elif host_system in [ 'darwin' , 'ios' ]
2023-07-18 19:26:43 +02:00
export_dynamic_ldflags = [ ]
2019-10-04 22:23:25 +02:00
elif host_system == 'sunos'
2023-07-18 19:26:43 +02:00
export_dynamic_ldflags = [ ]
2018-01-03 17:13:40 +01:00
else
2023-07-18 19:26:43 +02:00
export_dynamic_ldflags = [ '-Wl,--export-dynamic' ]
2018-01-03 17:13:40 +01:00
endif
2018-05-15 21:17:28 +02:00
Revert "build-sys: drop -mms-bitfields GCC flag"
This reverts commit 252bbcd2078aadc67a49bacd5b2cd4fd348a8dd7.
After further discussion in !3511, we’ve decided that there are risks
associated with this change, and it’s not the best way of addressing the
original problem.
The original motivation for the change turned out to be that
`-mms-bitfields` was not handled by `windres`, which was receiving it
from `pkg-config --cflags glib-2.0` in some projects. However, if
`windres` is claiming to accept CFLAGS then it should accept (and
ignore) `-mms-bitfields`, since the `-m` family of options are defined
in `man gcc`, just like `-I`, `-D`, etc.
There is some question that there might still be third party projects
which are built with an old enough compiler that `-mms-bitfields` is not
the compiler default. For that reason, we should either still continue
to specify `-mms-bitfields` in the `.pc` file, or add a test to assert
that third party projects are always compiled with `-mms-bitfields` set.
But adding a new test for all third-party compilations is risky (if we
get it wrong, things will break; and it’s a test which may behave
differently on different platforms), so it seems safer to just keep
`-mms-bitfields` in `.pc` for now.
Once all compilers which we require specify `-mms-bitfields` by default,
we can finally drop this flag (without adding a test for third-party
compilations).
See: https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3511
2023-07-29 10:54:22 +02:00
win32_cflags = [ ]
2018-05-15 21:17:28 +02:00
win32_ldflags = [ ]
2019-07-09 18:22:51 +02:00
if host_system == 'windows' and cc . get_id ( ) != 'msvc' and cc . get_id ( ) != 'clang-cl'
Revert "build-sys: drop -mms-bitfields GCC flag"
This reverts commit 252bbcd2078aadc67a49bacd5b2cd4fd348a8dd7.
After further discussion in !3511, we’ve decided that there are risks
associated with this change, and it’s not the best way of addressing the
original problem.
The original motivation for the change turned out to be that
`-mms-bitfields` was not handled by `windres`, which was receiving it
from `pkg-config --cflags glib-2.0` in some projects. However, if
`windres` is claiming to accept CFLAGS then it should accept (and
ignore) `-mms-bitfields`, since the `-m` family of options are defined
in `man gcc`, just like `-I`, `-D`, etc.
There is some question that there might still be third party projects
which are built with an old enough compiler that `-mms-bitfields` is not
the compiler default. For that reason, we should either still continue
to specify `-mms-bitfields` in the `.pc` file, or add a test to assert
that third party projects are always compiled with `-mms-bitfields` set.
But adding a new test for all third-party compilations is risky (if we
get it wrong, things will break; and it’s a test which may behave
differently on different platforms), so it seems safer to just keep
`-mms-bitfields` in `.pc` for now.
Once all compilers which we require specify `-mms-bitfields` by default,
we can finally drop this flag (without adding a test for third-party
compilations).
See: https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3511
2023-07-29 10:54:22 +02:00
# Ensure MSVC-compatible struct packing convention is used when
# compiling for Win32 with gcc. It is used for the whole project and exposed
# in glib-2.0.pc.
2023-07-30 15:29:27 +02:00
if not cc . compiles ( '' '
struct _GTestMSBitfields
{
int a : 1 ;
short b : 1 ;
} ;
typedef char _StaticCheck [ sizeof ( struct _GTestMSBitfields ) != sizeof ( int ) ? 1 : - 1 ] ;
'' ' )
warning ( '' '
Your compiler does not have ms - bitfields packing by default .
Please use gcc > = 4 . 7 or clang > = 12 : GLib will drop - mms - bitfields in the future .
'' ' )
endif
Revert "build-sys: drop -mms-bitfields GCC flag"
This reverts commit 252bbcd2078aadc67a49bacd5b2cd4fd348a8dd7.
After further discussion in !3511, we’ve decided that there are risks
associated with this change, and it’s not the best way of addressing the
original problem.
The original motivation for the change turned out to be that
`-mms-bitfields` was not handled by `windres`, which was receiving it
from `pkg-config --cflags glib-2.0` in some projects. However, if
`windres` is claiming to accept CFLAGS then it should accept (and
ignore) `-mms-bitfields`, since the `-m` family of options are defined
in `man gcc`, just like `-I`, `-D`, etc.
There is some question that there might still be third party projects
which are built with an old enough compiler that `-mms-bitfields` is not
the compiler default. For that reason, we should either still continue
to specify `-mms-bitfields` in the `.pc` file, or add a test to assert
that third party projects are always compiled with `-mms-bitfields` set.
But adding a new test for all third-party compilations is risky (if we
get it wrong, things will break; and it’s a test which may behave
differently on different platforms), so it seems safer to just keep
`-mms-bitfields` in `.pc` for now.
Once all compilers which we require specify `-mms-bitfields` by default,
we can finally drop this flag (without adding a test for third-party
compilations).
See: https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3511
2023-07-29 10:54:22 +02:00
win32_cflags = [ '-mms-bitfields' ]
add_project_arguments ( win32_cflags , language : 'c' )
2018-05-15 21:17:28 +02:00
# Win32 API libs, used only by libglib and exposed in glib-2.0.pc
2021-12-02 20:33:46 +01:00
win32_ldflags = [ '-lws2_32' , '-lole32' , '-lwinmm' , '-lshlwapi' , '-luuid' ]
2018-05-15 21:17:28 +02:00
elif host_system == 'cygwin'
win32_ldflags = [ '-luser32' , '-lkernel32' ]
endif
2013-08-07 22:41:12 +02:00
2017-01-25 18:02:51 +01:00
# Tracing: dtrace
2017-11-28 16:44:04 +01:00
want_dtrace = get_option ( 'dtrace' )
2017-01-25 18:02:51 +01:00
enable_dtrace = false
# Since dtrace support is opt-in we just error out if it was requested but
# is not available. We don't bother with autodetection yet.
if want_dtrace
if glib_have_carbon
error ( 'GLib dtrace support not yet compatible with macOS dtrace' )
endif
dtrace = find_program ( 'dtrace' , required : true ) # error out if not found
if not cc . has_header ( 'sys/sdt.h' )
error ( 'dtrace support needs sys/sdt.h header' )
endif
# FIXME: autotools build also passes -fPIC -DPIC but is it needed in this case?
dtrace_obj_gen = generator ( dtrace ,
output : '@BASENAME@.o' ,
arguments : [ '-G' , '-s' , '@INPUT@' , '-o' , '@OUTPUT@' ] )
2022-10-24 20:33:38 +02:00
dtrace_hdr_gen = generator ( python ,
2017-01-25 18:02:51 +01:00
output : '@BASENAME@.h' ,
2022-10-24 20:33:38 +02:00
arguments : [ '-c' , '' '
import subprocess , sys
subprocess . run ( sys . argv [ 1 : ] , check = True )
output = sys . argv [ 6 ]
with open ( output ) as f :
contents = f . read ( )
contents = contents . replace ( " define STAP_HAS_SEMAPHORES 1 " ,
" undef STAP_HAS_SEMAPHORES " )
contents = contents . replace ( " define _SDT_HAS_SEMAPHORES 1 " ,
" undef _SDT_HAS_SEMAPHORES " )
with open ( output , " w " ) as f :
f . write ( contents )
'' ', dtrace.full_path(), ' - h ', ' - s ', ' @ INPUT @ ', ' - o ', ' @ OUTPUT @ ' ] )
2017-01-25 18:02:51 +01:00
glib_conf . set ( 'HAVE_DTRACE' , 1 )
enable_dtrace = true
endif
2023-10-26 09:56:53 +02:00
if cc . has_header_symbol ( 'sys/ptrace.h' , 'PTRACE_O_EXITKILL' )
glib_conf . set ( 'HAVE_PTRACE_O_EXITKILL' , 1 )
endif
2017-01-25 18:02:51 +01:00
# systemtap
2017-11-28 16:44:04 +01:00
want_systemtap = get_option ( 'systemtap' )
2017-01-25 18:02:51 +01:00
enable_systemtap = false
if want_systemtap and enable_dtrace
2017-11-28 16:44:04 +01:00
tapset_install_dir = get_option ( 'tapset_install_dir' )
2017-01-25 18:02:51 +01:00
if tapset_install_dir == ''
2017-11-28 15:03:11 +01:00
tapset_install_dir = join_paths ( get_option ( 'datadir' ) , 'systemtap/tapset' , host_machine . cpu_family ( ) )
2017-01-25 18:02:51 +01:00
endif
stp_cdata = configuration_data ( )
stp_cdata . set ( 'ABS_GLIB_RUNTIME_LIBDIR' , glib_libdir )
2018-02-12 13:28:28 +01:00
stp_cdata . set ( 'LT_CURRENT' , minor_version * 100 )
stp_cdata . set ( 'LT_REVISION' , micro_version )
2017-01-25 18:02:51 +01:00
enable_systemtap = true
endif
2023-10-13 13:57:57 +02:00
# introspection
gir_scanner = find_program ( 'g-ir-scanner' , required : get_option ( 'introspection' ) )
enable_gir = get_option ( 'introspection' ) . allowed ( ) and gir_scanner . found ( ) and meson . can_run_host_binaries ( )
if get_option ( 'introspection' ) . enabled ( ) and not meson . can_run_host_binaries ( )
error ( 'Running binaries on the build host needs to be supported to build with -Dintrospection=enabled' )
endif
gir_args = [
'--quiet' ,
]
2017-12-11 20:47:04 +01:00
pkg = import ( 'pkgconfig' )
2017-12-14 13:32:56 +01:00
windows = import ( 'windows' )
2023-10-13 13:57:57 +02:00
gnome = import ( 'gnome' )
2022-10-03 16:36:04 +02:00
subdir ( 'tools' )
2013-08-07 22:41:12 +02:00
subdir ( 'glib' )
2016-03-07 12:13:24 +01:00
subdir ( 'gobject' )
subdir ( 'gthread' )
subdir ( 'gmodule' )
subdir ( 'gio' )
2023-12-20 03:46:33 +01:00
if enable_gir
subdir ( 'introspection' )
endif
2023-10-16 16:24:08 +02:00
subdir ( 'girepository' )
2018-10-11 02:02:03 +02:00
subdir ( 'fuzzing' )
2016-03-07 12:13:24 +01:00
2018-11-20 17:28:56 +01:00
# xgettext is optional (on Windows for instance)
if find_program ( 'xgettext' , required : get_option ( 'nls' ) ) . found ( )
subdir ( 'po' )
endif
2018-09-10 13:44:59 +02:00
# Install m4 macros that other projects use
install_data ( 'm4macros/glib-2.0.m4' , 'm4macros/glib-gettext.m4' , 'm4macros/gsettings.m4' ,
2022-09-18 22:51:55 +02:00
install_dir : get_option ( 'datadir' ) / 'aclocal' ,
install_tag : 'devel' ,
)
2017-07-27 10:48:11 +02:00
2022-11-02 16:55:48 +01:00
# Check whether we support overriding the invalid parameter handler on Windows for _get_osfhandle(),
# g_fsync() (i.e. _commit()), etc
if host_system == 'windows'
if cc . has_function ( '_set_thread_local_invalid_parameter_handler' , prefix : '#include <stdlib.h>' )
glib_conf . set ( 'HAVE__SET_THREAD_LOCAL_INVALID_PARAMETER_HANDLER' , 1 )
endif
if cc . has_function ( '_set_invalid_parameter_handler' , prefix : '#include <stdlib.h>' )
glib_conf . set ( 'HAVE__SET_INVALID_PARAMETER_HANDLER' , 1 )
endif
if cc . has_header_symbol ( 'crtdbg.h' , '_CrtSetReportMode' )
glib_conf . set ( 'HAVE__CRT_SET_REPORT_MODE' , 1 )
endif
endif
2018-05-23 21:11:09 +02:00
configure_file ( output : 'config.h' , configuration : glib_conf )
2016-12-06 14:07:03 +01:00
2023-12-20 15:04:11 +01:00
rst2man = find_program ( 'rst2man' , 'rst2man.py' , required : get_option ( 'man-pages' ) )
if rst2man . found ( )
rst2man_flags = [
'--syntax-highlight=none' ,
2016-12-07 11:28:33 +01:00
]
2020-02-07 17:34:13 +01:00
man1_dir = join_paths ( glib_prefix , get_option ( 'mandir' ) , 'man1' )
2016-12-06 14:07:03 +01:00
endif
2016-12-07 11:28:33 +01:00
gnome = import ( 'gnome' )
2019-05-22 19:26:41 +02:00
subdir ( 'docs/reference' )
2022-10-20 03:32:32 +02:00
summary ( {
'host cpu' : host_machine . cpu_family ( ) ,
'host endian' : host_machine . endian ( ) ,
'host system' : host_system ,
'C Compiler' : cc . get_id ( ) ,
'C++ Compiler' : have_cxx ? cxx . get_id ( ) : 'none' ,
'shared build' : glib_build_shared ,
'static build' : glib_build_static ,
} , section : 'Build environment' )
if build_machine . system ( ) != host_system
summary ( {
'build cpu' : build_machine . cpu_family ( ) ,
'build endian' : build_machine . endian ( ) ,
'build system' : build_machine . system ( ) ,
} , section : 'Build environment' )
endif
2023-08-10 20:10:01 +02:00
if linux_libc != ''
summary ( {
'linux_libc' : linux_libc
} , section : 'Build environment' )
endif
2022-10-20 03:32:32 +02:00
summary ( {
'prefix' : glib_prefix ,
'bindir' : glib_bindir ,
'libexecdir' : glib_libexecdir ,
'pkgdatadir' : glib_pkgdatadir ,
'datadir' : glib_datadir ,
'includedir' : glib_includedir ,
'giomodulesdir' : glib_giomodulesdir ,
'localstatedir' : glib_localstatedir ,
2022-11-30 14:45:34 +01:00
'runstatedir' : glib_runstatedir ,
2022-10-20 03:32:32 +02:00
} , section : 'Directories' )
if get_option ( 'multiarch' )
summary ( {
'multiarch bindir' : glib_bindir ,
'multiarch libexecdir' : glib_libexecdir ,
} , section : 'Directories' )
endif
if enable_systemtap
summary ( 'tapset dir' , get_option ( 'tapset_install_dir' ) , section : 'Directories' )
endif
if host_system == 'linux'
summary ( {
'selinux' : selinux_dep . found ( ) ,
'libmount' : libmount_dep . found ( ) ,
} , section : 'Options' )
endif
summary ( {
'xattr' : xattr_dep . length ( ) > 0 ,
2023-12-20 15:04:11 +01:00
'man-pages' : get_option ( 'man-pages' ) ,
2022-10-20 03:32:32 +02:00
'dtrace' : get_option ( 'dtrace' ) ,
'systemtap' : enable_systemtap ,
'sysprof' : libsysprof_capture_dep . found ( ) ,
2023-11-29 11:26:37 +01:00
'documentation' : get_option ( 'documentation' ) ,
2022-10-20 03:32:32 +02:00
'bsymbolic_functions' : get_option ( 'bsymbolic_functions' ) ,
'force_posix_threads' : get_option ( 'force_posix_threads' ) ,
'tests' : get_option ( 'tests' ) ,
'installed_tests' : get_option ( 'installed_tests' ) ,
'nls' : get_option ( 'nls' ) ,
'oss_fuzz' : get_option ( 'oss_fuzz' ) ,
'glib_debug' : get_option ( 'glib_debug' ) ,
'glib_assert' : get_option ( 'glib_assert' ) ,
'glib_checks' : get_option ( 'glib_checks' ) ,
'libelf' : get_option ( 'libelf' ) ,
'multiarch' : get_option ( 'multiarch' ) ,
2023-10-13 13:57:57 +02:00
'introspection' : enable_gir ,
2022-10-20 03:32:32 +02:00
} , section : 'Options' )