glib/glib/meson.build
Calvin Walton 013980d839 Use the python found by meson as the interpreter for installed scripts
The python interpreter found by `/usr/bin/env python3` is not
necessarily the same installation as the one that's found by meson's
`pymod.find_installation('python')`. This means that even though meson
is checking that the python installation it found includes the
'packaging' module, the scripts might not have access to that module
when run.

For distribution packaging, it's usually desirable to have python script
interpreters be fully specified paths, rather than use `/usr/bin/env`,
to ensure the scripts run using the expected python installation (i.e.
the one where the python 'packaging' dependency is installed).

The easiest way to fix this is to set the script interpreter to the
`full_path()` of the python interpreter found by meson. The specific
python interpreter that will be used can be selected through the use of
a meson machine file by overriding the "python" program. Many
distributions already have this set up using meson packaging helpers.
2024-03-25 15:17:59 -04:00

560 lines
14 KiB
Meson

glib_sources = []
glib_sub_includedir = glib_includedir / 'glib'
glibconfig_h = configure_file(input : 'glibconfig.h.in', output : 'glibconfig.h',
install_dir : join_paths(get_option('libdir'), 'glib-2.0/include'),
install_tag : 'devel',
configuration : glibconfig_conf)
glib_sources += glibconfig_h
gversionmacros_h = custom_target(
input: 'gversionmacros.h.in',
output: 'gversionmacros.h',
command: [gen_visibility_macros, meson.project_version(), 'versions-macros', '@INPUT@', '@OUTPUT@'],
install: true,
install_dir: glib_sub_includedir,
# FIXME: Not needed with Meson >= 0.64.0
install_tag: 'devel',
)
glib_visibility_h = custom_target(
output: 'glib-visibility.h',
command: [gen_visibility_macros, meson.project_version(), 'visibility-macros', 'GLIB', '@OUTPUT@'],
install: true,
install_dir: glib_sub_includedir,
# FIXME: Not needed with Meson >= 0.64.0
install_tag: 'devel',
)
glib_built_headers = [gversionmacros_h, glib_visibility_h]
glib_sources += glib_built_headers
glib_c_args_internal = [
'-DGLIB_COMPILATION',
]
subdir('libcharset')
# libsysprof-capture support
libsysprof_capture_dep = dependency('sysprof-capture-4', version: '>= 3.38.0',
required: get_option('sysprof'),
default_options: [
'examples=false',
'gtk=false',
'tests=false',
'tools=false',
'libsysprof=false',
'sysprofd=none',
'help=false',
],
fallback: ['sysprof', 'libsysprof_capture_dep'],
)
glib_conf.set('HAVE_SYSPROF', libsysprof_capture_dep.found())
if use_system_printf
gnulib_lib = []
gnulib_libm_dependency = []
glib_conf.set ('gl_unused', '')
glib_conf.set ('gl_extern_inline', '')
else
subdir ('gnulib/gl_extern_inline')
subdir ('gnulib/gl_cv_long_double_equals_double')
subdir ('gnulib/gl_cv_cc_double_expbit0')
subdir ('gnulib/gl_cv_func_printf_precision')
subdir ('gnulib/gl_cv_func_printf_enomem')
subdir ('gnulib/gl_cv_func_printf_flag_zero')
subdir ('gnulib/gl_cv_func_printf_flag_leftadjust')
subdir ('gnulib/gl_cv_func_printf_flag_grouping')
subdir ('gnulib/gl_cv_func_printf_directive_a')
subdir ('gnulib/gl_cv_func_printf_directive_f')
subdir ('gnulib/gl_cv_func_printf_directive_ls')
subdir ('gnulib/gl_cv_func_printf_long_double')
subdir ('gnulib/gl_cv_func_printf_infinite')
subdir ('gnulib/gl_cv_func_printf_infinite_long_double')
gl_unused = '''
/* Define as a marker that can be attached to declarations that might not
be used. This helps to reduce warnings, such as from
GCC -Wunused-parameter. */
#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
# define _GL_UNUSED __attribute__ ((__unused__))
#else
# define _GL_UNUSED
#endif
'''
glib_conf.set ('gl_unused', gl_unused)
glib_conf.set ('gl_extern_inline', gl_extern_inline)
if (gl_cv_long_double_equals_double)
glib_conf.set ('HAVE_SAME_LONG_DOUBLE_AS_DOUBLE', 1)
endif
if (gl_cv_cc_double_expbit0_word >= 0 and
gl_cv_cc_double_expbit0_bit >= 0)
glib_conf.set('DBL_EXPBIT0_WORD', gl_cv_cc_double_expbit0_word)
glib_conf.set('DBL_EXPBIT0_BIT', gl_cv_cc_double_expbit0_bit)
endif
if not gl_cv_func_printf_precision
glib_conf.set('NEED_PRINTF_UNBOUNDED_PRECISION', 1)
endif
if not gl_cv_func_printf_enomem
glib_conf.set('NEED_PRINTF_ENOMEM', 1)
endif
if not gl_cv_func_printf_flag_leftadjust
glib_conf.set('NEED_PRINTF_FLAG_LEFTADJUST', 1)
endif
if not gl_cv_func_printf_flag_zero
glib_conf.set('NEED_PRINTF_FLAG_ZERO', 1)
endif
if not gl_cv_func_printf_flag_grouping
glib_conf.set('NEED_PRINTF_FLAG_GROUPING', 1)
endif
if not gl_cv_func_printf_directive_a
glib_conf.set('NEED_PRINTF_DIRECTIVE_A', 1)
endif
if not gl_cv_func_printf_directive_f
glib_conf.set('NEED_PRINTF_DIRECTIVE_F', 1)
endif
if not gl_cv_func_printf_directive_ls
glib_conf.set('NEED_PRINTF_DIRECTIVE_LS', 1)
endif
if (not gl_cv_func_printf_precision or
not gl_cv_func_printf_enomem)
glib_conf.set('NEED_PRINTF_DOUBLE', 1)
glib_conf.set('NEED_PRINTF_LONG_DOUBLE', 1)
endif
if not gl_cv_func_printf_infinite
glib_conf.set('NEED_PRINTF_INFINITE_DOUBLE', 1)
endif
if gl_cv_func_printf_long_double and gl_cv_func_printf_infinite_long_double
glib_conf.set('NEED_PRINTF_INFINITE_LONG_DOUBLE', 1)
endif
subdir('gnulib')
endif
glib_headers = files(
'glib.h',
'glib-object.h',
)
install_headers(glib_headers, install_dir : glib_includedir)
if host_system != 'windows'
glib_unix_headers = files('glib-unix.h')
install_headers(glib_unix_headers, install_dir : glib_includedir)
endif
if host_system == 'windows'
install_headers([ 'msvc_recommended_pragmas.h' ], install_dir : glib_includedir)
endif
glib_deprecated_headers = files(
'deprecated/gallocator.h',
'deprecated/gcache.h',
'deprecated/gcompletion.h',
'deprecated/gmain.h',
'deprecated/grel.h',
'deprecated/gthread.h',
)
install_headers(glib_deprecated_headers,
install_dir : glib_sub_includedir / 'deprecated')
glib_sub_headers = files(
'glib-autocleanups.h',
'glib-typeof.h',
'galloca.h',
'garray.h',
'gasyncqueue.h',
'gatomic.h',
'gbacktrace.h',
'gbase64.h',
'gbitlock.h',
'gbookmarkfile.h',
'gbytes.h',
'gcharset.h',
'gchecksum.h',
'gconvert.h',
'gdataset.h',
'gdate.h',
'gdatetime.h',
'gdir.h',
'genviron.h',
'gerror.h',
'gfileutils.h',
'ggettext.h',
'ghash.h',
'ghmac.h',
'ghook.h',
'ghostutils.h',
'gi18n.h',
'gi18n-lib.h',
'giochannel.h',
'gkeyfile.h',
'glist.h',
'gmacros.h',
'gmain.h',
'gmappedfile.h',
'gmarkup.h',
'gmem.h',
'gmessages.h',
'gnode.h',
'goption.h',
'gpathbuf.h',
'gpattern.h',
'gpoll.h',
'gprimes.h',
'gqsort.h',
'gquark.h',
'gqueue.h',
'grand.h',
'grcbox.h',
'grefcount.h',
'grefstring.h',
'gregex.h',
'gscanner.h',
'gsequence.h',
'gshell.h',
'gslice.h',
'gslist.h',
'gspawn.h',
'gstdio.h',
'gstrfuncs.h',
'gstrvbuilder.h',
'gtestutils.h',
'gstring.h',
'gstringchunk.h',
'gthread.h',
'gthreadpool.h',
'gtimer.h',
'gtimezone.h',
'gtrashstack.h',
'gtree.h',
'gtypes.h',
'guuid.h',
'gunicode.h',
'guri.h',
'gutils.h',
'gvarianttype.h',
'gvariant.h',
'gversion.h',
'gprintf.h',
)
install_headers(glib_sub_headers, install_dir : glib_sub_includedir)
if host_system == 'windows'
glib_win32_headers = files('gwin32.h')
install_headers(glib_win32_headers, install_dir : glib_sub_includedir)
endif
glib_deprecated_sources = files(
'deprecated/gallocator.c',
'deprecated/gcache.c',
'deprecated/gcompletion.c',
'deprecated/grel.c',
'deprecated/gthread-deprecated.c'
)
glib_sources += files(
'garcbox.c',
'garray.c',
'gasyncqueue.c',
'gatomic.c',
'gbacktrace.c',
'gbase64.c',
'gbitlock.c',
'gbookmarkfile.c',
'gbytes.c',
'gcharset.c',
'gchecksum.c',
'gconvert.c',
'gdataset.c',
'gdate.c',
'gdatetime.c',
'gdatetime-private.c',
'gdir.c',
'genviron.c',
'gerror.c',
'gfileutils.c',
'ggettext.c',
'ghash.c',
'ghmac.c',
'ghook.c',
'ghostutils.c',
'giochannel.c',
'gkeyfile.c',
'glib-init.c',
'glib-private.c',
'glist.c',
'gmain.c',
'gmappedfile.c',
'gmarkup.c',
'gmem.c',
'gmessages.c',
'gnode.c',
'goption.c',
'gpathbuf.c',
'gpattern.c',
'gpoll.c',
'gprimes.c',
'gqsort.c',
'gquark.c',
'gqueue.c',
'grand.c',
'grcbox.c',
'grefcount.c',
'grefstring.c',
'gregex.c',
'gscanner.c',
'gsequence.c',
'gshell.c',
'gslice.c',
'gslist.c',
'gstdio.c',
'gstrfuncs.c',
'gstring.c',
'gstringchunk.c',
'gstrvbuilder.c',
'gtestutils.c',
'gthread.c',
'gthreadpool.c',
'gtimer.c',
'gtimezone.c',
'gtrace.c',
'gtranslit.c',
'gtrashstack.c',
'gtree.c',
'guniprop.c',
'gutf8.c',
'gunibreak.c',
'gunicollate.c',
'gunidecomp.c',
'guri.c',
'gutils.c',
'guuid.c',
'gvariant.c',
'gvariant-core.c',
'gvariant-parser.c',
'gvariant-serialiser.c',
'gvarianttypeinfo.c',
'gvarianttype.c',
'gversion.c',
'gwakeup.c',
'gprintf.c',
)
platform_deps = []
if host_system == 'windows'
if glib_build_shared
glib_win_rc = configure_file(
input: 'glib.rc.in',
output: 'glib.rc',
configuration: glibconfig_conf,
)
glib_win_res = windows.compile_resources(glib_win_rc)
glib_sources += [glib_win_res]
endif
glib_sources += files('gwin32.c', 'gspawn-win32.c', 'giowin32.c')
platform_deps = [winsock2, cc.find_library('winmm')]
if cc.get_id() == 'msvc' or cc.get_id() == 'clang-cl'
glib_sources += files('dirent/wdirent.c')
endif
else
glib_sources += files('glib-unix.c', 'gspawn.c', 'giounix.c')
platform_deps = []
endif
if host_system == 'linux'
glib_sources += files('gjournal-private.c')
endif
if glib_have_cocoa
glib_sources += files('gosxutils.m')
framework_dep = dependency('appleframeworks', modules : ['Foundation', 'CoreFoundation', 'AppKit'])
platform_deps += [framework_dep]
endif
if glib_have_carbon
framework_dep = dependency('appleframeworks', modules : 'Carbon')
platform_deps += [framework_dep]
endif
glib_sources += files('gthread-@0@.c'.format(threads_implementation))
if enable_dtrace
glib_dtrace_obj = dtrace_obj_gen.process('glib_probes.d')
glib_dtrace_hdr = dtrace_hdr_gen.process('glib_probes.d')
else
glib_dtrace_obj = []
glib_dtrace_hdr = []
endif
pcre2_static_args = []
if use_pcre2_static_flag
pcre2_static_args = ['-DPCRE2_STATIC']
endif
glib_c_args = ['-DG_LOG_DOMAIN="GLib"'] + glib_c_args_internal + pcre2_static_args
libglib = library('glib-2.0',
glib_dtrace_obj, glib_dtrace_hdr,
sources : [glib_deprecated_sources, glib_sources],
version : library_version,
soversion : soversion,
darwin_versions : darwin_versions,
install : true,
# intl.lib is not compatible with SAFESEH
link_args : [noseh_link_args, glib_link_flags, win32_ldflags],
include_directories : configinc,
link_with: [charset_lib, gnulib_lib],
dependencies : [
gnulib_libm_dependency,
libiconv,
libintl_deps,
libm,
librt,
libsysprof_capture_dep,
pcre2,
platform_deps,
thread_dep,
],
c_args : glib_c_args,
objc_args : glib_c_args,
gnu_symbol_visibility : 'hidden',
)
libglib_dep = declare_dependency(
link_with : libglib,
dependencies : libintl_deps,
sources : glib_built_headers,
# We sadly need to export configinc here because everyone includes <glib/*.h>
include_directories : [configinc, glibinc])
pkg.generate(libglib,
libraries : [libintl_deps],
libraries_private : [win32_ldflags],
subdirs : ['glib-2.0'],
extra_cflags : ['-I${libdir}/glib-2.0/include'] + win32_cflags,
variables : [
'glib_genmarshal=' + '${bindir}' / 'glib-genmarshal',
'gobject_query=' + '${bindir}' / 'gobject-query',
'glib_mkenums=' + '${bindir}' / 'glib-mkenums',
'glib_valgrind_suppressions=' + '${datadir}' /
valgrind_suppression_file_install_subdir /
fs.name(valgrind_suppression_file),
],
version : glib_version,
install_dir : glib_pkgconfigreldir,
filebase : 'glib-2.0',
name : 'GLib',
description : 'C Utility Library',
)
meson.override_dependency('glib-2.0', libglib_dep)
# On Windows, glib needs a spawn helper for g_spawn* API
if host_system == 'windows'
if host_machine.cpu_family() == 'x86'
executable('gspawn-win32-helper', 'gspawn-win32-helper.c',
install : true,
win_subsystem : 'windows',
include_directories : configinc,
dependencies : [libglib_dep])
executable('gspawn-win32-helper-console', 'gspawn-win32-helper.c',
install : true,
c_args : ['-DHELPER_CONSOLE'],
include_directories : configinc,
dependencies : [libglib_dep])
else
executable('gspawn-win64-helper', 'gspawn-win32-helper.c',
install : true,
win_subsystem : 'windows',
include_directories : configinc,
dependencies : [libglib_dep])
executable('gspawn-win64-helper-console', 'gspawn-win32-helper.c',
install : true,
c_args : ['-DHELPER_CONSOLE'],
include_directories : configinc,
dependencies : [libglib_dep])
endif
else
gtester = executable('gtester', 'gtester.c',
install : true,
install_tag : 'bin-devel',
c_args : ['-UG_DISABLE_ASSERT'],
include_directories : configinc,
dependencies : [libglib_dep])
# Provide tools for others when we're a subproject and they use the Meson GNOME module
meson.override_find_program('gtester', gtester)
endif
report_conf = configuration_data()
report_conf.set('GLIB_VERSION', glib_version)
report_conf.set('PYTHON', python.full_path())
configure_file(
input: 'gtester-report.in',
output: 'gtester-report',
install_dir: get_option('bindir'),
install_tag : 'bin-devel',
configuration: report_conf,
install_mode: 'rwxr-xr-x'
)
install_data('glib_gdb.py',
install_dir : glib_pkgdatadir / 'gdb',
install_tag : 'devel',
)
# This is needed to make gdb find glib_gdb.py
env = environment()
env.prepend('PYTHONPATH', meson.current_source_dir())
meson.add_devenv(env)
gdb_conf = configuration_data()
gdb_conf.set('datadir', glib_datadir)
# This is also used in gobject/meson.build
if host_system != 'windows'
gdb_install = true
else
# FIXME: Cannot install on Windows because the path will contain a drive
# letter and colons are not allowed in paths.
gdb_install = false
endif
# XXX: We add a leading './' because glib_libdir is an absolute path and we
# need it to be a relative path so that join_paths appends it to the end.
gdb_install_dir = join_paths(glib_datadir, 'gdb', 'auto-load', './' + glib_libdir)
configure_file(
input: 'libglib-gdb.py.in',
output: 'libglib-2.0.so.@0@-gdb.py'.format(library_version),
configuration: gdb_conf,
install_dir: gdb_install_dir,
install_tag: 'devel',
install: gdb_install,
)
if enable_systemtap
glib_stp = configure_file(input : 'glib.stp.in',
output : '@0@.stp'.format(libglib.full_path().split('/').get(-1)),
configuration : stp_cdata,
install_dir : tapset_install_dir,
install_tag : 'systemtap',
)
endif
if build_tests
subdir('tests')
endif