diff --git a/meson.build b/meson.build index 5e0bd2c431..94b67f6b71 100644 --- a/meson.build +++ b/meson.build @@ -989,12 +989,32 @@ if want_bpf_framework == 'false' else # Support 'versioned' clang/llvm-strip binaries, as seen on Debian/Ubuntu # (like clang-10/llvm-strip-10) - clang_bin = cc.get_id() == 'clang' ? cc.cmd_array()[0] : 'clang' - if meson.is_cross_build() or clang_bin.contains('afl-clang') or clang_bin.contains('hfuzz-clang') - clang_bin = 'clang' + if meson.is_cross_build() or cc.get_id() != 'clang' or cc.cmd_array()[0].contains('afl-clang') or cc.cmd_array()[0].contains('hfuzz-clang') + r = find_program('clang', required : bpf_framework_required) + clang_found = r.found() + if clang_found + if meson.version().version_compare('>= 0.55') + clang = [r.full_path()] + else + clang = [r.path()] + endif + endif + # Assume that the required flags are supported by the found clang. + clang_supports_flags = clang_found + else + clang_found = true + clang = cc.cmd_array() + clang_supports_flags = cc.has_argument('-Wno-compare-distinct-pointer-types') endif - clang = find_program(clang_bin, required : bpf_framework_required) - if not meson.is_cross_build() and clang.found() + + if clang_found + # Check if 'clang -target bpf' is supported. + clang_supports_bpf = run_command(clang, '-target', 'bpf', '--print-supported-cpus', check : false).returncode() == 0 + else + clang_supports_bpf = false + endif + + if not meson.is_cross_build() and clang_found llvm_strip_bin = run_command(clang, '--print-prog-name', 'llvm-strip', check : true).stdout().strip() else @@ -1004,9 +1024,14 @@ else # Debian installs this in /usr/sbin/ which is not in $PATH. # We check for 'bpftool' first, honouring $PATH, and in /usr/sbin/ for Debian. - bpftool = find_program('bpftool', '/usr/sbin/bpftool', required : bpf_framework_required) + # We use 'bpftool gen' subcommand, it was added by 985ead416df39d6fe8e89580cc1db6aa273e0175 (v5.6). + bpftool = find_program('bpftool', + '/usr/sbin/bpftool', + required : bpf_framework_required, + version : '>= 5.6') + + deps_found = libbpf.found() and clang_found and clang_supports_bpf and clang_supports_flags and llvm_strip.found() and bpftool.found() - deps_found = libbpf.found() and clang.found() and llvm_strip.found() and bpftool.found() # Can build BPF program from source code in restricted C conf.set10('BPF_FRAMEWORK', deps_found) endif