From c9e7f76415e81dd1bc23632a670dad5cfa1890a6 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Mon, 22 May 2017 11:13:07 +0100 Subject: Add Meson build Meson is a meta-build system that has various advantages over Autotools: - it is fast - it is portable - it is easy to understand - it is well maintained Various projects in the GNOME stack already moved to Meson, including GTK+. --- clutter-gtk/meson.build | 66 +++++++++++++++ doc/meson.build | 40 +++++++++ doc/xml/gtkdocentities.ent.in | 7 ++ doc/xml/meson.build | 9 ++ examples/meson.build | 16 ++++ meson.build | 189 ++++++++++++++++++++++++++++++++++++++++++ meson_options.txt | 4 + po/meson.build | 3 + 8 files changed, 334 insertions(+) create mode 100644 clutter-gtk/meson.build create mode 100644 doc/meson.build create mode 100644 doc/xml/gtkdocentities.ent.in create mode 100644 doc/xml/meson.build create mode 100644 examples/meson.build create mode 100644 meson.build create mode 100644 meson_options.txt create mode 100644 po/meson.build diff --git a/clutter-gtk/meson.build b/clutter-gtk/meson.build new file mode 100644 index 0000000..73fca24 --- /dev/null +++ b/clutter-gtk/meson.build @@ -0,0 +1,66 @@ +clutter_gtk_sources = [ + 'gtk-clutter-actor.c', + 'gtk-clutter-embed.c', + 'gtk-clutter-offscreen.c', + 'gtk-clutter-texture.c', + 'gtk-clutter-util.c', + 'gtk-clutter-window.c', +] + +clutter_gtk_headers = [ + 'clutter-gtk.h', + + 'gtk-clutter-actor.h', + 'gtk-clutter-embed.h', + 'gtk-clutter-texture.h', + 'gtk-clutter-util.h', + 'gtk-clutter-window.h', +] + +install_headers(clutter_gtk_headers, subdir: gtk_clutter_api_path) + +gtk_clutter_version_conf = configuration_data() +gtk_clutter_version_conf.set('CLUTTER_GTK_MAJOR_VERSION', gtk_clutter_major_version) +gtk_clutter_version_conf.set('CLUTTER_GTK_MINOR_VERSION', gtk_clutter_minor_version) +gtk_clutter_version_conf.set('CLUTTER_GTK_MICRO_VERSION', gtk_clutter_micro_version) +gtk_clutter_version_conf.set('CLUTTER_GTK_VERSION', meson.project_version()) +configure_file(input: 'gtk-clutter-version.h.in', + output: 'gtk-clutter-version.h', + configuration: gtk_clutter_version_conf, + install: true, + install_dir: join_paths(gtk_clutter_includedir, gtk_clutter_api_path)) + +clutter_gtk = shared_library(gtk_clutter_api_name, clutter_gtk_sources, + soversion: soversion, + version: libversion, + dependencies: [ mathlib_dep, clutter_dep, gtk_dep ], + include_directories: root_inc, + c_args: common_cflags + gtk_clutter_debug_cflags + [ + '-DPREFIX="@0@"'.format(gtk_clutter_prefix), + '-DLIBDIR="@0@"'.format(gtk_clutter_libdir), + '-DG_LOG_DOMAIN="Clutter-Gtk"', + '-DG_LOG_USE_STRUCTURED=1', + '-DCLUTTER_GTK_COMPILATION', + ], + link_args: common_ldflags, + install: true) + +clutter_gtk_dep = declare_dependency(link_with: clutter_gtk, + dependencies: [ mathlib_dep, clutter_dep, gtk_dep ], + include_directories: include_directories('.')) + +if not meson.is_cross_build() + gnome.generate_gir(clutter_gtk, + sources: clutter_gtk_headers + clutter_gtk_sources, + namespace: 'GtkClutter', + nsversion: gtk_clutter_api_version, + identifier_prefix: 'GtkClutter', + symbol_prefix: 'gtk_clutter', + export_packages: gtk_clutter_api_name, + includes: [ 'Clutter-1.0', 'Gtk-3.0' ], + install: true, + extra_args: [ + '--c-include="clutter-gtk/clutter-gtk.h"', + '-DCLUTTER_GTK_COMPILATION', + ]) +endif diff --git a/doc/meson.build b/doc/meson.build new file mode 100644 index 0000000..026a4ee --- /dev/null +++ b/doc/meson.build @@ -0,0 +1,40 @@ +subdir('xml') + +private_headers = [ + 'gtk-clutter-actor-internal.h', + 'gtk-clutter-offscreen.h', +] + +glib_prefix = dependency('glib-2.0').get_pkgconfig_variable('prefix') +glib_docpath = join_paths(glib_prefix, 'share', 'gtk-doc', 'html') +gtk_prefix = dependency('gtk+-3.0').get_pkgconfig_variable('prefix') +gtk_docpath = join_paths(gtk_prefix, 'share', 'gtk-doc', 'html') +clutter_prefix = dependency('clutter-1.0').get_pkgconfig_variable('prefix') +clutter_docpath = join_paths(clutter_prefix, 'share', 'gtk-doc', 'html') + +docpath = join_paths(gtk_clutter_datadir, 'gtk-doc', 'html') + +gnome.gtkdoc(gtk_clutter_api_name, + main_xml: '@0@-docs.xml'.format(gtk_clutter_api_name), + src_dir: [ + join_paths(meson.source_root(), 'clutter-gtk'), + join_paths(meson.build_root(), 'clutter-gtk'), + ], + dependencies: clutter_gtk_dep, + gobject_typesfile: gtk_clutter_api_name + '.types', + scan_args: [ + '--rebuild-types', + '--ignore-decorators=CLUTTER_GTK_EXTERN', + '--ignore-headers=' + ' '.join(private_headers), + ], + fixxref_args: [ + '--html-dir=@0@'.format(docpath), + '--extra-dir=@0@'.format(join_paths(glib_docpath, 'glib')), + '--extra-dir=@0@'.format(join_paths(glib_docpath, 'gobject')), + '--extra-dir=@0@'.format(join_paths(glib_docpath, 'gio')), + '--extra-dir=@0@'.format(join_paths(gtk_docpath, 'gtk3')), + '--extra-dir=@0@'.format(join_paths(gtk_docpath, 'gdk3')), + '--extra-dir=@0@'.format(join_paths(clutter_docpath, 'clutter-1.0')), + ], + install: true) + diff --git a/doc/xml/gtkdocentities.ent.in b/doc/xml/gtkdocentities.ent.in new file mode 100644 index 0000000..fd86c16 --- /dev/null +++ b/doc/xml/gtkdocentities.ent.in @@ -0,0 +1,7 @@ + + + + + + + diff --git a/doc/xml/meson.build b/doc/xml/meson.build new file mode 100644 index 0000000..5e1c7da --- /dev/null +++ b/doc/xml/meson.build @@ -0,0 +1,9 @@ +ent_conf = configuration_data() +ent_conf.set('PACKAGE', 'Clutter-GTK') +ent_conf.set('PACKAGE_BUGREPORT', 'https://bugzilla.gnome.org/enter_bug.cgi?product=clutter-gtk') +ent_conf.set('PACKAGE_NAME', 'Clutter-GTK') +ent_conf.set('PACKAGE_STRING', 'clutter-gtk') +ent_conf.set('PACKAGE_TARNAME', '@0@-@1@'.format(meson.project_name(), meson.project_version())) +ent_conf.set('PACKAGE_URL', '') +ent_conf.set('PACKAGE_VERSION', meson.project_version()) +configure_file(input: 'gtkdocentities.ent.in', output: 'gtkdocentities.ent', configuration: ent_conf) diff --git a/examples/meson.build b/examples/meson.build new file mode 100644 index 0000000..fe1923e --- /dev/null +++ b/examples/meson.build @@ -0,0 +1,16 @@ +examples = [ + 'gtk-clutter-events', + 'gtk-clutter-multistage', + 'gtk-clutter-test', + 'gtk-clutter-test-actor', + 'gtk-clutter-window-test', +] + +foreach e: examples + executable(e, e + '.c', + dependencies: clutter_gtk_dep, + include_directories: root_inc, + c_args: common_cflags + [ + '-DEXAMPLES_DATADIR="@0@"'.format(meson.current_source_dir()), + ]) +endforeach diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..4ca7996 --- /dev/null +++ b/meson.build @@ -0,0 +1,189 @@ +project('clutter-gtk', 'c', version: '1.8.3', + license: 'LGPLv2.1+', + default_options: [ + 'buildtype=debugoptimized', + 'c_std=c99', + 'warning_level=1', + ], + meson_version: '>= 0.40.1') + +add_project_arguments([ '-D_XOPEN_SOURCE=500' ], language: 'c') + +cc = meson.get_compiler('c') +host_system = host_machine.system() + +version = meson.project_version().split('.') +gtk_clutter_major_version = version[0].to_int() +gtk_clutter_minor_version = version[1].to_int() +gtk_clutter_micro_version = version[2].to_int() + +gtk_clutter_api_version = '@0@.0'.format(gtk_clutter_major_version) + +if gtk_clutter_minor_version.is_odd() + gtk_clutter_interface_age = 0 +else + gtk_clutter_interface_age = gtk_clutter_micro_version +endif + +gtk_clutter_api_name = '@0@-@1@'.format(meson.project_name(), gtk_clutter_api_version) +gtk_clutter_api_path = join_paths(meson.project_name(), gtk_clutter_api_name) + +gtk_clutter_prefix = get_option('prefix') +gtk_clutter_libdir = join_paths(gtk_clutter_prefix, get_option('libdir')) +gtk_clutter_includedir = join_paths(gtk_clutter_prefix, get_option('includedir')) +gtk_clutter_datadir = join_paths(gtk_clutter_prefix, get_option('datadir')) + +# maintaining compatibility with the previous libtool versioning +# current = minor * 100 + micro - interface +# revision = interface +soversion = 0 +current = 100 * gtk_clutter_minor_version + gtk_clutter_micro_version - gtk_clutter_interface_age +revision = gtk_clutter_interface_age +libversion = '@0@.@1@.@2@'.format(soversion, current, revision) + +config_h = configuration_data() +config_h.set_quoted('GETTEXT_PACKAGE', 'cluttergtk-@0@'.format(gtk_clutter_api_version)) + +# Compiler flags +common_cflags = [] +common_ldflags = [] + +if cc.get_id() == 'msvc' + # Make MSVC more pedantic, this is a recommended pragma list + # from _Win32_Programming_ by Rector and Newcomer. Taken from + # glib's msvc_recommended_pragmas.h--please see that file for + # the meaning of the warning codes used here + test_cflags = [ + '-we4002', + '-we4003', + '-w14010', + '-we4013', + '-w14016', + '-we4020', + '-we4021', + '-we4027', + '-we4029', + '-we4033', + '-we4035', + '-we4045', + '-we4047', + '-we4049', + '-we4053', + '-we4071', + '-we4150', + '-we4819' + ] +elif cc.get_id() == 'gcc' or cc.get_id() == 'clang' + test_cflags = [ + '-ffast-math', + '-fstrict-aliasing', + '-Wpointer-arith', + '-Wmissing-declarations', + '-Wformat=2', + '-Wstrict-prototypes', + '-Wmissing-prototypes', + '-Wnested-externs', + '-Wold-style-definition', + '-Wunused', + '-Wuninitialized', + '-Wshadow', + '-Wmissing-noreturn', + '-Wmissing-format-attribute', + '-Wredundant-decls', + '-Wlogical-op', + '-Wcast-align', + '-Wno-unused-local-typedefs', + '-Werror=implicit', + '-Werror=init-self', + '-Werror=main', + '-Werror=missing-braces', + '-Werror=return-type', + '-Werror=array-bounds', + '-Werror=write-strings', + ] +else + test_cflags = [] +endif + +# Symbol visibility +if get_option('default_library') != 'static' + if host_system == 'windows' + config_h.set('DLL_EXPORT', true) + config_h.set('CLUTTER_GTK_EXTERN', '__declspec(dllexport) extern') + if cc.get_id() != 'msvc' + test_cflags += ['-fvisibility=hidden'] + endif + else + config_h.set('CLUTTER_GTK_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 + +if host_system == 'linux' + foreach ldflag: [ '-Wl,-Bsymbolic-functions', '-Wl,-z,relro', '-Wl,-z,now' ] + if cc.has_argument(ldflag) + common_ldflags += ldflag + endif + endforeach +endif + +if host_system == 'darwin' + common_ldflags += [ '-compatibility_version=1', '-current_version=1.0', ] +endif + +gtk_clutter_debug_cflags = [] +if get_option('buildtype').startswith('debug') + gtk_clutter_debug_cflags += '-DCLUTTER_GTK_ENABLE_DEBUG' +elif get_option('buildtype') == 'release' + gtk_clutter_debug_cflags += '-DG_DISABLE_CAST_CHECKS' +endif + +if gtk_clutter_minor_version.is_even() + gtk_clutter_debug_cflags += [ + '-DGLIB_DISABLE_DEPRECATION_WARNINGS', + '-DCLUTTER_DISABLE_DEPRECATION_WARNINGS', + '-DGDK_DISABLE_DEPRECATION_WARNINGS', + ] +endif + +# Dependencies +clutter_req_version = '>= 1.23.7' +gtk_req_version = '>= 3.21.0' + +mathlib_dep = cc.find_library('m', required: false) +clutter_dep = dependency('clutter-1.0', version: clutter_req_version) +gtk_dep = dependency('gtk+-3.0', version: gtk_req_version) + +configure_file(output: 'config.h', configuration: config_h) + +pkgconf = configuration_data() +pkgconf.set('prefix', gtk_clutter_prefix) +pkgconf.set('exec_prefix', gtk_clutter_prefix) +pkgconf.set('libdir', gtk_clutter_libdir) +pkgconf.set('includedir', gtk_clutter_includedir) +pkgconf.set('CLUTTER_GTK_API_VERSION', gtk_clutter_api_version) +pkgconf.set('VERSION', meson.project_version()) +configure_file(input: 'clutter-gtk.pc.in', + output: 'clutter-gtk-@0@.pc'.format(gtk_clutter_api_version), + configuration: pkgconf, + install: true, + install_dir: join_paths(gtk_clutter_libdir, 'pkgconfig')) + +root_inc = include_directories('.') + +gnome = import('gnome') + +subdir('clutter-gtk') +subdir('po') + +subdir('examples') + +if get_option('enable_docs') + subdir('doc') +endif diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000..aaf59f1 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,4 @@ +option('enable_docs', + type: 'boolean', + value: false, + description: 'Enable generating the API reference (depends on GTK-Doc)') diff --git a/po/meson.build b/po/meson.build new file mode 100644 index 0000000..56eb9fd --- /dev/null +++ b/po/meson.build @@ -0,0 +1,3 @@ +i18n = import('i18n') + +i18n.gettext('cluttergtk-1.0', preset: 'glib') -- cgit v1.2.1