diff options
Diffstat (limited to 'meson.build')
-rw-r--r-- | meson.build | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..4c0cb8a --- /dev/null +++ b/meson.build @@ -0,0 +1,221 @@ +project('pygobject', 'c', + version : '3.46.0', + meson_version : '>= 0.56.0', + default_options : [ 'warning_level=1', + 'buildtype=debugoptimized']) + +pygobject_version = meson.project_version() +version_arr = pygobject_version.split('.') +pygobject_version_major = version_arr[0].to_int() +pygobject_version_minor = version_arr[1].to_int() +pygobject_version_micro = version_arr[2].to_int() + +platform_version = '@0@.0'.format(pygobject_version_major) + +pymod = import('python') +python = pymod.find_installation(get_option('python')) + +if python.language_version().version_compare('< 3.8') + error('Requires Python >= 3.8') +endif + +python_dep = python.dependency() + +glib_version_req = '>= 2.64.0' +gi_version_req = '>= 1.64.0' +pycairo_version_req = '>= 1.16.0' +libffi_version_req = '>= 3.0' + +gi_dep = dependency('gobject-introspection-1.0', version : gi_version_req, + fallback: ['gobject-introspection', 'girepo_dep']) +glib_dep = dependency('glib-2.0', version : glib_version_req, + fallback: ['glib', 'libglib_dep']) +gobject_dep = dependency('gobject-2.0', version : glib_version_req, + fallback: ['glib', 'libgobject_dep']) +gio_dep = dependency('gio-2.0', version : glib_version_req, + fallback: ['glib', 'libgio_dep']) +gmodule_dep = dependency('gmodule-2.0', version : glib_version_req, + fallback: ['glib', 'libgmodule_dep']) +ffi_dep = dependency('libffi', version : libffi_version_req, + fallback : ['libffi', 'ffi_dep']) + +with_pycairo = get_option('pycairo') + +cc = meson.get_compiler('c') + +if not with_pycairo.disabled() + cairo_dep = dependency('cairo', required: with_pycairo.enabled() and cc.get_id() != 'msvc') + cairo_gobject_dep = dependency('cairo-gobject', required: with_pycairo.enabled() and cc.get_id() != 'msvc') + + if cc.get_id() == 'msvc' and (not cairo_gobject_dep.found() or not cairo_dep.found()) + if cc.has_header('cairo.h') and cc.has_header ('cairo-gobject.h') + cairo_dep = cc.find_library ('cairo', required: with_pycairo) + cairo_gobject_dep = cc.find_library ('cairo-gobject', required: with_pycairo) + endif + endif + + # Find pycairo with target Python (TODO: extract version as well, see setup.py) + r = run_command( + python, + '-c', + ''' +import os, sys +from importlib.util import find_spec +spec = find_spec("cairo") +if spec is None: + sys.stderr.write("cairo module spec not found") + sys.exit(1) +sys.stdout.write(os.path.join(os.path.dirname(spec.origin), "include")) +''', + check: false, + ) + + if r.returncode() == 0 + message('Found pycairo with target Python: ' + r.stdout()) + pycairo_inc_dir = include_directories(r.stdout()) + pycairo_dep = declare_dependency( + include_directories: pycairo_inc_dir, + ) + else + message('pycairo not found via target Python, falling back to pkg-config (@0@)'.format(r.stderr())) + # Find pycairo with pkg-config + pycairo_dep = dependency( + 'py3cairo', + version: pycairo_version_req, + fallback: ['pycairo', 'pycairo_dep'], + default_options: ['python=' + get_option('python')], + required: with_pycairo, + ) + endif +else + cairo_dep = dependency('', required: false) + pycairo_dep = dependency('', required: false) +endif + +main_c_args = [] +if cc.get_id() == 'msvc' + main_c_args += [ '-FImsvc_recommended_pragmas.h' ] +else + main_c_args += [ + '-Wall', + '-Warray-bounds', + '-Wcast-align', + '-Wduplicated-branches', + '-Wextra', + '-Wformat=2', + '-Wformat-nonliteral', + '-Wformat-security', + '-Wimplicit-function-declaration', + '-Winit-self', + '-Wjump-misses-init', + '-Wlogical-op', + '-Wmissing-declarations', + '-Wmissing-format-attribute', + '-Wmissing-include-dirs', + '-Wmissing-noreturn', + '-Wmissing-prototypes', + '-Wnested-externs', + '-Wnull-dereference', + '-Wold-style-definition', + '-Wpacked', + '-Wpointer-arith', + '-Wrestrict', + '-Wreturn-type', + '-Wshadow', + '-Wsign-compare', + '-Wstrict-aliasing', + '-Wstrict-prototypes', + '-Wswitch-default', + '-Wundef', + '-Wunused-but-set-variable', + '-Wwrite-strings', + ] + + if python.language_version().split('.')[0] == '2' + main_c_args += [ + '-Wdeclaration-after-statement', + ] + endif + + main_c_args += [ + '-Wno-incompatible-pointer-types-discards-qualifiers', + '-Wno-missing-field-initializers', + '-Wno-unused-parameter', + '-Wno-discarded-qualifiers', + '-Wno-sign-conversion', + '-Wno-cast-function-type', + '-Wno-int-conversion', + ] + + main_c_args += [ + '-fno-strict-aliasing', + '-fvisibility=hidden', + ] + + main_c_args = cc.get_supported_arguments(main_c_args) +endif + +pyext_c_args = ['-DPY_SSIZE_T_CLEAN'] + +cdata = configuration_data() + +cdata.set('PYGOBJECT_MAJOR_VERSION', pygobject_version_major) +cdata.set('PYGOBJECT_MINOR_VERSION', pygobject_version_minor) +cdata.set('PYGOBJECT_MICRO_VERSION', pygobject_version_micro) + +if gio_dep.version().version_compare('< 2.67.4') + cdata.set('g_memdup2(ptr,sz)', '(G_LIKELY(((guint64)(sz)) < G_MAXUINT)) ? g_memdup(ptr,sz) : (g_abort(),NULL)') +endif + +configure_file(output : 'config.h', configuration : cdata) + +pkgconf = configuration_data() + +pkgconf.set('prefix', join_paths(get_option('prefix'))) +pkgconf.set('exec_prefix', '${prefix}') +pkgconf.set('includedir', join_paths('${prefix}', get_option('includedir'))) +pkgconf.set('datarootdir', join_paths('${prefix}', get_option('datadir'))) +pkgconf.set('datadir', '${datarootdir}') +pkgconf.set('VERSION', pygobject_version) + +pkg_install_dir = '@0@/pkgconfig'.format(get_option('libdir')) + +configure_file(input : 'pygobject-@0@.pc.in'.format(platform_version), + output : 'pygobject-@0@.pc'.format(platform_version), + configuration : pkgconf, + install_dir : pkg_install_dir) + +pygobject_dep = declare_dependency( + include_directories: include_directories('gi'), + dependencies: [gobject_dep, ffi_dep], + version: meson.project_version(), +) + +if pygobject_version_minor.is_odd() + py_version = '@0@.dev0'.format(pygobject_version) +else + py_version = pygobject_version +endif + +pkginfo_conf = configuration_data() +pkginfo_conf.set('VERSION', py_version) +configure_file(input : 'PKG-INFO.in', + output : 'PyGObject-@0@.egg-info'.format(py_version), + configuration : pkginfo_conf, + install_dir : python.get_install_dir(pure : false)) + +subdir('gi') +subdir('pygtkcompat') +with_tests = get_option('tests') +if with_tests +subdir('tests') +endif + +if meson.version().version_compare('>=0.58.0') + devenv = environment() + devenv.prepend('PYTHONPATH', [ + meson.current_source_dir(), + meson.current_build_dir(), + ]) + meson.add_devenv(devenv) +endif |