Skip to content

Commit faabed2

Browse files
committed
kbuild: introduce hostprogs-always-y and userprogs-always-y
To build host programs, you need to add the program names to 'hostprogs' to use the necessary build rule, but it is not enough to build them because there is no dependency. There are two types of host programs: built as the prerequisite of another (e.g. gen_crc32table in lib/Makefile), or always built when Kbuild visits the Makefile (e.g. genksyms in scripts/genksyms/Makefile). The latter is typical in Makefiles under scripts/, which contains host programs globally used during the kernel build. To build them, you need to add them to both 'hostprogs' and 'always-y'. This commit adds hostprogs-always-y as a shorthand. The same applies to user programs. net/bpfilter/Makefile builds bpfilter_umh on demand, hence always-y is unneeded. In contrast, programs under samples/ are added to both 'userprogs' and 'always-y' so they are always built when Kbuild visits the Makefiles. userprogs-always-y works as a shorthand. Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Acked-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
1 parent 85569d1 commit faabed2

File tree

22 files changed

+78
-55
lines changed

22 files changed

+78
-55
lines changed

Documentation/kbuild/makefiles.rst

+30-1
Original file line numberDiff line numberDiff line change
@@ -749,6 +749,10 @@ Both possibilities are described in the following.
749749
hostprogs := lxdialog
750750
always-y := $(hostprogs)
751751

752+
Kbuild provides the following shorthand for this:
753+
754+
hostprogs-always-y := lxdialog
755+
752756
This will tell kbuild to build lxdialog even if not referenced in
753757
any rule.
754758

@@ -831,7 +835,32 @@ The syntax is quite similar. The difference is to use "userprogs" instead of
831835
5.4 When userspace programs are actually built
832836
----------------------------------------------
833837

834-
Same as "When host programs are actually built".
838+
Kbuild builds userspace programs only when told to do so.
839+
There are two ways to do this.
840+
841+
(1) Add it as the prerequisite of another file
842+
843+
Example::
844+
845+
#net/bpfilter/Makefile
846+
userprogs := bpfilter_umh
847+
$(obj)/bpfilter_umh_blob.o: $(obj)/bpfilter_umh
848+
849+
$(obj)/bpfilter_umh is built before $(obj)/bpfilter_umh_blob.o
850+
851+
(2) Use always-y
852+
853+
Example::
854+
855+
userprogs := binderfs_example
856+
always-y := $(userprogs)
857+
858+
Kbuild provides the following shorthand for this:
859+
860+
userprogs-always-y := binderfs_example
861+
862+
This will tell Kbuild to build binderfs_example when it visits this
863+
Makefile.
835864

836865
6 Kbuild clean infrastructure
837866
=============================

samples/auxdisplay/Makefile

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
# SPDX-License-Identifier: GPL-2.0
2-
userprogs := cfag12864b-example
3-
always-y := $(userprogs)
2+
userprogs-always-y += cfag12864b-example

samples/binderfs/Makefile

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
# SPDX-License-Identifier: GPL-2.0-only
2-
userprogs := binderfs_example
3-
always-y := $(userprogs)
2+
userprogs-always-y += binderfs_example
43

54
userccflags += -I usr/include

samples/connector/Makefile

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# SPDX-License-Identifier: GPL-2.0
22
obj-$(CONFIG_SAMPLE_CONNECTOR) += cn_test.o
33

4-
userprogs := ucon
5-
always-$(CONFIG_CC_CAN_LINK) := $(userprogs)
4+
userprogs-always-$(CONFIG_CC_CAN_LINK) += ucon
65

76
userccflags += -I usr/include

samples/hidraw/Makefile

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
# SPDX-License-Identifier: GPL-2.0
2-
userprogs := hid-example
3-
always-y := $(userprogs)
2+
userprogs-always-y += hid-example
43

54
userccflags += -I usr/include

samples/mei/Makefile

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
# SPDX-License-Identifier: GPL-2.0
22
# Copyright (c) 2012-2019, Intel Corporation. All rights reserved.
3-
4-
userprogs := mei-amt-version
5-
always-y := $(userprogs)
3+
userprogs-always-y += mei-amt-version
64

75
userccflags += -I usr/include

samples/pidfd/Makefile

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
# SPDX-License-Identifier: GPL-2.0
2-
3-
usertprogs := pidfd-metadata
4-
always-y := $(userprogs)
2+
usertprogs-always-y += pidfd-metadata
53

64
userccflags += -I usr/include

samples/seccomp/Makefile

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
# SPDX-License-Identifier: GPL-2.0
2-
userprogs := bpf-fancy dropper bpf-direct user-trap
2+
userprogs-always-y += bpf-fancy dropper bpf-direct user-trap
33

44
bpf-fancy-objs := bpf-fancy.o bpf-helper.o
55

66
userccflags += -I usr/include
7-
8-
always-y := $(userprogs)

samples/timers/Makefile

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
# SPDX-License-Identifier: GPL-2.0
2-
userprogs := hpet_example
3-
always-y := $(userprogs)
2+
userprogs-always-y += hpet_example
43

54
userccflags += -I usr/include

samples/uhid/Makefile

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
# SPDX-License-Identifier: GPL-2.0-only
2-
userprogs := uhid-example
3-
always-y := $(userprogs)
2+
userprogs-always-y += uhid-example
43

54
userccflags += -I usr/include

samples/vfs/Makefile

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
# SPDX-License-Identifier: GPL-2.0-only
2-
userprogs := test-fsmount test-statx
3-
always-y := $(userprogs)
2+
userprogs-always-y += test-fsmount test-statx
43

54
userccflags += -I usr/include

samples/watch_queue/Makefile

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
# SPDX-License-Identifier: GPL-2.0-only
2-
userprogs := watch_test
3-
always-y := $(userprogs)
2+
userprogs-always-y += watch_test
43

54
userccflags += -I usr/include

samples/watchdog/Makefile

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
# SPDX-License-Identifier: GPL-2.0
2-
userprogs := watchdog-simple
3-
always-y := $(userprogs)
2+
userprogs-always-y += watchdog-simple

scripts/Makefile

+8-10
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
# scripts contains sources for various helper programs used throughout
44
# the kernel for the build process.
55

6-
always-$(CONFIG_BUILD_BIN2C) += bin2c
7-
always-$(CONFIG_KALLSYMS) += kallsyms
8-
always-$(BUILD_C_RECORDMCOUNT) += recordmcount
9-
always-$(CONFIG_BUILDTIME_TABLE_SORT) += sorttable
10-
always-$(CONFIG_ASN1) += asn1_compiler
11-
always-$(CONFIG_MODULE_SIG_FORMAT) += sign-file
12-
always-$(CONFIG_SYSTEM_TRUSTED_KEYRING) += extract-cert
13-
always-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE) += insert-sys-cert
6+
hostprogs-always-$(CONFIG_BUILD_BIN2C) += bin2c
7+
hostprogs-always-$(CONFIG_KALLSYMS) += kallsyms
8+
hostprogs-always-$(BUILD_C_RECORDMCOUNT) += recordmcount
9+
hostprogs-always-$(CONFIG_BUILDTIME_TABLE_SORT) += sorttable
10+
hostprogs-always-$(CONFIG_ASN1) += asn1_compiler
11+
hostprogs-always-$(CONFIG_MODULE_SIG_FORMAT) += sign-file
12+
hostprogs-always-$(CONFIG_SYSTEM_TRUSTED_KEYRING) += extract-cert
13+
hostprogs-always-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE) += insert-sys-cert
1414

1515
HOSTCFLAGS_sorttable.o = -I$(srctree)/tools/include
1616
HOSTCFLAGS_asn1_compiler.o = -I$(srctree)/include
@@ -26,8 +26,6 @@ HOSTCFLAGS_sorttable.o += -DUNWINDER_ORC_ENABLED
2626
HOSTLDLIBS_sorttable = -lpthread
2727
endif
2828

29-
hostprogs := $(always-y) $(always-m)
30-
3129
# The following programs are only built on demand
3230
hostprogs += unifdef
3331

scripts/Makefile.clean

+9-3
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,15 @@ subdir-ymn := $(addprefix $(obj)/,$(subdir-ymn))
2727
# build a list of files to remove, usually relative to the current
2828
# directory
2929

30-
__clean-files := $(extra-y) $(extra-m) $(extra-) \
31-
$(always) $(always-y) $(always-m) $(always-) $(targets) $(clean-files) \
32-
$(hostprogs) $(hostprogs-y) $(hostprogs-m) $(hostprogs-) $(userprogs)
30+
__clean-files := \
31+
$(clean-files) $(targets) $(hostprogs) $(userprogs) \
32+
$(extra-y) $(extra-m) $(extra-) \
33+
$(always-y) $(always-m) $(always-) \
34+
$(hostprogs-always-y) $(hostprogs-always-m) $(hostprogs-always-) \
35+
$(userprogs-always-y) $(userprogs-always-m) $(userprogs-always-)
36+
37+
# deprecated
38+
__clean-files += $(always) $(hostprogs-y) $(hostprogs-m) $(hostprogs-)
3339

3440
__clean-files := $(filter-out $(no-clean-files), $(__clean-files))
3541

scripts/Makefile.lib

+11
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,17 @@ real-obj-m := $(foreach m, $(obj-m), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))
6868

6969
always-y += $(always-m)
7070

71+
# hostprogs-always-y += foo
72+
# ... is a shorthand for
73+
# hostprogs += foo
74+
# always-y += foo
75+
hostprogs += $(hostprogs-always-y) $(hostprogs-always-m)
76+
always-y += $(hostprogs-always-y) $(hostprogs-always-m)
77+
78+
# userprogs-always-y is likewise.
79+
userprogs += $(userprogs-always-y) $(userprogs-always-m)
80+
always-y += $(userprogs-always-y) $(userprogs-always-m)
81+
7182
# DTB
7283
# If CONFIG_OF_ALL_DTBS is enabled, all DT blobs are built
7384
extra-y += $(dtb-y)

scripts/basic/Makefile

+1-2
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,4 @@
22
#
33
# fixdep: used to generate dependency information during build process
44

5-
hostprogs := fixdep
6-
always-y := $(hostprogs)
5+
hostprogs-always-y += fixdep

scripts/dtc/Makefile

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
# SPDX-License-Identifier: GPL-2.0
22
# scripts/dtc makefile
33

4-
hostprogs := dtc
5-
always-$(CONFIG_DTC) += $(hostprogs)
6-
always-$(CHECK_DT_BINDING) += $(hostprogs)
4+
hostprogs-always-$(CONFIG_DTC) += dtc
5+
hostprogs-always-$(CHECK_DT_BINDING) += dtc
76

87
dtc-objs := dtc.o flattree.o fstree.o data.o livetree.o treesource.o \
98
srcpos.o checks.o util.o

scripts/genksyms/Makefile

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# SPDX-License-Identifier: GPL-2.0
22

3-
hostprogs := genksyms
4-
always-y := $(hostprogs)
3+
hostprogs-always-y += genksyms
54

65
genksyms-objs := genksyms.o parse.tab.o lex.lex.o
76

scripts/mod/Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# SPDX-License-Identifier: GPL-2.0
22
OBJECT_FILES_NON_STANDARD := y
33

4-
hostprogs := modpost mk_elfconfig
5-
always-y := $(hostprogs) empty.o
4+
hostprogs-always-y += modpost mk_elfconfig
5+
always-y += empty.o
66

77
modpost-objs := modpost.o file2alias.o sumversion.o
88

scripts/selinux/genheaders/Makefile

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
# SPDX-License-Identifier: GPL-2.0
2-
hostprogs := genheaders
2+
hostprogs-always-y += genheaders
33
HOST_EXTRACFLAGS += \
44
-I$(srctree)/include/uapi -I$(srctree)/include \
55
-I$(srctree)/security/selinux/include
6-
7-
always-y := $(hostprogs)

scripts/selinux/mdp/Makefile

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
# SPDX-License-Identifier: GPL-2.0
2-
hostprogs := mdp
2+
hostprogs-always-y += mdp
33
HOST_EXTRACFLAGS += \
44
-I$(srctree)/include/uapi -I$(srctree)/include \
55
-I$(srctree)/security/selinux/include -I$(objtree)/include
66

7-
always-y := $(hostprogs)
87
clean-files := policy.* file_contexts

0 commit comments

Comments
 (0)