# -*- Mode: Python -*- vi:si:et:sw=4:sts=4:ts=4:syntax=python import shlex import shutil from cerbero.tools.libtool import LibtoolLibrary from cerbero.tools.libtool import get_libtool_versions GLIB_CONFIG_UNVERSAL='''\ #ifdef __i386__ #include "i386/glibconfig.h" #elif defined(__ppc__) #include "ppc/glibconfig.h" #elif defined(__x86_64__) #include "x86_64/glibconfig.h" #elif defined(__arm__) #include "arm/glibconfig.h" #elif defined(__arm64__) #include "arm64/glibconfig.h" #else #error "Unsupported Architecture" #endif ''' class Recipe(recipe.Recipe): name = 'glib' version = '2.62.6' stype = SourceType.TARBALL url = 'gnome://' tarball_checksum = '104fa26fbefae8024ff898330c671ec23ad075c1c0bce45c325c6d5657d58b9c' licenses = [License.LGPLv2Plus] btype = BuildType.MESON meson_options = {'internal_pcre': 'true', 'libmount': 'false', 'dtrace': 'false', 'iconv': 'auto'} deps = ['libffi', 'zlib'] patches = [ 'glib/0003-Add-support-for-loading-GIO-modules-from-the-distro-.patch', 'glib/0004-Allow-for-a-second-distro-GIO-module-path-as-used-on.patch', 'glib/0006-giomodule-do-not-try-to-load-modules-from-gio-module.patch', 'glib/0008-Unhide-_g_io_modules_ensure_extension_points_registe.patch', 'glib/0009-Implementation-of-Cocoa-event-loop-integration-in-GM.patch', # https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1415 'glib/0001-meson-Don-t-use-assert-in-test-code.patch', # https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1433 'glib/0001-meson-fix-buildtype-args-and-vscrt-usage.patch', # https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1512 'glib/0001-meson-host_system-can-be-ios-when-cross-compiling.patch', 'glib/0002-meson-Autodetect-when-building-for-iOS.patch', 'glib/0003-meson-Only-look-for-_NSGetEnviron-when-building-for-.patch', # https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1522 'glib/0001-meson-Fix-gnulib-printf-checks.patch', # https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1579 'glib/0001-glib-Use-g_getenv-everywhere-instead-of-getenv.patch', # https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1771 'glib/0001-macos-fix-frexpl-checks-in-cross-compilation.patch', # https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1884 'glib/0001-gthread-win32-Use-SetThreadDescription-Win32-API-for.patch', # https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1616 'glib/0001-gioerror-Map-WSAENETRESET-on-Windows-to-G_IO_ERROR_C.patch', # https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1836 'glib/0001-Windows-fix-FD_READ-condition-flag-still-set-on-reco.patch', # https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1428 'glib/0001-Add-missing-extern-to-the-dllexport-version-of-GLIB_.patch', # https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1698 'glib/0001-gslice-Inline-win32-implementation-of-g_getenv-to-av.patch', # https://gitlab.gnome.org/GNOME/glib/-/merge_requests/2848 'glib/0001-giomodule-Automatically-detect-modules-on-macOS.patch', ] files_libs = [ 'libglib-2.0', 'libgio-2.0', 'libgmodule-2.0', 'libgobject-2.0', 'libgthread-2.0'] files_bins = ['gsettings', 'gdbus', 'gio-querymodules', 'glib-compile-schemas'] platform_files_schemas = { Platform.WINDOWS: ['share/glib-2.0/schemas'], Platform.DARWIN: ['share/glib-2.0/schemas'], Platform.IOS: ['share/glib-2.0/schemas'], } #FIXME: Fill it when needed #files_gio = ['lib/gio/modules'] files_devel = [ 'bin/glib-gettextize', 'bin/glib-mkenums', 'bin/glib-compile-resources%(bext)s', 'bin/glib-genmarshal', 'bin/gresource%(bext)s', 'bin/gdbus-codegen', 'lib/glib-2.0/include', 'lib/pkgconfig/gio-2.0.pc', 'lib/pkgconfig/glib-2.0.pc', 'lib/pkgconfig/gmodule-2.0.pc', 'lib/pkgconfig/gmodule-export-2.0.pc', 'lib/pkgconfig/gmodule-no-export-2.0.pc', 'lib/pkgconfig/gobject-2.0.pc', 'lib/pkgconfig/gthread-2.0.pc', 'include/glib-2.0', 'share/aclocal/glib-2.0.m4', 'share/aclocal/glib-gettext.m4' ] platform_files_devel = { Platform.WINDOWS: ['lib/pkgconfig/gio-windows-2.0.pc', 'include/gio-win32-2.0'], Platform.LINUX: ['lib/pkgconfig/gio-unix-2.0.pc', 'include/gio-unix-2.0'], Platform.ANDROID: ['lib/pkgconfig/gio-unix-2.0.pc', 'include/gio-unix-2.0'], Platform.DARWIN: ['lib/pkgconfig/gio-unix-2.0.pc', 'include/gio-unix-2.0'], Platform.IOS: ['lib/pkgconfig/gio-unix-2.0.pc', 'include/gio-unix-2.0'], } files_lang = ['glib20'] def _set_gio_flags(self, path1=None, path2=None, use_old_uri_scheme=False): self.append_env('CFLAGS', *self._gio_flags(path1, path2, use_old_uri_scheme)) def _gio_flags(self, path1=None, path2=None, use_old_uri_scheme=False): flags = [] def escape(path): # We want the define the macro to a C string, then we quote it # because it is expanded inside cerbero to set c_args in the cross # file or to pass directly to meson using the env var for native # builds return shlex.quote('"{}"'.format(path)) if path1 is not None: flags.append('-DGST_SDK_GLIB_GIO_DISTRO_GIO_MODULE_PATH=' + escape(path1)) if path2 is not None: flags.append('-DGST_SDK_GLIB_GIO_DISTRO_GIO_MODULE_PATH2=' + escape(path2)) if use_old_uri_scheme: flags.append('-DGST_SDK_GLIB_GIO_OLD_URI_SCHEME_HANDLERS=1') return flags def prepare(self): # Glib doesn't support static libraries on Windows yet if self.config.target_platform == Platform.WINDOWS: self.library_type = LibraryType.SHARED if self.config.target_platform != Platform.LINUX: # Disable valgrind code on non-Linux, in the best case it just # gives us compiler errors :) self.append_env('CFLAGS', '-DNVALGRIND=1') self.meson_options.update({'xattr': 'false'}) self.deps.append('proxy-libintl') # Android only provides libiconv with API level >=28 (Pie and newer) if self.config.target_platform == Platform.ANDROID and DistroVersion.get_android_api_version(self.config.target_distro_version) < 28: self.deps.append('libiconv') if self.config.target_platform == Platform.WINDOWS: # Want secure versions of stdlib functions. Glib already defines # _WIN32_WINNT, so undefine it on the cmdline to avoid warnings self.append_env('CFLAGS', '-DMINGW_HAS_SECURE_API=1', '-U_WIN32_WINNT') # TODO: upstream if self.config.variants.uwp: # gdbus is completely disabled at present self.files_bins.remove('gdbus') self.files_bins_devel.remove('bin/gdbus.pdb') self.patches += [ # https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1583 'glib/uwp/0001-gio-Remove-broken-support-for-XP.patch', # Ready to upstream 'glib/uwp/0001-gio-Disable-generic-DNS-record-lookup-on-UWP.patch', 'glib/uwp/0001-glib-Never-use-MessageBox-on-UWP-apps.patch', 'glib/uwp/0001-gpoll-UWP-does-not-need-to-poll-a-msg_fd.patch', 'glib/uwp/0002-win_iconv-Use-LoadPackagedLibrary-when-building-UWP-.patch', 'glib/uwp/0003-glib-getpid-is-available-on-Win32-but-not-WinRT.patch', 'glib/uwp/0004-goption-Do-not-call-GetCommandlineW-on-UWP.patch', 'glib/uwp/0005-gmodule-Fix-some-more-WinRT-incompatibilities.patch', 'glib/uwp/0006-gutils-Can-t-fetch-the-username-on-UWP.patch', 'glib/uwp/0007-gutils-GetWindowsDirectory-is-not-available-on-WinRT.patch', 'glib/uwp/0008-glocalfile-File-user-info-is-not-supported-on-WinRT.patch', 'glib/uwp/0009-gwin32-Stub-out-all-version-checking-on-WinRT.patch', 'glib/uwp/0010-gutils-GetModuleHandle-is-not-available-on-WinRT.patch', 'glib/uwp/0011-gsocket-if_nametoindex-is-not-available-on-WinRT.patch', 'glib/uwp/0012-gio-ginetaddress-Fix-build-on-WinRT.patch', # Need some more work 'glib/uwp/0013-WIP-UPSTREAM-glib-Specify-noreturn-prototype-for-MSV.patch', 'glib/uwp/0014-WIP-gspawn-Do-not-allow-spawning-or-making-pipes-on-.patch', 'glib/uwp/0015-WIP-glib-giowin32-Disallow-invalid-usage-of-GIOChann.patch', 'glib/uwp/0016-WIP-glocalfile-Trash-as-a-concept-does-not-exist-on-.patch', 'glib/uwp/0020-WIP-glib-Implement-get_special_folder-for-UWP-apps.patch', 'glib/uwp/0021-WIP-gtimezone-Partially-port-to-WinRT.patch', # Need a lot more work 'glib/uwp/0017-TODO-gdate-gstdio-Abort-when-trying-to-use-unsupport.patch', 'glib/uwp/0018-gio-Disable-win32-API-and-modules-when-unavailable-o.patch', 'glib/uwp/0019-TODO-gdbus-Completely-disable-when-building-for-WinR.patch', 'glib/uwp/0022-TODO-gio-gcontenttype-Needs-porting-to-WinRT-model.patch', # Visual Studio 2019 workaround 'glib/uwp/0001-meson-Add-workaround-for-Visual-Studio-2019-ARM-buil.patch', ] elif self.config.target_platform in [Platform.DARWIN, Platform.IOS]: self.files_devel.append(os.path.join('lib', 'glib-2.0', 'include', '*', 'glibconfig.h')) arch = self.config.target_arch if arch == Architecture.X86: arch = 'i386' elif arch == Architecture.ARM64: arch = 'arm64' elif Architecture.is_arm(arch): arch = 'arm' extra_flags = [] if self.config.target_platform == Platform.IOS: # Disable mac OS X specifics extra_flags = ['-DGST_SDK_IOS=1'] # XXX: Why did we disable these for iOS? #self.configure_options += ' --disable-carbon --disable-modular-tests --disable-cocoa' self.append_env('CFLAGS', *extra_flags) elif self.config.target_platform == Platform.LINUX: path1 = '/usr/lib/gio/modules' path2 = None use_old_uri_scheme = False self.meson_options.update({'selinux': 'disabled'}) # Old Debian/Ubuntu if self.config.target_distro_version in [DistroVersion.DEBIAN_SQUEEZE, DistroVersion.UBUNTU_LUCID, DistroVersion.UBUNTU_MAVERICK]: use_old_uri_scheme = True # Ubuntu, cannot check self.config.target_distro here because it's # set to Distro.DEBIAN elif self.config.target_distro_version.startswith('ubuntu_'): if self.config.target_arch == Architecture.X86: path2 = '/usr/lib/i386-linux-gnu/gio/modules' elif self.config.target_arch == Architecture.X86_64: path2 = '/usr/lib/x86_64-linux-gnu/gio/modules' # Debian elif self.config.target_distro == Distro.DEBIAN: if self.config.target_arch == Architecture.X86: path1 = '/usr/lib/i386-linux-gnu/gio/modules' elif self.config.target_arch == Architecture.X86_64: path1 = '/usr/lib/x86_64-linux-gnu/gio/modules' # RedHat elif self.config.target_distro == Distro.REDHAT: if self.config.target_arch == Architecture.X86_64: path1 = '/usr/lib64/gio/modules/' # Suse elif self.config.target_distro == Distro.SUSE: if self.config.target_arch == Architecture.X86_64: path1 = '/usr/lib64/gio/modules/' # Arch elif self.config.target_distro == Distro.ARCH: path1 = '/usr/lib/gio/modules/' # Gentoo elif self.config.target_distro == Distro.GENTOO: path1 = '/usr/lib/gio/modules/' elif self.config.target_distro == Distro.NONE: if self.config.target_distro_version == DistroVersion.NONE_UCLIBC: self.deps += ('proxy-libintl', 'libiconv') else: raise FatalError(_("Add specific for other Linux distributions here")) self._set_gio_flags(path1, path2, use_old_uri_scheme) def post_install(self): if self.config.target_platform in [Platform.IOS, Platform.DARWIN]: # For the universal build we need to ship glibconfig.h of both # architectures in a subfolder and include the correct one depending # on the compiler architecture arch = self.config.target_arch if arch == Architecture.X86: arch = 'i386' elif arch == Architecture.ARM64: arch = 'arm64' elif Architecture.is_arm(arch): arch = 'arm' arch_dir = os.path.join(self.config.prefix, 'lib', 'glib-2.0', 'include', arch) if not os.path.exists(arch_dir): os.makedirs(arch_dir) shutil.copyfile(os.path.join(self.meson_dir, 'glib', 'glibconfig.h'), os.path.join(arch_dir, 'glibconfig.h')) with open(os.path.join(self.config.prefix, 'lib', 'glib-2.0', 'include', 'glibconfig.h'), 'w+') as f: f.write(GLIB_CONFIG_UNVERSAL) major, minor, micro = get_libtool_versions(self.version) # Meson does not generate la files LibtoolLibrary('glib-2.0', major, minor, micro, self.config.libdir, self.config.target_platform).save() LibtoolLibrary('gobject-2.0', major, minor, micro, self.config.libdir, self.config.target_platform, deps=['glib-2.0', 'ffi']).save() LibtoolLibrary('gmodule-2.0', major, minor, micro, self.config.libdir, self.config.target_platform, deps=['glib-2.0']).save() LibtoolLibrary('gthread-2.0', major, minor, micro, self.config.libdir, self.config.target_platform, deps=['glib-2.0']).save() LibtoolLibrary('gio-2.0', major, minor, micro, self.config.libdir, self.config.target_platform, deps=['gobject-2.0', 'gmodule-2.0', 'z']).save() super().post_install()