diff options
Diffstat (limited to 'meson.build')
-rw-r--r-- | meson.build | 265 |
1 files changed, 234 insertions, 31 deletions
diff --git a/meson.build b/meson.build index c6e6a934..724ab213 100644 --- a/meson.build +++ b/meson.build @@ -1,33 +1,102 @@ +# SPDX-License-Identifier: CC0-1.0 + project('libcamera', 'c', 'cpp', - meson_version : '>= 0.47', - version : '0.0.0', + meson_version : '>= 0.63', + version : '0.4.0', default_options : [ 'werror=true', 'warning_level=2', - 'cpp_std=c++14', + 'cpp_std=c++17', ], license : 'LGPL 2.1+') # Generate version information. The libcamera_git_version variable contains the -# full version with git patch count and SHA1 (e.g. 1.2.3+211-c94a24f4), while -# the libcamera_version variable contains the major.minor.patch (e.g. 1.2.3) -# only. If the source tree isn't under git control, or if it matches the last -# git version tag, the build metadata (e.g. +211-c94a24f4) is omitted from -# libcamera_git_version. +# full version with build metadata (patch count and SHA1, e.g. +# 1.2.3+211-c94a24f4), while the libcamera_version variable contains the +# major.minor.patch (e.g. 1.2.3) only. +# +# If the source tree matches the last git version tag, the build metadata +# (e.g. +211-c94a24f4) is omitted from libcamera_git_version. libcamera_git_version = run_command('utils/gen-version.sh', - meson.build_root()).stdout().strip() + meson.project_build_root(), + meson.project_source_root(), + check : false).stdout().strip() + +# If the source tree isn't under git control, set libcamera_git_version to the +# meson project version. if libcamera_git_version == '' libcamera_git_version = meson.project_version() endif libcamera_version = libcamera_git_version.split('+')[0] +project_version = meson.project_version().split('+')[0] + +# A shallow clone, or a clone without a reachable tag equivalent to the +# meson.project_version() could leave the project in a mis-described state. +# Produce a warning in this event, and fix to a best effort. +if libcamera_version != project_version + warning('The sources and meson.build disagree about the version: ' + + libcamera_version + ' != ' + project_version) + + summary({'libcamera git version' : libcamera_git_version, + 'Source version match' : false, + }, + bool_yn : true, section : 'Versions') + + # Re-run gen-version.sh to replace the git version (major.minor.patch) with + # the meson project version. The build metadata provided by git are kept. + libcamera_git_version = run_command('utils/gen-version.sh', + meson.project_build_root(), + meson.project_source_root(), + project_version, + check : false).stdout().strip() + libcamera_version = project_version + + # Append a marker to show we have modified this version string. + libcamera_git_version += '-nvm' +endif + +# The major and minor libcamera version components are used as the soname. +# No ABI/API compatibility is guaranteed between releases (x.y). +# +# When we declare a stable ABI/API we will provide a 1.0 release and the +# soversion at that point will be the 'major' release value (x). +semver = libcamera_version.split('.') +libcamera_soversion = semver[0] + '.' + semver[1] + +summary({ 'Sources': libcamera_git_version, }, section : 'Versions') + +# This script generates the .tarball-version file on a 'meson dist' command. +meson.add_dist_script('utils/run-dist.sh') # Configure the build environment. cc = meson.get_compiler('c') +cxx = meson.get_compiler('cpp') config_h = configuration_data() -if cc.has_header_symbol('execinfo.h', 'backtrace') - config_h.set('HAVE_BACKTRACE', 1) +if cc.has_header_symbol('fcntl.h', 'F_ADD_SEALS', prefix : '#define _GNU_SOURCE') + config_h.set('HAVE_FILE_SEALS', 1) +endif + +if cc.has_header_symbol('unistd.h', 'issetugid') + config_h.set('HAVE_ISSETUGID', 1) +endif + +if cc.has_header_symbol('locale.h', 'locale_t', prefix : '#define _GNU_SOURCE') + config_h.set('HAVE_LOCALE_T', 1) +endif + +if cc.has_header_symbol('sys/mman.h', 'memfd_create', prefix : '#define _GNU_SOURCE') + config_h.set('HAVE_MEMFD_CREATE', 1) +endif + +ioctl_posix_test = ''' +#include <sys/ioctl.h> +int ioctl (int, int, ...); +''' + +if cc.compiles(ioctl_posix_test) + config_h.set('HAVE_POSIX_IOCTL', 1) endif if cc.has_header_symbol('stdlib.h', 'secure_getenv', prefix : '#define _GNU_SOURCE') @@ -35,28 +104,77 @@ if cc.has_header_symbol('stdlib.h', 'secure_getenv', prefix : '#define _GNU_SOUR endif common_arguments = [ - '-Wno-unused-parameter', - '-include', 'config.h', + '-Wmissing-declarations', + '-Wshadow', + '-include', meson.current_build_dir() / 'config.h', ] c_arguments = [] cpp_arguments = [] +cxx_stdlib = 'libstdc++' + if cc.get_id() == 'clang' - # Turn _FORTIFY_SOURCE by default on optimised builds (as it requires -O1 - # or higher). This is needed on clang only as gcc enables it by default. + if cc.version().version_compare('<9') + error('clang version is too old, libcamera requires 9.0 or newer') + endif + + # Turn _FORTIFY_SOURCE by default on. This is needed on clang only as gcc + # enables it by default. FORTIFY will not work properly with `-O0`, and may + # result in macro redefinition errors if the user already has a setting for + # `-D_FORTIFY_SOURCE`. Do not enable FORTIFY in either of those cases. if get_option('optimization') != '0' - common_arguments += [ - '-D_FORTIFY_SOURCE=2', - ] + fortify = cc.get_define('_FORTIFY_SOURCE') + if fortify == '' + message('Adding _FORTIFY_SOURCE') + common_arguments += [ + '-D_FORTIFY_SOURCE=2', + ] + endif endif # Use libc++ by default if available instead of libstdc++ when compiling # with clang. - if cc.find_library('libc++', required: false).found() + if cc.find_library('c++', required : false).found() cpp_arguments += [ '-stdlib=libc++', ] + cxx_stdlib = 'libc++' + endif + + cpp_arguments += [ + '-Wextra-semi', + '-Wthread-safety', + ] +endif + +if cc.get_id() == 'gcc' + if cc.version().version_compare('<9') + error('gcc version is too old, libcamera requires 9.0 or newer') + endif + + # gcc 13 implements the C++23 version of automatic move from local + # variables in return statements (see + # https://en.cppreference.com/w/cpp/language/return). As a result, some + # previously required explicit std::move() in return statements generate + # warnings. Those moves can't be removed as older compiler versions could + # use copy constructors instead of move constructors. The easiest fix is to + # disable the warning. With -Wpessimizing-move enabled, the compiler will + # still warn of pessimizing moves, only the redundant but not pessimizing + # moves will be ignored. + if cc.version().version_compare('>=13') + cpp_arguments += [ + '-Wno-redundant-move', + ] + endif + + # gcc 7.1 introduced processor-specific ABI breakages related to parameter + # passing on ARM platforms. This generates a large number of messages + # during compilation. Silence them. + if host_machine.cpu_family() == 'arm' + cpp_arguments += [ + '-Wno-psabi', + ] endif endif @@ -78,26 +196,111 @@ add_project_link_arguments(cpp_arguments, language : 'cpp') libcamera_includes = include_directories('include') +# Sub-directories fill py_modules with their dependencies. +py_modules = [] + +# Libraries used by multiple components +liblttng = dependency('lttng-ust', required : get_option('tracing')) + +# Pipeline handlers +# +wanted_pipelines = get_option('pipelines') + +arch_arm = ['arm', 'aarch64'] +arch_x86 = ['x86', 'x86_64'] +pipelines_support = { + 'imx8-isi': arch_arm, + 'ipu3': arch_x86, + 'mali-c55': arch_arm, + 'rkisp1': arch_arm, + 'rpi/vc4': arch_arm, + 'simple': ['any'], + 'uvcvideo': ['any'], + 'vimc': ['test'], + 'virtual': ['test'], +} + +if wanted_pipelines.contains('all') + pipelines = pipelines_support.keys() +elif wanted_pipelines.contains('auto') + host_cpu = host_machine.cpu_family() + pipelines = [] + foreach pipeline, archs : pipelines_support + if pipeline in wanted_pipelines or host_cpu in archs or 'any' in archs + pipelines += pipeline + endif + endforeach +else + pipelines = wanted_pipelines +endif + +# Tests require the vimc pipeline handler, include it automatically when tests +# are enabled. +if get_option('test') + foreach pipeline, archs : pipelines_support + if 'test' in archs and pipeline not in pipelines + message('Enabling ' + pipeline + ' pipeline handler for tests') + pipelines += pipeline + endif + endforeach +endif + +# Force enable the Vivid pipeline on the development branch only. +if 'vivid' not in pipelines + pipelines += ['vivid'] +endif + +# Utilities are parsed first to provide support for other components. +subdir('utils') + subdir('include') subdir('src') -subdir('utils') # The documentation and test components are optional and can be disabled # through configuration values. They are enabled by default. -if get_option('documentation') - subdir('Documentation') -endif +subdir('Documentation') +subdir('test') -if get_option('test') - subdir('test') +if not meson.is_cross_build() + kernel_version_req = '>= 5.0.0' + kernel_version = run_command('uname', '-r', check : true).stdout().strip() + if not kernel_version.version_compare(kernel_version_req) + warning('The current running kernel version @0@ is too old to run libcamera.' + .format(kernel_version)) + warning('If you intend to use libcamera on this machine, please upgrade to a kernel @0@.' + .format(kernel_version_req)) + endif endif +# Create a symlink from the build root to the source root. This is used when +# running libcamera from the build directory to locate resources in the source +# directory (such as IPA configuration files). +run_command('ln', '-fsT', meson.project_source_root(), meson.project_build_root() / 'source', + check : true) + configure_file(output : 'config.h', configuration : config_h) -pkg_mod = import('pkgconfig') -pkg_mod.generate(libraries : libcamera, - version : '1.0', - name : 'libcamera', - filebase : 'camera', - description : 'Complex Camera Support Library') +# Check for python installation and modules. +py_mod = import('python') +py_mod.find_installation('python3', modules : py_modules) + +## Summarise Configurations +summary({ + 'Enabled pipelines': pipelines, + 'Enabled IPA modules': enabled_ipa_names, + 'Controls files': controls_files_names, + 'Properties files': properties_files_names, + 'Hotplug support': libudev.found(), + 'Tracing support': tracing_enabled, + 'Android support': android_enabled, + 'GStreamer support': gst_enabled, + 'Python bindings': pycamera_enabled, + 'V4L2 emulation support': v4l2_enabled, + 'cam application': cam_enabled, + 'qcam application': qcam_enabled, + 'lc-compliance application': lc_compliance_enabled, + 'Unit tests': test_enabled, + }, + section : 'Configuration', + bool_yn : true) |