Commit c9e7f764 authored by Emmanuele Bassi's avatar Emmanuele Bassi

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+.
parent 40ea12a3
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
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)
<!ENTITY package "@PACKAGE@">
<!ENTITY package_bugreport "@PACKAGE_BUGREPORT@">
<!ENTITY package_name "@PACKAGE_NAME@">
<!ENTITY package_string "@PACKAGE_STRING@">
<!ENTITY package_tarname "@PACKAGE_TARNAME@">
<!ENTITY package_url "@PACKAGE_URL@">
<!ENTITY package_version "@PACKAGE_VERSION@">
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)
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
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
option('enable_docs',
type: 'boolean',
value: false,
description: 'Enable generating the API reference (depends on GTK-Doc)')
i18n = import('i18n')
i18n.gettext('cluttergtk-1.0', preset: 'glib')
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment