[gdk-pixbuf/wip/ebassi/meson: 3/3] WIP: Add Meson build system



commit 1c9f8a75ef37de4c94cd0824daff0246f61814ca
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Wed May 24 23:47:12 2017 +0100

    WIP: Add Meson build system

 gdk-pixbuf/meson.build        |  139 ++++++++++++++++++++
 gdk-pixbuf/pixops/meson.build |    7 +
 meson.build                   |  285 +++++++++++++++++++++++++++++++++++++++++
 meson_options.txt             |   16 +++
 4 files changed, 447 insertions(+), 0 deletions(-)
---
diff --git a/gdk-pixbuf/meson.build b/gdk-pixbuf/meson.build
new file mode 100644
index 0000000..20e5891
--- /dev/null
+++ b/gdk-pixbuf/meson.build
@@ -0,0 +1,139 @@
+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()),
+]
+
+included_loaders = []
+
+foreach l: loaders
+  name = l[0]
+  cond = l.get(2, true)
+
+  if cond
+    included_loaders += '-DINCLUDED_@0@'.format(name)
+  endif
+endforeach
+
+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]
+
+gdkpixbuf = shared_library('gdk-pixbuf-2.0',
+                           gdkpixbuf_sources + gdkpixbuf_enums + gdkpixbuf_marshals,
+                           soversion: soversion,
+                           version: libversion,
+                           c_args: included_loaders + gdk_pixbuf_cflags,
+                           link_args: common_ldflags,
+                           include_directories: root_inc,
+                           dependencies: gdk_pixbuf_deps + [ pixops_dep ],
+                           install: true)
+
+gdkpixbuf_dep = declare_dependency(link_with: gdkpixbuf,
+                                   include_directories: root_inc,
+                                   dependencies: gdk_pixbuf_deps,
+                                   sources: gdkpixbuf_enum_h)
+
+foreach l: loaders
+  name = l[0]
+  sources = l[1]
+  cond = l.get(2, true)
+
+  if cond
+    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)
+  endif
+endforeach
+
+gdkpixbuf_bin = [
+  'gdk-pixbuf-csource',
+  'gdk-pixbuf-pixdata',
+]
+
+foreach bin: gdkpixbuf_bin
+  executable(bin, bin + '.c',
+             dependencies: gdkpixbuf_dep,
+             include_directories: root_inc,
+             install: true)
+endforeach
diff --git a/gdk-pixbuf/pixops/meson.build b/gdk-pixbuf/pixops/meson.build
new file mode 100644
index 0000000..62acbe6
--- /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 0000000..079b740
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,285 @@
+project('gdk-pixbuf', 'c',
+        version: '2.36.5',
+        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' ], 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 <setjmp.h>
+                                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',
+  ]
+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)
+
+# Loader dependencies
+enabled_loaders = []
+loaders_deps = []
+
+if get_option('enable_png')
+  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')
+
+# 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 0000000..132c207
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,16 @@
+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)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]