diff options
Diffstat (limited to 'meson.build')
-rw-r--r-- | meson.build | 442 |
1 files changed, 442 insertions, 0 deletions
diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..f2c5228 --- /dev/null +++ b/meson.build @@ -0,0 +1,442 @@ +# Copyright © 2019, 2020, 2021 Christian Persch +# +# This programme is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# This programme is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this programme. If not, see <https://www.gnu.org/licenses/>. + +project( + 'gnome-terminal', + ['c', 'cpp',], + default_options: [ + 'buildtype=release', + 'warning_level=' + (meson.version().version_compare('>= 0.50.0') ? '0' : '1'), + 'b_ndebug=false', + ], + license: [ + 'GPL-3.0-or-later', # the programme + 'GPL-3.0-only', 'CC-BY-SA-3.0', # the documentation + 'GFDL-1.3-only', # the appstream data + ], + meson_version: '>= 0.61.0', + version: '3.46.8', +) + +# Naming + +gt_name = 'gnome-terminal' +gt_dns_name = 'org.gnome.Terminal' + +# Compiler requirements + +c_req_std = 'gnu11' +cxx_req_std = 'gnu++14' +gxx_req_version = '4.8.1' +clangxx_req_version = '3.3' + +# Requirements + +vte_req = 'vte-2.91' +vte_req_version = '0.70.0' + +glib_req_version = '2.52.0' +glib_min_req_version = '2.52' +glib_max_allowed_version = '2.52' + +gtk_req_version = '3.22.27' +gtk_min_req_version = '3.18' +gtk_max_allowed_version = '3.24' + +libnautilus_ext_req_version = '43' +pcre2_req_version = '10.00' +schemas_req_version = '0.1.0' + +# Versioning + +gt_version = meson.project_version() + +version_split = meson.project_version().split('.') +gt_major_version = version_split[0].to_int() +gt_minor_version = version_split[1].to_int() +gt_micro_version = version_split[2].to_int() + +# Directories + +gt_bindir = get_option('bindir') +gt_datadir = get_option('datadir') +gt_includedir = get_option('includedir') +gt_libdir = get_option('libdir') +gt_libexecdir = get_option('libexecdir') +gt_localedir = get_option('localedir') +gt_mandir = get_option('mandir') +gt_prefix = get_option('prefix') + +gt_pkgdatadir = gt_datadir / gt_name +gt_pkglibdir = gt_libdir / gt_name + +gt_schemadir = gt_datadir / 'glib-2.0' / 'schemas' + +gt_searchproviderdir = gt_datadir / 'gnome-shell' / 'search-providers' + +gt_nautilusextensiondir = gt_libdir / 'nautilus' / 'extensions-4' + +gt_dbusinterfacedir = gt_datadir / 'dbus-1' / 'interfaces' +gt_dbusservicedir = gt_datadir / 'dbus-1' / 'services' + +# It is correct for this to be in ${prefix}/lib, even on systems where that +# does not match ${libdir}. This is what systemd uses on such platforms. +gt_systemduserdir = 'lib' / 'systemd' / 'user' + +# Debug + +enable_debug = get_option('dbg') or get_option('debug') or get_option('buildtype').contains('debug') + +# Meson modules + +gnome = import('gnome') +i18n = import('i18n') +pkg = import('pkgconfig') + +# i18n + +gt_gettext_domain = gt_name +po_dir = meson.current_source_dir() / 'po' + +# Compilers + +# C compiler + +cc = meson.get_compiler('c') + +c_std_opt = '-std=' + c_req_std +assert(cc.has_argument(c_std_opt), 'option ' + c_std_opt + ' not supported by ' + cc.get_id()) +add_project_arguments(c_std_opt, language: 'c') + +# C++ compiler + +cxx = meson.get_compiler('cpp') + +cxx_std_opt = '-std=' + cxx_req_std +assert(cxx.has_argument(cxx_std_opt), 'option ' + cxx_std_opt + ' not supported by ' + cxx.get_id()) +add_project_arguments(cxx_std_opt, language: 'cpp') + +# The above only checks that the compiler supports the given -std option, +# but not that the compiler really supports that C++ standard version. +# Do a simple version check based on +# https://gcc.gnu.org/projects/cxx-status.html and +# https://clang.llvm.org/cxx_status.html +# for the C++ features that vte actually uses. + +if cxx.get_id() == 'gcc' + assert(cxx.version().version_compare('>=' + gxx_req_version), 'needs g++ >= ' + gxx_req_version + ' for ' + cxx_req_std + ' support') +endif + +if cxx.get_id() == 'clang' + assert(cxx.version().version_compare('>=' + clangxx_req_version), 'needs clang++ >= ' + clangxx_req_version + ' for ' + cxx_req_std + ' support') +endif + +# Include directories + +top_inc = include_directories('.') + +# Asserts must not be disabled + +assert(get_option('b_ndebug') == 'false', 'assertions may not be disabled') + +# Start config.h + +config_h = configuration_data() + +config_h.set_quoted('GETTEXT_PACKAGE', gt_gettext_domain) +config_h.set_quoted('VERSION', gt_version) +config_h.set('ENABLE_DEBUG', enable_debug) +config_h.set('ENABLE_SEARCH_PROVIDER', get_option('search_provider')) + +# Enable libc features + +libc_feature_defines = [ + ['_GNU_SOURCE', '1'], + ['_POSIX_C_SOURCE', '200809L'], + ['_XOPEN_SOURCE', '700'], + ['_XOPEN_SOURCE_EXTENDED', '1'], +] + +system = host_machine.system() + +if system == 'freebsd' + # Defining _POSIX_C_SOURCE above makes freebsd not expose some functionality + # that's hidden behind __BSD_VISIBLE. Not defininy any of the above however + # makes it expose verything. + + libc_feature_defines = [] + +elif system == 'darwin' + # See issue #2592 + libc_feature_defines += [ + ['_DARWIN_C_SOURCE', '1'], + ] + +elif system == 'netbsd' + libc_feature_defines += [ + ['_NETBSD_SOURCE', '1'], + ] + +elif system == 'openbsd' + libc_feature_defines += [ + ['_BSD_SOURCE', '1'], + ] +endif + +foreach f: libc_feature_defines + config_h.set(f[0], f[1]) +endforeach + +# Min/max version requirement flags + +minver = glib_min_req_version.split('.') +maxver = glib_max_allowed_version.split('.') + +glib_version_cxxflags = [ + '-DGLIB_VERSION_MIN_REQUIRED=(G_ENCODE_VERSION(' + minver[0] + ',' + minver[1] + '))', + '-DGLIB_VERSION_MAX_ALLOWED=(G_ENCODE_VERSION(' + maxver[0] + ',' + maxver[1] + '))', +] + +minver = gtk_min_req_version.split('.') +maxver = gtk_max_allowed_version.split('.') + +gtk_version_cxxflags = [ + '-DGDK_VERSION_MIN_REQUIRED=(G_ENCODE_VERSION(' + minver[0] + ',' + minver[1] + '))', + '-DGDK_VERSION_MAX_ALLOWED=(G_ENCODE_VERSION(' + maxver[0] + ',' + maxver[1] + '))', +] + +version_cxxflags = glib_version_cxxflags + gtk_version_cxxflags + +# Asserts must not be disabled + +assert(get_option('b_ndebug') == 'false', 'assertions may not be disabled') + +# LTO very much NOT supported + +assert(get_option('b_lto') == false, 'LTO not supported') + +# Compiler flags + +compiler_flags_common = [ + '-Waggregate-return', + '-Wall', + '-Wcast-align', + '-Wendif-labels', + '-Werror=init-self', + '-Werror=missing-include-dirs', + '-Werror=pointer-arith', + '-Wextra', + '-Wfloat-equal', + '-Wformat-signedness', + '-Wimplicit', + '-Wlogical-op', + '-Wmissing-declarations', + '-Wmissing-format-attribute', + '-Wmissing-include-dirs', + '-Wmissing-noreturn', + '-Wnested-externs', + '-Wno-maybe-uninitialized', + '-Wno-missing-field-initializers', + '-Wno-switch-enum', + '-Wno-unused-parameter', + '-Wold-style-definition', + '-Wpacked', + '-Wshadow', + '-Wsign-compare', + '-Wstrict-aliasing=2', + '-Wstrict-prototypes', + '-Wundef', + '-Wuninitialized', + '-Wunsafe-loop-optimizations', + '-Wvla', + '-Wwrite-strings', + '-fdiagnostics-show-option', + '-fno-common', + '-fstack-protector', + '-fstack-protector-strong', + '-fvisibility=hidden', +] + +if enable_debug + compiler_flags_common += [ + '-ggdb3', + ] +endif + +# These are currently needed but the code should be fixed instead +compiler_flags_common_undesirable = [ + '-fno-strict-aliasing' +] + +compiler_flags_c_required = [ + '-fvisibility=hidden', +] + +compiler_flags_c_only = [ + '-Waggregate-return', + '-Werror=implicit-function-declaration', + '-Werror=missing-prototypes', + '-Wimplicit', + '-Wimplicit-fallthrough=3', + '-Wmissing-parameter-type', + '-Wnested-externs', + '-Wold-style-declaration', + '-Wold-style-definition', + '-Woverride-init', + '-Wsign-compare', + '-Wstrict-prototypes', +] + +compiler_flags_cxx_only = [ + '-Wimplicit-fallthrough=5', + '-Wnon-virtual-dtor', + '-Wstrict-null-sentinel', +] + +compiler_flags_cxx_required = [ + '-fvisibility-inlines-hidden', + '-fvisibility=hidden', +] + +global_cflags = cc.get_supported_arguments(compiler_flags_common + + compiler_flags_common_undesirable + + compiler_flags_c_only + + compiler_flags_c_required) +global_cxxflags = cxx.get_supported_arguments(compiler_flags_common + + compiler_flags_common_undesirable + + compiler_flags_cxx_only + + compiler_flags_cxx_required) + +foreach flag: compiler_flags_cxx_required + assert(cxx.has_argument(flag), flag + ' is required but not supported') +endforeach + +# These flags have to be tested together + +compiler_flags_common_multi = [ + [ + '-Werror=format=2', + '-Werror=format-nonliteral', + '-Werror=format-security', + ], +] + +foreach flags : compiler_flags_common_multi + if cc.has_multi_arguments(flags) + global_cflags += flags + endif +endforeach + +# ... and now make these flags the default + +add_project_arguments(global_cflags, language: 'c',) +add_project_arguments(global_cxxflags, language: 'cpp') + +# Dependencies + +vte_dep = dependency(vte_req, version: '>=' + vte_req_version) + +gio_dep = dependency('gio-2.0', version: '>=' + glib_req_version) +gio_unix_dep = dependency('gio-unix-2.0', version: '>=' + glib_req_version) +glib_dep = dependency('glib-2.0', version: '>=' + glib_req_version) +gtk_dep = dependency('gtk+-3.0', version: '>=' + gtk_req_version) +pcre2_dep = dependency('libpcre2-8', version: '>=' + pcre2_req_version) +pthreads_dep = dependency('threads') +schemas_dep = dependency('gsettings-desktop-schemas', + version: '>=' + schemas_req_version) +uuid_dep = dependency('uuid') + +if get_option('nautilus_extension') + libnautilus_extension_dep = dependency('libnautilus-extension-4', version: '>=' + libnautilus_ext_req_version,) +else + libnautilus_extension_dep = dependency('', required: false,) +endif + +if gtk_dep.get_pkgconfig_variable('targets').contains('x11') + x11_dep = dependency('x11') +else + x11_dep = dependency('', required: false) +endif + +# Write config.h + +configure_file( + output: 'config.h', + configuration: config_h, +) + +# Utilities + +glib_compile_schemas = find_program('glib-compile-schemas') +xsltproc = find_program('xsltproc') + +# Subdirs + +subdir('src') +subdir('data') +subdir('po') + +if get_option('docs') + subdir('help') + subdir('man') +endif + +# Dist + +meson.add_dist_script( + find_program('meson_changelog.sh'), +) + +# Simple compat Makefile + +makefile_conf = configuration_data() +makefile_conf.set('srcdir', meson.current_source_dir()) +makefile_conf.set('builddir', meson.current_build_dir()) + +configure_file( + input: 'Makefile.meson', + output: '@BASENAME@', + configuration: makefile_conf, +) + +# .gitignore everything in the build directory + +configure_file( + output: '.gitignore', + command: ['echo', '**/**',], + capture: true, + install: false, +) + +# Summary + +output = '\n' +output += 'Configuration for gnome-terminal:\n\n' +output += ' Version: ' + gt_version + '\n' +output += '\n' +output += ' C compiler: ' + cc.get_id() + ' (version ' + cc.version() + ')\n' +output += ' C++ compiler: ' + cxx.get_id() + ' (version ' + cxx.version() + ')\n' +output += '\n' +output += ' Coverage: ' + get_option('b_coverage').to_string() + '\n' +output += ' Documentation: ' + get_option('docs').to_string() + '\n' +output += ' Debug: ' + enable_debug.to_string() + '\n' +output += '\n' +output += ' Prefix: ' + get_option('prefix') + '\n' +output += '\n' +output += ' Nautilus extension: ' + get_option('nautilus_extension').to_string() + '\n' +output += ' Search provider: ' + get_option('search_provider').to_string() + '\n' +message(output) + +# Done |