summaryrefslogtreecommitdiff
path: root/meson.build
diff options
context:
space:
mode:
authorKjell Ahlstedt <kjellahlstedt@gmail.com>2020-03-01 13:30:00 +0100
committerKjell Ahlstedt <kjellahlstedt@gmail.com>2020-03-01 13:30:00 +0100
commitd378578484718d267bf429ef2e6eded695446b46 (patch)
treee0a38dc5fc9848012df87e56a460f74401f0e487 /meson.build
parent1df52bb90b7ca3780043b16acf5bb5eb483876f8 (diff)
downloadglibmm-d378578484718d267bf429ef2e6eded695446b46.tar.gz
Add support for building glibmm with Meson
glibmm can be built with either Autotools or Meson. See MR !27
Diffstat (limited to 'meson.build')
-rw-r--r--meson.build314
1 files changed, 314 insertions, 0 deletions
diff --git a/meson.build b/meson.build
new file mode 100644
index 00000000..33a1741a
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,314 @@
+# This file is part of glibmm.
+
+project('glibmm', 'cpp',
+ version: '2.63.1',
+ license: 'LGPLv2.1+',
+ default_options: [
+ 'cpp_std=c++17'
+ ],
+ meson_version: '>= 0.50.0', # required for python3.path()
+)
+
+glibmm_api_version = '2.64'
+glibmm_pcname = meson.project_name() + '-' + glibmm_api_version
+giomm_pcname = 'giomm-' + glibmm_api_version
+
+glibmm_version_array = meson.project_version().split('.')
+glibmm_major_version = glibmm_version_array[0].to_int()
+glibmm_minor_version = glibmm_version_array[1].to_int()
+glibmm_micro_version = glibmm_version_array[2].to_int()
+
+# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
+# The relation between libtool's current:revison:age interface versioning
+# and the .so filename, .so.x.y.z, is
+# x = current - age
+# y = age
+# z = revision
+# If libtool_soversion is updated as described in libtool's documentation,
+# x.y.z will usually *not* be equal to meson.project_version().
+libtool_soversion = [4, 0, 3]
+glibmm_libversion = '@0@.@1@.@2@'.format(
+ libtool_soversion[0] - libtool_soversion[2],
+ libtool_soversion[2],
+ libtool_soversion[1])
+
+# Use these instead of meson.source_root() and meson.build_root() in subdirectories.
+# source_root() and build_root() are not useful, if this is a subproject.
+project_source_root = meson.current_source_dir()
+project_build_root = meson.current_build_dir()
+
+cpp_compiler = meson.get_compiler('cpp')
+is_msvc = cpp_compiler.get_id() == 'msvc'
+is_host_windows = host_machine.system() == 'windows'
+
+is_os_cocoa = false
+if not is_host_windows
+ # This test for Mac OS is copied from glib. If the result of glib's test
+ # is ever made available outside glib, use glib's result instead of this test.
+ # glib: https://bugzilla.gnome.org/show_bug.cgi?id=780309
+ # glibmm: https://bugzilla.gnome.org/show_bug.cgi?id=781947
+ is_os_cocoa = cpp_compiler.compiles(
+ '''#include <Cocoa/Cocoa.h>
+ #ifdef GNUSTEP_BASE_VERSION
+ #error "Detected GNUstep, not Cocoa"
+ #endif''',
+ name: 'Mac OS X Cocoa support'
+ )
+endif
+
+python3 = import('python').find_installation()
+python_version = python3.language_version()
+python_version_req = '>= 3.5'
+if not python_version.version_compare(python_version_req)
+ error('Requires Python @0@, found @1@.'.format(python_version_req, python_version))
+endif
+
+# Do we build from a git repository?
+# Suppose we do if and only if a '.git' directory or file exists.
+cmd_py = '''
+import os
+import sys
+sys.exit(os.path.isdir("@0@") or os.path.isfile("@0@"))
+'''.format(project_source_root / '.git')
+is_git_build = run_command(python3, '-c', cmd_py).returncode() != 0
+
+# Unfortunately due to m4 requirements, we cannot support MSVC builds
+# directly from GIT checkouts
+assert(not is_msvc or not is_git_build, 'Direct builds from GIT is not supported for MSVC builds')
+
+# Options.
+maintainer_mode_opt = get_option('maintainer-mode')
+maintainer_mode = maintainer_mode_opt == 'true' or \
+ (maintainer_mode_opt == 'if-git-build' and is_git_build)
+warning_level = get_option('warnings')
+build_deprecated_api = get_option('build-deprecated-api')
+build_documentation_opt = get_option('build-documentation')
+build_documentation = build_documentation_opt == 'true' or \
+ (build_documentation_opt == 'if-maintainer-mode' and maintainer_mode)
+build_examples = get_option('build-examples')
+
+# Installation directories are relative to {prefix}.
+install_prefix = get_option('prefix')
+install_includedir = get_option('includedir')
+install_libdir = get_option('libdir')
+install_datadir = get_option('datadir')
+install_pkgconfigdir = install_libdir / 'pkgconfig'
+
+# Dependencies. <pkg> = glib and gio
+# <pkg>mm_build_dep: Dependencies when building the <pkg>mm library.
+# <pkg>mm_dep (created in <pkg>/<pkg>mm/meson.build):
+# Dependencies when using the <pkg>mm library.
+
+sigcxx_req = '>= 3.0.0'
+glib_req = '>= 2.63.0'
+
+# Glib supported pkg-config files on MSVC files for a good while,
+# so just use that.
+glib_dep = dependency('glib-2.0', version: glib_req)
+gobject_dep = dependency('gobject-2.0', version: glib_req)
+gmodule_dep = dependency('gmodule-2.0', version: glib_req)
+
+glibmm_build_dep = [glib_dep, gobject_dep, gmodule_dep]
+glibmm_requires = [
+ 'glib-2.0', glib_req,
+ 'gobject-2.0', glib_req,
+ 'gmodule-2.0', glib_req,
+]
+
+gio_dep = dependency('gio-2.0', version: glib_req)
+giomm_build_dep = glibmm_build_dep + [gio_dep]
+giomm_requires = glibmm_requires + ['gio-2.0', glib_req]
+if not is_host_windows
+ gio_unix_dep = dependency('gio-unix-2.0', version: glib_req)
+ giomm_build_dep += gio_unix_dep
+ giomm_requires += ['gio-unix-2.0', glib_req]
+endif
+
+if is_msvc
+ # We must have Visual Studio 2017 15.7 or later...
+ assert(cpp_compiler.version().split('.')[0].to_int() >= 19 and \
+ cpp_compiler.version().split('.')[1].to_int() >= 15,
+ 'Visual Studio 2017 15.7 or later is required')
+
+ assert(cpp_compiler.has_header('sigc++-3.0/sigc++/sigc++.h') and \
+ cpp_compiler.has_header('sigc++-3.0/include/sigc++config.h'),
+ 'sigc++-3.x headers are required')
+ message('Ensure your INCLUDE and LIB contain the paths that lead to ' + \
+ 'the appropriate headers and .lib for libsigc++-3.x')
+
+ # Visual Studio 2019 can consume libraries built with 2017, so check for
+ # 2017-built libraries as well if 2019-built libraries cannot be found
+ msvc_check_range = [15]
+ msvc_minor = cpp_compiler.version().split('.')[1].to_int()
+ if msvc_minor >= 20
+ msvc_check_range = [16, 15]
+ endif
+
+ debugsuffix = ''
+ if get_option('buildtype') == 'debug'
+ debugsuffix = '-d'
+ endif
+
+ # We can be looking for MSVC 2017-built libraries on 2019 builds as well,
+ # so we can't just assume that libraries exist, but check that compatible
+ # versions are really found
+ sigcxx_dep = dependency('', required: false)
+
+ foreach v : msvc_check_range
+ sigcxx_dep = sigcxx_dep.found() ? sigcxx_dep : cpp_compiler.find_library(
+ 'sigc-vc@0@0@1@-3_0'.format(v.to_string(), debugsuffix), required: false)
+ endforeach
+
+ # Now make sure the appropriate -mm libraries are found
+ assert(sigcxx_dep.found(),
+ 'Appropriate sigc-vcxx0@0@-3_0.lib is required'.format(debugsuffix))
+
+else # not is_msvc
+
+ sigcxx_dep = dependency('sigc++-3.0', version: sigcxx_req)
+ glibmm_requires += ['sigc++-3.0', sigcxx_req]
+ giomm_requires += ['sigc++-3.0', sigcxx_req]
+
+endif # is_msvc
+
+glibmm_build_dep += [sigcxx_dep]
+giomm_build_dep += [sigcxx_dep]
+glibmm_requires = ' '.join(glibmm_requires)
+giomm_requires = ' '.join(giomm_requires)
+
+# Some dependencies are required only in maintainer mode and/or if
+# reference documentation shall be built.
+mm_common_get = find_program('mm-common-get', required: maintainer_mode)
+m4 = find_program('m4', required: maintainer_mode) # Used by gmmproc
+perl = find_program('perl', required: maintainer_mode or build_documentation)
+doxygen = find_program('doxygen', required: build_documentation)
+dot = find_program('dot', required: build_documentation) # Used by Doxygen
+xsltproc = find_program('xsltproc', required: build_documentation)
+
+# Where to find gmmproc and generate_wrap_init.pl.
+gmmproc_dir = project_build_root / 'tools'
+
+# Script files copied to 'untracked' by mm-common-get.
+script_dir = project_source_root / 'untracked' / 'build_scripts'
+generate_binding_py = script_dir / 'generate-binding.py'
+doc_reference_py = script_dir / 'doc-reference.py'
+dist_changelog_py = script_dir / 'dist-changelog.py'
+dist_build_scripts_py = script_dir / 'dist-build-scripts.py'
+
+if maintainer_mode and mm_common_get.found()
+ # Copy files to untracked/build_scripts and untracked/docs.
+ run_command(mm_common_get, '--force', script_dir,
+ project_source_root / 'untracked' / 'docs')
+endif
+
+# glibmm's own script files.
+glibmm_script_dir = project_source_root / 'tools' / 'build_scripts'
+handle_built_files_py = glibmm_script_dir / 'handle-built-files.py'
+dummy_header_py = glibmm_script_dir / 'dummy-header.py'
+compile_schemas_py = glibmm_script_dir / 'compile-schemas.py'
+
+# Set compiler warnings.
+warning_flags = []
+if warning_level == 'min'
+ if is_msvc
+ warning_flags = ['/W3']
+ else
+ warning_flags = ['-Wall']
+ endif
+elif warning_level == 'max' or warning_level == 'fatal'
+ if is_msvc
+ warning_flags = ['/W4']
+ else
+ warning_flags = '-pedantic -Wall -Wextra -Wformat-security -Wsuggest-override -Wshadow -Wno-long-long'.split()
+ endif
+ if warning_level == 'fatal'
+ if is_msvc
+ warning_flags += ['/WX']
+ else
+ warning_flags += ['-Werror']
+ endif
+ deprecations = 'G SIGCXX'.split()
+ foreach d : deprecations
+ warning_flags += '-D@0@_DISABLE_DEPRECATED'.format(d)
+ endforeach
+ endif
+endif
+
+warning_flags = cpp_compiler.get_supported_arguments(warning_flags)
+add_project_arguments(warning_flags, language: 'cpp')
+
+# MSVC: Ignore warnings that aren't really harmful, but make those
+# that should not be overlooked stand out.
+if is_msvc
+ disabled_warnings = cpp_compiler.get_supported_arguments([
+ '/FImsvc_recommended_pragmas.h', '/wd4267', '/wd4530'
+ ])
+ add_project_arguments(disabled_warnings, language: 'cpp')
+endif
+
+subdir('tools')
+subdir('MSVC_NMake/gendef')
+subdir('glib')
+subdir('MSVC_NMake/glibmm')
+subdir('glib/glibmm')
+subdir('gio')
+subdir('MSVC_NMake/giomm')
+subdir('gio/giomm')
+subdir('examples')
+subdir('tests')
+subdir('docs/reference')
+
+if not meson.is_subproject()
+ # Add a ChangeLog file to the distribution directory.
+ # (add_dist_script() is not allowed in a subproject)
+ meson.add_dist_script(
+ python3.path(), dist_changelog_py,
+ project_source_root,
+ )
+ # Add build scripts to the distribution directory, and delete .gitignore
+ # files and an empty $MESON_DIST_ROOT/build/ directory.
+ meson.add_dist_script(
+ python3.path(), dist_build_scripts_py,
+ project_source_root,
+ 'untracked' / 'build_scripts',
+ )
+endif
+
+# Print a summary.
+real_maintainer_mode = ''
+if maintainer_mode_opt == 'if-git-build'
+ real_maintainer_mode = ' (@0@)'.format(maintainer_mode)
+endif
+
+real_build_documentation = ''
+if build_documentation_opt == 'if-maintainer-mode'
+ real_build_documentation = ' (@0@)'.format(build_documentation)
+endif
+
+summary = [
+ '',
+ '------',
+ meson.project_name() + ' ' + meson.project_version(),
+ '',
+ ' Maintainer mode: @0@@1@'.format(maintainer_mode_opt, real_maintainer_mode),
+ ' Compiler warnings: @0@'.format(warning_level),
+ ' Build deprecated API: @0@'.format(build_deprecated_api),
+ 'Build HTML documentation: @0@@1@'.format(build_documentation_opt, real_build_documentation),
+ ' Build example programs: @0@'.format(build_examples),
+ 'Directories:',
+ ' prefix: @0@'.format(install_prefix),
+ ' includedir: @0@'.format(install_prefix / install_includedir),
+ ' includeglibmmdir: @0@'.format(install_prefix / install_includedir / glibmm_pcname),
+ ' includegiommdir: @0@'.format(install_prefix / install_includedir / giomm_pcname),
+ ' libdir: @0@'.format(install_prefix / install_libdir),
+ ' glibmmconfigdir: @0@'.format(install_prefix / install_glibmmconfigdir),
+ ' giommconfigdir: @0@'.format(install_prefix / install_giommconfigdir),
+ ' m4dir: @0@'.format(install_prefix / install_m4dir),
+ ' pkgconfigdir: @0@'.format(install_prefix / install_pkgconfigdir),
+ ' datadir: @0@'.format(install_prefix / install_datadir),
+ ' docdir: @0@'.format(install_prefix / install_docdir),
+ ' devhelpdir: @0@'.format(install_prefix / install_devhelpdir),
+ '------'
+]
+
+message('\n'.join(summary))