| # SPDX-License-Identifier: GPL-2.0-or-later |
| # Copyright (C) 2019 - 2021 IƱigo Martinez <inigomartinez@gmail.com> |
| |
| project( |
| 'libqmi', 'c', |
| version: '1.33.8', |
| 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 = 14 |
| revision = 0 |
| age = 9 |
| 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 |
| enable_udev = get_option('udev') |
| if enable_udev |
| assert(enable_firmware_update, 'Cannot build udev support without firmware_update support') |
| gudev_dep = dependency('gudev-1.0', version: '>= 232') |
| endif |
| config_h.set('WITH_UDEV', enable_udev) |
| |
| 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 = get_option('rmnet') |
| 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 |
| enable_mbim_qmux = get_option('mbim_qmux') |
| if enable_mbim_qmux |
| mbim_glib_dep = dependency('mbim-glib', version: '>= 1.18.0') |
| endif |
| config_h.set('MBIM_QMUX_ENABLED', enable_mbim_qmux) |
| |
| # QRTR support |
| enable_qrtr = get_option('qrtr') |
| if enable_qrtr |
| qrtr_glib_dep = dependency('qrtr-glib', version: '>= 1.0.0') |
| endif |
| 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 = get_option('introspection') |
| if enable_gir |
| dependency('gobject-introspection-1.0', version: '>= 0.9.6') |
| endif |
| |
| 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 |
| |
| enable_man = get_option('man') |
| if enable_man |
| subdir('docs/man') |
| endif |
| |
| enable_fuzzer = get_option('fuzzer') |
| |
| 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': enable_man, |
| 'fuzzer': enable_fuzzer, |
| }, 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') |