From f2ef8d517d74df73e63cec68843e373ffbf3b821 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Wed, 24 May 2017 23:47:12 +0100 Subject: WIP: Add Meson build system --- gdk-pixbuf/meson.build | 177 +++++++++++++++++++++++++ gdk-pixbuf/pixops/meson.build | 7 + meson.build | 296 ++++++++++++++++++++++++++++++++++++++++++ meson_options.txt | 20 +++ tests/meson.build | 40 ++++++ 5 files changed, 540 insertions(+) create mode 100644 gdk-pixbuf/meson.build create mode 100644 gdk-pixbuf/pixops/meson.build create mode 100644 meson.build create mode 100644 meson_options.txt create mode 100644 tests/meson.build diff --git a/gdk-pixbuf/meson.build b/gdk-pixbuf/meson.build new file mode 100644 index 000000000..bb4696511 --- /dev/null +++ b/gdk-pixbuf/meson.build @@ -0,0 +1,177 @@ +subdir('pixops') + +# Loader libs +# - name +# - sources +# - conditional, otherwise always built +loaders = [ + [ 'png', [ 'io-png.c' ], enabled_loaders.contains('png') ], + [ 'bmp', [ 'io-bmp.c' ] ], + [ 'gif', [ 'io-gif.c', 'io-gif-animation.c' ] ], + [ 'ico', [ 'io-ico.c' ] ], + [ 'ani', [ 'io-ani.c', 'io-ani-animation.c' ] ], + [ 'jpeg', [ 'io-jpeg.c' ], enabled_loaders.contains('jpeg') ], + [ 'pnm', [ 'io-pnm.c' ] ], + [ 'tiff', [ 'io-tiff.c' ], enabled_loaders.contains('tiff') ], + [ 'xpm', [ 'io-xpm.c' ] ], + [ 'xbm', [ 'io-xbm.c' ] ], + [ 'tga', [ 'io-tga.c', 'gdk-pixbuf-buffer-queue.c' ] ], + [ 'icns', [ 'io-icns.c' ] ], + [ 'jasper', [ 'io-jasper.c' ], enabled_loaders.contains('jasper') ], + [ 'qtif', [ 'io-qtif.c' ] ] +] + +gdk_pixbuf_cflags = [ + '-DG_LOG_STRUCTURED=1', + '-DG_LOG_DOMAIN="GdkPixbuf"', + '-DGDK_PIXBUF_COMPILATION', + '-DGDK_PIXBUF_PREFIX="@0@"'.format(gdk_pixbuf_prefix), + '-DGDK_PIXBUF_LOCALEDIR="@0@"'.format(gdk_pixbuf_localedir), + '-DGDK_PIXBUF_LIBDIR="@0@"'.format(gdk_pixbuf_libdir), + '-DGDK_PIXBUF_BINARY_VERSION="@0@"'.format(gdk_pixbuf_binary_version), + '-DGDK_PIXBUF_ENABLE_BACKEND', + '-DPIXBUF_LIBDIR="@0@"'.format(gdk_pixbuf_loaderdir), + '-DBUILT_MODULES_DIR="@0@"'.format(meson.current_build_dir()), +] + +gdk_pixbuf_api_path = 'gdk-pixbuf-@0@/gdk-pixbuf'.format(gdk_pixbuf_api_version) + +gdkpixbuf_features_conf = configuration_data() +gdkpixbuf_features_conf.set('GDK_PIXBUF_MAJOR', gdk_pixbuf_version_major) +gdkpixbuf_features_conf.set('GDK_PIXBUF_MINOR', gdk_pixbuf_version_minor) +gdkpixbuf_features_conf.set('GDK_PIXBUF_MICRO', gdk_pixbuf_version_micro) +gdkpixbuf_features_conf.set('GDK_PIXBUF_VERSION', meson.project_version()) +configure_file(input: 'gdk-pixbuf-features.h.in', + output: 'gdk-pixbuf-features.h', + configuration: gdkpixbuf_features_conf, + install: true, + install_dir: join_paths(gdk_pixbuf_includedir, gdk_pixbuf_api_path)) + +gdkpixbuf_headers = [ + 'gdk-pixbuf.h', + 'gdk-pixbuf-autocleanups.h', + 'gdk-pixbuf-core.h', + 'gdk-pixbuf-transform.h', + 'gdk-pixbuf-io.h', + 'gdk-pixbuf-animation.h', + 'gdk-pixbuf-simple-anim.h', + 'gdk-pixbuf-loader.h', +] + +install_headers(gdkpixbuf_headers, subdir: gdk_pixbuf_api_path) + +gdkpixbuf_sources = [ + 'gdk-pixbuf.c', + 'gdk-pixbuf-animation.c', + 'gdk-pixbuf-data.c', + 'gdk-pixbuf-io.c', + 'gdk-pixbuf-loader.c', + 'gdk-pixbuf-scale.c', + 'gdk-pixbuf-simple-anim.c', + 'gdk-pixbuf-scaled-anim.c', + 'gdk-pixbuf-util.c', + 'gdk-pixdata.c', +] + +gdkpixbuf_marshals = gnome.genmarshal('gdk-pixbuf-marshal', + sources: 'gdk-pixbuf-marshal.list', + prefix: '_gdk_pixbuf_marshal') + +gdkpixbuf_enums = gnome.mkenums('gdk-pixbuf-enum-types', + sources: gdkpixbuf_headers, + c_template: 'gdk-pixbuf-enum-types.c.template', + h_template: 'gdk-pixbuf-enum-types.h.template', + install_header: true) +gdkpixbuf_enum_h = gdkpixbuf_enums[1] + +# Check if we need to build loaders as built-in functionality +included_loaders_cflags = [] +included_loaders_deps = [] + +foreach l: loaders + name = l[0] + sources = l[1] + cond = l.get(2, true) + + if cond and builtin_loaders.contains(name) + included_loaders_cflags += '-DINCLUDED_@0@'.format(name) + + mod = static_library('staticpixbufloader-@0@'.format(name), + sources, + dependencies: loaders_deps + gdk_pixbuf_deps, + include_directories: [ root_inc, include_directories('.') ], + c_args: common_cflags + gdk_pixbuf_cflags) + + included_loaders_deps += declare_dependency(link_with: mod) + endif +endforeach + +# The main gdk-pixbuf shared library +gdkpixbuf = shared_library('gdk-pixbuf-2.0', + gdkpixbuf_sources + gdkpixbuf_enums + gdkpixbuf_marshals, + soversion: soversion, + version: libversion, + c_args: common_cflags + gdk_pixbuf_cflags + included_loaders_cflags, + link_args: common_ldflags, + include_directories: root_inc, + dependencies: gdk_pixbuf_deps + included_loaders_deps + [ pixops_dep ], + install: true) + +gdkpixbuf_dep = declare_dependency(link_with: gdkpixbuf, + include_directories: root_inc, + dependencies: gdk_pixbuf_deps, + sources: gdkpixbuf_enum_h) + +# Now check if we are building loaders as installed shared modules +# We do this here because shared modules depend on libgdk-pixbuf +dynamic_loaders = [] + +foreach l: loaders + name = l[0] + sources = l[1] + cond = l.get(2, true) + + if cond and not builtin_loaders.contains(name) + mod = shared_module('pixbufloader-@0@'.format(name), + sources, + dependencies: loaders_deps + gdk_pixbuf_deps + [ gdkpixbuf_dep ], + include_directories: [ root_inc, include_directories('.') ], + c_args: common_cflags + gdk_pixbuf_cflags, + install: true, + install_dir: gdk_pixbuf_loaderdir) + + # We need the path to build loaders.cache for tests + dynamic_loaders += mod.full_path() + endif +endforeach + +gdkpixbuf_bin = [ + [ 'gdk-pixbuf-csource' ], + [ 'gdk-pixbuf-pixdata' ], + [ 'gdk-pixbuf-query-loaders', [ 'queryloaders.c' ] ], +] + +foreach bin: gdkpixbuf_bin + bin_name = bin[0] + bin_source = bin.get(1, bin_name + '.c') + + bin = executable(bin_name, bin_source, + dependencies: gdk_pixbuf_deps + [ gdkpixbuf_dep ], + include_directories: [ root_inc, include_directories('.') ], + c_args: common_cflags + gdk_pixbuf_cflags, + install: true) + + # Used in tests + set_variable(bin_name.underscorify(), bin) +endforeach + +# The 'loaders.cache' used for testing, so we don't accidentally +# load the installed cache; we always build it by default +loaders_cache = custom_target('loaders.cache', + output: 'loaders.cache', + capture: true, + command: [ + gdk_pixbuf_query_loaders, + dynamic_loaders, + ], + build_by_default: true) diff --git a/gdk-pixbuf/pixops/meson.build b/gdk-pixbuf/pixops/meson.build new file mode 100644 index 000000000..62acbe691 --- /dev/null +++ b/gdk-pixbuf/pixops/meson.build @@ -0,0 +1,7 @@ +pixops = static_library('pixops', 'pixops.c', + include_directories: root_inc, + dependencies: gdk_pixbuf_deps) + +pixops_dep = declare_dependency(link_with: pixops, + include_directories: [ root_inc, include_directories('.') ], + dependencies: gdk_pixbuf_deps) diff --git a/meson.build b/meson.build new file mode 100644 index 000000000..75463eb81 --- /dev/null +++ b/meson.build @@ -0,0 +1,296 @@ +project('gdk-pixbuf', 'c', + version: '2.36.6', + license: 'LGPLv2.1+', + default_options: [ + 'buildtype=debugoptimized', + 'warning_level=1', + 'c_std=c99', + ], + meson_version: '>= 0.40.1') + +add_project_arguments([ '-D_POSIX_C_SOURCE', '-D_DEFAULT_SOURCE' ], language: 'c') + +cc = meson.get_compiler('c') +host_system = host_machine.system() + +# Versioning +gdk_pixbuf_version = meson.project_version() +version_arr = gdk_pixbuf_version.split('.') +gdk_pixbuf_version_major = version_arr[0].to_int() +gdk_pixbuf_version_minor = version_arr[1].to_int() +gdk_pixbuf_version_micro = version_arr[2].to_int() + +gdk_pixbuf_api_version = '2.0' +gdk_pixbuf_binary_version = '2.10.0' + +if gdk_pixbuf_version_minor.is_odd() + gdk_pixbuf_interface_age = 0 +else + gdk_pixbuf_interface_age = gdk_pixbuf_version_micro +endif + +gdk_pixbuf_binary_age = 100 * gdk_pixbuf_version_minor + gdk_pixbuf_version_micro + +# maintaining compatibility with the previous libtool versioning +# current = binary - interface +# revision = interface +soversion = 0 +current = gdk_pixbuf_binary_age - gdk_pixbuf_interface_age +revision = gdk_pixbuf_interface_age +libversion = '@0@.@1@.@2@'.format(soversion, current, revision) + +# Paths +gdk_pixbuf_prefix = get_option('prefix') +gdk_pixbuf_libdir = join_paths(gdk_pixbuf_prefix, get_option('libdir')) +gdk_pixbuf_includedir = join_paths(gdk_pixbuf_prefix, get_option('includedir')) +gdk_pixbuf_datadir = join_paths(gdk_pixbuf_prefix, get_option('datadir')) +gdk_pixbuf_mandir = join_paths(gdk_pixbuf_prefix, get_option('mandir')) +gdk_pixbuf_localedir = join_paths(gdk_pixbuf_prefix, get_option('localedir')) +gdk_pixbuf_libexecdir = join_paths(gdk_pixbuf_prefix, get_option('libexecdir')) +gdk_pixbuf_loaderdir = join_paths(gdk_pixbuf_libdir, 'gdk-pixbuf-@0@/@1@/loaders'.format(gdk_pixbuf_api_version, gdk_pixbuf_binary_version)) + +# Dependencies +glib_req_version = '>= 2.38.0' +gio_dep = dependency('gio-2.0', version: glib_req_version) + +# Configurations +gdk_pixbuf_conf = configuration_data() + +check_headers = [ + 'unistd.h' +] + +foreach h: check_headers + if cc.has_header(h) + gdk_pixbuf_conf.set('HAVE_' + h.underscorify().to_upper(), 1) + endif +endforeach + +# We use links() because sigsetjmp() is often a macro hidden behind other macros +gdk_pixbuf_conf.set('HAVE_SIGSETJMP', + cc.links('''#define _POSIX_SOURCE + #include + int main (void) { + sigjmp_buf env; + sigsetjmp (env, 0); + return 0; + }''', name: 'sigsetjmp')) + +# XXX: Remove once we declare gdk-pixbuf C99-only +if cc.get_id() != 'msvc' + gdk_pixbuf_conf.set('HAVE_ROUND', 1) + gdk_pixbuf_conf.set('HAVE_LRINT', 1) +endif + +# Common compiler and linker flags +common_cflags = [] +common_ldflags = [] + +if cc.get_id() == 'msvc' + # Compiler options taken from msvc_recommended_pragmas.h + # in GLib, based on _Win32_Programming_ by Rector and Newcomer + test_cflags = [ + '-we4002', # too many actual parameters for macro + '-we4003', # not enough actual parameters for macro + '-w14010', # single-line comment contains line-continuation character + '-we4013', # 'function' undefined; assuming extern returning int + '-w14016', # no function return type; using int as default + '-we4020', # too many actual parameters + '-we4021', # too few actual parameters + '-we4027', # function declared without formal parameter list + '-we4029', # declared formal parameter list different from definition + '-we4033', # 'function' must return a value + '-we4035', # 'function' : no return value + '-we4045', # array bounds overflow + '-we4047', # different levels of indirection + '-we4049', # terminating line number emission + '-we4053', # an expression of type void was used as an operand + '-we4071', # no function prototype given + '-we4819', # the file contains a character that cannot be represented in the current code page + ] +elif cc.get_id() == 'gcc' or cc.get_id() == 'clang' + test_cflags = [ + '-Wpointer-arith', + '-Wformat=2', + '-Wstrict-prototypes', + '-Wnested-externs', + '-Wold-style-definition', + '-Wdeclaration-after-statement', + '-Wunused', + '-Wcast-align', + '-Wmissing-noreturn', + '-Wmissing-format-attribute', + '-Wlogical-op', + '-fno-strict-aliasing', + '-Wno-int-conversion', + '-Wno-uninitialized', + '-Wno-discarded-qualifiers', + '-Werror=implicit', + '-Werror=nonnull', + '-Werror=init-self', + '-Werror=main', + '-Werror=missing-braces', + '-Werror=sequence-point', + '-Werror=return-type', + '-Werror=trigraphs', + '-Werror=array-bounds', + '-Werror=write-strings', + '-Werror=address', + '-Werror=int-to-pointer-cast', + '-Werror=pointer-to-int-cast', + '-Werror=empty-body', + ] + + # Ensure we have the correct bit packing on Windows + if host_system == 'windows' + test_cflags += '-mms-bitfields' + endif +else + test_cflags = [] +endif + +# Symbol visibility +if get_option('default_library') != 'static' + if host_system == 'windows' + gdk_pixbuf_conf.set('DLL_EXPORT', true) + gdk_pixbuf_conf.set('_GDK_PIXBUF_EXTERN', '__declspec(dllexport) extern') + if cc.get_id() != 'msvc' + test_cflags += ['-fvisibility=hidden'] + endif + else + gdk_pixbuf_conf.set('_GDK_PIXBUF_EXTERN', '__attribute__((visibility("default"))) extern') + test_cflags += ['-fvisibility=hidden'] + endif +endif + +foreach cflag: test_cflags + if cc.has_argument(cflag) + common_cflags += [ cflag ] + endif +endforeach + +# Linker flags +if host_machine.system() == 'linux' + foreach ldflag: [ '-Wl,-Bsymbolic', '-Wl,-z,relro', '-Wl,-z,now', ] + if cc.has_argument(ldflag) + common_ldflags += [ ldflag ] + endif + endforeach +endif + +# Maintain compatibility with autotools on macOS +if host_machine.system() == 'darwin' + common_ldflags += [ '-compatibility_version=1', '-current_version=1.0', ] +endif + +# Dependencies +mathlib_dep = cc.find_library('m', required: false) +gobject_dep = dependency('gobject-2.0', version: glib_req_version) +gmodule_dep = dependency('gmodule-no-export-2.0') +gio_dep = dependency('gio-2.0') + +gdk_pixbuf_deps = [ mathlib_dep, gobject_dep, gmodule_dep, gio_dep ] + +# Check if we can build shared modules +build_modules = gmodule_dep.get_pkgconfig_variable('gmodule_supported') == true +gdk_pixbuf_conf.set10('USE_GMODULE', build_modules) + +# Check which loaders should be built into gdk-pixbuf +builtin_loaders = get_option('builtin_loaders').split(',') + +# Loader dependencies +enabled_loaders = [] +loaders_deps = [] + +if get_option('enable_png') + # We have a vast selection of libpng versions to choose from + foreach png: [ 'libpng16', 'libpng15', 'libpng14', 'libpng12', 'libpng13', 'libpng10' ] + if not enabled_loaders.contains('png') + png_dep = dependency(png, required: false) + if png_dep.found() + enabled_loaders += 'png' + loaders_deps += png_dep + endif + endif + endforeach +endif + +if get_option('enable_tiff') + if cc.has_header('tiffio.h') + tiff_dep = cc.find_library('tiff', required: false) + if tiff_dep.found() and cc.has_function('TIFFReadRGBAImageOriented', dependencies: tiff_dep) + enabled_loaders += 'tiff' + loaders_deps += tiff_dep + elif tiff_dep.found() and cc.has_function('TIFFWriteScanline', dependencies: tiff_dep) + enabled_loaders += 'tiff' + loaders_deps += tiff_dep + else + tiff_dep = cc.find_library('tiff34', required: false) + if tiff_dep.found() and cc.has_function('TIFFFlushData', dependencies: tiff_dep) + enabled_loaders += 'tiff' + loaders_deps += tiff_dep + endif + endif + endif +endif + +if get_option('enable_jpeg') + if cc.has_header('jpeglib.h') + jpeg_dep = cc.find_library('jpeg', required: false) + if jpeg_dep.found() and cc.has_function('jpeg_destroy_decompress', dependencies: jpeg_dep) + enabled_loaders += 'jpeg' + loaders_deps += jpeg_dep + + gdk_pixbuf_conf.set('HAVE_PROGRESSIVE_JPEG', cc.has_function('jpeg_simple_progression', dependencies: jpeg_dep)) + endif + endif +endif + +if get_option('enable_jasper') + if cc.has_header('jasper/jasper.h') + jasper_dep = cc.find_library('jasper', required: false) + if jasper_dep.found() and cc.has_function('jas_init', dependencies: jasper_dep) + enabled_loaders += 'jasper' + loaders_deps += jasper_dep + endif + endif +endif + +gdk_pixbuf_conf.set_quoted('GETTEXT_PACKAGE', meson.project_name()) + +configure_file(output: 'config.h', configuration: gdk_pixbuf_conf) + +# Compat variables for pkgconfig +pkgconf = configuration_data() +pkgconf.set('prefix', gdk_pixbuf_prefix) +pkgconf.set('exec_prefix', gdk_pixbuf_prefix) +pkgconf.set('libdir', gdk_pixbuf_libdir) +pkgconf.set('includedir', gdk_pixbuf_includedir) +pkgconf.set('GDK_PIXBUF_API_VERSION', gdk_pixbuf_api_version) +pkgconf.set('GDK_PIXBUF_BINARY_VERSION', gdk_pixbuf_binary_version) +pkgconf.set('GDK_PIXBUF_EXTRA_CFLAGS', '') +pkgconf.set('GDK_PIXBUF_EXTRA_LIBS', '') +pkgconf.set('PNG_DEP_CFLAGS_PACKAGES', '') +pkgconf.set('VERSION', meson.project_version()) + +configure_file(input: 'gdk-pixbuf-2.0.pc.in', + output: 'gdk-pixbuf-2.0.pc', + configuration: pkgconf, + install: true, + install_dir: join_paths(gdk_pixbuf_libdir, 'pkgconfig')) + +root_inc = include_directories('.') + +gnome = import('gnome') + +subdir('gdk-pixbuf') + +# i18n +#subdir('po') + +subdir('tests') + +# Documentation +#if get_option('enable-gtk-doc') +# subdir('doc') +#endif diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 000000000..a8c384285 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,20 @@ +option('enable_png', + description: 'Enable PNG loader (requires libpng)', + type: 'boolean', + value: true) +option('enable_tiff', + description: 'Enable TIFF loader (requires libtiff)', + type: 'boolean', + value: true) +option('enable_jpeg', + description: 'Enable JPEG loader (requires libjpeg)', + type: 'boolean', + value: true) +option('enable_jasper', + description: 'Enable JPEG2000 loader (requires libjasper)', + type: 'boolean', + value: true) +option('builtin_loaders', + description: 'Comma-separated list of loaders to build into gdk-pixbuf', + type: 'string', + value: 'none') diff --git a/tests/meson.build b/tests/meson.build new file mode 100644 index 000000000..0d7681e8f --- /dev/null +++ b/tests/meson.build @@ -0,0 +1,40 @@ +installed_tests = [ + [ 'animation' ], +# [ 'cve-2015-4491' ], # FIXME: Needs resources + [ 'pixbuf-fail' ], + [ 'pixbuf-icon-serialize' ], + [ 'pixbuf-randomly-modified' ], + [ 'pixbuf-threads' ], + [ 'pixbuf-icc' ], + [ 'pixbuf-jpeg' ], + [ 'pixbuf-dpi' ], +# [ 'pixbuf-pixdata' ], # FIXME: Needs resources + [ 'pixbuf-stream' ], + [ 'pixbuf-reftest' ], +# [ 'pixbuf-resource' ], # FIXME: Needs resources + [ 'pixbuf-scale' ], + [ 'pixbuf-scale-two-step' ], + [ 'pixbuf-short-gif-write' ], + [ 'pixbuf-save' ], + [ 'pixbuf-readonly-to-mutable' ], + [ 'pixbuf-composite' ], + [ 'pixbuf-area-updated' ], +] + +foreach t: installed_tests + test_name = t[0] + test_sources = [ test_name + '.c', 'test-common.c' ] + + test_bin = executable(test_name, test_sources, + dependencies: gdk_pixbuf_deps + [ gdkpixbuf_dep ], + include_directories: [ root_inc, include_directories('../gdk-pixbuf') ], + c_args: common_cflags) + + test(test_name, test_bin, + args: [ '-k', '--tap' ], + env: [ + 'G_TEST_SRCDIR=@0@'.format(meson.current_source_dir()), + 'G_TEST_BUILDDIR=@0@'.format(meson.current_build_dir()), + 'GDK_PIXBUF_MODULE_FILE=@0@'.format(join_paths(meson.current_build_dir(), '../gdk-pixbuf/loaders.cache')) + ]) +endforeach -- cgit v1.2.1