2020-04-29 03:48:26

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v2 00/15] kbuild: support 'userprogs' syntax


Several Makefiles use 'hostprogs' to build programs for the host
architecture where it is not appropriate to do so.
This is just because Kbuild lacks the support for building programs
for the target architecture.

This series introduce 'userprogs' syntax and use it from
sample and bpf Makefiles.

Sam worked on this in 2014.
https://lkml.org/lkml/2014/7/13/154

He used 'uapiprogs-y' but I just thought the meaning of
"UAPI programs" is unclear.

Naming the syntax is one of the most difficult parts.

I chose 'userprogs'. Anothor choice I had in my mind was 'targetprogs'.

You can test this series quickly by 'make allmodconfig samples/'

When building objects for userspace, [U] is displayed.

masahiro@oscar:~/workspace/linux$ make allmodconfig samples/
[snip]
AR samples/vfio-mdev/built-in.a
CC [M] samples/vfio-mdev/mtty.o
CC [M] samples/vfio-mdev/mdpy.o
CC [M] samples/vfio-mdev/mdpy-fb.o
CC [M] samples/vfio-mdev/mbochs.o
AR samples/mei/built-in.a
CC [U] samples/mei/mei-amt-version
CC [U] samples/auxdisplay/cfag12864b-example
CC [M] samples/configfs/configfs_sample.o
CC [M] samples/connector/cn_test.o
CC [U] samples/connector/ucon
CC [M] samples/ftrace/ftrace-direct.o
CC [M] samples/ftrace/ftrace-direct-too.o
CC [M] samples/ftrace/ftrace-direct-modify.o
CC [M] samples/ftrace/sample-trace-array.o
CC [U] samples/hidraw/hid-example
CC [M] samples/hw_breakpoint/data_breakpoint.o
CC [M] samples/kdb/kdb_hello.o
CC [M] samples/kfifo/bytestream-example.o
CC [M] samples/kfifo/dma-example.o
CC [M] samples/kfifo/inttype-example.o
CC [M] samples/kfifo/record-example.o
CC [M] samples/kobject/kobject-example.o
CC [M] samples/kobject/kset-example.o
CC [M] samples/kprobes/kprobe_example.o
CC [M] samples/kprobes/kretprobe_example.o
CC [M] samples/livepatch/livepatch-sample.o
CC [M] samples/livepatch/livepatch-shadow-mod.o
CC [M] samples/livepatch/livepatch-shadow-fix1.o
CC [M] samples/livepatch/livepatch-shadow-fix2.o
CC [M] samples/livepatch/livepatch-callbacks-demo.o
CC [M] samples/livepatch/livepatch-callbacks-mod.o
CC [M] samples/livepatch/livepatch-callbacks-busymod.o
CC [M] samples/rpmsg/rpmsg_client_sample.o
CC [U] samples/seccomp/bpf-fancy.o
CC [U] samples/seccomp/bpf-helper.o
LD [U] samples/seccomp/bpf-fancy
CC [U] samples/seccomp/dropper
CC [U] samples/seccomp/bpf-direct
CC [U] samples/seccomp/user-trap
CC [U] samples/timers/hpet_example
CC [M] samples/trace_events/trace-events-sample.o
CC [M] samples/trace_printk/trace-printk.o
CC [U] samples/uhid/uhid-example
CC [M] samples/v4l/v4l2-pci-skeleton.o
CC [U] samples/vfs/test-fsmount
CC [U] samples/vfs/test-statx
samples/vfs/test-statx.c:24:15: warning: ‘struct foo’ declared inside parameter list will not be visible outside of this definition or declaration
24 | #define statx foo
| ^~~
CC [U] samples/watchdog/watchdog-simple
AR samples/built-in.a

Changes for v2:
- Fix ARCH=i386 build error for bpfilter_umh
- Rename 'user-ccflags' to 'userccflags'
because 'user-ccflags' would conflict if an object
called 'user.o' exists in the directory.
- Support 'userldflags'

Masahiro Yamada (14):
bpfilter: match bit size of bpfilter_umh to that of the kernel
kbuild: add infrastructure to build userspace programs
bpfilter: use 'userprogs' syntax to build bpfilter_umh
samples: seccomp: build sample programs for target architecture
kbuild: doc: document the new syntax 'userprogs'
samples: uhid: build sample program for target architecture
samples: hidraw: build sample program for target architecture
samples: connector: build sample program for target architecture
samples: vfs: build sample programs for target architecture
samples: pidfd: build sample program for target architecture
samples: mei: build sample program for target architecture
samples: auxdisplay: use 'userprogs' syntax
samples: timers: use 'userprogs' syntax
samples: watchdog: use 'userprogs' syntax

Sam Ravnborg (1):
samples: uhid: fix warnings in uhid-example

Documentation/kbuild/makefiles.rst | 183 +++++++++++++++++++++--------
Makefile | 13 +-
init/Kconfig | 4 +-
net/bpfilter/Makefile | 11 +-
samples/Kconfig | 26 +++-
samples/Makefile | 4 +
samples/auxdisplay/Makefile | 11 +-
samples/connector/Makefile | 12 +-
samples/hidraw/Makefile | 9 +-
samples/mei/Makefile | 9 +-
samples/pidfd/Makefile | 8 +-
samples/seccomp/Makefile | 42 +------
samples/timers/Makefile | 17 +--
samples/uhid/.gitignore | 2 +
samples/uhid/Makefile | 9 +-
samples/uhid/uhid-example.c | 4 +-
samples/vfs/Makefile | 11 +-
samples/watchdog/Makefile | 10 +-
scripts/Makefile.build | 6 +
scripts/Makefile.clean | 2 +-
scripts/Makefile.userprogs | 45 +++++++
usr/include/Makefile | 4 +
22 files changed, 267 insertions(+), 175 deletions(-)
create mode 100644 samples/uhid/.gitignore
create mode 100644 scripts/Makefile.userprogs

--
2.25.1


2020-04-29 03:48:26

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v2 02/15] kbuild: add infrastructure to build userspace programs

Kbuild supports the infrastructure to build host programs, but there
was no support to build userspace programs for the target architecture
(i.e. the same architecture as the kernel).

Sam Ravnborg worked on this in 2014 (https://lkml.org/lkml/2014/7/13/154),
but it was not merged. One problem at that time was, there was no good way
to know whether $(CC) can link standalone programs. In fact, pre-built
kernel.org toolchains [1] are often used for building the kernel, but they
do not provide libc.

Now, we can handle this cleanly because the compiler capability is
evaluated at the Kconfig time. If $(CC) cannot link standalone programs,
the relevant options are hidden by 'depends on CC_CAN_LINK'.

The implementation just mimics scripts/Makefile.host

The userspace programs are compiled with the same flags as the host
programs. In addition, it uses -m32 or -m64 if it is found in
$(KBUILD_CFLAGS).

This new syntax has two usecases.

- Sample programs

Several userspace programs under samples/ include UAPI headers
installed in usr/include. Most of them were previously built for
the host architecture just to use the 'hostprogs' syntax.

However, 'make headers' always works for the target architecture.
This caused the arch mismatch in cross-compiling. To fix this
distortion, sample code should be built for the target architecture.

- Bpfilter

net/bpfilter/Makefile compiles bpfilter_umh as the user mode helper,
and embeds it into the kernel. Currently, it overrides HOSTCC with
CC to use the 'hostprogs' syntax. This hack should go away.

[1]: https://mirrors.edge.kernel.org/pub/tools/crosstool/
Signed-off-by: Masahiro Yamada <[email protected]>
Acked-by: Sam Ravnborg <[email protected]>
---

Changes in v2:
- Rename 'user-ccflags' to 'userccflags'
We use '<base-filename>-ccflags' for the per-file flag.
'user-ccflags' would have a

Makefile | 13 ++++++++---
scripts/Makefile.build | 6 +++++
scripts/Makefile.clean | 2 +-
scripts/Makefile.userprogs | 45 ++++++++++++++++++++++++++++++++++++++
4 files changed, 62 insertions(+), 4 deletions(-)
create mode 100644 scripts/Makefile.userprogs

diff --git a/Makefile b/Makefile
index ee7773d5f4c9..9ff00bfe0575 100644
--- a/Makefile
+++ b/Makefile
@@ -406,9 +406,12 @@ else
HOSTCC = gcc
HOSTCXX = g++
endif
-KBUILD_HOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 \
- -fomit-frame-pointer -std=gnu89 $(HOST_LFS_CFLAGS) \
- $(HOSTCFLAGS)
+
+export KBUILD_USERCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes \
+ -O2 -fomit-frame-pointer -std=gnu89
+export KBUILD_USERLDFLAGS :=
+
+KBUILD_HOSTCFLAGS := $(KBUILD_USERCFLAGS) $(HOST_LFS_CFLAGS) $(HOSTCFLAGS)
KBUILD_HOSTCXXFLAGS := -Wall -O2 $(HOST_LFS_CFLAGS) $(HOSTCXXFLAGS)
KBUILD_HOSTLDFLAGS := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS)
KBUILD_HOSTLDLIBS := $(HOST_LFS_LIBS) $(HOSTLDLIBS)
@@ -937,6 +940,10 @@ ifeq ($(CONFIG_RELR),y)
LDFLAGS_vmlinux += --pack-dyn-relocs=relr
endif

+# Align the bit size of userspace programs with the kernel
+KBUILD_USERCFLAGS += $(filter -m32 -m64, $(KBUILD_CFLAGS))
+KBUILD_USERLDFLAGS += $(filter -m32 -m64, $(KBUILD_CFLAGS))
+
# make the checker run with the right architecture
CHECKFLAGS += --arch=$(ARCH)

diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index 9fcbfac15d1d..3665b1a0bc8e 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -50,6 +50,12 @@ ifneq ($(hostprogs)$(hostcxxlibs-y)$(hostcxxlibs-m),)
include scripts/Makefile.host
endif

+# Do not include userprogs rules unless needed.
+userprogs := $(sort $(userprogs))
+ifneq ($(userprogs),)
+include scripts/Makefile.userprogs
+endif
+
ifndef obj
$(warning kbuild: Makefile.build is included improperly)
endif
diff --git a/scripts/Makefile.clean b/scripts/Makefile.clean
index 075f0cc2d8d7..e2c76122319d 100644
--- a/scripts/Makefile.clean
+++ b/scripts/Makefile.clean
@@ -29,7 +29,7 @@ subdir-ymn := $(addprefix $(obj)/,$(subdir-ymn))

__clean-files := $(extra-y) $(extra-m) $(extra-) \
$(always) $(always-y) $(always-m) $(always-) $(targets) $(clean-files) \
- $(hostprogs) $(hostprogs-y) $(hostprogs-m) $(hostprogs-) \
+ $(hostprogs) $(hostprogs-y) $(hostprogs-m) $(hostprogs-) $(userprogs) \
$(hostcxxlibs-y) $(hostcxxlibs-m)

__clean-files := $(filter-out $(no-clean-files), $(__clean-files))
diff --git a/scripts/Makefile.userprogs b/scripts/Makefile.userprogs
new file mode 100644
index 000000000000..ebde030e7dd0
--- /dev/null
+++ b/scripts/Makefile.userprogs
@@ -0,0 +1,45 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# Build userspace programs for the target system
+#
+
+# Executables compiled from a single .c file
+user-csingle := $(foreach m, $(userprogs), $(if $($(m)-objs),,$(m)))
+
+# Executables linked based on several .o files
+user-cmulti := $(foreach m, $(userprogs), $(if $($(m)-objs),$(m)))
+
+# Objects compiled from .c files
+user-cobjs := $(sort $(foreach m, $(userprogs), $($(m)-objs)))
+
+user-csingle := $(addprefix $(obj)/, $(user-csingle))
+user-cmulti := $(addprefix $(obj)/, $(user-cmulti))
+user-cobjs := $(addprefix $(obj)/, $(user-cobjs))
+
+user_ccflags = -Wp,-MMD,$(depfile) $(KBUILD_USERCFLAGS) $(userccflags) \
+ $($(target-stem)-ccflags)
+user_ldflags = $(KBUILD_USERLDFLAGS) $(userldflags) $($(target-stem)-ldflags)
+
+# Create an executable from a single .c file
+quiet_cmd_user_cc_c = CC [U] $@
+ cmd_user_cc_c = $(CC) $(user_ccflags) $(user_ldflags) -o $@ $< \
+ $($(target-stem)-ldlibs)
+$(user-csingle): $(obj)/%: $(src)/%.c FORCE
+ $(call if_changed_dep,user_cc_c)
+
+# Link an executable based on list of .o files
+quiet_cmd_user_ld = LD [U] $@
+ cmd_user_ld = $(CC) $(user_ldflags) -o \
+ $@ $(addprefix $(obj)/, $($(target-stem)-objs)) \
+ $($(target-stem)-ldlibs)
+$(user-cmulti): FORCE
+ $(call if_changed,user_ld)
+$(call multi_depend, $(user-cmulti), , -objs)
+
+# Create .o file from a .c file
+quiet_cmd_user_cc_o_c = CC [U] $@
+ cmd_user_cc_o_c = $(CC) $(user_ccflags) -c -o $@ $<
+$(user-cobjs): $(obj)/%.o: $(src)/%.c FORCE
+ $(call if_changed_dep,user_cc_o_c)
+
+targets += $(user-csingle) $(user-cmulti) $(user-cobjs)
--
2.25.1

2020-04-29 03:48:41

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v2 12/15] samples: mei: build sample program for target architecture

This userspace program includes UAPI headers exported to usr/include/.
'make headers' always works for the target architecture (i.e. the same
architecture as the kernel), so the sample program should be built for
the target as well. Kbuild now supports 'userprogs' for that.

I also guarded the CONFIG option by 'depends on CC_CAN_LINK' because
$(CC) may not provide libc.

Signed-off-by: Masahiro Yamada <[email protected]>
Acked-by: Sam Ravnborg <[email protected]>
---

Changes in v2: None

samples/Kconfig | 1 +
samples/mei/Makefile | 9 +++------
2 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/samples/Kconfig b/samples/Kconfig
index c68d391c0602..69699db49675 100644
--- a/samples/Kconfig
+++ b/samples/Kconfig
@@ -193,6 +193,7 @@ config SAMPLE_VFS
config SAMPLE_INTEL_MEI
bool "Build example program working with intel mei driver"
depends on INTEL_MEI
+ depends on CC_CAN_LINK && HEADERS_INSTALL
help
Build a sample program to work with mei device.

diff --git a/samples/mei/Makefile b/samples/mei/Makefile
index f5b9d02be2cd..329411f82369 100644
--- a/samples/mei/Makefile
+++ b/samples/mei/Makefile
@@ -1,10 +1,7 @@
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2012-2019, Intel Corporation. All rights reserved.

-hostprogs := mei-amt-version
+userprogs := mei-amt-version
+always-y := $(userprogs)

-HOSTCFLAGS_mei-amt-version.o += -I$(objtree)/usr/include
-
-always-y := $(hostprogs)
-
-all: mei-amt-version
+userccflags += -I usr/include
--
2.25.1

2020-04-29 03:48:49

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v2 14/15] samples: timers: use 'userprogs' syntax

Kbuild now supports the 'userprogs' syntax to compile userspace
programs for the same architecture as the kernel.

Add the entry to samples/Makefile to put this into the build bot
coverage.

I also added the CONFIG option guarded by 'depends on CC_CAN_LINK'
because $(CC) may not provide libc.

Signed-off-by: Masahiro Yamada <[email protected]>
Acked-by: Sam Ravnborg <[email protected]>
---

Changes in v2: None

samples/Kconfig | 4 ++++
samples/Makefile | 1 +
samples/timers/Makefile | 17 +++--------------
3 files changed, 8 insertions(+), 14 deletions(-)

diff --git a/samples/Kconfig b/samples/Kconfig
index 2322e11e8b80..a8629a0d4f96 100644
--- a/samples/Kconfig
+++ b/samples/Kconfig
@@ -135,6 +135,10 @@ config SAMPLE_SECCOMP
Build samples of seccomp filters using various methods of
BPF filter construction.

+config SAMPLE_TIMER
+ bool "Timer sample"
+ depends on CC_CAN_LINK && HEADERS_INSTALL
+
config SAMPLE_UHID
bool "UHID sample"
depends on CC_CAN_LINK && HEADERS_INSTALL
diff --git a/samples/Makefile b/samples/Makefile
index 0c43b5d34b15..042208326689 100644
--- a/samples/Makefile
+++ b/samples/Makefile
@@ -16,6 +16,7 @@ subdir-$(CONFIG_SAMPLE_PIDFD) += pidfd
obj-$(CONFIG_SAMPLE_QMI_CLIENT) += qmi/
obj-$(CONFIG_SAMPLE_RPMSG_CLIENT) += rpmsg/
subdir-$(CONFIG_SAMPLE_SECCOMP) += seccomp
+subdir-$(CONFIG_SAMPLE_TIMER) += timers
obj-$(CONFIG_SAMPLE_TRACE_EVENTS) += trace_events/
obj-$(CONFIG_SAMPLE_TRACE_PRINTK) += trace_printk/
obj-$(CONFIG_SAMPLE_FTRACE_DIRECT) += ftrace/
diff --git a/samples/timers/Makefile b/samples/timers/Makefile
index f9fa07460802..15c7ddbc8c51 100644
--- a/samples/timers/Makefile
+++ b/samples/timers/Makefile
@@ -1,16 +1,5 @@
# SPDX-License-Identifier: GPL-2.0
-ifndef CROSS_COMPILE
-uname_M := $(shell uname -m 2>/dev/null || echo not)
-ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/x86/ -e s/x86_64/x86/)
+userprogs := hpet_example
+always-y := $(userprogs)

-ifeq ($(ARCH),x86)
-CC := $(CROSS_COMPILE)gcc
-PROGS := hpet_example
-
-all: $(PROGS)
-
-clean:
- rm -fr $(PROGS)
-
-endif
-endif
+userccflags += -I usr/include
--
2.25.1

2020-04-29 03:48:53

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v2 13/15] samples: auxdisplay: use 'userprogs' syntax

Kbuild now supports the 'userprogs' syntax to compile userspace
programs for the same architecture as the kernel.

Add the entry to samples/Makefile to put this into the build bot
coverage.

I also added the CONFIG option guarded by 'depends on CC_CAN_LINK'
because $(CC) may not provide libc.

Signed-off-by: Masahiro Yamada <[email protected]>
Acked-by: Miguel Ojeda <[email protected]>
Acked-by: Sam Ravnborg <[email protected]>
---

Changes in v2: None

samples/Kconfig | 4 ++++
samples/Makefile | 1 +
samples/auxdisplay/Makefile | 11 ++---------
3 files changed, 7 insertions(+), 9 deletions(-)

diff --git a/samples/Kconfig b/samples/Kconfig
index 69699db49675..2322e11e8b80 100644
--- a/samples/Kconfig
+++ b/samples/Kconfig
@@ -6,6 +6,10 @@ menuconfig SAMPLES

if SAMPLES

+config SAMPLE_AUXDISPLAY
+ bool "auxdisplay sample"
+ depends on CC_CAN_LINK
+
config SAMPLE_TRACE_EVENTS
tristate "Build trace_events examples -- loadable modules only"
depends on EVENT_TRACING && m
diff --git a/samples/Makefile b/samples/Makefile
index bdc168405452..0c43b5d34b15 100644
--- a/samples/Makefile
+++ b/samples/Makefile
@@ -1,6 +1,7 @@
# SPDX-License-Identifier: GPL-2.0
# Makefile for Linux samples code

+subdir-$(CONFIG_SAMPLE_AUXDISPLAY) += auxdisplay
obj-$(CONFIG_SAMPLE_ANDROID_BINDERFS) += binderfs/
obj-$(CONFIG_SAMPLE_CONFIGFS) += configfs/
obj-$(CONFIG_SAMPLE_CONNECTOR) += connector/
diff --git a/samples/auxdisplay/Makefile b/samples/auxdisplay/Makefile
index 0273bab27233..dbdf939af94a 100644
--- a/samples/auxdisplay/Makefile
+++ b/samples/auxdisplay/Makefile
@@ -1,10 +1,3 @@
# SPDX-License-Identifier: GPL-2.0
-CC := $(CROSS_COMPILE)gcc
-CFLAGS := -I../../usr/include
-
-PROGS := cfag12864b-example
-
-all: $(PROGS)
-
-clean:
- rm -fr $(PROGS)
+userprogs := cfag12864b-example
+always-y := $(userprogs)
--
2.25.1

2020-04-29 03:48:54

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v2 10/15] samples: vfs: build sample programs for target architecture

These userspace programs include UAPI headers exported to usr/include/.
'make headers' always works for the target architecture (i.e. the same
architecture as the kernel), so the sample programs should be built for
the target as well. Kbuild now supports 'userprogs' for that.

I also guarded the CONFIG option by 'depends on CC_CAN_LINK' because
$(CC) may not provide libc.

Signed-off-by: Masahiro Yamada <[email protected]>
Acked-by: Sam Ravnborg <[email protected]>
---

Changes in v2: None

samples/Kconfig | 2 +-
samples/vfs/Makefile | 11 +++--------
2 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/samples/Kconfig b/samples/Kconfig
index 08f2d025ca05..831a7ecd3352 100644
--- a/samples/Kconfig
+++ b/samples/Kconfig
@@ -184,7 +184,7 @@ config SAMPLE_ANDROID_BINDERFS

config SAMPLE_VFS
bool "Build example programs that use new VFS system calls"
- depends on HEADERS_INSTALL
+ depends on CC_CAN_LINK && HEADERS_INSTALL
help
Build example userspace programs that use new VFS system calls such
as mount API and statx(). Note that this is restricted to the x86
diff --git a/samples/vfs/Makefile b/samples/vfs/Makefile
index 65acdde5c117..00b6824f9237 100644
--- a/samples/vfs/Makefile
+++ b/samples/vfs/Makefile
@@ -1,10 +1,5 @@
# SPDX-License-Identifier: GPL-2.0-only
-# List of programs to build
-hostprogs := \
- test-fsmount \
- test-statx
+userprogs := test-fsmount test-statx
+always-y := $(userprogs)

-always-y := $(hostprogs)
-
-HOSTCFLAGS_test-fsmount.o += -I$(objtree)/usr/include
-HOSTCFLAGS_test-statx.o += -I$(objtree)/usr/include
+userccflags += -I usr/include
--
2.25.1

2020-04-29 03:48:57

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v2 15/15] samples: watchdog: use 'userprogs' syntax

Kbuild now supports the 'userprogs' syntax to compile userspace
programs for the same architecture as the kernel.

Add the entry to samples/Makefile to put this into the build bot
coverage.

I also added the CONFIG option guarded by 'depends on CC_CAN_LINK'
because $(CC) may not provide libc.

Signed-off-by: Masahiro Yamada <[email protected]>
Acked-by: Sam Ravnborg <[email protected]>
---

Changes in v2: None

samples/Kconfig | 3 +++
samples/Makefile | 1 +
samples/watchdog/Makefile | 10 ++--------
3 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/samples/Kconfig b/samples/Kconfig
index a8629a0d4f96..5005f74ac0eb 100644
--- a/samples/Kconfig
+++ b/samples/Kconfig
@@ -205,5 +205,8 @@ config SAMPLE_INTEL_MEI
help
Build a sample program to work with mei device.

+config SAMPLE_WATCHDOG
+ bool "watchdog sample"
+ depends on CC_CAN_LINK

endif # SAMPLES
diff --git a/samples/Makefile b/samples/Makefile
index 042208326689..29c66aadd954 100644
--- a/samples/Makefile
+++ b/samples/Makefile
@@ -26,3 +26,4 @@ obj-$(CONFIG_VIDEO_PCI_SKELETON) += v4l/
obj-y += vfio-mdev/
subdir-$(CONFIG_SAMPLE_VFS) += vfs
obj-$(CONFIG_SAMPLE_INTEL_MEI) += mei/
+subdir-$(CONFIG_SAMPLE_WATCHDOG) += watchdog
diff --git a/samples/watchdog/Makefile b/samples/watchdog/Makefile
index a9430fa60253..17384cfb387e 100644
--- a/samples/watchdog/Makefile
+++ b/samples/watchdog/Makefile
@@ -1,9 +1,3 @@
# SPDX-License-Identifier: GPL-2.0
-CC := $(CROSS_COMPILE)gcc
-PROGS := watchdog-simple
-
-all: $(PROGS)
-
-clean:
- rm -fr $(PROGS)
-
+userprogs := watchdog-simple
+always-y := $(userprogs)
--
2.25.1

2020-04-29 03:49:01

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v2 11/15] samples: pidfd: build sample program for target architecture

This userspace program includes UAPI headers exported to usr/include/.
'make headers' always works for the target architecture (i.e. the same
architecture as the kernel), so the sample program should be built for
the target as well. Kbuild now supports 'userprogs' for that.

I also guarded the CONFIG option by 'depends on CC_CAN_LINK' because
$(CC) may not provide libc.

Signed-off-by: Masahiro Yamada <[email protected]>
Acked-by: Sam Ravnborg <[email protected]>
---

Changes in v2: None

samples/Kconfig | 2 +-
samples/pidfd/Makefile | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/samples/Kconfig b/samples/Kconfig
index 831a7ecd3352..c68d391c0602 100644
--- a/samples/Kconfig
+++ b/samples/Kconfig
@@ -122,7 +122,7 @@ config SAMPLE_HIDRAW

config SAMPLE_PIDFD
bool "pidfd sample"
- depends on HEADERS_INSTALL
+ depends on CC_CAN_LINK && HEADERS_INSTALL

config SAMPLE_SECCOMP
bool "Build seccomp sample code"
diff --git a/samples/pidfd/Makefile b/samples/pidfd/Makefile
index ee2979849d92..6e5b67e648c2 100644
--- a/samples/pidfd/Makefile
+++ b/samples/pidfd/Makefile
@@ -1,6 +1,6 @@
# SPDX-License-Identifier: GPL-2.0

-hostprogs := pidfd-metadata
-always-y := $(hostprogs)
-HOSTCFLAGS_pidfd-metadata.o += -I$(objtree)/usr/include
-all: pidfd-metadata
+usertprogs := pidfd-metadata
+always-y := $(userprogs)
+
+userccflags += -I usr/include
--
2.25.1

2020-04-29 03:49:24

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v2 04/15] samples: seccomp: build sample programs for target architecture

These userspace programs include UAPI headers exported to usr/include/.
'make headers' always works for the target architecture (i.e. the same
architecture as the kernel), so the sample programs should be built for
the target as well. Kbuild now supports 'userprogs' for that.

I also guarded the CONFIG option by 'depends on CC_CAN_LINK' because
$(CC) may not provide libc.

The 'ifndef CROSS_COMPILE' is no longer needed.

BTW, the -m31 for s390 is left-over code. Commit 5a79859ae0f3 ("s390:
remove 31 bit support") killed it.

Signed-off-by: Masahiro Yamada <[email protected]>
Acked-by: Sam Ravnborg <[email protected]>
---

Changes in v2: None

samples/Kconfig | 2 +-
samples/seccomp/Makefile | 42 +++-------------------------------------
2 files changed, 4 insertions(+), 40 deletions(-)

diff --git a/samples/Kconfig b/samples/Kconfig
index 9d236c346de5..8949e9646125 100644
--- a/samples/Kconfig
+++ b/samples/Kconfig
@@ -126,7 +126,7 @@ config SAMPLE_PIDFD

config SAMPLE_SECCOMP
bool "Build seccomp sample code"
- depends on SECCOMP_FILTER && HEADERS_INSTALL
+ depends on SECCOMP_FILTER && CC_CAN_LINK && HEADERS_INSTALL
help
Build samples of seccomp filters using various methods of
BPF filter construction.
diff --git a/samples/seccomp/Makefile b/samples/seccomp/Makefile
index 89279e8b87df..75916c23e416 100644
--- a/samples/seccomp/Makefile
+++ b/samples/seccomp/Makefile
@@ -1,44 +1,8 @@
# SPDX-License-Identifier: GPL-2.0
-ifndef CROSS_COMPILE
-hostprogs := bpf-fancy dropper bpf-direct user-trap
+userprogs := bpf-fancy dropper bpf-direct user-trap

-HOSTCFLAGS_bpf-fancy.o += -I$(objtree)/usr/include
-HOSTCFLAGS_bpf-fancy.o += -idirafter $(objtree)/include
-HOSTCFLAGS_bpf-helper.o += -I$(objtree)/usr/include
-HOSTCFLAGS_bpf-helper.o += -idirafter $(objtree)/include
bpf-fancy-objs := bpf-fancy.o bpf-helper.o

-HOSTCFLAGS_dropper.o += -I$(objtree)/usr/include
-HOSTCFLAGS_dropper.o += -idirafter $(objtree)/include
-dropper-objs := dropper.o
+userccflags += -I usr/include

-HOSTCFLAGS_bpf-direct.o += -I$(objtree)/usr/include
-HOSTCFLAGS_bpf-direct.o += -idirafter $(objtree)/include
-bpf-direct-objs := bpf-direct.o
-
-HOSTCFLAGS_user-trap.o += -I$(objtree)/usr/include
-HOSTCFLAGS_user-trap.o += -idirafter $(objtree)/include
-user-trap-objs := user-trap.o
-
-# Try to match the kernel target.
-ifndef CONFIG_64BIT
-
-# s390 has -m31 flag to build 31 bit binaries
-ifndef CONFIG_S390
-MFLAG = -m32
-else
-MFLAG = -m31
-endif
-
-HOSTCFLAGS_bpf-direct.o += $(MFLAG)
-HOSTCFLAGS_dropper.o += $(MFLAG)
-HOSTCFLAGS_bpf-helper.o += $(MFLAG)
-HOSTCFLAGS_bpf-fancy.o += $(MFLAG)
-HOSTCFLAGS_user-trap.o += $(MFLAG)
-HOSTLDLIBS_bpf-direct += $(MFLAG)
-HOSTLDLIBS_bpf-fancy += $(MFLAG)
-HOSTLDLIBS_dropper += $(MFLAG)
-HOSTLDLIBS_user-trap += $(MFLAG)
-endif
-always-y := $(hostprogs)
-endif
+always-y := $(userprogs)
--
2.25.1

2020-04-29 03:49:30

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v2 07/15] samples: uhid: build sample program for target architecture

This userspace program includes UAPI headers exported to usr/include/.
'make headers' always works for the target architecture (i.e. the same
architecture as the kernel), so the sample program should be built for
the target as well. Kbuild now supports 'userprogs' for that.

Add the entry to samples/Makefile to put this into the build bot
coverage.

I also added the CONFIG option guarded by 'depends on CC_CAN_LINK'
because $(CC) may not provide libc.

Signed-off-by: Masahiro Yamada <[email protected]>
Acked-by: Sam Ravnborg <[email protected]>
---

Changes in v2: None

samples/Kconfig | 6 ++++++
samples/Makefile | 1 +
samples/uhid/.gitignore | 2 ++
samples/uhid/Makefile | 9 +++------
4 files changed, 12 insertions(+), 6 deletions(-)
create mode 100644 samples/uhid/.gitignore

diff --git a/samples/Kconfig b/samples/Kconfig
index 8949e9646125..2560e87c9cae 100644
--- a/samples/Kconfig
+++ b/samples/Kconfig
@@ -131,6 +131,12 @@ config SAMPLE_SECCOMP
Build samples of seccomp filters using various methods of
BPF filter construction.

+config SAMPLE_UHID
+ bool "UHID sample"
+ depends on CC_CAN_LINK && HEADERS_INSTALL
+ help
+ Build UHID sample program.
+
config SAMPLE_VFIO_MDEV_MTTY
tristate "Build VFIO mtty example mediated device sample code -- loadable modules only"
depends on VFIO_MDEV_DEVICE && m
diff --git a/samples/Makefile b/samples/Makefile
index 5ce50ef0f2b2..bdc168405452 100644
--- a/samples/Makefile
+++ b/samples/Makefile
@@ -19,6 +19,7 @@ obj-$(CONFIG_SAMPLE_TRACE_EVENTS) += trace_events/
obj-$(CONFIG_SAMPLE_TRACE_PRINTK) += trace_printk/
obj-$(CONFIG_SAMPLE_FTRACE_DIRECT) += ftrace/
obj-$(CONFIG_SAMPLE_TRACE_ARRAY) += ftrace/
+subdir-$(CONFIG_SAMPLE_UHID) += uhid
obj-$(CONFIG_VIDEO_PCI_SKELETON) += v4l/
obj-y += vfio-mdev/
subdir-$(CONFIG_SAMPLE_VFS) += vfs
diff --git a/samples/uhid/.gitignore b/samples/uhid/.gitignore
new file mode 100644
index 000000000000..0e0a5a929f5d
--- /dev/null
+++ b/samples/uhid/.gitignore
@@ -0,0 +1,2 @@
+# SPDX-License-Identifier: GPL-2.0-only
+/uhid-example
diff --git a/samples/uhid/Makefile b/samples/uhid/Makefile
index 5f44ea40d6d5..9e652fc34103 100644
--- a/samples/uhid/Makefile
+++ b/samples/uhid/Makefile
@@ -1,8 +1,5 @@
# SPDX-License-Identifier: GPL-2.0-only
-# List of programs to build
-hostprogs := uhid-example
+userprogs := uhid-example
+always-y := $(userprogs)

-# Tell kbuild to always build the programs
-always-y := $(hostprogs)
-
-HOSTCFLAGS_uhid-example.o += -I$(objtree)/usr/include
+userccflags += -I usr/include
--
2.25.1

2020-04-29 03:50:15

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v2 08/15] samples: hidraw: build sample program for target architecture

This userspace program includes UAPI headers exported to usr/include/.
'make headers' always works for the target architecture (i.e. the same
architecture as the kernel), so the sample program should be built for
the target as well. Kbuild now supports 'userprogs' for that.

I also guarded the CONFIG option by 'depends on CC_CAN_LINK' because
$(CC) may not provide libc.

Signed-off-by: Masahiro Yamada <[email protected]>
Acked-by: Sam Ravnborg <[email protected]>
---

Changes in v2: None

samples/Kconfig | 2 +-
samples/hidraw/Makefile | 9 +++------
2 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/samples/Kconfig b/samples/Kconfig
index 2560e87c9cae..08f2d025ca05 100644
--- a/samples/Kconfig
+++ b/samples/Kconfig
@@ -118,7 +118,7 @@ config SAMPLE_CONNECTOR

config SAMPLE_HIDRAW
bool "hidraw sample"
- depends on HEADERS_INSTALL
+ depends on CC_CAN_LINK && HEADERS_INSTALL

config SAMPLE_PIDFD
bool "pidfd sample"
diff --git a/samples/hidraw/Makefile b/samples/hidraw/Makefile
index 8bd25f77671f..d2c77ed60b39 100644
--- a/samples/hidraw/Makefile
+++ b/samples/hidraw/Makefile
@@ -1,8 +1,5 @@
# SPDX-License-Identifier: GPL-2.0
-# List of programs to build
-hostprogs := hid-example
-always-y := $(hostprogs)
+userprogs := hid-example
+always-y := $(userprogs)

-HOSTCFLAGS_hid-example.o += -I$(objtree)/usr/include
-
-all: hid-example
+userccflags += -I usr/include
--
2.25.1

2020-04-29 03:50:22

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v2 06/15] samples: uhid: fix warnings in uhid-example

From: Sam Ravnborg <[email protected]>

Fix warnings seen when building for 32-bit architecture.

Use "%xd" for arguments of type size_t to fix the warnings.

Signed-off-by: Sam Ravnborg <[email protected]>
Signed-off-by: Masahiro Yamada <[email protected]>
---

Changes in v2: None

samples/uhid/uhid-example.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/samples/uhid/uhid-example.c b/samples/uhid/uhid-example.c
index b72d645ce828..015cb06a241e 100644
--- a/samples/uhid/uhid-example.c
+++ b/samples/uhid/uhid-example.c
@@ -165,7 +165,7 @@ static int uhid_write(int fd, const struct uhid_event *ev)
fprintf(stderr, "Cannot write to uhid: %m\n");
return -errno;
} else if (ret != sizeof(*ev)) {
- fprintf(stderr, "Wrong size written to uhid: %ld != %lu\n",
+ fprintf(stderr, "Wrong size written to uhid: %zd != %zu\n",
ret, sizeof(ev));
return -EFAULT;
} else {
@@ -236,7 +236,7 @@ static int event(int fd)
fprintf(stderr, "Cannot read uhid-cdev: %m\n");
return -errno;
} else if (ret != sizeof(ev)) {
- fprintf(stderr, "Invalid size read from uhid-dev: %ld != %lu\n",
+ fprintf(stderr, "Invalid size read from uhid-dev: %zd != %zu\n",
ret, sizeof(ev));
return -EFAULT;
}
--
2.25.1

2020-04-29 03:51:13

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v2 09/15] samples: connector: build sample program for target architecture

This userspace program includes UAPI headers exported to usr/include/.
'make headers' always works for the target architecture (i.e. the same
architecture as the kernel), so the sample program should be built for
the target as well. Kbuild now supports 'userprogs' for that.

$(CC) can always compile cn_text.o since it is the kenrel-space code,
but building ucon requires libc.

I guarded it by:

always-$(CONFIG_CC_CAN_LINK) := $(userprogs)

Signed-off-by: Masahiro Yamada <[email protected]>
Acked-by: Sam Ravnborg <[email protected]>
---

Changes in v2: None

samples/connector/Makefile | 12 +++---------
1 file changed, 3 insertions(+), 9 deletions(-)

diff --git a/samples/connector/Makefile b/samples/connector/Makefile
index b785cbde5ffa..50cb40e09a7b 100644
--- a/samples/connector/Makefile
+++ b/samples/connector/Makefile
@@ -1,13 +1,7 @@
# SPDX-License-Identifier: GPL-2.0
obj-$(CONFIG_SAMPLE_CONNECTOR) += cn_test.o

-# List of programs to build
-hostprogs := ucon
-always-y := $(hostprogs)
+userprogs := ucon
+always-$(CONFIG_CC_CAN_LINK) := $(userprogs)

-HOSTCFLAGS_ucon.o += -I$(objtree)/usr/include
-
-all: modules
-
-modules clean:
- $(MAKE) -C ../.. M=$(CURDIR) $@
+userccflags += -I usr/include
--
2.25.1

2020-04-29 03:51:51

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v2 05/15] kbuild: doc: document the new syntax 'userprogs'

Kbuild now supports the syntax 'userprogs' to compile userspace
programs for the same architecture as the kernel.

Insert the section '5 Userspace Program support' to explain it.

I copy-pasted '4 Host Program support' and fixed it up.

Signed-off-by: Masahiro Yamada <[email protected]>
Acked-by: Sam Ravnborg <[email protected]>
---

Changes in v2: None

Documentation/kbuild/makefiles.rst | 183 +++++++++++++++++++++--------
1 file changed, 135 insertions(+), 48 deletions(-)

diff --git a/Documentation/kbuild/makefiles.rst b/Documentation/kbuild/makefiles.rst
index b80257a03830..234492351031 100644
--- a/Documentation/kbuild/makefiles.rst
+++ b/Documentation/kbuild/makefiles.rst
@@ -29,31 +29,37 @@ This document describes the Linux kernel Makefiles.
--- 4.4 Controlling compiler options for host programs
--- 4.5 When host programs are actually built

- === 5 Kbuild clean infrastructure
-
- === 6 Architecture Makefiles
- --- 6.1 Set variables to tweak the build to the architecture
- --- 6.2 Add prerequisites to archheaders:
- --- 6.3 Add prerequisites to archprepare:
- --- 6.4 List directories to visit when descending
- --- 6.5 Architecture-specific boot images
- --- 6.6 Building non-kbuild targets
- --- 6.7 Commands useful for building a boot image
- --- 6.8 Custom kbuild commands
- --- 6.9 Preprocessing linker scripts
- --- 6.10 Generic header files
- --- 6.11 Post-link pass
-
- === 7 Kbuild syntax for exported headers
- --- 7.1 no-export-headers
- --- 7.2 generic-y
- --- 7.3 generated-y
- --- 7.4 mandatory-y
-
- === 8 Kbuild Variables
- === 9 Makefile language
- === 10 Credits
- === 11 TODO
+ === 5 Userspace Program support
+ --- 5.1 Simple Userspace Program
+ --- 5.2 Composite Userspace Programs
+ --- 5.3 Controlling compiler options for userspace programs
+ --- 5.4 When userspace programs are actually built
+
+ === 6 Kbuild clean infrastructure
+
+ === 7 Architecture Makefiles
+ --- 7.1 Set variables to tweak the build to the architecture
+ --- 7.2 Add prerequisites to archheaders:
+ --- 7.3 Add prerequisites to archprepare:
+ --- 7.4 List directories to visit when descending
+ --- 7.5 Architecture-specific boot images
+ --- 7.6 Building non-kbuild targets
+ --- 7.7 Commands useful for building a boot image
+ --- 7.8 Custom kbuild commands
+ --- 7.9 Preprocessing linker scripts
+ --- 7.10 Generic header files
+ --- 7.11 Post-link pass
+
+ === 8 Kbuild syntax for exported headers
+ --- 8.1 no-export-headers
+ --- 8.2 generic-y
+ --- 8.3 generated-y
+ --- 8.4 mandatory-y
+
+ === 9 Kbuild Variables
+ === 10 Makefile language
+ === 11 Credits
+ === 12 TODO

1 Overview
==========
@@ -732,7 +738,88 @@ Both possibilities are described in the following.
This will tell kbuild to build lxdialog even if not referenced in
any rule.

-5 Kbuild clean infrastructure
+5 Userspace Program support
+===========================
+
+Just like host programs, Kbuild also supports building userspace executables
+for the target architecture (i.e. the same architecture as you are building
+the kernel for).
+
+The syntax is quite similar. The difference is to use "userprogs" instead of
+"hostprogs".
+
+5.1 Simple Userspace Program
+----------------------------
+
+ The following line tells kbuild that the program bpf-direct shall be
+ built for the target architecture.
+
+ Example::
+
+ userprogs := bpf-direct
+
+ Kbuild assumes in the above example that bpf-direct is made from a
+ single C source file named bpf-direct.c located in the same directory
+ as the Makefile.
+
+5.2 Composite Userspace Programs
+--------------------------------
+
+ Userspace programs can be made up based on composite objects.
+ The syntax used to define composite objects for userspace programs is
+ similar to the syntax used for kernel objects.
+ $(<executable>-objs) lists all objects used to link the final
+ executable.
+
+ Example::
+
+ #samples/seccomp/Makefile
+ userprogs := bpf-fancy
+ bpf-fancy-objs := bpf-fancy.o bpf-helper.o
+
+ Objects with extension .o are compiled from the corresponding .c
+ files. In the above example, bpf-fancy.c is compiled to bpf-fancy.o
+ and bpf-helper.c is compiled to bpf-helper.o.
+
+ Finally, the two .o files are linked to the executable, bpf-fancy.
+ Note: The syntax <executable>-y is not permitted for userspace programs.
+
+5.3 Controlling compiler options for userspace programs
+-------------------------------------------------------
+
+ When compiling userspace programs, it is possible to set specific flags.
+ The programs will always be compiled utilising $(CC) passed
+ the options specified in $(KBUILD_USERCFLAGS).
+ To set flags that will take effect for all userspace programs created
+ in that Makefile, use the variable userccflags.
+
+ Example::
+
+ # samples/seccomp/Makefile
+ userccflags += -I usr/include
+
+ To set specific flags for a single file the following construction
+ is used:
+
+ Example::
+
+ bpf-helper-ccflags += -I user/include
+
+ It is also possible to specify additional options to the linker.
+
+ Example::
+
+ # net/bpfilter/Makefile
+ bpfilter_umh-ldflags += -static
+
+ When linking bpfilter_umh, it will be passed the extra option -static.
+
+5.4 When userspace programs are actually built
+----------------------------------------------
+
+ Same as "When host programs are actually built".
+
+6 Kbuild clean infrastructure
=============================

"make clean" deletes most generated files in the obj tree where the kernel
@@ -790,7 +877,7 @@ is not operational at that point.
Note 2: All directories listed in core-y, libs-y, drivers-y and net-y will
be visited during "make clean".

-6 Architecture Makefiles
+7 Architecture Makefiles
========================

The top level Makefile sets up the environment and does the preparation,
@@ -820,7 +907,7 @@ When kbuild executes, the following steps are followed (roughly):
- Preparing initrd images and the like


-6.1 Set variables to tweak the build to the architecture
+7.1 Set variables to tweak the build to the architecture
--------------------------------------------------------

LDFLAGS
@@ -967,7 +1054,7 @@ When kbuild executes, the following steps are followed (roughly):
KBUILD_VMLINUX_LIBS together specify all the object files used to
link vmlinux.

-6.2 Add prerequisites to archheaders
+7.2 Add prerequisites to archheaders
------------------------------------

The archheaders: rule is used to generate header files that
@@ -977,7 +1064,7 @@ When kbuild executes, the following steps are followed (roughly):
architecture itself.


-6.3 Add prerequisites to archprepare
+7.3 Add prerequisites to archprepare
------------------------------------

The archprepare: rule is used to list prerequisites that need to be
@@ -995,7 +1082,7 @@ When kbuild executes, the following steps are followed (roughly):
generating offset header files.


-6.4 List directories to visit when descending
+7.4 List directories to visit when descending
---------------------------------------------

An arch Makefile cooperates with the top Makefile to define variables
@@ -1030,7 +1117,7 @@ When kbuild executes, the following steps are followed (roughly):
drivers-$(CONFIG_OPROFILE) += arch/sparc64/oprofile/


-6.5 Architecture-specific boot images
+7.5 Architecture-specific boot images
-------------------------------------

An arch Makefile specifies goals that take the vmlinux file, compress
@@ -1085,7 +1172,7 @@ When kbuild executes, the following steps are followed (roughly):

When "make" is executed without arguments, bzImage will be built.

-6.6 Building non-kbuild targets
+7.6 Building non-kbuild targets
-------------------------------

extra-y
@@ -1108,7 +1195,7 @@ When kbuild executes, the following steps are followed (roughly):
In this example, extra-y is used to list object files that
shall be built, but shall not be linked as part of built-in.a.

-6.7 Commands useful for building a boot image
+7.7 Commands useful for building a boot image
---------------------------------------------

Kbuild provides a few macros that are useful when building a
@@ -1211,7 +1298,7 @@ When kbuild executes, the following steps are followed (roughly):
targets += $(dtb-y)
DTC_FLAGS ?= -p 1024

-6.8 Custom kbuild commands
+7.8 Custom kbuild commands
--------------------------

When kbuild is executing with KBUILD_VERBOSE=0, then only a shorthand
@@ -1241,7 +1328,7 @@ When kbuild executes, the following steps are followed (roughly):
will be displayed with "make KBUILD_VERBOSE=0".


-6.9 Preprocessing linker scripts
+7.9 Preprocessing linker scripts
--------------------------------

When the vmlinux image is built, the linker script
@@ -1274,7 +1361,7 @@ When kbuild executes, the following steps are followed (roughly):
The kbuild infrastructure for `*lds` files is used in several
architecture-specific files.

-6.10 Generic header files
+7.10 Generic header files
-------------------------

The directory include/asm-generic contains the header files
@@ -1283,7 +1370,7 @@ When kbuild executes, the following steps are followed (roughly):
to list the file in the Kbuild file.
See "7.2 generic-y" for further info on syntax etc.

-6.11 Post-link pass
+7.11 Post-link pass
-------------------

If the file arch/xxx/Makefile.postlink exists, this makefile
@@ -1299,7 +1386,7 @@ When kbuild executes, the following steps are followed (roughly):
For example, powerpc uses this to check relocation sanity of
the linked vmlinux file.

-7 Kbuild syntax for exported headers
+8 Kbuild syntax for exported headers
------------------------------------

The kernel includes a set of headers that is exported to userspace.
@@ -1319,14 +1406,14 @@ A Kbuild file may be defined under arch/<arch>/include/uapi/asm/ and
arch/<arch>/include/asm/ to list asm files coming from asm-generic.
See subsequent chapter for the syntax of the Kbuild file.

-7.1 no-export-headers
+8.1 no-export-headers
---------------------

no-export-headers is essentially used by include/uapi/linux/Kbuild to
avoid exporting specific headers (e.g. kvm.h) on architectures that do
not support it. It should be avoided as much as possible.

-7.2 generic-y
+8.2 generic-y
-------------

If an architecture uses a verbatim copy of a header from
@@ -1356,7 +1443,7 @@ See subsequent chapter for the syntax of the Kbuild file.

#include <asm-generic/termios.h>

-7.3 generated-y
+8.3 generated-y
---------------

If an architecture generates other header files alongside generic-y
@@ -1370,7 +1457,7 @@ See subsequent chapter for the syntax of the Kbuild file.
#arch/x86/include/asm/Kbuild
generated-y += syscalls_32.h

-7.4 mandatory-y
+8.4 mandatory-y
---------------

mandatory-y is essentially used by include/(uapi/)asm-generic/Kbuild
@@ -1380,7 +1467,7 @@ See subsequent chapter for the syntax of the Kbuild file.
in arch/$(ARCH)/include/(uapi/)/asm, Kbuild will automatically generate
a wrapper of the asm-generic one.

-8 Kbuild Variables
+9 Kbuild Variables
==================

The top Makefile exports the following variables:
@@ -1438,8 +1525,8 @@ The top Makefile exports the following variables:
command.


-9 Makefile language
-===================
+10 Makefile language
+====================

The kernel Makefiles are designed to be run with GNU Make. The Makefiles
use only the documented features of GNU Make, but they do use many
@@ -1458,7 +1545,7 @@ time the left-hand side is used.
There are some cases where "=" is appropriate. Usually, though, ":="
is the right choice.

-10 Credits
+11 Credits
==========

- Original version made by Michael Elizabeth Chastain, <mailto:[email protected]>
@@ -1466,7 +1553,7 @@ is the right choice.
- Updates by Sam Ravnborg <[email protected]>
- Language QA by Jan Engelhardt <[email protected]>

-11 TODO
+12 TODO
=======

- Describe how kbuild supports shipped files with _shipped.
--
2.25.1

2020-05-12 04:37:35

by Masahiro Yamada

[permalink] [raw]
Subject: Re: [PATCH v2 00/15] kbuild: support 'userprogs' syntax

On Wed, Apr 29, 2020 at 12:45 PM Masahiro Yamada <[email protected]> wrote:
>
>
> Several Makefiles use 'hostprogs' to build programs for the host
> architecture where it is not appropriate to do so.
> This is just because Kbuild lacks the support for building programs
> for the target architecture.
>
> This series introduce 'userprogs' syntax and use it from
> sample and bpf Makefiles.
>
> Sam worked on this in 2014.
> https://lkml.org/lkml/2014/7/13/154
>
> He used 'uapiprogs-y' but I just thought the meaning of
> "UAPI programs" is unclear.
>
> Naming the syntax is one of the most difficult parts.
>
> I chose 'userprogs'. Anothor choice I had in my mind was 'targetprogs'.
>
> You can test this series quickly by 'make allmodconfig samples/'
>
> When building objects for userspace, [U] is displayed.
>
> masahiro@oscar:~/workspace/linux$ make allmodconfig samples/


All applied to linux-kbuild.


> [snip]
> AR samples/vfio-mdev/built-in.a
> CC [M] samples/vfio-mdev/mtty.o
> CC [M] samples/vfio-mdev/mdpy.o
> CC [M] samples/vfio-mdev/mdpy-fb.o
> CC [M] samples/vfio-mdev/mbochs.o
> AR samples/mei/built-in.a
> CC [U] samples/mei/mei-amt-version
> CC [U] samples/auxdisplay/cfag12864b-example
> CC [M] samples/configfs/configfs_sample.o
> CC [M] samples/connector/cn_test.o
> CC [U] samples/connector/ucon
> CC [M] samples/ftrace/ftrace-direct.o
> CC [M] samples/ftrace/ftrace-direct-too.o
> CC [M] samples/ftrace/ftrace-direct-modify.o
> CC [M] samples/ftrace/sample-trace-array.o
> CC [U] samples/hidraw/hid-example
> CC [M] samples/hw_breakpoint/data_breakpoint.o
> CC [M] samples/kdb/kdb_hello.o
> CC [M] samples/kfifo/bytestream-example.o
> CC [M] samples/kfifo/dma-example.o
> CC [M] samples/kfifo/inttype-example.o
> CC [M] samples/kfifo/record-example.o
> CC [M] samples/kobject/kobject-example.o
> CC [M] samples/kobject/kset-example.o
> CC [M] samples/kprobes/kprobe_example.o
> CC [M] samples/kprobes/kretprobe_example.o
> CC [M] samples/livepatch/livepatch-sample.o
> CC [M] samples/livepatch/livepatch-shadow-mod.o
> CC [M] samples/livepatch/livepatch-shadow-fix1.o
> CC [M] samples/livepatch/livepatch-shadow-fix2.o
> CC [M] samples/livepatch/livepatch-callbacks-demo.o
> CC [M] samples/livepatch/livepatch-callbacks-mod.o
> CC [M] samples/livepatch/livepatch-callbacks-busymod.o
> CC [M] samples/rpmsg/rpmsg_client_sample.o
> CC [U] samples/seccomp/bpf-fancy.o
> CC [U] samples/seccomp/bpf-helper.o
> LD [U] samples/seccomp/bpf-fancy
> CC [U] samples/seccomp/dropper
> CC [U] samples/seccomp/bpf-direct
> CC [U] samples/seccomp/user-trap
> CC [U] samples/timers/hpet_example
> CC [M] samples/trace_events/trace-events-sample.o
> CC [M] samples/trace_printk/trace-printk.o
> CC [U] samples/uhid/uhid-example
> CC [M] samples/v4l/v4l2-pci-skeleton.o
> CC [U] samples/vfs/test-fsmount
> CC [U] samples/vfs/test-statx
> samples/vfs/test-statx.c:24:15: warning: ‘struct foo’ declared inside parameter list will not be visible outside of this definition or declaration
> 24 | #define statx foo
> | ^~~
> CC [U] samples/watchdog/watchdog-simple
> AR samples/built-in.a
>
> Changes for v2:
> - Fix ARCH=i386 build error for bpfilter_umh
> - Rename 'user-ccflags' to 'userccflags'
> because 'user-ccflags' would conflict if an object
> called 'user.o' exists in the directory.
> - Support 'userldflags'
>
> Masahiro Yamada (14):
> bpfilter: match bit size of bpfilter_umh to that of the kernel
> kbuild: add infrastructure to build userspace programs
> bpfilter: use 'userprogs' syntax to build bpfilter_umh
> samples: seccomp: build sample programs for target architecture
> kbuild: doc: document the new syntax 'userprogs'
> samples: uhid: build sample program for target architecture
> samples: hidraw: build sample program for target architecture
> samples: connector: build sample program for target architecture
> samples: vfs: build sample programs for target architecture
> samples: pidfd: build sample program for target architecture
> samples: mei: build sample program for target architecture
> samples: auxdisplay: use 'userprogs' syntax
> samples: timers: use 'userprogs' syntax
> samples: watchdog: use 'userprogs' syntax
>
> Sam Ravnborg (1):
> samples: uhid: fix warnings in uhid-example
>
> Documentation/kbuild/makefiles.rst | 183 +++++++++++++++++++++--------
> Makefile | 13 +-
> init/Kconfig | 4 +-
> net/bpfilter/Makefile | 11 +-
> samples/Kconfig | 26 +++-
> samples/Makefile | 4 +
> samples/auxdisplay/Makefile | 11 +-
> samples/connector/Makefile | 12 +-
> samples/hidraw/Makefile | 9 +-
> samples/mei/Makefile | 9 +-
> samples/pidfd/Makefile | 8 +-
> samples/seccomp/Makefile | 42 +------
> samples/timers/Makefile | 17 +--
> samples/uhid/.gitignore | 2 +
> samples/uhid/Makefile | 9 +-
> samples/uhid/uhid-example.c | 4 +-
> samples/vfs/Makefile | 11 +-
> samples/watchdog/Makefile | 10 +-
> scripts/Makefile.build | 6 +
> scripts/Makefile.clean | 2 +-
> scripts/Makefile.userprogs | 45 +++++++
> usr/include/Makefile | 4 +
> 22 files changed, 267 insertions(+), 175 deletions(-)
> create mode 100644 samples/uhid/.gitignore
> create mode 100644 scripts/Makefile.userprogs
>
> --
> 2.25.1
>


--
Best Regards
Masahiro Yamada