Index: meson.build
===================================================================
--- meson.build (nonexistent)
+++ meson.build (revision 362)
@@ -0,0 +1,1908 @@
+project('gimp',
+ 'c', 'cpp',
+ version: '2.99.16',
+ meson_version: '>=0.59.0',
+ default_options: [
+ 'cpp_std=gnu++14',
+ 'buildtype=debugoptimized',
+ ],
+)
+
+project_url = 'https://gitlab.gnome.org/GNOME/gimp'
+project_url_issues = project_url + '/issues/new'
+
+conf = configuration_data()
+
+warnings = []
+
+################################################################################
+# Project info
+
+prettyname = 'GIMP'
+full_name = 'GNU Image Manipulation Program'
+
+# General version
+gimp_version = meson.project_version()
+
+package_string= prettyname + ' ' + gimp_version
+
+gimp_app_version_arr = gimp_version.split('.')
+gimp_app_version_major = gimp_app_version_arr[0].to_int()
+gimp_app_version_minor = gimp_app_version_arr[1].to_int()
+gimp_app_version_micro = gimp_app_version_arr[2].to_int()
+
+# Override for Release-candidates
+gimp_app_version = '@0@.@1@'.format(
+ gimp_app_version_major,
+ gimp_app_version_minor
+)
+
+
+# API & pkg-config version
+api_version_major = gimp_app_version_major
+api_version_minor = gimp_app_version_minor
+
+if api_version_minor == 99
+ api_version_major += 1
+ api_version_minor = 0
+endif
+
+gimp_api_version = '@0@.@1@'.format(api_version_major, api_version_minor)
+gimp_api_name = 'gimp-' + gimp_api_version
+
+
+# Libtool versioning
+gimp_interface_age = 16
+
+gimp_binary_age = 100 * gimp_app_version_minor + gimp_app_version_micro
+lt_current = 100 * gimp_app_version_minor + gimp_app_version_micro - gimp_interface_age
+lt_revision = gimp_interface_age
+lt_age = gimp_binary_age - gimp_interface_age
+
+# libtool's -version-info transforms "current:revision:age" into "(current - age).age.revision".
+# Let's compute this ourselves.
+so_version = '@0@.@1@.@2@'.format(lt_current - lt_age, lt_age, lt_revision)
+
+
+gimp_command = 'gimp-' + gimp_app_version
+
+gettext_package= 'gimp@0@@1@'.format(api_version_major, api_version_minor)
+conf.set_quoted('GETTEXT_PACKAGE', gettext_package)
+
+conf.set_quoted('GIMP_VERSION', gimp_version)
+
+# GIMP_UNSTABLE tells if we are on an unstable or stable development branch.
+stable = (gimp_app_version_minor % 2 == 0)
+conf.set('GIMP_UNSTABLE', stable ? false : 1)
+
+# GIMP_RELEASE tells if this is a release or in-between release (git) code.
+release = (gimp_app_version_micro % 2 == 0)
+conf.set('GIMP_RELEASE', release ? 1 : false)
+
+versionconfig = configuration_data()
+versionconfig.set('GIMP_FULL_NAME', full_name)
+versionconfig.set('GIMP_MAJOR_VERSION', gimp_app_version_major)
+versionconfig.set('GIMP_MINOR_VERSION', gimp_app_version_minor)
+versionconfig.set('GIMP_MICRO_VERSION', gimp_app_version_micro)
+versionconfig.set('GIMP_VERSION', gimp_version)
+versionconfig.set('GIMP_API_VERSION', gimp_api_version)
+
+
+################################################################################
+# Get configuration and Meson modules
+
+pkgconfig = import('pkgconfig')
+i18n = import('i18n')
+gnome = import('gnome')
+pythonmod = import('python')
+simd = import('unstable-simd')
+fs = import('fs')
+
+cc = meson.get_compiler('c')
+cxx = meson.get_compiler('cpp')
+prefix = get_option('prefix')
+buildtype = get_option('buildtype')
+exec_ver = '-' + gimp_app_version
+
+compiler_args = []
+linker_args = []
+
+################################################################################
+# Host system detection
+
+host_cpu_family = host_machine.cpu_family()
+message('Host machine cpu family: ' + host_cpu_family)
+
+host_cpu_family = host_machine.cpu_family()
+if host_cpu_family == 'x86'
+ have_x86 = true
+ conf.set10('ARCH_X86', true)
+elif host_cpu_family == 'x86_64'
+ have_x86 = true
+ conf.set10('ARCH_X86', true)
+ conf.set10('ARCH_X86_64', true)
+elif host_cpu_family == 'ppc'
+ have_ppc = true
+ conf.set10('ARCH_PPC', true)
+elif host_cpu_family == 'ppc64'
+ have_ppc = true
+ conf.set10('ARCH_PPC', true)
+ conf.set10('ARCH_PPC64', true)
+endif
+
+
+host_os = host_machine.system().to_lower()
+message('Host os: ' + host_os)
+
+platform_linux = (
+ host_os.contains('linux')
+)
+
+platform_windows = (
+ host_os.contains('mingw') or
+ host_os.contains('cygwin') or
+ host_os.contains('windows')
+)
+
+platform_osx = (
+ host_os.contains('machten') or
+ host_os.contains('rhapsody') or
+ host_os.contains('darwin')
+)
+
+if platform_osx
+ conf.set('PLATFORM_OSX', 1)
+endif
+
+if platform_windows
+ windows = import('windows')
+ # AC_CHECK_PROG(ms_librarian, lib.exe, yes, no)
+ # AM_CONDITIONAL(MS_LIB_AVAILABLE, test "x$ms_librarian" = xyes)
+ # compiler_args += '-Wl,--large-address-aware'
+endif
+
+# on OSX ObjC and C sources are mixed so adding objc to the linkflags
+
+osx_ldflags = []
+if platform_osx
+ add_languages('objc')
+ osx_ldflags += ['-Wl,-framework,Foundation', '-Wl,-framework,AppKit', '-ObjC']
+ add_project_link_arguments(osx_ldflags, language : ['objc', 'c'])
+endif
+
+if cc.get_id() == 'gcc' and cc.version() == '7.2.0'
+ gcc_warning = '''
+ GCC 7.2.0 has a serious bug affecting GEGL/GIMP. We advise
+ against using this version of the compiler (previous and
+ further versions are fine).
+ See https://bugzilla.gnome.org/show_bug.cgi?id=787222
+ '''
+ warning(gcc_warning)
+ warnings += gcc_warning
+endif
+
+
+
+################################################################################
+# Compiler CPU extensions for optimizations
+#
+# -- Don't enable these flags project-wide, only files needing them
+# should be built with a given extension, which we do with meson simd
+# module. Otherwise GIMP would end up crashing when run on CPUs which
+# don't support all the flags supported by the compiler.
+# See merge request !262 for more details.
+
+# Note that Meson has a SIMD module which can also do this for us, but it uses
+# its own #defines and we want to stay compatible with the autotools build
+conf.set('USE_MMX', cc.has_argument('-mmmx'))
+conf.set('USE_SSE', cc.has_argument('-msse'))
+conf.set10('COMPILE_SSE2_INTRINISICS', cc.has_argument('-msse2'))
+conf.set10('COMPILE_SSE4_1_INTRINISICS', cc.has_argument('-msse4.1'))
+
+if host_cpu_family == 'ppc'
+ altivec_args = cc.get_supported_arguments([
+ '-faltivec',
+ '-maltivec',
+ '-mabi=altivec',
+ ])
+
+ if altivec_args != []
+ if host_os.contains('darwin')
+ conf.set('USE_ALTIVEC', true)
+ conf.set('HAVE_ALTIVEC_SYSCTL', true)
+ elif cc.compiles('''
+ int main() { asm ("vand %v0, %v0, %v0"); return 0; }
+ ''')
+ conf.set('USE_ALTIVEC', true)
+ endif
+ endif
+endif
+
+
+################################################################################
+# CFlags
+
+
+if get_option('profiling') and cc.get_id() == 'gcc'
+ compiler_args += '-pg'
+ linker_args += '-pg'
+endif
+
+if get_option('ansi')
+ compiler_args += [ '-ansi', '-pedantic']
+endif
+
+warning_cflags_common = [
+ '-fdiagnostics-show-option',
+ '-fno-common',
+
+ '-Wformat',
+ '-Wformat-security',
+ '-Winit-self',
+ '-Wlogical-op',
+ '-Wmissing-declarations',
+ '-Wmissing-format-attribute',
+ '-Wpointer-arith',
+ '-Wreturn-type',
+ '-Wtype-limits',
+]
+warning_cflags_c = [
+ '-Wabsolute-value',
+ '-Wdeclaration-after-statement',
+ '-Wenum-conversion',
+ '-Wliteral-conversion',
+ '-Wno-strict-prototypes',
+ '-Wold-style-definition',
+ '-Wparentheses-equality',
+ '-W#pragma-messages',
+ '-Wsometimes-uninitialized',
+ '-Wtautological-unsigned-enum-zero-compare',
+ '-Wunneeded-internal-declaration',
+ '-Wunused-function',
+ '-Wunused-value',
+
+ '-Werror=implicit-function-declaration',
+]
+warning_cflags_cpp = [
+]
+
+compiler_args += cc.get_supported_arguments(warning_cflags_common)
+add_project_arguments(cc .get_supported_arguments(warning_cflags_c), language: 'c')
+add_project_arguments(cxx.get_supported_arguments(warning_cflags_cpp), language: 'cpp')
+
+
+# Ensure MSVC-compatible struct packing convention is used when
+# compiling for Win32 with gcc.
+if platform_windows and cc.get_id() == 'gcc'
+ msvc_compat_args = cc.first_supported_argument([
+ '-fnative-struct',
+ '-mms-bitfields',
+ ])
+ if msvc_compat_args == []
+ error('''
+ GCC does not support '-fnative-struct' nor '-mms-bitfields'.
+ Build will be incompatible with GTK DLLs.
+ ''')
+ endif
+ compiler_args += msvc_compat_args
+endif
+
+
+conf.set('HAVE__NL_MEASUREMENT_MEASUREMENT',
+ cc.compiles('''
+ #include<langinfo.h>
+ int main() {
+ char c = *((unsigned char *) nl_langinfo(_NL_MEASUREMENT_MEASUREMENT));
+ }
+ ''')
+)
+
+conf.set('HAVE__NL_IDENTIFICATION_LANGUAGE',
+ cc.compiles('''
+ #include<langinfo.h>
+ int main() {
+ char c = *((unsigned char *) nl_langinfo(_NL_IDENTIFICATION_LANGUAGE));
+ }
+ ''')
+)
+
+
+################################################################################
+# Dependencies
+no_dep = dependency('', required: false)
+
+################################################################################
+# Mandatory Dependencies
+
+if get_option('relocatable-bundle') == 'yes'
+ relocatable_bundle = true
+elif get_option('relocatable-bundle') == 'no'
+ relocatable_bundle = false
+else # == 'platform-default'
+ # By default, assume building for Windows or macOS everything to be on
+ # the same prefix and can be relocated.
+ # On other platforms, build-time paths are meaningful.
+ if platform_windows or platform_osx
+ relocatable_bundle = true
+ else
+ relocatable_bundle = false
+ endif
+endif
+conf.set('ENABLE_RELOCATABLE_RESOURCES', relocatable_bundle)
+
+
+math = cc.find_library('m')
+# libdl is only required on Linux. On Windows and some (all?) BSD, it
+# doesn't exist, but the API exists in libc by default (see #8604). On
+# macOS, it apparently exists but linking it explicitly is actually
+# unneeded as well.
+dl = cc.find_library('dl', required: platform_linux)
+rpc = platform_windows ? cc.find_library('rpcrt4') : no_dep
+dbghelp = platform_windows ? cc.find_library('dbghelp') : no_dep
+winsock = platform_windows ? cc.find_library('ws2_32') : no_dep
+mscms = platform_windows ? cc.find_library('mscms') : no_dep
+atk_minver = '2.4.0'
+atk = dependency('atk', version: '>='+atk_minver)
+babl_minver = '0.1.98'
+babl = dependency('babl-0.1', version: '>='+babl_minver, required: false)
+if not babl.found()
+ # babl changed its pkg-config name from 'babl' to 'babl-0.1' in version
+ # 0.1.100 (0.1.99 dev cycle more exactly). 'babl-0.1' is checked in priority
+ # because it would be a newer version.
+ babl = dependency('babl', version: '>='+babl_minver)
+endif
+cairo_minver = '1.14.0'
+cairo = dependency('cairo', version: '>='+cairo_minver)
+
+# fontconfig_name = platform_windows ? 'fontconfig_win32' : 'fontconfig'
+fontconfig_name = 'fontconfig'
+fontconfig_minver = '2.12.4'
+fontconfig = dependency(fontconfig_name, version: '>='+fontconfig_minver)
+freetype2_minver = '2.1.7'
+freetype2 = dependency('freetype2', version: '>='+freetype2_minver)
+gdk_pixbuf_minver = '2.30.8'
+gdk_pixbuf = dependency('gdk-pixbuf-2.0', version: '>='+gdk_pixbuf_minver)
+gegl_minver = '0.4.46'
+gegl = dependency('gegl-0.4', version: '>='+gegl_minver)
+exiv2_minver = '0.27.4'
+exiv2 = dependency('exiv2', version: '>='+exiv2_minver)
+gexiv2_minver = '0.14.0'
+gexiv2 = dependency('gexiv2', version: '>='+gexiv2_minver)
+
+gio = dependency('gio-2.0')
+gio_specific_name = platform_windows ? 'gio-windows-2.0' : 'gio-unix-2.0'
+gio_specific = dependency(gio_specific_name)
+
+glib_minver = '2.70.0'
+glib = dependency('glib-2.0', version: '>='+glib_minver)
+gi = dependency('gobject-introspection-1.0')
+
+conf.set('G_DISABLE_DEPRECATED', glib.version().version_compare('>=2.57'))
+
+gobject = dependency('gobject-2.0', version: '>='+glib_minver)
+gmodule = dependency('gmodule-no-export-2.0')
+
+gtk3_minver = '3.24.0'
+gtk3 = dependency('gtk+-3.0', version: '>='+gtk3_minver)
+harfbuzz_minver = '1.0.5'
+harfbuzz = dependency('harfbuzz', version: '>='+harfbuzz_minver)
+json_glib = dependency('json-glib-1.0', version: '>=1.2.6')
+lcms_minver = '2.8'
+lcms = dependency('lcms2', version: '>='+lcms_minver)
+libmypaint_minver = '1.3.0'
+libmypaint = dependency('libmypaint', version: '>='+libmypaint_minver)
+mypaint_brushes = dependency('mypaint-brushes-1.0',version: '>='+libmypaint_minver)
+if not libmypaint.version().version_compare('>=1.4.0')
+ libmypaint_warning='''
+
+ libmypaint lower than version 1.4.0 is known to crash when
+ parsing MyPaint 2 brushes. Please update.
+ '''
+ warning(libmypaint_warning)
+ warnings += libmypaint_warning
+endif
+
+
+if relocatable_bundle
+ mypaint_brushes_dir = '${gimp_installation_dir}'\
+ /'share'/'mypaint-data'/'1.0'/'brushes'
+else
+ mypaint_brushes_dir = mypaint_brushes.get_variable(pkgconfig: 'brushesdir')
+endif
+
+conf.set_quoted('MYPAINT_BRUSHES_DIR', mypaint_brushes_dir)
+
+pangocairo_minver = '1.44.0'
+pangocairo = dependency('pangocairo', version: '>='+pangocairo_minver)
+pangoft2 = dependency('pangoft2', version: '>=1.29.4')
+rsvg_minver = '2.40.6'
+rsvg = dependency('librsvg-2.0', version: '>='+rsvg_minver)
+
+conf.set('PANGO_DISABLE_DEPRECATED',pangocairo.version().version_compare('<1.43'))
+
+
+################################################################################
+# Check for GLib Networking
+
+glib_networking_works_run=false
+glib_networking_works = true
+
+if not glib_networking_works
+ error('Test for glib-networking failed. This is required.')
+endif
+
+################################################################################
+# Check if Pango is built with a recent fontconfig
+
+pango_check = cc.links(
+ '''#include <fontconfig/fontconfig.h>
+ int main() {
+ FcObjectSet *os; os = FcObjectSetBuild (FC_FAMILY, FC_WIDTH);
+ }''',
+ dependencies: fontconfig,
+)
+
+if not pango_check
+ pango_warning = '\n *** '.join([
+ 'You have a fontconfig >= fontconfig_required_version installed on your',
+ 'system, but your Pango library is using an older version. This old version',
+ 'is probably in /usr/X11R6. Look at the above output, and note that the',
+ 'result for FONTCONFIG_CFLAGS is not in the result for PANGOCAIRO_CFLAGS,',
+ 'and that there is likely an extra -I line, other than the ones for GLIB,',
+ 'Freetype, and Pango itself. That\'s where your old fontconfig files are.',
+ 'Rebuild pango, and make sure that it uses the newer fontconfig.',
+ 'The easiest way be sure of this is to simply get rid of the old',
+ 'fontconfig. When you rebuild pango, make sure the result for',
+ 'FONTCONFIG_CFLAGS is the same as the result here.',
+ ])
+ warning(pango_warning)
+ warnings += pango_warning
+endif
+
+################################################################################
+# Optional Dependencies
+
+libsocket = cc.find_library('socket', required: false)
+conf.set('HAVE_LIBSOCKET', libsocket.found())
+
+################################################################################
+# Check for extension support
+
+appstream_glib_minver = '0.7.7'
+appstream_glib = dependency('appstream-glib', version: '>='+appstream_glib_minver)
+
+libarchive = dependency('libarchive')
+
+
+################################################################################
+# Check for debug console (Win32)
+
+if platform_windows
+ conf.set('ENABLE_WIN32_DEBUG_CONSOLE', get_option('win32-debug-console'))
+endif
+
+################################################################################
+# Check for 32-bit DLLs (Win32 64-bit)
+
+if platform_windows and host_cpu_family == 'x86_64'
+ conf.set_quoted('WIN32_32BIT_DLL_FOLDER', get_option('win32-32bits-dll-folder'))
+endif
+
+################################################################################
+# Check for detailed backtraces support
+
+## Check for libbacktrace
+
+if get_option('libbacktrace')
+ libbacktrace = cc.find_library('backtrace', required: false)
+
+ if libbacktrace.found()
+ libbacktrace_links = cc.links('''
+ #include <stddef.h>
+ #include <backtrace.h>
+ #include <backtrace-supported.h>
+
+ #if ! BACKTRACE_SUPPORTED
+ # error ! BACKTRACE_SUPPORTED
+ #endif
+
+ int main() {
+ (void) backtrace_create_state (NULL, 0, NULL, NULL);
+ return 0;
+ }
+ ''',
+ dependencies: libbacktrace,
+ )
+
+ if not libbacktrace_links
+ warning(
+ 'libbacktrace was found, but the test compilation failed.\n' +
+ 'You can find more info in meson-logs/meson-logs.txt.'
+ )
+ libbacktrace = no_dep
+ endif
+
+ endif
+else
+ libbacktrace = no_dep
+endif
+conf.set('HAVE_LIBBACKTRACE', libbacktrace.found())
+
+## Check for libunwind
+libunwind = ( get_option('libunwind')
+ ? dependency('libunwind', version: '>=1.1.0', required: false)
+ : no_dep
+)
+conf.set('HAVE_LIBUNWIND', libunwind.found())
+
+
+## Check for Dr. Mingw
+drmingw = no_dep
+if platform_windows
+ exchndl = cc.find_library('exchndl', required: false)
+ exchndl_fn = cc.has_function('ExcHndlSetLogFileNameW', dependencies: exchndl)
+ if exchndl.found() and exchndl_fn
+ drmingw = declare_dependency(dependencies: exchndl)
+ endif
+endif
+conf.set('HAVE_EXCHNDL', drmingw.found())
+
+
+detailed_backtraces = (
+ libbacktrace.found() or
+ libunwind.found() or
+ drmingw.found()
+)
+
+################################################################################
+# Check for x11 support
+
+x11_target = gtk3.get_variable(pkgconfig: 'targets').contains('x11')
+
+x11 = x11_target ? dependency('x11') : no_dep
+xmu = x11_target ? dependency('xmu') : no_dep
+xext = x11_target ? dependency('xext') : no_dep
+xfixes= x11_target ? dependency('xfixes') : no_dep
+x11_deps = [ x11, xmu, xext, xfixes ]
+conf.set('HAVE_XFIXES', xfixes.found())
+
+if x11_target
+ foreach header : [ 'X11/Xmu/WinUtil.h', 'X11/extensions/shape.h', ]
+ if not cc.has_header(header, dependencies: [ xext, xmu ])
+ error('x11 install does not provide required header ' + header)
+ endif
+ endforeach
+
+ foreach function : [ 'XmuClientWindow', 'XShapeGetRectangles', ]
+ if not cc.has_function(function, dependencies: [ xext, xmu ])
+ error('x11 install does not provide required function ' + function)
+ endif
+ endforeach
+endif
+conf.set('HAVE_X11_EXTENSIONS_SHAPE_H',
+ x11_target and cc.has_header('X11/extensions/shape.h'))
+conf.set('HAVE_X11_XMU_WINUTIL_H',
+ x11_target and cc.has_header('X11/Xmu/WinUtil.h'))
+
+
+have_print = get_option('print')
+
+# Features requiring x11
+
+have_doc_shooter= x11_target
+
+################################################################################
+# Plugins (optional dependencies)
+
+# The list of MIME types that are supported by plug-ins
+MIMEtypes = [
+ 'image/bmp',
+ 'image/g3fax',
+ 'image/gif',
+ 'image/svg+xml',
+ 'image/x-compressed-xcf',
+ 'image/x-fits',
+ 'image/x-gimp-gbr',
+ 'image/x-gimp-gih',
+ 'image/x-gimp-pat',
+ 'image/x-pcx',
+ 'image/x-portable-anymap',
+ 'image/x-portable-bitmap',
+ 'image/x-portable-graymap',
+ 'image/x-portable-pixmap',
+ 'image/x-psd',
+ 'image/x-sgi',
+ 'image/x-sun-raster',
+ 'image/x-tga',
+ 'image/x-xbitmap',
+ 'image/x-xcf',
+ 'image/x-xwindowdump',
+]
+
+
+
+libtiff_minver = '4.0.0'
+libtiff = dependency('libtiff-4', version: '>=' + libtiff_minver)
+MIMEtypes += 'image/tiff'
+
+
+libjpeg = dependency('libjpeg')
+MIMEtypes += 'image/jpeg'
+
+
+zlib = dependency('zlib')
+MIMEtypes += 'image/x-psp'
+
+bz2 = cc.find_library('bz2')
+
+liblzma_minver = '5.0.0'
+liblzma = dependency('liblzma', version: '>='+liblzma_minver)
+
+
+ghostscript = cc.find_library('gs', required: get_option('ghostscript'))
+if ghostscript.found()
+ MIMEtypes += 'application/postscript'
+else
+ ghostscript = disabler()
+endif
+
+libpng_minver = '1.6.25'
+libpng = dependency('libpng', version: '>='+libpng_minver)
+MIMEtypes += [ 'image/png', 'image/x-icon']
+
+libmng = dependency('libmng', required: get_option('mng'))
+
+if not libmng.found()
+ libmng = cc.find_library('mng', required: get_option('mng'),)
+
+ mng_test_prefix = ''
+ if platform_windows
+ mng_test_prefix = '#define MNG_USE_DLL\n#include <libmng.h>'
+ endif
+ if libmng.found() and not cc.has_function('mng_create', dependencies: libmng,
+ prefix: mng_test_prefix)
+ libmng = no_dep
+ endif
+endif
+
+libaa = cc.find_library('aa', required: get_option('aa'))
+
+libxpm = dependency('xpm', required: get_option('xpm'))
+if libxpm.found()
+ MIMEtypes += 'image/x-xpixmap'
+endif
+
+have_qoi = cc.has_header('qoi.h')
+if have_qoi
+ MIMEtypes += 'image/qoi'
+endif
+
+have_ilbm = cc.has_header('libilbm/ilbm.h')
+if have_ilbm
+ MIMEtypes += 'image/x-ilbm'
+endif
+
+openexr_minver = '1.6.1'
+openexr = dependency('OpenEXR', version: '>='+openexr_minver,
+ required: get_option('openexr')
+)
+if openexr.found()
+ MIMEtypes += 'image/x-exr'
+endif
+
+webp_minver = '0.6.0'
+webp_libs = [
+ dependency('libwebp', version: '>='+webp_minver, required: get_option('webp')),
+ dependency('libwebpmux', version: '>='+webp_minver, required: get_option('webp')),
+ dependency('libwebpdemux',version: '>='+webp_minver, required: get_option('webp')),
+]
+webp_found = true
+foreach lib : webp_libs
+ webp_found = webp_found and lib.found()
+endforeach
+
+if webp_found
+ MIMEtypes += [
+ 'image/x-webp',
+ 'image/webp'
+ ]
+endif
+
+libheif_minver = '1.3.2'
+libheif = dependency('libheif', version: '>='+libheif_minver,
+ required: get_option('heif')
+)
+conf.set('HAVE_LIBHEIF_1_4_0', libheif.version().version_compare('>=1.4.0'))
+conf.set('HAVE_LIBHEIF_1_6_0', libheif.version().version_compare('>=1.6.0'))
+
+can_import_heic = false
+can_export_heic = false
+can_import_avif = false
+can_export_avif = false
+
+have_heif = libheif.found()
+libheif_warning=''
+if have_heif
+ have_heif = true
+
+ if meson.can_run_host_binaries()
+ can_import_heic = cc.run('''
+ #include <libheif/heif.h>
+ int main() {
+ int success;
+ #if LIBHEIF_HAVE_VERSION(1,13,0)
+ heif_init (NULL);
+ #endif
+ success = heif_have_decoder_for_format (heif_compression_HEVC);
+ #if LIBHEIF_HAVE_VERSION(1,13,0)
+ heif_deinit ();
+ #endif
+
+ if (success)
+ return 0;
+ else
+ return 1;
+ }
+ ''',
+ dependencies: [ libheif ],
+ name: 'import HEIC').returncode() == 0
+
+ can_export_heic = cc.run('''
+ #include <libheif/heif.h>
+ int main() {
+ int success;
+ #if LIBHEIF_HAVE_VERSION(1,13,0)
+ heif_init (NULL);
+ #endif
+ success = heif_have_encoder_for_format (heif_compression_HEVC);
+ #if LIBHEIF_HAVE_VERSION(1,13,0)
+ heif_deinit ();
+ #endif
+
+ if (success)
+ return 0;
+ else
+ return 1;
+ }
+ ''',
+ dependencies: [ libheif ],
+ name: 'export HEIC').returncode() == 0
+
+ can_import_avif = cc.run('''
+ #include <libheif/heif.h>
+ int main() {
+ int success;
+ #if LIBHEIF_HAVE_VERSION(1,13,0)
+ heif_init (NULL);
+ #endif
+ success = heif_have_decoder_for_format (heif_compression_AV1);
+ #if LIBHEIF_HAVE_VERSION(1,13,0)
+ heif_deinit ();
+ #endif
+
+ if (success)
+ return 0;
+ else
+ return 1;
+ }
+ ''',
+ dependencies: [ libheif ],
+ name: 'import AVIF').returncode() == 0
+
+ can_export_avif = cc.run('''
+ #include <libheif/heif.h>
+ int main() {
+ int success;
+ #if LIBHEIF_HAVE_VERSION(1,13,0)
+ heif_init (NULL);
+ #endif
+ success = heif_have_encoder_for_format (heif_compression_AV1);
+ #if LIBHEIF_HAVE_VERSION(1,13,0)
+ heif_deinit ();
+ #endif
+
+ if (success)
+ return 0;
+ else
+ return 1;
+ }
+ ''',
+ dependencies: [ libheif ],
+ name: 'export AVIF').returncode() == 0
+ else
+ # When cross-compiling and we can't run our test binaries.
+ can_import_heic = true
+ can_export_heic = true
+ can_import_avif = true
+ can_export_avif = true
+ endif
+
+ if not can_import_heic and not can_import_avif
+ have_heif = false
+ endif
+
+ if have_heif
+ # Listing support for both HEIC and AVIF if we build with HEIF support,
+ # because codecs can be added at any time later and we won't be able to edit
+ # the desktop file once it's installed. See discussion in #9080.
+ MIMEtypes += [
+ 'image/heif',
+ 'image/heic',
+ 'image/avif'
+ ]
+ endif
+
+ if have_heif and (libheif.version().version_compare('==1.5.0') or libheif.version().version_compare('==1.5.1'))
+ libheif_warning='''
+
+ libheif version 1.5.0 and 1.5.1 are known to crash when
+ exporting (bug #4185). Please update.
+ '''
+ warning(libheif_warning)
+ warnings += libheif_warning
+ endif
+endif
+
+have_vala = add_languages('vala', required: get_option('vala'), native: false)
+if have_vala
+ babl = declare_dependency(
+ dependencies: [
+ babl,
+ meson.get_compiler('vala').find_library('babl-0.1'),
+ ]
+ )
+
+ # TODO: remove this once we release 3.0
+ valac = meson.get_compiler('vala')
+ if valac.version().version_compare('>= 0.31.1')
+ add_project_arguments('--disable-since-check', language: 'vala')
+ endif
+endif
+
+# We disable WebkitGTK as default for now and discourage its use because
+# it is just a horror to build, is not available on Windows anymore
+# (AFAIK), and features brought are not worth the pain. We still leave
+# the code because mitch wants us to be able to look at it later, maybe
+# reinstate it through some shape or another. Yet for now, it is to be
+# considered non-existing feature for packager point of view. It is only
+# there in the hope developers get it back in shape.
+webkit_minver = '2.20.3'
+if get_option('webkit-unmaintained')
+ webkit = dependency('webkit2gtk-4.0', version: '>=' + webkit_minver)
+endif
+conf.set('HAVE_WEBKIT', get_option('webkit-unmaintained'))
+
+poppler_minver = '0.69.0'
+poppler_data_minver = '0.4.9'
+poppler = [
+ dependency('poppler-glib', version: '>='+poppler_minver),
+ dependency('poppler-data', version: '>='+poppler_data_minver),
+]
+
+cairopdf_minver = '1.12.2'
+cairopdf = dependency('cairo-pdf', version: '>='+cairopdf_minver,
+ required: get_option('cairo-pdf')
+)
+
+# PDF import support is a granted feature.
+MIMEtypes += 'application/pdf'
+
+wmf_minver = '0.2.8'
+wmf = dependency('libwmf', version: '>='+wmf_minver,
+ required: get_option('wmf')
+)
+if wmf.found()
+ MIMEtypes += 'image/x-wmf'
+endif
+
+openjpeg_minver = '2.1.0'
+openjpeg = dependency('libopenjp2', version: '>='+openjpeg_minver,
+ required: get_option('jpeg2000')
+)
+if openjpeg.found()
+ MIMEtypes += [ 'image/jp2', 'image/jpeg2000', 'image/jpx', ]
+endif
+
+jpegxl_minver = '0.7.0'
+libjxl = dependency('libjxl',
+ version: '>='+jpegxl_minver,
+ required: get_option('jpeg-xl')
+)
+libjxl_threads = dependency('libjxl_threads',
+ version: '>='+jpegxl_minver,
+ required: get_option('jpeg-xl')
+)
+if libjxl.found() and libjxl_threads.found()
+ MIMEtypes += 'image/jxl'
+endif
+
+xmc = dependency('xcursor', required: get_option('xcursor'))
+if xmc.found()
+ MIMEtypes += 'image/x-xcursor'
+endif
+
+
+alsa = dependency('alsa', version: '>=1.0.0', required: get_option('alsa'))
+conf.set('HAVE_ALSA', alsa.found())
+
+# Linux Input
+
+if get_option('linux-input').disabled()
+ have_linuxinput = false
+else
+ have_linuxinput = cc.has_header('linux/input.h',
+ required: get_option('linux-input'))
+endif
+
+if have_linuxinput
+ gudev = dependency('gudev-1.0', version: '>=167', required: get_option('gudev'))
+else
+ gudev = no_dep
+endif
+conf.set('HAVE_LIBGUDEV', gudev.found())
+
+
+# DirectX DirectInput
+directx = no_dep
+directx_sdk_path = get_option('directx-sdk-dir')
+if directx_sdk_path != '' and platform_windows
+ if directx_sdk_path.contains(' ') or directx_sdk_path.contains('\\')
+ error('\n'.join([
+ 'The DirectX SDK path should be given :',
+ '* without spaces (use MSys mounts)',
+ '* with plain (forward) slashes only,'
+ ]))
+ endif
+
+ directx = declare_dependency(
+ dependencies: cc.find_library('dxguid',
+ dirs: directx_sdk_path / 'Lib' / 'x86'),
+ include_directories: directx_sdk_path / 'Include',
+ )
+endif
+conf.set('HAVE_DX_DINPUT', directx.found())
+
+cfitsio_dep = dependency('cfitsio', required: false)
+if cfitsio_dep.found()
+ MIMEtypes += 'image/fits'
+endif
+
+
+################################################################################
+# Email sending
+email_message = false
+
+sendmail_choice = get_option('with-sendmail')
+if not [ '', 'false', 'no', ].contains(sendmail_choice)
+ if [ 'true', 'yes' ].contains(sendmail_choice)
+ sendmail_path = 'sendmail'
+ else
+ sendmail_path = sendmail_choice
+ endif
+
+ sendmail = find_program(sendmail_path, required: false)
+ if sendmail.found()
+ sendmail_path = sendmail.path()
+ else
+ mail_warning = 'Sendmail specified but not found. It should be installed at runtime!'
+ warning(mail_warning)
+ warnings += mail_warning
+ endif
+
+ email_message = '@0@ (@1@)'.format(true, sendmail_path)
+ conf.set_quoted('SENDMAIL', sendmail_path)
+else
+ xdg_email_path = 'xdg-email'
+ xdg_email = find_program(xdg_email_path, required: false)
+ if xdg_email.found()
+ xdg_email_path = xdg_email.full_path()
+ else
+ mail_warning = 'Xdg-email not found, but required at runtime for email sending.'
+ warning(mail_warning)
+ warnings += mail_warning
+ endif
+
+ email_message = '@0@ (@1@)'.format(true, xdg_email_path)
+endif
+
+
+################################################################################
+# ISO codes
+
+isocodes = dependency('iso-codes', required: false)
+if isocodes.found()
+ isocodes_prefix = isocodes.get_variable(pkgconfig: 'prefix')
+ isocodes_location = isocodes_prefix / get_option('datadir') / 'xml' / 'iso-codes'
+ isocodes_localedir= isocodes_prefix / get_option('datadir') / 'locale'
+endif
+conf.set('HAVE_ISO_CODES', isocodes.found())
+
+
+################################################################################
+# Program tools
+
+perl = find_program('perl5', 'perl', 'perl5.005', 'perl5.004', 'perl')
+
+## Python
+
+# By default, we want packagers to install Python plug-ins to get the
+# optimum experience. -Dpython=true will check for a Python 3
+# interpreter and PyGObject, and warns without.
+# It is up to the packager to ensure they are available at run time.
+# This can be useful in particular when cross-compiling since anyway
+# the interpreter is not useful at build time.
+
+python3_minver = '>=3.6'
+
+python = pythonmod.find_installation('python3')
+message('Found Python @0@'.format(python.language_version()))
+
+have_python = get_option('python').enabled()
+
+python_found = true
+MIMEtypes += 'image/openraster'
+
+## Javascript
+
+gjs = find_program('gjs', required: get_option('javascript'))
+have_javascript = get_option('javascript').enabled() or (gjs.found() and get_option('javascript').auto())
+if not gjs.found() and have_javascript
+ gjs = find_program('gjs', required: false)
+ if not gjs.found()
+ js_warning = '''
+ GJS was not found.
+ JavaScript plug-ins will be installed anyway but you should make sure that
+ the JavaScript interpreter GJS is available at installation, otherwise
+ installed plug-ins won't be usable.
+ '''
+ warning(js_warning)
+ warnings += js_warning
+ endif
+endif
+
+## Lua
+
+lua = find_program('luajit', required: get_option('lua'))
+have_lua = get_option('lua').enabled() or (lua.found() and get_option('lua').auto())
+if not lua.found() and have_lua
+ lua_warning = '''
+ Luajit was not found.
+ Lua plug-ins will be installed anyway but you should make sure that
+ luajit and LGI are available at installation, otherwise
+ installed plug-ins won't be usable.
+ '''
+ warning(lua_warning)
+ warnings += lua_warning
+endif
+
+
+# Check for XML tools
+xmllint = find_program('xmllint', required: false)
+xsltproc = find_program('xsltproc')
+desktop_validate = find_program('desktop-file-validate', required: false)
+
+appstreamcli = find_program('appstreamcli', version: '>=0.15.3', required: get_option('appdata-test'))
+
+# Check for doc generation tools
+
+gi_docgen = find_program('gi-docgen', required: get_option('gi-docgen'))
+
+if get_option('g-ir-doc')
+ gir_doc_tool = find_program('g-ir-doc-tool', required: true)
+ yelp_build = find_program('yelp-build', required: true)
+endif
+
+# Check for vector icons
+have_vector_icons = get_option('vector-icons')
+if have_vector_icons
+ # shared-mime-info is needed to correctly detect SVG files
+ # (except on Windows, apparently).
+ if platform_windows
+ vec_warning = '''
+ You enabled vector icons on Win32. Make sure to run:
+ $ gdk-pixbuf-query-loaders.exe --update-cache
+ on the target machine (this command generates loaders.cache)
+ so that GdkPixbuf knows where to find the SVG loader.
+ '''
+ warning(vec_warning)
+ warnings += vec_warning
+ else
+ shared_mime_info = dependency('shared-mime-info')
+ endif
+else
+ # The trick when disabling vector icons is that librsvg is still
+ # needed at compile time (on build machine) to generate PNG, even
+ # though it won't be needed at runtime for icon display.
+ #
+ # The tool gtk-encode-symbolic-svg also requires a SVG GdkPixbuf
+ # loader, which usually uses librsvg as well anyway.
+ vec_warning = '''
+ Vector icons are disabled. Be aware that librsvg is still
+ needed to create the PNG icons on the build machine, yet it
+ won't be needed for runtime icon display of distributed themes.
+ '''
+ warning(vec_warning)
+ warnings += vec_warning
+endif
+
+native_glib_minver = '2.2.0'
+native_glib = dependency('glib-2.0', version: '>='+native_glib_minver, native: true)
+native_rsvg = dependency('librsvg-2.0', version: '>='+rsvg_minver, native: true)
+
+# Running tests headless
+xvfb_run = find_program('xvfb-run', required: get_option('headless-tests'))
+dbus_run_session = find_program('dbus-run-session', required: get_option('headless-tests'))
+if xvfb_run.found() and dbus_run_session.found()
+ conf.set('HAVE_XVFB_RUN', true)
+ add_test_setup('headless',
+ exe_wrapper: find_program('build' / 'meson' / 'run_test_env.sh'),
+ is_default: true,
+ )
+endif
+
+# Set bug report URL
+
+# Allowing third-party packagers to set their own bugtracker URL, in
+# order to filter first packaging bugs from core bugs.
+bug_report_url = get_option('bug-report-url')
+
+if bug_report_url == ''
+ message('''
+ NOTE: if you plan on packaging GIMP for distribution, it is recommended
+ to override the bug report URL with option:
+ -Dbug-report-url=https://example.com/
+ so that you can filter packaging bugs from core bugs before reporting upstream.
+ ''')
+
+ bug_report_url = project_url_issues
+endif
+conf.set_quoted('PACKAGE_BUGREPORT', project_url_issues)
+conf.set_quoted('BUG_REPORT_URL', bug_report_url)
+
+# Build identifiers #
+
+conf.set_quoted('GIMP_BUILD_ID', get_option('build-id'))
+conf.set_quoted('GIMP_BUILD_PLATFORM', host_os)
+if platform_linux
+ conf.set_quoted('GIMP_BUILD_PLATFORM_FAMILY', 'linux')
+elif platform_windows
+ conf.set_quoted('GIMP_BUILD_PLATFORM_FAMILY', 'windows')
+elif platform_osx
+ conf.set_quoted('GIMP_BUILD_PLATFORM_FAMILY', 'macos')
+else
+ conf.set_quoted('GIMP_BUILD_PLATFORM_FAMILY', 'other')
+endif
+
+if get_option('check-update') == 'yes'
+ check_update = true
+elif get_option('check-update') == 'no'
+ check_update = false
+else # == 'platform-default'
+ if platform_windows or platform_osx
+ check_update = true
+ else
+ # Other packages usually have their own update system (software
+ # repositories on Linux and other *BSDs for instance) so we
+ # shouldn't notify about new versions, at least not as a default.
+ check_update = false
+ endif
+endif
+conf.set('CHECK_UPDATE', check_update)
+
+# Default ICC directory #
+
+# This is necessary because some Unix systems may have a different
+# standard path for color profiles. And in particular, sandbox builds
+# might mount the host system at a different root. This is for
+# instance the case of flatpak which mount the host root at /run/host/.
+
+# if not (platform_osx or platform_windows)
+
+icc_directory = get_option('icc-directory')
+if icc_directory == ''
+ icc_directory = '/usr/share/color/icc'
+endif
+conf.set_quoted('COLOR_PROFILE_DIRECTORY', icc_directory)
+
+# endif
+
+if get_option('enable-default-bin').auto()
+ enable_default_bin = stable
+elif get_option('enable-default-bin').enabled()
+ enable_default_bin = true
+else
+ enable_default_bin = false
+endif
+
+enable_console_bin = get_option('enable-console-bin')
+
+if enable_default_bin and meson.version().version_compare('<0.61.0')
+ error('"enable-default-bin" build option requires meson 0.61 or later. Please disable the option or update meson.')
+endif
+
+# Possibly change default gimpdir from $XDG_CONFIG_HOME/GIMP/gimp_user_version
+gimpdir = get_option('gimpdir')
+if gimpdir == ''
+ # Default value
+ gimpdir = meson.project_name().to_upper()
+endif
+
+project_subdir = meson.project_name() / gimp_app_version
+gimpdatadir = get_option('datadir') / project_subdir
+gimpplugindir = get_option('libdir') / project_subdir
+gimpsysconfdir = get_option('sysconfdir') / project_subdir
+gimpmanpagedir = gimpdir
+localedir = get_option('datadir') / 'locale'
+
+
+
+# Check for internal tools
+extract_vector_icon = find_program('tools'/'extract-vector-icon.sh')
+generate_changelog = find_program('tools'/'generate_changelog.sh')
+generate_news = find_program('tools'/'generate-news')
+gimppath2svg = find_program('tools'/'gimppath2svg.py')
+module_dependencies = find_program('tools'/'module-dependencies.py')
+meson_install_subdir= find_program('tools'/'meson_install_subdir.py')
+
+gimp_mkenums = find_program('tools' / 'gimp-mkenums')
+mkenums_wrap = find_program(meson.current_source_dir() / 'tools' / 'meson-mkenums.sh')
+
+libgimp_mkenums_dtails = \
+ ' { 0, NULL, NULL }\n' + \
+ ' };\n' + \
+ '\n' + \
+ ' static GType type = 0;\n' + \
+ '\n' + \
+ ' if (G_UNLIKELY (! type))\n' + \
+ ' {\n' + \
+ ' type = g_@type@_register_static ("@EnumName@", values);\n' + \
+ ' gimp_type_set_translation_domain (type, GETTEXT_PACKAGE "-libgimp");\n' + \
+ ' gimp_type_set_translation_context (type, "@enumnick@");\n' + \
+ ' gimp_@type@_set_value_descriptions (type, descs);\n' + \
+ ' }\n' + \
+ '\n' + \
+ ' return type;\n' + \
+ '}\n'
+
+conf.set('ENABLE_NLS', true)
+conf.set('HAVE_GETTEXT', true)
+
+# localedir = get_option('prefix') / get_option('localedir')
+
+
+################################################################################
+# Miscellaneous configuration
+
+# #
+## ## # #### ####
+# # # # # # # #
+# # # # #### #
+# # # # #
+# # # # # # #
+# # # #### ####
+
+
+
+# Enable support for multiprocessing
+conf.set10('ENABLE_MP', get_option('enable-multiproc'))
+
+# Enable support for OpenMP
+openmp = dependency('openmp', required : false)
+if openmp.found()
+ have_openmp = true
+else
+ have_openmp = false
+endif
+conf.set('HAVE_OPENMP', have_openmp)
+
+# Check for available functions
+foreach fn : [
+ { 'm': 'HAVE_ALLOCA', 'v': 'alloca', },
+ { 'm': 'HAVE_DCGETTEXT', 'v': 'dcgettext', },
+ { 'm': 'HAVE_DIFFTIME', 'v': 'difftime', },
+ { 'm': 'HAVE_FSYNC', 'v': 'fsync', },
+ { 'm': 'HAVE_GETADDRINFO', 'v': 'getaddrinfo', },
+ { 'm': 'HAVE_GETNAMEINFO', 'v': 'getnameinfo', },
+ { 'm': 'HAVE_GETTEXT', 'v': 'gettext', },
+ { 'm': 'HAVE_MMAP', 'v': 'mmap', },
+ { 'm': 'HAVE_RINT', 'v': 'rint', },
+ { 'm': 'HAVE_THR_SELF', 'v': 'thr_self', },
+ { 'm': 'HAVE_VFORK', 'v': 'vfork', },
+ ]
+ conf.set(fn['m'],
+ cc.has_function(fn['v']) ? 1 : false
+ )
+endforeach
+
+conf.set('HAVE_BIND_TEXTDOMAIN_CODESET',
+ cc.has_header_symbol('libintl.h', 'bind_textdomain_codeset') ? 1 : false
+)
+conf.set('HAVE_VPRINTF',
+ cc.has_header_symbol('libintl.h', 'vprintf') ? 1 : false
+)
+
+
+# Check for available headers
+foreach header : [
+ { 'm': 'HAVE_ALLOCA_H', 'v': 'alloca.h' },
+ { 'm': 'HAVE_DLFCN_H', 'v': 'dlfcn.h' },
+ { 'm': 'HAVE_FCNTL_H', 'v': 'fcntl.h' },
+ { 'm': 'HAVE_IEEEFP_H', 'v': 'ieeefp.h' },
+ { 'm': 'HAVE_INTTYPES_H', 'v': 'inttypes.h' },
+ { 'm': 'HAVE_LOCALE_H', 'v': 'locale.h' },
+ { 'm': 'HAVE_MATH_H', 'v': 'math.h' },
+ { 'm': 'HAVE_MEMORY_H', 'v': 'memory.h' },
+ { 'm': 'HAVE_STDINT_H', 'v': 'stdint.h' },
+ { 'm': 'HAVE_STDLIB_H', 'v': 'stdlib.h' },
+ { 'm': 'HAVE_STRING_H', 'v': 'string.h' },
+ { 'm': 'HAVE_STRINGS_H', 'v': 'strings.h' },
+ { 'm': 'HAVE_SYS_PARAM_H', 'v': 'sys/param.h' },
+ { 'm': 'HAVE_SYS_PRCTL_H', 'v': 'sys/prctl.h' },
+ { 'm': 'HAVE_SYS_SELECT_H', 'v': 'sys/select.h' },
+ { 'm': 'HAVE_SYS_STAT_H', 'v': 'sys/stat.h' },
+ { 'm': 'HAVE_SYS_THR_H', 'v': 'sys/thr.h' },
+ { 'm': 'HAVE_SYS_TIME_H', 'v': 'sys/time.h' },
+ { 'm': 'HAVE_SYS_TIMES_H', 'v': 'sys/times.h' },
+ { 'm': 'HAVE_SYS_TYPES_H', 'v': 'sys/types.h' },
+ { 'm': 'HAVE_SYS_WAIT_H', 'v': 'sys/wait.h' },
+ { 'm': 'HAVE_UNISTD_H', 'v': 'unistd.h' },
+ { 'm': 'HAVE_MMAN_H', 'v': 'sys/mman.h' },
+ { 'm': 'HAVE_IPC_H', 'v': 'sys/ipc.h' },
+ { 'm': 'HAVE_SHM_H', 'v': 'sys/shm.h' },
+ ]
+ conf.set(header['m'], cc.has_header(header['v']) ? 1 : false)
+endforeach
+
+# In musl, backtrace() is in the libexecinfo library.
+# In glibc, it is internal (there we only need the header).
+# So we look for both cases, so that we are able to link to libexecinfo
+# if it exists. Cf. !455.
+opt_execinfo = cc.find_library('execinfo', has_headers: ['execinfo.h'], required: false)
+conf.set('HAVE_EXECINFO_H', opt_execinfo.found() or cc.has_header('execinfo.h') ? 1 : false)
+
+
+################################################################################
+# Check for shared memory handling
+
+shmem_choice = get_option('shmem-type')
+if shmem_choice == 'auto'
+ shmem_choice = 'sysv'
+
+ # MacOS X has broken SysV shm
+ if platform_osx
+ shmem_choice = 'posix'
+ endif
+ if platform_windows
+ shmem_choice = 'win32'
+ endif
+endif
+
+conf.set('USE_SYSV_SHM', true)
+
+conf.set('NO_FD_SET',
+ not platform_windows
+ and not cc.compiles('''
+ #include <sys/types.h>
+ int main() { fd_set readMask, writeMask; return 0; }
+ ''')
+)
+
+# GCC attributes
+conf.set('HAVE_FUNC_ATTRIBUTE_DESTRUCTOR',
+ cc.compiles('''__attribute__ ((destructor)) void destructor_fn(void) { }''')
+)
+
+
+
+
+################################################################################
+# Set/regroup common CFlags for subdirs
+
+######
+# # ###### ###### # # # ###### ####
+# # # # # ## # # #
+# # ##### ##### # # # # ##### ####
+# # # # # # # # # #
+# # # # # # ## # # #
+###### ###### # # # # ###### ####
+
+# Compiler
+conf.set_quoted('CC', cc.get_id())
+
+cc_version=''
+if cc.get_id() == 'gcc' or cc.get_id() == 'clang'
+ cc_cmd = run_command(cc, '-v', check: false)
+ # Note: the call might actually fail when using ccache.
+ # See: https://github.com/mesonbuild/meson/issues/6174
+ if cc_cmd.returncode() == 0
+ cc_version = cc_cmd.stdout() + cc_cmd.stderr()
+ endif
+else
+ # Various compilers have various options. Try most common ones. This
+ # list of options comes from autotools checks.
+ foreach arg : [ '--version', '-v', '-V', '-qversion' ]
+ cc_cmd = run_command(cc, arg, check: false)
+ if cc_cmd.returncode() == 0
+ cc_version = cc_cmd.stdout()
+ endif
+ endforeach
+endif
+if cc_version == ''
+ # We didn't manage to get a meaningful verbose version from the
+ # compiler. Just save its name and version.
+ cc_version = cc.get_id() + ' ' + cc.version()
+else
+ if platform_windows
+ # On Windows the CC_VERSION string can contain backslashes in paths,
+ # specifically in COLLECT_GCC. Replace by slashes.
+ cc_version = '/'.join(cc_version.split('\\'))
+ endif
+ # See also: https://github.com/mesonbuild/meson/pull/6179
+ cc_version = '\\n'.join(cc_version.split('\n'))
+endif
+conf.set_quoted('CC_VERSION', cc_version.strip())
+
+# Names
+conf.set_quoted('GIMP_PACKAGE', meson.project_name())
+conf.set_quoted('PACKAGE_NAME', meson.project_name())
+conf.set_quoted('PACKAGE_STRING', package_string)
+conf.set_quoted('GIMP_COMMAND', gimp_command)
+
+# Versions
+conf.set_quoted('GIMP_APP_VERSION_STRING',gimp_app_version)
+conf.set_quoted('GIMP_APP_VERSION', gimp_app_version)
+conf.set_quoted('GIMP_USER_VERSION', gimp_app_version)
+
+conf.set_quoted('GIMP_DATA_VERSION', gimp_app_version)
+conf.set_quoted('GIMP_PLUGIN_VERSION', gimp_app_version)
+conf.set_quoted('GIMP_SYSCONF_VERSION', gimp_app_version)
+conf.set_quoted('GIMP_TOOL_VERSION', gimp_app_version)
+conf.set_quoted('GIMP_PKGCONFIG_VERSION', gimp_api_version)
+
+# Directories
+conf.set_quoted('PREFIX', prefix)
+conf.set_quoted('EXEC_PREFIX', prefix)
+conf.set_quoted('GIMPDIR', gimpdir)
+conf.set_quoted('GIMPSYSCONFDIR', prefix / gimpsysconfdir)
+conf.set_quoted('GIMPDATADIR', prefix / gimpdatadir)
+conf.set_quoted('GIMPPLUGINDIR', prefix / gimpplugindir)
+conf.set_quoted('PLUGINDIR', prefix / gimpplugindir)
+conf.set_quoted('LOCALEDIR', prefix / localedir)
+conf.set_quoted('DESKTOP_DATADIR', prefix / get_option('datadir'))
+
+conf.set_quoted('LOCALSTATEDIR', prefix / get_option('localstatedir'))
+# /usr/com?
+conf.set_quoted('SHAREDSTATEDIR', prefix / get_option('sharedstatedir'))
+conf.set_quoted('SYSCONFDIR', prefix / get_option('sysconfdir'))
+conf.set_quoted('BINDIR', prefix / get_option('bindir'))
+conf.set_quoted('DATAROOTDIR', prefix / get_option('datadir'))
+conf.set_quoted('INFODIR', prefix / get_option('infodir'))
+conf.set_quoted('LIBDIR', prefix / get_option('libdir'))
+conf.set_quoted('LIBEXECDIR', prefix / get_option('libexecdir'))
+conf.set_quoted('MANDIR', prefix / get_option('mandir'))
+conf.set_quoted('SBINDIR', prefix / get_option('sbindir'))
+conf.set_quoted('SYSDATADIR', prefix / get_option('datadir'))
+
+# Third-party/Misc
+if isocodes.found()
+ conf.set_quoted('ISO_CODES_LOCATION', isocodes_location)
+ conf.set_quoted('ISO_CODES_LOCALEDIR', isocodes_localedir)
+endif
+
+
+if platform_osx
+ # libgimp_cflags += '-xobjective-c'
+ # libgimp_lflags += ['-framework', 'Cocoa']
+endif
+
+
+################################################################################
+# Generate files
+
+ ##### #######
+ # # #### # # ###### # #### # # # ###### ####
+ # # # ## # # # # # # # # # #
+ # # # # # # ##### # # ##### # # ##### ####
+ # # # # # # # # # ### # # # # #
+ # # # # # ## # # # # # # # # # #
+ ##### #### # # # # #### # # ###### ###### ####
+
+
+# git-version.h is already present and not generated if dist tarball
+is_git_repository = run_command(python, '-c',
+ 'import sys,os; sys.exit(0 if os.path.exists(".git") else 1)',
+ check: false
+).returncode() == 0
+
+has_version_h = run_command(python, '-c',
+ 'import sys,os; sys.exit(0 if os.path.exists("git-version.h") else 1)',
+ check: false
+).returncode() == 0
+
+generate_version_h = is_git_repository or not has_version_h
+if generate_version_h
+ gitversion_h1 = vcs_tag(
+ input : 'app/git-version.h.in',
+ output: 'git-version.h.in.1',
+ command: [ 'git', 'describe', '--always', ],
+ replace_string: '@GIMP_GIT_VERSION@',
+ fallback: 'unknown (unsupported)',
+ )
+ gitversion_h2 = vcs_tag(
+ input : gitversion_h1,
+ output: 'git-version.h.in.2',
+ command: [ 'git', 'rev-parse', '--short', 'HEAD', ],
+ replace_string: '@GIMP_GIT_VERSION_ABBREV@',
+ fallback: 'unknown (unsupported)',
+ )
+ gitversion_h = vcs_tag(
+ input : gitversion_h2,
+ output: 'git-version.h',
+ command: [ 'git', 'log', '-n1', '--date=format:%Y', '--pretty=%cd', ],
+ replace_string: '@GIMP_GIT_LAST_COMMIT_YEAR@',
+ fallback: 'unknown (unsupported)',
+ )
+
+ git = find_program('git', required: false)
+ if not is_git_repository or not git.found()
+ # We create git-version.h but know it will be useless because we are
+ # not in a git repository. Output a warning.
+ git_warning = '''
+
+ UNSUPPORTED BUILD!
+
+ This is not a distribution tarball (git-version.h missing) and
+ we could not establish the corresponding commit (either this is
+ not a git repository or git command is missing). Therefore
+ we have no reference for debugging.
+ Please either use release tarballs or build from the repository.
+ '''
+ warning(git_warning)
+ warnings += git_warning
+ endif
+else
+ gitversion_h = files('git-version.h')
+endif
+
+install_conf = configuration_data()
+install_conf.set('GIMP_APP_VERSION', gimp_app_version)
+install_conf.set('GIMP_PKGCONFIG_VERSION', gimp_version)
+install_conf.set('GIMP_VERSION', gimp_version)
+install_conf.set('APPSTREAM_GLIB_REQUIRED_VERSION', appstream_glib_minver)
+install_conf.set('ATK_REQUIRED_VERSION', atk_minver)
+install_conf.set('BABL_REQUIRED_VERSION', babl_minver)
+install_conf.set('CAIRO_PDF_REQUIRED_VERSION', cairopdf_minver)
+install_conf.set('CAIRO_REQUIRED_VERSION', cairo_minver)
+install_conf.set('FONTCONFIG_REQUIRED_VERSION', fontconfig_minver)
+install_conf.set('FREETYPE2_REQUIRED_VERSION', freetype2_minver)
+install_conf.set('GDK_PIXBUF_REQUIRED_VERSION', gdk_pixbuf_minver)
+install_conf.set('GEGL_REQUIRED_VERSION', gegl_minver)
+install_conf.set('EXIV2_REQUIRED_VERSION', exiv2_minver)
+install_conf.set('GEXIV2_REQUIRED_VERSION', gexiv2_minver)
+install_conf.set('GLIB_REQUIRED_VERSION', glib_minver)
+install_conf.set('GTK_REQUIRED_VERSION', gtk3_minver)
+install_conf.set('HARFBUZZ_REQUIRED_VERSION', harfbuzz_minver)
+install_conf.set('LCMS_REQUIRED_VERSION', lcms_minver)
+install_conf.set('LIBHEIF_REQUIRED_VERSION', libheif_minver)
+install_conf.set('LIBLZMA_REQUIRED_VERSION', liblzma_minver)
+install_conf.set('LIBTIFF_REQUIRED_VERSION', libtiff_minver)
+install_conf.set('LIBMYPAINT_REQUIRED_VERSION', libmypaint_minver)
+install_conf.set('LIBPNG_REQUIRED_VERSION', libpng_minver)
+install_conf.set('OPENEXR_REQUIRED_VERSION', openexr_minver)
+install_conf.set('OPENJPEG_REQUIRED_VERSION', openjpeg_minver)
+install_conf.set('PANGOCAIRO_REQUIRED_VERSION', pangocairo_minver)
+install_conf.set('POPPLER_DATA_REQUIRED_VERSION', poppler_data_minver)
+install_conf.set('POPPLER_REQUIRED_VERSION', poppler_minver)
+install_conf.set('PYTHON3_REQUIRED_VERSION', python3_minver)
+install_conf.set('RSVG_REQUIRED_VERSION', rsvg_minver)
+install_conf.set('WEBKITGTK_REQUIRED_VERSION', webkit_minver)
+install_conf.set('WEBP_REQUIRED_VERSION', webp_minver)
+install_conf.set('WMF_REQUIRED_VERSION', wmf_minver)
+install_conf.set('XGETTEXT_REQUIRED_VERSION', '0.19')
+
+if is_git_repository
+ # Tarballs won't have INSTALL.in, only the generated INSTALL.
+ INSTALL = configure_file(
+ input : 'INSTALL.in',
+ output: 'INSTALL',
+ configuration: install_conf
+ )
+endif
+
+
+configure_file(
+ output: 'config.h',
+ configuration: conf
+)
+compiler_args +='-DHAVE_CONFIG_H'
+
+
+add_project_arguments(compiler_args, language: [ 'c', 'cpp' ])
+add_project_link_arguments(linker_args, language: [ 'c', 'cpp' ])
+
+################################################################################
+# Miscellaneous targets
+
+
+ # # #######
+ ## ## # #### #### # ## ##### #### ###### ##### ####
+ # # # # # # # # # # # # # # # # # #
+ # # # # #### # # # # # # # ##### # ####
+ # # # # # # ###### ##### # ### # # #
+ # # # # # # # # # # # # # # # # # #
+ # # # #### #### # # # # # #### ###### # ####
+
+
+
+custom_target('AUTHORS',
+ input : [ 'authors.xsl', 'authors.xml', ],
+ output: 'AUTHORS',
+ command: [
+ xsltproc,
+ '-o', '@OUTPUT@',
+ '@INPUT@',
+ ],
+ build_by_default: false,
+)
+custom_target('authors.md',
+ input : [ 'authors4gimp-web.xsl', 'authors.xml', ],
+ output: 'authors.md',
+ command: [
+ xsltproc,
+ '--stringparam', 'today', '`date --iso-8601=seconds`',
+ '-o', '@OUTPUT@',
+ '@INPUT@',
+ ],
+ build_by_default: false,
+)
+
+if xmllint.found()
+ custom_target('validate-authors',
+ command: [
+ xmllint,
+ '--output', '@OUTPUT@',
+ '--valid', '@INPUT@',
+ ],
+ input : [ 'authors.xml', ],
+ output: [ 'validate-authors-output.xml' ],
+ build_by_default: true,
+ install: false
+ )
+endif
+
+custom_target('Changelog',
+ input : [ ],
+ output: [ 'Changelog', ],
+ command: [
+ generate_changelog,
+ meson.project_source_root(),
+ '@OUTPUT@'
+ ],
+ build_by_default: false,
+)
+
+meson.add_dist_script('meson_dist_script.sh',
+ generate_version_h ? gitversion_h.full_path() : gitversion_h,
+ meson.project_source_root(), meson.project_build_root())
+
+
+################################################################################
+# Subdirs
+
+
+rootInclude = include_directories('.')
+appInclude = include_directories('app')
+
+subdir('build/windows')
+
+# Tools
+subdir('libgimpbase')
+subdir('tools')
+subdir('pdb')
+
+# Translations
+subdir('po')
+subdir('po-libgimp')
+subdir('po-plug-ins')
+subdir('po-python')
+subdir('po-script-fu')
+subdir('po-tags')
+subdir('po-tips')
+# Data / Desktop / xml files
+subdir('cursors')
+subdir('data')
+subdir('desktop')
+subdir('etc')
+subdir('icons')
+subdir('menus')
+subdir('themes')
+
+# Libraries (order here is important!)
+subdir('libgimpcolor')
+subdir('libgimpmath')
+subdir('libgimpconfig')
+subdir('libgimpmodule')
+subdir('libgimpthumb')
+subdir('libgimpwidgets')
+subdir('libgimp')
+
+# Executables, plugins
+subdir('extensions')
+subdir('modules')
+subdir('plug-ins')
+subdir('app')
+subdir('app-tools')
+
+# Docs
+subdir('docs')
+subdir('devel-docs')
+
+# Windows installer
+if get_option('windows-installer')
+ subdir('po-windows-installer')
+ subdir('build/windows/installer')
+endif
+
+pkgconfig.generate(libgimp,
+ filebase: 'gimp-' + gimp_api_version,
+ name: prettyname,
+ description: 'GIMP Library',
+ version: gimp_version,
+ requires: [
+ gdk_pixbuf,
+ cairo,
+ gegl,
+ ],
+ libraries: [
+ libgimpbase,
+ libgimpcolor,
+ libgimpconfig,
+ libgimpmath,
+ ],
+ subdirs: [
+ gimp_api_name,
+ ],
+ variables: [
+ 'datarootdir=' +'${prefix}/'+ get_option('datadir'),
+ 'gimpdatadir=' +'${prefix}/'+ gimpdatadir,
+ 'gimplibdir=' +'${prefix}/'+ gimpplugindir,
+ 'gimpsysconfdir=' + gimpsysconfdir,
+ 'gimplocaledir=' +'${prefix}/'+ localedir,
+ ],
+)
+
+pkgconfig.generate(libgimpthumb,
+ filebase: 'gimpthumb-' + gimp_api_version,
+ name: 'GIMP Thumb',
+ description: 'GIMP Thumbnail Library',
+ version: gimp_version,
+ requires: [
+ libgimp,
+ gdk_pixbuf,
+ ],
+ subdirs: [
+ gimp_api_name,
+ ],
+)
+
+pkgconfig.generate(libgimpui,
+ filebase: 'gimpui-' + gimp_api_version,
+ name: 'GIMP UI',
+ description: 'GIMP User Interface Library',
+ version: gimp_version,
+ requires: [
+ libgimp,
+ gtk3,
+ ],
+ libraries: [
+ libgimpwidgets,
+ libgimpmodule,
+ ],
+ subdirs: [
+ gimp_api_name,
+ ],
+)
+
+
+
+################################################################################
+# Subdir installations
+
+foreach dir : [
+ { 'dir': 'libgimp', 'deps': libgimp},
+ { 'dir': 'libgimpbase', 'deps': libgimpbase},
+ { 'dir': 'libgimpcolor', 'deps': libgimpcolor},
+ { 'dir': 'libgimpconfig', 'deps': libgimpconfig},
+ { 'dir': 'libgimpmath', 'deps': libgimpmath},
+ { 'dir': 'libgimpmodule', 'deps': libgimpmodule},
+ { 'dir': 'libgimpthumb', 'deps': libgimpthumb},
+ { 'dir': 'libgimpwidgets', 'deps': libgimpwidgets},
+ { 'dir': 'icons' },
+ { 'dir': 'plug-ins', },
+ { 'dir': 'extensions', },
+ ]
+ run_target('install-' + dir.get('dir'),
+ command: [
+ meson_install_subdir, '-v', dir.get('dir')
+ ],
+ depends: dir.get('deps', [])
+ )
+endforeach
+
+################################################################################
+
+final_message = [
+'''Extra Binaries:''',
+''' gimp-console: @0@'''.format(enable_console_bin),
+'',
+'''Optional Features:''',
+''' Check updates at startup: @0@'''.format(check_update),
+''' Language selection: @0@'''.format(isocodes.found()),
+''' Vector icons: @0@'''.format(have_vector_icons),
+''' Dr. Mingw (Win32): @0@'''.format(drmingw.found()),
+''' Relocatable Bundle: @0@'''.format(relocatable_bundle),
+''' Default ICC directory: @0@'''.format(icc_directory),
+''' 32-bit DLL folder (Win32): @0@'''.format(get_option('win32-32bits-dll-folder')),
+''' Detailed backtraces: @0@'''.format(detailed_backtraces),
+''' Binary symlinks: @0@'''.format(enable_default_bin),
+''' OpenMP: @0@'''.format(have_openmp),
+'',
+'''Optional Plug-Ins:''',
+''' Ascii Art: @0@'''.format(libaa.found()),
+''' Ghostscript: @0@'''.format(ghostscript.found()),
+''' JPEG 2000: @0@'''.format(openjpeg.found()),
+''' JPEG XL: @0@'''.format(libjxl.found()),
+''' MNG: @0@'''.format(libmng.found()),
+''' OpenEXR: @0@'''.format(openexr.found()),
+''' WebP: @0@'''.format(webp_found),
+''' HEIC: import: @0@ - export: @1@ [profile support: @2@]@3@'''
+ .format(can_import_heic, can_export_heic,
+ (can_import_heic or can_export_heic) and
+ libheif.version().version_compare('>=1.4.0'),
+ libheif_warning != '' ? ' (see warning below)' : ''),
+''' AVIF: import: @0@ - export: @1@'''
+ .format(can_import_avif, can_export_avif),
+''' PDF (export): @0@'''.format(cairopdf.found()),
+''' Print: @0@'''.format(have_print),
+''' Python 3 plug-ins: @0@'''.format(have_python),
+''' Javascript plug-ins: @0@'''.format(have_javascript),
+''' Lua plug-ins: @0@'''.format(have_lua),
+''' Vala plug-ins: @0@'''.format(have_vala),
+''' TWAIN (Win32): @0@'''.format(platform_windows),
+''' WMF: @0@'''.format(wmf.found()),
+''' X11 Mouse Cursor: @0@'''.format(xmc.found()),
+''' XPM: @0@'''.format(libxpm.found()),
+''' Quite-OK Image: @0@'''.format(have_qoi),
+''' Amiga IFF/ILBM: @0@'''.format(have_ilbm),
+''' Email: @0@'''.format(email_message),
+''' FITS: @0@'''.format(cfitsio_dep.found()),
+'',
+'''Unmaintained Plug-Ins (discouraged except for developers):''',
+''' Help Browser: @0@'''.format(get_option('webkit-unmaintained')),
+''' Webpage: @0@'''.format(get_option('webkit-unmaintained')),
+'',
+'''Optional Modules:''',
+''' ALSA (MIDI Input): @0@'''.format(alsa.found()),
+''' Linux Input: @0@ (GUdev support: @1@)'''
+ .format(have_linuxinput, gudev.found()),
+''' DirectInput (Win32): @0@'''.format(directx.found()),
+'',
+'''Tests:''',
+''' Use xvfb-run @0@'''.format(xvfb_run.found()),
+''' Test appdata @0@'''.format(appstreamcli.found()),
+'',
+'''Documentation:''',
+''' libgimp API Reference: @0@'''.format(gi_docgen.found() and have_gobject_introspection),
+''' GObject Introspection: @0@'''.format(get_option('g-ir-doc')),
+'',
+'''Bug report URL: @0@'''.format(bug_report_url),
+]
+
+message('\n'.join(final_message))
+
+if warnings.length() > 0
+ warning('Warnings occurred during configuration')
+ foreach warning : warnings
+ warning(warning)
+ endforeach
+endif