Skip to content

Commit a778f5d

Browse files
anakryikoborkmann
authored andcommitted
tools/headers: Pull in stddef.h to uapi to fix BPF selftests build in CI
With recent sync of linux/in.h tools/include headers are now relying on __DECLARE_FLEX_ARRAY macro, which isn't itself defined inside tools/include headers anywhere and is instead assumed to be present in system-wide UAPI header. This breaks isolated environments that don't have kernel UAPI headers installed system-wide, like BPF CI ([0]). To fix this, bring in include/uapi/linux/stddef.h into tools/include. We can't just copy/paste it, though, it has to be processed with scripts/headers_install.sh, which has a dependency on scripts/unifdef. So the full command to (re-)generate stddef.h for inclusion into tools/include directory is: $ make scripts_unifdef && \ cp $KBUILD_OUTPUT/scripts/unifdef scripts/ && \ scripts/headers_install.sh include/uapi/linux/stddef.h tools/include/uapi/linux/stddef.h This assumes KBUILD_OUTPUT envvar is set and used for out-of-tree builds. [0] https://github.com/kernel-patches/bpf/actions/runs/3379432493/jobs/5610982609 Fixes: 036b8f5 ("tools headers uapi: Update linux/in.h copy") Signed-off-by: Andrii Nakryiko <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]> Cc: Jakub Kicinski <[email protected]> Cc: Arnaldo Carvalho de Melo <[email protected]> Link: https://lore.kernel.org/bpf/[email protected]
1 parent aec1dc9 commit a778f5d

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

tools/include/uapi/linux/in.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#define _UAPI_LINUX_IN_H
2121

2222
#include <linux/types.h>
23+
#include <linux/stddef.h>
2324
#include <linux/libc-compat.h>
2425
#include <linux/socket.h>
2526

tools/include/uapi/linux/stddef.h

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2+
#ifndef _LINUX_STDDEF_H
3+
#define _LINUX_STDDEF_H
4+
5+
6+
7+
#ifndef __always_inline
8+
#define __always_inline __inline__
9+
#endif
10+
11+
/**
12+
* __struct_group() - Create a mirrored named and anonyomous struct
13+
*
14+
* @TAG: The tag name for the named sub-struct (usually empty)
15+
* @NAME: The identifier name of the mirrored sub-struct
16+
* @ATTRS: Any struct attributes (usually empty)
17+
* @MEMBERS: The member declarations for the mirrored structs
18+
*
19+
* Used to create an anonymous union of two structs with identical layout
20+
* and size: one anonymous and one named. The former's members can be used
21+
* normally without sub-struct naming, and the latter can be used to
22+
* reason about the start, end, and size of the group of struct members.
23+
* The named struct can also be explicitly tagged for layer reuse, as well
24+
* as both having struct attributes appended.
25+
*/
26+
#define __struct_group(TAG, NAME, ATTRS, MEMBERS...) \
27+
union { \
28+
struct { MEMBERS } ATTRS; \
29+
struct TAG { MEMBERS } ATTRS NAME; \
30+
}
31+
32+
/**
33+
* __DECLARE_FLEX_ARRAY() - Declare a flexible array usable in a union
34+
*
35+
* @TYPE: The type of each flexible array element
36+
* @NAME: The name of the flexible array member
37+
*
38+
* In order to have a flexible array member in a union or alone in a
39+
* struct, it needs to be wrapped in an anonymous struct with at least 1
40+
* named member, but that member can be empty.
41+
*/
42+
#define __DECLARE_FLEX_ARRAY(TYPE, NAME) \
43+
struct { \
44+
struct { } __empty_ ## NAME; \
45+
TYPE NAME[]; \
46+
}
47+
#endif

0 commit comments

Comments
 (0)