Skip to content

Commit

Permalink
kbuild: introduce hostprogs-always-y and userprogs-always-y
Browse files Browse the repository at this point in the history
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 <[email protected]>
Acked-by: Miguel Ojeda <[email protected]>
  • Loading branch information
masahir0y committed Aug 9, 2020
1 parent 85569d1 commit faabed2
Show file tree
Hide file tree
Showing 22 changed files with 78 additions and 55 deletions.
31 changes: 30 additions & 1 deletion Documentation/kbuild/makefiles.rst
Original file line number Diff line number Diff line change
Expand Up @@ -749,6 +749,10 @@ Both possibilities are described in the following.
hostprogs := lxdialog
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
any rule.

Expand Down Expand Up @@ -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
----------------------------------------------

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
=============================
Expand Down
3 changes: 1 addition & 2 deletions samples/auxdisplay/Makefile
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
# SPDX-License-Identifier: GPL-2.0
userprogs := cfag12864b-example
always-y := $(userprogs)
userprogs-always-y += cfag12864b-example
3 changes: 1 addition & 2 deletions samples/binderfs/Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
# SPDX-License-Identifier: GPL-2.0-only
userprogs := binderfs_example
always-y := $(userprogs)
userprogs-always-y += binderfs_example

userccflags += -I usr/include
3 changes: 1 addition & 2 deletions samples/connector/Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
# SPDX-License-Identifier: GPL-2.0
obj-$(CONFIG_SAMPLE_CONNECTOR) += cn_test.o

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

userccflags += -I usr/include
3 changes: 1 addition & 2 deletions samples/hidraw/Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
# SPDX-License-Identifier: GPL-2.0
userprogs := hid-example
always-y := $(userprogs)
userprogs-always-y += hid-example

userccflags += -I usr/include
4 changes: 1 addition & 3 deletions samples/mei/Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2012-2019, Intel Corporation. All rights reserved.

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

userccflags += -I usr/include
4 changes: 1 addition & 3 deletions samples/pidfd/Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
# SPDX-License-Identifier: GPL-2.0

usertprogs := pidfd-metadata
always-y := $(userprogs)
usertprogs-always-y += pidfd-metadata

userccflags += -I usr/include
4 changes: 1 addition & 3 deletions samples/seccomp/Makefile
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
# 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

userccflags += -I usr/include

always-y := $(userprogs)
3 changes: 1 addition & 2 deletions samples/timers/Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
# SPDX-License-Identifier: GPL-2.0
userprogs := hpet_example
always-y := $(userprogs)
userprogs-always-y += hpet_example

userccflags += -I usr/include
3 changes: 1 addition & 2 deletions samples/uhid/Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
# SPDX-License-Identifier: GPL-2.0-only
userprogs := uhid-example
always-y := $(userprogs)
userprogs-always-y += uhid-example

userccflags += -I usr/include
3 changes: 1 addition & 2 deletions samples/vfs/Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
# SPDX-License-Identifier: GPL-2.0-only
userprogs := test-fsmount test-statx
always-y := $(userprogs)
userprogs-always-y += test-fsmount test-statx

userccflags += -I usr/include
3 changes: 1 addition & 2 deletions samples/watch_queue/Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
# SPDX-License-Identifier: GPL-2.0-only
userprogs := watch_test
always-y := $(userprogs)
userprogs-always-y += watch_test

userccflags += -I usr/include
3 changes: 1 addition & 2 deletions samples/watchdog/Makefile
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
# SPDX-License-Identifier: GPL-2.0
userprogs := watchdog-simple
always-y := $(userprogs)
userprogs-always-y += watchdog-simple
18 changes: 8 additions & 10 deletions scripts/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
# scripts contains sources for various helper programs used throughout
# the kernel for the build process.

always-$(CONFIG_BUILD_BIN2C) += bin2c
always-$(CONFIG_KALLSYMS) += kallsyms
always-$(BUILD_C_RECORDMCOUNT) += recordmcount
always-$(CONFIG_BUILDTIME_TABLE_SORT) += sorttable
always-$(CONFIG_ASN1) += asn1_compiler
always-$(CONFIG_MODULE_SIG_FORMAT) += sign-file
always-$(CONFIG_SYSTEM_TRUSTED_KEYRING) += extract-cert
always-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE) += insert-sys-cert
hostprogs-always-$(CONFIG_BUILD_BIN2C) += bin2c
hostprogs-always-$(CONFIG_KALLSYMS) += kallsyms
hostprogs-always-$(BUILD_C_RECORDMCOUNT) += recordmcount
hostprogs-always-$(CONFIG_BUILDTIME_TABLE_SORT) += sorttable
hostprogs-always-$(CONFIG_ASN1) += asn1_compiler
hostprogs-always-$(CONFIG_MODULE_SIG_FORMAT) += sign-file
hostprogs-always-$(CONFIG_SYSTEM_TRUSTED_KEYRING) += extract-cert
hostprogs-always-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE) += insert-sys-cert

HOSTCFLAGS_sorttable.o = -I$(srctree)/tools/include
HOSTCFLAGS_asn1_compiler.o = -I$(srctree)/include
Expand All @@ -26,8 +26,6 @@ HOSTCFLAGS_sorttable.o += -DUNWINDER_ORC_ENABLED
HOSTLDLIBS_sorttable = -lpthread
endif

hostprogs := $(always-y) $(always-m)

# The following programs are only built on demand
hostprogs += unifdef

Expand Down
12 changes: 9 additions & 3 deletions scripts/Makefile.clean
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,15 @@ subdir-ymn := $(addprefix $(obj)/,$(subdir-ymn))
# build a list of files to remove, usually relative to the current
# directory

__clean-files := $(extra-y) $(extra-m) $(extra-) \
$(always) $(always-y) $(always-m) $(always-) $(targets) $(clean-files) \
$(hostprogs) $(hostprogs-y) $(hostprogs-m) $(hostprogs-) $(userprogs)
__clean-files := \
$(clean-files) $(targets) $(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))

Expand Down
11 changes: 11 additions & 0 deletions scripts/Makefile.lib
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,17 @@ real-obj-m := $(foreach m, $(obj-m), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))

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
# If CONFIG_OF_ALL_DTBS is enabled, all DT blobs are built
extra-y += $(dtb-y)
Expand Down
3 changes: 1 addition & 2 deletions scripts/basic/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,4 @@
#
# fixdep: used to generate dependency information during build process

hostprogs := fixdep
always-y := $(hostprogs)
hostprogs-always-y += fixdep
5 changes: 2 additions & 3 deletions scripts/dtc/Makefile
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
# SPDX-License-Identifier: GPL-2.0
# scripts/dtc makefile

hostprogs := dtc
always-$(CONFIG_DTC) += $(hostprogs)
always-$(CHECK_DT_BINDING) += $(hostprogs)
hostprogs-always-$(CONFIG_DTC) += dtc
hostprogs-always-$(CHECK_DT_BINDING) += dtc

dtc-objs := dtc.o flattree.o fstree.o data.o livetree.o treesource.o \
srcpos.o checks.o util.o
Expand Down
3 changes: 1 addition & 2 deletions scripts/genksyms/Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
# SPDX-License-Identifier: GPL-2.0

hostprogs := genksyms
always-y := $(hostprogs)
hostprogs-always-y += genksyms

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

Expand Down
4 changes: 2 additions & 2 deletions scripts/mod/Makefile
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# SPDX-License-Identifier: GPL-2.0
OBJECT_FILES_NON_STANDARD := y

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

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

Expand Down
4 changes: 1 addition & 3 deletions scripts/selinux/genheaders/Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
# SPDX-License-Identifier: GPL-2.0
hostprogs := genheaders
hostprogs-always-y += genheaders
HOST_EXTRACFLAGS += \
-I$(srctree)/include/uapi -I$(srctree)/include \
-I$(srctree)/security/selinux/include

always-y := $(hostprogs)
3 changes: 1 addition & 2 deletions scripts/selinux/mdp/Makefile
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
# SPDX-License-Identifier: GPL-2.0
hostprogs := mdp
hostprogs-always-y += mdp
HOST_EXTRACFLAGS += \
-I$(srctree)/include/uapi -I$(srctree)/include \
-I$(srctree)/security/selinux/include -I$(objtree)/include

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

0 comments on commit faabed2

Please sign in to comment.