Commit 59b2bd05 authored by Masahiro Yamada's avatar Masahiro Yamada

kbuild: add 'headers' target to build up uapi headers in usr/include

In Linux build system, build targets and installation targets are
separated.

Examples are:

 - 'make vmlinux' -> 'make install'
 - 'make modules' -> 'make modules_install'
 - 'make dtbs'    -> 'make dtbs_install'
 - 'make vdso'    -> 'make vdso_install'

The intention is to run the build targets under the normal privilege,
then the installation targets under the root privilege since we need
the write permission to the system directories.

We have 'make headers_install' but the corresponding 'make headers'
stage does not exist. The purpose of headers_install is to provide
the kernel interface to C library. So, nobody would try to install
headers to /usr/include directly.

If 'sudo make INSTALL_HDR_PATH=/usr/include headers_install' were run,
some build artifacts in the kernel tree would be owned by root because
some of uapi headers are generated by 'uapi-asm-generic', 'archheaders'
targets.

Anyway, I believe it makes sense to split the header installation into
two stages.

 [1] 'make headers'
    Process headers in uapi directories by scripts/headers_install.sh
    and copy them to usr/include

 [2] 'make headers_install'
    Copy '*.h' verbatim from usr/include to $(INSTALL_HDR_PATH)/include

For the backward compatibility, 'headers_install' depends on 'headers'.

Some samples expect uapi headers in usr/include. So, the 'headers'
target is useful to build up them in the fixed location usr/include
irrespective of INSTALL_HDR_PATH.

Another benefit is to stop polluting the final destination with the
time-stamp files '.install' and '.check'. Maybe you can see them in
your toolchains.

Lastly, my main motivation is to prepare for compile-testing uapi
headers. To build something, we have to save an object and .*.cmd
somewhere. The usr/include/ will be the work directory for that.
Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
parent bdd7714b
...@@ -262,7 +262,7 @@ old_version_h := include/linux/version.h ...@@ -262,7 +262,7 @@ old_version_h := include/linux/version.h
clean-targets := %clean mrproper cleandocs clean-targets := %clean mrproper cleandocs
no-dot-config-targets := $(clean-targets) \ no-dot-config-targets := $(clean-targets) \
cscope gtags TAGS tags help% %docs check% coccicheck \ cscope gtags TAGS tags help% %docs check% coccicheck \
$(version_h) headers_% archheaders archscripts \ $(version_h) headers headers_% archheaders archscripts \
%asm-generic kernelversion %src-pkg %asm-generic kernelversion %src-pkg
no-sync-config-targets := $(no-dot-config-targets) install %install \ no-sync-config-targets := $(no-dot-config-targets) install %install \
kernelrelease kernelrelease
...@@ -1178,25 +1178,32 @@ headerdep: ...@@ -1178,25 +1178,32 @@ headerdep:
#Default location for installed headers #Default location for installed headers
export INSTALL_HDR_PATH = $(objtree)/usr export INSTALL_HDR_PATH = $(objtree)/usr
PHONY += archheaders archscripts quiet_cmd_headers_install = INSTALL $(INSTALL_HDR_PATH)/include
cmd_headers_install = \
PHONY += __headers mkdir -p $(INSTALL_HDR_PATH); \
__headers: $(version_h) scripts_unifdef uapi-asm-generic archheaders archscripts rsync -mrl --include='*/' --include='*\.h' --exclude='*' \
usr/include $(INSTALL_HDR_PATH)
PHONY += headers_install PHONY += headers_install
headers_install: __headers headers_install: headers
$(call cmd,headers_install)
PHONY += archheaders archscripts
PHONY += headers
headers: $(version_h) scripts_unifdef uapi-asm-generic archheaders archscripts
$(if $(wildcard $(srctree)/arch/$(SRCARCH)/include/uapi/asm/Kbuild),, \ $(if $(wildcard $(srctree)/arch/$(SRCARCH)/include/uapi/asm/Kbuild),, \
$(error Headers not exportable for the $(SRCARCH) architecture)) $(error Headers not exportable for the $(SRCARCH) architecture))
$(Q)$(MAKE) $(hdr-inst)=include/uapi dst=include $(Q)$(MAKE) $(hdr-inst)=include/uapi dst=include
$(Q)$(MAKE) $(hdr-inst)=arch/$(SRCARCH)/include/uapi dst=include $(Q)$(MAKE) $(hdr-inst)=arch/$(SRCARCH)/include/uapi dst=include
PHONY += headers_check PHONY += headers_check
headers_check: headers_install headers_check: headers
$(Q)$(MAKE) $(hdr-inst)=include/uapi dst=include HDRCHECK=1 $(Q)$(MAKE) $(hdr-inst)=include/uapi dst=include HDRCHECK=1
$(Q)$(MAKE) $(hdr-inst)=arch/$(SRCARCH)/include/uapi dst=include HDRCHECK=1 $(Q)$(MAKE) $(hdr-inst)=arch/$(SRCARCH)/include/uapi dst=include HDRCHECK=1
ifdef CONFIG_HEADERS_INSTALL ifdef CONFIG_HEADERS_INSTALL
prepare: headers_install prepare: headers
endif endif
ifdef CONFIG_HEADERS_CHECK ifdef CONFIG_HEADERS_CHECK
......
...@@ -324,9 +324,7 @@ config HEADERS_CHECK ...@@ -324,9 +324,7 @@ config HEADERS_CHECK
attempt to include files which were not exported, etc. attempt to include files which were not exported, etc.
If you're making modifications to header files which are If you're making modifications to header files which are
relevant for userspace, say 'Y', and check the headers relevant for userspace, say 'Y'.
exported to $(INSTALL_HDR_PATH) (usually 'usr/include' in
your build tree), to make sure they're suitable.
config OPTIMIZE_INLINING config OPTIMIZE_INLINING
bool "Allow compiler to uninline functions marked 'inline'" bool "Allow compiler to uninline functions marked 'inline'"
......
...@@ -41,7 +41,7 @@ ifeq ($(skip-inst),) ...@@ -41,7 +41,7 @@ ifeq ($(skip-inst),)
kbuild-file := $(srctree)/$(obj)/Kbuild kbuild-file := $(srctree)/$(obj)/Kbuild
-include $(kbuild-file) -include $(kbuild-file)
installdir := $(INSTALL_HDR_PATH)/$(dst) installdir := usr/$(dst)
gendir := $(objtree)/$(subst include/,include/generated/,$(obj)) gendir := $(objtree)/$(subst include/,include/generated/,$(obj))
header-files := $(notdir $(wildcard $(srcdir)/*.h)) header-files := $(notdir $(wildcard $(srcdir)/*.h))
header-files := $(filter-out $(no-export-headers), $(header-files)) header-files := $(filter-out $(no-export-headers), $(header-files))
...@@ -60,10 +60,10 @@ output-files := $(addprefix $(installdir)/, $(all-files)) ...@@ -60,10 +60,10 @@ output-files := $(addprefix $(installdir)/, $(all-files))
oldheaders := $(patsubst $(installdir)/%,%,$(wildcard $(installdir)/*.h)) oldheaders := $(patsubst $(installdir)/%,%,$(wildcard $(installdir)/*.h))
unwanted := $(filter-out $(all-files),$(oldheaders)) unwanted := $(filter-out $(all-files),$(oldheaders))
# Prefix unwanted with full paths to $(INSTALL_HDR_PATH) # Prefix unwanted with full paths to objtree
unwanted-file := $(addprefix $(installdir)/, $(unwanted)) unwanted-file := $(addprefix $(installdir)/, $(unwanted))
printdir = $(patsubst $(INSTALL_HDR_PATH)/%/,%,$(dir $@)) printdir = $(patsubst %/,%,$(dir $@))
quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\ quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\
file$(if $(word 2, $(all-files)),s)) file$(if $(word 2, $(all-files)),s))
...@@ -81,7 +81,7 @@ quiet_cmd_check = CHECK $(printdir) ($(words $(all-files)) files) ...@@ -81,7 +81,7 @@ quiet_cmd_check = CHECK $(printdir) ($(words $(all-files)) files)
cmd_check = for f in $(all-files); do \ cmd_check = for f in $(all-files); do \
echo "$(installdir)/$${f}"; done \ echo "$(installdir)/$${f}"; done \
| xargs \ | xargs \
$(PERL) $< $(INSTALL_HDR_PATH)/include $(SRCARCH); \ $(PERL) $< usr/include $(SRCARCH); \
touch $@ touch $@
ifndef HDRCHECK ifndef HDRCHECK
......
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