Commit faabed29 authored by Masahiro Yamada's avatar Masahiro Yamada

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: default avatarMasahiro Yamada <masahiroy@kernel.org>
Acked-by: default avatarMiguel Ojeda <miguel.ojeda.sandonis@gmail.com>
parent 85569d19
...@@ -749,6 +749,10 @@ Both possibilities are described in the following. ...@@ -749,6 +749,10 @@ Both possibilities are described in the following.
hostprogs := lxdialog hostprogs := lxdialog
always-y := $(hostprogs) always-y := $(hostprogs)
Kbuild provides the following shorthand for this:
hostprogs-always-y := lxdialog
This will tell kbuild to build lxdialog even if not referenced in This will tell kbuild to build lxdialog even if not referenced in
any rule. any rule.
...@@ -831,7 +835,32 @@ The syntax is quite similar. The difference is to use "userprogs" instead of ...@@ -831,7 +835,32 @@ The syntax is quite similar. The difference is to use "userprogs" instead of
5.4 When userspace programs are actually built 5.4 When userspace programs are actually built
---------------------------------------------- ----------------------------------------------
Same as "When host programs are actually built". Kbuild builds userspace programs only when told to do so.
There are two ways to do this.
(1) Add it as the prerequisite of another file
Example::
#net/bpfilter/Makefile
userprogs := bpfilter_umh
$(obj)/bpfilter_umh_blob.o: $(obj)/bpfilter_umh
$(obj)/bpfilter_umh is built before $(obj)/bpfilter_umh_blob.o
(2) Use always-y
Example::
userprogs := binderfs_example
always-y := $(userprogs)
Kbuild provides the following shorthand for this:
userprogs-always-y := binderfs_example
This will tell Kbuild to build binderfs_example when it visits this
Makefile.
6 Kbuild clean infrastructure 6 Kbuild clean infrastructure
============================= =============================
......
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
userprogs := cfag12864b-example userprogs-always-y += cfag12864b-example
always-y := $(userprogs)
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
userprogs := binderfs_example userprogs-always-y += binderfs_example
always-y := $(userprogs)
userccflags += -I usr/include userccflags += -I usr/include
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
obj-$(CONFIG_SAMPLE_CONNECTOR) += cn_test.o obj-$(CONFIG_SAMPLE_CONNECTOR) += cn_test.o
userprogs := ucon userprogs-always-$(CONFIG_CC_CAN_LINK) += ucon
always-$(CONFIG_CC_CAN_LINK) := $(userprogs)
userccflags += -I usr/include userccflags += -I usr/include
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
userprogs := hid-example userprogs-always-y += hid-example
always-y := $(userprogs)
userccflags += -I usr/include userccflags += -I usr/include
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2012-2019, Intel Corporation. All rights reserved. # Copyright (c) 2012-2019, Intel Corporation. All rights reserved.
userprogs-always-y += mei-amt-version
userprogs := mei-amt-version
always-y := $(userprogs)
userccflags += -I usr/include userccflags += -I usr/include
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
usertprogs-always-y += pidfd-metadata
usertprogs := pidfd-metadata
always-y := $(userprogs)
userccflags += -I usr/include userccflags += -I usr/include
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
userprogs := bpf-fancy dropper bpf-direct user-trap userprogs-always-y += bpf-fancy dropper bpf-direct user-trap
bpf-fancy-objs := bpf-fancy.o bpf-helper.o bpf-fancy-objs := bpf-fancy.o bpf-helper.o
userccflags += -I usr/include userccflags += -I usr/include
always-y := $(userprogs)
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
userprogs := hpet_example userprogs-always-y += hpet_example
always-y := $(userprogs)
userccflags += -I usr/include userccflags += -I usr/include
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
userprogs := uhid-example userprogs-always-y += uhid-example
always-y := $(userprogs)
userccflags += -I usr/include userccflags += -I usr/include
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
userprogs := test-fsmount test-statx userprogs-always-y += test-fsmount test-statx
always-y := $(userprogs)
userccflags += -I usr/include userccflags += -I usr/include
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
userprogs := watch_test userprogs-always-y += watch_test
always-y := $(userprogs)
userccflags += -I usr/include userccflags += -I usr/include
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
userprogs := watchdog-simple userprogs-always-y += watchdog-simple
always-y := $(userprogs)
...@@ -3,14 +3,14 @@ ...@@ -3,14 +3,14 @@
# scripts contains sources for various helper programs used throughout # scripts contains sources for various helper programs used throughout
# the kernel for the build process. # the kernel for the build process.
always-$(CONFIG_BUILD_BIN2C) += bin2c hostprogs-always-$(CONFIG_BUILD_BIN2C) += bin2c
always-$(CONFIG_KALLSYMS) += kallsyms hostprogs-always-$(CONFIG_KALLSYMS) += kallsyms
always-$(BUILD_C_RECORDMCOUNT) += recordmcount hostprogs-always-$(BUILD_C_RECORDMCOUNT) += recordmcount
always-$(CONFIG_BUILDTIME_TABLE_SORT) += sorttable hostprogs-always-$(CONFIG_BUILDTIME_TABLE_SORT) += sorttable
always-$(CONFIG_ASN1) += asn1_compiler hostprogs-always-$(CONFIG_ASN1) += asn1_compiler
always-$(CONFIG_MODULE_SIG_FORMAT) += sign-file hostprogs-always-$(CONFIG_MODULE_SIG_FORMAT) += sign-file
always-$(CONFIG_SYSTEM_TRUSTED_KEYRING) += extract-cert hostprogs-always-$(CONFIG_SYSTEM_TRUSTED_KEYRING) += extract-cert
always-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE) += insert-sys-cert hostprogs-always-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE) += insert-sys-cert
HOSTCFLAGS_sorttable.o = -I$(srctree)/tools/include HOSTCFLAGS_sorttable.o = -I$(srctree)/tools/include
HOSTCFLAGS_asn1_compiler.o = -I$(srctree)/include HOSTCFLAGS_asn1_compiler.o = -I$(srctree)/include
...@@ -26,8 +26,6 @@ HOSTCFLAGS_sorttable.o += -DUNWINDER_ORC_ENABLED ...@@ -26,8 +26,6 @@ HOSTCFLAGS_sorttable.o += -DUNWINDER_ORC_ENABLED
HOSTLDLIBS_sorttable = -lpthread HOSTLDLIBS_sorttable = -lpthread
endif endif
hostprogs := $(always-y) $(always-m)
# The following programs are only built on demand # The following programs are only built on demand
hostprogs += unifdef hostprogs += unifdef
......
...@@ -27,9 +27,15 @@ subdir-ymn := $(addprefix $(obj)/,$(subdir-ymn)) ...@@ -27,9 +27,15 @@ subdir-ymn := $(addprefix $(obj)/,$(subdir-ymn))
# build a list of files to remove, usually relative to the current # build a list of files to remove, usually relative to the current
# directory # directory
__clean-files := $(extra-y) $(extra-m) $(extra-) \ __clean-files := \
$(always) $(always-y) $(always-m) $(always-) $(targets) $(clean-files) \ $(clean-files) $(targets) $(hostprogs) $(userprogs) \
$(hostprogs) $(hostprogs-y) $(hostprogs-m) $(hostprogs-) $(userprogs) $(extra-y) $(extra-m) $(extra-) \
$(always-y) $(always-m) $(always-) \
$(hostprogs-always-y) $(hostprogs-always-m) $(hostprogs-always-) \
$(userprogs-always-y) $(userprogs-always-m) $(userprogs-always-)
# deprecated
__clean-files += $(always) $(hostprogs-y) $(hostprogs-m) $(hostprogs-)
__clean-files := $(filter-out $(no-clean-files), $(__clean-files)) __clean-files := $(filter-out $(no-clean-files), $(__clean-files))
......
...@@ -68,6 +68,17 @@ real-obj-m := $(foreach m, $(obj-m), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y)) ...@@ -68,6 +68,17 @@ real-obj-m := $(foreach m, $(obj-m), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))
always-y += $(always-m) always-y += $(always-m)
# hostprogs-always-y += foo
# ... is a shorthand for
# hostprogs += foo
# always-y += foo
hostprogs += $(hostprogs-always-y) $(hostprogs-always-m)
always-y += $(hostprogs-always-y) $(hostprogs-always-m)
# userprogs-always-y is likewise.
userprogs += $(userprogs-always-y) $(userprogs-always-m)
always-y += $(userprogs-always-y) $(userprogs-always-m)
# DTB # DTB
# If CONFIG_OF_ALL_DTBS is enabled, all DT blobs are built # If CONFIG_OF_ALL_DTBS is enabled, all DT blobs are built
extra-y += $(dtb-y) extra-y += $(dtb-y)
......
...@@ -2,5 +2,4 @@ ...@@ -2,5 +2,4 @@
# #
# fixdep: used to generate dependency information during build process # fixdep: used to generate dependency information during build process
hostprogs := fixdep hostprogs-always-y += fixdep
always-y := $(hostprogs)
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# scripts/dtc makefile # scripts/dtc makefile
hostprogs := dtc hostprogs-always-$(CONFIG_DTC) += dtc
always-$(CONFIG_DTC) += $(hostprogs) hostprogs-always-$(CHECK_DT_BINDING) += dtc
always-$(CHECK_DT_BINDING) += $(hostprogs)
dtc-objs := dtc.o flattree.o fstree.o data.o livetree.o treesource.o \ dtc-objs := dtc.o flattree.o fstree.o data.o livetree.o treesource.o \
srcpos.o checks.o util.o srcpos.o checks.o util.o
......
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
hostprogs := genksyms hostprogs-always-y += genksyms
always-y := $(hostprogs)
genksyms-objs := genksyms.o parse.tab.o lex.lex.o genksyms-objs := genksyms.o parse.tab.o lex.lex.o
......
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
OBJECT_FILES_NON_STANDARD := y OBJECT_FILES_NON_STANDARD := y
hostprogs := modpost mk_elfconfig hostprogs-always-y += modpost mk_elfconfig
always-y := $(hostprogs) empty.o always-y += empty.o
modpost-objs := modpost.o file2alias.o sumversion.o modpost-objs := modpost.o file2alias.o sumversion.o
......
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
hostprogs := genheaders hostprogs-always-y += genheaders
HOST_EXTRACFLAGS += \ HOST_EXTRACFLAGS += \
-I$(srctree)/include/uapi -I$(srctree)/include \ -I$(srctree)/include/uapi -I$(srctree)/include \
-I$(srctree)/security/selinux/include -I$(srctree)/security/selinux/include
always-y := $(hostprogs)
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
hostprogs := mdp hostprogs-always-y += mdp
HOST_EXTRACFLAGS += \ HOST_EXTRACFLAGS += \
-I$(srctree)/include/uapi -I$(srctree)/include \ -I$(srctree)/include/uapi -I$(srctree)/include \
-I$(srctree)/security/selinux/include -I$(objtree)/include -I$(srctree)/security/selinux/include -I$(objtree)/include
always-y := $(hostprogs)
clean-files := policy.* file_contexts clean-files := policy.* file_contexts
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment