From d4a970f6962dda28133290194832b726b566ddab Mon Sep 17 00:00:00 2001
From: David Robillard <d@drobilla.net>
Date: Thu, 7 Jul 2022 18:59:06 -0400
Subject: Switch to meson build system

---
 meson/library/meson.build      |  30 +++++
 meson/suppressions/meson.build | 129 +++++++++++++++++++++
 meson/warnings/meson.build     | 256 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 415 insertions(+)
 create mode 100644 meson/library/meson.build
 create mode 100644 meson/suppressions/meson.build
 create mode 100644 meson/warnings/meson.build

(limited to 'meson')

diff --git a/meson/library/meson.build b/meson/library/meson.build
new file mode 100644
index 0000000..f50505f
--- /dev/null
+++ b/meson/library/meson.build
@@ -0,0 +1,30 @@
+# Copyright 2020-2022 David Robillard <d@drobilla.net>
+# SPDX-License-Identifier: CC0-1.0 OR ISC
+
+# General definitions for building libraries.
+#
+# These are essentially workarounds for meson and/or MSVC.  Unfortunately,
+# meson's default_library option doesn't support shared and static builds very
+# well.  In particular, it's often necessary to define different symbols for
+# static and shared builds of libraries so that symbols can be exported.  To
+# work around this, we do not support default_library=both on Windows.  On
+# other platforms with GCC-like compilers, we can support both because symbols
+# can safely be exported in the same way (giving them default visibility) in
+# both static and shared builds.
+
+# Abort on Windows with default_library=both
+if get_option('default_library') == 'both'
+  if host_machine.system() == 'windows'
+    error('default_library=both is not supported on Windows')
+  endif
+endif
+
+# Set library_suffix to the suffix for libraries
+if cc.get_id() == 'msvc'
+  # Meson appends a version to the name only on MS, which leads to inconsistent
+  # library names, like `mylib-1-1`.  So, provide no suffix to ultimately get
+  # the same name as on other platforms, like `mylib-1`.
+  library_suffix = ''
+else
+  library_suffix = '-@0@'.format(meson.project_version().split('.')[0])
+endif
diff --git a/meson/suppressions/meson.build b/meson/suppressions/meson.build
new file mode 100644
index 0000000..fcce3f5
--- /dev/null
+++ b/meson/suppressions/meson.build
@@ -0,0 +1,129 @@
+# Copyright 2020-2022 David Robillard <d@drobilla.net>
+# SPDX-License-Identifier: CC0-1.0 OR ISC
+
+# Project-specific warning suppressions.
+#
+# This should be used in conjunction with the generic "warnings" sibling that
+# enables all reasonable warnings for the compiler.  It lives here just to keep
+# the top-level meson.build more readable.
+
+#####
+# C #
+#####
+
+if is_variable('cc')
+  c_suppressions = []
+
+  if get_option('strict')
+    if cc.get_id() in ['clang', 'emscripten']
+      c_suppressions += [
+        '-Wno-cast-align',
+        '-Wno-cast-qual',
+        '-Wno-documentation-unknown-command',
+        '-Wno-double-promotion',
+        '-Wno-float-conversion',
+        '-Wno-float-equal',
+        '-Wno-implicit-float-conversion',
+        '-Wno-padded',
+        '-Wno-reserved-id-macro',
+        '-Wno-shorten-64-to-32',
+        '-Wno-sign-conversion',
+        '-Wno-switch-enum',
+        '-Wno-unused-parameter',
+      ]
+    elif cc.get_id() == 'gcc'
+      c_suppressions += [
+        '-Wno-cast-align',
+        '-Wno-cast-qual',
+        '-Wno-conversion',
+        '-Wno-double-promotion',
+        '-Wno-float-equal',
+        '-Wno-inline',
+        '-Wno-padded',
+        '-Wno-suggest-attribute=const',
+        '-Wno-suggest-attribute=malloc',
+        '-Wno-suggest-attribute=pure',
+        '-Wno-switch-default',
+        '-Wno-switch-enum',
+        '-Wno-unsuffixed-float-constants',
+        '-Wno-unused-const-variable',
+        '-Wno-unused-parameter',
+      ]
+
+      if target_machine.system() == 'windows'
+        c_suppressions += [
+          '-Wno-suggest-attribute=format',
+        ]
+      endif
+
+    elif cc.get_id() == 'msvc'
+      c_suppressions += [
+        '/wd4061', # enumerator in switch is not explicitly handled
+        '/wd4100', # unreferenced formal parameter
+        '/wd4244', # conversion with possible loss of data
+        '/wd4267', # conversion from size_t to a smaller type
+        '/wd4310', # cast truncates constant value
+        '/wd4365', # signed/unsigned mismatch
+        '/wd4464', # relative include path contains ".."
+        '/wd4514', # unreferenced inline function has been removed
+        '/wd4514', # unreferenced inline function has been removed
+        '/wd4706', # assignment within conditional expression
+        '/wd4710', # function not inlined
+        '/wd4711', # function selected for automatic inline expansion
+        '/wd4820', # padding added after construct
+        '/wd5045', # will insert Spectre mitigation for memory load
+      ]
+    endif
+  endif
+
+  c_suppressions = cc.get_supported_arguments(c_suppressions)
+endif
+
+#######
+# C++ #
+#######
+
+if is_variable('cpp')
+  cpp_suppressions = []
+
+  if get_option('strict')
+    if cpp.get_id() in ['clang', 'emscripten']
+      cpp_suppressions = [
+        '-Wno-cast-align',
+        '-Wno-cast-qual',
+        '-Wno-documentation-unknown-command',
+        '-Wno-nullability-extension',
+        '-Wno-padded',
+        '-Wno-reserved-id-macro',
+      ]
+
+    elif cpp.get_id() == 'gcc'
+      cpp_suppressions = [
+        '-Wno-cast-align',
+        '-Wno-cast-qual',
+        '-Wno-inline',
+        '-Wno-padded',
+        '-Wno-unused-const-variable',
+        '-Wno-useless-cast',
+      ]
+
+      if target_machine.system() == 'windows'
+        cpp_suppressions += [
+          '-Wno-suggest-attribute=format',
+        ]
+      endif
+
+    elif cpp.get_id() == 'msvc'
+      cpp_suppressions = [
+        '/wd4514', # unreferenced inline function has been removed
+        '/wd4706', # assignment within conditional expression
+        '/wd4710', # function not inlined
+        '/wd4711', # function selected for automatic inline expansion
+        '/wd4820', # padding added after data member
+        '/wd5045', # will insert Spectre mitigation
+      ]
+    endif
+  endif
+
+  cpp_suppressions = cpp.get_supported_arguments(cpp_suppressions)
+endif
diff --git a/meson/warnings/meson.build b/meson/warnings/meson.build
new file mode 100644
index 0000000..e0051f9
--- /dev/null
+++ b/meson/warnings/meson.build
@@ -0,0 +1,256 @@
+# Copyright 2020-2022 David Robillard <d@drobilla.net>
+# SPDX-License-Identifier: CC0-1.0 OR ISC
+
+# General code to enable approximately all warnings in GCC 12, clang, and MSVC.
+#
+# This is trivial for clang and MSVC, but GCC doesn't have an "everything"
+# option, so we need to enable everything we want explicitly.  Wall is assumed,
+# but Wextra is not, for stability.
+#
+# These are collected from common.opt and c.opt in the GCC source, and manually
+# curated with the help of the GCC documentation.  Warnings that are
+# application-specific, historical, or about compatibility between specific
+# language revisions are omitted.  The intent here is to have roughly the same
+# meaning as clang's Weverything: extremely strict, but general.  Specifically
+# omitted are:
+#
+# General:
+#
+# Wabi=
+# Waggregate-return
+# Walloc-size-larger-than=BYTES
+# Walloca-larger-than=BYTES
+# Wframe-larger-than=BYTES
+# Wlarger-than=BYTES
+# Wstack-usage=BYTES
+# Wsystem-headers
+# Wtraditional
+# Wtraditional-conversion
+# Wtrampolines
+# Wvla-larger-than=BYTES
+#
+# Build specific:
+#
+# Wpoison-system-directories
+#
+# C Specific:
+#
+# Wc11-c2x-compat
+# Wc90-c99-compat
+# Wc99-c11-compat
+# Wdeclaration-after-statement
+# Wtraditional
+# Wtraditional-conversion
+#
+# C++ Specific:
+#
+# Wc++0x-compat
+# Wc++1z-compat
+# Wc++2a-compat
+# Wctad-maybe-unsupported
+# Wnamespaces
+# Wtemplates
+
+# GCC warnings that apply to all C-family languages
+gcc_common_warnings = [
+  '-Walloc-zero',
+  '-Walloca',
+  '-Wanalyzer-too-complex',
+  '-Warith-conversion',
+  '-Warray-bounds=2',
+  '-Wattribute-alias=2',
+  '-Wbidi-chars=ucn',
+  '-Wcast-align=strict',
+  '-Wcast-function-type',
+  '-Wcast-qual',
+  '-Wclobbered',
+  '-Wconversion',
+  '-Wdate-time',
+  '-Wdisabled-optimization',
+  '-Wdouble-promotion',
+  '-Wduplicated-branches',
+  '-Wduplicated-cond',
+  '-Wempty-body',
+  '-Wendif-labels',
+  '-Wfloat-equal',
+  '-Wformat-overflow=2',
+  '-Wformat-signedness',
+  '-Wformat-truncation=2',
+  '-Wformat=2',
+  '-Wignored-qualifiers',
+  '-Wimplicit-fallthrough=3',
+  '-Winit-self',
+  '-Winline',
+  '-Winvalid-pch',
+  '-Wlogical-op',
+  '-Wmissing-declarations',
+  '-Wmissing-field-initializers',
+  '-Wmissing-include-dirs',
+  '-Wmultichar',
+  '-Wnormalized=nfc',
+  '-Wnull-dereference',
+  '-Wopenacc-parallelism',
+  '-Woverlength-strings',
+  '-Wpacked',
+  '-Wpacked-bitfield-compat',
+  '-Wpadded',
+  '-Wpointer-arith',
+  '-Wredundant-decls',
+  '-Wshadow',
+  '-Wshift-negative-value',
+  '-Wshift-overflow=2',
+  '-Wstack-protector',
+  '-Wstrict-aliasing=3',
+  '-Wstrict-overflow=5',
+  '-Wstring-compare',
+  '-Wstringop-overflow=3',
+  '-Wsuggest-attribute=cold',
+  '-Wsuggest-attribute=const',
+  '-Wsuggest-attribute=format',
+  '-Wsuggest-attribute=malloc',
+  '-Wsuggest-attribute=noreturn',
+  '-Wsuggest-attribute=pure',
+  '-Wswitch-default',
+  '-Wswitch-enum',
+  '-Wtrampolines',
+  '-Wtrivial-auto-var-init',
+  '-Wtype-limits',
+  '-Wundef',
+  '-Wuninitialized',
+  '-Wunsafe-loop-optimizations',
+  '-Wunused',
+  '-Wunused-const-variable=2',
+  '-Wunused-macros',
+  '-Wvector-operation-performance',
+  '-Wvla',
+  '-Wwrite-strings',
+]
+
+#####
+# C #
+#####
+
+if is_variable('cc') and not is_variable('all_c_warnings')
+  # Set all_c_warnings for the current C compiler
+  all_c_warnings = []
+
+  if get_option('strict')
+    if cc.get_id() == 'clang'
+      all_c_warnings += ['-Weverything']
+
+      if not meson.is_cross_build()
+        all_c_warnings += [
+          '-Wno-poison-system-directories',
+        ]
+      endif
+
+    elif cc.get_id() == 'gcc'
+      all_c_warnings += gcc_common_warnings + [
+        '-Wabsolute-value',
+        '-Wbad-function-cast',
+        '-Wc++-compat',
+        '-Wenum-conversion',
+        '-Wjump-misses-init',
+        '-Wmissing-parameter-type',
+        '-Wmissing-prototypes',
+        '-Wnested-externs',
+        '-Wold-style-declaration',
+        '-Wold-style-definition',
+        '-Woverride-init',
+        '-Wsign-compare',
+        '-Wstrict-prototypes',
+        '-Wunsuffixed-float-constants',
+      ]
+
+    elif cc.get_id() == 'msvc'
+      all_c_warnings += [
+        '/Wall',
+        '/experimental:external',
+        '/external:W0',
+        '/external:anglebrackets',
+      ]
+    endif
+  endif
+
+  all_c_warnings = cc.get_supported_arguments(all_c_warnings)
+  add_global_arguments(all_c_warnings, language: ['c'])
+endif
+
+#######
+# C++ #
+#######
+
+if is_variable('cpp') and not is_variable('all_cpp_warnings')
+  # Set all_cpp_warnings for the current C++ compiler
+  all_cpp_warnings = []
+
+  if get_option('strict')
+    if cpp.get_id() == 'clang'
+      all_cpp_warnings += [
+        '-Weverything',
+        '-Wno-c++98-compat',
+        '-Wno-c++98-compat-pedantic',
+      ]
+
+      if not meson.is_cross_build()
+        all_cpp_warnings += [
+          '-Wno-poison-system-directories',
+        ]
+      endif
+
+    elif cpp.get_id() == 'gcc'
+      all_cpp_warnings += gcc_common_warnings + [
+        '-Wabi-tag',
+        '-Waligned-new=all',
+        '-Wcatch-value=3',
+        '-Wcomma-subscript',
+        '-Wconditionally-supported',
+        '-Wctor-dtor-privacy',
+        '-Wdelete-non-virtual-dtor',
+        '-Wdeprecated',
+        '-Wdeprecated-copy',
+        '-Wdeprecated-copy-dtor',
+        '-Wdeprecated-enum-enum-conversion',
+        '-Wdeprecated-enum-float-conversion',
+        '-Weffc++',
+        '-Wexpansion-to-defined',
+        '-Wextra-semi',
+        '-Wimport',
+        '-Winvalid-imported-macros',
+        '-Wmismatched-tags',
+        '-Wmultiple-inheritance',
+        '-Wnoexcept',
+        '-Wnoexcept-type',
+        '-Wnon-virtual-dtor',
+        '-Wold-style-cast',
+        '-Woverloaded-virtual',
+        '-Wplacement-new=2',
+        '-Wredundant-move',
+        '-Wredundant-tags',
+        '-Wregister',
+        '-Wsign-compare',
+        '-Wsign-promo',
+        '-Wsized-deallocation',
+        '-Wstrict-null-sentinel',
+        '-Wsuggest-final-methods',
+        '-Wsuggest-final-types',
+        '-Wsuggest-override',
+        '-Wuseless-cast',
+        '-Wvirtual-inheritance',
+        '-Wvolatile',
+        '-Wzero-as-null-pointer-constant',
+      ]
+
+    elif cpp.get_id() == 'msvc'
+      all_cpp_warnings += [
+        '/Wall',
+        '/experimental:external',
+        '/external:W0',
+        '/external:anglebrackets',
+      ]
+    endif
+  endif
+
+  all_cpp_warnings = cpp.get_supported_arguments(all_cpp_warnings)
+  add_global_arguments(all_cpp_warnings, language: ['cpp'])
+endif
-- 
cgit v1.2.1