[gnome-characters] build: Port to meson build system



commit 36a2e4f8a7c42447f40a797005ddeae0255151d0
Author: Iñigo Martínez <inigomartinez gmail com>
Date:   Wed Jan 24 19:24:02 2018 +0100

    build: Port to meson build system
    
    Meson is a build system focused on speed an ease of use, which
    helps speeding up the software development. This patch adds meson
    support along autotools.

 data/icons/meson.build                        |  6 ++
 data/meson.build                              | 96 +++++++++++++++++++++++++++
 lib/meson.build                               | 42 ++++++++++++
 meson.build                                   | 86 ++++++++++++++++++++++++
 meson_options.txt                             |  3 +
 meson_post_install.py                         | 41 ++++++++++++
 po/meson.build                                |  1 +
 src/meson.build                               | 54 +++++++++++++++
 src/org.gnome.Characters.BackgroundService.in |  0
 src/org.gnome.Characters.in                   |  0
 tests/meson.build                             | 26 ++++++++
 tests/test.in                                 |  3 +
 12 files changed, 358 insertions(+)
---
diff --git a/data/icons/meson.build b/data/icons/meson.build
new file mode 100644
index 0000000..0191a4c
--- /dev/null
+++ b/data/icons/meson.build
@@ -0,0 +1,6 @@
+install_subdir(
+  'hicolor',
+  exclude_files: 'gnome-characters.svg',
+  exclude_directories: ['scalable', '24x24', '512x512'],
+  install_dir: join_paths(characters_datadir, 'icons')
+)
diff --git a/data/meson.build b/data/meson.build
new file mode 100644
index 0000000..d399182
--- /dev/null
+++ b/data/meson.build
@@ -0,0 +1,96 @@
+subdir('icons')
+
+resource_data = files(
+  'icons/hicolor/scalable/categories/characters-arrow-symbolic.svg',
+  'icons/hicolor/scalable/categories/characters-bullet-symbolic.svg',
+  'icons/hicolor/scalable/categories/characters-currency-symbolic.svg',
+  'icons/hicolor/scalable/categories/characters-emoji-activities.svg',
+  'icons/hicolor/scalable/categories/characters-emoji-animals.svg',
+  'icons/hicolor/scalable/categories/characters-emoji-flags.svg',
+  'icons/hicolor/scalable/categories/characters-emoji-food.svg',
+  'icons/hicolor/scalable/categories/characters-emoji-objects.svg',
+  'icons/hicolor/scalable/categories/characters-emoji-smileys.svg',
+  'icons/hicolor/scalable/categories/characters-emoji-symbols.svg',
+  'icons/hicolor/scalable/categories/characters-emoji-travel.svg',
+  'icons/hicolor/scalable/categories/characters-latin-symbolic.svg',
+  'icons/hicolor/scalable/categories/characters-math-symbolic.svg',
+  'icons/hicolor/scalable/categories/characters-picture-symbolic.svg',
+  'icons/hicolor/scalable/categories/characters-punctuation-symbolic.svg',
+  'application.css',
+  'app-menu.ui',
+  'characterlist.ui',
+  'character.ui',
+  'mainview.ui',
+  'mainwindow.ui',
+  'menu.ui'
+)
+
+resources = [
+  [characters_name, resource_data],
+  [characters_background_name, files('ShellSearchProvider2.xml')]
+]
+
+foreach resource: resources
+  name = resource[0] + '.data'
+
+  gnome.compile_resources(
+    name,
+    name + '.gresource.xml',
+    gresource_bundle: true,
+    dependencies: resource[1],
+    install: true,
+    install_dir: characters_pkgdatadir
+  )
+endforeach
+
+desktop = characters_name + '.desktop'
+
+i18n.merge_file(
+  desktop,
+  type: 'desktop',
+  input: desktop + '.in',
+  output: desktop,
+  po_dir: po_dir,
+  install: true,
+  install_dir: join_paths(characters_datadir, 'applications')
+)
+
+appdata = characters_name + '.appdata.xml'
+
+i18n.merge_file(
+  appdata,
+  input: appdata + '.in',
+  output: appdata,
+  po_dir: po_dir,
+  install: true,
+  install_dir: join_paths(characters_datadir, 'metainfo')
+)
+
+service_conf = configuration_data()
+service_conf.set('PACKAGE_NAME', meson.project_name())
+service_conf.set('pkgdatadir', characters_pkgdatadir)
+
+services = [
+  characters_name,
+  characters_background_name
+]
+
+foreach service: services
+  configure_file(
+    input: service + '.service.in',
+    output: service + '.service',
+    configuration: service_conf,
+    install: true,
+    install_dir: dbus_service_dir
+  )
+endforeach
+
+install_data(
+  characters_name + '.gschema.xml',
+  install_dir: join_paths(characters_datadir, 'glib-2.0', 'schemas')
+)
+
+install_data(
+  characters_name + '.search-provider.ini',
+  install_dir: join_paths(characters_datadir, 'gnome-shell', 'search-providers')
+)
diff --git a/lib/meson.build b/lib/meson.build
new file mode 100644
index 0000000..f0c1506
--- /dev/null
+++ b/lib/meson.build
@@ -0,0 +1,42 @@
+gc_h = 'gc.h'
+
+sources = files('gc.c')
+
+enum_types = 'gc-enumtypes'
+
+gc_enums = gnome.mkenums(
+  enum_types,
+  sources: gc_h,
+  c_template: enum_types + '.c.template',
+  h_template: enum_types + '.h.template',
+  identifier_prefix: characters_ns,
+  symbol_prefix: characters_ns.to_lower()
+)
+
+cflags = [
+  '-DG_LOG_DOMAIN="libgc"',
+  '-DG_DISABLE_DEPRECATED',
+  '-DPREFIX="@0@"'.format(characters_prefix),
+  '-DLIBDIR="@0@"'.format(characters_libdir)
+]
+
+libgc = shared_library(
+  characters_ns.to_lower(),
+  sources: sources + gc_enums,
+  include_directories: top_inc,
+  dependencies: libgc_deps,
+  c_args: cflags,
+  install: true
+)
+
+gnome.generate_gir(
+  libgc,
+  sources: sources + [gc_enums[0], gc_h],
+  nsversion: characters_gir_version,
+  namespace: characters_ns,
+  identifier_prefix: characters_ns,
+  symbol_prefix: characters_ns.to_lower(),
+  header: gc_h,
+  includes: ['Gio-2.0', 'Gtk-3.0'],
+  install: true
+)
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000..3500bbc
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,86 @@
+project(
+  'org.gnome.Characters', 'c',
+  version: '3.26.2',
+  license: 'BSD3',
+  default_options: 'buildtype=debugoptimized',
+  meson_version: '>= 0.42.0'
+)
+
+characters_name = meson.project_name()
+characters_background_name = characters_name + '.BackgroundService'
+
+characters_version = meson.project_version()
+
+characters_prefix = get_option('prefix')
+characters_bindir = join_paths(characters_prefix, get_option('bindir'))
+characters_datadir = join_paths(characters_prefix, get_option('datadir'))
+characters_libdir = join_paths(characters_prefix, get_option('libdir'))
+characters_libexecdir = join_paths(characters_prefix, get_option('libexecdir'))
+
+characters_pkgdatadir = join_paths(characters_datadir, characters_name)
+
+characters_gir_version = '1.0'
+characters_ns = 'Gc'
+
+cc = meson.get_compiler('c')
+
+# *** Check for dbus service dir ***
+dbus_service_dir = get_option('dbus_service_dir')
+if dbus_service_dir == ''
+  dbus_dep = dependency('dbus-1', required: false)
+  assert(dbus_dep.found(), 'dbus-1 required but not found, please provide a valid D-Bus service dir')
+  dbus_service_dir = dbus_dep.get_pkgconfig_variable('session_bus_services_dir')
+endif
+
+libunistring_src = '''
+  #include <uniconv.h>
+  int main() {
+      u8_strconv_from_locale((char*)0);
+  };
+'''
+
+# FIXME: libunistring doesn't have pkgconfig support
+assert(cc.links(libunistring_src, name: 'libunistring support', args: '-lunistring'), 'libunistring is 
required but not found')
+
+# Just check that gjs-1.0 is present and recent enough
+dependency('gjs-1.0', version: '>= 1.43.3')
+
+libgc_deps = [
+  dependency('gio-2.0'),
+  dependency('gtk+-3.0'),
+  dependency('pango'),
+  declare_dependency(link_args: '-lunistring')
+]
+
+if get_option('pangoft2')
+  libgc_deps += dependency('pangoft2')
+endif
+
+gnome = import('gnome')
+i18n = import('i18n')
+
+po_dir = join_paths(meson.source_root(), 'po')
+
+top_inc = include_directories('.')
+
+subdir('po')
+subdir('data')
+# FIXME: local gnulib library is not built
+#subdir('gllib')
+subdir('lib')
+subdir('src')
+
+if get_option('installed_tests')
+  subdir('tests')
+endif
+
+configure_file(
+  output: 'config.h',
+  configuration: configuration_data()
+)
+
+meson.add_install_script(
+  'meson_post_install.py',
+  characters_datadir,
+  characters_bindir
+)
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 0000000..62ff6fa
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,3 @@
+option('dbus_service_dir', type: 'string', value: '', description: 'custom directory for dbus service files')
+option('pangoft2', type: 'boolean', value: true, description: 'enable pangoft2 support')
+option('installed_tests', type: 'boolean', value: false, description: 'Enable installation of some test 
cases')
diff --git a/meson_post_install.py b/meson_post_install.py
new file mode 100644
index 0000000..749f574
--- /dev/null
+++ b/meson_post_install.py
@@ -0,0 +1,41 @@
+#!/usr/bin/env python3
+
+import glob
+import os
+import re
+import subprocess
+import sys
+
+datadir = sys.argv[1]
+
+destdir = os.environ.get('DESTDIR', '')
+bindir = os.path.normpath(destdir + os.sep + sys.argv[2])
+
+# FIXME: meson will not track the creation of these files
+#        https://github.com/mesonbuild/meson/blob/master/mesonbuild/scripts/uninstall.py#L39
+if not os.path.exists(bindir):
+  os.makedirs(bindir)
+
+src = os.path.join(datadir, 'org.gnome.Characters', 'org.gnome.Characters')
+dest = os.path.join(bindir, 'gnome-characters')
+subprocess.call(['ln', '-s', '-f', src, dest])
+
+if not os.environ.get('DESTDIR'):
+  icondir = os.path.join(datadir, 'icons', 'hicolor')
+
+  print('Update icon cache...')
+  subprocess.call(['gtk-update-icon-cache', '-f', '-t', icondir])
+
+  schemadir = os.path.join(datadir, 'glib-2.0', 'schemas')
+  print('Compiling gsettings schemas...')
+  subprocess.call(['glib-compile-schemas', schemadir])
+
+  # FIXME
+  '''
+  search_pattern = '/*.desktop'
+
+  desktopdir = os.path.join(datadir, 'applications')
+  print('Validate desktop files...')
+  [subprocess.call(['desktop-file-validate', file])
+   for file in glob.glob(desktopdir + search_pattern, recursive=False)]
+  '''
diff --git a/po/meson.build b/po/meson.build
new file mode 100644
index 0000000..cb7909d
--- /dev/null
+++ b/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext(characters_name, preset: 'glib')
diff --git a/src/meson.build b/src/meson.build
new file mode 100644
index 0000000..b908556
--- /dev/null
+++ b/src/meson.build
@@ -0,0 +1,54 @@
+script_conf = configuration_data()
+script_conf.set('GJS', find_program('gjs').path())
+script_conf.set('PACKAGE_VERSION', characters_version)
+script_conf.set('libdir', characters_libdir)
+script_conf.set('prefix', characters_prefix)
+
+scripts = [
+  characters_name,
+  characters_background_name
+]
+
+foreach script: scripts
+  configure_file(
+    input: script + '.in',
+    output: script,
+    configuration: script_conf,
+    install: true,
+    install_dir: characters_pkgdatadir
+  )
+endforeach
+
+common_resource_data = files(
+  'params.js',
+  'util.js'
+)
+
+resource_data = common_resource_data + files(
+  'categoryList.js',
+  'character.js',
+  'characterList.js',
+  'main.js',
+  'menu.js',
+  'window.js'
+)
+resources = [[characters_name, resource_data]]
+
+resource_data = common_resource_data + files(
+  'searchProvider.js',
+  'service.js'
+)
+resources += [[characters_background_name, resource_data]]
+
+foreach resource: resources
+  name = resource[0] + '.src'
+
+  gnome.compile_resources(
+    name,
+    name + '.gresource.xml',
+    gresource_bundle: true,
+    dependencies: resource[1],
+    install: true,
+    install_dir: characters_pkgdatadir
+  )
+endforeach
diff --git a/src/org.gnome.Characters.BackgroundService.in b/src/org.gnome.Characters.BackgroundService.in
old mode 100644
new mode 100755
diff --git a/src/org.gnome.Characters.in b/src/org.gnome.Characters.in
old mode 100644
new mode 100755
diff --git a/tests/meson.build b/tests/meson.build
new file mode 100644
index 0000000..98a06ec
--- /dev/null
+++ b/tests/meson.build
@@ -0,0 +1,26 @@
+installed_tests_execdir = join_paths(characters_libexecdir, 'installed-tests', characters_name)
+installed_tests_metadir = join_paths(characters_datadir, 'installed-tests', characters_name)
+
+tests = ['smoke_test.py']
+
+tests_data = files('testutil.py')
+
+install_data(
+  tests + tests_data,
+  install_dir: installed_tests_execdir
+)
+
+template = 'test.in'
+
+foreach test: tests
+  tests_conf = configuration_data()
+  tests_conf.set('testdir', installed_tests_execdir)
+
+  configure_file(
+    input: template,
+    output: test + '.test',
+    configuration: tests_conf,
+    install: true,
+    install_dir: installed_tests_metadir
+  )
+endforeach
diff --git a/tests/test.in b/tests/test.in
new file mode 100644
index 0000000..22677f6
--- /dev/null
+++ b/tests/test.in
@@ -0,0 +1,3 @@
+[Test]
+Type=session-exclusive
+Exec=@testdir@/smoke_test.py


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