From ec4619d2c22be786d194e4d60951bff02c830cd0 Mon Sep 17 00:00:00 2001 From: Helmut Grohne Date: Mon, 30 Sep 2024 17:56:18 +0200 Subject: [PATCH] bpf: fix cross build failure on Debian For compiling bpf code, the system include directory needs to be constructed. On Debian-like systems, this requires passing a multiarch directory. Since clang's -dump-machine prints something other that the multiarch triplet, gcc was interrogated earlier, but that also yields a wrong result for cross compilation and was thus skipped resulting in clang not finding asm/types.h. Rather than, -dump-machine we should ask for -print-multiarch (which rarely differs). Whenever gcc is in use, this is right (even for cross building). Since clang does not support -print-multiarch and its -dump-machine never matches Debian's multiarch, we resort to asking gcc when building natively. For cross builds using clang, we are out of luck. (cherry picked from commit 608009dc6218f7c41420f665586f2449b64a08f7) (cherry picked from commit 1bd02a6e04270e6f01909cdc8b4e968f95ce5d4b) --- meson.build | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/meson.build b/meson.build index fa501e37f6..2418d6e8f7 100644 --- a/meson.build +++ b/meson.build @@ -1754,15 +1754,22 @@ if conf.get('BPF_FRAMEWORK') == 1 bpf_o_unstripped_cmd += ['-I.'] - if not meson.is_cross_build() - target_triplet_cmd = run_command('gcc', '-dumpmachine', check: false) - if target_triplet_cmd.returncode() == 0 - target_triplet = target_triplet_cmd.stdout().strip() - bpf_o_unstripped_cmd += [ - '-isystem', - '/usr/include/@0@'.format(target_triplet) - ] + if cc.get_id() == 'gcc' or meson.is_cross_build() + if cc.get_id() != 'gcc' + warning('Cross compiler is not gcc. Guessing the target triplet for bpf likely fails.') endif + target_triplet_cmd = run_command(cc.cmd_array(), '-print-multiarch', check: false) + else + # clang does not support -print-multiarch (D133170) and its -dump-machine + # does not match multiarch. Query gcc instead. + target_triplet_cmd = run_command('gcc', '-print-multiarch', check: false) + endif + if target_triplet_cmd.returncode() == 0 + target_triplet = target_triplet_cmd.stdout().strip() + bpf_o_unstripped_cmd += [ + '-isystem', + '/usr/include/@0@'.format(target_triplet) + ] endif bpf_o_unstripped_cmd += [