blob: c7312146b644f1275ed9b619314667953f2d9442 [file] [log] [blame]
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2019 - 2021 IƱigo Martinez <inigomartinez@gmail.com>
project(
'libqmi', 'c',
version: '1.31.1',
license: 'GPL2',
default_options: [
'buildtype=debugoptimized',
'c_std=gnu89',
'warning_level=2',
],
meson_version: '>= 0.53.0',
)
qmi_name = meson.project_name()
qmi_version = meson.project_version()
version_array = qmi_version.split('.')
qmi_major_version = version_array[0].to_int()
qmi_minor_version = version_array[1].to_int()
qmi_micro_version = version_array[2].to_int()
qmi_prefix = get_option('prefix')
qmi_bindir = get_option('bindir')
qmi_datadir = get_option('datadir')
qmi_includedir = get_option('includedir')
qmi_libexecdir = get_option('libexecdir')
qmi_mandir = get_option('mandir')
qmi_glib_include_subdir = qmi_name + '-glib'
qmi_glib_pkgincludedir = qmi_includedir / qmi_glib_include_subdir
# libtool versioning for libqmi-glib (-version-info c:r:a)
# - If the interface is unchanged, but the implementation has changed or been fixed, then increment r
# - Otherwise, increment c and zero r.
# - If the interface has grown (that is, the new library is compatible with old code), increment a.
# - If the interface has changed in an incompatible way (that is, functions have changed or been removed), then zero a.
current = 13
revision = 0
age = 8
qmi_glib_version = '@0@.@1@.@2@'.format(current - age, age, revision)
qmi_gir_version = '1.0'
gnome = import('gnome')
i18n = import('i18n')
pkg = import('pkgconfig')
python = import('python').find_installation('python3')
source_root = meson.current_source_dir()
data_dir = source_root / 'data'
templates_dir = source_root / 'build-aux/templates'
qmi_codegen = find_program(source_root / 'build-aux/qmi-codegen/qmi-codegen')
qmi_mkenums = find_program(source_root / 'build-aux/qmi-mkenums')
top_inc = include_directories('.')
cc = meson.get_compiler('c')
config_h = configuration_data()
config_h.set_quoted('PACKAGE_VERSION', qmi_version)
# compiler flags
common_flags = ['-DHAVE_CONFIG_H']
# compiler flags that are always enabled, even in release builds
cc_flags = cc.get_supported_arguments([
# warning on unused parameters is overkill, never do that
'-Wno-unused-parameter',
# function type cast disabled: used throughout the code especially to
# cast GAsyncReadyCallbacks with the real object type instead of GObject
'-Wno-cast-function-type',
# all message protocol structs are packed, never complain about it
'-Wno-packed',
])
# strict flags to use in debug builds
if get_option('buildtype').contains('debug')
cc_flags += cc.get_supported_arguments([
'-fno-strict-aliasing',
'-Waggregate-return',
'-Wcast-align',
'-Wdeclaration-after-statement',
'-Wdouble-promotion',
'-Wduplicated-branches',
'-Wduplicated-cond',
'-Wfloat-equal',
'-Wformat=2',
'-Wformat-nonliteral',
'-Wformat-security',
'-Winit-self',
'-Winline',
'-Wjump-misses-init',
'-Wlogical-op',
'-Wnested-externs',
'-Wmissing-declarations',
'-Wmissing-format-attribute',
'-Wmissing-include-dirs',
'-Wmissing-noreturn',
'-Wmissing-prototypes',
'-Wnull-dereference',
'-Wpointer-arith',
'-Wredundant-decls',
'-Wrestrict',
'-Wreturn-type',
'-Wshadow',
'-Wstrict-prototypes',
'-Wsuggest-attribute=format',
'-Wswitch-default',
'-Wswitch-enum',
'-Wundef',
'-Wunused-but-set-variable',
'-Wwrite-strings',
])
endif
add_project_arguments(common_flags + cc_flags, language: 'c')
no_deprecated_declarations_flags = cc.get_supported_arguments('-Wno-deprecated-declarations')
glib_version = '2.56'
glib_dep = dependency('glib-2.0', version: '>= ' + glib_version)
gio_unix_dep = dependency('gio-unix-2.0')
deps = [
glib_dep,
dependency('gio-2.0'),
dependency('gobject-2.0'),
]
c_flags = [
'-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_' + glib_version.underscorify(),
'-DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_' + glib_version.underscorify(),
'-DGLIB_DISABLE_DEPRECATION_WARNINGS',
]
glib_deps = declare_dependency(
dependencies: deps,
compile_args: c_flags,
)
# message collection (existing file in data/qmi-collection-${COLLECTION}.json)
# dnl custom collections may be added as files in data/
qmi_collection_name = get_option('collection')
# qmi-firmware-update is optional, enabled by default
enable_firmware_update = get_option('firmware_update')
assert(not enable_firmware_update or qmi_collection_name != 'minimal', 'Cannot build qmi-firmware-update when \'minimal\' collection enabled, use at least the \'basic\' collection instead.')
# udev support is optional, enabled by default
gudev_dep = dependency((enable_firmware_update ? 'gudev-1.0' : ''), version: '>= 232', required: get_option('udev'))
config_h.set('WITH_UDEV', gudev_dep.found())
enable_bash_completion = get_option('bash_completion')
if enable_bash_completion
bash_completion_dep = dependency('bash-completion')
bash_completion_completionsdir = bash_completion_dep.get_pkgconfig_variable(
'completionsdir',
# bash-completion 2.10 changed the substitutions
define_variable: bash_completion_dep.version().version_compare('>= 2.10') ? ['datadir', qmi_datadir] : ['prefix', qmi_prefix],
)
endif
# rmnet link management support
enable_rmnet = not get_option('rmnet').disabled()
config_h.set('RMNET_SUPPORT_ENABLED', enable_rmnet)
# runtime MM check is optional, enabled by default
config_h.set('MM_RUNTIME_CHECK_ENABLED', get_option('mm_runtime_check'))
# QMI username
qmi_username = get_option('qmi_username')
enable_qmi_username = (qmi_username != '')
if enable_qmi_username
config_h.set_quoted('QMI_USERNAME', qmi_username)
# FIXME: udev base directory, prefix can't be overrided
udev_udevdir = get_option('udevdir')
if udev_udevdir == ''
udev_udevdir = dependency('udev').get_pkgconfig_variable('udevdir')
endif
else
qmi_username = 'no (root)'
endif
config_h.set('QMI_USERNAME_ENABLED', enable_qmi_username)
# MBIM QMUX service support
mbim_glib_dep = dependency('mbim-glib', version: '>= 1.18.0', required: get_option('mbim_qmux'))
enable_mbim_qmux = mbim_glib_dep.found()
config_h.set('MBIM_QMUX_ENABLED', enable_mbim_qmux)
# QRTR support
qrtr_glib_dep = dependency('qrtr-glib', version: '>= 1.0.0', required: get_option('qrtr'))
enable_qrtr = qrtr_glib_dep.found()
config_h.set10('QMI_QRTR_SUPPORTED', enable_qrtr)
version_conf = configuration_data()
version_conf.set('VERSION', qmi_version)
version_conf.set('QMI_MAJOR_VERSION', qmi_major_version)
version_conf.set('QMI_MINOR_VERSION', qmi_minor_version)
version_conf.set('QMI_MICRO_VERSION', qmi_micro_version)
version_conf.set10('QMI_MBIM_QMUX_SUPPORTED', enable_mbim_qmux)
version_conf.set10('QMI_QRTR_SUPPORTED', enable_qrtr)
version_conf.set10('QMI_RMNET_SUPPORTED', enable_rmnet)
# introspection support
enable_gir = dependency('gobject-introspection-1.0', version: '>= 0.9.6', required: get_option('introspection')).found()
test_env = {
'G_DEBUG': 'gc-friendly',
'MALLOC_CHECK_': '2',
}
subdir('src')
subdir('utils')
enable_gtk_doc = get_option('gtk_doc')
if enable_gtk_doc
assert(qmi_collection_name == 'full', 'Building documentation requires the \'full\' message collection.')
subdir('docs/reference/libqmi-glib')
endif
help2man = find_program(
'help2man',
# When meson >= 0.59 is popular enough, replace with
# required: get_option('man').require(meson.can_run_host_binaries())
required: get_option('man'),
)
subdir('docs/man', if_found: help2man)
configure_file(
output: 'config.h',
configuration: config_h,
)
summary({
'compiler': cc.get_id(),
'cflags': cc_flags,
'Documentation': enable_gtk_doc,
'bash completion': enable_bash_completion,
'gobject introspection': enable_gir,
'man pages': help2man.found(),
}, section: 'Build')
summary({
'prefix': qmi_prefix,
'udev base directory': (enable_qmi_username ? udev_udevdir : 'disabled'),
}, section: 'System paths')
summary({
'QMI over MBIM': enable_mbim_qmux,
'QMI over QRTR': enable_qrtr,
'QMI username': qmi_username,
'rmnet support': enable_rmnet,
}, section: 'Features')