diff --git a/README b/README index 9adc1fc..cbb9d8b 100644 --- a/README +++ b/README @@ -43,3 +43,20 @@ headers in a build directory /build/root/: cd src PKG_CONFIG_PATH=/build/root/lib64/pkgconfig DESTDIR=/build/root make install + +To integrate libbpf into a project which uses Meson building system define +[wrap-git] file in `subprojects` folder. +To add libbpf dependency to the parent parent project, e.g. for +libbpf_static_dep: + + libbpf_obj = subproject('libbpf', required : true) + libbpf_static_dep = libbpf_proj.get_variable('libbpf_static_dep') + +To validate changes to meson.build + + python3 meson.py build + ninja -C build/ + +To install headers, libs and pkgconfig + cd build + ninja install diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..30140ad --- /dev/null +++ b/meson.build @@ -0,0 +1,95 @@ +# SPDX-License-Identifier: LGPL-2.1 OR BSD-2-Clause +project('libbpf', 'c', + version : '0.0.3', + license : 'LGPL-2.1 OR BSD-2-Clause', + default_options : [ + 'prefix=/usr', + ], + meson_version : '>= 0.46', + ) + +patchlevel = meson.project_version().split('.')[1] + +libbpf_source_dir = './' + +libbpf_sources = files(run_command('find', + [ + '@0@/src'.format(libbpf_source_dir), + '-type', + 'f', + '-name', + '*.[h|c]']).stdout().split()) + +libbpf_headers = files( + join_paths(libbpf_source_dir, 'src/bpf.h'), + join_paths(libbpf_source_dir, 'src/btf.h'), + join_paths(libbpf_source_dir, 'src/libbpf.h')) + +feature_rellocarray = run_command(join_paths(libbpf_source_dir, 'scripts/check-reallocarray.sh')) + +libbpf_c_args = ['-g', + '-O2', + '-Werror', + '-Wall', +] + +if feature_rellocarray.stdout().strip() != '' + libbpf_c_args += '-DCOMPAT_NEED_REALLOCARRAY' +endif + +# bpf_includes are required to include bpf.h, btf.h, libbpf.h +bpf_includes = include_directories( + join_paths(libbpf_source_dir, 'src')) + +libbpf_includes = include_directories( + join_paths(libbpf_source_dir, 'include'), + join_paths(libbpf_source_dir, 'include/uapi')) + +libelf = dependency('libelf') +libelf = dependency('libelf', required: false) +if not libelf.found() + libelf = cc.find_library('elf', required: true) +endif + +deps = [libelf] + +libbpf_static = static_library( + 'bpf', + libbpf_sources, + c_args : libbpf_c_args, + dependencies : deps, + include_directories : libbpf_includes, + install : true) + +libbpf_static_dep = declare_dependency(link_with : libbpf_static) + +libbpf_map_source_path = join_paths(libbpf_source_dir, 'src/libbpf.map') +libbpf_map_abs_path = join_paths(meson.current_source_dir(), libbpf_map_source_path) + +libbpf_c_args += ['-fPIC', '-fvisibility=hidden'] + +libbpf_link_args = ['-Wl,--version-script=@0@'.format(libbpf_map_abs_path)] + +libbpf_shared = shared_library( + 'bpf', + libbpf_sources, + c_args : libbpf_c_args, + dependencies : deps, + include_directories : libbpf_includes, + install : true, + link_args : libbpf_link_args, + link_depends : libbpf_map_source_path, + soversion : patchlevel, + version : meson.project_version()) + +libbpf_shared_dep = declare_dependency(link_with : libbpf_shared) + +install_headers(libbpf_headers, subdir : 'bpf') + +pkg = import('pkgconfig') +pkg.generate( + name: meson.project_name(), + version: meson.project_version(), + libraries: libbpf_shared, + requires_private: ['libelf'], + description: '''BPF library''')